table 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450
  1. "$Id$"
  2. /********************************************************************
  3. **** ****
  4. **** Z 8 0 B A C K E N D T A B L E S ****
  5. **** ****
  6. ********************************************************************/
  7. /*
  8. * INTEGER SIZE: 16 bits
  9. * POINTER SIZE: 16 bits
  10. */
  11. /* We store LB in the iy index-register, because this results in the
  12. * cheapest addressing schemes for instruction like lol and stl.
  13. * For a lol with an argument that is too low (< 0-128) or too high
  14. * (>= 127) there is an overhead, because the offset cannot be
  15. * expressed in 8 bits. In these cases we copy the LB to the hl-register,
  16. * compute the required address and use register indirect mode to do
  17. * the load. These cases occur rarely (about 11.5 % in C and 5.5 %
  18. * in Pascal.
  19. */
  20. EM_WSIZE = 2
  21. EM_PSIZE = 2
  22. EM_BSIZE = 4
  23. /**************************
  24. ** R E G I S T E R S **
  25. **************************/
  26. REGISTERS:
  27. AA = ("a",1) REG1, AREG.
  28. BB = ("b",1) REG1.
  29. CC = ("c",1) REG1.
  30. DD = ("d",1) REG1.
  31. EE = ("e",1) REG1.
  32. HH = ("h",1) REG1.
  33. LL = ("l",1) REG1.
  34. BC = ("bc",2,BB,CC) REG, GEN_REG, BC_REG, ANY_REG.
  35. DE = ("de",2,DD,EE) REG, GEN_REG, DE_REG, ANY_REG.
  36. HL = ("hl",2,HH,LL) GEN_REG, HL_REG, ANY_REG.
  37. LB = ("iy",2) LOCALBASE.
  38. IX = ("ix",2) INDEXREG, IX_REG, ANY_REG.
  39. pseudo0 = ("",2,BC,DE).
  40. pseudo1 = ("",2,HL,IX).
  41. pseudo2 = ("",2,pseudo0,pseudo1).
  42. pseudo3 = ("",2,pseudo2,AA) ALL_REG.
  43. /*****************
  44. ** T O K E N S **
  45. *****************/
  46. TOKENS:
  47. IMMEDIATE1 = {INT off;} 1 "%[off]"
  48. IMMEDIATE = {INT off;} 2 "%[off]"
  49. IREG1 = {REGISTER reg;} 1 "(%[reg])"
  50. INDEXED = {REGISTER reg;
  51. INT off; } 1 "(%[reg]+%[off])"
  52. EXTENDED = {STRING off; } 2 "(%[off])"
  53. LOCAL_ADDR = {INT off; } 2
  54. EXTENDED_ADDR = {STRING off; } 2 "%[off]"
  55. /*************************************
  56. ** T O K E N E X P R E S S I O N S **
  57. *************************************/
  58. TOKENEXPRESSIONS:
  59. ANYTOK = IMMEDIATE + EXTENDED
  60. ANY1 = REG1 + IMMEDIATE1 + IREG1 + INDEXED
  61. ANY_ADDR = EXTENDED_ADDR + LOCAL_ADDR
  62. ANY = ANYTOK + ANY_REG + ANY_ADDR
  63. MEM_ALL = ANY - ANY_REG
  64. REG_SCR = REG * SCRATCH
  65. ANY_REG_SCR = ANY_REG * SCRATCH
  66. GEN_REG_SCR = GEN_REG * SCRATCH
  67. HL_REG_SCR = HL_REG * SCRATCH
  68. BC_REG_SCR = BC_REG * SCRATCH
  69. DE_REG_SCR = DE_REG * SCRATCH
  70. IX_REG_SCR = IX_REG * SCRATCH
  71. /*************
  72. ** C O D E **
  73. *************/
  74. CODE:
  75. /* G R O U P I : L O A D S */
  76. loc | | | {IMMEDIATE,$1} | |
  77. ldc | | | {IMMEDIATE,highw(1)} {IMMEDIATE,loww(1)} | |
  78. lol sfit($1,8) | | allocate(REG)
  79. move({INDEXED,LB,$1} , %[a.2] )
  80. move({INDEXED,LB,$1+1} , %[a.1] ) | %[a] | |
  81. lol | | allocate(HL_REG,REG)
  82. "push iy"
  83. "pop %[b]"
  84. move({IMMEDIATE,$1} , %[a] )
  85. "add hl,%[b]"
  86. "ld %[b.2],(hl)"
  87. "inc hl"
  88. "ld %[b.1],(hl)"
  89. erase(HL)
  90. erase(%[a]) | %[b] | |
  91. ldl $1<126 && $1>0-128 | | allocate(REG,REG)
  92. move({INDEXED,LB,$1} , %[a.2])
  93. move({INDEXED,LB,$1+1},%[a.1])
  94. move({INDEXED,LB,$1+2},%[b.2])
  95. move({INDEXED,LB,$1+3},%[b.1]) | %[b] %[a] | |
  96. ldl | |
  97. remove(ALL)
  98. allocate(BC_REG,DE_REG,HL_REG={IMMEDIATE,$1})
  99. "push iy"
  100. "pop bc"
  101. "add hl,bc"
  102. "ld e,(hl)"
  103. "inc hl"
  104. "ld d,(hl)"
  105. "inc hl"
  106. "ld c,(hl)"
  107. "inc hl"
  108. "ld b,(hl)"
  109. | BC DE | |
  110. loe | | | {EXTENDED,$1} | |
  111. lde | | | {EXTENDED,$1+"+2"} {EXTENDED,$1} | |
  112. lil sfit($1,8) | | allocate(HL_REG,REG)
  113. move({INDEXED,LB,$1} , %[a.2])
  114. move({INDEXED,LB,$1+1} , %[a.1])
  115. "ld %[b.2],(hl)"
  116. "inc hl"
  117. "ld %[b.1],(hl)"
  118. erase(HL)
  119. erase(%[a]) | %[b] | |
  120. lil | | allocate(HL_REG = {IMMEDIATE,$1} , REG)
  121. "push iy"
  122. "pop %[b]"
  123. "add hl,%[b]"
  124. "ld %[b.2],(hl)"
  125. "inc hl"
  126. "ld %[b.1],(hl)"
  127. "ld h,%[b.1]"
  128. "ld l,%[b.2]"
  129. "ld %[b.2],(hl)"
  130. "inc hl"
  131. "ld %[b.1],(hl)"
  132. erase(HL)
  133. erase(%[a]) | %[b] | |
  134. lof | HL_REG_SCR | allocate(REG = {IMMEDIATE,$1} )
  135. "add hl,%[a]"
  136. "ld %[a.2],(hl)"
  137. "inc hl"
  138. "ld %[a.1],(hl)"
  139. erase(HL)
  140. erase(%[a]) | %[a] | |
  141. ... | REG_SCR | allocate(HL_REG = {IMMEDIATE,$1} )
  142. "add hl,%[1]"
  143. "ld %[1.2],(hl)"
  144. "inc hl"
  145. "ld %[1.1],(hl)"
  146. erase(HL)
  147. erase(%[1]) | %[1] | |
  148. ldf | HL_REG_SCR | allocate(REG = {IMMEDIATE,$1} , REG)
  149. "add hl,%[a]"
  150. "ld %[a.2],(hl)"
  151. "inc hl"
  152. "ld %[a.1],(hl)"
  153. "inc hl"
  154. "ld %[b.2],(hl)"
  155. "inc hl"
  156. "ld %[b.1],(hl)"
  157. erase(HL)
  158. erase(%[a]) | %[b] %[a] | |
  159. ... | REG_SCR | allocate(HL_REG = {IMMEDIATE,$1} , REG)
  160. "add hl,%[1]"
  161. "ld %[1.2],(hl)"
  162. "inc hl"
  163. "ld %[1.1],(hl)"
  164. "inc hl"
  165. "ld %[b.2],(hl)"
  166. "inc hl"
  167. "ld %[b.1],(hl)"
  168. erase(HL)
  169. erase(%[1]) | %[b] %[1] | |
  170. lal | | remove(ALL)
  171. allocate(HL_REG, REG = {IMMEDIATE,$1} )
  172. "push iy"
  173. "pop hl"
  174. "add hl,%[b]"
  175. erase(%[a]) | %[a] | |
  176. lae | | | {EXTENDED_ADDR,$1} | |
  177. lxl $1 == 0 | | remove(ALL)
  178. "push iy"
  179. | | |
  180. lxl | | remove(ALL)
  181. allocate(AREG = {IMMEDIATE1,$1} ,
  182. HL_REG,BC_REG)
  183. "push iy"
  184. "pop %[c]"
  185. "1:"
  186. "ld hl,4"
  187. "add hl,%[c]"
  188. "ld %[c.2],(hl)"
  189. "inc hl"
  190. "ld %[c.1],(hl)"
  191. "dec a"
  192. "jr nz,1b"
  193. "push %[c]"
  194. erase(AA) | | |
  195. lxa $1 == 0 | | | | lxl $1 adp 4 |
  196. lxa $1 == 1 | | remove(ALL)
  197. allocate(HL_REG,BC_REG)
  198. "ld %[b],4"
  199. "push iy"
  200. "pop hl"
  201. "add hl,%[b]"
  202. "ld %[b.2],(hl)"
  203. "inc hl"
  204. "ld %[b.1],(hl)"
  205. "ld hl,4"
  206. "add hl,%[b]" | HL | |
  207. lxa $1 > 1 | | remove (ANY)
  208. allocate(AREG = {IMMEDIATE1,$1},
  209. HL_REG,BC_REG)
  210. "push iy"
  211. "pop %[c]"
  212. "1:"
  213. "ld hl,4"
  214. "add hl,%[c]"
  215. "ld %[c.2],(hl)"
  216. "inc hl"
  217. "ld %[c.1],(hl)"
  218. "inc hl"
  219. "dec a"
  220. "jr nz,1b"
  221. "ld hl,4"
  222. "add hl,%[c]"
  223. erase(AA) | HL | |
  224. dch | | | | loi 2 |
  225. loi $1 == 1 | HL_REG | allocate(REG = {IMMEDIATE,0} )
  226. "ld %[a.2],(hl)"
  227. erase(%[a]) | %[a] | |
  228. ... | REG | allocate(REG,AREG)
  229. move({IREG1,%[1]} , AA)
  230. move(AA , %[a.2])
  231. move({IMMEDIATE1,0} , %[a.1])
  232. erase(AA) | %[a] | |
  233. loi $1 == 2 | HL_REG_SCR | remove(ALL) allocate(REG)
  234. "ld %[a.2],(hl)"
  235. "inc hl"
  236. "ld %[a.1],(hl)"
  237. erase(%[1]) | %[a] | |
  238. loi $1 == 4 | HL_REG_SCR | remove(ALL)
  239. allocate(AREG,REG)
  240. "ld %[b.2],(hl)"
  241. "inc hl"
  242. "ld %[b.1],(hl)"
  243. "inc hl"
  244. "ld a,(hl)"
  245. "inc hl"
  246. "ld h,(hl)"
  247. "ld l,a"
  248. erase(HL) | HL %[b] | |
  249. loi $1 <= 511 && $1 > 4 | HL_REG_SCR |
  250. remove(ALL)
  251. allocate(AREG,REG)
  252. move({IMMEDIATE,$1-1} , %[b])
  253. "add hl,%[b]"
  254. move({IMMEDIATE1,$1/2} , AA)
  255. "1:"
  256. "ld %[b.1],(hl)"
  257. "dec hl"
  258. "ld %[b.2],(hl)"
  259. "dec hl"
  260. "push %[b]"
  261. "dec a"
  262. "jr nz,1b"
  263. erase(%[a])
  264. erase(%[b]) | | |
  265. loi $1 > 511 | STACK | remove(ALL) allocate(ALL_REG)
  266. move({IMMEDIATE,$1}, HL)
  267. "push hl"
  268. "call .los"
  269. erase(HL) | | |
  270. los $1 == 2 | STACK | remove(ALL) allocate(ALL_REG)
  271. "call .los" | | |
  272. lpi | | | {EXTENDED_ADDR,$1} | |
  273. /* G R O U P II : S T O R E S */
  274. stl sfit($1,8) | REG + HL_REG |
  275. remove(ALL)
  276. move(%[1.2] , {INDEXED,LB,$1} )
  277. move(%[1.1] , {INDEXED,LB,$1+1} )
  278. | | |
  279. stl | REG |
  280. remove(ALL)
  281. allocate(HL_REG = {IMMEDIATE,$1} , REG)
  282. "push iy"
  283. "pop %[b]"
  284. "add hl,%[b]"
  285. "ld (hl),%[1.2]"
  286. "inc hl"
  287. "ld (hl),%[1.1]"
  288. erase(%[a]) | | |
  289. ste | ANY_REG | remove(EXTENDED,%[off] == $1)
  290. remove(ALL)
  291. move(%[1] , {EXTENDED,$1} ) | | |
  292. sil ($1 >= 0-128 && $1 < 127) | REG |
  293. remove(ALL)
  294. allocate(HL_REG)
  295. move({INDEXED,LB,$1} , %[a.2])
  296. move({INDEXED,LB,$1+1} , %[a.1])
  297. "ld (hl),%[1.2]"
  298. "inc hl"
  299. "ld (hl),%[1.1]"
  300. erase(%[a]) | | |
  301. sil ($1 < 0-128 || $1 >= 127) | REG |
  302. remove(ALL)
  303. allocate(HL_REG,REG)
  304. "push iy"
  305. "pop %[b]"
  306. move({IMMEDIATE,$1} , %[a])
  307. "add hl,%[b]"
  308. "ld %[b.2],(hl)"
  309. "inc hl"
  310. "ld %[b.1],(hl)"
  311. "ld h,%[b.1]"
  312. "ld l,%[b.2]"
  313. "ld (hl),%[1.2]"
  314. "inc hl"
  315. "ld (hl),%[1.1]"
  316. erase(%[a]) | | |
  317. stf | HL_REG_SCR REG | remove(ALL)
  318. allocate(REG = {IMMEDIATE,$1})
  319. "add hl,%[a]"
  320. "ld (hl),%[2.2]"
  321. "inc hl"
  322. "ld (hl),%[2.1]"
  323. erase(%[1]) | | |
  324. sti $1 == 1 | HL_REG REG | remove(ALL)
  325. "ld (hl),%[2.2]" | | |
  326. sti $1 == 2 | HL_REG_SCR REG | remove(ALL)
  327. "ld (hl),%[2.2]"
  328. "inc hl"
  329. "ld (hl),%[2.1]"
  330. erase(%[1]) | | |
  331. sti $1 == 4 | HL_REG_SCR REG REG |
  332. remove(ALL)
  333. "ld (hl),%[2.2]"
  334. "inc hl"
  335. "ld (hl),%[2.1]"
  336. "inc hl"
  337. "ld (hl),%[3.2]"
  338. "inc hl"
  339. "ld (hl),%[3.1]"
  340. erase(HL) | | |
  341. sti $1 <= 511 && $1 > 4 | HL_REG_SCR |
  342. remove(ALL)
  343. allocate(AREG,REG)
  344. move({IMMEDIATE1,$1/2} , AA)
  345. "1:"
  346. "pop %[b]"
  347. "ld (hl),%[b.2]"
  348. "inc hl"
  349. "ld (hl),%[b.1]"
  350. "inc hl"
  351. "dec a"
  352. "jr nz,1b"
  353. erase(AA)
  354. erase(HL) | | |
  355. sti $1 > 511 | STACK | remove(ALL) allocate(ALL_REG)
  356. move({IMMEDIATE,$1}, HL)
  357. "push hl"
  358. "call .sts"
  359. erase(HL) | | |
  360. sts $1 == 2 | STACK | remove(ALL) allocate(ALL_REG)
  361. "call .sts" | | |
  362. sdl ($1 >= 0-128 && $1 < 125) | REG REG |
  363. remove(ALL)
  364. move(%[1.2] , {INDEXED,LB,$1})
  365. move(%[1.1] , {INDEXED,LB,$1+1})
  366. move(%[2.2] , {INDEXED,LB,$1+2})
  367. move(%[2.1] , {INDEXED,LB,$1+3}) | | |
  368. sdl ($1 < 0-128 || $1 >= 125) | STACK |
  369. remove(ALL)
  370. allocate(HL_REG = {IMMEDIATE,$1} ,
  371. BC_REG,DE_REG,IX_REG,AREG )
  372. "call .sdl"
  373. erase(HL) | | |
  374. sde | ANY_REG ANY_REG |
  375. remove(ALL)
  376. move(%[1] , {EXTENDED,$1})
  377. move(%[2] , {EXTENDED,$1+"+2"}) | | |
  378. sdf | | remove(ALL)
  379. allocate(ALL_REG)
  380. move({IMMEDIATE,$1},DE)
  381. "call .sdf"
  382. | | |
  383. /* G R O U P III & IV : I N T E G E R A R I T H M E T I C */
  384. adi $1 == 2 | HL_REG_SCR GEN_REG |
  385. "add hl,%[2]"
  386. erase(HL) | HL | |
  387. ... | GEN_REG HL_REG_SCR |
  388. "add hl,%[1]"
  389. erase(HL) | HL | |
  390. adi $1 == 4 | HL_REG_SCR DE_REG_SCR STACK | allocate(BC_REG)
  391. "pop bc"
  392. "add hl,bc"
  393. "ex de,hl"
  394. "pop bc"
  395. "adc hl,bc"
  396. erase(DE)
  397. erase(HL) | HL DE | |
  398. sbi $1 == 2 | GEN_REG HL_REG_SCR |
  399. "or a"
  400. "sbc hl,%[1]"
  401. erase(HL) | HL | |
  402. sbi $1 == 4 | BC_REG_SCR DE_REG_SCR STACK |
  403. allocate(HL_REG)
  404. "or a"
  405. "pop hl"
  406. "sbc hl,bc" /* least sign. */
  407. "ex (sp),hl"
  408. "sbc hl,de"
  409. "pop de"
  410. erase(DE)
  411. erase(HL) | HL DE | |
  412. mli $1 == 2 | DE_REG_SCR BC_REG STACK |
  413. allocate(HL_REG,IX_REG,AREG)
  414. "call .mli2"
  415. erase(DE) | HL | |
  416. mli $1 == 4 | STACK | allocate(ALL_REG)
  417. "call .mli4" | | |
  418. dvi $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
  419. allocate(HL_REG,IX_REG,AREG)
  420. "call .dvi2"
  421. "push de"
  422. erase(BC)
  423. erase(DE) | | |
  424. dvi $1 == 4 | STACK | allocate(ALL_REG)
  425. "call .dvi4" | | |
  426. dvu $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
  427. allocate(HL_REG,IX_REG,AREG)
  428. "call .dvu2"
  429. erase(BC)
  430. erase(DE) | DE | |
  431. dvu $1 == 4 | STACK | allocate(ALL_REG)
  432. "call .dvu4" | | |
  433. rmi $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
  434. allocate(HL_REG,IX_REG,AREG)
  435. "call .rmi2"
  436. erase(BC)
  437. erase(DE) | DE | |
  438. rmi $1 == 4 | STACK | allocate(ALL_REG)
  439. "call .dvi4"
  440. "pop hl"
  441. "pop hl"
  442. erase(HL)
  443. | BC DE | |
  444. rmu $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
  445. allocate(HL_REG,IX_REG,AREG)
  446. "call .dvu2"
  447. erase(BC)
  448. erase(DE) | HL | |
  449. rmu $1 == 4 | STACK | allocate(ALL_REG)
  450. "call .dvu4" | BC DE | |
  451. ngi $1 == 2 | REG | allocate(HL_REG = {IMMEDIATE,0})
  452. "or a"
  453. "sbc hl,%[1]"
  454. erase(HL) | HL | |
  455. ngi $1 == 4 | DE_REG_SCR BC_REG_SCR |
  456. allocate(HL_REG,AREG)
  457. "xor a"
  458. "ld h,a"
  459. "ld l,a"
  460. "sbc hl,de"
  461. "ex de,hl"
  462. "ld h,a"
  463. "ld l,a"
  464. "sbc hl,bc"
  465. erase(DE) | HL DE | |
  466. sli $1 == 2 | REG_SCR HL_REG_SCR |
  467. "inc %[1.1]" /* see if count >> 15 */
  468. "dec %[1.1]"
  469. "jr z,1f"
  470. "ld %[1.2],15"
  471. "1:"
  472. "dec %[1.2]"
  473. "jp m,2f"
  474. "add hl,hl"
  475. "jr 1b"
  476. "2:"
  477. erase(%[1])
  478. erase(HL) | HL | |
  479. sli $1 == 4 | REG_SCR IX_REG_SCR HL_REG_SCR |
  480. "inc %[1.1]"
  481. "dec %[1.1]"
  482. "jr z,1f"
  483. "ld %[1.2],31"
  484. "1:"
  485. "dec %[1.2]"
  486. "jp m,2f"
  487. "add ix,ix"
  488. "adc hl,hl"
  489. "jr 1b"
  490. "2:"
  491. erase(%[1])
  492. erase(HL)
  493. erase(IX) | HL IX | |
  494. sri $1 == 2 | GEN_REG_SCR GEN_REG_SCR |
  495. "inc %[1.1]"
  496. "dec %[1.1]"
  497. "jr z,1f"
  498. "ld %[1.2],15"
  499. "1:"
  500. "dec %[1.2]"
  501. "jp m,2f"
  502. "sra %[2.1]"
  503. "rr %[2.2]"
  504. "jr 1b"
  505. "2:"
  506. erase(%[1])
  507. erase(%[2]) | %[2] | |
  508. sri $1 == 4 | GEN_REG_SCR GEN_REG_SCR GEN_REG_SCR |
  509. "inc %[1.1]"
  510. "dec %[1.1]"
  511. "jr z,1f"
  512. "ld %[1.2],31"
  513. "1:"
  514. "dec %[1.2]"
  515. "jp m,2f"
  516. "sra %[3.1]"
  517. "rr %[3.2]"
  518. "rr %[2.1]"
  519. "rr %[2.2]"
  520. "jr 1b"
  521. "2:"
  522. erase(%[1])
  523. erase(%[2])
  524. erase(%[3]) | %[3] %[2] | |
  525. mlu | | | | mli $1 |
  526. sru $1 == 2 | GEN_REG_SCR GEN_REG_SCR |
  527. "inc %[1.1]"
  528. "dec %[1.1]"
  529. "jr z,1f"
  530. "ld %[1.2],15"
  531. "1:"
  532. "dec %[1.2]"
  533. "jp m,2f"
  534. "srl %[2.1]"
  535. "rr %[2.2]"
  536. "jr 1b"
  537. "2:"
  538. erase(%[1])
  539. erase(%[2]) | %[2] | |
  540. sru $1 == 4 | GEN_REG_SCR GEN_REG_SCR GEN_REG_SCR |
  541. "inc %[1.1]"
  542. "dec %[1.1]"
  543. "jr z,1f"
  544. "ld %[1.2],31"
  545. "1:"
  546. "dec %[1.2]"
  547. "jp m,2f"
  548. "srl %[3.1]"
  549. "rr %[3.2]"
  550. "rr %[2.1]"
  551. "rr %[2.2]"
  552. "jr 1b"
  553. "2:"
  554. erase(%[1])
  555. erase(%[2])
  556. erase(%[3]) | %[3] %[2] | |
  557. adu | | | | adi $1 |
  558. sbu | | | | sbi $1 |
  559. slu | | | | sli $1 |
  560. /* G R O U P V : F L O A T I N G P O I N T */
  561. adf | |
  562. "call .unimpld" | | |
  563. sbf | |
  564. "call .unimpld" | | |
  565. mlf | |
  566. "call .unimpld" | | |
  567. dvf | |
  568. "call .unimpld" | | |
  569. ngf | |
  570. "call .unimpld" | | |
  571. fif | |
  572. "call .unimpld" | | |
  573. fef | |
  574. "call .unimpld" | | |
  575. /* G R O U P VI : P O I N T E R A R I T H M E T I C */
  576. adp $1 == 0 | | | | |
  577. adp $1 == 1 | ANY_REG_SCR | "inc %[1]"
  578. erase(%[1]) | %[1] | |
  579. adp $1 == 2 | ANY_REG_SCR | "inc %[1]"
  580. "inc %[1]"
  581. erase(%[1]) | %[1] | |
  582. adp $1 == 0-1 | ANY_REG_SCR | "dec %[1]"
  583. erase(%[1]) | %[1] | |
  584. adp $1 == 0-2 | ANY_REG_SCR | "dec %[1]"
  585. "dec %[1]"
  586. erase(%[1]) | %[1] | |
  587. adp $1 < 0-2 || $1 > 2 | HL_REG_SCR |
  588. allocate(REG = {IMMEDIATE,$1} )
  589. "add hl,%[a]"
  590. erase(HL) | HL | |
  591. ... | REG |
  592. allocate(HL_REG = {IMMEDIATE,$1} )
  593. "add hl,%[1]"
  594. erase(HL) | HL | |
  595. ... | LOCAL_ADDR | remove(ALL) | {LOCAL_ADDR, %[1.off]+$1} | |
  596. ads $1 == 2 | HL_REG_SCR REG | remove(ALL) "add hl,%[2]"
  597. erase(HL) | HL | |
  598. ... | REG HL_REG_SCR | "add hl,%[1]"
  599. erase(HL) | HL | |
  600. sbs $1 == 2 | REG HL_REG_SCR | "or a"
  601. "sbc hl,%[1]"
  602. erase(HL) | HL | |
  603. /* G R O U P VII : I N C R E M E N T / D E C R E M E N T */
  604. inc | ANY_REG_SCR | "inc %[1]"
  605. erase(%[1]) | %[1] | |
  606. /* There is no efficient way on the Z80 to increment or decrement
  607. * a local or external. We first fetch the variable into a register,
  608. * increment/decrement it and then store it.
  609. */
  610. inl | | | | lol $1 inc stl $1 |
  611. ine | | | | loe $1 inc ste $1 |
  612. dec | ANY_REG_SCR | "dec %[1]"
  613. erase(%[1]) | %[1] | |
  614. del | | | | lol $1 dec stl $1 |
  615. dee | | | | loe $1 dec ste $1 |
  616. zrl ($1 >= 0-128 && $1 < 127) | |
  617. remove(ALL)
  618. allocate(AREG)
  619. "xor a"
  620. move(AA , {INDEXED,LB,$1})
  621. move(AA , {INDEXED,LB,$1+1}) | | |
  622. zrl ($1 < 0-128 || $1 >= 127) | |
  623. remove(ALL)
  624. allocate(HL_REG = {IMMEDIATE,$1} , REG, AREG)
  625. "push iy"
  626. "pop %[b]"
  627. "add hl,%[b]"
  628. "xor a"
  629. "ld (hl),a"
  630. "inc hl"
  631. "ld (hl),a"
  632. erase(HL) | | |
  633. zrf | |
  634. "call .unimpld" | | |
  635. zre | | remove(EXTENDED,%[off] == $1)
  636. remove(ALL)
  637. allocate(ANY_REG = {IMMEDIATE,0} )
  638. move(%[a] , {EXTENDED,$1}) | | |
  639. zer $1 == 2 | | | {IMMEDIATE,0} | |
  640. zer $1 == 4 | | | {IMMEDIATE,0} {IMMEDIATE,0} | |
  641. zer $1 > 4 && $1 < 256 | STACK |
  642. allocate(BC_REG , GEN_REG)
  643. "ld b,$1"
  644. "ld %[b],0"
  645. "1:"
  646. "push %[b]"
  647. "djnz 1b"
  648. | | |
  649. /* G R O U P VIII : C O N V E R T */
  650. cii | STACK | remove(ALL) allocate(ALL_REG)
  651. "call .cii" | | |
  652. cuu | STACK | remove(ALL) allocate(ALL_REG)
  653. "call .cuu" | | |
  654. cui | | | | cuu |
  655. ciu | | | | cuu |
  656. cfi | |
  657. "call .unimpld" | | |
  658. cif | |
  659. "call .unimpld" | | |
  660. cuf | |
  661. "call .unimpld" | | |
  662. cff | |
  663. "call .unimpld" | | |
  664. cfu | |
  665. "call .unimpld" | | |
  666. cmf | |
  667. "call .unimpld" | | |
  668. /* G R O U P IX : L O G I C A L */
  669. and $1 == 2 | GEN_REG GEN_REG_SCR |
  670. allocate(AREG)
  671. "ld a,%[1.2]"
  672. "and %[2.2]"
  673. "ld %[2.2],a"
  674. "ld a,%[1.1]"
  675. "and %[2.1]"
  676. "ld %[2.1],a"
  677. erase(%[2]) | %[2] | |
  678. and defined($1) && $1 > 2 | STACK |
  679. allocate(DE_REG = {IMMEDIATE,$1},
  680. BC_REG,HL_REG,IX_REG,AREG)
  681. "call .and"
  682. erase(DE) | | |
  683. and ! defined($1) | DE_REG_SCR STACK |
  684. allocate(BC_REG,HL_REG,IX_REG,AREG)
  685. "call .and"
  686. erase(DE) | | |
  687. ior $1 == 2 | GEN_REG GEN_REG_SCR |
  688. allocate(AREG)
  689. "ld a,%[1.2]"
  690. "or %[2.2]"
  691. "ld %[2.2],a"
  692. "ld a,%[1.1]"
  693. "or %[2.1]"
  694. "ld %[2.1],a"
  695. erase(%[2]) | %[2] | |
  696. ior defined($1) && $1 > 2 | STACK |
  697. allocate(DE_REG = {IMMEDIATE,$1},
  698. BC_REG,HL_REG,IX_REG,AREG)
  699. "call .ior"
  700. erase(DE) | | |
  701. ior ! defined($1) | DE_REG_SCR STACK |
  702. allocate(BC_REG,HL_REG,IX_REG,AREG)
  703. "call .ior"
  704. erase(DE) | | |
  705. xor $1 == 2 | GEN_REG GEN_REG_SCR |
  706. allocate(AREG)
  707. "ld a,%[1.2]"
  708. "xor %[2.2]"
  709. "ld %[2.2],a"
  710. "ld a,%[1.1]"
  711. "xor %[2.1]"
  712. "ld %[2.1],a"
  713. erase(%[2]) | %[2] | |
  714. xor defined($1) && $1 > 2 | STACK |
  715. allocate(DE_REG = {IMMEDIATE,$1},
  716. BC_REG,HL_REG,IX_REG,AREG)
  717. "call .xor"
  718. erase(DE) | | |
  719. xor ! defined($1) | DE_REG_SCR STACK |
  720. allocate(BC_REG,HL_REG,IX_REG,AREG)
  721. "call .xor"
  722. erase(DE) | | |
  723. com $1 == 2 | GEN_REG_SCR | allocate(AREG)
  724. "ld a,%[1.2]"
  725. "cpl"
  726. "ld %[1.2],a"
  727. "ld a,%[1.1]"
  728. "cpl"
  729. "ld %[1.1],a"
  730. erase(%[1]) | %[1] | |
  731. com defined($1) && $1 > 2 | STACK |
  732. allocate(AREG,
  733. HL_REG = {IMMEDIATE,$1} )
  734. "add hl,sp"
  735. "1:"
  736. "dec hl"
  737. "ld a,(hl)"
  738. "cpl"
  739. "ld (hl),a"
  740. "xor a"
  741. "sbc hl,sp"
  742. "jr z,2f"
  743. "add hl,sp"
  744. "jr 1b"
  745. "2:"
  746. erase(HL) | | |
  747. com ! defined($1) | HL_REG_SCR STACK |
  748. allocate(AREG)
  749. "add hl,sp"
  750. "1:"
  751. "dec hl"
  752. "ld a,(hl)"
  753. "cpl"
  754. "ld (hl),a"
  755. "xor a"
  756. "sbc hl,sp"
  757. "jr z,2f"
  758. "add hl,sp"
  759. "jr 1b"
  760. "2:"
  761. erase(HL) | | |
  762. rol $1 == 2 | REG_SCR HL_REG_SCR |
  763. allocate(AREG)
  764. "ld a,%[1.2]"
  765. "and 15"
  766. "jr z,2f"
  767. "ld %[1],0"
  768. "1:"
  769. "add hl,hl"
  770. "adc hl,%[1]"
  771. "dec a"
  772. "jr nz,1b"
  773. "2:"
  774. erase(%[1])
  775. erase(%[2]) | HL | |
  776. rol $1 == 4 | REG IX_REG_SCR HL_REG_SCR |
  777. allocate(AREG)
  778. "ld a,%[1.2]"
  779. "and 31"
  780. "jr z,3f"
  781. "1:"
  782. "add ix,ix"
  783. "adc hl,hl"
  784. "jr nc,2f"
  785. "inc ix"
  786. "2:"
  787. "dec a"
  788. "jr nz,1b"
  789. "3:"
  790. erase(HL)
  791. erase(IX) | HL IX | |
  792. ror $1 == 2 | GEN_REG_SCR GEN_REG_SCR |
  793. allocate(AREG)
  794. "ld a,%[1.2]"
  795. "and 15"
  796. "jr z,0f"
  797. "1:"
  798. "srl %[2.1]"
  799. "rr %[2.2]"
  800. "jr nc,2f"
  801. "set 7,%[2.1]"
  802. "2:"
  803. "dec a"
  804. "jr nz,1b"
  805. "0:"
  806. erase(%[1])
  807. erase(%[2]) | %[2] | |
  808. ror $1 == 4 | GEN_REG_SCR GEN_REG_SCR GEN_REG_SCR |
  809. allocate(AREG)
  810. "ld a,%[1.2]"
  811. "and 31"
  812. "jr z,0f"
  813. "1:"
  814. "srl %[3.1]"
  815. "rr %[3.2]"
  816. "rr %[2.1]"
  817. "rr %[2.2]"
  818. "jr nc,2f"
  819. "set 7,%[3.1]"
  820. "2:"
  821. "dec a"
  822. "jr nz,1b"
  823. "0:"
  824. erase(%[1])
  825. erase(%[2])
  826. erase(%[3]) | %[3] %[2] | |
  827. /* G R O U P X : S E T S */
  828. inn defined($1) | STACK | allocate(HL_REG = {IMMEDIATE,$1},
  829. BC_REG,DE_REG,IX_REG,AREG)
  830. "call .inn"
  831. erase(HL) | | |
  832. inn !defined($1) | HL_REG_SCR STACK |
  833. allocate(BC_REG,DE_REG,IX_REG,AREG)
  834. "call .inn"
  835. erase(HL) | | |
  836. set defined($1) | STACK | allocate(HL_REG = {IMMEDIATE,$1},
  837. BC_REG,DE_REG,IX_REG,AREG)
  838. "call .set"
  839. erase(HL) | | |
  840. set !defined($1) | HL_REG_SCR STACK |
  841. allocate(BC_REG,DE_REG,IX_REG,AREG)
  842. "call .set"
  843. erase(HL) | | |
  844. /* G R O U P XI : A R R A Y S */
  845. lae aar $2 == 2 && rom(1,3) == 2 | STACK |
  846. allocate(ALL_REG)
  847. move({EXTENDED_ADDR,$1},BC)
  848. "push bc"
  849. "call .aar2" | | |
  850. lae aar $2 == 2 && rom(1,3) != 2 | STACK |
  851. allocate(ALL_REG)
  852. move({EXTENDED_ADDR,$1},BC)
  853. "push bc"
  854. "call .aar" | | |
  855. aar $1==2 | |
  856. remove(ALL)
  857. allocate(ALL_REG)
  858. "call .aar"
  859. | | |
  860. aar !defined($1) | | remove(ALL)
  861. allocate(ALL_REG)
  862. "call .aaru" | | |
  863. lae lar $2 == 2 && rom(1,3) == 2 | STACK |
  864. remove(ALL) allocate(ALL_REG)
  865. move({EXTENDED_ADDR,$1},BC)
  866. "push bc"
  867. "call .lar2" | | |
  868. lae lar $2 == 2 && rom(1,3) != 2 | STACK |
  869. remove(ALL) allocate(ALL_REG)
  870. move({EXTENDED_ADDR,$1},BC)
  871. "push bc"
  872. "call .lar" | | |
  873. lar $1==2 | | remove(ALL)
  874. allocate(ALL_REG)
  875. "call .lar" | | |
  876. lar !defined($1) | | remove(ALL)
  877. allocate(ALL_REG)
  878. "call .laru" | | |
  879. lae sar $2 == 2 && rom(1,3) == 2 | STACK |
  880. remove(ALL) allocate(ALL_REG)
  881. move({EXTENDED_ADDR, $1},BC)
  882. "push bc"
  883. "call .sar2" | | |
  884. lae sar $2 == 2 && rom(1,3) != 2 | STACK |
  885. remove(ALL) allocate(ALL_REG)
  886. move({EXTENDED_ADDR, $1},BC)
  887. "push bc"
  888. "call .sar" | | |
  889. sar $1==2 | | remove(ALL)
  890. allocate(ALL_REG)
  891. "call .sar" | | |
  892. sar !defined($1) | | remove(ALL)
  893. allocate(ALL_REG)
  894. "call .saru" | | |
  895. /* G R O U P XII : C O M P A R E */
  896. cmi $1 == 2 | REG_SCR HL_REG_SCR |
  897. remove(ALL) allocate(AREG)
  898. "ld a,h"
  899. "xor %[1.1]"
  900. "jp m,1f"
  901. "sbc hl,%[1]"
  902. "jr 2f"
  903. "1:"
  904. "xor %[1.1]"
  905. "jp m,2f"
  906. "set 0,l"
  907. "2:"
  908. erase(%[1])
  909. erase(%[2]) | HL | |
  910. cmi $1 == 4 | STACK | remove(ALL) allocate(AREG = {IMMEDIATE1,1},
  911. BC_REG,DE_REG,HL_REG,IX_REG)
  912. "call .cmu4"
  913. erase(AA) | DE | |
  914. cmu $1 == 2 | REG_SCR HL_REG_SCR |
  915. remove(ALL) allocate(AREG)
  916. "ld a,h"
  917. "xor %[1.1]" /* resets carry bit */
  918. "jp m,1f"
  919. "sbc hl,%[1]"
  920. "jr 2f"
  921. "1:"
  922. "xor %[1.1]"
  923. "cpl"
  924. "set 0,l"
  925. "2:"
  926. erase(%[1])
  927. erase(%[2]) | HL | |
  928. cmu $1 == 4 | STACK | remove(ALL) allocate(AREG = {IMMEDIATE1,0},
  929. BC_REG,DE_REG,HL_REG,IX_REG)
  930. "call .cmu4"
  931. erase(AA) | DE | |
  932. cmp | | | | cmu 2 |
  933. cms $1 == 2 | GEN_REG GEN_REG_SCR |
  934. remove(ALL) allocate(AREG)
  935. "ld a,%[1.1]"
  936. "xor %[2.1]"
  937. "ld %[2.1],a"
  938. "ld a,%[1.2]"
  939. "xor %[2.2]"
  940. "ld %[2.2],a" | %[2] | |
  941. /***
  942. cmu defined($1) | STACK | allocate(HL_REG = {IMMEDIATE,$1},
  943. BC_REG,DE_REG,IX_REG,AREG)
  944. "call .cmu"
  945. erase(HL) | | |
  946. cmu ! defined($1) | HL_REG_SCR STACK |
  947. allocate(BC_REG,DE_REG,IX_REG,AREG)
  948. "call .cmu"
  949. erase(HL) | | |
  950. */
  951. cms defined($1) | STACK | remove(ALL) allocate(HL_REG = {IMMEDIATE,$1},
  952. BC_REG,DE_REG,IX_REG,AREG)
  953. "call .cms"
  954. erase(HL) | | |
  955. cms ! defined($1) | HL_REG_SCR STACK |
  956. allocate(BC_REG,DE_REG,IX_REG,AREG)
  957. "call .cms"
  958. erase(HL) | | |
  959. tlt | GEN_REG | remove(ALL)
  960. allocate(GEN_REG = {IMMEDIATE,0})
  961. "bit 7,%[1.1]"
  962. "jr z,1f"
  963. "inc %[a.2]"
  964. "1:"
  965. erase(%[a]) | %[a] | |
  966. tle | GEN_REG | remove(ALL)
  967. allocate(AREG, GEN_REG = {IMMEDIATE,1})
  968. "xor a"
  969. "add a,%[1.1]"
  970. "jp m,2f"
  971. "jr nz,1f"
  972. "xor a"
  973. "add a,%[1.2]"
  974. "jr z,2f"
  975. "1:"
  976. "dec %[b.2]"
  977. "2:"
  978. erase(%[b]) | %[b] | |
  979. teq | GEN_REG | remove(ALL)
  980. allocate(AREG,GEN_REG = {IMMEDIATE,0})
  981. "ld a,%[1.1]"
  982. "or a"
  983. "jp m,1f"
  984. "xor %[1.2]"
  985. "jr nz,1f"
  986. "inc %[b.2]"
  987. "1:"
  988. erase(%[b]) | %[b] | |
  989. tne | GEN_REG | remove(ALL)
  990. allocate(AREG, GEN_REG = {IMMEDIATE,0})
  991. "ld a,%[1.1]"
  992. "or %[1.2]"
  993. "jr z,1f"
  994. "inc %[b.2]"
  995. "1:"
  996. erase(%[b]) | %[b] | |
  997. tge | GEN_REG | remove(ALL)
  998. allocate(GEN_REG = {IMMEDIATE,0})
  999. "bit 7,%[1.1]"
  1000. "jr nz,1f"
  1001. "inc %[a.2]"
  1002. "1:"
  1003. erase(%[a]) | %[a] | |
  1004. tgt | GEN_REG | remove(ALL)
  1005. allocate(AREG, GEN_REG = {IMMEDIATE,0})
  1006. "xor a"
  1007. "add a,%[1.1]"
  1008. "jp m,2f"
  1009. "jr nz,1f"
  1010. "xor a"
  1011. "add a,%[1.2]"
  1012. "jr z,2f"
  1013. "1:"
  1014. "inc %[b.2]"
  1015. "2:"
  1016. erase(%[b]) | %[b] | |
  1017. /* G R O U P XIII : B R A N C H */
  1018. bra | | remove(ALL)
  1019. "jp $1" | | |
  1020. blt | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
  1021. "ld a,%[2.2]"
  1022. "sub %[1.2]"
  1023. "ld a,%[2.1]"
  1024. "sbc a,%[1.1]"
  1025. "jp m,$1" | | |
  1026. ble | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
  1027. "ld a,%[2.2]"
  1028. "sub %[1.2]"
  1029. "ld a,%[2.1]"
  1030. "sbc a,%[1.1]"
  1031. "jp m,$1"
  1032. "jr nz,1f"
  1033. "ld a,%[2.2]"
  1034. "cp %[1.2]"
  1035. "jr z,$1"
  1036. "1:" | | |
  1037. beq | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
  1038. "ld a,%[2.2]"
  1039. "sub %[1.2]"
  1040. "jr nz,1f"
  1041. "ld a,%[2.1]"
  1042. "sbc a,%[1.1]"
  1043. "jr z,$1"
  1044. "1:" | | |
  1045. bne | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
  1046. "ld a,%[2.2]"
  1047. "sub %[1.2]"
  1048. "jr nz,$1"
  1049. "ld a,%[2.1]"
  1050. "sbc a,%[1.1]"
  1051. "jr nz,$1"
  1052. erase(AA) | | |
  1053. bge | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
  1054. "ld a,%[2.2]"
  1055. "sub %[1.2]"
  1056. "ld a,%[2.1]"
  1057. "sbc a,%[1.1]"
  1058. "jp p,$1" | | |
  1059. bgt | GEN_REG GEN_REG_SCR | remove(ALL) allocate(AREG)
  1060. "ld a,%[2.2]"
  1061. "sub %[1.2]"
  1062. "ld %[2.2],a"
  1063. "ld a,%[2.1]"
  1064. "sbc a,%[1.1]"
  1065. "jp m,1f"
  1066. "jr nz,$1"
  1067. "xor a"
  1068. "cp %[2.2]"
  1069. "jr nz,$1"
  1070. "1:"
  1071. erase(%[2]) | | |
  1072. zlt | GEN_REG | remove(ALL) "bit 7,%[1.1]"
  1073. "jr nz,$1" | | |
  1074. zle | GEN_REG | remove(ALL) allocate(AREG)
  1075. "xor a"
  1076. "add a,%[1.1]"
  1077. "jp m,$1"
  1078. "jr nz,1f"
  1079. "xor a"
  1080. "add a,%[1.2]"
  1081. "jr z,$1"
  1082. "1:" | | |
  1083. zeq | GEN_REG | remove(ALL) allocate(AREG)
  1084. "ld a,%[1.1]"
  1085. "or %[1.2]"
  1086. "jr z,$1" | | |
  1087. zne | GEN_REG | remove(ALL) allocate(AREG)
  1088. "ld a,%[1.1]"
  1089. "or %[1.2]"
  1090. "jr nz,$1" | | |
  1091. zge | GEN_REG | remove(ALL) "bit 7,%[1.1]"
  1092. "jr z,$1" | | |
  1093. zgt | GEN_REG | remove(ALL) allocate(AREG)
  1094. "xor a"
  1095. "add a,%[1.1]"
  1096. "jp m,1f"
  1097. "jr nz,$1"
  1098. "xor a"
  1099. "add a,%[1.2]"
  1100. "jr nz,$1"
  1101. "1:" | | |
  1102. /* G R O U P XIV : P R O C E D U R E C A L L S */
  1103. cai | HL_REG | remove(ALL)
  1104. allocate( GEN_REG )
  1105. "ld %[a],1f"
  1106. "push %[a]"
  1107. "jp (hl)"
  1108. "1:"
  1109. | | |
  1110. cal | | remove(ALL)
  1111. allocate(ALL_REG)
  1112. "call $1"
  1113. | | |
  1114. lfr $1 == 2 | | remove(ALL)
  1115. "push de"
  1116. | | |
  1117. lfr $1 == 4 | STACK | "push de"
  1118. "push bc" | | |
  1119. lfr | | remove(ALL)
  1120. move({IMMEDIATE,$1},DE)
  1121. "call .lfr"
  1122. | | |
  1123. ret $1 == 0 | STACK |
  1124. remove(ALL)
  1125. allocate(HL_REG,LOCALBASE)
  1126. "push iy"
  1127. "pop hl"
  1128. "ld sp,hl"
  1129. "pop iy"
  1130. "ret" | | |
  1131. ret $1 == 2 | STACK | remove(ALL)
  1132. allocate(HL_REG,DE_REG,LOCALBASE)
  1133. "pop de"
  1134. "push iy"
  1135. "pop hl"
  1136. "ld sp,hl"
  1137. "pop iy"
  1138. "ret" | | |
  1139. ret $1 == 4 | STACK |
  1140. remove(ALL)
  1141. allocate(BC_REG, DE_REG, HL_REG, LOCALBASE)
  1142. "pop bc"
  1143. "pop de"
  1144. "push iy"
  1145. "pop hl"
  1146. "ld sp,hl"
  1147. "pop iy"
  1148. "ret" | | |
  1149. ret | | remove(ALL)
  1150. move({IMMEDIATE,$1},DE)
  1151. "call .ret"
  1152. erase(BC) | | |
  1153. /* G R O U P XV : M I S C E L L A N E O U S */
  1154. asp $1 == 0 | | | | |
  1155. asp $1 != 0 | STACK | remove(ALL) allocate(HL_REG)
  1156. move({IMMEDIATE,$1} , HL)
  1157. "add hl,sp"
  1158. "ld sp,hl"
  1159. erase(HL) | | |
  1160. ass $1 == 2 | HL_REG_SCR STACK |
  1161. remove(ALL)
  1162. "add hl,sp"
  1163. "ld sp,hl"
  1164. erase(HL) | | |
  1165. blm $1 == 0 | | | | |
  1166. blm $1 > 0 |DE_REG_SCR HL_REG_SCR |
  1167. allocate(BC_REG = {IMMEDIATE,$1} )
  1168. "ldir"
  1169. erase(HL)
  1170. erase(BC)
  1171. erase(DE) | | |
  1172. bls $1 == 2 | BC_REG_SCR DE_REG_SCR HL_REG_SCR |
  1173. remove(MEM_ALL)
  1174. "ldir"
  1175. erase(HL)
  1176. erase(BC)
  1177. erase(DE) | | |
  1178. csa $1 == 2 | STACK | allocate(ALL_REG)
  1179. "jr .csa" | | |
  1180. csb $1 == 2 | STACK | allocate(ALL_REG)
  1181. "jr .csb" | | |
  1182. dus $1 == 2 | BC_REG_SCR | remove(MEM_ALL) allocate(HL_REG,DE_REG)
  1183. move({IMMEDIATE,0} , HL)
  1184. "add hl,sp"
  1185. "ld d,h"
  1186. "ld e,l" /* destination */
  1187. "sbc hl,bc" /* source */
  1188. "ld sp,hl"
  1189. "ex de,hl"
  1190. "ldir"
  1191. erase(HL)
  1192. erase(BC) | | |
  1193. dup $1 == 2 | ANY | | %[1] %[1] | |
  1194. dup $1 == 4 | ANY ANY | | %[2] %[1] %[2] %[1] | |
  1195. dup $1 == 6 | ANY ANY ANY | | %[3] %[2] %[1] %[3] %[2] %[1] | |
  1196. dup $1 > 6 | STACK | allocate(HL_REG,BC_REG,DE_REG)
  1197. move({IMMEDIATE,0} , HL)
  1198. "add hl,sp"
  1199. "ld d,h"
  1200. "ld e,l" /* destination */
  1201. move ({IMMEDIATE,$1},BC) /* count */
  1202. "sbc hl,bc" /* source */
  1203. "ld sp,hl"
  1204. "ex de,hl"
  1205. "ldir"
  1206. erase(HL)
  1207. erase(BC) | | |
  1208. lor $1 == 0 | | "push iy" | | |
  1209. fil | | allocate(HL_REG)
  1210. move({EXTENDED_ADDR,$1},HL)
  1211. "ld (hol0+4),hl"
  1212. erase(HL) | | |
  1213. lor $1 == 1 | STACK | allocate(HL_REG)
  1214. move({IMMEDIATE,0} , HL)
  1215. "add hl,sp"
  1216. erase(HL) | HL | |
  1217. lor $1 == 2 | STACK | | {EXTENDED,".reghp"} | |
  1218. exg $1 == 2 | ANY ANY | | %[1] %[2] | |
  1219. exg | STACK | remove(MEM_ALL)
  1220. allocate(HL_REG)
  1221. move({IMMEDIATE,$1},HL)
  1222. "push hl"
  1223. "call .exg" | | |
  1224. gto | | remove(ALL)
  1225. allocate(ALL_REG)
  1226. move({EXTENDED_ADDR,$1},HL)
  1227. "call .gto"
  1228. | | |
  1229. lim | | | {EXTENDED,"ignmask"} | |
  1230. lin | | remove(ALL) allocate(HL_REG)
  1231. move({IMMEDIATE,$1},HL)
  1232. "ld (hol0),hl"
  1233. erase(HL) | | |
  1234. lni | | allocate(HL_REG)
  1235. "ld hl,hol0"
  1236. "inc (hl)"
  1237. erase(HL) | | |
  1238. lpb | | | | adp 4 |
  1239. nop | STACK |
  1240. #ifdef DEBUG
  1241. allocate(ALL_REG)
  1242. "call .nop"
  1243. #endif
  1244. | | |
  1245. rck $1 == 2 | STACK | allocate(ALL_REG)
  1246. "call .rck"
  1247. | | |
  1248. rtt | | | | ret 0|
  1249. sig | HL_REG_SCR |
  1250. "ld (trapproc),hl"
  1251. "ld hl,trapproc"
  1252. | HL | |
  1253. sim | HL_REG | remove(MEM_ALL)
  1254. "pop hl"
  1255. "ld (ignmask),hl" | | |
  1256. str $1 == 0 | | "pop iy" | | |
  1257. str $1 == 1 | STACK | allocate(HL_REG)
  1258. "pop hl"
  1259. "ld sp,hl" | | |
  1260. str $1 == 2 | STACK | allocate(ALL_REG)
  1261. "call .strhp"
  1262. | | |
  1263. trp| | remove(ALL)
  1264. allocate(ALL_REG)
  1265. "call .trp.z" | | |
  1266. mon | | remove(MEM_ALL)
  1267. "call .mon" | | |
  1268. /* C O E R C I O N S */
  1269. /* from 4 bytes to 2 */
  1270. /* to a register */
  1271. | ANYTOK | allocate(ANY_REG)
  1272. move(%[1],%[a]) | %[a] | |
  1273. | STACK | allocate(ANY_REG)
  1274. "pop %[a]" | %[a] | |
  1275. | LOCAL_ADDR | allocate(ANY_REG)
  1276. move(LB,%[a])
  1277. "add %[a],%[1]"
  1278. | %[a] | |
  1279. | IMMEDIATE | allocate(ANY_REG)
  1280. move(%[1],%[a])
  1281. | %[a] | |
  1282. /* between registers */
  1283. | GEN_REG | allocate(GEN_REG)
  1284. "ld %[a.1],%[1.1]"
  1285. "ld %[a.2],%[1.2]" | %[a] | |
  1286. | LOCALBASE | allocate(ANY_REG)
  1287. "push iy"
  1288. "pop %[a]" | %[a] | |
  1289. /***********
  1290. ** MOVES **
  1291. ***********/
  1292. MOVES:
  1293. (ANY,ANY,"ld %[2],%[1]")
  1294. (ANY1,ANY1,"ld %[2],%[1]")
  1295. /************
  1296. * STACKS *
  1297. ************/
  1298. STACKS:
  1299. (ANY_REG, , "push %[1]" )
  1300. (MEM_ALL, ANY_REG, move(%[1],%[a])
  1301. "push %[a]" )
  1302. (MEM_ALL, , "push hl"
  1303. move(%[1],HL)
  1304. "ex (sp),hl" )