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