home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / basic / b-compil.lbr / BCBC.BQS / BCBC.BAS
Encoding:
BASIC Source File  |  1986-07-20  |  19.6 KB  |  329 lines

  1. 1 PRINT"BCBC: copyright (c) 1984, T.N.T. Software, Inc.":PRINT"Portions copyright (c) 1978-1981, Microsoft Corp."
  2. 2 PRINT"Version 1.22: 11-14-84"
  3. 10 GOTO 50
  4. 20 FOR X1=1 TO LEN(X$):X2=ASC(MID$(X$,X1,1))
  5. 30 IF X2>95 THEN X2=X2 AND 95:MID$(X$,X1,1)=CHR$(X2)
  6. 40 NEXT X1:RETURN
  7. 50 DEFINT A-Z
  8. 60 DEF FNS$(A)=MID$(STR$(A),2)
  9. 70 DEF FNP$(A$,B$)=LEFT$(A$,INSTR(A$,B$)-1)
  10. 80 DIM R$(50),L$(10),F(100),V$(500),LN(500),NXT$(9),S(500)
  11. 90 MAX=1000:T$=CHR$(9):FIL=0:Q$="LHLD Z":P$="SHLD Z":H$="LXI H,":D$="LXI D,":B$="LXI B,":PH$="PUSH H":SW$="!XCHG!":S1$="XCHG":I$="!INX H!":I1$="!DAD D!":I2$="DAD D":S$="!DCX H!":IS$="DCX H":E$="!"
  12. 100 DATA PRINT,LPRINT,IF,THEN,GOTO,GOSUB,RETURN,INPUT,RUN,STOP,OPEN,CLOSE
  13. 110 DATA VAL(,STR$(,INKEY$,LEN(,POKE,PEEK(,IPOKE,IPEEK(,VARPTR(,CHR$(,ASC(
  14. 120 DATA STRUCTURE(,DIM,SIZE(,MID$(,LEFT$(,RIGHT$(,STRING$(,CALL,MEM,GET
  15. 130 DATA PUT,LSET,RSET,FOR,NEXT,END
  16. 140 I=1:WHILE (R$(I-1)<>"END"):READ R$(I):I=I+1:WEND
  17. 150 TOKENS=I:U=0
  18. 160 DATA AND,OR,NOT,XOR,MOD
  19. 170 FOR I=1 TO 5:READ L$(I):NEXT
  20. 180 LINE INPUT"NAME OF PROGRAM TO COMPILE (DEFAULT TYPE IS .BAS): ";F$
  21. 190 LINE INPUT"NAME OF DESIRED OUTPUT FILE (TYPE WILL BE .ASM)  : ";O$
  22. 200 IF INSTR(F$,".")<1 THEN F$=F$+".BAS"
  23. 210 IF O$<" " THEN O$=F$
  24. 220 IF INSTR(O$,".") THEN O$=FNP$(O$,".")
  25. 230 O$=O$+".ASM":X$=F$:GOSUB 20:F$=X$::X$=O$:GOSUB 20:O$=X$:
  26. 240 PRINT"DO YOU WANT COMPLETE DOCUMENTATION IN YOUR ASSEMBLER":PRINT"LISTING OUTPUT (Y/N)?";
  27. 250 LINE INPUT C$:X$=C$:GOSUB 20:C$=X$::IF INSTR("YN",C$)<1 THEN 240
  28. 260 LINE INPUT"WHICH DRIVE LETTER IS BCBC.LIB ON: ";LD$:X$=LD$:GOSUB 20:LD$=X$:
  29. 270 IF LEN(LD$)>1 OR LD$>"P" OR LD$<"A" THEN PRINT"!?!":GOTO 260
  30. 280 OPEN"I",1,F$:I=0
  31. 290 IF EOF(1) THEN 320
  32. 300 LINE INPUT #1,L$:IF VAL(L$) THEN LN(I)=VAL(L$):I=I+1
  33. 310 GOTO 290
  34. 320 CLOSE 1
  35. 330 OPEN"I",1,F$:OPEN"O",2,O$
  36. 340 PRINT#2,T$"ORG 0100H ;STANDARD CP/M ORIGIN":PRINT#2,T$"LXI SP,STACK":GOTO 420
  37. 350 IF LEN(U$)<1 THEN RETURN
  38. 360 JX=1:WHILE JX<LEN(U$) AND MID$(U$,JX,1)<=" ":JX=JX+1:WEND
  39. 370 IF JX>1 THEN U$=MID$(U$,JX)
  40. 380 IF LEN(U$)<2 THEN RETURN
  41. 390 JX=LEN(U$):WHILE JX>1 AND MID$(U$,JX,1)<=" ":JX=JX-1:WEND
  42. 400 IF JX<LEN(U$) THEN U$=LEFT$(U$,JX)
  43. 410 RETURN
  44. 420 IF EOF(1) THEN 2970
  45. 430 LINE INPUT #1,L$:L1$="":OLN=LN:LN=VAL(L$)
  46. 440 IF LN THEN W=65:PRINT#2,"I"FNS$(LN)":";:IF C$="Y" THEN PRINT#2,T$";"MID$(L$,INSTR(L$," ")+1):ELSE PRINT#2,""
  47. 450 IF LN>0 THEN L$=MID$(L$,INSTR(L$," ")):LZ=LZ+1:ELSE LN=OLN
  48. 460 IF INSTR(L$,"#ALL") THEN FOR PULL%=0 TO 33:F%(PULL%)=1:NEXT PULL%
  49. 470 IF INSTR(L$,"#ASM")>0 THEN ASM%=1:GOTO 420
  50. 480 IF ASM%<1 THEN 510
  51. 490 IF INSTR(L$,"#ENDASM")>0 THEN ASM%=0:GOTO 420
  52. 500 PRINT #2,L$:GOTO 420
  53. 510 A$=""
  54. 520 L1$="":U$=L$:GOSUB 350:L$=U$:IF L$<=" " THEN 420
  55. 530 IF LEFT$(L$,1)="'" OR INSTR(L$,"REM")=1 THEN 420
  56. 540 I=1:WHILE (INSTR(L$,R$(I))<>1 AND I<=TOKENS):I=I+1:WEND
  57. 550 OK=0:GOSUB 580:IF OK THEN 520
  58. 560 IF L1$>STRING$(LEN(L1$),32) THEN L$=L1$:GOTO 520
  59. 570 GOTO 420
  60. 580 K1=1:K3=0
  61. 590 J=INSTR(K1,L$,":"):IF J THEN FOR K2=1 TO J:K3=ABS(K3-(MID$(L$,K2,1)=CHR$(34))):NEXT
  62. 600 IF J>0 AND K3=1 THEN K1=J+1:GOTO 590
  63. 610 IF J THEN L1$=MID$(L$,J+1):L$=LEFT$(L$,J-1)
  64. 620 IF INSTR(L$,"PRINT")<>1 AND INSTR(L$,"LPRINT")<>1 THEN 840
  65. 630 J=6-(INSTR(L$,"LPRINT")=1):WHILE MID$(L$,J,1)<=" " AND J<LEN(L$):J=J+1:WEND
  66. 640 IF MID$(L$,J,1)<=" " THEN K=J+1:GOTO 670
  67. 650 IF MID$(L$,J,1)<>CHR$(34) THEN 750
  68. 660 J=INSTR(L$,CHR$(34)):K=INSTR(J+1,L$,CHR$(34))
  69. 670 IF K=J+1 THEN IF INSTR(L$,"LPRINT")=1 THEN PRINT#2,T$B$"5":GOTO 730:ELSE IF K=J+1 THEN PRINT#2,T$B$"2":GOTO 730
  70. 680 PRINT#2,T$"JMP I"FNS$(LN)CHR$(W+1):PRINT#2,"I"FNS$(LN)CHR$(W)": DB ";:W=W+1:FOR L=J+1 TO K-1:PRINT#2,FNS$(ASC(MID$(L$,L,1)));:IF (L-J-1) MOD 15=14 AND L<K-1 THEN PRINT#2,"":PRINT#2,T$"DB ";:ELSE IF L<K-1 THEN PRINT#2,",";:ELSE PRINT#2,""
  71. 690 NEXT
  72. 700 PRINT#2,"I"FNS$(LN)CHR$(W)":"H$"I"FNS$(LN)CHR$(W-1):W=W+1
  73. 710 PRINT#2,T$D$FNS$(K-J-1):PRINT#2,T$B$;:IF INSTR(L$,"LPRINT")=1 THEN PRINT#2,"5":ELSE PRINT#2,"2"
  74. 720 PRINT#2,T$"CALL PSTR"
  75. 730 IF INSTR(K,L$,";")<1 THEN PRINT#2,T$"CALL PLNE"
  76. 740 F(0)=1:RETURN
  77. 750 PRINT#2,T$;:IF INSTR(J,L$,"$")<1 THEN 790
  78. 760 K3=INSTR(J,L$,"$"):L2$=MID$(L$,J,K3-J+1):F(0)=1:PRINT#2,Q$L2$"+2!"S1$:PRINT#2,T$Q$MID$(L$,J):PRINT#2,T$B$;:IF INSTR(L$,"LPRINT")=1 THEN PRINT#2,"5":ELSE PRINT#2,"2"
  79. 770 PRINT#2,T$"CALL PSTR":IF INSTR(J,L$,";") THEN RETURN
  80. 780 PRINT#2,T$"CALL PLNE":RETURN
  81. 790 L2$="":K3=J:WHILE (MID$(L$,K3,1)>="A" AND MID$(L$,K3,1)<="Z") OR (MID$(L$,K3,1)>="0" AND MID$(L$,K3,1)<="9"):L2$=L2$+MID$(L$,K3,1):K3=K3+1:WEND
  82. 800 F(1)=1:IF VAL(L2$) THEN PRINT#2,H$L2$:ELSE PRINT#2,Q$L2$
  83. 810 PRINT#2,T$B$;:IF INSTR(L$,"LPRINT")=1 THEN PRINT#2,"5":ELSE PRINT#2,"2"
  84. 820 F(1)=1:PRINT#2,T$"CALL PNUM":IF INSTR(J,L$,";")<1 THEN PRINT#2,T$"CALL PLNE"
  85. 830 RETURN
  86. 840 IF I<>TOKENS THEN 2010
  87. 850 IF INSTR(L$,"++")=1 THEN PRINT#2,T$Q$MID$(L$,3)I$P$MID$(L$,3):RETURN
  88. 860 IF INSTR(L$,"--")=1 THEN PRINT#2,T$Q$MID$(L$,3)S$P$MID$(L$,3):RETURN
  89. 870 U$=FNP$(L$,"="):GOSUB 350:V$=U$:J=0:WHILE (V$(J)<>"" AND V$(J)<>V$ AND J<MAX):J=J+1:WEND
  90. 880 IF V$(J)="" THEN V$(J)=V$
  91. 890 IF INSTR(V$,"$") THEN 1860
  92. 900 J=INSTR(L$,"=")+1:U$=MID$(L$,J):GOSUB 350:V1$=U$:IF V1$>="A" AND V1$<="Z" THEN 930
  93. 910 IF INSTR(V1$,"+")>0 OR INSTR(V1$,"-")>0 OR INSTR(V1$,"*")>0 OR INSTR(V1$,"/")>0 THEN 930
  94. 920 PRINT#2,T$H$V1$:PRINT#2,T$P$V$:RETURN
  95. 930 YES=0:GOSUB 1180:IF YES THEN RETURN
  96. 940 EX=0
  97. 950 K=1:WHILE (MID$(V1$,K,1)>="A" AND MID$(V1$,K,1)<="Z") OR (MID$(V1$,K,1)>="0" AND MID$(V1$,K,1)<="9"):K=K+1:WEND
  98. 960 K1=K:V4=0
  99. 970 IF K1<=LEN(V1$) THEN IF MID$(V1$,K1,1)<=" " THEN K1=K1+1:GOTO 970
  100. 980 V3$=LEFT$(V1$,1):OF=0:IF V3$>="0" AND V3$<="9" THEN OF=1
  101. 990 IF OF=1 THEN PRINT#2,T$H$VAL(V1$)
  102. 1000 V3=0:IF OF=0 AND EX MOD 2=0 AND (MID$(V1$,1,1)="-") THEN V3=1:V2=2
  103. 1010 IF OF=0 AND EX MOD 2=0 AND INSTR(V1$,"NOT")=1 THEN V3=1:V2=7
  104. 1020 IF EX=0 AND V3=1 THEN PRINT#2,T$D$"0"
  105. 1030 IF OF=0 AND V3<>1 THEN PRINT#2,T$Q$LEFT$(V1$,K-1)
  106. 1040 IF V3=1 THEN V3=0:V4=1:K=K1+V2\2:K1=K:GOTO 970
  107. 1050 EX=EX+V4:IF EX MOD 2<>1 THEN 1080
  108. 1060 IF V2=1 THEN PRINT#2,T$I2$:GOTO 1080
  109. 1070 PRINT#2,T$"CALL ARITH"FNS$(V2):F(3+V2)=1
  110. 1080 V2=0:U$=MID$(V1$,K1):GOSUB 350:V2$=LEFT$(U$,1):IF V2$>" " THEN V2=INSTR("+-*/",V2$)
  111. 1090 IF V2<1 THEN L=1:WHILE L<6 AND V2<1:V2=INSTR(U$,L$(L)):V2=-(L+4)*(V2=1):L=L+1:WEND:IF V2<1 AND V2$>" " THEN 2960
  112. 1100 IF V2<1 THEN V1$=MID$(V1$,K1):GOTO 1160
  113. 1110 IF V2>4 THEN K=K1+LEN(L$(V2-4)):ELSE IF V2>0 THEN K=K1+1
  114. 1120 V1$=MID$(V1$,K):K=1:K1=1
  115. 1130 IF EX MOD 2=0 THEN EX=EX+1
  116. 1140 PRINT#2,T$S1$:IF LEN(V1$)>0 THEN WHILE (MID$(V1$,K,1)<=" " AND K<=LEN(V1$)):K=K+1:WEND:V1$=MID$(V1$,K):K=1
  117. 1150 IF V1$>" " THEN 950
  118. 1160 IF V1$>STRING$(LEN(V1$)," ") THEN 2960
  119. 1170 PRINT#2,T$P$LEFT$(L$,J-2):RETURN
  120. 1180 K=1:WHILE INSTR(V1$,R$(K))<>1 AND K<=TOKENS:K=K+1:WEND
  121. 1190 IF K>TOKENS THEN RETURN
  122. 1200 YES=1
  123. 1210 IF R$(K)="VAL(" THEN 1390
  124. 1220 IF R$(K)="STR$(" THEN 1410
  125. 1230 IF R$(K)="LEN(" THEN 1420
  126. 1240 IF R$(K)="PEEK(" THEN 1430
  127. 1250 IF R$(K)="IPEEK(" THEN 1450
  128. 1260 IF R$(K)="VARPTR(" THEN 1470
  129. 1270 IF R$(K)="CHR$(" THEN 1480
  130. 1280 IF R$(K)="ASC(" THEN 1520
  131. 1290 IF R$(K)="LEFT$(" THEN 1530
  132. 1300 IF R$(K)="RIGHT$(" THEN 1600
  133. 1310 IF R$(K)="MID$(" THEN 1660
  134. 1320 IF R$(K)="STRING$(" THEN 1820
  135. 1330 IF R$(K)="INKEY$" THEN 1350
  136. 1340 YES=0:RETURN
  137. 1350 PRINT#1,T$"MVI C,11! CALL 0005! ORA A! JNZ $+12"
  138. 1360 PRINT#1,T$H$"0!"P$V$"+2!JMP $+20"
  139. 1370 PRINT#1,T$"MVI E,255!MVI C,6!CALL 0005!"H$"1!"P$V$"+2!"Q$V$"!MOV M,A"
  140. 1380 RETURN
  141. 1390 F(30)=1:V2$=MID$(V1$,5):V2$=FNP$(V2$,")")
  142. 1400 PRINT#2,T$Q$V2$SW$Q$V2$"+2":PRINT#2,T$"MOV B,H!MOV C,L!CALL ASCBIN":PRINT#2,T$P$V$:RETURN
  143. 1410 F(31)=1:V2$=MID$(V1$,6):U$=FNP$(V2$,")"):GOSUB 350:V2$=U$:PRINT#2,T$D$"Z"V$E$Q$V2$"!CALL STR":RETURN
  144. 1420 V2$=MID$(V1$,5):U$=FNP$(V2$,")"):GOSUB 350:V2$=U$:PRINT#2,T$Q$V2$"+2!"P$V$:RETURN
  145. 1430 V2$=MID$(V1$,6):U$=FNP$(V2$,")"):GOSUB 350:V2$=U$:IF V2$<"A" THEN PRINT#2,T$H$;:ELSE PRINT#2,T$Q$;
  146. 1440 PRINT#2,V2$"!MOV A,M!"H$"0!MOV L,A!"P$V$:RETURN
  147. 1450 V2$=MID$(V1$,7):U$=FNP$(V2$,")"):GOSUB 350:V2$=U$:IF V2$<"A" THEN PRINT#2,T$H$;:ELSE PRINT#2,T$Q$;
  148. 1460 PRINT#2,V2$"!MOV E,M"I$"MOV D,M"SW$P$V$:RETURN
  149. 1470 V2$=MID$(V1$,8):U$=FNP$(V2$,")"):GOSUB 350:V2$=U$:PRINT#2,T$H$"Z"V2$E$P$V$:RETURN
  150. 1480 V2$=MID$(V1$,6):U$=FNP$(V2$,")"):GOSUB 350:V2$=U$:IF MID$(V2$,1,1)<="9" AND MID$(V2$,1,1)>="0" THEN V2=VAL(V2$):GOTO 1500
  151. 1490 PRINT#2,T$Q$V$SW$Q$V2$"!MOV A,L!STAX D":GOTO 1510
  152. 1500 PRINT#2,T$Q$V$"!MVI A,"V2"!MOV M,A"
  153. 1510 PRINT#2,T$H$"1!"P$V$"+2":RETURN
  154. 1520 V2$=MID$(V1$,5):U$=FNP$(V2$,")"):GOSUB 350:V2$=U$:PRINT#2,T$Q$V2$"!MOV A,M!MOV L,A!MOV H,0!"P$V$:RETURN
  155. 1530 F(32)=1:V2$=MID$(V1$,7):U$=FNP$(V2$,")"):GOSUB 350:V2$=U$
  156. 1540 V3$=FNP$(V2$,","):V4$=MID$(V2$,INSTR(V2$,",")+1)
  157. 1550 U$=V4$:GOSUB 350:V4$=U$:U$=V3$:GOSUB 350:V3$=U$
  158. 1560 IF V4$<"A" THEN PRINT#2,T$H$V4$:ELSE PRINT#2,T$Q$V4$
  159. 1570 PRINT#2,T$P$V$"+2"
  160. 1580 IF V$=V3$ THEN RETURN:ELSE PRINT#2,T$PH$
  161. 1590 PRINT#2,T$Q$V$"!MOV D,H!MOV E,L!"Q$V3$"!POP B":PRINT#2,T$"CALL STRMV":RETURN
  162. 1600 F(32)=1:V2$=MID$(V1$,8):U$=FNP$(V2$,")"):GOSUB 350:V2$=U$
  163. 1610 V3$=FNP$(V2$,","):V4$=MID$(V2$,INSTR(V2$,",")+1)
  164. 1620 U$=V4$:GOSUB 350:V4$=U$:U$=V3$:GOSUB 350:V3$=U$
  165. 1630 IF V4$<"A" THEN PRINT#2,T$H$V4$:ELSE PRINT#2,T$Q$V4$
  166. 1640 PRINT#2,T$P$V$"+2"
  167. 1650 PRINT#2,T$PH$E$PH$E$Q$V3$SW$Q$V3$"+2!"I2$:PRINT#2,T$"POP D!MOV A,D!CMA!MOV D,A!MOV A,E!CMA!MOV E,A":PRINT#2,T$"INX D!"I2$SW$Q$V$SW$"POP B":PRINT#2,T$"CALL STRMV":RETURN
  168. 1660 F(32)=1:V2$=MID$(V1$,6):V2$=FNP$(V2$,")")
  169. 1670 V3=INSTR(V2$,","):V4=INSTR(V3+1,V2$,",")
  170. 1680 IF V4=0 THEN 1770
  171. 1690 V3$=LEFT$(V2$,V3-1):V4$=MID$(V2$,V3+1,V4-V3-1):V5$=MID$(V2$,V4+1):U$=V3$:GOSUB 350:V3$=U$:U$=V4$:GOSUB 350:V4$=U$:U$=V5$:GOSUB 350:V5$=U$
  172. 1700 PRINT#2,T$Q$V$E$PH$E$Q$V3$E$PH$
  173. 1710 IF V4$<"A" THEN PRINT#2,T$H$V4$:ELSE PRINT#2,T$Q$V4$
  174. 1720 PRINT#2,T$"POP D"I1$IS$E$PH$
  175. 1730 IF V5$<"A" THEN PRINT#2,T$H$V5$:ELSE PRINT#2,T$Q$V5$
  176. 1740 PRINT#2,T$P$V$"+2"
  177. 1750 PRINT#2,T$PH$E$"POP B!POP H!POP D!CALL STRMV"
  178. 1760 RETURN
  179. 1770 V3$=LEFT$(V2$,V3-1):V4$=MID$(V2$,V3+1):U$=V3$:GOSUB 350:V3$=U$:U$=V4$:GOSUB 350:V4$=U$
  180. 1780 PRINT#2,T$Q$V$E$PH$E$Q$V3$E$PH$
  181. 1790 IF V4$<"A" THEN PRINT#2,T$H$V4$:ELSE PRINT#2,T$Q$V4$
  182. 1800 PRINT#2,T$"POP D"I1$IS$E$PH$
  183. 1810 PRINT#2,T$PH$E$Q$V3$SW$Q$V3$"+2!"I2$:PRINT#2,T$"POP D!MOV A,D!CMA!MOV D,A!MOV A,E!CMA!MOV E,A":PRINT#2,T$"INX D!"I2$I$PH$"!POP B!POP H!POP D":PRINT#2,T$"CALL STRMV":RETURN
  184. 1820 V2$=MID$(V1$,9):V3=INSTR(V2$,","):V3$=MID$(V2$,V3+1):V2$=LEFT$(V2$,V3-1):U$=V2$:GOSUB 350:V2$=U$:U$=LEFT$(V3$,INSTR(V3$,")")-1):GOSUB 350:V3$=U$
  185. 1830 IF V2$>="A" THEN PRINT#2,T$"LHLD "V2$E$P$V$"+2!"S1$:ELSE PRINT#2,T$D$V2$E$H$V2$E$P$V$"+2"
  186. 1840 PRINT#2,T$Q$V$:IF V3$>="A" THEN PRINT#2,T$PH$E$Q$V3$"!MOV A,M!POP H!STA $+4!MVI A,0":ELSE PRINT#2,T$"MVI A,"VAL(V3$)
  187. 1850 PRINT#2,T$"MOV M,A!DCX D"I$"MOV A,D!ORA E!JNZ $-7":RETURN
  188. 1860 J=INSTR(L$,"=")+1:IF J THEN V1$=MID$(L$,J):ELSE 1880
  189. 1870 U$=V1$:GOSUB 350:V1$=U$:YES=0:GOSUB 1180:IF YES THEN RETURN
  190. 1880 J=INSTR(L$,CHR$(34))+1:K=INSTR(J,L$,CHR$(34))-1:IF J=1 AND K=-1 THEN 1930
  191. 1890 IF K<J THEN PRINT#2,T$H$"0!"P$V$"+2":RETURN
  192. 1900 PRINT#2,T$Q$V$
  193. 1910 FOR L=J TO K:PRINT#2,T$"MVI A,"FNS$(ASC(MID$(L$,L,1)));"!MOV M,A":IF L<>K THEN PRINT#2,T$"INX H"
  194. 1920 NEXT:PRINT#2,T$H$K-J+1;E$P$V$"+2":RETURN
  195. 1930 J=INSTR(L$,"=")+1:V2$=MID$(L$,J):K=1:U$=V2$:GOSUB 350:V2$=U$:K=INSTR(V2$,"$"):V3$=LEFT$(V2$,K):V2$=MID$(V2$,K+1):U$=V3$:GOSUB 350:V3$=U$:U$=V2$:GOSUB 350:V2$=U$
  196. 1940 IF V3$=V$ THEN 1990
  197. 1950 PRINT#2,T$Q$V3$"+2!"PH$"!POP B":PRINT#2,T$Q$V$E$S1$:PRINT#2,T$Q$V3$:PRINT#2,T$"CALL STRMV":PRINT#2,T$Q$V3$"+2!"P$V$"+2":F(32)=1:IF V2$<=STRING$(LEN(V2$),32) THEN RETURN
  198. 1960 U$=V2$:GOSUB 350:V2$=U$:IF LEFT$(V2$,1)<>"+" THEN 2960
  199. 1970 V2$=MID$(V2$,2):U$=V2$:GOSUB 350:V2$=U$:K=INSTR(V2$,"$"):V3$=LEFT$(V2$,K):V2$=MID$(V2$,K+1):U$=V3$:GOSUB 350:V3$=U$:U$=V2$:GOSUB 350:V2$=U$:PRINT#2,T$Q$V3$"+2!"PH$"!POP B":PRINT#2,T$Q$V$SW$Q$V$"+2"I1$S1$
  200. 1980 PRINT#2,T$Q$V3$"!CALL STRMV":PRINT#2,T$Q$V3$"+2"SW$Q$V$"+2!"I2$:PRINT#2,T$P$V$"+2"
  201. 1990 IF V2$>STRING$(LEN(V2$),32) THEN 1960
  202. 2000 RETURN
  203. 2010 IF INSTR(L$,"SIZE(")<>1 THEN 2060
  204. 2020 V2$=MID$(L$,6):U$=FNP$(V2$,","):GOSUB 350:UV=VAL(MID$(L$,INSTR(L$,",")+1)):J=0:WHILE (V$(J)<>"" AND V$(J)<>U$ AND J<MAX):J=J+1:WEND
  205. 2030 IF V$(J)=U$ THEN S(J)=UV:RETURN
  206. 2040 IF V$(J)="" THEN V$(J)=U$:S(J)=UV
  207. 2050 RETURN
  208. 2060 IF INSTR(L$,"GOTO")<>1 THEN 2080
  209. 2070 V=VAL(MID$(L$,5)):V$=FNS$(V):PRINT#2,T$"JMP I"V$:RETURN
  210. 2080 IF INSTR(L$,"GOSUB")<>1 THEN 2090:ELSE V=VAL(MID$(L$,6)):V$=FNS$(V):PRINT#2,T$"CALL I"V$:RETURN
  211. 2090 IF INSTR(L$,"RETURN")<>1 THEN 2100:ELSE PRINT#2,T$"RET":RETURN
  212. 2100 IF INSTR(L$,"END")<>1 THEN 2110:ELSE PRINT#2,T$"JMP 000H":RETURN
  213. 2110 IF INSTR(L$,"STOP")<>1 THEN 2120:ELSE PRINT#2,T$"JMP 000H":RETURN
  214. 2120 IF INSTR(L$,"INPUT")<>1 THEN 2170
  215. 2130 U$=MID$(L$,6):GOSUB 350:V$=U$:J=0:WHILE V$(J)<>V$ AND V$(J)<>"" AND J<MAX:J=J+1:WEND:IF V$(J)="" THEN V$(J)=V$
  216. 2140 IF INSTR(V$,"$")>0 THEN 2160
  217. 2150 F(13)=1:PRINT#2,T$"CALL GETNUM":PRINT#2,T$P$V$:RETURN
  218. 2160 PRINT#2,T$Q$V$:PRINT#2,T$S1$:PRINT#2,T$"CALL GETSTR!"P$V$"+2":F(14)=1:RETURN
  219. 2170 IF INSTR(L$,"IF")<>1 THEN 2450
  220. 2180 K1=1:K2=0
  221. 2190 K=INSTR(K1,L$,"THEN"):IF K<1 THEN 2960
  222. 2200 FOR K3=1 TO K:K2=ABS(K2+(MID$(L$,K3,1)=CHR$(34))):NEXT:IF K2 THEN K1=K+1:GOTO 2190
  223. 2210 V1$="":V2$="":V3$=""
  224. 2220 K1=3:WHILE MID$(L$,K1,1)<>"<" AND MID$(L$,K1,1)<>">" AND MID$(L$,K1,1)<>"=":IF MID$(L$,K1,1)>" " THEN V1$=V1$+MID$(L$,K1,1)
  225. 2230 K1=K1+1:WEND
  226. 2240 WHILE MID$(L$,K1,1)<"A" AND (MID$(L$,K1,1)>"9" OR MID$(L$,K1,1)<"0"):IF MID$(L$,K1,1)="<" OR MID$(L$,K1,1)=">" OR MID$(L$,K1,1)="=" THEN V2$=V2$+MID$(L$,K1,1)
  227. 2250 K1=K1+1:WEND
  228. 2260 WHILE K1<K:IF MID$(L$,K1,1)>" " THEN V3$=V3$+MID$(L$,K1,1)
  229. 2270 K1=K1+1:WEND
  230. 2280 IF V1$="" OR V2$="" OR V3$="" THEN 2960
  231. 2290 U$=V1$:GOSUB 350:V1$=U$:U$=V2$:GOSUB 350:V2$=U$:U$=V3$:GOSUB 350:V3$=U$:K3=0:K2=INSTR(V1$,"$"):IF V2$="=" THEN K3=1:IF K2 THEN U$="SC":F(15)=1
  232. 2300 IF V2$="<>" OR V3$="><" THEN K3=2:IF K2 THEN U$="SC4":F(16)=1
  233. 2310 IF V2$="=<" OR V2$="<=" THEN K3=3:IF K2 THEN U$="SC9":F(19)=1
  234. 2320 IF V2$=">=" OR V2$="=>" THEN K3=4:IF K2 THEN U$="SC8":F(18)=1
  235. 2330 IF V2$="<" THEN K3=5:IF K2 THEN U$="SC5":F(17)=1
  236. 2340 IF V2$=">" THEN K3=6:IF K2 THEN U$="SCA":F(20)=1
  237. 2350 IF K3=0 THEN 2960
  238. 2360 IF K2 THEN PRINT#2,T$D$"Z"V1$E$H$"Z"V3$"!CALL "U$:GOTO 2430
  239. 2370 IF MID$(V1$,1,1)<="9" AND MID$(V1$,1,1)>="0" THEN PRINT#2,T$D$V1$:ELSE PRINT#2,T$Q$V1$E$S1$
  240. 2380 IF MID$(V3$,1,1)<="9" AND MID$(V3$,1,1)>="0" THEN PRINT#2,T$H$V3$:ELSE PRINT#2,T$Q$V3$
  241. 2390 IF K3=1 THEN U$="NC":F(21)=1:ELSE IF K3=2 THEN U$="NC1":F(22)=1
  242. 2400 IF K3=3 THEN U$="NC5":F(26)=1:ELSE IF K3=4 THEN U$="NC3":F(24)=1
  243. 2410 IF K3=5 THEN U$="NC2":F(23)=1:ELSE IF K3=6 THEN U$="NC4":F(25)=1
  244. 2420 PRINT#2,T$"CALL "U$
  245. 2430 PRINT#2,T$"ORA A!JZ I"FNS$(LN(LZ))
  246. 2440 L1$=MID$(L$,K+4)+":"+L1$:RETURN
  247. 2450 IF INSTR(L$,"POKE")<>1 THEN 2520
  248. 2460 K1=5
  249. 2470 V1$="":WHILE MID$(L$,K1,1)<"0":K1=K1+1:WEND:V1$=MID$(L$,K1):K1=INSTR(V1$,",")-1:V2$=LEFT$(V1$,K1)
  250. 2480 K1=K1+2:WHILE MID$(V1$,K1,1)<"0":K1=K1+1:WEND:IF K1>1 THEN V1$=MID$(V1$,K1):K1=1:WHILE MID$(V2$,K1,1)<"0":K1=K1+1:WEND:IF K1>1 THEN V2$=LEFT$(V1$,K1)
  251. 2490 IF LEFT$(V2$,1)<"A" THEN PRINT#2,T$D$V2$:ELSE PRINT#2,T$Q$V2$E$S1$
  252. 2500 IF LEFT$(V1$,1)<"A" THEN PRINT#2,T$H$V1$:ELSE PRINT#2,T$Q$V1$
  253. 2510 PRINT#2,T$"MOV A,L!STAX D":RETURN
  254. 2520 IF INSTR(L$,"IPOKE")<>1 THEN 2540
  255. 2530 K1=6:GOSUB 2470:PRINT#2,T$"INX D!MOV A,H!STAX D":RETURN
  256. 2540 IF INSTR(L$,"CALL")<>1 THEN 2580
  257. 2550 XP=5:WHILE MID$(L$,XP,1)<=" ":XP=XP+1:WEND
  258. 2560 IF MID$(L$,XP,1)>="A" THEN XP2=XP+1:WHILE (XP2<LEN(L$) AND MID$(L$,XP2,1)>="0"):XP2=XP2+1:WEND:PRINT#2,T$Q$MID$(L$,XP,XP2-XP)E$"SHLD $+4!CALL 9999":RETURN
  259. 2570 PRINT#2,T$"CALL "VAL(MID$(L$,XP)):RETURN
  260. 2580 IF INSTR(L$,"OPEN")<>1 THEN 2650
  261. 2590 F(28)=1:XP=5:WHILE (MID$(L$,XP,1)>"9" OR MID$(L$,XP,1)<"1") AND XP<LEN(L$):XP=XP+1:WEND:IF XP=LEN(L$) THEN 2960
  262. 2600 FIL=VAL(MID$(L$,XP))
  263. 2610 XP=INSTR(L$,",")+1:IF MID$(L$,XP,1)=CHR$(34) THEN 2630:ELSE FIL$=MID$(L$,XP)
  264. 2620 PRINT#2,T$D$"FCB"FNS$(FIL):PRINT#2,T$Q$FIL$"+2!MOV B,L!"Q$FIL$"!CALL ROPEN":RETURN
  265. 2630 PRINT#2,T$"JMP I"FNS$(LN)CHR$(W+2):W=W+1:PRINT#2,"I"FNS$(LN)CHR$(W)": DB '";:XX=XP+1:WHILE MID$(L$,XX,1)<>CHR$(34):PRINT#2,MID$(L$,XX,1);:XX=XX+1:WEND
  266. 2640 PRINT#2,"'":W=W+1:PRINT#2,"I"FNS$(W)": "H$FNS$(W-1)E$D$"FCB"FNS$(FIL)"!MVI B,"XX-XP-1;"!CALL ROPEN":RETURN
  267. 2650 IF INSTR(L$,"GET")<>1 AND INSTR(L$,"PUT")<>1 THEN 2700
  268. 2660 F(28)=1:FIL=VAL(MID$(L$,4)):IF FIL=0 THEN 2960
  269. 2670 XP=INSTR(L$,","):XP=XP+1:XQ=INSTR(XP,L$,","):U$=MID$(L$,XQ+1):GOSUB 350:BUF$=U$:XX$=MID$(L$,XP,XQ-XP):IF VAL(XX$)<1 THEN 2690
  270. 2680 PRINT#2,T$Q$BUF$"!MOV B,H!MOV C,L":PRINT#2,T$D$"FCB"FNS$(FIL):PRINT#2,T$H$XX$S$"CALL RGET":RETURN
  271. 2690 PRINT#2,T$Q$BUF$"!MOV B,H!MOV C,L":PRINT#2,T$D$"FCB"FNS$(FIL):U$=XX$:GOSUB 350:XX$=U$:PRINT#2,T$Q$XX$S$"CALL R"LEFT$(L$,3):RETURN
  272. 2700 IF INSTR(L$,"CLOSE")<>1 THEN 2740
  273. 2710 F(28)=1
  274. 2720 FIL=VAL(MID$(L$,6)):IF FIL<1 THEN 2960
  275. 2730 PRINT#2,T$D$"FCB"FNS$(FIL)"!CALL FCLOS":RETURN
  276. 2740 IF INSTR(L$,"FOR")<>1 THEN 2930
  277. 2750 U=U+1:Z$=L$:U$=MID$(L$,4,INSTR(L$,"TO")-4):GOSUB 350:L$=U$:I=TOKENS:GOSUB 840:L$=Z$:XP=INSTR(L$,"TO"):XP1=INSTR(L$,"STEP"):NX=U-N-1:NX$=FNS$(U)+CHR$(13)+CHR$(10)+"NXT"+FNS$(U)+":"
  278. 2760 XP=XP+2:WHILE MID$(L$,XP,1)<=" ":XP=XP+1:WEND:U$=MID$(L$,XP):GOSUB 350:Z$=U$:IF Z$<"A" THEN 2780
  279. 2770 IF Z$>="A" THEN 2900:ELSE 2960
  280. 2780 PRINT#2,"FOR"FNS$(U)": "D$VAL(Z$)
  281. 2790 IF XP1 THEN 2810
  282. 2800 F(23)=1:PRINT#2,T$"CALL NC2!ORA A!JNZ NXT"FNS$(U):NXT$(NX)=T$+Q$+V$+I$+P$+V$+"!JMP FOR"+NX$:RETURN
  283. 2810 Z$=MID$(L$,XP1+5):WHILE LEFT$(Z$,1)<=" ":Z$=MID$(Z$,2):WEND:IF LEFT$(Z$,1)="-" THEN 2860
  284. 2820 F(23)=1:PRINT#2,T$"CALL NC2!ORA A!JNZ NXT"FNS$(U)
  285. 2830 IF Z$<"A" THEN IF VAL(Z$)<6 THEN NXT$(NX)=T$+Q$+V$+E$:FOR XP=1 TO VAL(Z$):NXT$(NX)=NXT$(NX)+"INX H!":NEXT XP:NXT$(NX)=NXT$(NX)+P$+V$+"!JMP FOR"+NX$:RETURN
  286. 2840 IF Z$<"A" THEN NXT$(NX)=T$+Q$+V$+E$+D$+Z$+I1$+P$+V$+"!JMP FOR"+NX$:RETURN
  287. 2850 NXT$(NX)=T$+Q$+V$+SW$+Q$+Z$+I1$+P$+V$+"!JMP FOR"+NX$:RETURN
  288. 2860 F(23)=1:PRINT#2,T$"CALL NC4!ORA A!JNZ NXT"FNS$(U)
  289. 2870 IF Z$<"A" THEN IF VAL(Z$)>-6 THEN NXT$(NX)=T$+Q$+V$+E$:FOR XP=1 TO VAL(Z$):NXT$(NX)=NXT$(NX)+IS$+E$:NEXT XP:NXT$(NX)=NXT$(NX)+P$+V$+"!JMP FOR"+NX$:RETURN
  290. 2880 IF Z$<"A" THEN NXT$(NX)=T$+Q$+V$+E$+D$+FNS$(ABS(VAL(Z$)))+SW$+"CALL ARITH2!"+P$+V$+"!JMP FOR"+NX$:F(5)=1:RETURN
  291. 2890 NXT$(NX)=T$+Q$+V$+SW$+Q$+MID$(Z$,2)+"!CALL ARITH2!"+P$+V$+"!JMP FOR"+NX$:F(5)=1:RETURN
  292. 2900 XP=1:WHILE MID$(Z$,XP,1)>="A" AND XP<LEN(Z$):XP=XP+1:WEND:PRINT#2,"FOR"FNS$(U)": "S1$E$Q$MID$(Z$,1,XP)E$S1$
  293. 2910 IF XP1 THEN 2810
  294. 2920 F(23)=1:PRINT#2,T$"CALL NC2!ORA A!JNZ NXT"FNS$(U):NXT$(NX)=T$+Q$+V$+I$+P$+V$+"!JMP FOR"+NX$:RETURN
  295. 2930 IF INSTR(L$,"NEXT")<>1 THEN 2950
  296. 2940 N=N+1:PRINT#2,NXT$(U-N):RETURN
  297. 2950 RETURN
  298. 2960 PRINT"SYNTAX ERROR IN LINE":PRINT LN;L$:END
  299. 2970 PRINT#2,T$"CALL 0000H"
  300. 2980 IF F(28) THEN FOR J=1 TO 3:PRINT#2,"FCB"FNS$(J)": DB"T$;:FOR TOT=1 TO 35:PRINT#2,"0,";:NEXT TOT:PRINT#2,"0":NEXT J
  301. 2990 GOSUB 3020:TOT=0:J=0:WHILE V$(J)<>"":IF INSTR(V$(J),"$") THEN MAX=S(J):IF MAX<1 THEN MAX=80
  302. 3000 IF INSTR(V$(J),"$") THEN TOT=TOT+MAX:J$=FNS$(257+TOT-MAX):PRINT#2,"Z"V$(J)": DW STACK+"J$",0":ELSE PRINT#2,"Z"V$(J)": DW 0"
  303. 3010 J=J+1:WEND:PRINT#2,T$"DS 64":PRINT#2,"STACK:":PRINT#2,"SAREA: DW 0":PRINT#2,T$"END":CLOSE:END
  304. 3020 CLOSE 1:A$=""
  305. 3030 OPEN"I",1,LD$+":BCBC.LIB"
  306. 3040 IF F(1) THEN F(0)=1:F(2)=1
  307. 3050 IF F(12) THEN F(7)=1
  308. 3060 IF F(16) THEN F(15)=1
  309. 3070 IF F(18) THEN F(17)=1
  310. 3080 IF F(19) THEN F(17)=1:F(15)=1
  311. 3090 IF F(20) THEN F(19)=1:F(17)=1:F(15)=1
  312. 3100 IF F(22) OR F(23) THEN F(21)=1
  313. 3110 IF F(24) OR F(25) THEN F(23)=1:F(21)=1
  314. 3120 IF F(26) THEN F(25)=1:F(23)=1:F(21)=1
  315. 3130 IF F(31) THEN F(2)=1
  316. 3140 FOR I=0 TO 33:IF F(I) THEN A=I+1:GOSUB 3160
  317. 3150 NEXT I:RETURN
  318. 3160 WHILE VAL(A$)<A:LINE INPUT #1,A$:WEND
  319. 3170 WHILE VAL(A$)<>A+1:LINE INPUT #1,A$
  320. 3180 IF EOF(1) THEN 3260
  321. 3190 IF C$="N" THEN IF INSTR(A$,";")<1 AND VAL(A$)<1 THEN PRINT#2,A$
  322. 3200 IF C$="Y" THEN IF VAL(A$)<1 THEN PRINT#2,A$
  323. 3210 WEND
  324. 3220 RETURN
  325. 3230 PRINT"ERROR: LIBRARY (BCBC.LIB) NOT FOUND!"
  326. 3240 PRINT"CORRECT YOUR LIBRARY DRIVE LETTER (NOW "LD$"): ";:INPUT LD$
  327. 3250 GOTO 3020
  328. 3260 PRINT"FATAL ERROR: UNEXPECTED END OF LIBRARY (BCBC.LIB)":END
  329.