An emulator, assembler, and disassembler for the Sega Game Gear
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

instructions.inc.c 82 KiB

пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
пре 9 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196
  1. /* Copyright (C) 2014-2015 Ben Kurtovic <ben.kurtovic@gmail.com>
  2. Released under the terms of the MIT License. See LICENSE for details. */
  3. /*
  4. This file is AUTO-GENERATED from 'instructions.yml'.
  5. `make` should trigger a rebuild when it is modified; if not, use:
  6. `python scripts/update_asm_instructions.py`.
  7. @AUTOGEN_DATE Fri May 22 01:01:58 2015 UTC
  8. */
  9. /* @AUTOGEN_INST_BLOCK_START */
  10. INST_FUNC(adc)
  11. {
  12. INST_TAKES_ARGS(
  13. AT_REGISTER,
  14. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  15. AT_NONE
  16. )
  17. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_REGISTER) {
  18. if (INST_REG(0) == REG_A && INST_REG(1) == REG_A)
  19. INST_RETURN(1, 0x8F)
  20. if (INST_REG(0) == REG_A && INST_REG(1) == REG_B)
  21. INST_RETURN(1, 0x88)
  22. if (INST_REG(0) == REG_A && INST_REG(1) == REG_C)
  23. INST_RETURN(1, 0x89)
  24. if (INST_REG(0) == REG_A && INST_REG(1) == REG_D)
  25. INST_RETURN(1, 0x8A)
  26. if (INST_REG(0) == REG_A && INST_REG(1) == REG_E)
  27. INST_RETURN(1, 0x8B)
  28. if (INST_REG(0) == REG_A && INST_REG(1) == REG_H)
  29. INST_RETURN(1, 0x8C)
  30. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXH)
  31. INST_RETURN(2, INST_IX_PREFIX, 0x8C)
  32. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYH)
  33. INST_RETURN(2, INST_IY_PREFIX, 0x8C)
  34. if (INST_REG(0) == REG_A && INST_REG(1) == REG_L)
  35. INST_RETURN(1, 0x8D)
  36. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXL)
  37. INST_RETURN(2, INST_IX_PREFIX, 0x8D)
  38. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYL)
  39. INST_RETURN(2, INST_IY_PREFIX, 0x8D)
  40. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_BC)
  41. INST_RETURN(2, 0xED, 0x4A)
  42. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_DE)
  43. INST_RETURN(2, 0xED, 0x5A)
  44. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_HL)
  45. INST_RETURN(2, 0xED, 0x6A)
  46. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_SP)
  47. INST_RETURN(2, 0xED, 0x7A)
  48. INST_ERROR(ARG_VALUE)
  49. }
  50. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_IMMEDIATE) {
  51. if (INST_REG(0) == REG_A && INST_IMM(1).mask & IMM_U8)
  52. INST_RETURN(2, 0xCE, INST_IMM(1).uval)
  53. INST_ERROR(ARG_VALUE)
  54. }
  55. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT &&
  56. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  57. if (INST_REG(0) == REG_A)
  58. INST_RETURN(1, 0x8E)
  59. INST_ERROR(ARG_VALUE)
  60. }
  61. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDEXED) {
  62. if (INST_REG(0) == REG_A)
  63. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x8E, INST_INDEX(1).offset)
  64. INST_ERROR(ARG_VALUE)
  65. }
  66. INST_ERROR(ARG_TYPE)
  67. }
  68. INST_FUNC(add)
  69. {
  70. INST_TAKES_ARGS(
  71. AT_REGISTER,
  72. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  73. AT_NONE
  74. )
  75. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_REGISTER) {
  76. if (INST_REG(0) == REG_A && INST_REG(1) == REG_A)
  77. INST_RETURN(1, 0x87)
  78. if (INST_REG(0) == REG_A && INST_REG(1) == REG_B)
  79. INST_RETURN(1, 0x80)
  80. if (INST_REG(0) == REG_A && INST_REG(1) == REG_C)
  81. INST_RETURN(1, 0x81)
  82. if (INST_REG(0) == REG_A && INST_REG(1) == REG_D)
  83. INST_RETURN(1, 0x82)
  84. if (INST_REG(0) == REG_A && INST_REG(1) == REG_E)
  85. INST_RETURN(1, 0x83)
  86. if (INST_REG(0) == REG_A && INST_REG(1) == REG_H)
  87. INST_RETURN(1, 0x84)
  88. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXH)
  89. INST_RETURN(2, INST_IX_PREFIX, 0x84)
  90. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYH)
  91. INST_RETURN(2, INST_IY_PREFIX, 0x84)
  92. if (INST_REG(0) == REG_A && INST_REG(1) == REG_L)
  93. INST_RETURN(1, 0x85)
  94. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXL)
  95. INST_RETURN(2, INST_IX_PREFIX, 0x85)
  96. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYL)
  97. INST_RETURN(2, INST_IY_PREFIX, 0x85)
  98. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_BC)
  99. INST_RETURN(1, 0x09)
  100. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_BC)
  101. INST_RETURN(2, INST_IX_PREFIX, 0x09)
  102. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_BC)
  103. INST_RETURN(2, INST_IY_PREFIX, 0x09)
  104. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_DE)
  105. INST_RETURN(1, 0x19)
  106. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_DE)
  107. INST_RETURN(2, INST_IX_PREFIX, 0x19)
  108. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_DE)
  109. INST_RETURN(2, INST_IY_PREFIX, 0x19)
  110. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_HL)
  111. INST_RETURN(1, 0x29)
  112. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_IX)
  113. INST_RETURN(2, INST_IX_PREFIX, 0x29)
  114. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_IY)
  115. INST_RETURN(2, INST_IY_PREFIX, 0x29)
  116. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_SP)
  117. INST_RETURN(1, 0x39)
  118. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_SP)
  119. INST_RETURN(2, INST_IX_PREFIX, 0x39)
  120. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_SP)
  121. INST_RETURN(2, INST_IY_PREFIX, 0x39)
  122. INST_ERROR(ARG_VALUE)
  123. }
  124. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_IMMEDIATE) {
  125. if (INST_REG(0) == REG_A && INST_IMM(1).mask & IMM_U8)
  126. INST_RETURN(2, 0xC6, INST_IMM(1).uval)
  127. INST_ERROR(ARG_VALUE)
  128. }
  129. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT &&
  130. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  131. if (INST_REG(0) == REG_A)
  132. INST_RETURN(1, 0x86)
  133. INST_ERROR(ARG_VALUE)
  134. }
  135. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDEXED) {
  136. if (INST_REG(0) == REG_A)
  137. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x86, INST_INDEX(1).offset)
  138. INST_ERROR(ARG_VALUE)
  139. }
  140. INST_ERROR(ARG_TYPE)
  141. }
  142. INST_FUNC(and)
  143. {
  144. INST_TAKES_ARGS(
  145. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  146. AT_NONE,
  147. AT_NONE
  148. )
  149. if (INST_TYPE(0) == AT_REGISTER) {
  150. if (INST_REG(0) == REG_A)
  151. INST_RETURN(1, 0xA7)
  152. if (INST_REG(0) == REG_B)
  153. INST_RETURN(1, 0xA0)
  154. if (INST_REG(0) == REG_C)
  155. INST_RETURN(1, 0xA1)
  156. if (INST_REG(0) == REG_D)
  157. INST_RETURN(1, 0xA2)
  158. if (INST_REG(0) == REG_E)
  159. INST_RETURN(1, 0xA3)
  160. if (INST_REG(0) == REG_H)
  161. INST_RETURN(1, 0xA4)
  162. if (INST_REG(0) == REG_IXH)
  163. INST_RETURN(2, INST_IX_PREFIX, 0xA4)
  164. if (INST_REG(0) == REG_IYH)
  165. INST_RETURN(2, INST_IY_PREFIX, 0xA4)
  166. if (INST_REG(0) == REG_L)
  167. INST_RETURN(1, 0xA5)
  168. if (INST_REG(0) == REG_IXL)
  169. INST_RETURN(2, INST_IX_PREFIX, 0xA5)
  170. if (INST_REG(0) == REG_IYL)
  171. INST_RETURN(2, INST_IY_PREFIX, 0xA5)
  172. INST_ERROR(ARG_VALUE)
  173. }
  174. if (INST_TYPE(0) == AT_IMMEDIATE) {
  175. if (INST_IMM(0).mask & IMM_U8)
  176. INST_RETURN(2, 0xE6, INST_IMM(0).uval)
  177. INST_ERROR(ARG_VALUE)
  178. }
  179. if (INST_TYPE(0) == AT_INDIRECT &&
  180. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  181. INST_RETURN(1, 0xA6)
  182. }
  183. if (INST_TYPE(0) == AT_INDEXED) {
  184. INST_RETURN(3, INST_INDEX_PREFIX(0), 0xA6, INST_INDEX(0).offset)
  185. }
  186. INST_ERROR(ARG_TYPE)
  187. }
  188. INST_FUNC(bit)
  189. {
  190. INST_TAKES_ARGS(
  191. AT_IMMEDIATE,
  192. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  193. AT_NONE
  194. )
  195. if (INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_REGISTER) {
  196. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_A)
  197. INST_RETURN(2, 0xCB, 0x47 + 8 * INST_IMM(0).uval)
  198. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_B)
  199. INST_RETURN(2, 0xCB, 0x40 + 8 * INST_IMM(0).uval)
  200. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_C)
  201. INST_RETURN(2, 0xCB, 0x41 + 8 * INST_IMM(0).uval)
  202. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_D)
  203. INST_RETURN(2, 0xCB, 0x42 + 8 * INST_IMM(0).uval)
  204. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_E)
  205. INST_RETURN(2, 0xCB, 0x43 + 8 * INST_IMM(0).uval)
  206. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_H)
  207. INST_RETURN(2, 0xCB, 0x44 + 8 * INST_IMM(0).uval)
  208. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_L)
  209. INST_RETURN(2, 0xCB, 0x45 + 8 * INST_IMM(0).uval)
  210. INST_ERROR(ARG_VALUE)
  211. }
  212. if (INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDIRECT &&
  213. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  214. if (INST_IMM(0).mask & IMM_BIT)
  215. INST_RETURN(2, 0xCB, 0x46 + 8 * INST_IMM(0).uval)
  216. INST_ERROR(ARG_VALUE)
  217. }
  218. if (INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDEXED) {
  219. if (INST_IMM(0).mask & IMM_BIT)
  220. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x46 + 8 * INST_IMM(0).uval)
  221. INST_ERROR(ARG_VALUE)
  222. }
  223. INST_ERROR(ARG_TYPE)
  224. }
  225. INST_FUNC(call)
  226. {
  227. INST_TAKES_ARGS(
  228. AT_CONDITION|AT_IMMEDIATE,
  229. AT_IMMEDIATE|AT_OPTIONAL,
  230. AT_NONE
  231. )
  232. if (INST_NARGS == 1 && INST_TYPE(0) == AT_IMMEDIATE) {
  233. if (INST_IMM(0).mask & IMM_U16)
  234. INST_RETURN(3, 0xCD, INST_IMM_U16_B1(INST_IMM(0)), INST_IMM_U16_B2(INST_IMM(0)))
  235. INST_ERROR(ARG_VALUE)
  236. }
  237. if (INST_NARGS == 2 && INST_TYPE(0) == AT_CONDITION && INST_TYPE(1) == AT_IMMEDIATE) {
  238. if (INST_COND(0) == COND_NZ && INST_IMM(1).mask & IMM_U16)
  239. INST_RETURN(3, 0xC4, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  240. if (INST_COND(0) == COND_Z && INST_IMM(1).mask & IMM_U16)
  241. INST_RETURN(3, 0xCC, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  242. if (INST_COND(0) == COND_NC && INST_IMM(1).mask & IMM_U16)
  243. INST_RETURN(3, 0xD4, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  244. if (INST_COND(0) == COND_C && INST_IMM(1).mask & IMM_U16)
  245. INST_RETURN(3, 0xDC, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  246. if (INST_COND(0) == COND_PO && INST_IMM(1).mask & IMM_U16)
  247. INST_RETURN(3, 0xE4, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  248. if (INST_COND(0) == COND_PE && INST_IMM(1).mask & IMM_U16)
  249. INST_RETURN(3, 0xEC, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  250. if (INST_COND(0) == COND_P && INST_IMM(1).mask & IMM_U16)
  251. INST_RETURN(3, 0xF4, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  252. if (INST_COND(0) == COND_M && INST_IMM(1).mask & IMM_U16)
  253. INST_RETURN(3, 0xFC, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  254. INST_ERROR(ARG_VALUE)
  255. }
  256. INST_ERROR(ARG_TYPE)
  257. }
  258. INST_FUNC(ccf)
  259. {
  260. INST_TAKES_NO_ARGS
  261. INST_RETURN(1, 0x3F)
  262. }
  263. INST_FUNC(cp)
  264. {
  265. INST_TAKES_ARGS(
  266. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  267. AT_NONE,
  268. AT_NONE
  269. )
  270. if (INST_TYPE(0) == AT_REGISTER) {
  271. if (INST_REG(0) == REG_A)
  272. INST_RETURN(1, 0xBF)
  273. if (INST_REG(0) == REG_B)
  274. INST_RETURN(1, 0xB8)
  275. if (INST_REG(0) == REG_C)
  276. INST_RETURN(1, 0xB9)
  277. if (INST_REG(0) == REG_D)
  278. INST_RETURN(1, 0xBA)
  279. if (INST_REG(0) == REG_E)
  280. INST_RETURN(1, 0xBB)
  281. if (INST_REG(0) == REG_H)
  282. INST_RETURN(1, 0xBC)
  283. if (INST_REG(0) == REG_IXH)
  284. INST_RETURN(2, INST_IX_PREFIX, 0xBC)
  285. if (INST_REG(0) == REG_IYH)
  286. INST_RETURN(2, INST_IY_PREFIX, 0xBC)
  287. if (INST_REG(0) == REG_L)
  288. INST_RETURN(1, 0xBD)
  289. if (INST_REG(0) == REG_IXL)
  290. INST_RETURN(2, INST_IX_PREFIX, 0xBD)
  291. if (INST_REG(0) == REG_IYL)
  292. INST_RETURN(2, INST_IY_PREFIX, 0xBD)
  293. INST_ERROR(ARG_VALUE)
  294. }
  295. if (INST_TYPE(0) == AT_INDIRECT &&
  296. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  297. INST_RETURN(1, 0xBE)
  298. }
  299. if (INST_TYPE(0) == AT_INDEXED) {
  300. INST_RETURN(3, INST_INDEX_PREFIX(0), 0xBE, INST_INDEX(0).offset)
  301. }
  302. if (INST_TYPE(0) == AT_IMMEDIATE) {
  303. if (INST_IMM(0).mask & IMM_U8)
  304. INST_RETURN(2, 0xFE, INST_IMM(0).uval)
  305. INST_ERROR(ARG_VALUE)
  306. }
  307. INST_ERROR(ARG_TYPE)
  308. }
  309. INST_FUNC(cpd)
  310. {
  311. INST_TAKES_NO_ARGS
  312. INST_RETURN(2, 0xED, 0xA9)
  313. }
  314. INST_FUNC(cpdr)
  315. {
  316. INST_TAKES_NO_ARGS
  317. INST_RETURN(2, 0xED, 0xB9)
  318. }
  319. INST_FUNC(cpi)
  320. {
  321. INST_TAKES_NO_ARGS
  322. INST_RETURN(2, 0xED, 0xA1)
  323. }
  324. INST_FUNC(cpir)
  325. {
  326. INST_TAKES_NO_ARGS
  327. INST_RETURN(2, 0xED, 0xB1)
  328. }
  329. INST_FUNC(cpl)
  330. {
  331. INST_TAKES_NO_ARGS
  332. INST_RETURN(1, 0x2F)
  333. }
  334. INST_FUNC(daa)
  335. {
  336. INST_TAKES_NO_ARGS
  337. INST_RETURN(1, 0x27)
  338. }
  339. INST_FUNC(dec)
  340. {
  341. INST_TAKES_ARGS(
  342. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  343. AT_NONE,
  344. AT_NONE
  345. )
  346. if (INST_TYPE(0) == AT_REGISTER) {
  347. if (INST_REG(0) == REG_A)
  348. INST_RETURN(1, 0x3D)
  349. if (INST_REG(0) == REG_B)
  350. INST_RETURN(1, 0x05)
  351. if (INST_REG(0) == REG_C)
  352. INST_RETURN(1, 0x0D)
  353. if (INST_REG(0) == REG_D)
  354. INST_RETURN(1, 0x15)
  355. if (INST_REG(0) == REG_E)
  356. INST_RETURN(1, 0x1D)
  357. if (INST_REG(0) == REG_H)
  358. INST_RETURN(1, 0x25)
  359. if (INST_REG(0) == REG_IXH)
  360. INST_RETURN(2, INST_IX_PREFIX, 0x25)
  361. if (INST_REG(0) == REG_IYH)
  362. INST_RETURN(2, INST_IY_PREFIX, 0x25)
  363. if (INST_REG(0) == REG_L)
  364. INST_RETURN(1, 0x2D)
  365. if (INST_REG(0) == REG_IXL)
  366. INST_RETURN(2, INST_IX_PREFIX, 0x2D)
  367. if (INST_REG(0) == REG_IYL)
  368. INST_RETURN(2, INST_IY_PREFIX, 0x2D)
  369. if (INST_REG(0) == REG_BC)
  370. INST_RETURN(1, 0x0B)
  371. if (INST_REG(0) == REG_DE)
  372. INST_RETURN(1, 0x1B)
  373. if (INST_REG(0) == REG_HL)
  374. INST_RETURN(1, 0x2B)
  375. if (INST_REG(0) == REG_IX)
  376. INST_RETURN(2, INST_IX_PREFIX, 0x2B)
  377. if (INST_REG(0) == REG_IY)
  378. INST_RETURN(2, INST_IY_PREFIX, 0x2B)
  379. if (INST_REG(0) == REG_SP)
  380. INST_RETURN(1, 0x3B)
  381. INST_ERROR(ARG_VALUE)
  382. }
  383. if (INST_TYPE(0) == AT_INDIRECT &&
  384. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  385. INST_RETURN(1, 0x35)
  386. }
  387. if (INST_TYPE(0) == AT_INDEXED) {
  388. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x35, INST_INDEX(0).offset)
  389. }
  390. INST_ERROR(ARG_TYPE)
  391. }
  392. INST_FUNC(di)
  393. {
  394. INST_TAKES_NO_ARGS
  395. INST_RETURN(1, 0xF3)
  396. }
  397. INST_FUNC(djnz)
  398. {
  399. INST_TAKES_ARGS(
  400. AT_IMMEDIATE,
  401. AT_NONE,
  402. AT_NONE
  403. )
  404. if (INST_TYPE(0) == AT_IMMEDIATE) {
  405. if (INST_IMM(0).mask & IMM_REL)
  406. INST_RETURN(2, 0x10, INST_IMM(0).sval - 2)
  407. INST_ERROR(ARG_VALUE)
  408. }
  409. INST_ERROR(ARG_TYPE)
  410. }
  411. INST_FUNC(ei)
  412. {
  413. INST_TAKES_NO_ARGS
  414. INST_RETURN(1, 0xFB)
  415. }
  416. INST_FUNC(ex)
  417. {
  418. INST_TAKES_ARGS(
  419. AT_INDIRECT|AT_REGISTER,
  420. AT_REGISTER,
  421. AT_NONE
  422. )
  423. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_REGISTER) {
  424. if (INST_REG(0) == REG_AF && INST_REG(1) == REG_AF_)
  425. INST_RETURN(1, 0x08)
  426. if (INST_REG(0) == REG_DE && INST_REG(1) == REG_HL)
  427. INST_RETURN(1, 0xEB)
  428. INST_ERROR(ARG_VALUE)
  429. }
  430. if (INST_TYPE(0) == AT_INDIRECT && INST_TYPE(1) == AT_REGISTER) {
  431. if ((INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_SP) && INST_REG(1) == REG_HL)
  432. INST_RETURN(1, 0xE3)
  433. if ((INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_SP) && INST_REG(1) == REG_IX)
  434. INST_RETURN(2, INST_IX_PREFIX, 0xE3)
  435. if ((INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_SP) && INST_REG(1) == REG_IY)
  436. INST_RETURN(2, INST_IY_PREFIX, 0xE3)
  437. INST_ERROR(ARG_VALUE)
  438. }
  439. INST_ERROR(ARG_TYPE)
  440. }
  441. INST_FUNC(exx)
  442. {
  443. INST_TAKES_NO_ARGS
  444. INST_RETURN(1, 0xD9)
  445. }
  446. INST_FUNC(halt)
  447. {
  448. INST_TAKES_NO_ARGS
  449. INST_RETURN(1, 0x76)
  450. }
  451. INST_FUNC(im)
  452. {
  453. INST_TAKES_ARGS(
  454. AT_IMMEDIATE,
  455. AT_NONE,
  456. AT_NONE
  457. )
  458. if (INST_TYPE(0) == AT_IMMEDIATE) {
  459. if ((INST_IMM(0).mask & IMM_IM && INST_IMM(0).uval == 0))
  460. INST_RETURN(2, 0xED, 0x46)
  461. if ((INST_IMM(0).mask & IMM_IM && INST_IMM(0).uval == 1))
  462. INST_RETURN(2, 0xED, 0x56)
  463. if ((INST_IMM(0).mask & IMM_IM && INST_IMM(0).uval == 2))
  464. INST_RETURN(2, 0xED, 0x5E)
  465. INST_ERROR(ARG_VALUE)
  466. }
  467. INST_ERROR(ARG_TYPE)
  468. }
  469. INST_FUNC(in)
  470. {
  471. INST_TAKES_ARGS(
  472. AT_PORT|AT_REGISTER,
  473. AT_OPTIONAL|AT_PORT,
  474. AT_NONE
  475. )
  476. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_PORT) {
  477. if (INST_REG(0) == REG_A && INST_PORT(1).type == AT_IMMEDIATE)
  478. INST_RETURN(2, 0xDB, INST_PORT(1).port.imm.uval)
  479. if (INST_REG(0) == REG_A && INST_PORT(1).type == AT_REGISTER)
  480. INST_RETURN(2, 0xED, 0x78)
  481. if (INST_REG(0) == REG_B && INST_PORT(1).type == AT_REGISTER)
  482. INST_RETURN(2, 0xED, 0x40)
  483. if (INST_REG(0) == REG_C && INST_PORT(1).type == AT_REGISTER)
  484. INST_RETURN(2, 0xED, 0x48)
  485. if (INST_REG(0) == REG_D && INST_PORT(1).type == AT_REGISTER)
  486. INST_RETURN(2, 0xED, 0x50)
  487. if (INST_REG(0) == REG_E && INST_PORT(1).type == AT_REGISTER)
  488. INST_RETURN(2, 0xED, 0x58)
  489. if (INST_REG(0) == REG_H && INST_PORT(1).type == AT_REGISTER)
  490. INST_RETURN(2, 0xED, 0x60)
  491. if (INST_REG(0) == REG_L && INST_PORT(1).type == AT_REGISTER)
  492. INST_RETURN(2, 0xED, 0x68)
  493. INST_ERROR(ARG_VALUE)
  494. }
  495. if (INST_NARGS == 1 && INST_TYPE(0) == AT_PORT) {
  496. if (INST_PORT(0).type == AT_REGISTER)
  497. INST_RETURN(2, 0xED, 0x70)
  498. INST_ERROR(ARG_VALUE)
  499. }
  500. INST_ERROR(ARG_TYPE)
  501. }
  502. INST_FUNC(inc)
  503. {
  504. INST_TAKES_ARGS(
  505. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  506. AT_NONE,
  507. AT_NONE
  508. )
  509. if (INST_TYPE(0) == AT_REGISTER) {
  510. if (INST_REG(0) == REG_A)
  511. INST_RETURN(1, 0x3C)
  512. if (INST_REG(0) == REG_B)
  513. INST_RETURN(1, 0x04)
  514. if (INST_REG(0) == REG_C)
  515. INST_RETURN(1, 0x0C)
  516. if (INST_REG(0) == REG_D)
  517. INST_RETURN(1, 0x14)
  518. if (INST_REG(0) == REG_E)
  519. INST_RETURN(1, 0x1C)
  520. if (INST_REG(0) == REG_H)
  521. INST_RETURN(1, 0x24)
  522. if (INST_REG(0) == REG_IXH)
  523. INST_RETURN(2, INST_IX_PREFIX, 0x24)
  524. if (INST_REG(0) == REG_IYH)
  525. INST_RETURN(2, INST_IY_PREFIX, 0x24)
  526. if (INST_REG(0) == REG_L)
  527. INST_RETURN(1, 0x2C)
  528. if (INST_REG(0) == REG_IXL)
  529. INST_RETURN(2, INST_IX_PREFIX, 0x2C)
  530. if (INST_REG(0) == REG_IYL)
  531. INST_RETURN(2, INST_IY_PREFIX, 0x2C)
  532. if (INST_REG(0) == REG_BC)
  533. INST_RETURN(1, 0x03)
  534. if (INST_REG(0) == REG_DE)
  535. INST_RETURN(1, 0x13)
  536. if (INST_REG(0) == REG_HL)
  537. INST_RETURN(1, 0x23)
  538. if (INST_REG(0) == REG_IX)
  539. INST_RETURN(2, INST_IX_PREFIX, 0x23)
  540. if (INST_REG(0) == REG_IY)
  541. INST_RETURN(2, INST_IY_PREFIX, 0x23)
  542. if (INST_REG(0) == REG_SP)
  543. INST_RETURN(1, 0x33)
  544. INST_ERROR(ARG_VALUE)
  545. }
  546. if (INST_TYPE(0) == AT_INDIRECT &&
  547. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  548. INST_RETURN(1, 0x34)
  549. }
  550. if (INST_TYPE(0) == AT_INDEXED) {
  551. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x34, INST_INDEX(0).offset)
  552. }
  553. INST_ERROR(ARG_TYPE)
  554. }
  555. INST_FUNC(ind)
  556. {
  557. INST_TAKES_NO_ARGS
  558. INST_RETURN(2, 0xED, 0xAA)
  559. }
  560. INST_FUNC(indr)
  561. {
  562. INST_TAKES_NO_ARGS
  563. INST_RETURN(2, 0xED, 0xBA)
  564. }
  565. INST_FUNC(ini)
  566. {
  567. INST_TAKES_NO_ARGS
  568. INST_RETURN(2, 0xED, 0xA2)
  569. }
  570. INST_FUNC(inir)
  571. {
  572. INST_TAKES_NO_ARGS
  573. INST_RETURN(2, 0xED, 0xB2)
  574. }
  575. INST_FUNC(jp)
  576. {
  577. INST_TAKES_ARGS(
  578. AT_CONDITION|AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT,
  579. AT_IMMEDIATE|AT_OPTIONAL,
  580. AT_NONE
  581. )
  582. if (INST_NARGS == 1 && INST_TYPE(0) == AT_IMMEDIATE) {
  583. if (INST_IMM(0).mask & IMM_U16)
  584. INST_RETURN(3, 0xC3, INST_IMM_U16_B1(INST_IMM(0)), INST_IMM_U16_B2(INST_IMM(0)))
  585. INST_ERROR(ARG_VALUE)
  586. }
  587. if (INST_NARGS == 2 && INST_TYPE(0) == AT_CONDITION && INST_TYPE(1) == AT_IMMEDIATE) {
  588. if (INST_COND(0) == COND_NZ && INST_IMM(1).mask & IMM_U16)
  589. INST_RETURN(3, 0xC2, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  590. if (INST_COND(0) == COND_Z && INST_IMM(1).mask & IMM_U16)
  591. INST_RETURN(3, 0xCA, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  592. if (INST_COND(0) == COND_NC && INST_IMM(1).mask & IMM_U16)
  593. INST_RETURN(3, 0xD2, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  594. if (INST_COND(0) == COND_C && INST_IMM(1).mask & IMM_U16)
  595. INST_RETURN(3, 0xDA, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  596. if (INST_COND(0) == COND_PO && INST_IMM(1).mask & IMM_U16)
  597. INST_RETURN(3, 0xE2, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  598. if (INST_COND(0) == COND_PE && INST_IMM(1).mask & IMM_U16)
  599. INST_RETURN(3, 0xEA, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  600. if (INST_COND(0) == COND_P && INST_IMM(1).mask & IMM_U16)
  601. INST_RETURN(3, 0xF2, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  602. if (INST_COND(0) == COND_M && INST_IMM(1).mask & IMM_U16)
  603. INST_RETURN(3, 0xFA, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  604. INST_ERROR(ARG_VALUE)
  605. }
  606. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  607. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  608. INST_RETURN(1, 0xE9)
  609. }
  610. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  611. INST_RETURN(3, INST_INDEX_PREFIX(0), 0xE9, INST_INDEX(0).offset)
  612. }
  613. INST_ERROR(ARG_TYPE)
  614. }
  615. INST_FUNC(jr)
  616. {
  617. INST_TAKES_ARGS(
  618. AT_CONDITION|AT_IMMEDIATE,
  619. AT_IMMEDIATE|AT_OPTIONAL,
  620. AT_NONE
  621. )
  622. if (INST_NARGS == 1 && INST_TYPE(0) == AT_IMMEDIATE) {
  623. if (INST_IMM(0).mask & IMM_REL)
  624. INST_RETURN(2, 0x18, INST_IMM(0).sval - 2)
  625. INST_ERROR(ARG_VALUE)
  626. }
  627. if (INST_NARGS == 2 && INST_TYPE(0) == AT_CONDITION && INST_TYPE(1) == AT_IMMEDIATE) {
  628. if (INST_COND(0) == COND_NZ && INST_IMM(1).mask & IMM_REL)
  629. INST_RETURN(2, 0x20, INST_IMM(1).sval - 2)
  630. if (INST_COND(0) == COND_Z && INST_IMM(1).mask & IMM_REL)
  631. INST_RETURN(2, 0x28, INST_IMM(1).sval - 2)
  632. if (INST_COND(0) == COND_NC && INST_IMM(1).mask & IMM_REL)
  633. INST_RETURN(2, 0x30, INST_IMM(1).sval - 2)
  634. if (INST_COND(0) == COND_C && INST_IMM(1).mask & IMM_REL)
  635. INST_RETURN(2, 0x38, INST_IMM(1).sval - 2)
  636. INST_ERROR(ARG_VALUE)
  637. }
  638. INST_ERROR(ARG_TYPE)
  639. }
  640. INST_FUNC(ld)
  641. {
  642. INST_TAKES_ARGS(
  643. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  644. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  645. AT_NONE
  646. )
  647. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_REGISTER) {
  648. if (INST_REG(0) == REG_A && INST_REG(1) == REG_A)
  649. INST_RETURN(1, 0x7F)
  650. if (INST_REG(0) == REG_A && INST_REG(1) == REG_B)
  651. INST_RETURN(1, 0x78)
  652. if (INST_REG(0) == REG_A && INST_REG(1) == REG_C)
  653. INST_RETURN(1, 0x79)
  654. if (INST_REG(0) == REG_A && INST_REG(1) == REG_D)
  655. INST_RETURN(1, 0x7A)
  656. if (INST_REG(0) == REG_A && INST_REG(1) == REG_E)
  657. INST_RETURN(1, 0x7B)
  658. if (INST_REG(0) == REG_A && INST_REG(1) == REG_H)
  659. INST_RETURN(1, 0x7C)
  660. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXH)
  661. INST_RETURN(2, INST_IX_PREFIX, 0x7C)
  662. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYH)
  663. INST_RETURN(2, INST_IY_PREFIX, 0x7C)
  664. if (INST_REG(0) == REG_A && INST_REG(1) == REG_L)
  665. INST_RETURN(1, 0x7D)
  666. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXL)
  667. INST_RETURN(2, INST_IX_PREFIX, 0x7D)
  668. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYL)
  669. INST_RETURN(2, INST_IY_PREFIX, 0x7D)
  670. if (INST_REG(0) == REG_B && INST_REG(1) == REG_A)
  671. INST_RETURN(1, 0x47)
  672. if (INST_REG(0) == REG_B && INST_REG(1) == REG_B)
  673. INST_RETURN(1, 0x40)
  674. if (INST_REG(0) == REG_B && INST_REG(1) == REG_C)
  675. INST_RETURN(1, 0x41)
  676. if (INST_REG(0) == REG_B && INST_REG(1) == REG_D)
  677. INST_RETURN(1, 0x42)
  678. if (INST_REG(0) == REG_B && INST_REG(1) == REG_E)
  679. INST_RETURN(1, 0x43)
  680. if (INST_REG(0) == REG_B && INST_REG(1) == REG_H)
  681. INST_RETURN(1, 0x44)
  682. if (INST_REG(0) == REG_B && INST_REG(1) == REG_IXH)
  683. INST_RETURN(2, INST_IX_PREFIX, 0x44)
  684. if (INST_REG(0) == REG_B && INST_REG(1) == REG_IYH)
  685. INST_RETURN(2, INST_IY_PREFIX, 0x44)
  686. if (INST_REG(0) == REG_B && INST_REG(1) == REG_L)
  687. INST_RETURN(1, 0x45)
  688. if (INST_REG(0) == REG_B && INST_REG(1) == REG_IXL)
  689. INST_RETURN(2, INST_IX_PREFIX, 0x45)
  690. if (INST_REG(0) == REG_B && INST_REG(1) == REG_IYL)
  691. INST_RETURN(2, INST_IY_PREFIX, 0x45)
  692. if (INST_REG(0) == REG_C && INST_REG(1) == REG_A)
  693. INST_RETURN(1, 0x4F)
  694. if (INST_REG(0) == REG_C && INST_REG(1) == REG_B)
  695. INST_RETURN(1, 0x48)
  696. if (INST_REG(0) == REG_C && INST_REG(1) == REG_C)
  697. INST_RETURN(1, 0x49)
  698. if (INST_REG(0) == REG_C && INST_REG(1) == REG_D)
  699. INST_RETURN(1, 0x4A)
  700. if (INST_REG(0) == REG_C && INST_REG(1) == REG_E)
  701. INST_RETURN(1, 0x4B)
  702. if (INST_REG(0) == REG_C && INST_REG(1) == REG_H)
  703. INST_RETURN(1, 0x4C)
  704. if (INST_REG(0) == REG_C && INST_REG(1) == REG_IXH)
  705. INST_RETURN(2, INST_IX_PREFIX, 0x4C)
  706. if (INST_REG(0) == REG_C && INST_REG(1) == REG_IYH)
  707. INST_RETURN(2, INST_IY_PREFIX, 0x4C)
  708. if (INST_REG(0) == REG_C && INST_REG(1) == REG_L)
  709. INST_RETURN(1, 0x4D)
  710. if (INST_REG(0) == REG_C && INST_REG(1) == REG_IXL)
  711. INST_RETURN(2, INST_IX_PREFIX, 0x4D)
  712. if (INST_REG(0) == REG_C && INST_REG(1) == REG_IYL)
  713. INST_RETURN(2, INST_IY_PREFIX, 0x4D)
  714. if (INST_REG(0) == REG_D && INST_REG(1) == REG_A)
  715. INST_RETURN(1, 0x57)
  716. if (INST_REG(0) == REG_D && INST_REG(1) == REG_B)
  717. INST_RETURN(1, 0x50)
  718. if (INST_REG(0) == REG_D && INST_REG(1) == REG_C)
  719. INST_RETURN(1, 0x51)
  720. if (INST_REG(0) == REG_D && INST_REG(1) == REG_D)
  721. INST_RETURN(1, 0x52)
  722. if (INST_REG(0) == REG_D && INST_REG(1) == REG_E)
  723. INST_RETURN(1, 0x53)
  724. if (INST_REG(0) == REG_D && INST_REG(1) == REG_H)
  725. INST_RETURN(1, 0x54)
  726. if (INST_REG(0) == REG_D && INST_REG(1) == REG_IXH)
  727. INST_RETURN(2, INST_IX_PREFIX, 0x54)
  728. if (INST_REG(0) == REG_D && INST_REG(1) == REG_IYH)
  729. INST_RETURN(2, INST_IY_PREFIX, 0x54)
  730. if (INST_REG(0) == REG_D && INST_REG(1) == REG_L)
  731. INST_RETURN(1, 0x55)
  732. if (INST_REG(0) == REG_D && INST_REG(1) == REG_IXL)
  733. INST_RETURN(2, INST_IX_PREFIX, 0x55)
  734. if (INST_REG(0) == REG_D && INST_REG(1) == REG_IYL)
  735. INST_RETURN(2, INST_IY_PREFIX, 0x55)
  736. if (INST_REG(0) == REG_E && INST_REG(1) == REG_A)
  737. INST_RETURN(1, 0x5F)
  738. if (INST_REG(0) == REG_E && INST_REG(1) == REG_B)
  739. INST_RETURN(1, 0x58)
  740. if (INST_REG(0) == REG_E && INST_REG(1) == REG_C)
  741. INST_RETURN(1, 0x59)
  742. if (INST_REG(0) == REG_E && INST_REG(1) == REG_D)
  743. INST_RETURN(1, 0x5A)
  744. if (INST_REG(0) == REG_E && INST_REG(1) == REG_E)
  745. INST_RETURN(1, 0x5B)
  746. if (INST_REG(0) == REG_E && INST_REG(1) == REG_H)
  747. INST_RETURN(1, 0x5C)
  748. if (INST_REG(0) == REG_E && INST_REG(1) == REG_IXH)
  749. INST_RETURN(2, INST_IX_PREFIX, 0x5C)
  750. if (INST_REG(0) == REG_E && INST_REG(1) == REG_IYH)
  751. INST_RETURN(2, INST_IY_PREFIX, 0x5C)
  752. if (INST_REG(0) == REG_E && INST_REG(1) == REG_L)
  753. INST_RETURN(1, 0x5D)
  754. if (INST_REG(0) == REG_E && INST_REG(1) == REG_IXL)
  755. INST_RETURN(2, INST_IX_PREFIX, 0x5D)
  756. if (INST_REG(0) == REG_E && INST_REG(1) == REG_IYL)
  757. INST_RETURN(2, INST_IY_PREFIX, 0x5D)
  758. if (INST_REG(0) == REG_H && INST_REG(1) == REG_A)
  759. INST_RETURN(1, 0x67)
  760. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_A)
  761. INST_RETURN(2, INST_IX_PREFIX, 0x67)
  762. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_A)
  763. INST_RETURN(2, INST_IY_PREFIX, 0x67)
  764. if (INST_REG(0) == REG_H && INST_REG(1) == REG_B)
  765. INST_RETURN(1, 0x60)
  766. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_B)
  767. INST_RETURN(2, INST_IX_PREFIX, 0x60)
  768. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_B)
  769. INST_RETURN(2, INST_IY_PREFIX, 0x60)
  770. if (INST_REG(0) == REG_H && INST_REG(1) == REG_C)
  771. INST_RETURN(1, 0x61)
  772. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_C)
  773. INST_RETURN(2, INST_IX_PREFIX, 0x61)
  774. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_C)
  775. INST_RETURN(2, INST_IY_PREFIX, 0x61)
  776. if (INST_REG(0) == REG_H && INST_REG(1) == REG_D)
  777. INST_RETURN(1, 0x62)
  778. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_D)
  779. INST_RETURN(2, INST_IX_PREFIX, 0x62)
  780. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_D)
  781. INST_RETURN(2, INST_IY_PREFIX, 0x62)
  782. if (INST_REG(0) == REG_H && INST_REG(1) == REG_E)
  783. INST_RETURN(1, 0x63)
  784. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_E)
  785. INST_RETURN(2, INST_IX_PREFIX, 0x63)
  786. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_E)
  787. INST_RETURN(2, INST_IY_PREFIX, 0x63)
  788. if (INST_REG(0) == REG_H && INST_REG(1) == REG_H)
  789. INST_RETURN(1, 0x64)
  790. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_IXH)
  791. INST_RETURN(2, INST_IX_PREFIX, 0x64)
  792. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_IYH)
  793. INST_RETURN(2, INST_IY_PREFIX, 0x64)
  794. if (INST_REG(0) == REG_H && INST_REG(1) == REG_L)
  795. INST_RETURN(1, 0x65)
  796. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_IXL)
  797. INST_RETURN(2, INST_IX_PREFIX, 0x65)
  798. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_IYL)
  799. INST_RETURN(2, INST_IY_PREFIX, 0x65)
  800. if (INST_REG(0) == REG_L && INST_REG(1) == REG_A)
  801. INST_RETURN(1, 0x6F)
  802. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_A)
  803. INST_RETURN(2, INST_IX_PREFIX, 0x6F)
  804. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_A)
  805. INST_RETURN(2, INST_IY_PREFIX, 0x6F)
  806. if (INST_REG(0) == REG_L && INST_REG(1) == REG_B)
  807. INST_RETURN(1, 0x68)
  808. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_B)
  809. INST_RETURN(2, INST_IX_PREFIX, 0x68)
  810. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_B)
  811. INST_RETURN(2, INST_IY_PREFIX, 0x68)
  812. if (INST_REG(0) == REG_L && INST_REG(1) == REG_C)
  813. INST_RETURN(1, 0x69)
  814. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_C)
  815. INST_RETURN(2, INST_IX_PREFIX, 0x69)
  816. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_C)
  817. INST_RETURN(2, INST_IY_PREFIX, 0x69)
  818. if (INST_REG(0) == REG_L && INST_REG(1) == REG_D)
  819. INST_RETURN(1, 0x6A)
  820. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_D)
  821. INST_RETURN(2, INST_IX_PREFIX, 0x6A)
  822. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_D)
  823. INST_RETURN(2, INST_IY_PREFIX, 0x6A)
  824. if (INST_REG(0) == REG_L && INST_REG(1) == REG_E)
  825. INST_RETURN(1, 0x6B)
  826. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_E)
  827. INST_RETURN(2, INST_IX_PREFIX, 0x6B)
  828. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_E)
  829. INST_RETURN(2, INST_IY_PREFIX, 0x6B)
  830. if (INST_REG(0) == REG_L && INST_REG(1) == REG_H)
  831. INST_RETURN(1, 0x6C)
  832. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_IXH)
  833. INST_RETURN(2, INST_IX_PREFIX, 0x6C)
  834. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_IYH)
  835. INST_RETURN(2, INST_IY_PREFIX, 0x6C)
  836. if (INST_REG(0) == REG_L && INST_REG(1) == REG_L)
  837. INST_RETURN(1, 0x6D)
  838. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_IXL)
  839. INST_RETURN(2, INST_IX_PREFIX, 0x6D)
  840. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_IYL)
  841. INST_RETURN(2, INST_IY_PREFIX, 0x6D)
  842. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IX)
  843. INST_RETURN(3, INST_IX_PREFIX, 0xED, 0x57)
  844. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IY)
  845. INST_RETURN(3, INST_IY_PREFIX, 0xED, 0x57)
  846. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_A)
  847. INST_RETURN(3, INST_IX_PREFIX, 0xED, 0x47)
  848. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_A)
  849. INST_RETURN(3, INST_IY_PREFIX, 0xED, 0x47)
  850. if (INST_REG(0) == REG_A && INST_REG(1) == REG_R)
  851. INST_RETURN(2, 0xED, 0x5F)
  852. if (INST_REG(0) == REG_R && INST_REG(1) == REG_A)
  853. INST_RETURN(2, 0xED, 0x4F)
  854. if (INST_REG(0) == REG_SP && INST_REG(1) == REG_HL)
  855. INST_RETURN(1, 0xF9)
  856. if (INST_REG(0) == REG_SP && INST_REG(1) == REG_IX)
  857. INST_RETURN(2, INST_IX_PREFIX, 0xF9)
  858. if (INST_REG(0) == REG_SP && INST_REG(1) == REG_IY)
  859. INST_RETURN(2, INST_IY_PREFIX, 0xF9)
  860. INST_ERROR(ARG_VALUE)
  861. }
  862. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_IMMEDIATE) {
  863. if (INST_REG(0) == REG_A && INST_IMM(1).mask & IMM_U8)
  864. INST_RETURN(2, 0x3E, INST_IMM(1).uval)
  865. if (INST_REG(0) == REG_B && INST_IMM(1).mask & IMM_U8)
  866. INST_RETURN(2, 0x06, INST_IMM(1).uval)
  867. if (INST_REG(0) == REG_C && INST_IMM(1).mask & IMM_U8)
  868. INST_RETURN(2, 0x0E, INST_IMM(1).uval)
  869. if (INST_REG(0) == REG_D && INST_IMM(1).mask & IMM_U8)
  870. INST_RETURN(2, 0x16, INST_IMM(1).uval)
  871. if (INST_REG(0) == REG_E && INST_IMM(1).mask & IMM_U8)
  872. INST_RETURN(2, 0x1E, INST_IMM(1).uval)
  873. if (INST_REG(0) == REG_H && INST_IMM(1).mask & IMM_U8)
  874. INST_RETURN(2, 0x26, INST_IMM(1).uval)
  875. if (INST_REG(0) == REG_IXH && INST_IMM(1).mask & IMM_U8)
  876. INST_RETURN(3, INST_IX_PREFIX, 0x26, INST_IMM(1).uval)
  877. if (INST_REG(0) == REG_IYH && INST_IMM(1).mask & IMM_U8)
  878. INST_RETURN(3, INST_IY_PREFIX, 0x26, INST_IMM(1).uval)
  879. if (INST_REG(0) == REG_L && INST_IMM(1).mask & IMM_U8)
  880. INST_RETURN(2, 0x2E, INST_IMM(1).uval)
  881. if (INST_REG(0) == REG_IXL && INST_IMM(1).mask & IMM_U8)
  882. INST_RETURN(3, INST_IX_PREFIX, 0x2E, INST_IMM(1).uval)
  883. if (INST_REG(0) == REG_IYL && INST_IMM(1).mask & IMM_U8)
  884. INST_RETURN(3, INST_IY_PREFIX, 0x2E, INST_IMM(1).uval)
  885. if (INST_REG(0) == REG_BC && INST_IMM(1).mask & IMM_U16)
  886. INST_RETURN(3, 0x01, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  887. if (INST_REG(0) == REG_DE && INST_IMM(1).mask & IMM_U16)
  888. INST_RETURN(3, 0x11, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  889. if (INST_REG(0) == REG_HL && INST_IMM(1).mask & IMM_U16)
  890. INST_RETURN(3, 0x21, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  891. if (INST_REG(0) == REG_IX && INST_IMM(1).mask & IMM_U16)
  892. INST_RETURN(4, INST_IX_PREFIX, 0x21, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  893. if (INST_REG(0) == REG_IY && INST_IMM(1).mask & IMM_U16)
  894. INST_RETURN(4, INST_IY_PREFIX, 0x21, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  895. if (INST_REG(0) == REG_SP && INST_IMM(1).mask & IMM_U16)
  896. INST_RETURN(3, 0x31, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  897. INST_ERROR(ARG_VALUE)
  898. }
  899. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT &&
  900. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  901. if (INST_REG(0) == REG_A)
  902. INST_RETURN(1, 0x7E)
  903. if (INST_REG(0) == REG_B)
  904. INST_RETURN(1, 0x46)
  905. if (INST_REG(0) == REG_C)
  906. INST_RETURN(1, 0x4E)
  907. if (INST_REG(0) == REG_D)
  908. INST_RETURN(1, 0x56)
  909. if (INST_REG(0) == REG_E)
  910. INST_RETURN(1, 0x5E)
  911. if (INST_REG(0) == REG_H)
  912. INST_RETURN(1, 0x66)
  913. if (INST_REG(0) == REG_L)
  914. INST_RETURN(1, 0x6E)
  915. INST_ERROR(ARG_VALUE)
  916. }
  917. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDEXED) {
  918. if (INST_REG(0) == REG_A)
  919. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x7E, INST_INDEX(1).offset)
  920. if (INST_REG(0) == REG_B)
  921. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x46, INST_INDEX(1).offset)
  922. if (INST_REG(0) == REG_C)
  923. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x4E, INST_INDEX(1).offset)
  924. if (INST_REG(0) == REG_D)
  925. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x56, INST_INDEX(1).offset)
  926. if (INST_REG(0) == REG_E)
  927. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x5E, INST_INDEX(1).offset)
  928. if (INST_REG(0) == REG_H)
  929. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x66, INST_INDEX(1).offset)
  930. if (INST_REG(0) == REG_L)
  931. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x6E, INST_INDEX(1).offset)
  932. INST_ERROR(ARG_VALUE)
  933. }
  934. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT) {
  935. if (INST_REG(0) == REG_A && (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_BC))
  936. INST_RETURN(1, 0x0A)
  937. if (INST_REG(0) == REG_A && (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_DE))
  938. INST_RETURN(1, 0x1A)
  939. if (INST_REG(0) == REG_HL && INST_INDIRECT(1).type == AT_IMMEDIATE)
  940. INST_RETURN(3, 0x2A, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  941. if (INST_REG(0) == REG_IX && INST_INDIRECT(1).type == AT_IMMEDIATE)
  942. INST_RETURN(4, INST_IX_PREFIX, 0x2A, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  943. if (INST_REG(0) == REG_IY && INST_INDIRECT(1).type == AT_IMMEDIATE)
  944. INST_RETURN(4, INST_IY_PREFIX, 0x2A, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  945. if (INST_REG(0) == REG_A && INST_INDIRECT(1).type == AT_IMMEDIATE)
  946. INST_RETURN(3, 0x3A, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  947. if (INST_REG(0) == REG_BC && INST_INDIRECT(1).type == AT_IMMEDIATE)
  948. INST_RETURN(4, 0xED, 0x4B, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  949. if (INST_REG(0) == REG_DE && INST_INDIRECT(1).type == AT_IMMEDIATE)
  950. INST_RETURN(4, 0xED, 0x5B, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  951. if (INST_REG(0) == REG_SP && INST_INDIRECT(1).type == AT_IMMEDIATE)
  952. INST_RETURN(4, 0xED, 0x7B, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  953. INST_ERROR(ARG_VALUE)
  954. }
  955. if (INST_TYPE(0) == AT_INDIRECT && INST_TYPE(1) == AT_REGISTER &&
  956. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  957. if (INST_REG(1) == REG_A)
  958. INST_RETURN(1, 0x77)
  959. if (INST_REG(1) == REG_B)
  960. INST_RETURN(1, 0x70)
  961. if (INST_REG(1) == REG_C)
  962. INST_RETURN(1, 0x71)
  963. if (INST_REG(1) == REG_D)
  964. INST_RETURN(1, 0x72)
  965. if (INST_REG(1) == REG_E)
  966. INST_RETURN(1, 0x73)
  967. if (INST_REG(1) == REG_H)
  968. INST_RETURN(1, 0x74)
  969. if (INST_REG(1) == REG_L)
  970. INST_RETURN(1, 0x75)
  971. INST_ERROR(ARG_VALUE)
  972. }
  973. if (INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  974. if (INST_REG(1) == REG_A)
  975. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x77, INST_INDEX(0).offset)
  976. if (INST_REG(1) == REG_B)
  977. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x70, INST_INDEX(0).offset)
  978. if (INST_REG(1) == REG_C)
  979. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x71, INST_INDEX(0).offset)
  980. if (INST_REG(1) == REG_D)
  981. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x72, INST_INDEX(0).offset)
  982. if (INST_REG(1) == REG_E)
  983. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x73, INST_INDEX(0).offset)
  984. if (INST_REG(1) == REG_H)
  985. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x74, INST_INDEX(0).offset)
  986. if (INST_REG(1) == REG_L)
  987. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x75, INST_INDEX(0).offset)
  988. INST_ERROR(ARG_VALUE)
  989. }
  990. if (INST_TYPE(0) == AT_INDIRECT && INST_TYPE(1) == AT_IMMEDIATE &&
  991. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  992. if (INST_IMM(1).mask & IMM_U8)
  993. INST_RETURN(2, 0x36, INST_IMM(1).uval)
  994. INST_ERROR(ARG_VALUE)
  995. }
  996. if (INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_IMMEDIATE) {
  997. if (INST_IMM(1).mask & IMM_U8)
  998. INST_RETURN(4, INST_INDEX_PREFIX(0), 0x36, INST_INDEX(0).offset, INST_IMM(1).uval)
  999. INST_ERROR(ARG_VALUE)
  1000. }
  1001. if (INST_TYPE(0) == AT_INDIRECT && INST_TYPE(1) == AT_REGISTER) {
  1002. if ((INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_BC) && INST_REG(1) == REG_A)
  1003. INST_RETURN(1, 0x02)
  1004. if ((INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_DE) && INST_REG(1) == REG_A)
  1005. INST_RETURN(1, 0x12)
  1006. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_HL)
  1007. INST_RETURN(3, 0x22, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  1008. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_IX)
  1009. INST_RETURN(4, INST_IX_PREFIX, 0x22, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  1010. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_IY)
  1011. INST_RETURN(4, INST_IY_PREFIX, 0x22, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  1012. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_A)
  1013. INST_RETURN(3, 0x32, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  1014. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_BC)
  1015. INST_RETURN(4, 0xED, 0x43, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  1016. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_DE)
  1017. INST_RETURN(4, 0xED, 0x53, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  1018. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_SP)
  1019. INST_RETURN(4, 0xED, 0x73, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  1020. INST_ERROR(ARG_VALUE)
  1021. }
  1022. INST_ERROR(ARG_TYPE)
  1023. }
  1024. INST_FUNC(ldd)
  1025. {
  1026. INST_TAKES_NO_ARGS
  1027. INST_RETURN(2, 0xED, 0xA8)
  1028. }
  1029. INST_FUNC(lddr)
  1030. {
  1031. INST_TAKES_NO_ARGS
  1032. INST_RETURN(2, 0xED, 0xB8)
  1033. }
  1034. INST_FUNC(ldi)
  1035. {
  1036. INST_TAKES_NO_ARGS
  1037. INST_RETURN(2, 0xED, 0xA0)
  1038. }
  1039. INST_FUNC(ldir)
  1040. {
  1041. INST_TAKES_NO_ARGS
  1042. INST_RETURN(2, 0xED, 0xB0)
  1043. }
  1044. INST_FUNC(neg)
  1045. {
  1046. INST_TAKES_NO_ARGS
  1047. INST_RETURN(2, 0xED, 0x44)
  1048. }
  1049. INST_FUNC(nop)
  1050. {
  1051. INST_TAKES_NO_ARGS
  1052. INST_RETURN(1, 0x00)
  1053. }
  1054. INST_FUNC(or)
  1055. {
  1056. INST_TAKES_ARGS(
  1057. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1058. AT_NONE,
  1059. AT_NONE
  1060. )
  1061. if (INST_TYPE(0) == AT_REGISTER) {
  1062. if (INST_REG(0) == REG_A)
  1063. INST_RETURN(1, 0xB7)
  1064. if (INST_REG(0) == REG_B)
  1065. INST_RETURN(1, 0xB0)
  1066. if (INST_REG(0) == REG_C)
  1067. INST_RETURN(1, 0xB1)
  1068. if (INST_REG(0) == REG_D)
  1069. INST_RETURN(1, 0xB2)
  1070. if (INST_REG(0) == REG_E)
  1071. INST_RETURN(1, 0xB3)
  1072. if (INST_REG(0) == REG_H)
  1073. INST_RETURN(1, 0xB4)
  1074. if (INST_REG(0) == REG_IXH)
  1075. INST_RETURN(2, INST_IX_PREFIX, 0xB4)
  1076. if (INST_REG(0) == REG_IYH)
  1077. INST_RETURN(2, INST_IY_PREFIX, 0xB4)
  1078. if (INST_REG(0) == REG_L)
  1079. INST_RETURN(1, 0xB5)
  1080. if (INST_REG(0) == REG_IXL)
  1081. INST_RETURN(2, INST_IX_PREFIX, 0xB5)
  1082. if (INST_REG(0) == REG_IYL)
  1083. INST_RETURN(2, INST_IY_PREFIX, 0xB5)
  1084. INST_ERROR(ARG_VALUE)
  1085. }
  1086. if (INST_TYPE(0) == AT_IMMEDIATE) {
  1087. if (INST_IMM(0).mask & IMM_U8)
  1088. INST_RETURN(2, 0xF6, INST_IMM(0).uval)
  1089. INST_ERROR(ARG_VALUE)
  1090. }
  1091. if (INST_TYPE(0) == AT_INDIRECT &&
  1092. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1093. INST_RETURN(1, 0xB6)
  1094. }
  1095. if (INST_TYPE(0) == AT_INDEXED) {
  1096. INST_RETURN(3, INST_INDEX_PREFIX(0), 0xB6, INST_INDEX(0).offset)
  1097. }
  1098. INST_ERROR(ARG_TYPE)
  1099. }
  1100. INST_FUNC(otdr)
  1101. {
  1102. INST_TAKES_NO_ARGS
  1103. INST_RETURN(2, 0xED, 0xBB)
  1104. }
  1105. INST_FUNC(otir)
  1106. {
  1107. INST_TAKES_NO_ARGS
  1108. INST_RETURN(2, 0xED, 0xB3)
  1109. }
  1110. INST_FUNC(out)
  1111. {
  1112. INST_TAKES_ARGS(
  1113. AT_PORT,
  1114. AT_IMMEDIATE|AT_REGISTER,
  1115. AT_NONE
  1116. )
  1117. if (INST_TYPE(0) == AT_PORT && INST_TYPE(1) == AT_REGISTER) {
  1118. if (INST_PORT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_A)
  1119. INST_RETURN(2, 0xD3, INST_PORT(0).port.imm.uval)
  1120. if (INST_PORT(0).type == AT_REGISTER && INST_REG(1) == REG_A)
  1121. INST_RETURN(2, 0xED, 0x79)
  1122. if (INST_PORT(0).type == AT_REGISTER && INST_REG(1) == REG_B)
  1123. INST_RETURN(2, 0xED, 0x41)
  1124. if (INST_PORT(0).type == AT_REGISTER && INST_REG(1) == REG_C)
  1125. INST_RETURN(2, 0xED, 0x49)
  1126. if (INST_PORT(0).type == AT_REGISTER && INST_REG(1) == REG_D)
  1127. INST_RETURN(2, 0xED, 0x51)
  1128. if (INST_PORT(0).type == AT_REGISTER && INST_REG(1) == REG_E)
  1129. INST_RETURN(2, 0xED, 0x59)
  1130. if (INST_PORT(0).type == AT_REGISTER && INST_REG(1) == REG_H)
  1131. INST_RETURN(2, 0xED, 0x61)
  1132. if (INST_PORT(0).type == AT_REGISTER && INST_REG(1) == REG_L)
  1133. INST_RETURN(2, 0xED, 0x69)
  1134. INST_ERROR(ARG_VALUE)
  1135. }
  1136. if (INST_TYPE(0) == AT_PORT && INST_TYPE(1) == AT_IMMEDIATE) {
  1137. if (INST_PORT(0).type == AT_REGISTER && (INST_IMM(1).mask & IMM_U8 && INST_IMM(1).uval == 0))
  1138. INST_RETURN(2, 0xED, 0x71)
  1139. INST_ERROR(ARG_VALUE)
  1140. }
  1141. INST_ERROR(ARG_TYPE)
  1142. }
  1143. INST_FUNC(outd)
  1144. {
  1145. INST_TAKES_NO_ARGS
  1146. INST_RETURN(2, 0xED, 0xAB)
  1147. }
  1148. INST_FUNC(outi)
  1149. {
  1150. INST_TAKES_NO_ARGS
  1151. INST_RETURN(2, 0xED, 0xA3)
  1152. }
  1153. INST_FUNC(pop)
  1154. {
  1155. INST_TAKES_ARGS(
  1156. AT_REGISTER,
  1157. AT_NONE,
  1158. AT_NONE
  1159. )
  1160. if (INST_TYPE(0) == AT_REGISTER) {
  1161. if (INST_REG(0) == REG_BC)
  1162. INST_RETURN(1, 0xC1)
  1163. if (INST_REG(0) == REG_DE)
  1164. INST_RETURN(1, 0xD1)
  1165. if (INST_REG(0) == REG_HL)
  1166. INST_RETURN(1, 0xE1)
  1167. if (INST_REG(0) == REG_IX)
  1168. INST_RETURN(2, INST_IX_PREFIX, 0xE1)
  1169. if (INST_REG(0) == REG_IY)
  1170. INST_RETURN(2, INST_IY_PREFIX, 0xE1)
  1171. if (INST_REG(0) == REG_AF)
  1172. INST_RETURN(1, 0xF1)
  1173. INST_ERROR(ARG_VALUE)
  1174. }
  1175. INST_ERROR(ARG_TYPE)
  1176. }
  1177. INST_FUNC(push)
  1178. {
  1179. INST_TAKES_ARGS(
  1180. AT_REGISTER,
  1181. AT_NONE,
  1182. AT_NONE
  1183. )
  1184. if (INST_TYPE(0) == AT_REGISTER) {
  1185. if (INST_REG(0) == REG_BC)
  1186. INST_RETURN(1, 0xC5)
  1187. if (INST_REG(0) == REG_DE)
  1188. INST_RETURN(1, 0xD5)
  1189. if (INST_REG(0) == REG_HL)
  1190. INST_RETURN(1, 0xE5)
  1191. if (INST_REG(0) == REG_IX)
  1192. INST_RETURN(2, INST_IX_PREFIX, 0xE5)
  1193. if (INST_REG(0) == REG_IY)
  1194. INST_RETURN(2, INST_IY_PREFIX, 0xE5)
  1195. if (INST_REG(0) == REG_AF)
  1196. INST_RETURN(1, 0xF5)
  1197. INST_ERROR(ARG_VALUE)
  1198. }
  1199. INST_ERROR(ARG_TYPE)
  1200. }
  1201. INST_FUNC(res)
  1202. {
  1203. INST_TAKES_ARGS(
  1204. AT_IMMEDIATE,
  1205. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1206. AT_OPTIONAL|AT_REGISTER
  1207. )
  1208. if (INST_NARGS == 2 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_REGISTER) {
  1209. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_A)
  1210. INST_RETURN(2, 0xCB, 0x87 + 8 * INST_IMM(0).uval)
  1211. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_B)
  1212. INST_RETURN(2, 0xCB, 0x80 + 8 * INST_IMM(0).uval)
  1213. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_C)
  1214. INST_RETURN(2, 0xCB, 0x81 + 8 * INST_IMM(0).uval)
  1215. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_D)
  1216. INST_RETURN(2, 0xCB, 0x82 + 8 * INST_IMM(0).uval)
  1217. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_E)
  1218. INST_RETURN(2, 0xCB, 0x83 + 8 * INST_IMM(0).uval)
  1219. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_H)
  1220. INST_RETURN(2, 0xCB, 0x84 + 8 * INST_IMM(0).uval)
  1221. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_L)
  1222. INST_RETURN(2, 0xCB, 0x85 + 8 * INST_IMM(0).uval)
  1223. INST_ERROR(ARG_VALUE)
  1224. }
  1225. if (INST_NARGS == 2 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDIRECT &&
  1226. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  1227. if (INST_IMM(0).mask & IMM_BIT)
  1228. INST_RETURN(2, 0xCB, 0x86 + 8 * INST_IMM(0).uval)
  1229. INST_ERROR(ARG_VALUE)
  1230. }
  1231. if (INST_NARGS == 2 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDEXED) {
  1232. if (INST_IMM(0).mask & IMM_BIT)
  1233. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x86 + 8 * INST_IMM(0).uval)
  1234. INST_ERROR(ARG_VALUE)
  1235. }
  1236. if (INST_NARGS == 3 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDEXED && INST_TYPE(2) == AT_REGISTER) {
  1237. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_A)
  1238. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x87 + 8 * INST_IMM(0).uval)
  1239. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_B)
  1240. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x80 + 8 * INST_IMM(0).uval)
  1241. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_C)
  1242. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x81 + 8 * INST_IMM(0).uval)
  1243. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_D)
  1244. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x82 + 8 * INST_IMM(0).uval)
  1245. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_E)
  1246. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x83 + 8 * INST_IMM(0).uval)
  1247. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_H)
  1248. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x84 + 8 * INST_IMM(0).uval)
  1249. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_L)
  1250. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x85 + 8 * INST_IMM(0).uval)
  1251. INST_ERROR(ARG_VALUE)
  1252. }
  1253. INST_ERROR(ARG_TYPE)
  1254. }
  1255. INST_FUNC(ret)
  1256. {
  1257. INST_TAKES_ARGS(
  1258. AT_CONDITION|AT_OPTIONAL,
  1259. AT_NONE,
  1260. AT_NONE
  1261. )
  1262. if (INST_NARGS == 0) {
  1263. INST_RETURN(1, 0xC9)
  1264. }
  1265. if (INST_NARGS == 1 && INST_TYPE(0) == AT_CONDITION) {
  1266. if (INST_COND(0) == COND_NZ)
  1267. INST_RETURN(1, 0xC0)
  1268. if (INST_COND(0) == COND_Z)
  1269. INST_RETURN(1, 0xC8)
  1270. if (INST_COND(0) == COND_NC)
  1271. INST_RETURN(1, 0xD0)
  1272. if (INST_COND(0) == COND_C)
  1273. INST_RETURN(1, 0xD8)
  1274. if (INST_COND(0) == COND_PO)
  1275. INST_RETURN(1, 0xE0)
  1276. if (INST_COND(0) == COND_PE)
  1277. INST_RETURN(1, 0xE8)
  1278. if (INST_COND(0) == COND_P)
  1279. INST_RETURN(1, 0xF0)
  1280. if (INST_COND(0) == COND_M)
  1281. INST_RETURN(1, 0xF8)
  1282. INST_ERROR(ARG_VALUE)
  1283. }
  1284. INST_ERROR(ARG_TYPE)
  1285. }
  1286. INST_FUNC(reti)
  1287. {
  1288. INST_TAKES_NO_ARGS
  1289. INST_RETURN(2, 0xED, 0x4D)
  1290. }
  1291. INST_FUNC(retn)
  1292. {
  1293. INST_TAKES_NO_ARGS
  1294. INST_RETURN(2, 0xED, 0x45)
  1295. }
  1296. INST_FUNC(rl)
  1297. {
  1298. INST_TAKES_ARGS(
  1299. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1300. AT_OPTIONAL|AT_REGISTER,
  1301. AT_NONE
  1302. )
  1303. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1304. if (INST_REG(0) == REG_A)
  1305. INST_RETURN(2, 0xCB, 0x17)
  1306. if (INST_REG(0) == REG_B)
  1307. INST_RETURN(2, 0xCB, 0x10)
  1308. if (INST_REG(0) == REG_C)
  1309. INST_RETURN(2, 0xCB, 0x11)
  1310. if (INST_REG(0) == REG_D)
  1311. INST_RETURN(2, 0xCB, 0x12)
  1312. if (INST_REG(0) == REG_E)
  1313. INST_RETURN(2, 0xCB, 0x13)
  1314. if (INST_REG(0) == REG_H)
  1315. INST_RETURN(2, 0xCB, 0x14)
  1316. if (INST_REG(0) == REG_L)
  1317. INST_RETURN(2, 0xCB, 0x15)
  1318. INST_ERROR(ARG_VALUE)
  1319. }
  1320. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  1321. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1322. INST_RETURN(2, 0xCB, 0x16)
  1323. }
  1324. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  1325. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x16)
  1326. }
  1327. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1328. if (INST_REG(1) == REG_A)
  1329. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x17)
  1330. if (INST_REG(1) == REG_B)
  1331. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x10)
  1332. if (INST_REG(1) == REG_C)
  1333. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x11)
  1334. if (INST_REG(1) == REG_D)
  1335. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x12)
  1336. if (INST_REG(1) == REG_E)
  1337. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x13)
  1338. if (INST_REG(1) == REG_H)
  1339. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x14)
  1340. if (INST_REG(1) == REG_L)
  1341. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x15)
  1342. INST_ERROR(ARG_VALUE)
  1343. }
  1344. INST_ERROR(ARG_TYPE)
  1345. }
  1346. INST_FUNC(rla)
  1347. {
  1348. INST_TAKES_NO_ARGS
  1349. INST_RETURN(1, 0x17)
  1350. }
  1351. INST_FUNC(rlc)
  1352. {
  1353. INST_TAKES_ARGS(
  1354. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1355. AT_OPTIONAL|AT_REGISTER,
  1356. AT_NONE
  1357. )
  1358. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1359. if (INST_REG(0) == REG_A)
  1360. INST_RETURN(2, 0xCB, 0x07)
  1361. if (INST_REG(0) == REG_B)
  1362. INST_RETURN(2, 0xCB, 0x00)
  1363. if (INST_REG(0) == REG_C)
  1364. INST_RETURN(2, 0xCB, 0x01)
  1365. if (INST_REG(0) == REG_D)
  1366. INST_RETURN(2, 0xCB, 0x02)
  1367. if (INST_REG(0) == REG_E)
  1368. INST_RETURN(2, 0xCB, 0x03)
  1369. if (INST_REG(0) == REG_H)
  1370. INST_RETURN(2, 0xCB, 0x04)
  1371. if (INST_REG(0) == REG_L)
  1372. INST_RETURN(2, 0xCB, 0x05)
  1373. INST_ERROR(ARG_VALUE)
  1374. }
  1375. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  1376. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1377. INST_RETURN(2, 0xCB, 0x06)
  1378. }
  1379. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  1380. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x06)
  1381. }
  1382. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1383. if (INST_REG(1) == REG_A)
  1384. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x07)
  1385. if (INST_REG(1) == REG_B)
  1386. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x00)
  1387. if (INST_REG(1) == REG_C)
  1388. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x01)
  1389. if (INST_REG(1) == REG_D)
  1390. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x02)
  1391. if (INST_REG(1) == REG_E)
  1392. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x03)
  1393. if (INST_REG(1) == REG_H)
  1394. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x04)
  1395. if (INST_REG(1) == REG_L)
  1396. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x05)
  1397. INST_ERROR(ARG_VALUE)
  1398. }
  1399. INST_ERROR(ARG_TYPE)
  1400. }
  1401. INST_FUNC(rlca)
  1402. {
  1403. INST_TAKES_NO_ARGS
  1404. INST_RETURN(1, 0x07)
  1405. }
  1406. INST_FUNC(rld)
  1407. {
  1408. INST_TAKES_NO_ARGS
  1409. INST_RETURN(2, 0xED, 0x6F)
  1410. }
  1411. INST_FUNC(rr)
  1412. {
  1413. INST_TAKES_ARGS(
  1414. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1415. AT_OPTIONAL|AT_REGISTER,
  1416. AT_NONE
  1417. )
  1418. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1419. if (INST_REG(0) == REG_A)
  1420. INST_RETURN(2, 0xCB, 0x1F)
  1421. if (INST_REG(0) == REG_B)
  1422. INST_RETURN(2, 0xCB, 0x18)
  1423. if (INST_REG(0) == REG_C)
  1424. INST_RETURN(2, 0xCB, 0x19)
  1425. if (INST_REG(0) == REG_D)
  1426. INST_RETURN(2, 0xCB, 0x1A)
  1427. if (INST_REG(0) == REG_E)
  1428. INST_RETURN(2, 0xCB, 0x1B)
  1429. if (INST_REG(0) == REG_H)
  1430. INST_RETURN(2, 0xCB, 0x1C)
  1431. if (INST_REG(0) == REG_L)
  1432. INST_RETURN(2, 0xCB, 0x1D)
  1433. INST_ERROR(ARG_VALUE)
  1434. }
  1435. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  1436. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1437. INST_RETURN(2, 0xCB, 0x1E)
  1438. }
  1439. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  1440. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x1E)
  1441. }
  1442. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1443. if (INST_REG(1) == REG_A)
  1444. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x1F)
  1445. if (INST_REG(1) == REG_B)
  1446. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x18)
  1447. if (INST_REG(1) == REG_C)
  1448. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x19)
  1449. if (INST_REG(1) == REG_D)
  1450. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x1A)
  1451. if (INST_REG(1) == REG_E)
  1452. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x1B)
  1453. if (INST_REG(1) == REG_H)
  1454. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x1C)
  1455. if (INST_REG(1) == REG_L)
  1456. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x1D)
  1457. INST_ERROR(ARG_VALUE)
  1458. }
  1459. INST_ERROR(ARG_TYPE)
  1460. }
  1461. INST_FUNC(rra)
  1462. {
  1463. INST_TAKES_NO_ARGS
  1464. INST_RETURN(1, 0x1F)
  1465. }
  1466. INST_FUNC(rrc)
  1467. {
  1468. INST_TAKES_ARGS(
  1469. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1470. AT_OPTIONAL|AT_REGISTER,
  1471. AT_NONE
  1472. )
  1473. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1474. if (INST_REG(0) == REG_A)
  1475. INST_RETURN(2, 0xCB, 0x0F)
  1476. if (INST_REG(0) == REG_B)
  1477. INST_RETURN(2, 0xCB, 0x08)
  1478. if (INST_REG(0) == REG_C)
  1479. INST_RETURN(2, 0xCB, 0x09)
  1480. if (INST_REG(0) == REG_D)
  1481. INST_RETURN(2, 0xCB, 0x0A)
  1482. if (INST_REG(0) == REG_E)
  1483. INST_RETURN(2, 0xCB, 0x0B)
  1484. if (INST_REG(0) == REG_H)
  1485. INST_RETURN(2, 0xCB, 0x0C)
  1486. if (INST_REG(0) == REG_L)
  1487. INST_RETURN(2, 0xCB, 0x0D)
  1488. INST_ERROR(ARG_VALUE)
  1489. }
  1490. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  1491. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1492. INST_RETURN(2, 0xCB, 0x0E)
  1493. }
  1494. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  1495. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x0E)
  1496. }
  1497. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1498. if (INST_REG(1) == REG_A)
  1499. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x0F)
  1500. if (INST_REG(1) == REG_B)
  1501. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x08)
  1502. if (INST_REG(1) == REG_C)
  1503. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x09)
  1504. if (INST_REG(1) == REG_D)
  1505. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x0A)
  1506. if (INST_REG(1) == REG_E)
  1507. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x0B)
  1508. if (INST_REG(1) == REG_H)
  1509. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x0C)
  1510. if (INST_REG(1) == REG_L)
  1511. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x0D)
  1512. INST_ERROR(ARG_VALUE)
  1513. }
  1514. INST_ERROR(ARG_TYPE)
  1515. }
  1516. INST_FUNC(rrca)
  1517. {
  1518. INST_TAKES_NO_ARGS
  1519. INST_RETURN(1, 0x0F)
  1520. }
  1521. INST_FUNC(rrd)
  1522. {
  1523. INST_TAKES_NO_ARGS
  1524. INST_RETURN(2, 0xED, 0x67)
  1525. }
  1526. INST_FUNC(rst)
  1527. {
  1528. INST_TAKES_ARGS(
  1529. AT_IMMEDIATE,
  1530. AT_NONE,
  1531. AT_NONE
  1532. )
  1533. if (INST_TYPE(0) == AT_IMMEDIATE) {
  1534. if (INST_IMM(0).mask & IMM_RST)
  1535. INST_RETURN(1, 0xC7 + INST_IMM(0).uval)
  1536. INST_ERROR(ARG_VALUE)
  1537. }
  1538. INST_ERROR(ARG_TYPE)
  1539. }
  1540. INST_FUNC(sbc)
  1541. {
  1542. INST_TAKES_ARGS(
  1543. AT_REGISTER,
  1544. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1545. AT_NONE
  1546. )
  1547. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_REGISTER) {
  1548. if (INST_REG(0) == REG_A && INST_REG(1) == REG_A)
  1549. INST_RETURN(1, 0x9F)
  1550. if (INST_REG(0) == REG_A && INST_REG(1) == REG_B)
  1551. INST_RETURN(1, 0x98)
  1552. if (INST_REG(0) == REG_A && INST_REG(1) == REG_C)
  1553. INST_RETURN(1, 0x99)
  1554. if (INST_REG(0) == REG_A && INST_REG(1) == REG_D)
  1555. INST_RETURN(1, 0x9A)
  1556. if (INST_REG(0) == REG_A && INST_REG(1) == REG_E)
  1557. INST_RETURN(1, 0x9B)
  1558. if (INST_REG(0) == REG_A && INST_REG(1) == REG_H)
  1559. INST_RETURN(1, 0x9C)
  1560. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXH)
  1561. INST_RETURN(2, INST_IX_PREFIX, 0x9C)
  1562. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYH)
  1563. INST_RETURN(2, INST_IY_PREFIX, 0x9C)
  1564. if (INST_REG(0) == REG_A && INST_REG(1) == REG_L)
  1565. INST_RETURN(1, 0x9D)
  1566. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXL)
  1567. INST_RETURN(2, INST_IX_PREFIX, 0x9D)
  1568. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYL)
  1569. INST_RETURN(2, INST_IY_PREFIX, 0x9D)
  1570. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_BC)
  1571. INST_RETURN(2, 0xED, 0x42)
  1572. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_DE)
  1573. INST_RETURN(2, 0xED, 0x52)
  1574. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_HL)
  1575. INST_RETURN(2, 0xED, 0x62)
  1576. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_SP)
  1577. INST_RETURN(2, 0xED, 0x72)
  1578. INST_ERROR(ARG_VALUE)
  1579. }
  1580. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_IMMEDIATE) {
  1581. if (INST_REG(0) == REG_A && INST_IMM(1).mask & IMM_U8)
  1582. INST_RETURN(2, 0xDE, INST_IMM(1).uval)
  1583. INST_ERROR(ARG_VALUE)
  1584. }
  1585. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT &&
  1586. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  1587. if (INST_REG(0) == REG_A)
  1588. INST_RETURN(1, 0x9E)
  1589. INST_ERROR(ARG_VALUE)
  1590. }
  1591. if (INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDEXED) {
  1592. if (INST_REG(0) == REG_A)
  1593. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x9E, INST_INDEX(1).offset)
  1594. INST_ERROR(ARG_VALUE)
  1595. }
  1596. INST_ERROR(ARG_TYPE)
  1597. }
  1598. INST_FUNC(scf)
  1599. {
  1600. INST_TAKES_NO_ARGS
  1601. INST_RETURN(1, 0x37)
  1602. }
  1603. INST_FUNC(set)
  1604. {
  1605. INST_TAKES_ARGS(
  1606. AT_IMMEDIATE,
  1607. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1608. AT_OPTIONAL|AT_REGISTER
  1609. )
  1610. if (INST_NARGS == 2 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_REGISTER) {
  1611. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_A)
  1612. INST_RETURN(2, 0xCB, 0xC7 + 8 * INST_IMM(0).uval)
  1613. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_B)
  1614. INST_RETURN(2, 0xCB, 0xC0 + 8 * INST_IMM(0).uval)
  1615. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_C)
  1616. INST_RETURN(2, 0xCB, 0xC1 + 8 * INST_IMM(0).uval)
  1617. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_D)
  1618. INST_RETURN(2, 0xCB, 0xC2 + 8 * INST_IMM(0).uval)
  1619. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_E)
  1620. INST_RETURN(2, 0xCB, 0xC3 + 8 * INST_IMM(0).uval)
  1621. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_H)
  1622. INST_RETURN(2, 0xCB, 0xC4 + 8 * INST_IMM(0).uval)
  1623. if (INST_IMM(0).mask & IMM_BIT && INST_REG(1) == REG_L)
  1624. INST_RETURN(2, 0xCB, 0xC5 + 8 * INST_IMM(0).uval)
  1625. INST_ERROR(ARG_VALUE)
  1626. }
  1627. if (INST_NARGS == 2 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDIRECT &&
  1628. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  1629. if (INST_IMM(0).mask & IMM_BIT)
  1630. INST_RETURN(2, 0xCB, 0xC6 + 8 * INST_IMM(0).uval)
  1631. INST_ERROR(ARG_VALUE)
  1632. }
  1633. if (INST_NARGS == 2 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDEXED) {
  1634. if (INST_IMM(0).mask & IMM_BIT)
  1635. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0xC6 + 8 * INST_IMM(0).uval)
  1636. INST_ERROR(ARG_VALUE)
  1637. }
  1638. if (INST_NARGS == 3 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDEXED && INST_TYPE(2) == AT_REGISTER) {
  1639. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_A)
  1640. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0xC7 + 8 * INST_IMM(0).uval)
  1641. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_B)
  1642. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0xC0 + 8 * INST_IMM(0).uval)
  1643. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_C)
  1644. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0xC1 + 8 * INST_IMM(0).uval)
  1645. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_D)
  1646. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0xC2 + 8 * INST_IMM(0).uval)
  1647. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_E)
  1648. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0xC3 + 8 * INST_IMM(0).uval)
  1649. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_H)
  1650. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0xC4 + 8 * INST_IMM(0).uval)
  1651. if (INST_IMM(0).mask & IMM_BIT && INST_REG(2) == REG_L)
  1652. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0xC5 + 8 * INST_IMM(0).uval)
  1653. INST_ERROR(ARG_VALUE)
  1654. }
  1655. INST_ERROR(ARG_TYPE)
  1656. }
  1657. INST_FUNC(sl1)
  1658. {
  1659. INST_TAKES_ARGS(
  1660. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1661. AT_OPTIONAL|AT_REGISTER,
  1662. AT_NONE
  1663. )
  1664. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1665. if (INST_REG(0) == REG_A)
  1666. INST_RETURN(2, 0xCB, 0x37)
  1667. if (INST_REG(0) == REG_B)
  1668. INST_RETURN(2, 0xCB, 0x30)
  1669. if (INST_REG(0) == REG_C)
  1670. INST_RETURN(2, 0xCB, 0x31)
  1671. if (INST_REG(0) == REG_D)
  1672. INST_RETURN(2, 0xCB, 0x32)
  1673. if (INST_REG(0) == REG_E)
  1674. INST_RETURN(2, 0xCB, 0x33)
  1675. if (INST_REG(0) == REG_H)
  1676. INST_RETURN(2, 0xCB, 0x34)
  1677. if (INST_REG(0) == REG_L)
  1678. INST_RETURN(2, 0xCB, 0x35)
  1679. INST_ERROR(ARG_VALUE)
  1680. }
  1681. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  1682. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1683. INST_RETURN(2, 0xCB, 0x36)
  1684. }
  1685. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  1686. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x36)
  1687. }
  1688. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1689. if (INST_REG(1) == REG_A)
  1690. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x37)
  1691. if (INST_REG(1) == REG_B)
  1692. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x30)
  1693. if (INST_REG(1) == REG_C)
  1694. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x31)
  1695. if (INST_REG(1) == REG_D)
  1696. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x32)
  1697. if (INST_REG(1) == REG_E)
  1698. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x33)
  1699. if (INST_REG(1) == REG_H)
  1700. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x34)
  1701. if (INST_REG(1) == REG_L)
  1702. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x35)
  1703. INST_ERROR(ARG_VALUE)
  1704. }
  1705. INST_ERROR(ARG_TYPE)
  1706. }
  1707. INST_FUNC(sla)
  1708. {
  1709. INST_TAKES_ARGS(
  1710. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1711. AT_OPTIONAL|AT_REGISTER,
  1712. AT_NONE
  1713. )
  1714. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1715. if (INST_REG(0) == REG_A)
  1716. INST_RETURN(2, 0xCB, 0x27)
  1717. if (INST_REG(0) == REG_B)
  1718. INST_RETURN(2, 0xCB, 0x20)
  1719. if (INST_REG(0) == REG_C)
  1720. INST_RETURN(2, 0xCB, 0x21)
  1721. if (INST_REG(0) == REG_D)
  1722. INST_RETURN(2, 0xCB, 0x22)
  1723. if (INST_REG(0) == REG_E)
  1724. INST_RETURN(2, 0xCB, 0x23)
  1725. if (INST_REG(0) == REG_H)
  1726. INST_RETURN(2, 0xCB, 0x24)
  1727. if (INST_REG(0) == REG_L)
  1728. INST_RETURN(2, 0xCB, 0x25)
  1729. INST_ERROR(ARG_VALUE)
  1730. }
  1731. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  1732. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1733. INST_RETURN(2, 0xCB, 0x26)
  1734. }
  1735. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  1736. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x26)
  1737. }
  1738. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1739. if (INST_REG(1) == REG_A)
  1740. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x27)
  1741. if (INST_REG(1) == REG_B)
  1742. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x20)
  1743. if (INST_REG(1) == REG_C)
  1744. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x21)
  1745. if (INST_REG(1) == REG_D)
  1746. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x22)
  1747. if (INST_REG(1) == REG_E)
  1748. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x23)
  1749. if (INST_REG(1) == REG_H)
  1750. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x24)
  1751. if (INST_REG(1) == REG_L)
  1752. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x25)
  1753. INST_ERROR(ARG_VALUE)
  1754. }
  1755. INST_ERROR(ARG_TYPE)
  1756. }
  1757. INST_FUNC(sll)
  1758. {
  1759. INST_TAKES_ARGS(
  1760. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1761. AT_OPTIONAL|AT_REGISTER,
  1762. AT_NONE
  1763. )
  1764. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1765. if (INST_REG(0) == REG_A)
  1766. INST_RETURN(2, 0xCB, 0x37)
  1767. if (INST_REG(0) == REG_B)
  1768. INST_RETURN(2, 0xCB, 0x30)
  1769. if (INST_REG(0) == REG_C)
  1770. INST_RETURN(2, 0xCB, 0x31)
  1771. if (INST_REG(0) == REG_D)
  1772. INST_RETURN(2, 0xCB, 0x32)
  1773. if (INST_REG(0) == REG_E)
  1774. INST_RETURN(2, 0xCB, 0x33)
  1775. if (INST_REG(0) == REG_H)
  1776. INST_RETURN(2, 0xCB, 0x34)
  1777. if (INST_REG(0) == REG_L)
  1778. INST_RETURN(2, 0xCB, 0x35)
  1779. INST_ERROR(ARG_VALUE)
  1780. }
  1781. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT) {
  1782. INST_RETURN(2, 0xCB, 0x36)
  1783. }
  1784. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1785. if (INST_REG(1) == REG_A)
  1786. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x37)
  1787. if (INST_REG(1) == REG_B)
  1788. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x30)
  1789. if (INST_REG(1) == REG_C)
  1790. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x31)
  1791. if (INST_REG(1) == REG_D)
  1792. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x32)
  1793. if (INST_REG(1) == REG_E)
  1794. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x33)
  1795. if (INST_REG(1) == REG_H)
  1796. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x34)
  1797. if (INST_REG(1) == REG_L)
  1798. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x35)
  1799. INST_ERROR(ARG_VALUE)
  1800. }
  1801. INST_ERROR(ARG_TYPE)
  1802. }
  1803. INST_FUNC(sls)
  1804. {
  1805. INST_TAKES_ARGS(
  1806. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1807. AT_OPTIONAL|AT_REGISTER,
  1808. AT_NONE
  1809. )
  1810. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1811. if (INST_REG(0) == REG_A)
  1812. INST_RETURN(2, 0xCB, 0x37)
  1813. if (INST_REG(0) == REG_B)
  1814. INST_RETURN(2, 0xCB, 0x30)
  1815. if (INST_REG(0) == REG_C)
  1816. INST_RETURN(2, 0xCB, 0x31)
  1817. if (INST_REG(0) == REG_D)
  1818. INST_RETURN(2, 0xCB, 0x32)
  1819. if (INST_REG(0) == REG_E)
  1820. INST_RETURN(2, 0xCB, 0x33)
  1821. if (INST_REG(0) == REG_H)
  1822. INST_RETURN(2, 0xCB, 0x34)
  1823. if (INST_REG(0) == REG_L)
  1824. INST_RETURN(2, 0xCB, 0x35)
  1825. INST_ERROR(ARG_VALUE)
  1826. }
  1827. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT) {
  1828. INST_RETURN(2, 0xCB, 0x36)
  1829. }
  1830. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1831. if (INST_REG(1) == REG_A)
  1832. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x37)
  1833. if (INST_REG(1) == REG_B)
  1834. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x30)
  1835. if (INST_REG(1) == REG_C)
  1836. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x31)
  1837. if (INST_REG(1) == REG_D)
  1838. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x32)
  1839. if (INST_REG(1) == REG_E)
  1840. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x33)
  1841. if (INST_REG(1) == REG_H)
  1842. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x34)
  1843. if (INST_REG(1) == REG_L)
  1844. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x35)
  1845. INST_ERROR(ARG_VALUE)
  1846. }
  1847. INST_ERROR(ARG_TYPE)
  1848. }
  1849. INST_FUNC(sra)
  1850. {
  1851. INST_TAKES_ARGS(
  1852. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1853. AT_OPTIONAL|AT_REGISTER,
  1854. AT_NONE
  1855. )
  1856. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1857. if (INST_REG(0) == REG_A)
  1858. INST_RETURN(2, 0xCB, 0x2F)
  1859. if (INST_REG(0) == REG_B)
  1860. INST_RETURN(2, 0xCB, 0x28)
  1861. if (INST_REG(0) == REG_C)
  1862. INST_RETURN(2, 0xCB, 0x29)
  1863. if (INST_REG(0) == REG_D)
  1864. INST_RETURN(2, 0xCB, 0x2A)
  1865. if (INST_REG(0) == REG_E)
  1866. INST_RETURN(2, 0xCB, 0x2B)
  1867. if (INST_REG(0) == REG_H)
  1868. INST_RETURN(2, 0xCB, 0x2C)
  1869. if (INST_REG(0) == REG_L)
  1870. INST_RETURN(2, 0xCB, 0x2D)
  1871. INST_ERROR(ARG_VALUE)
  1872. }
  1873. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  1874. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1875. INST_RETURN(2, 0xCB, 0x2E)
  1876. }
  1877. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  1878. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x2E)
  1879. }
  1880. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1881. if (INST_REG(1) == REG_A)
  1882. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x2F)
  1883. if (INST_REG(1) == REG_B)
  1884. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x28)
  1885. if (INST_REG(1) == REG_C)
  1886. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x29)
  1887. if (INST_REG(1) == REG_D)
  1888. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x2A)
  1889. if (INST_REG(1) == REG_E)
  1890. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x2B)
  1891. if (INST_REG(1) == REG_H)
  1892. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x2C)
  1893. if (INST_REG(1) == REG_L)
  1894. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x2D)
  1895. INST_ERROR(ARG_VALUE)
  1896. }
  1897. INST_ERROR(ARG_TYPE)
  1898. }
  1899. INST_FUNC(srl)
  1900. {
  1901. INST_TAKES_ARGS(
  1902. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1903. AT_OPTIONAL|AT_REGISTER,
  1904. AT_NONE
  1905. )
  1906. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  1907. if (INST_REG(0) == REG_A)
  1908. INST_RETURN(2, 0xCB, 0x3F)
  1909. if (INST_REG(0) == REG_B)
  1910. INST_RETURN(2, 0xCB, 0x38)
  1911. if (INST_REG(0) == REG_C)
  1912. INST_RETURN(2, 0xCB, 0x39)
  1913. if (INST_REG(0) == REG_D)
  1914. INST_RETURN(2, 0xCB, 0x3A)
  1915. if (INST_REG(0) == REG_E)
  1916. INST_RETURN(2, 0xCB, 0x3B)
  1917. if (INST_REG(0) == REG_H)
  1918. INST_RETURN(2, 0xCB, 0x3C)
  1919. if (INST_REG(0) == REG_L)
  1920. INST_RETURN(2, 0xCB, 0x3D)
  1921. INST_ERROR(ARG_VALUE)
  1922. }
  1923. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  1924. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1925. INST_RETURN(2, 0xCB, 0x3E)
  1926. }
  1927. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  1928. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x3E)
  1929. }
  1930. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  1931. if (INST_REG(1) == REG_A)
  1932. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x3F)
  1933. if (INST_REG(1) == REG_B)
  1934. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x38)
  1935. if (INST_REG(1) == REG_C)
  1936. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x39)
  1937. if (INST_REG(1) == REG_D)
  1938. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x3A)
  1939. if (INST_REG(1) == REG_E)
  1940. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x3B)
  1941. if (INST_REG(1) == REG_H)
  1942. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x3C)
  1943. if (INST_REG(1) == REG_L)
  1944. INST_RETURN(4, INST_INDEX_PREFIX(0), 0xCB, INST_INDEX(0).offset, 0x3D)
  1945. INST_ERROR(ARG_VALUE)
  1946. }
  1947. INST_ERROR(ARG_TYPE)
  1948. }
  1949. INST_FUNC(sub)
  1950. {
  1951. INST_TAKES_ARGS(
  1952. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1953. AT_NONE,
  1954. AT_NONE
  1955. )
  1956. if (INST_TYPE(0) == AT_REGISTER) {
  1957. if (INST_REG(0) == REG_A)
  1958. INST_RETURN(1, 0x97)
  1959. if (INST_REG(0) == REG_B)
  1960. INST_RETURN(1, 0x90)
  1961. if (INST_REG(0) == REG_C)
  1962. INST_RETURN(1, 0x91)
  1963. if (INST_REG(0) == REG_D)
  1964. INST_RETURN(1, 0x92)
  1965. if (INST_REG(0) == REG_E)
  1966. INST_RETURN(1, 0x93)
  1967. if (INST_REG(0) == REG_H)
  1968. INST_RETURN(1, 0x94)
  1969. if (INST_REG(0) == REG_IXH)
  1970. INST_RETURN(2, INST_IX_PREFIX, 0x94)
  1971. if (INST_REG(0) == REG_IYH)
  1972. INST_RETURN(2, INST_IY_PREFIX, 0x94)
  1973. if (INST_REG(0) == REG_L)
  1974. INST_RETURN(1, 0x95)
  1975. if (INST_REG(0) == REG_IXL)
  1976. INST_RETURN(2, INST_IX_PREFIX, 0x95)
  1977. if (INST_REG(0) == REG_IYL)
  1978. INST_RETURN(2, INST_IY_PREFIX, 0x95)
  1979. INST_ERROR(ARG_VALUE)
  1980. }
  1981. if (INST_TYPE(0) == AT_IMMEDIATE) {
  1982. if (INST_IMM(0).mask & IMM_U8)
  1983. INST_RETURN(2, 0xD6, INST_IMM(0).uval)
  1984. INST_ERROR(ARG_VALUE)
  1985. }
  1986. if (INST_TYPE(0) == AT_INDIRECT &&
  1987. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  1988. INST_RETURN(1, 0x96)
  1989. }
  1990. if (INST_TYPE(0) == AT_INDEXED) {
  1991. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x96, INST_INDEX(0).offset)
  1992. }
  1993. INST_ERROR(ARG_TYPE)
  1994. }
  1995. INST_FUNC(xor)
  1996. {
  1997. INST_TAKES_ARGS(
  1998. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  1999. AT_NONE,
  2000. AT_NONE
  2001. )
  2002. if (INST_TYPE(0) == AT_REGISTER) {
  2003. if (INST_REG(0) == REG_A)
  2004. INST_RETURN(1, 0xAF)
  2005. if (INST_REG(0) == REG_B)
  2006. INST_RETURN(1, 0xA8)
  2007. if (INST_REG(0) == REG_C)
  2008. INST_RETURN(1, 0xA9)
  2009. if (INST_REG(0) == REG_D)
  2010. INST_RETURN(1, 0xAA)
  2011. if (INST_REG(0) == REG_E)
  2012. INST_RETURN(1, 0xAB)
  2013. if (INST_REG(0) == REG_H)
  2014. INST_RETURN(1, 0xAC)
  2015. if (INST_REG(0) == REG_IXH)
  2016. INST_RETURN(2, INST_IX_PREFIX, 0xAC)
  2017. if (INST_REG(0) == REG_IYH)
  2018. INST_RETURN(2, INST_IY_PREFIX, 0xAC)
  2019. if (INST_REG(0) == REG_L)
  2020. INST_RETURN(1, 0xAD)
  2021. if (INST_REG(0) == REG_IXL)
  2022. INST_RETURN(2, INST_IX_PREFIX, 0xAD)
  2023. if (INST_REG(0) == REG_IYL)
  2024. INST_RETURN(2, INST_IY_PREFIX, 0xAD)
  2025. INST_ERROR(ARG_VALUE)
  2026. }
  2027. if (INST_TYPE(0) == AT_IMMEDIATE) {
  2028. if (INST_IMM(0).mask & IMM_U8)
  2029. INST_RETURN(2, 0xEE, INST_IMM(0).uval)
  2030. INST_ERROR(ARG_VALUE)
  2031. }
  2032. if (INST_TYPE(0) == AT_INDIRECT &&
  2033. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  2034. INST_RETURN(1, 0xAE)
  2035. }
  2036. if (INST_TYPE(0) == AT_INDEXED) {
  2037. INST_RETURN(3, INST_INDEX_PREFIX(0), 0xAE, INST_INDEX(0).offset)
  2038. }
  2039. INST_ERROR(ARG_TYPE)
  2040. }
  2041. /* @AUTOGEN_INST_BLOCK_END */
  2042. /*
  2043. Return the relevant ASMInstParser function for the given encoded mnemonic.
  2044. */
  2045. static ASMInstParser lookup_parser(uint32_t key)
  2046. {
  2047. /* @AUTOGEN_LOOKUP_BLOCK_START */
  2048. HANDLE(adc)
  2049. HANDLE(add)
  2050. HANDLE(and)
  2051. HANDLE(bit)
  2052. HANDLE(call)
  2053. HANDLE(ccf)
  2054. HANDLE(cp)
  2055. HANDLE(cpd)
  2056. HANDLE(cpdr)
  2057. HANDLE(cpi)
  2058. HANDLE(cpir)
  2059. HANDLE(cpl)
  2060. HANDLE(daa)
  2061. HANDLE(dec)
  2062. HANDLE(di)
  2063. HANDLE(djnz)
  2064. HANDLE(ei)
  2065. HANDLE(ex)
  2066. HANDLE(exx)
  2067. HANDLE(halt)
  2068. HANDLE(im)
  2069. HANDLE(in)
  2070. HANDLE(inc)
  2071. HANDLE(ind)
  2072. HANDLE(indr)
  2073. HANDLE(ini)
  2074. HANDLE(inir)
  2075. HANDLE(jp)
  2076. HANDLE(jr)
  2077. HANDLE(ld)
  2078. HANDLE(ldd)
  2079. HANDLE(lddr)
  2080. HANDLE(ldi)
  2081. HANDLE(ldir)
  2082. HANDLE(neg)
  2083. HANDLE(nop)
  2084. HANDLE(or)
  2085. HANDLE(otdr)
  2086. HANDLE(otir)
  2087. HANDLE(out)
  2088. HANDLE(outd)
  2089. HANDLE(outi)
  2090. HANDLE(pop)
  2091. HANDLE(push)
  2092. HANDLE(res)
  2093. HANDLE(ret)
  2094. HANDLE(reti)
  2095. HANDLE(retn)
  2096. HANDLE(rl)
  2097. HANDLE(rla)
  2098. HANDLE(rlc)
  2099. HANDLE(rlca)
  2100. HANDLE(rld)
  2101. HANDLE(rr)
  2102. HANDLE(rra)
  2103. HANDLE(rrc)
  2104. HANDLE(rrca)
  2105. HANDLE(rrd)
  2106. HANDLE(rst)
  2107. HANDLE(sbc)
  2108. HANDLE(scf)
  2109. HANDLE(set)
  2110. HANDLE(sl1)
  2111. HANDLE(sla)
  2112. HANDLE(sll)
  2113. HANDLE(sls)
  2114. HANDLE(sra)
  2115. HANDLE(srl)
  2116. HANDLE(sub)
  2117. HANDLE(xor)
  2118. /* @AUTOGEN_LOOKUP_BLOCK_END */
  2119. return NULL;
  2120. }