10 '*======================*
20 '*    Z80 Assembler     *
30 '*======================*
100   DEFINT A-Z:WIDTH 80
110   DEF FNL(A)=A AND 255              :'Get Low Byte
120   DEF FNH(A)=(A/256)AND 255         :'Get High Byte
130   DIM VG(26),OU$(26),VQ(67),VT(138)
140   ZA=&H6010:ZB=32:ZN=0:ZU=ZB
150   DIM ZL(ZB),ZM(ZB),OW$(ZB)
188   ZG=0                              :'for Debug 0:off,1:on(No_Poke),2:on
189   KEY2,"(IX+":KEY3,"(IY+"
190   GOTO 1010
198'===== Subroutins
199'*Ck_dec:
200   IF LEN(OT$)=0 THEN 2910
202   FOR I=1 TO LEN(OT$)
204     VN=ASC(MID$(OT$,I,1)):IF VN<&H30 OR VN>&H39 THEN 2930
206   NEXT:VE=0:RETURN
209'*Get_Num:
210   GOSUB 200:IF VE>0 THEN IF LEFT$(OT$,1)="0" OR VE=1 THEN 2930 ELSE 2200:'->*Label
212   ZZ!=VAL(OT$):IF ZZ!<-32768! OR ZZ!>65535! THEN 2930
214   IF ZZ!>32767! THEN VD=INT(ZZ!-65536!) ELSE VD=INT(ZZ!)  
216   RETURN
219'*Ck_Hex:
220   FOR I=1 TO LEN(OH$)
222     VN=ASC(MID$(OH$,I,1)):IF VN<&H30 OR VN>&H46 OR(VN>&H39 AND VN<&H41)THEN 2930
224   NEXT:VE=0:RETURN
229'*Get_Hex:
230   IF RIGHT$(OT$,1)="H" THEN OH$=LEFT$(OT$,LEN(OT$)-1) ELSE 210
232   GOSUB 220:IF VE>0 THEN 2200:'->*Label
234   IF LEFT$(OT$,1)="0" AND LEN(OH$)>1 THEN OH$=MID$(OH$,2)
236   IF LEN(OH$)>4 THEN 2930 ELSE VD=VAL("&H"+OH$):RETURN
239'*Rmv_Bal:
240   IF LEFT$(OT$,1)="(" AND RIGHT$(OT$,1)=")" THEN OT$=MID$(OT$,2,LEN(OT$)-2) ELSE VE=3
242   RETURN
249'*Get_Dsp:
250   GOSUB 240:VN=INSTR(OT$,"+"):IF VN>0 THEN OT$=MID$(OT$,VN+1):GOTO 230 ELSE 2930
259'*Get_def:
260   VN=INSTR(OT$,"+"):IF VN>0 THEN OT$=MID$(OT$,VN+1):GOTO 230
262   VN=INSTR(OT$,"-"):IF VN>0 THEN OT$=MID$(OT$,VN+1):GOSUB 230:VD=-VD:RETURN
266   GOSUB 230:IF VE>0 THEN RETURN ELSE VD=VD-ZA-2:RETURN
269'*Get_BNm:
270   GOSUB 240:IF VE>0 THEN RETURN ELSE 230
279'*Set_1By:
280   V(VI)=VM:VI=VI+1:V(VI)=FNL(VD):RETURN
289'*Set_M2W:
290   V(VI)=VM
294'*Set_2Wd:
295   VI=VI+1:V(VI)=FNL(VD):VI=VI+1:V(VI)=FNH(VD):RETURN
298'==== Except LD Command
299'[0]*No_Opl:
300   IF LEN(O$(2))>0 THEN 2930 ELSE IF(VH AND &H40)>0 THEN V(VI)=&HED:VI=VI+1
305   V(VI)=VM:RETURN
309'[20]*CB_r
310   OT$=O2$:GOSUB 630:IF VB<0 THEN 2930
312   V(VI)=&HCB:VI=VI+1:V(VI)=VM+VB:RETURN
319'[1]*ddd:
320   OT$=O2$:GOSUB 630:IF VB>=0 THEN V(VI)=VM+VB*8:RETURN ELSE 2930
329'[2]*sss:
330   OT$=O2$:GOTO 345
339'[3]*A_sss:
340   IF O$(2)="A" THEN OT$=O3$ ELSE 2930
344'*:
345   GOSUB 630:IF VB<0 THEN 2930 ELSE V(VI)=VM+VB:RETURN
349'[4]*_n:
350   OT$=O$(2):GOTO 365
359'[5]*A_n
360   IF O$(2)="A" THEN OT$=O$(3)ELSE 2930
364'*:
365   GOSUB 230:IF VE=0 THEN 280 ELSE 2930
369'[6]*rp:
370   OT$=O2$:GOSUB 640:GOTO 395
379'[7]*qq:
380   OT$=O2$:GOSUB 650:GOTO 395
389'[8]*H_rp:
390   IF O$(2)="HL" THEN OT$=O3$:GOSUB 640 ELSE 2930
392   IF (VH AND &H40)>0 THEN V(VI)=&HED:VI=VI+1
394'*:
395   IF VB<0 THEN 2930 ELSE V(VI)=VM+VB*16:RETURN 
399'[9]*aa
400   OT$=O$(2):GOSUB 230:IF VE=0 THEN 290 ELSE 2930
409'[A]*e:
410   OT$=O$(2):GOSUB 260:IF VD<-128 OR VD>127 THEN 2940 ELSE V(VI)=VM:VI=VI+1:V(VI)=VD:RETURN
419'[B]*ccc:
420   OT$=O2$:GOSUB 680:IF VB>=0 THEN V(VI)=VM+VB*8:RETURN ELSE 2930
429'[C]*ccc_aa:
430   OT$=O2$:GOSUB 680:IF VB<0 THEN 2930
432   OT$=O$(3):GOSUB 230:IF VE>0 THEN 2930 ELSE V(VI)=VM+VB*8:GOTO 295
439'[D]*cc_e:
440   OT$=O2$:GOSUB 680:IF VB<0 OR VB>3 THEN 2930 ELSE OT$=O$(3):GOSUB 260:IF VE>0 THEN RETURN
442   IF VD<-128 OR VD>127 THEN 2940 ELSE V(VI)=VM+VB*8:VI=VI+1:V(VI)=VD:RETURN
449'[E]*nH:
450   OT$=O2$:GOSUB 670:IF VB>=0 THEN V(VI)=VM+VB*8:RETURN ELSE 2930
459'[F]*(HL):
460   IF O$(2)="(HL)" THEN V(VI)=VM:RETURN ELSE 2930
469'[10]*xy:
470   OT$=O2$:GOSUB 690:IF VB<0 THEN 2930 ELSE V(VI)=&HDD+VB*32:VI=VI+1:V(VI)=VM:RETURN
479'[11]*xy_rXY:
480   OT$=O2$:GOSUB 690:IF VB<0 THEN 2930 ELSE VC=VB
482   IF O2$=O3$ THEN VB=3 ELSE OT$=O3$:GOSUB 645:IF VB<0 THEN 2930
484   V(VI)=&HDD+VC*32:VI=VI+1:V(VI)=VM+VB*16:RETURN
489'[12]*(xy):
490   OT$=O2$:GOSUB 695:IF VB<0 THEN 2930 ELSE V(VI)=&HDD+VB*32:VI=VI+1:V(VI)=VM:RETURN
499'[13]*(xy+d):
500   OT$=O2$:GOSUB 695:IF VB<0 THEN 2930 ELSE OT$=O$(2)
504'*:
505   GOSUB 250:IF VD<0 OR VD>255 THEN 2940
506   V(VI)=&HDD+VB*32:VI=VI+1:IF (VH AND &H40)>0 THEN V(I)=&HCB:VI=VI+1
507   V(VI)=VM:VI=VI+1:V(VI)=VD:RETURN
509'[14]*A,(xy+d):
510   IF O$(2)<>"A" THEN 2930 ELSE OT$=O3$:GOSUB 695:IF VB<0 THEN 2930 ELSE OT$=O$(3):GOTO 505
519'[15]*ddd(C:
520   IF O$(3)<>"(C)" THEN 2930 ELSE OT$=O2$:GOSUB 635:IF VB<0 THEN 2930
524   V(VI)=&HED:VI=VI+1:V(VI)=VM+VB*8:RETURN
529'[16]*A,(n):
530   IF O$(2)<>"A" THEN 2930 ELSE OT$=O$(3):GOSUB 270:IF VE>0 THEN RETURN
532   IF VD<0 OR VD>255 THEN 2940 ELSE 280
539'[17]*(C),sss:
540   IF O$(2)<>"(C)" THEN 2930
542   OT$=O3$:GOSUB 635:IF VB<0 THEN 2930 ELSE V(VI)=&HED:VI=VI+1:V(VI)=VM+VB*8:RETURN
549'[18]*(n),A:
550   IF O$(3)<>"A" THEN 2930 ELSE OT$=O$(2):GOSUB 270:IF VE>0 THEN RETURN
552   IF VD<0 OR VD>255 THEN 2940 ELSE 280
559'[19]*b,rrr:
560   OT$=O3$:GOSUB 630:IF VB<0 THEN 2930 ELSE OT$=O$(2):GOSUB 230:IF VE>0 THEN RETURN
562   IF VD<0 OR VD>7 THEN 2930 ELSE V(VI)=&HCB:VI=VI+1:V(VI)=VM+VD*8+VB:RETURN
569'[1A]*b,(xy):
570   OT$=O3$:GOSUB 695:IF VB<0 THEN 2930 ELSE OT$=O$(2):GOSUB 230:IF VE>0 THEN RETURN
572   IF VD<0 OR VD>7 THEN 2930 ELSE VC=VD:OT$=O$(3):GOSUB 250:IF VD<0 OR VD>255 THEN 2940
575   V(VI)=&HDD+VB*32:VI=VI+1:V(VI)=&HCB:VI=VI+1:V(VI)=VD:VI=VI+1:V(VI)=VM+VC*8:RETURN
579'[1B]*m:
580   OT$=O2$:GOSUB 660:IF VB<0 THEN 2930 ELSE V(VI)=&HED:VI=VI+1:V(VI)=VM+VB*8:RETURN
589'[1C]*DE,HL:
590   IF O$(2)="DE" AND O$(3)="HL"  THEN V(VI)=VM:RETURN ELSE 2930
599'[1D]*AF,AF:
600   IF O$(2)="AF" AND O$(3)="AF'" THEN V(VI)=VM:RETURN ELSE 2930
609'[1E]*(SP),HL: 
610   IF O$(2)="(SP)" AND O$(3)="HL" THEN V(VI)=VM:RETURN ELSE 2930
619'[1F]*(SP),xy:
620   IF O$(2)<>"(SP)" THEN 2930
622   OT$=O3$:GOSUB 690:IF VB<0 THEN 2930 ELSE V(VI)=&HDD+VB*32:VI=VI+1:V(VI)=VM:RETURN
630   VB=(INSTR("B__C__D__E__H__L__(HLA__",OT$)-1)/3:RETURN     :'*Ck_Reg
635   VB=(INSTR("B__C__D__E__H__L__***A__",OT$)-1)/3:RETURN     :'*Ck_Rg2
640   VB=(INSTR("BC_DE_HL_SP_",OT$)-1)/3:RETURN                 :'*Ck_RgP
645   VB=(INSTR("BC_DE_***SP_",OT$)-1)/3:RETURN                 :'*Ck_RgX
650   VB=(INSTR("BC_DE_HL_AF_",OT$)-1)/3:RETURN                 :'*Ck_RgAF
655   VB=(INSTR("(BC(DE",OT$)-1)/3:RETURN                       :'*Ck_IdRg
660   VB=(INSTR("0__1__***2__",OT$)-1)/3:RETURN                 :'*Ck_IM
670   VB=(INSTR("00H08H10H18H20H28H30H38H",OT$)-1)/3:RETURN     :'*Ck_RST
680   VB=(INSTR("NZ_Z__NC_C__PO_PE_P__M__",OT$)-1)/3:RETURN     :'*Ck_Cnd
690   VB=(INSTR("IX_IY_",OT$)-1)/3:RETURN                       :'*Ck_Ixy
695   VB=(INSTR("(IX(IY",OT$)-1)/3:RETURN                       :'*Ck_Ixy
   
