-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathasm2mac.bas
More file actions
169 lines (169 loc) · 6.88 KB
/
asm2mac.bas
File metadata and controls
169 lines (169 loc) · 6.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
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