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
|