700' ===== LD Command
709'[21]*dd-ss:
710   OT$=O3$:GOSUB 630:IF VB<0 THEN 2930 ELSE VC=VB
712   OT$=O2$:GOSUB 630:IF VB<0 OR (VB=6 AND VC=6) THEN 2930 ELSE V(VI)=VM+VB*8+VC:RETURN
719'[22]*ddd-n:
720   OT$=O2$:GOSUB 630:IF VB<0 OR LEFT$(O$(3),1)="(" THEN 2930
722   OT$=O$(3):GOSUB 230:IF VE>0 THEN 2930
724   IF VD<0 OR VD>255 THEN 2930 ELSE  V(VI)=VM+VB*8:VI=VI+1:V(VI)=VD:RETURN
729'[23]*d-(xy:
730   OT$=O3$:GOSUB 695:IF VB<0 THEN 2930 ELSE VC=VB
732   OT$=O2$:GOSUB 630:IF VB<0 THEN 2930 ELSE IF VB=6 THEN 2935
734   OT$=O$(3):GOSUB 250:IF VE>0 THEN RETURN ELSE IF VD<0 OR VD>255 THEN 2930
736   V(VI)=&HDD+VC*32:VI=VI+1:V(VI)=VM+VB*8:VI=VI+1:V(VI)=VD:RETURN
739'[24]*A-(bd:
740   IF O$(2)<>"A" THEN 2930 ELSE OT$=O3$:GOSUB 655:IF VB<0 THEN 2930 ELSE V(VI)=VM+VB*16:RETURN
749'[25]*A-(aa:
750   IF O$(2)<>"A" THEN 2930 ELSE OT$=O$(3):GOSUB 270:IF VE>0 THEN 2930 ELSE 290
759'[26]*pp-nn:
760   OT$=O2$:GOSUB 640:IF VB<0 OR LEFT$(O$(3),1)="(" THEN 2930
762   OT$=O$(3):GOSUB 230:IF VE>0 THEN 2930 ELSE V(VI)=VM+VB*16:GOTO 295
769'[27]*pp(aa:
770   OT$=O2$:GOSUB 645:IF VB<0 THEN 2930
772   OT$=O$(3):GOSUB 270:IF VE>0 THEN 2930 ELSE V(VI)=&HED:VI=VI+1:V(VI)=VM+VB*16:GOTO 295
779'[28]*HL(aa:
780   IF O$(2)<>"HL" THEN 2930 ELSE OT$=O$(3):GOSUB 270:IF VE>0 THEN 2930 ELSE 290
789'[29]*SP-HL:
790   IF O$(2)="SP" AND O$(3)="HL" THEN V(VI)=VM:RETURN ELSE 2930
799'[2A]*SP-xy:
800   IF O$(2)<>"SP" THEN 2930
802   OT$=O3$:GOSUB 690:IF VB<0 THEN 2930 ELSE V(VI)=&HDD+VB*32:VI=VI+1:V(VI)=VM:RETURN
809'[2B}*(bd-A:
810   IF O$(3)<>"A" THEN 2930 ELSE OT$=O2$:GOSUB 655:IF VB<0 THEN 2930 ELSE V(VI)=VM+VB*16:RETURN
819'[2C]*(aa-A:
820   IF O$(3)<>"A" THEN 2930 ELSE OT$=O$(2):GOSUB 270:IF VE>0 THEN 2930 ELSE 290
829'[2D]*(aa-H:
830   IF O$(3)<>"HL" THEN 2930 ELSE OT$=O$(2):GOSUB 270:IF VE>0 THEN 2930 ELSE 290
839'[2E]*(aa-p:
840   OT$=O3$:GOSUB 645:IF VB<0 THEN 2930
842   OT$=O$(2):GOSUB 270:IF VE>0 THEN 2930 ELSE V(VI)=&HED:VI=VI+1:V(VI)=VM+VB*16:GOTO 295
849'[2F]*(aaxy:
850   OT$=O3$:GOSUB 690:IF VB<0 THEN 2930 ELSE OT$=O$(2):GOSUB 270:GOTO 875
859'[30]*xy-nn:
860   OT$=O2$:GOSUB 690:IF VB<0 THEN 2930 ELSE OT$=O$(3):GOSUB 230:GOTO 875
869'[31]*xy(aa:
870   OT$=O2$:GOSUB 690:IF VB<0 THEN 2930 ELSE OT$=O$(3):GOSUB 270
874'*:
875   IF VE=0 THEN V(VI)=&HDD+VB*32:VI=VI+1:GOTO 290 ELSE 2930
879'[32]*(xy-s:
880   OT$=O2$:GOSUB 695:IF VB<0 THEN 2930 ELSE VC=VB:OT$=O3$:GOSUB 630:IF VB<0 THEN 2930
884   IF VB=6 THEN 2935 ELSE OT$=O$(2):GOSUB 250:IF VE>0 THEN RETURN
886   IF VD<0 OR VD>255 THEN 2940
888   V(VI)=&HDD+VC*32:VI=VI+1:V(VI)=VM+VB:VI=VI+1:V(VI)=VD:RETURN
889'[33]*(xy-n:
890   OT$=O2$:GOSUB 695:IF VB<0 THEN 2930 ELSE OT$=O$(3):VL=1:GOSUB 230:IF VE>0 THEN RETURN
892   IF VD<0 OR VD>255 THEN 2940 ELSE VC=VD
894   OT$=O$(2):VL=0:GOSUB 250:IF VE>0 THEN RETURN
896   IF VD<0 OR VD>255 THEN 2940
898   V(VI)=&HDD+VB*32:VI=VI+1:V(VI)=VM:VI=VI+1:V(VI)=VD:VI=VI+1:V(VI)=VC:RETURN
899'[34]*A-I:
900   IF O$(2)="A" AND O$(3)="I" THEN 940 ELSE 2930
909'[35]*A-R:
910   IF O$(2)="A" AND O$(3)="R" THEN 940 ELSE 2930
919'[36]*I-A:
920   IF O$(2)="I" AND O$(3)="A" THEN 940 ELSE 2930
929'[37]*R-A:
930   IF O$(2)="R" AND O$(3)="A" THEN 940 ELSE 2930
939'*ExED
940   V(VI)=&HED:VI=VI+1:V(VI)=VM:RETURN
949'*To_Lowr:
950   FOR I=1 TO LEN(OL$)
952   VN=ASC(MID$(OL$,I,1)):IF VN>&H60 AND VN<&H7B THEN MID$(OL$,I,1)=CHR$(VN-&H20)
955   NEXT:RETURN
959'*Get_Op:
960   IF VS=LEN(OL$) THEN O$(VJ)=MID$(OL$,VP,VS-VP+1):RETURN
962   O$(VJ)=MID$(OL$,VP,VS-VP):VS=VS+1:VP=VS
964'*Sp_Skip:
965   VN=ASC(MID$(OL$,VS,1)):IF VN=&H20 OR VN=&H09 THEN VS=VS+1:GOTO 965 ELSE VP=VS:RETURN
969'*Spt_Ln:
970   FOR I=0 to 9:O$(I)="":NEXT
972   VS=INSTR(OL$,":"):IF VS>0 THEN O$(0)=LEFT$(OL$,VS-1):VS=VS+1 ELSE VS=1
974   GOSUB 965:VJ=1:VP=VS
979'*Spt_Lp:
980   OH$=MID$(OL$,VS,1):IF OH$=";" OR VS=LEN(OL$) THEN GOSUB 960:GOTO 985
982   IF OH$="," OR OH$=" " THEN GOSUB 960 ELSE VS=VS+1:GOTO 980
983   IF VJ<10 THEN VJ=VJ+1:GOTO 980
984'*Spt_Ext:
985   IF O$(2)="EQU" OR O$(2)="=" THEN FOR I=0 TO 8:O$(I)=O$(I+1):NEXT
986   IF ZG>1 THEN print ".";O$(0);".";O$(1);".";O$(2);".";O$(3);".":'----------- for Debug
988   RETURN
989'*Spt_Wd:
990   O1$=LEFT$(O$(1)+"____",4):O2$=LEFT$(O$(2)+"___",3):O3$=LEFT$(O$(3)+"___",3):RETURN
1000'===== Start Asm
1009'*Init_Asm:
1010  GOSUB 3080:GOSUB 3360:GOSUB 3510
1099'*Main:
1100  PRINT"#";:GOSUB 2600:LINEINPUT "[Asm]? ";OL$:IF LEN(OL$)=0 THEN 1100
 |    | 
