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
