some cleanups
[bz80asm.git] / bzasm80.zas
blob63493b4b27ebe8be101fa135dbedfd039a21c74b
1   $refopt alllabels
3   org   #8000
4   ent   main
5 ;WARNING! THIS MUST BE PAGE-ALIGNED!
6 ACCS:   defs    256             ;STRING ACCUMULATOR
7   IF low(ACCS)
8     $ERROR "ACCS must be page-aligned!"
9   ENDIF
11 LF      equ     0AH
12 CR      equ     0DH
14 PC: defw #C000    ;PROGRAM COUNTER
15 OC: defw #C000    ;ORIGIN of CODE
16 ;LISTON: defb #ff  ;LISTO & OPT FLAG
17 LISTON: defb #10  ;LISTO & OPT FLAG
19 ;Bit 0 - LSB
20 ;Bit 0 controls the listing. If it is set, a listing is displayed.
21 ;Bit 1
22 ;Bit 1 controls the error reporting. If it is set, errors are reported.
23 ;Bit 2
25 COUNT:  defb  0  ;PRINT POSITION
28 ;TCALL   equ 0D6H
29 TAND    equ 80H
30 TOR     equ 84H
31 ;CMD_DEF equ 0xfe
34 main:
35   call  emitInit
37   di
38   ;ld    ix,dest
39   ld    iy,strbuf
40 .goon:
41   $IF 0
42   push  iy
43 .dumploop:
44   ld    a,(iy)
45   or    a
46   jr    z,.dumpdone
47   cp    13
48   jr    z,.dumpdone
49   call  EMIT
50   inc   iy
51   jr    .dumploop
52 .dumpdone:
53   pop   iy
54   ld    a,13
55   call  EMIT
56   $ENDIF
58   call  ASSEM
60   ld    a,(iy)
61   or    a
62   jr    nz,.goon
64   ld    a,6
65   out   (#fe),a
66   jr    $
68 strbuf:
69   ;defm  "jr   label",13
70   defm  "ld   a,42",13
71   defm  "ld   hl,16384",13
72   defm  "ld   a,(ix-2)",13
73   defm  "call 1234",13
74   defm  "or   c",13
75   defm  "and  (hl)",13
76   defb  0
78 dest: defs 64,0
80   include "parser.zas"
81   include "output.zas"
83 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85 ; this puts 0 integer number into the corresponding registers
86 ZERO:
87   ld    a,0
88   exx
89   ld    h,a
90   ld    l,a
91   exx
92   ld    h,a
93   ld    l,a
94   ld    c,a
95   ret
98 ; this stores 4-byte integer at IX
99 ; used inly once, to store label value
100 ; number is H'L'HL (HL is high bytes_
101 STORE:
102   ret
105 ;GETVAR - GET LOCATION OF VARIABLE, RETURN IN HL & IX
106 ;   Inputs: IY addresses first character.
107 ;  Outputs: Carry set and NZ if illegal character.
108 ;           Z-flag set if variable found, then:
109 ;            A = variable type (0,4,5,128 or 129)
110 ;            HL = IX = variable pointer.
111 ;            IY updated
112 ;           If Z-flag & carry reset, then:
113 ;            HL, IY set for subsequent PUTVAR call.
114 ; Destroys: everything
116 GETVAR:
117   ld    a,13
118   call  EMIT
119   ld    hl,msg_getvar
120   call  printstr
121   ld    a,(iy)
122   call  isAlpha
123   jr    nc,error_identifier_expected
124   ld    b,0
125   push  iy
126 .idloop:
127   ld    a,(iy)
128   call  isIdChar
129   jr    c,.idend
130   inc   b
131   inc   iy
132   jr    .idloop
133 .idend:
134   ; print id
135   pop   iy
136 .iddumploop:
137   ld    a,(iy)
138   call  EMIT
139   inc   iy
140   djnz  .iddumploop
141   ld    a,'>'
142   call  EMIT
143   ld    a,13
144   call  EMIT
146   ld    hl,#9000
147   ld    ix,#9000
148   ; flags doesn't matter
149   ret
151 msg_getvar: defx "GETVAR:<"
154 VAR:
155   ;call  GETVAR
156   ;ret   z
157   ;jp    nc,PUTVAR
158   ;jp    eror_syntax
159   jp    GETVAR
167 ;ASSEMBLER:
168 ;LANGUAGE-INDEPENDENT CONTROL SECTION:
169 ; Outputs: A=delimiter, carry set if syntax error.
171 ASSEM:  call    SKIP
172         inc     iy
173         cp      ':'
174         jr      z,ASSEM
175         cp      ']'
176         ret     z
177         cp      CR
178         ret     z
179         dec     iy
180         ld      ix,(PC)         ;PROGRAM COUNTER
181         ld      hl,LISTON
182         bit     6,(hl)
183         jr      z,ASSEM0
184         ld      ix,(OC)         ;ORIGIN of CODE
185 ASSEM0: push    ix
186         push    iy
187         call    ASMB
188         pop     bc
189         pop     de
190         ret     c
191         call    SKIP
192         scf
193         ret     nz
194         dec     iy
195 ASSEM3: inc     iy
196         ld      a,(iy)
197         call    isCmdSep
198         jr      nz,ASSEM3
199         ld      a,(LISTON)
200         push    ix
201         pop     hl
202         or      a
203         sbc     hl,de
204         ex      de,hl           ;DE= NO. OF BYTES
205         push    hl
206         ld      hl,(PC)
207         push    hl
208         add     hl,de
209         ld      (PC),hl         ;UPDATE PC
210         bit     6,a
211         jr      z,ASSEM5
212         ld      hl,(OC)
213         add     hl,de
214         ld      (OC),hl         ;UPDATE OC
215 ASSEM5: pop     hl              ;OLD PC
216         pop     ix              ;CODE HERE
217         bit     4,a
218         jr      z,ASSEM
219         ld      a,h
220         call    HEX
221         ld      a,l
222         call    HEXSP
223         xor     a
224         cp      e
225         jr      z,ASSEM2
226 ASSEM1: ld      a,(COUNT)
227         cp      17
228         ld      a,5
229         call    nc,TABIT        ;NEXT LINE
230         ld      a,(ix)
231         call    HEXSP
232         inc     ix
233         dec     e
234         jr      nz,ASSEM1
235 ASSEM2: ld      a,18
236         call    TABIT
237         push    iy
238         pop     hl
239         sbc     hl,bc
240 ASSEM4: ld      a,(bc)
241         call    EMIT
242         inc     bc
243         dec     l
244         jr      nz,ASSEM4
245         call    CRLF
246         jp      ASSEM
248 HEXSP:  call    HEX
249         ld      a,' '
250         jr      OUTCH1
251 HEX:    push    af
252         rrca
253         rrca
254         rrca
255         rrca
256         call    HEXOUT
257         pop     af
258 HEXOUT: and     0FH
259         add     a,90H
260         daa
261         adc     a,40H
262         daa
263 OUTCH1: jp      EMIT
265 ;PROCESSOR-SPECIFIC TRANSLATION SECTION:
267 ;REGISTER USAGE: B - TYPE OF MOST RECENT OPERAND
268 ;                C - OPCODE BEING BUILT
269 ;                D - (IX) OR (IY) FLAG
270 ;                E - OFFSET FROM IX OR IY
271 ;               HL - NUMERIC OPERAND VALUE
272 ;               IX - CODE DESTINATION
273 ;               IY - SOURCE TEXT POINTER
274 ;   Inputs: A = initial character
275 ;  Outputs: Carry set if syntax error.
277 ASMB:   cp      '.'
278         jr      nz,ASMB1
279         inc     iy
280         push    ix
281         call    VAR
282         push    af
283         call    ZERO
284         exx
285         ld      hl,(PC)
286         exx
287         pop     af
288         call    STORE
289         pop     ix
290 ASMB1:  call    SKIP
291         ret     z
292         ; this code seems to be for tokenized input
293         ; we don't have tokenizer
294         ;cp      TCALL
295         ;ld      c,0C4H
296         ;inc     iy
297         ;jp      z,GRPC
298         ;dec     iy
299         ld      hl,OPCODS
300         call    FIND
301         ret     c
302         ld      c,b     ;ROOT OPCODE
303         ld      d,0     ;CLEAR IX/IY FLAG
305 ;GROUP 0 - TRIVIAL CASES REQUIRING NO COMPUTATION
306 ;GROUP 1 - AS GROUP 0 BUT WITH "ED" PREFIX
308         sub     39
309         jr      nc,GROUP2
310         cp      15-39
311         call    nc,ED
312         jr      BYTE0
314 ;GROUP 2 - BIT, RES, SET
315 ;GROUP 3 - RLC, RRC, RL, RR, SLA, SRA, SRL
317 GROUP2: sub     10
318         jr      nc,GROUP4
319         cp      3-10
320         call    c,CBIT
321         ret     c
322         call    REGLO
323         ret     c
324         call    CB
325         jr      BYTE0
327 ;GROUP 4 - PUSH, POP, EX (SP)
329 GROUP4: sub     3
330         jr      nc,GROUP5
331 G4:     call    PAIR
332         ret     c
333         jr      BYTE0
335 ;GROUP 5 - SUB, AND, XOR, OR, CP
336 ;GROUP 6 - ADD, ADC, SBC
338 GROUP5: sub     8+2
339         jr      nc,GROUP7
340         cp      5-8
341         ld      b,7
342         call    nc,OPND
343         ld      a,b
344         cp      7
345         jr      nz,G6HL
346 G6:     call    REGLO
347         ld      a,c
348         jr      nc,BIND1
349         xor     46H
350         call    BIND
351 db:     call    NUMBER
352         jr      VAL8
354 G6HL:   and     3FH
355         cp      12
356         scf
357         ret     nz
358         ld      a,c
359         cp      80H
360         ld      c,9
361         jr      z,G4
362         xor     1CH
363         rrca
364         ld      c,a
365         call    ED
366         jr      G4
368 ;GROUP 7 - INC, DEC
370 GROUP7: sub     2
371         jr      nc,GROUP8
372         call    REGHI
373         ld      a,c
374 BIND1:  jp      nc,BIND
375         xor     64H
376         rlca
377         rlca
378         rlca
379         ld      c,a
380         call    PAIR1
381         ret     c
382 BYTE0:  ld      a,c
383         jr      BYTE2
385 ;GROUP 8 - IN
386 ;GROUP 9 - OUT
388 GROUP8: sub     2
389         jr      nc,GROUPA
390         cp      1-2
391         call    z,CORN
392         ex      af,af'
393         call    REGHI
394         ret     c
395         ex      af,af'
396         call    c,CORN
397         inc     h
398         jr      z,BYTE0
399         ld      a,b
400         cp      7
401         scf
402         ret     nz
403         ld      a,c
404         xor     3
405         rlca
406         rlca
407         rlca
408         call    BYTE
409         jr      VAL8
411 ;GROUP 10 - JR, DJNZ
413 GROUPA: sub     2
414         jr      nc,GROUPB
415         cp      1-2
416         call    nz,COND
417         ld      a,c
418         jr      nc,GRPA
419         ld      a,18H
420 GRPA:   call    BYTE
421         call    NUMBER
422         ld      de,(PC)
423         inc     de
424         scf
425         sbc     hl,de
426         ld      a,l
427         rla
428         sbc     a,a
429         cp      h
430 TOOFAR: jp      nz,error_out_of_range
431 VAL8:   ld      a,l
432         jr      BYTE2
434 ;GROUP 11 - JP
436 GROUPB: ld      b,a
437         jr      nz,GROUPC
438         call    COND
439         ld      a,c
440         jr      nc,GRPB
441         ld      a,b
442         and     3FH
443         cp      6
444         ld      a,0E9H
445         jr      z,BYTE2
446         ld      a,0C3H
447 GRPB:   call    BYTE
448         jr      ADDR
450 ;GROUP 12 - CALL
452 GROUPC: djnz    GROUPD
453 GRPC:   call    GRPE
454 ADDR:   call    NUMBER
455 VAL16:  call    VAL8
456         ld      a,h
457         jr      BYTE2
459 ;GROUP 13 - RST
461 GROUPD: djnz    GROUPE
462         call    NUMBER
463         and     c
464         or      h
465         jr      nz,TOOFAR
466         ld      a,l
467         or      c
468 BYTE2:  jr      BYTE1
470 ;GROUP 14 - RET
472 GROUPE: djnz    GROUPF
473 GRPE:   call    COND
474         ld      a,c
475         jr      nc,BYTE1
476         or      9
477         jr      BYTE1
479 ;GROUP 15 - LD
481 GROUPF: djnz    MISC
482         call    LDOP
483         jr      nc,LDA
484         call    REGHI
485         ex      af,af'
486         call    SKIP
487         cp      '('
488         jr      z,LDIN
489         ex      af,af'
490         jp      nc,G6
491         ld      c,1
492         call    PAIR1
493         ret     c
494         ld      a,14
495         cp      b
496         ld      b,a
497         call    z,PAIR
498         ld      a,b
499         and     3FH
500         cp      12
501         ld      a,c
502         jr      nz,GRPB
503         ld      a,0F9H
504         jr      BYTE1
506 LDIN:   ex      af,af'
507         push    bc
508         call    nc,REGLO
509         ld      a,c
510         pop     bc
511         jr      nc,BIND
512         ld      c,0AH
513         call    PAIR1
514         call    LD16
515         jr      nc,GRPB
516         call    NUMBER
517         ld      c,2
518         call    PAIR
519         call    LD16
520         ret     c
521         call    BYTE
522         jr      VAL16
524 ;OPT - SET OPTION
526 OPT:    dec     b
527         jp      z,db
528         djnz    ADDR
529         call    NUMBER
530         ld      hl,LISTON
531         ld      c,a
532         rld
533         ld      a,c
534         rrd
535         ret
537 LDA:    cp      4
538         call    c,ED
539         ld      a,b
540 BYTE1:  jr      BYTE
542 ;MISC - DEFB, DEFW, DEFM
544 MISC:   djnz    OPT
545         push    ix
546         call    EXPRS
547         pop     ix
548         ld      hl,ACCS
549 DEFM1:  xor     a
550         cp      e
551         ret     z
552         ld      a,(hl)
553         inc     hl
554         call    BYTE
555         dec     e
556         jr      DEFM1
558 ;SUBROUTINES:
560 LD16:   ld      a,b
561         jr      c,LD8
562         ld      a,b
563         and     3FH
564         cp      12
565         ld      a,c
566         ret     z
567         call    ED
568         ld      a,c
569         or      43H
570         ret
572 LD8:    cp      7
573         scf
574         ret     nz
575         ld      a,c
576         or      30H
577         ret
579 CORN:   push    bc
580         call    OPND
581         bit     5,b
582         pop     bc
583         jr      z,NUMBER
584         ld      h,-1
585 ED:     ld      a,0EDH
586         jr      BYTE
588 CB:     ld      a,0CBH
589 BIND:   cp      76H
590         scf
591         ret     z               ;REJECT LD (HL),(HL)
592         call    BYTE
593         inc     d
594         ret     p
595         ld      a,e
596         jr      BYTE
598 OPND:   push    hl
599         ld      hl,OPRNDS
600         call    FIND
601         pop     hl
602         ret     c
603         bit     7,b
604         ret     z
605         bit     3,b
606         push    hl
607         call    z,OFFSET
608         ld      e,l
609         pop     hl
610         ld      a,0DDH
611         bit     6,b
612         jr      z,OP1
613         ld      a,0FDH
614 OP1:    or      a
615         inc     d
616         ld      d,a
617         ret     m
618 BYTE:   ld      (ix),a
619         inc     ix
620         or      a
621         ret
623 OFFSET: ld      a,(iy)
624         cp      ')'
625         ld      hl,0
626         ret     z
627 NUMBER: call    SKIP
628         push    bc
629         push    de
630         push    ix
631         call    EXPRI
632         pop     ix
633         exx
634         pop     de
635         pop     bc
636         ld      a,l
637         or      a
638         ret
640 REG:    call    OPND
641         ret     c
642         ld      a,b
643         and     3FH
644         cp      8
645         ccf
646         ret
648 REGLO:  call    REG
649         ret     c
650         jr      ORC
652 REGHI:  call    REG
653         ret     c
654         jr      SHL3
656 COND:   call    OPND
657         ret     c
658         ld      a,b
659         and     1FH
660         sub     16
661         jr      nc,SHL3
662         cp      -15
663         scf
664         ret     nz
665         ld      a,3
666         jr      SHL3
668 PAIR:   call    OPND
669         ret     c
670 PAIR1:  ld      a,b
671         and     0FH
672         sub     8
673         ret     c
674         jr      SHL3
676 CBIT:   call    NUMBER
677         cp      8
678         ccf
679         ret     c
680 SHL3:   rlca
681         rlca
682         rlca
683 ORC:    or      c
684         ld      c,a
685         ret
687 LDOP:   ld      hl,LDOPS
688 FIND:   call    SKIP
689 EXIT:   ld      b,0
690         scf
691         ret     z
692         ; this code seems to be for tokenized input
693         ; we don't have tokenizer
694         ;cp      CMD_DEF
695         ;jr      z,FIND0
696         ;cp      TOR+1
697         cp      128
698         ccf
699         ret     c
700 FIND0:  ld      a,(hl)
701         or      a
702         jr      z,EXIT
703         xor     (iy)
704         and     01011111B
705         jr      z,FIND2
706 FIND1:  bit     7,(hl)
707         inc     hl
708         jr      z,FIND1
709         inc     hl
710         inc     b
711         jr      FIND0
713 FIND2:  push    iy
714 FIND3:  bit     7,(hl)
715         inc     iy
716         inc     hl
717         jr      nz,FIND5
718         cp      (hl)
719         call    z,SKIP0
720         ld      a,(hl)
721         xor     (iy)
722         and     01011111B
723         jr      z,FIND3
724 FIND4:  pop     iy
725         jr      FIND1
727 FIND5:  call    DELIM
728         call    nz,SIGN
729         jr      nz,FIND4
730 FIND6:  ld      a,b
731         ld      b,(hl)
732         pop     hl
733         ret
735 ; used by FIND
736 SIGN:
737   cp    '+'
738   ret   z
739   cp    '-'
740   ret
742 ; this entry point is used by FIND
743 SKIP0:
744   inc   hl
745 ; this entry point is used to skip blanks
746 ; note that comma and right paren are considered blanks too
747 ; as a consequence, operands may be delimited by spaces, or
748 ; right parens, lol
749 SKIP:
750   call  DELIM
751   ret   nz
752   call  TERM
753   ret   z
754   inc   iy
755   jr    SKIP
757 ; used by FIND and SKIP
758 DELIM:
759   ld    a,(iy)          ;ASSEMBLER DELIMITER
760   cp    ' '
761   ret   z
762   cp    ','
763   ret   z
764   cp    ')'
765   ret   z
767 ; entry point for SKIP
768 TERM:
769   cp    ';'             ;ASSEMBLER TERMINATOR
770   ret   z
771   ;cp    '\'
772   ;ret   z
774 ; also used by assembler to check for command separator
775 ; the assembler itself does nothing with separators
776 isCmdSep:
777   cp    ':'             ;ASSEMBLER SEPARATOR
778   ret   nc
779   cp    CR
780   ret
782         ;.XLIST
783 OPCODS: defm    'NO'
784         defb    'P'+80H
785         defb    0
786         defm    'RLC'
787         defb    'A'+80H
788         defb    7
789         defm    'EX'
790         defb    0
791         defm    'AF'
792         defb    0
793         defm    'AF'
794         defb    "'"+80H
795         defb    8
796         defm    'RRC'
797         defb    'A'+80H
798         defb    0FH
799         defm    'RL'
800         defb    'A'+80H
801         defb    17H
802         defm    'RR'
803         defb    'A'+80H
804         defb    1FH
805         defm    'DA'
806         defb    'A'+80H
807         defb    27H
808         defm    'CP'
809         defb    'L'+80H
810         defb    2FH
811         defm    'SC'
812         defb    'F'+80H
813         defb    37H
814         defm    'CC'
815         defb    'F'+80H
816         defb    3FH
817         defm    'HAL'
818         defb    'T'+80H
819         defb    76H
820         defm    'EX'
821         defb    'X'+80H
822         defb    0D9H
823         defm    'EX'
824         defb    0
825         defm    'DE'
826         defb    0
827         defm    'H'
828         defb    'L'+80H
829         defb    0EBH
830         defm    'D'
831         defb    'I'+80H
832         defb    0F3H
833         defm    'E'
834         defb    'I'+80H
835         defb    0FBH
837         defm    'NE'
838         defb    'G'+80H
839         defb    44H
840         defm    'IM'
841         defb    0
842         defb    '0'+80H
843         defb    46H
844         defm    'RET'
845         defb    'N'+80H
846         defb    45H
847         defm    'RET'
848         defb    'I'+80H
849         defb    4DH
850         defm    'IM'
851         defb    0
852         defb    '1'+80H
853         defb    56H
854         defm    'IM'
855         defb    0
856         defb    '2'+80H
857         defb    5EH
858         defm    'RR'
859         defb    'D'+80H
860         defb    67H
861         defm    'RL'
862         defb    'D'+80H
863         defb    6FH
864         defm    'LD'
865         defb    'I'+80H
866         defb    0A0H
867         defm    'CP'
868         defb    'I'+80H
869         defb    0A1H
870         defm    'IN'
871         defb    'I'+80H
872         defb    0A2H
873         defm    'OUT'
874         defb    'I'+80H
875         defb    0A3H
876         defm    'LD'
877         defb    'D'+80H
878         defb    0A8H
879         defm    'CP'
880         defb    'D'+80H
881         defb    0A9H
882         defm    'IN'
883         defb    'D'+80H
884         defb    0AAH
885         defm    'OUT'
886         defb    'D'+80H
887         defb    0ABH
888         defm    'LDI'
889         defb    'R'+80H
890         defb    0B0H
891         defm    'CPI'
892         defb    'R'+80H
893         defb    0B1H
894         defm    'INI'
895         defb    'R'+80H
896         defb    0B2H
897         defm    'OTI'
898         defb    'R'+80H
899         defb    0B3H
900         defm    'LDD'
901         defb    'R'+80H
902         defb    0B8H
903         defm    'CPD'
904         defb    'R'+80H
905         defb    0B9H
906         defm    'IND'
907         defb    'R'+80H
908         defb    0BAH
909         defm    'OTD'
910         defb    'R'+80H
911         defb    0BBH
913         defm    'BI'
914         defb    'T'+80H
915         defb    40H
916         defm    'RE'
917         defb    'S'+80H
918         defb    80H
919         defm    'SE'
920         defb    'T'+80H
921         defb    0C0H
923         defm    'RL'
924         defb    'C'+80H
925         defb    0
926         defm    'RR'
927         defb    'C'+80H
928         defb    8
929         defm    'R'
930         defb    'L'+80H
931         defb    10H
932         defm    'R'
933         defb    'R'+80H
934         defb    18H
935         defm    'SL'
936         defb    'A'+80H
937         defb    20H
938         defm    'SR'
939         defb    'A'+80H
940         defb    28H
941         defm    'SR'
942         defb    'L'+80H
943         defb    38H
945         defm    'PO'
946         defb    'P'+80H
947         defb    0C1H
948         defm    'PUS'
949         defb    'H'+80H
950         defb    0C5H
951         defm    'EX'
952         defb    0
953         defm    '(S'
954         defb    'P'+80H
955         defb    0E3H
957         defm    'SU'
958         defb    'B'+80H
959         defb    90H
960         defm    'AN'
961         defb    'D'+80H
962         defb    0A0H
963         defm    'XO'
964         defb    'R'+80H
965         defb    0A8H
966         defm    'O'
967         defb    'R'+80H
968         defb    0B0H
969         defm    'C'
970         defb    'P'+80H
971         defb    0B8H
972 ;k8: for some reason i cannot remove this
973         defb    TAND
974         defb    0A0H
975         defb    TOR
976         defb    0B0H
978         defm    'AD'
979         defb    'D'+80H
980         defb    80H
981         defm    'AD'
982         defb    'C'+80H
983         defb    88H
984         defm    'SB'
985         defb    'C'+80H
986         defb    98H
988         defm    'IN'
989         defb    'C'+80H
990         defb    4
991         defm    'DE'
992         defb    'C'+80H
993         defb    5
995         defm    'I'
996         defb    'N'+80H
997         defb    40H
998         defm    'OU'
999         defb    'T'+80H
1000         defb    41H
1002         defm    'J'
1003         defb    'R'+80H
1004         defb    20H
1005         defm    'DJN'
1006         defb    'Z'+80H
1007         defb    10H
1009         defm    'J'
1010         defb    'P'+80H
1011         defb    0C2H
1013         defm    'CAL'
1014         defb    'L'+80H
1015         defb    0C4H
1017         defm    'RS'
1018         defb    'T'+80H
1019         defb    0C7H
1021         defm    'RE'
1022         defb    'T'+80H
1023         defb    0C0H
1025         defm    'L'
1026         defb    'D'+80H
1027         defb    40H
1029         ;defb    DEF and 7FH
1030         defm    'DEF'
1031         defb    'M'+80H
1032         defb    0
1034         ;defb    DEF and 7FH
1035         defm    'DEF'
1036         defb    'B'+80H
1037         defb    0
1039         defm    'OP'
1040         defb    'T'+80H
1041         defb    0
1043         ;defb    DEF and 7FH
1044         defm    'DEF'
1045         defb    'W'+80H
1046         defb    0
1048         defb    0
1050 OPRNDS: defb    'B'+80H
1051         defb    0
1052         defb    'C'+80H
1053         defb    1
1054         defb    'D'+80H
1055         defb    2
1056         defb    'E'+80H
1057         defb    3
1058         defb    'H'+80H
1059         defb    4
1060         defb    'L'+80H
1061         defb    5
1062         defm    '(H'
1063         defb    'L'+80H
1064         defb    6
1065         defb    'A'+80H
1066         defb    7
1067         defm    '(I'
1068         defb    'X'+80H
1069         defb    86H
1070         defm    '(I'
1071         defb    'Y'+80H
1072         defb    0C6H
1074         defm    'B'
1075         defb    'C'+80H
1076         defb    8
1077         defm    'D'
1078         defb    'E'+80H
1079         defb    10
1080         defm    'H'
1081         defb    'L'+80H
1082         defb    12
1083         defm    'I'
1084         defb    'X'+80H
1085         defb    8CH
1086         defm    'I'
1087         defb    'Y'+80H
1088         defb    0CCH
1089         defm    'A'
1090         defb    'F'+80H
1091         defb    14
1092         defm    'S'
1093         defb    'P'+80H
1094         defb    14
1096         defm    'N'
1097         defb    'Z'+80H
1098         defb    16
1099         defb    'Z'+80H
1100         defb    17
1101         defm    'N'
1102         defb    'C'+80H
1103         defb    18
1104         defm    'P'
1105         defb    'O'+80H
1106         defb    20
1107         defm    'P'
1108         defb    'E'+80H
1109         defb    21
1110         defb    'P'+80H
1111         defb    22
1112         defb    'M'+80H
1113         defb    23
1115         defm    '('
1116         defb    'C'+80H
1117         defb    20H
1119         defb    0
1121 LDOPS:  defm    'I'
1122         defb    0
1123         defb    'A'+80H
1124         defb    47H
1125         defm    'R'
1126         defb    0
1127         defb    'A'+80H
1128         defb    4FH
1129         defm    'A'
1130         defb    0
1131         defb    'I'+80H
1132         defb    57H
1133         defm    'A'
1134         defb    0
1135         defb    'R'+80H
1136         defb    5FH
1137         defm    '(BC'
1138         defb    0
1139         defb    'A'+80H
1140         defb    2
1141         defm    '(DE'
1142         defb    0
1143         defb    'A'+80H
1144         defb    12H
1145         defm    'A'
1146         defb    0
1147         defm    '(B'
1148         defb    'C'+80H
1149         defb    0AH
1150         defm    'A'
1151         defb    0
1152         defm    '(D'
1153         defb    'E'+80H
1154         defb    1AH
1156         defb    0