1105  IF OL$="!" THEN END
1110  IF OL$="L" THEN GOSUB 2300:GOTO 1100          :'*Print Lable List
1120  GOSUB 950:GOSUB 970:GOSUB 990                 :'*ToLower,*SepLn,*SetWd
1130  GOSUB 3010:IF VE>0 THEN 1150                  :'*GetCmdTabl
1140  IF VR>67 THEN 1300
1145  IF VR=30 THEN GOSUB 3310 ELSE GOSUB 3210      :'Exc.Asm.
1150  IF VE>0 THEN GOSUB 2900:GOTO 1100             :'Print Error
1160  IF LEN(O$(0))>0 THEN GOSUB 2100               :'Label Set
1170  GOSUB 2650:GOSUB 2700:GOTO 1100               :'Print Result & Set Data
1299'*Pseudo:
1300  ON VR-67 GOSUB 1400,1600,1600,1700,1800,1900
1310  IF VE>0 THEN 1150
1320  IF VR>70 AND VR<73 THEN 1170 ELSE 1100
1399'*ORG:
1400  OT$=O$(2):GOSUB 230:IF VE>0 THEN 2930
1410  ZA=VD:GOSUB 2600:PRINT:RETURN
1599'*EQU:
1600  OT$=O$(2):GOSUB 230:IF VE>0 THEN 2930
1610  OT$=O$(0):GOTO 2110
1699'*DB:
1700  OT$=O$(2):GOSUB 230:IF VE>0 THEN 2930 ELSE V(VI)=FNL(VD):V(0)=VI:RETURN
1799'*DW:
1800  OT$=O$(2):GOSUB 230:IF VE>0 THEN 2930 ELSE V(VI)=FNL(VD):VI=VI+1:V(VI)=FNH(VD):V(0)=VI:RETURN
1899'*END:
1900  GOTO 2400
2000 '===== Label
2009'*Sch_Lbl:
2010  FOR ZI=0 TO ZN
2020   IF OW$(ZI)=OT$ THEN ZE=0:RETURN
2030  NEXT:ZE=6:RETURN
2099'*Set_Lbl:
2100  OT$=O$(0):VD=ZA
2105'*
2110  Z=LEN(OT$):IF Z>6 OR Z<3 THEN 2990    :'*Er_Bad
2120  GOSUB 2010:IF ZE=0 THEN 2980          :'*Er_Dup
2130  IF ZN<ZU THEN ZN=ZN+1:OW$(ZN)=OT$:ZL(ZN)=VD:RETURN ELSE 2970:'*Er_Ovr
2199'*Sh&St_ULbl:
2200  Z=LEN(OT$):IF Z>6 OR Z<3 THEN 2990    :'*Er_Bad
2210  GOSUB 2010:IF ZE=0 THEN VD=ZL(ZI):ZM(ZI)=ZM(ZI)+1:VE=0:RETURN
2220  IF ZU=ZN THEN 2970 ELSE OW$(ZU)=OT$:ZL(ZU)=ZA :'*Er_Ovr
2230  IF VZ=&H33 THEN Z=2+VL:ZM(ZU)=1:GOTO 2270     :'VL=0:Op2/VL=1:Op3,1byte
2240  OQ$=right$("__"+hex$(VZ),2):VD=0
2250  IF INSTR("__4__5_16_18_22",OQ$)>0 THEN Z=1:ZM(ZU)=1:GOTO 2270 :'Op1,1byte
2252  IF INSTR("_13_14_1A_23_32",OQ$)>0 THEN Z=2:ZM(ZU)=1:GOTO 2270 :'Op2,1byte
2254  IF INSTR("_27_2E_2F_30_31",OQ$)>0 THEN Z=2:ZM(ZU)=2:GOTO 2270 :'Op2,2byte
2256  IF INSTR("__A__D",OQ$)>0  THEN VD=ZA+2:Z=1:ZM(ZU)=3:GOTO 2270 ;'Op1,Ofset
2258  IF INSTR("__9_12_25_26_28_2C_2D",OQ$)>0 THEN Z=1:ZM(ZU)=2     :'Op1,2Byte
2270  ZL(ZU)=ZL(ZU)+Z:ZU=ZU-1
2280  VE=0:OO$="":RETURN 
2299'*Lst_Lbl:
2300  PRINT"---- Defined Labels ----":FOR Z=1  TO ZN:GOSUB 2350:NEXT
2310  PRINT"---- Undefined Labels --":FOR Z=ZB TO ZU+1 STEP -1:GOSUB 2350:NEXT
2320  RETURN
2349'*
2350  PRINT OW$(Z);":";TAB(10);RIGHT$("000"+HEX$(ZL(Z)),4);"H";TAB(16);ZM(Z):RETURN
2399'*Rst_Lbl:
2400  IF ZU=ZB THEN RETURN
2410  FOR ZJ=ZB TO ZU+1 STEP -1:ZF=0
2420   FOR ZI=1 TO ZN
2430    IF OW$(ZJ)=OW$(ZI) THEN ZF=1:ZQ=ZL(ZI):ZR=ZL(ZJ):GOSUB 2500
2440   NEXT ZI:
2450   IF ZF=0 THEN GOSUB 2960:PRINT "[";OW$(ZJ);"]=???"
2460  NEXT ZJ
2470  RETURN
2499'*Set_Lbl_Dat:
2500  IF ZM(ZJ)=0 THEN RETURN
2502  PRINT RIGHT$("000"+HEX$(ZR),4);": ";
2504  ON ZM(ZJ) GOSUB 2510,2520,2530
2506  ZM(ZJ)=0:ZM(ZI)=ZM(ZI)+1:PRINT:RETURN
2509'*
2510  ZD=ZQ:PRINT RIGHT$("0"+HEX$(FNL(ZQ)),2);:IF ZG=0 THEN POKE ZR,FNL(ZQ)
2515  RETURN
2519'*
2520  GOSUB 2510:PRINT RIGHT$("0"+HEX$(FNH(ZQ)),2);:IF ZG=0 THEN POKE ZR+1,FNH(ZQ)
2525  RETURN
2529'*
2530  ZD=ZQ-ZR-1:IF ZD<-128 OR ZD>127 THEN 2940
2532  PRINT FNL(ZD);:IF ZG=0 THEN POKE ZR,FNL(ZD)
2535  RETURN
2599'*Prt_Data:
2600  PRINT RIGHT$("000"+HEX$(ZA),4);" ";:RETURN
2650  GOSUB 2600:FOR I=1 TO V(0):PRINT RIGHT$("0"+HEX$(V(I)),2);:NEXT:PRINT:RETURN
2699'*Set_Data:
2700  FOR I=1 TO V(0)
2710    IF ZG=0 THEN POKE ZA,FNL(V(I))
2720    ZA=ZA+1
2730  NEXT:RETURN
2899'*Errors:
2900  BEEP:PRINT "*** ";OO$;" !!":RETURN
2910  VE=1:OO$="Syntacs Error":RETURN
2920  VE=2:OO$="No Operation":RETURN
2930  VE=3:OO$="Bad Operand":RETURN
2935   GOSUB 2930:VE=13:RETURN
2940  VE=4:OO$="Out of Range":RETURN
2950  VE=5:OO$="Too Many Operand":RETURN
2960  VE=6:OO$="Undefined Label":RETURN
2970  VE=7:OO$="Too Many Lables":RETURN
2980  VE=8:OO$="Duplicated Name":RETURN
2990  VE=9:OO$="Bad Label Name":RETURN
3000 '===== Tables
3009'*Get_CmTbl:
3010  VE=0:VA=INSTR("ORG_EQU_=___DB__DW__END_",O1$):IF VA>0 THEN VR=67+(VA+3)/4:RETURN
3020  VA=ASC(O1$)-&H40: IF VG(VA)=0 THEN 2920
3030  VB=INSTR(OU$(VA),O1$):IF VB=0 THEN 2920 ELSE VB=(VB-1)/4
3040  VR=VG(VA)+VB
3045  IF ZG>1 THEN print "VR:";VR;O1$;",";O2$;",";O3$:'------- for Debug
3050  RETURN
3079'*Init_CmTbl:
3080  RESTORE 3101:FOR I=1 TO 26:READ VG(I),OU$(I):NEXT:RETURN
3100'* VG(VA)
3101  DATA  1,"ADC_ADD_AND_"
3102  DATA  4,"BIT_"
3103  DATA  5,"CALLCCF_CP__CPD_CPDRCPI_CPIRCPL_"
3104  DATA 13,"DAA_DEC_DI__DJNZ"
3105  DATA 17,"EI__EX__EXX_"
3106  DATA  0,""  :'F
3107  DATA  0,""  :'G
3108  DATA 20,"HALT"
3109  DATA 21,"IM__IN__INC_IND_INDRINI_INIR"
3110  DATA 28,"JP__JR__"
3111  DATA  0,""  :'K
3112  DATA 30,"LD__LDD_LDDRLDI_LDIR"
3113  DATA  0,""  :'M
3114  DATA 35,"NEG_NOP_" 
3115  DATA 37,"OR__OTDROUIROUT_OUTDOUTI"
3116  DATA 43,"POP_PUSH"
3117  DATA  0,""  :'Q
3118  DATA 45,"RES_RET_RETIRETNRL__RLA_RLC_RLCARLD_RR__RRA_RRC_RRCARRD_RST_"
3119  DATA 60,"SBC_SCF_SET_SLA_SRA_SRL_SUB_"
3120  DATA  0,""  :'T
3121  DATA  0,""  :'U
3122  DATA  0,""  :'V
3123  DATA  0,""  :'W
3124  DATA 67,"XOR_"
3125  DATA  0,""  :'Y
3126  DATA  0,""  :'Z
3189'-------- for Debug
3190  IF ZG>1 THEN print "VK,VZ,VW:";VK;", ";right$("0"+hex$(VZ),2);"H, ";right$("000"+hex$(VW),4);"H, VE:";VE
3192  RETURN
3200'*Asm_Jmp: ---- Except LD Command
3210  VK=VQ(VR)
3219'*Asm_Lp:
3220  GOSUB 3380:VI=1:VE=0
3230  ON VZ+1 GOSUB 300,320,330,340,350,360,370,380,390,400,410,420,430,440,450,460,470,480,490,500,510,520,530,540,550,560,570,580,590,600,610,620,310
3235  GOSUB 3190
3240  IF VE=0 THEN V(0)=VI:RETURN
3250  IF VE=3 AND VF>0 THEN VK=VK+1:GOTO 3220 ELSE RETURN
3300'*AsLd_Jp: ----- LD Command 
3310  OT$=O2$:GOSUB 630:IF VB>=0 THEN VK=57 ELSE IF LEFT$(O2$,1)="(" THEN VK=64 ELSE VK=71
3319'*AsLd_Lp:
3320  GOSUB 3380:VI=1:VE=0
3330  ON VZ-32 GOSUB 710,720,730,740,750,760,770,780,790,800,810,820,830,840,850,860,870,880,890,900,910,920,930  
3335  GOSUB 3190
3340  IF VE=0 THEN V(0)=VI:RETURN
3345  IF VE>10 THEN VE=VE-10:RETURN
3350  IF VE=3 AND VF>0 THEN VK=VK+1:GOTO 3320 ELSE RETURN
3359'*Init_AsTbl:
3360  RESTORE 3400:FOR I=1 TO 67:READ VQ(I):NEXT:RETURN
3379'*Asm_Sep:
3380  VW=VT(VK):VM=FNL(VW):VH=FNH(VW):VF=VH AND &H80:VZ=VH AND &H3F:RETURN 
3399'* VQ(VR)
3400  DATA   1,  5, 10, 13, 15, 17, 18, 21, 22, 23, 24, 25, 26, 27, 31, 32, 33, 34, 38, 39
3410  DATA  40, 41, 43, 47, 48, 49, 50, 51, 55, 57, 80, 81, 82, 83, 84, 85, 86, 89, 90, 91
3420  DATA  93, 94, 95, 97, 99,101,103,104,105,107,108,110,111,112,114,115,117,118,119,120
3430  DATA 124,125,127,129,131,133,136
3500'*Init_OpTbl:
3510  RESTORE 3601:FOR VK=1 TO 138:READ VT(VK):NEXT:RETURN
3600'*  VT(VK)                                  VR VK
3601  DATA &H8388,&H948E,&H85CE,&H484E        :' 1, 1 ADC  A.sss/A,(xy+d)/A,n/HL,rp
3602  DATA &H8380,&H9486,&H85C6,&H8809,&H1109 :' 2, 5 ADD  A,sss/A,(xy+d)/A,n/HL,rp/rx,rx
3603  DATA &H82A0,&H93A6,&H04D6               :' 3, 10 AND  sss/(xy+d)/n
3604  DATA &H9940,&H5A46                      :' 4, 13 BIT  b.sss/b,(xy+d)
3605  DATA &H8CC4,&H09CD                      :' 5, 15 CALL cc.aa/aa
3606  DATA &H003F                             :' 6, 17 CCF  *
3607  DATA &H82B8,&H93BE,&H04FE               :' 7, 18 CP   ss/(xy+d)/n
3608  DATA &H40A9                             :' 8, 21 CPD  *
3609  DATA &H40B9                             :' 9, 22 CPDR *
3610  DATA &H40A1                             :'10, 23 CPI  *
3611  DATA &H40B1                             :'11, 24 CPIR *
3612  DATA &H002F                             :'12, 25 CPL  *
3613  DATA &H0027                             :'13, 26 DAA  *
3614  DATA &H8105,&H860B,&H9335,&H102B        :'14, 27 DEC  ddd/rp/(xy+d)/xy
3615  DATA &H00F3                             :'15, 31 DI   *
3616  DATA &H0A10                             :'16, 32 DJNZ *
3617  DATA &H00FB                             :'17, 33 EI   *
3618  DATA &H9CEB,&H9D08,&H9EE3,&H1FE3        :'18, 34 EX   DE,HL/AF,AF'/(SP)HL/(SP),xy
3619  DATA &H00D9                             :'19, 38 EXX  *
3620  DATA &H0076                             :'20, 39 HALT *
3621  DATA &H5B44                             :'21, 40 IM   m
3622  DATA &HD540,&H16DB                      :'22, 41 IN   r,(C)/A,(n)
3623  DATA &H8104,&H8603,&H9334,&H1023        :'23, 43 INC  ddd/rp/(xy+d)/xy
3624  DATA &H40AA                             :'24, 47 IND  *
3625  DATA &H40BA                             :'25, 48 INDR *
3626  DATA &H40A2                             :'26, 49 INI  *
3627  DATA &H40B2                             :'27, 50 INIR *
3628  DATA &H8CC2,&H8FE9,&H92E9,&H09C3        :'28, 51 JP   cc,aa/(HL)/(xy)/aa
3629  DATA &H8D20,&H0A18                      :'29, 55 JR   cc,e/e
3630  DATA &HA140,&HF457,&HF55F               :'30, 57 LD   ddd,sss/A,I/A,R/
3631  DATA &HA40A,&HA346,&HA53A,&H2206        :'    60 LD   A,(bd)/dd,(xy)/A,(aa)/dd,n
3632  DATA &HAB02                             :'(   64 LD   (bd),A/
3633  DATA &HB270,&HB336                      :'    65 LD   (xy),sss/(xy),n/
3634  DATA &HAC32,&HAD22,&HAE43,&H2F22        :'    67 LD   (aa),A/(aa),HL/(aa),pp/(aa),xy
3635  DATA &HA9F9,&HAAF9,&HA601,&HA82A,&HA74B :'*   71 LD   SP,HL/SP,xy/rp,nn/HL,(aa)/pp,(aa)/
3636  DATA &HB12A,&HB021                      :'    76 LD   xy,(aa)/xy,nn/
3637  DATA &HF647,&H774F                      :'    78 LD   I,A/R,A
3638  DATA &H40A8                             :'31, 80 LDD  *
3639  DATA &H40B8                             :'32, 81 LDDR *
3640  DATA &H40A0                             :'33, 82 LDI  *
3641  DATA &H40B0                             :'34, 83 LDIR *
3642  DATA &H4044                             :'35, 84 NEG  *
3643  DATA &H0000                             :'36, 85 NOP  *
3644  DATA &H82B0,&H93B6,&H04F6               :'37, 86 OR   sss/(xy+d)/n
3645  DATA &H40BB                             :'38, 89 OTDR *
3646  DATA &H40B3                             :'39, 90 OUIR *
3647  DATA &HD741,&H18D3                      :'40, 91 OUT  (C),sss/(n),A
3648  DATA &H40AB                             :'41, 93 OUTD *
3649  DATA &H40A3                             :'42, 94 OUTI *
3650  DATA &H87C1,&H10E1                      :'43, 95 POP  pp/xy
3651  DATA &H87C5,&H10E5                      :'44, 97 PUSH pp/xy
3652  DATA &H9980,&H5A86                      :'45, 99 RES  b,r/b,(xy+d)
3653  DATA &H8BC0,&H00C9                      :'46,101 RET  cc/*
3654  DATA &H404D                             :'47,103 RETI *
3655  DATA &H4045                             :'48,104 RETN *
3656  DATA &HA010,&H5316                      :'49,105 RL   r/(xy+d)
3657  DATA &H0017                             :'50,107 RLA  *
3658  DATA &HA000,&H5306                      :'51,108 RLC  r/(xy+d)
3659  DATA &H0007                             :'52,110 RLCA *
3660  DATA &H406F                             :'53,111 RLD  *
3661  DATA &HA018,&H531E                      :'54,112 RR   r/(xy+d)
3662  DATA &H001F                             :'55,114 RRA  *
3663  DATA &HA008,&H530E                      :'56,115 RRC  r/(xy+d)
3664  DATA &H000F                             :'57,117 RRCA *
3665  DATA &H4067                             :'58,118 RRD  *
3666  DATA &H0EC7                             :'59,119 RST  nH
3667  DATA &H8398,&H939E,&H85DE,&H4842        :'60,120 SBC  A,sss/A,(xy+d)/A,n/HL,rp
3668  DATA &H0037                             :'61,124 SCF  *
3669  DATA &H99C0,&H5AC6                      :'62,125 SET  n,r/n.(xy+d)
3670  DATA &HA020,&H5326                      :'63,127 SLA  r/(xy+d)
3671  DATA &HA028,&H532E                      :'64,129 SRA  r/(xy+d)
3672  DATA &HA038,&H533E                      :'65,131 SRL  r/(xy+d)
3673  DATA &H8290,&H9396,&H04E6               :'66,133 SUB  sss/(xy+d)/n
3674  DATA &H82A8,&H939E,&H04EE               :'67,136 XOR  sss/(xy+d)/n
 |