home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / basic / asm2mac.bas < prev    next >
BASIC Source File  |  1994-07-13  |  7KB  |  169 lines

  1. 10 PRINT "Conversion from Intel 8080 Mnemonics to Zilog Z80":PRINT
  2. 20 INPUT "INPUT file name? ",NI$
  3. 30 INPUT "OUTPUT file name? ",NO$
  4. 40 INPUT "Does space terminate the operand (Y/N)? ",IN$
  5. 50 SPC$=" ":IF LEFT$(IN$+" ",1)="Y" THEN 80
  6. 60 IF LEFT$(IN$+" ",1)<>"N" THEN PRINT "Please answer Y)es or N)o":GOTO 40
  7. 70 SPC$=""
  8. 80 RESET:EF=0:RC=0:OPEN "I",1,NI$:OPEN "O",2,NO$
  9. 90 IF EOF(1) THEN CLOSE:STOP
  10. 100 LINE INPUT #1,IN$
  11. 110 REM
  12. 120 REM *** PARSE THE LABEL, OPERATION CODE, OPERAND, AND COMMENT
  13. 130 REM
  14. 140 IF RIGHT$(IN$,1)=" " THEN IN$=LEFT$(IN$,LEN(IN$)-1):GOTO 140
  15. 150 IL=LEN(IN$):IF IL=0 THEN IN$=";"
  16. 160 IF IL<2 OR LEFT$(IN$,1)=";" THEN 1430
  17. 170 BF=0:QF=0:LB$="":OPC$="":OPD$="":CM$=""
  18. 180 IF LEFT$(IN$,1)<>" " AND LEFT$(IN$,1)<>CHR$(9) THEN LC=1 ELSE LC=2
  19. 190 FOR IC=1 TO IL
  20. 200 CH$=MID$(IN$,IC,1)
  21. 210 IF LC<4 THEN 240
  22. 220 CM$=CM$+CH$:IF CM$=" " OR CM$=CHR$(9) THEN CM$=""
  23. 230 GOTO 360
  24. 240 IF CH$=":" AND LC=1 THEN 360
  25. 250 IF ASC(CH$)=34 OR ASC(CH$)=39 THEN QF=1-QF
  26. 260 IF QF THEN 340
  27. 270 IF CH$=";" THEN LC=4:GOTO 360
  28. 280 BL$=" ":IF LC=3 THEN BL$=SPC$
  29. 290 IF CH$<>BL$ AND CH$<>CHR$(9) THEN BF=1:GOTO 320
  30. 300 IF BF=1 THEN LC=LC+1:BF=0
  31. 310 GOTO 360
  32. 320 IF CH$ >= "a" AND CH$ <= "z" THEN CH$=CHR$(ASC(CH$)-32)
  33. 330 IF LC=3 AND CH$=";" THEN LC=4:GOTO 360
  34. 340 IF LC=1 THEN LB$=LB$+CH$:GOTO 360
  35. 350 IF LC=2 THEN OPC$=OPC$+CH$ ELSE OPD$=OPD$+CH$
  36. 360 NEXT IC
  37. 370 REM
  38. 380 REM *** CONVERT THE OPERATION CODES
  39. 390 REM
  40. 400 IF OPC$<>"LD" THEN 430
  41. 410 GOSUB 1490:IF LEFT$(B$,1)<>"(" THEN B$="("+B$+")"
  42. 420 OPD$=A$+","+B$
  43. 430 IF OPC$<>"STO" THEN 460
  44. 440 GOSUB 1490:IF LEFT$(B$,1)<>"(" THEN B$="("+B$+")"
  45. 450 OPD$=B$+","+A$:OPC$="LD"
  46. 460 IF OPC$="LHLD" THEN OPC$="LD":OPD$="HL,("+OPD$+")"
  47. 470 IF OPC$="LDED" THEN OPC$="LD":OPD$="DE,("+OPD$+")"
  48. 480 IF OPC$="LBCD" THEN OPC$="LD":OPD$="BC,("+OPD$+")"
  49. 490 IF OPC$="SHLD" THEN OPC$="LD":OPD$="("+OPD$+"),HL"
  50. 500 IF OPC$="SDED" THEN OPD$="("+OPD$+"),DE":OPC$="LD"
  51. 510 IF OPC$="SBCD" THEN OPD$="("+OPD$+"),BC":OPC$="LD"
  52. 520 IF OPC$="LDA" THEN OPC$="LD":OPD$="A,("+OPD$+")"
  53. 530 IF OPC$="LDAX" THEN OPC$="LD":GOSUB 1630:OPD$="A,("+OPD$+")"
  54. 540 IF OPC$="STA" THEN OPC$="LD":OPD$="("+OPD$+"),A"
  55. 550 IF OPC$="STAX" THEN OPC$="LD":GOSUB 1630:OPD$="("+OPD$+"),A"
  56. 560 IF (OPC$<>"MOV") AND (OPC$<>"MVI") THEN 600
  57. 570 GOSUB 1490:IF A$="M" THEN A$="(HL)"
  58. 580 IF B$="M" THEN B$="(HL)"
  59. 590 OPC$="LD":OPD$=A$+","+B$
  60. 600 IF OPC$="XRI" THEN OPC$="XOR"
  61. 610 IF OPC$="CP" THEN OPC$="CALL":OPD$="P,"+OPD$
  62. 620 IF OPC$="CZ" THEN OPC$="CALL":OPD$="Z,"+OPD$
  63. 630 IF OPC$="CNZ" THEN OPC$="CALL":OPD$="NZ,"+OPD$
  64. 640 IF OPC$="CC" THEN OPC$="CALL":OPD$="C,"+OPD$
  65. 650 IF OPC$="CNC" THEN OPC$="CALL":OPD$="NC,"+OPD$
  66. 660 IF OPC$="CPO" THEN OPC$="CALL":OPD$="PO,"+OPD$
  67. 670 IF OPC$="CPE" THEN OPC$="CALL":OPD$="PE,"+OPD$
  68. 680 IF OPC$="CM" THEN OPC$="CALL":OPD$="M,"+OPD$
  69. 690 IF (OPC$="CPI") OR (OPC$="CMP") THEN OPC$="CP":GOSUB 1580
  70. 700 IF OPC$="ADD" THEN GOSUB 1490:GOSUB 1580:IF B$="" THEN OPD$="A,"+OPD$
  71. 710 IF OPC$="DAD" THEN OPC$="ADD":GOSUB 1630:OPD$="HL,"+OPD$
  72. 720 IF OPC$="ADI" THEN OPC$="ADD":OPD$="A,"+OPD$
  73. 730 IF OPC$="DAD" THEN OPC$="ADD":OPD$="HL,"+OPD$
  74. 740 IF OPC$="SUI" OR OPC$="SUB" THEN OPC$="SUB":GOSUB 1580
  75. 750 IF OPC$="SBB" OR OPC$="SBI" THEN OPC$="SBC":GOSUB 1580:OPD$="A,"+OPD$
  76. 760 IF OPC$="ACI" THEN OPC$="ADC"
  77. 770 IF OPC$="ADC" THEN OPD$="A,"+OPD$
  78. 780 IF OPC$="DCR" THEN OPC$="DEC":GOSUB 1580
  79. 790 IF OPC$="DCX" THEN OPC$="DEC":GOSUB 1630
  80. 800 IF OPC$="INR" THEN OPC$="INC":GOSUB 1580
  81. 810 IF OPC$="INX" THEN OPC$="INC":GOSUB 1630
  82. 820 IF OPC$="CBIT" THEN OPC$="RES"
  83. 830 IF OPC$="SBIT" THEN OPC$="SET"
  84. 840 IF OPC$="ANA" THEN GOSUB 1580:OPC$="AND"
  85. 850 IF OPC$="ANI" THEN OPC$="AND"
  86. 860 IF (OPC$="ORA") OR (OPC$="ORI") THEN OPC$="OR":GOSUB 1580
  87. 870 IF (OPC$="XRA") OR (OPC$="XRI") THEN OPC$="XOR":GOSUB 1580
  88. 880 IF OPC$="CMC" THEN OPC$="CCF"
  89. 890 IF OPC$="STC" THEN OPC$="SCF"
  90. 900 IF OPC$="CMA" THEN OPC$="CPL"
  91. 910 IF OPC$="RLC" THEN OPC$="RLCA"
  92. 920 IF OPC$="RLC#" THEN OPC$="RLC"
  93. 930 IF OPC$="RRC" THEN OPC$="RRCA"
  94. 940 IF OPC$="RRC#" THEN OPC$="RRC"
  95. 950 IF OPC$="RAL" THEN OPC$="RLA"
  96. 960 IF OPC$="RAR" THEN OPC$="RRA"
  97. 970 IF OPC$="HLT" THEN OPC$="HALT"
  98. 980 IF OPC$="OUT" THEN OPD$="("+OPD$+"),A"
  99. 990 IF OPC$="OT,C" THEN OPC$="OUT":OPD$="(C),"+OPD$
  100. 1000 IF OPC$="IN" THEN OPD$="A,("+OPD$+")"
  101. 1010 IF OPC$="IN,C" THEN OPC$="IN":OPD$=OPD$+",(C)"
  102. 1020 IF OPC$="XTHL" THEN OPC$="EX":OPD$="(SP),HL"
  103. 1030 IF (OPC$="EX") AND (OPD$="AF") THEN OPD$="AF,AF'"
  104. 1040 IF OPC$="XCHG" THEN OPC$="EX":OPD$="DE,HL"
  105. 1050 IF (OPC$="PUSH") OR (OPC$="POP") THEN GOSUB 1630
  106. 1060 IF OPC$="LXI" THEN GOSUB 1490:OPD$=A$:GOSUB 1630:OPD$=OPD$+","+B$:OPC$="LD"
  107. 1070 IF OPC$="LK" THEN OPC$="LD"
  108. 1080 IF OPC$="SPHL" THEN OPC$="LD":OPD$="SP,HL"
  109. 1090 IF OPC$="RZ" THEN OPD$="Z":OPC$="RET"
  110. 1100 IF OPC$="RNZ" THEN OPD$="NZ":OPC$="RET"
  111. 1110 IF OPC$="RC" THEN OPD$="C":OPC$="RET"
  112. 1120 IF OPC$="RNC" THEN OPD$="NC":OPC$="RET"
  113. 1130 IF OPC$="RPE" THEN OPD$="PE":OPC$="RET"
  114. 1140 IF OPC$="RPO" THEN OPD$="PO":OPC$="RET"
  115. 1150 IF OPC$="RP" THEN OPD$="P":OPC$="RET"
  116. 1160 IF OPC$="RM" THEN OPD$="M":OPC$="RET"
  117. 1170 IF OPC$="RST" THEN OPD$="8*("+OPD$+")"
  118. 1180 IF OPC$="JP" THEN OPD$="P,"+OPD$
  119. 1190 IF OPC$="JZ" THEN OPC$="JP":OPD$="Z,"+OPD$
  120. 1200 IF OPC$="JNZ" THEN OPC$="JP":OPD$="NZ,"+OPD$
  121. 1210 IF OPC$="JC" THEN OPC$="JP":OPD$="C,"+OPD$
  122. 1220 IF OPC$="JNC" THEN OPC$="JP":OPD$="NC,"+OPD$
  123. 1230 IF OPC$="JPE" THEN OPC$="JP":OPD$="PE,"+OPD$
  124. 1240 IF OPC$="JPO" THEN OPC$="JP":OPD$="PO,"+OPD$
  125. 1250 IF OPC$="JM" THEN OPC$="JP":OPD$="M,"+OPD$
  126. 1260 IF OPC$="JRZ" THEN OPC$="JR":OPD$="Z,"+OPD$
  127. 1270 IF OPC$="JRNZ" THEN OPC$="JR":OPD$="NZ,"+OPD$
  128. 1280 IF OPC$="JRC" THEN OPC$="JR":OPD$="C,"+OPD$
  129. 1290 IF OPC$="JRNC" THEN OPC$="JR":OPD$="NC,"+OPD$
  130. 1300 IF OPC$="JMP" THEN OPC$="JP"
  131. 1310 IF OPC$="PCHL" THEN OPC$="JP":OPD$="(HL)"
  132. 1320 REM
  133. 1330 REM *** GENERATE THE OUTPUT RECORD
  134. 1340 REM
  135. 1350 IN$=LB$
  136. 1360 IF IN$<>"" AND OPC$<>"MACRO" AND OPC$<>"EQU" THEN IN$=IN$+":"
  137. 1370 IF (LEN(OPC$)>0) OR (LEN(OPD$)>0) OR (LEN(CM$)>0) THEN IN$=IN$+CHR$(9)+OPC$
  138. 1380 IF (LEN(OPD$)>0) OR (LEN(CM$)>0) THEN IN$=IN$+CHR$(9)+OPD$
  139. 1390 IF LEN(CM$)=0 THEN 1430
  140. 1400 IF LEN(OPD$)<8 THEN IN$=IN$+CHR$(9)
  141. 1410 IF LEFT$(CM$,1)<>";" THEN CM$=";"+CM$
  142. 1420 IN$=IN$+CHR$(9)+CM$
  143. 1430 PRINT IN$
  144. 1440 PRINT #2,IN$
  145. 1450 GOTO 90
  146. 1460 REM
  147. 1470 REM *** SPLIT THE OPERANDS
  148. 1480 REM
  149. 1490 A$="":B$="":IF LEN(OPD$)<1 THEN RETURN
  150. 1500 LC=1:QF=-1:FOR IC=1 TO LEN(OPD$)
  151. 1505 IF MID$(OPD$,IC,1)="'" THEN QF=-QF-1
  152. 1510 IF QF AND MID$(OPD$,IC,1)="," THEN LC=2:GOTO 1530
  153. 1520 IF LC=1 THEN A$=A$+MID$(OPD$,IC,1) ELSE B$=B$+MID$(OPD$,IC,1)
  154. 1530 NEXT IC
  155. 1540 RETURN
  156. 1550 REM
  157. 1560 REM *** CHANGE MEMORY REGISTER TO (HL)
  158. 1570 REM
  159. 1580 IF OPD$="M" THEN OPD$="(HL)"
  160. 1590 RETURN
  161. 1600 REM
  162. 1610 REM *** CONVERT REGISTER PAIRS
  163. 1620 REM
  164. 1630 IF OPD$="B" THEN OPD$="BC"
  165. 1640 IF OPD$="H" THEN OPD$="HL"
  166. 1650 IF OPD$="D" THEN OPD$="DE"
  167. 1660 IF OPD$="PSW" THEN OPD$="AF"
  168. 1670 RETURN
  169.