changed tables to UrAsm syntax (we have DEFX exactly for such cases)
[bz80asm.git] / bzasm80.zas
blob1195e6d33c8fe26e1f8d87c29673d421455d4879
1 ;WARNING! THIS MUST BE PAGE-ALIGNED!
2 ACCS:   defs    256             ;STRING ACCUMULATOR
3   IF low(ACCS)
4     $ERROR "ACCS must be page-aligned!"
5   ENDIF
7 LF      equ     0AH
8 CR      equ     0DH
10 PC: defw #C000    ;PROGRAM COUNTER
11 OC: defw #C000    ;ORIGIN of CODE
12 ;LISTON: defb #ff  ;LISTO & OPT FLAG
13 LISTON: defb #10  ;LISTO & OPT FLAG
15 ;Bit 0 - LSB
16 ;Bit 0 controls the listing. If it is set, a listing is displayed.
17 ;Bit 1
18 ;Bit 1 controls the error reporting. If it is set, errors are reported.
19 ;Bit 2
21 COUNT:  defb  0  ;PRINT POSITION
24 ;TCALL   equ 0D6H
25 TAND    equ 80H
26 TOR     equ 84H
27 ;CMD_DEF equ 0xfe
30 csizestart = $
31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
33 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
34 ;; this puts 0 integer number into the corresponding registers
35 ;; called exactly once to clear result of VAR
37 ZERO:
38   ld    a,0
39   exx
40   ld    h,a
41   ld    l,a
42   exx
43   ld    h,a
44   ld    l,a
45   ld    c,a
46   ret
49 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
50 ;; ASSEMBLER:
51 ;; LANGUAGE-INDEPENDENT CONTROL SECTION:
52 ;;  Outputs: A=delimiter, carry set if syntax error.
54 ASSEM:
55   call  SKIP
56   inc   iy
57   cp    ':'
58   jr    z,ASSEM
59   cp    ']'
60   ret   z
61   cp    CR
62   ret   z
63   dec   iy
64   ld    ix,(PC)         ;PROGRAM COUNTER
65   ld    hl,LISTON
66   bit   6,(hl)
67   jr    z,ASSEM0
68   ld    ix,(OC)         ;ORIGIN of CODE
69 ASSEM0:
70   push  ix
71   push  iy
72   call  ASMB
73   pop   bc
74   pop   de
75   ret   c
76   call  SKIP
77   scf
78   ret   nz
79   dec   iy
80 ASSEM3:
81   inc   iy
82   ld    a,(iy)
83   call  isCmdSep
84   jr    nz,ASSEM3
85   ld    a,(LISTON)
86   push  ix
87   pop   hl
88   or    a
89   sbc   hl,de
90   ex    de,hl           ;DE= NO. OF BYTES
91   push  hl
92   ld    hl,(PC)
93   push  hl
94   add   hl,de
95   ld    (PC),hl         ;UPDATE PC
96   bit   6,a
97   jr    z,ASSEM5
98   ld    hl,(OC)
99   add   hl,de
100   ld    (OC),hl         ;UPDATE OC
101 ASSEM5:
102   pop   hl              ;OLD PC
103   pop   ix              ;CODE HERE
104   bit   4,a
105   jr    z,ASSEM
106   ld    a,h
107   call  HEX
108   ld    a,l
109   call  HEXSP
110   xor   a
111   cp    e
112   jr    z,ASSEM2
113 ASSEM1:
114   ld    a,(COUNT)
115   cp    17
116   ld    a,5
117   call  nc,TABIT        ;NEXT LINE
118   ld    a,(ix)
119   call  HEXSP
120   inc   ix
121   dec   e
122   jr    nz,ASSEM1
123 ASSEM2:
124   ld    a,18
125   call  TABIT
126   push  iy
127   pop   hl
128   sbc   hl,bc
129 ASSEM4:
130   ld    a,(bc)
131   call  EMIT
132   inc   bc
133   dec   l
134   jr    nz,ASSEM4
135   call  CRLF
136   jp    ASSEM
139 HEXSP:
140   call  HEX
141   ld    a,' '
142   jr    OUTCH1
143 HEX:
144   push  af
145   rrca
146   rrca
147   rrca
148   rrca
149   call  HEXOUT
150   pop   af
151 HEXOUT:
152   and   0FH
153   add   a,90H
154   daa
155   adc   a,40H
156   daa
157 OUTCH1:
158   jp    EMIT
161 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
163 ;; PROCESSOR-SPECIFIC TRANSLATION SECTION:
165 ;; REGISTER USAGE: B - TYPE OF MOST RECENT OPERAND
166 ;;                 C - OPCODE BEING BUILT
167 ;;                 D - (IX) OR (IY) FLAG
168 ;;                 E - OFFSET FROM IX OR IY
169 ;;                HL - NUMERIC OPERAND VALUE
170 ;;                IX - CODE DESTINATION
171 ;;                IY - SOURCE TEXT POINTER
172 ;;    Inputs: A = initial character
173 ;;   Outputs: Carry set if syntax error.
175 ASMB:
176   cp    '.'
177   jr    nz,ASMB1
178   inc   iy
179   push  ix
180   call  VAR
181   push  af
182   call  ZERO
183   exx
184   ld    hl,(PC)
185   exx
186   pop   af
187   call  STORE
188   pop   ix
189 ASMB1:
190   call  SKIP
191   ret   z
192   ; this code seems to be for tokenized input
193   ; we don't have tokenizer
194   ;cp    TCALL
195   ;ld    c,0C4H
196   ;inc   iy
197   ;jp    z,GRPC
198   ;dec   iy
199   ld    hl,OPCODS
200   call  FIND
201   ret   c
202   ld    c,b     ;ROOT OPCODE
203   ld    d,0     ;CLEAR IX/IY FLAG
206 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
208 ;; GROUP 0 - TRIVIAL CASES REQUIRING NO COMPUTATION
209 ;; GROUP 1 - AS GROUP 0 BUT WITH "ED" PREFIX
211   sub   39
212   jr    nc,GROUP2
213   cp    15-39
214   call  nc,EDX
215   jr    BYTE0
218 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
220 ;; GROUP 2 - BIT, RES, SET
221 ;; GROUP 3 - RLC, RRC, RL, RR, SLA, SRA, SRL
223 GROUP2:
224   sub   10
225   jr    nc,GROUP4
226   cp    3-10
227   call  c,CBIT
228   ret   c
229   call  REGLO
230   ret   c
231   call  CBX
232   jr    BYTE0
235 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
237 ;; GROUP 4 - PUSH, POP, EX (SP)
239 GROUP4:
240   sub   3
241   jr    nc,GROUP5
243   call  PAIR
244   ret   c
245   jr    BYTE0
248 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
250 ;; GROUP 5 - SUB, AND, XOR, OR, CP
251 ;; GROUP 6 - ADD, ADC, SBC
253 GROUP5:
254   sub   8+2
255   jr    nc,GROUP7
256   cp    5-8
257   ld    b,7
258   call  nc,OPND
259   ld    a,b
260   cp    7
261   jr    nz,G6HL
263   call  REGLO
264   ld    a,c
265   jr    nc,BIND1
266   xor   46H
267   call  BIND
268 DBX:
269   call  NUMBER
270   jr    VAL8
272 G6HL:
273   and   3FH
274   cp    12
275   scf
276   ret   nz
277   ld    a,c
278   cp    80H
279   ld    c,9
280   jr    z,G4
281   xor   1CH
282   rrca
283   ld    c,a
284   call  EDX
285   jr    G4
288 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
290 ;; GROUP 7 - INC, DEC
292 GROUP7:
293   sub   2
294   jr    nc,GROUP8
295   call  REGHI
296   ld    a,c
297 BIND1:
298   jp    nc,BIND
299   xor   64H
300   rlca
301   rlca
302   rlca
303   ld    c,a
304   call  PAIR1
305   ret   c
306 BYTE0:
307   ld    a,c
308   jr    BYTE2
311 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
313 ;; GROUP 8 - IN
314 ;; GROUP 9 - OUT
316 GROUP8:
317   sub   2
318   jr    nc,GROUPA
319   cp    1-2
320   call  z,CORN
321   ex    af,af'
322   call  REGHI
323   ret   c
324   ex    af,af'
325   call  c,CORN
326   inc   h
327   jr    z,BYTE0
328   ld    a,b
329   cp    7
330   scf
331   ret   nz
332   ld    a,c
333   xor   3
334   rlca
335   rlca
336   rlca
337   call  BYTE
338   jr    VAL8
341 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
343 ;; GROUP 10 - JR, DJNZ
345 GROUPA:
346   sub   2
347   jr    nc,GROUPB
348   cp    1-2
349   call  nz,COND
350   ld    a,c
351   jr    nc,GRPA
352   ld    a,18H
353 GRPA:
354   call  BYTE
355   call  NUMBER
356   ld    de,(PC)
357   inc   de
358   scf
359   sbc   hl,de
360   ld    a,l
361   rla
362   sbc   a,a
363   cp    h
364 TOOFAR:
365   jp    nz,error_out_of_range
366 VAL8:
367   ld    a,l
368   jr    BYTE2
371 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373 ;; GROUP 11 - JP
375 GROUPB:
376   ld    b,a
377   jr    nz,GROUPC
378   call  COND
379   ld    a,c
380   jr    nc,GRPB
381   ld    a,b
382   and   3FH
383   cp    6
384   ld    a,0E9H
385   jr    z,BYTE2
386   ld    a,0C3H
387 GRPB:
388   call  BYTE
389   jr    ADDR
392 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
394 ;; GROUP 12 - CALL
396 GROUPC:
397   djnz  GROUPD
398 GRPC:
399   call  GRPE
400 ADDR:
401   call  NUMBER
402 VAL16:
403   call  VAL8
404   ld    a,h
405   jr    BYTE2
408 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
410 ;; GROUP 13 - RST
412 GROUPD:
413   djnz  GROUPE
414   call  NUMBER
415   and   c
416   or    h
417   jr    nz,TOOFAR
418   ld    a,l
419   or    c
420 BYTE2:
421   jr    BYTE1
424 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
426 ;; GROUP 14 - RET
428 GROUPE:
429   djnz  GROUPF
430 GRPE:
431   call  COND
432   ld    a,c
433   jr    nc,BYTE1
434   or    9
435   jr    BYTE1
438 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
440 ;; GROUP 15 - LD
442 GROUPF:
443   djnz  MISC
444   call  LDOP
445   jr    nc,LDA
446   call  REGHI
447   ex    af,af'
448   call  SKIP
449   cp    '('
450   jr    z,LDIN
451   ex    af,af'
452   jp    nc,G6
453   ld    c,1
454   call  PAIR1
455   ret   c
456   ld    a,14
457   cp    b
458   ld    b,a
459   call  z,PAIR
460   ld    a,b
461   and   3FH
462   cp    12
463   ld    a,c
464   jr    nz,GRPB
465   ld    a,0F9H
466   jr    BYTE1
468 LDIN:
469   ex    af,af'
470   push  bc
471   call  nc,REGLO
472   ld    a,c
473   pop   bc
474   jr    nc,BIND
475   ld    c,0AH
476   call  PAIR1
477   call  LD16
478   jr    nc,GRPB
479   call  NUMBER
480   ld    c,2
481   call  PAIR
482   call  LD16
483   ret   c
484   call  BYTE
485   jr    VAL16
488 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
490 ;; OPT - SET OPTION
492 OPT:
493   dec   b
494   jp    z,DBX
495   djnz  ADDR
496   call  NUMBER
497   ld    hl,LISTON
498   ld    c,a
499   rld
500   ld    a,c
501   rrd
502   ret
504 ;;LDA is here so "djnz ADDR" above may work
505 LDA:
506   cp    4
507   call  c,EDX
508   ld    a,b
509 BYTE1:
510   jr    BYTE
513 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
515 ;; MISC - DEFB, DEFW, DEFM
517 MISC:
518   djnz  OPT
519   push  ix
520   call  EXPRS
521   pop   ix
522   ld    hl,ACCS
523 DEFM1:
524   xor   a
525   cp    e
526   ret   z
527   ld    a,(hl)
528   inc   hl
529   call  BYTE
530   dec   e
531   jr    DEFM1
534 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
536 ;;SUBROUTINES:
538 LD16:
539   ld    a,b
540   jr    c,LD8
541   ld    a,b
542   and   3FH
543   cp    12
544   ld    a,c
545   ret   z
546   call  EDX
547   ld    a,c
548   or    43H
549   ret
551 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
553 LD8:
554   cp    7
555   scf
556   ret   nz
557   ld    a,c
558   or    30H
559   ret
561 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
563 CORN:
564   push  bc
565   call  OPND
566   bit   5,b
567   pop   bc
568   jr    z,NUMBER
569   ld    h,-1
570 EDX:
571   ld    a,0EDH
572   jr    BYTE
574 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
576 CBX:
577   ld    a,0CBH
578 BIND:
579   cp    76H
580   scf
581   ret   z               ;REJECT LD (HL),(HL)
582   call  BYTE
583   inc   d
584   ret   p
585   ld    a,e
586   jr    BYTE
588 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
590 OPND:
591   push  hl
592   ld    hl,OPRNDS
593   call  FIND
594   pop   hl
595   ret   c
596   bit   7,b
597   ret   z
598   bit   3,b
599   push  hl
600   call  z,OFFSET
601   ld    e,l
602   pop   hl
603   ld    a,0DDH
604   bit   6,b
605   jr    z,OP1
606   ld    a,0FDH
607 OP1:
608   or    a
609   inc   d
610   ld    d,a
611   ret   m
612 BYTE:
613   ld    (ix),a
614   inc   ix
615   or    a
616   ret
618 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
620 OFFSET:
621   ld    a,(iy)
622   cp    ')'
623   ld    hl,0
624   ret   z
625 NUMBER:
626   call  SKIP
627   push  bc
628   push  de
629   push  ix
630   call  EXPRI
631   pop   ix
632   exx
633   pop   de
634   pop   bc
635   ld    a,l
636   or    a
637   ret
639 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
641 REG:
642   call  OPND
643   ret   c
644   ld    a,b
645   and   3FH
646   cp    8
647   ccf
648   ret
650 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
652 REGLO:
653   call  REG
654   ret   c
655   jr    ORC
657 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
659 REGHI:
660   call  REG
661   ret   c
662   jr    SHL3
664 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
666 COND:
667   call  OPND
668   ret   c
669   ld    a,b
670   and   1FH
671   sub   16
672   jr    nc,SHL3
673   cp    -15
674   scf
675   ret   nz
676   ld    a,3
677   jr    SHL3
679 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
681 PAIR:
682   call  OPND
683   ret   c
684 PAIR1:
685   ld    a,b
686   and   0FH
687   sub   8
688   ret   c
689   jr    SHL3
691 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
693 CBIT:
694   call  NUMBER
695   cp    8
696   ccf
697   ret   c
698 SHL3:
699   rlca
700   rlca
701   rlca
702 ORC:
703   or    c
704   ld    c,a
705   ret
707 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
709 LDOP:
710   ld    hl,LDOPS
711 ; main table search entry point
712 FIND:
713   call  SKIP
714 EXIT:
715   ld    b,0
716   scf
717   ret   z
718   ; this code seems to be for tokenized input
719   ; we don't have tokenizer
720   ;cp    CMD_DEF
721   ;jr    z,FIND0
722   ;cp    TOR+1
723   cp    128
724   ccf
725   ret   c
726 FIND0:
727   ld    a,(hl)
728   or    a
729   jr    z,EXIT
730   xor   (iy)
731   and   01011111B
732   jr    z,FIND2
733 FIND1:
734   bit   7,(hl)
735   inc   hl
736   jr    z,FIND1
737   inc   hl
738   inc   b
739   jr    FIND0
740   ;
741 FIND2:
742   push  iy
743 FIND3:
744   bit   7,(hl)
745   inc   iy
746   inc   hl
747   jr    nz,FIND5
748   cp    (hl)
749   call  z,SKIP0
750   ld    a,(hl)
751   xor   (iy)
752   and   01011111B
753   jr    z,FIND3
754 FIND4:
755   pop   iy
756   jr    FIND1
757   ;
758 FIND5:
759   call  DELIM
760   call  nz,SIGN
761   jr    nz,FIND4
762 FIND6:
763   ld    a,b
764   ld    b,(hl)
765   pop   hl
766   ret
768 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
769 ;; used by FIND
770 SIGN:
771   cp    '+'
772   ret   z
773   cp    '-'
774   ret
776 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
777 ;; this entry point is used by FIND
778 SKIP0:
779   inc   hl
780 ; this entry point is used to skip blanks
781 ; note that comma and right paren are considered blanks too
782 ; as a consequence, operands may be delimited by spaces, or
783 ; right parens, lol
784 SKIP:
785   call  DELIM
786   ret   nz
787   call  TERM
788   ret   z
789   inc   iy
790   jr    SKIP
792 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
793 ;; used by FIND and SKIP
794 DELIM:
795   ld    a,(iy)          ;ASSEMBLER DELIMITER
796   cp    ' '
797   ret   z
798   cp    ','
799   ret   z
800   cp    ')'
801   ret   z
803 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
804 ;; entry point for SKIP
805 TERM:
806   cp    ';'             ;ASSEMBLER TERMINATOR
807   ret   z
808   ;cp    '\'
809   ;ret   z
811 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
812 ;; also used by assembler to check for command separator
813 ;; the assembler itself does nothing with separators
814 isCmdSep:
815   cp    ':'             ;ASSEMBLER SEPARATOR
816   ret   nc
817   cp    CR
818   ret
820 csizeend = $
821 $printf "assembler size: %d", csizeend-csizestart
823 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
824 ;; various tables -- mnemonics, operands...
826 csizestart = $
828 ;; mnemonics
829 OPCODS:
830   defx  "NOP"
831   defb  0
832   defx  "RLCA"
833   defb  7
834   defm  'EX'
835   defb  0
836   defm  'AF'
837   defb  0
838   defx  "AF'"
839   defb  8
840   defx  "RRCA"
841   defb  #0F
842   defx  "RLA"
843   defb  #17
844   defx  "RRA"
845   defb  #1F
846   defx  "DAA"
847   defb  #27
848   defx  "CPL"
849   defb  #2F
850   defx  "SCF"
851   defb  #37
852   defx  "CCF"
853   defb  #3F
854   defx  "HALT"
855   defb  #76
856   defx  "EXX"
857   defb  #D9
858   defm  'EX'
859   defb  0
860   defm  'DE'
861   defb  0
862   defx  "HL"
863   defb  #EB
864   defx  "DI"
865   defb  #F3
866   defx  "EI"
867   defb  #FB
868   ;
869   defx  "NEG"
870   defb  #44
871   defm  'IM'
872   defb  0
873   defx  "0"
874   defb  #46
875   defx  "RETN"
876   defb  #45
877   defx  "RETI"
878   defb  #4D
879   defm  'IM'
880   defb  0
881   defx  "1"
882   defb  #56
883   defm  'IM'
884   defb  0
885   defx  "2"
886   defb  #5E
887   defx  "RRD"
888   defb  #67
889   defx  "RLD"
890   defb  #6F
891   defx  "LDI"
892   defb  #A0
893   defx  "CPI"
894   defb  #A1
895   defx  "INI"
896   defb  #A2
897   defx  "OUTI"
898   defb  #A3
899   defx  "LDD"
900   defb  #A8
901   defx  "CPD"
902   defb  #A9
903   defx  "IND"
904   defb  #AA
905   defx  "OUTD"
906   defb  #AB
907   defx  "LDIR"
908   defb  #B0
909   defx  "CPIR"
910   defb  #B1
911   defx  "INIR"
912   defb  #B2
913   defx  "OTIR"
914   defb  #B3
915   defx  "LDDR"
916   defb  #B8
917   defx  "CPDR"
918   defb  #B9
919   defx  "INDR"
920   defb  #BA
921   defx  "OTDR"
922   defb  #BB
923   ;
924   defx  "BIT"
925   defb  #40
926   defx  "RES"
927   defb  #80
928   defx  "SET"
929   defb  #C0
930   ;
931   defx  "RLC"
932   defb  0
933   defx  "RRC"
934   defb  8
935   defx  "RL"
936   defb  #10
937   defx  "RR"
938   defb  #18
939   defx  "SLA"
940   defb  #20
941   defx  "SRA"
942   defb  #28
943   defx  "SRL"
944   defb  #38
945   ;
946   defx  "POP"
947   defb  #C1
948   defx  "PUSH"
949   defb  #C5
950   defm  'EX'
951   defb  0
952   defx  "(SP"
953   defb  #E3
954   ;
955   defx  "SUB"
956   defb  #90
957   defx  "AND"
958   defb  #A0
959   defx  "XOR"
960   defb  #A8
961   defx  "OR"
962   defb  #B0
963   defx  "CP"
964   defb  #B8
965   ;k8: for some reason i cannot remove those two
966   defb  TAND
967   defb  #A0
968   defb  TOR
969   defb  #B0
970   ;
971   defx  "ADD"
972   defb  #80
973   defx  "ADC"
974   defb  #88
975   defx  "SBC"
976   defb  #98
977   ;
978   defx  "INC"
979   defb  4
980   defx  "DEC"
981   defb  5
982   ;
983   defx  "IN"
984   defb  #40
985   defx  "OUT"
986   defb  #41
987   ;
988   defx  "JR"
989   defb  #20
990   defx  "DJNZ"
991   defb  #10
992   ;
993   defx  "JP"
994   defb  #C2
995   ;
996   defx  "CALL"
997   defb  #C4
998   ;
999   defx  "RST"
1000   defb  #C7
1001   ;
1002   defx  "RET"
1003   defb  #C0
1004   ;
1005   defx  "LD"
1006   defb  #40
1008   ;
1009   ;defb  DEF and #7F
1010   defx  "DEFM"
1011   defb  0
1012   ;
1013   ;defb  DEF and #7F
1014   defx  "DEFB"
1015   defb  0
1016   ;
1017   defx  "OPT"
1018   defb  0
1019   ;
1020   ;defb  DEF and #7F
1021   defx  "DEFW"
1022   defb  0
1024   ;
1025   defb  0
1027 ;; operands
1028 OPRNDS:
1029   defx  "B"
1030   defb  0
1031   defx  "C"
1032   defb  1
1033   defx  "D"
1034   defb  2
1035   defx  "E"
1036   defb  3
1037   defx  "H"
1038   defb  4
1039   defx  "L"
1040   defb  5
1041   defx  "(HL"
1042   defb  6
1043   defx  "A"
1044   defb  7
1045   defx  "(IX"
1046   defb  #86
1047   defx  "(IY"
1048   defb  #C6
1049   ;
1050   defx  "BC"
1051   defb  8
1052   defx  "DE"
1053   defb  10
1054   defx  "HL"
1055   defb  12
1056   defx  "IX"
1057   defb  #8C
1058   defx  "IY"
1059   defb  #CC
1060   defx  "AF"
1061   defb  14
1062   defx  "SP"
1063   defb  14
1064   ;
1065   defx  "NZ"
1066   defb  16
1067   defx  "Z"
1068   defb  17
1069   defx  "NC"
1070   defb  18
1071   defx  "PO"
1072   defb  20
1073   defx  "PE"
1074   defb  21
1075   defx  "P"
1076   defb  22
1077   defx  "M"
1078   defb  23
1079   ;
1080   defx  "(C"
1081   defb  #20
1082   ;
1083   defb  0
1086 LDOPS:
1087   defm  'I'
1088   defb  0
1089   defx  "A"
1090   defb  #47
1091   defm  'R'
1092   defb  0
1093   defx  "A"
1094   defb  #4F
1095   defm  'A'
1096   defb  0
1097   defx  "I"
1098   defb  #57
1099   defm  'A'
1100   defb  0
1101   defx  "R"
1102   defb  #5F
1103   defm  '(BC'
1104   defb  0
1105   defx  "A"
1106   defb  2
1107   defm  '(DE'
1108   defb  0
1109   defx  "A"
1110   defb  #12
1111   defm  'A'
1112   defb  0
1113   defx  "(BC"
1114   defb  #0A
1115   defm  'A'
1116   defb  0
1117   defx  "(DE"
1118   defb  #1A
1119   ;
1120   defb  0
1122 csizeend = $
1123 $printf "assembler tables size: %d", csizeend-csizestart