|
- 10 PRINT "Conversion from Intel 8080 Mnemonics to Zilog Z80":PRINT
- 20 INPUT "INPUT file name? ",NI$
- 30 INPUT "OUTPUT file name? ",NO$
- 40 INPUT "Does space terminate the operand (Y/N)? ",IN$
- 50 SPC$=" ":IF LEFT$(IN$+" ",1)="Y" THEN 80
- 60 IF LEFT$(IN$+" ",1)<>"N" THEN PRINT "Please answer Y)es or N)o":GOTO 40
- 70 SPC$=""
- 80 RESET:EF=0:RC=0:OPEN "I",1,NI$:OPEN "O",2,NO$
- 90 IF EOF(1) THEN CLOSE:STOP
- 100 LINE INPUT #1,IN$
- 110 REM
- 120 REM *** PARSE THE LABEL, OPERATION CODE, OPERAND, AND COMMENT
- 130 REM
- 140 IF RIGHT$(IN$,1)=" " THEN IN$=LEFT$(IN$,LEN(IN$)-1):GOTO 140
- 150 IL=LEN(IN$):IF IL=0 THEN IN$=";"
- 160 IF IL<2 OR LEFT$(IN$,1)=";" THEN 1430
- 170 BF=0:QF=0:LB$="":OPC$="":OPD$="":CM$=""
- 180 IF LEFT$(IN$,1)<>" " AND LEFT$(IN$,1)<>CHR$(9) THEN LC=1 ELSE LC=2
- 190 FOR IC=1 TO IL
- 200 CH$=MID$(IN$,IC,1)
- 210 IF LC<4 THEN 240
- 220 CM$=CM$+CH$:IF CM$=" " OR CM$=CHR$(9) THEN CM$=""
- 230 GOTO 360
- 240 IF CH$=":" AND LC=1 THEN 360
- 250 IF ASC(CH$)=34 OR ASC(CH$)=39 THEN QF=1-QF
- 260 IF QF THEN 340
- 270 IF CH$=";" THEN LC=4:GOTO 360
- 280 BL$=" ":IF LC=3 THEN BL$=SPC$
- 290 IF CH$<>BL$ AND CH$<>CHR$(9) THEN BF=1:GOTO 320
- 300 IF BF=1 THEN LC=LC+1:BF=0
- 310 GOTO 360
- 320 IF CH$ >= "a" AND CH$ <= "z" THEN CH$=CHR$(ASC(CH$)-32)
- 330 IF LC=3 AND CH$=";" THEN LC=4:GOTO 360
- 340 IF LC=1 THEN LB$=LB$+CH$:GOTO 360
- 350 IF LC=2 THEN OPC$=OPC$+CH$ ELSE OPD$=OPD$+CH$
- 360 NEXT IC
- 370 REM
- 380 REM *** CONVERT THE OPERATION CODES
- 390 REM
- 400 IF OPC$<>"LD" THEN 430
- 410 GOSUB 1490:IF LEFT$(B$,1)<>"(" THEN B$="("+B$+")"
- 420 OPD$=A$+","+B$
- 430 IF OPC$<>"STO" THEN 460
- 440 GOSUB 1490:IF LEFT$(B$,1)<>"(" THEN B$="("+B$+")"
- 450 OPD$=B$+","+A$:OPC$="LD"
- 460 IF OPC$="LHLD" THEN OPC$="LD":OPD$="HL,("+OPD$+")"
- 470 IF OPC$="LDED" THEN OPC$="LD":OPD$="DE,("+OPD$+")"
- 480 IF OPC$="LBCD" THEN OPC$="LD":OPD$="BC,("+OPD$+")"
- 490 IF OPC$="SHLD" THEN OPC$="LD":OPD$="("+OPD$+"),HL"
- 500 IF OPC$="SDED" THEN OPD$="("+OPD$+"),DE":OPC$="LD"
- 510 IF OPC$="SBCD" THEN OPD$="("+OPD$+"),BC":OPC$="LD"
- 520 IF OPC$="LDA" THEN OPC$="LD":OPD$="A,("+OPD$+")"
- 530 IF OPC$="LDAX" THEN OPC$="LD":GOSUB 1630:OPD$="A,("+OPD$+")"
- 540 IF OPC$="STA" THEN OPC$="LD":OPD$="("+OPD$+"),A"
- 550 IF OPC$="STAX" THEN OPC$="LD":GOSUB 1630:OPD$="("+OPD$+"),A"
- 560 IF (OPC$<>"MOV") AND (OPC$<>"MVI") THEN 600
- 570 GOSUB 1490:IF A$="M" THEN A$="(HL)"
- 580 IF B$="M" THEN B$="(HL)"
- 590 OPC$="LD":OPD$=A$+","+B$
- 600 IF OPC$="XRI" THEN OPC$="XOR"
- 610 IF OPC$="CP" THEN OPC$="CALL":OPD$="P,"+OPD$
- 620 IF OPC$="CZ" THEN OPC$="CALL":OPD$="Z,"+OPD$
- 630 IF OPC$="CNZ" THEN OPC$="CALL":OPD$="NZ,"+OPD$
- 640 IF OPC$="CC" THEN OPC$="CALL":OPD$="C,"+OPD$
- 650 IF OPC$="CNC" THEN OPC$="CALL":OPD$="NC,"+OPD$
- 660 IF OPC$="CPO" THEN OPC$="CALL":OPD$="PO,"+OPD$
- 670 IF OPC$="CPE" THEN OPC$="CALL":OPD$="PE,"+OPD$
- 680 IF OPC$="CM" THEN OPC$="CALL":OPD$="M,"+OPD$
- 690 IF (OPC$="CPI") OR (OPC$="CMP") THEN OPC$="CP":GOSUB 1580
- 700 IF OPC$="ADD" THEN GOSUB 1490:GOSUB 1580:IF B$="" THEN OPD$="A,"+OPD$
- 710 IF OPC$="DAD" THEN OPC$="ADD":GOSUB 1630:OPD$="HL,"+OPD$
- 720 IF OPC$="ADI" THEN OPC$="ADD":OPD$="A,"+OPD$
- 730 IF OPC$="DAD" THEN OPC$="ADD":OPD$="HL,"+OPD$
- 740 IF OPC$="SUI" OR OPC$="SUB" THEN OPC$="SUB":GOSUB 1580
- 750 IF OPC$="SBB" OR OPC$="SBI" THEN OPC$="SBC":GOSUB 1580:OPD$="A,"+OPD$
- 760 IF OPC$="ACI" THEN OPC$="ADC"
- 770 IF OPC$="ADC" THEN OPD$="A,"+OPD$
- 780 IF OPC$="DCR" THEN OPC$="DEC":GOSUB 1580
- 790 IF OPC$="DCX" THEN OPC$="DEC":GOSUB 1630
- 800 IF OPC$="INR" THEN OPC$="INC":GOSUB 1580
- 810 IF OPC$="INX" THEN OPC$="INC":GOSUB 1630
- 820 IF OPC$="CBIT" THEN OPC$="RES"
- 830 IF OPC$="SBIT" THEN OPC$="SET"
- 840 IF OPC$="ANA" THEN GOSUB 1580:OPC$="AND"
- 850 IF OPC$="ANI" THEN OPC$="AND"
- 860 IF (OPC$="ORA") OR (OPC$="ORI") THEN OPC$="OR":GOSUB 1580
- 870 IF (OPC$="XRA") OR (OPC$="XRI") THEN OPC$="XOR":GOSUB 1580
- 880 IF OPC$="CMC" THEN OPC$="CCF"
- 890 IF OPC$="STC" THEN OPC$="SCF"
- 900 IF OPC$="CMA" THEN OPC$="CPL"
- 910 IF OPC$="RLC" THEN OPC$="RLCA"
- 920 IF OPC$="RLC#" THEN OPC$="RLC"
- 930 IF OPC$="RRC" THEN OPC$="RRCA"
- 940 IF OPC$="RRC#" THEN OPC$="RRC"
- 950 IF OPC$="RAL" THEN OPC$="RLA"
- 960 IF OPC$="RAR" THEN OPC$="RRA"
- 970 IF OPC$="HLT" THEN OPC$="HALT"
- 980 IF OPC$="OUT" THEN OPD$="("+OPD$+"),A"
- 990 IF OPC$="OT,C" THEN OPC$="OUT":OPD$="(C),"+OPD$
- 1000 IF OPC$="IN" THEN OPD$="A,("+OPD$+")"
- 1010 IF OPC$="IN,C" THEN OPC$="IN":OPD$=OPD$+",(C)"
- 1020 IF OPC$="XTHL" THEN OPC$="EX":OPD$="(SP),HL"
- 1030 IF (OPC$="EX") AND (OPD$="AF") THEN OPD$="AF,AF'"
- 1040 IF OPC$="XCHG" THEN OPC$="EX":OPD$="DE,HL"
- 1050 IF (OPC$="PUSH") OR (OPC$="POP") THEN GOSUB 1630
- 1060 IF OPC$="LXI" THEN GOSUB 1490:OPD$=A$:GOSUB 1630:OPD$=OPD$+","+B$:OPC$="LD"
- 1070 IF OPC$="LK" THEN OPC$="LD"
- 1080 IF OPC$="SPHL" THEN OPC$="LD":OPD$="SP,HL"
- 1090 IF OPC$="RZ" THEN OPD$="Z":OPC$="RET"
- 1100 IF OPC$="RNZ" THEN OPD$="NZ":OPC$="RET"
- 1110 IF OPC$="RC" THEN OPD$="C":OPC$="RET"
- 1120 IF OPC$="RNC" THEN OPD$="NC":OPC$="RET"
- 1130 IF OPC$="RPE" THEN OPD$="PE":OPC$="RET"
- 1140 IF OPC$="RPO" THEN OPD$="PO":OPC$="RET"
- 1150 IF OPC$="RP" THEN OPD$="P":OPC$="RET"
- 1160 IF OPC$="RM" THEN OPD$="M":OPC$="RET"
- 1170 IF OPC$="RST" THEN OPD$="8*("+OPD$+")"
- 1180 IF OPC$="JP" THEN OPD$="P,"+OPD$
- 1190 IF OPC$="JZ" THEN OPC$="JP":OPD$="Z,"+OPD$
- 1200 IF OPC$="JNZ" THEN OPC$="JP":OPD$="NZ,"+OPD$
- 1210 IF OPC$="JC" THEN OPC$="JP":OPD$="C,"+OPD$
- 1220 IF OPC$="JNC" THEN OPC$="JP":OPD$="NC,"+OPD$
- 1230 IF OPC$="JPE" THEN OPC$="JP":OPD$="PE,"+OPD$
- 1240 IF OPC$="JPO" THEN OPC$="JP":OPD$="PO,"+OPD$
- 1250 IF OPC$="JM" THEN OPC$="JP":OPD$="M,"+OPD$
- 1260 IF OPC$="JRZ" THEN OPC$="JR":OPD$="Z,"+OPD$
- 1270 IF OPC$="JRNZ" THEN OPC$="JR":OPD$="NZ,"+OPD$
- 1280 IF OPC$="JRC" THEN OPC$="JR":OPD$="C,"+OPD$
- 1290 IF OPC$="JRNC" THEN OPC$="JR":OPD$="NC,"+OPD$
- 1300 IF OPC$="JMP" THEN OPC$="JP"
- 1310 IF OPC$="PCHL" THEN OPC$="JP":OPD$="(HL)"
- 1320 REM
- 1330 REM *** GENERATE THE OUTPUT RECORD
- 1340 REM
- 1350 IN$=LB$
- 1360 IF IN$<>"" AND OPC$<>"MACRO" AND OPC$<>"EQU" THEN IN$=IN$+":"
- 1370 IF (LEN(OPC$)>0) OR (LEN(OPD$)>0) OR (LEN(CM$)>0) THEN IN$=IN$+CHR$(9)+OPC$
- 1380 IF (LEN(OPD$)>0) OR (LEN(CM$)>0) THEN IN$=IN$+CHR$(9)+OPD$
- 1390 IF LEN(CM$)=0 THEN 1430
- 1400 IF LEN(OPD$)<8 THEN IN$=IN$+CHR$(9)
- 1410 IF LEFT$(CM$,1)<>";" THEN CM$=";"+CM$
- 1420 IN$=IN$+CHR$(9)+CM$
- 1430 PRINT IN$
- 1440 PRINT #2,IN$
- 1450 GOTO 90
- 1460 REM
- 1470 REM *** SPLIT THE OPERANDS
- 1480 REM
- 1490 A$="":B$="":IF LEN(OPD$)<1 THEN RETURN
- 1500 LC=1:QF=-1:FOR IC=1 TO LEN(OPD$)
- 1505 IF MID$(OPD$,IC,1)="'" THEN QF=-QF-1
- 1510 IF QF AND MID$(OPD$,IC,1)="," THEN LC=2:GOTO 1530
- 1520 IF LC=1 THEN A$=A$+MID$(OPD$,IC,1) ELSE B$=B$+MID$(OPD$,IC,1)
- 1530 NEXT IC
- 1540 RETURN
- 1550 REM
- 1560 REM *** CHANGE MEMORY REGISTER TO (HL)
- 1570 REM
- 1580 IF OPD$="M" THEN OPD$="(HL)"
- 1590 RETURN
- 1600 REM
- 1610 REM *** CONVERT REGISTER PAIRS
- 1620 REM
- 1630 IF OPD$="B" THEN OPD$="BC"
- 1640 IF OPD$="H" THEN OPD$="HL"
- 1650 IF OPD$="D" THEN OPD$="DE"
- 1660 IF OPD$="PSW" THEN OPD$="AF"
- 1670 RETURN
|