home *** CD-ROM | disk | FTP | other *** search
/ 64'er / 64ER_CD.iso / 86xx / 8612.d64 / precompiler (.txt) < prev    next >
Commodore BASIC  |  1995-03-30  |  9KB  |  321 lines

  1. 1 POKE2053,143:LOAD"PRECOMPILER.H",8,1
  2. 10 REM ********************************
  3. 20 REM *                              *
  4. 30 REM * PROGRAMM: BASIC-PRECOMPILER  *
  5. 40 REM * AUTOR   : HOANG-THAI NGUYEN  *
  6. 50 REM * ADRESSE : HANS-A-KAMPMANN 12 *
  7. 60 REM *           3418 USLAR 1       *
  8. 80 REM *                              *
  9. 90 REM ********************************
  10. 100 :
  11. 110 REM *****************************
  12. 120 REM VARIABLEN & ARRAYS DEFINIEREN
  13. 130 REM *****************************
  14. 140 :
  15. 150 CLR:WO=49183:LI=49286:DE=49444
  16. 160 PM%=500:CM%=100:LM%=100:MM%=100
  17. 170 DIMP$(PM%),CS%(CM%),LT$(LM%),LT%(LM%),M$(1,MM%)
  18. 180 :
  19. 190 REM *************
  20. 200 REM HAUPTPROGRAMM
  21. 210 REM *************
  22. 220 :
  23. 230 POKE53280,6:POKE53281,14:POKE646,0:REM FARBEN SETZEN
  24. 240 PRINT"[147]BASIC-PRECOMPILER":REM TITEL AUSGEBEN
  25. 250 PRINT"WRITTEN BY HOANG-THAI NGUYEN"
  26. 260 :
  27. 270 INPUT"FILE-NAME: ";W$:PRINT:REM FILE-NAME ABFRAGEN
  28. 280 IFW$="*"THENEND:REM PROGRAMMENDE
  29. 290 :
  30. 300 INPUT"NUMBER OF FIRST LINE: ";F%:REM 1.ZEILENNR ABFRAGEN
  31. 310 IFF%<0ORLEN(W$)>16THEN240:REM ABFRAGEN WIEDERHOLEN
  32. 320 :
  33. 330 REM ********************
  34. 340 REM PARAMETER EINSTELLEN
  35. 350 REM ********************
  36. 360 :
  37. 370 REM WENN ASCII, DANN 76, SONST (BSC) 32 IN 49520 SCHREIBEN
  38. 380 POKE49520,76:REM ( BEI TEXTOMAT )
  39. 390 REM ASCII-KODE DER LEERZEICHEN
  40. 400 POKE49544,32:REM BLANK-KODE
  41. 410 POKE49545,160:REM SHIFT-BLANK-KODE
  42. 420 POKE49546,164:REM "[164]"-KODE ( BEI TEXTOMAT )
  43. 430 REM ASCII-KODE DES ENDZEICHEN EINER ZEILE
  44. 440 POKE49340,95:REM "_"-KODE ( BEI TEXTOMAT )
  45. 450 :
  46. 460 REM ***********************
  47. 470 REM FILE OPEN & COMPILIEREN
  48. 480 REM ***********************
  49. 490 :
  50. 500 OPEN2,8,2,W$+",P,R":REM FILE OPEN
  51. 510 GET#2,W$:GET#2,W$:REM PRG-ADRESSE UEBERLESEN
  52. 520 IFST<>0THENCLOSE2:END:REM FILE NOT FOUND
  53. 530 :
  54. 540 PRINT"PASS 1 IN PROGRESS":GOSUB910:REM PASS 1
  55. 550 CLOSE2:REM FILE SCHLIESSEN
  56. 560 :
  57. 570 IFP$(Z%)<>"ENDPROGRAM"THEN500:REM NAECHTES FILE LESEN
  58. 580 :
  59. 590 C%=C%-1:IFC%<0THEN660:REM STACKZEIGER=0
  60. 600 :
  61. 610 PRINT"STACK POINTER =";C%+1:REM STACKZEIGER AUSGEBEN
  62. 620 IF(CS%(C%)AND24576)=8192THENPRINT"REPEAT..?":END
  63. 630 IF(CS%(C%)AND24576)=16384THENPRINT"WHILE..DO..?":END
  64. 640 PRINT"IF..THEN..ELSE..?":END
  65. 650 :
  66. 660 PRINT"PASS 2 IN PROGRESS":GOSUB2650:REM PASS 2
  67. 670 POKE1024,32:REM LINKE OBERE ECKE LOESCHEN
  68. 680 :
  69. 690 REM ************************
  70. 700 REM OBJ-PROGRAMM ABSPEICHERN
  71. 710 REM ************************
  72. 720 :
  73. 730 INPUT"PROGRAM-NAME: ";W$:REM PROGRAMMNAME ABFRAGEN
  74. 740 IFW$="*"THENEND:REM PROGRAMMENDE
  75. 750 IFLEN(W$)>16THEN730:REM PROGRAMMNAME ZU LANG
  76. 760 PRINT"WRITING ";W$:REM PROGRAMM ABSPEICHERN
  77. 770 OPEN1,8,1,W$+",P,W":REM FILE OPEN
  78. 780 PRINT#1,CHR$(1);CHR$(8);:REM PROGRAMMANFANGSADRESSE SCHREIBEN
  79. 790 Z%=0:REM AUF 1.ZEILE ZEIGEN
  80. 800 REM PROGRAMMZEILE SCHREIBEN
  81. 810 IFP$(Z%)<>"ENDPROGRAM"THENPRINT#1,P$(Z%);:Z%=Z%+1:GOTO810
  82. 820 :
  83. 830 REM PROGRAMMENDE
  84. 840 PRINT#1,CHR$(0);CHR$(0);:CLOSE1:END
  85. 850 :
  86. 860 REM ************************
  87. 870 REM >>>> UNTERPROGRAMME <<<<
  88. 880 REM ************************
  89. 890 :
  90. 900 REM ***********
  91. 910 REM DURCHLAUF 1
  92. 920 REM ***********
  93. 930 :
  94. 940 POKE1024,Z%AND255:SYSLI,Z$:T$=Z$:REM ZEILE LESEN
  95. 950 :
  96. 960 IFZ$<>"ENDPROGRAM"THEN1010
  97. 970 :
  98. 980 REM ENDE DES 1.DURCHLAUFEN
  99. 990 P$(Z%)=Z$:RETURN:REM ENDE 1.DURCHLAUFEN
  100. 1000 :
  101. 1010 IFLEFT$(Z$,1)<>"#"THEN1120
  102. 1020 :
  103. 1030 REM LABEL DEFINIEREN
  104. 1040 IFL%>LM%THENC%=1:GOTO3120:REM TABELLE IST VOLL
  105. 1050 Z$=RIGHT$(Z$,LEN(Z$)-1):REM 1.ZEICHEN ELIMINIEREN
  106. 1060 SYSWO,W$,Z$:REM LABEL IN W$
  107. 1070 IFW$=""THENC%=3:GOTO3120
  108. 1080 GOSUB2940:REM PRUEFEN OB LABEL SCHON DEFINIERT WURDE
  109. 1090 IFI>=0THENC%=130:GOTO3120:REM LABEL SCHON DEFINIERT
  110. 1100 LT$(L%)=W$:LT%(L%)=F%+Z%:L%=L%+1:REM LABEL EINTRAGEN
  111. 1110 :
  112. 1120 IFLEFT$(Z$,1)<>"@"THEN1250
  113. 1130 :
  114. 1140 REM MACRO-DEFINITION
  115. 1150 IFM%>MM%THENC%=4:GOTO3120:REM TABELLE IST VOLL
  116. 1160 Z$=RIGHT$(Z$,LEN(Z$)-1):REM 1.ZEICHEN ELIMINIEREN
  117. 1170 SYSWO,W$,Z$:REM MACRO-NAME IN W$
  118. 1180 IFW$=""THENC%=5:GOTO3120
  119. 1190 GOSUB3030:REM IST MACRO DEFINIERT
  120. 1200 IFI>=0THENC%=134:GOTO3120:REM MACRO SCHON DEFINIERT
  121. 1210 IFZ$=""THENC%=135:GOTO3120:REM ZEILE LEER
  122. 1220 M$(0,M%)=W$:M$(1,M%)=Z$:REM MACRO EINTRAGEN
  123. 1230 M%=M%+1:REM ZEILE WEITERPRUEFEN
  124. 1240 :
  125. 1250 IFLEFT$(Z$,1)<>"!"THEN1350
  126. 1260 :
  127. 1270 REM MACRO-AUFRUF
  128. 1280 Z$=RIGHT$(Z$,LEN(Z$)-1):REM 1.ZEICHEN ELIMINIEREN
  129. 1290 SYSWO,W$,Z$:REM MACRO-NAME IN W$
  130. 1300 IFW$=""THENC%=8:GOTO3120
  131. 1310 GOSUB3030:REM IN TABELLE SUCHEN
  132. 1320 IFI<0THENC%=137:GOTO3120:REM MACRO NICHT DEFINIERT
  133. 1330 Z$=M$(1,I)+Z$:T$=Z$:REM MACRO-ZEILE IN Z$
  134. 1340 :
  135. 1350 IFLEFT$(Z$,1)<>"\"THEN1430
  136. 1360 :
  137. 1370 REM TEXTFILES VERKETTEN
  138. 1380 W$=RIGHT$(Z$,LEN(Z$)-1):REM FILE-NAME IN W$
  139. 1390 IFW$=""THENC%=23:GOTO3120
  140. 1400 IFLEN(W$)>16THENC%=24:GOTO3120
  141. 1410 RETURN:REM ENDE
  142. 1420 :
  143. 1430 IFZ$=""THEN940:REM NAECHSTE ZEILE
  144. 1440 SYSWO,W$,Z$:REM WORT IN W$
  145. 1450 IFW$=":"ANDLEN(P$(Z%))=0THEN1430:REM DOPPELPUNKT UEBERLESEN
  146. 1460 IFW$=":"ANDRIGHT$(P$(Z%),1)=":"THEN1430:REM 2.DOPPELPUNKT UEBERLESEN
  147. 1470 :
  148. 1480 IFW$<>"REPEAT"THEN1560
  149. 1490 :
  150. 1500 REM REPEAT
  151. 1510 IFC%>CM%THENC%=10:GOTO3120:REM STACK IST VOLL
  152. 1520 IFP$(Z%)<>""THENZ%=Z%+1:REM ZEILE INKREMENTIEREN
  153. 1530 CS%(C%)=Z%OR8192:C%=C%+1:REM ZEILENNR EINTRAGEN
  154. 1540 GOTO1430:REM NAECHSTES WORT
  155. 1550 :
  156. 1560 IFW$<>"ENDWHILE"THEN1660
  157. 1570 :
  158. 1580 REM ENDWHILE
  159. 1590 C%=C%-1:IFC%<0THENC%=11:GOTO3120
  160. 1600 IF(CS%(C%)AND24576)<>16384THENC%=11:GOTO3120
  161. 1610 I=CS%(C%)AND8191:P$(I)=P$(I)+STR$(F%+Z%+1):REM SPRUNGZEILE SETZEN
  162. 1620 IFZ%>PM%THENC%=12:GOTO3120:REM TEXT ZU LANG
  163. 1630 P$(Z%)="G[207]"+STR$(F%+I):REM SCHLEIFE FORTSETZEN
  164. 1640 Z%=Z%+1:GOTO1430:REM NAECHSTES WORT
  165. 1650 :
  166. 1660 IFW$<>"ENDIF"THEN1740
  167. 1670 :
  168. 1680 REM ENDIF
  169. 1690 C%=C%-1:IFC%<0THENC%=13:GOTO3120
  170. 1700 IFCS%(C%)>8191THENC%=13:GOTO3120
  171. 1710 I=CS%(C%):P$(I)=P$(I)+STR$(F%+Z%):REM SPRUNGZEILE SETZEN
  172. 1720 GOTO1430:REM NAECHSTES WORT
  173. 1730 :
  174. 1740 IFW$<>"CASE"THEN1910
  175. 1750 :
  176. 1760 REM CASE..ENDCASE
  177. 1770 I=Z%:REM CASE-ZEILE MERKEN
  178. 1780 SYSLI,Z$:REM ZEILE LESEN
  179. 1790 SYSWO,W$,Z$:REM KONDITIONSAUSDRUCK IN W$
  180. 1800 IFZ%>PM%THENC%=12:GOTO3120
  181. 1810 P$(Z%)="IF"+W$+"THEN ":REM KONDITIONSABFRAGE
  182. 1820 SYSWO,W$,Z$:IFW$<>"REM"ORW$<>""THENP$(Z%)=P$(Z%)+W$:GOTO1820
  183. 1830 Z%=Z%+1:SYSLI,Z$:REM ZEILE LESEN
  184. 1840 IFZ$="ENDCASE"THEN1880
  185. 1850 P$(Z%-1)=P$(Z%-1)+":G[207]":GOTO1790:REM NAECHSTE ZEILE
  186. 1860 :
  187. 1870 REM ENDCASE
  188. 1880 W$=STR$(F%+Z%):IFZ%>I+1THENFORI=ITOZ%-2:P$(I)=P$(I)+W$:NEXT
  189. 1890 SYSWO,W$,Z$:GOTO1430:REM NAECHSTES WORT
  190. 1900 :
  191. 1910 IFW$<>"UNTIL"THEN2020
  192. 1920 :
  193. 1930 REM UNTIL
  194. 1940 C%=C%-1:IFC%<0THENC%=14:GOTO3120
  195. 1950 IF(CS%(C%)AND24576)<>8192THENC%=14:GOTO3120
  196. 1960 IFZ%>PM%THENC%=12:GOTO3120
  197. 1970 SYSWO,W$,Z$:REM KONDITIONSAUSDRUCK IN W$
  198. 1980 IFW$=""THENC%=15:GOTO3120
  199. 1990 I=CS%(C%)AND8191:P$(Z%)="IF("+W$+")=0THEN"+STR$(F%+I):REMKONDITIONSABFRAGE
  200. 2000 Z%=Z%+1:GOTO1430:REM NAECHSTES WORT
  201. 2010 :
  202. 2020 IFW$<>"WHILE"THEN2160
  203. 2030 :
  204. 2040 REM WHILE
  205. 2050 IFC%>CM%THENC%=10:GOTO3120
  206. 2060 IFP$(Z%)<>""THENZ%=Z%+1
  207. 2070 SYSWO,W$,Z$:REM KONDITIONSAUSDRUCK IN W$
  208. 2080 IFW$=""THENC%=16:GOTO3120
  209. 2090 IFZ%>PM%THENC%=12:GOTO3120
  210. 2100 P$(Z%)="IF("+W$+")=0THEN"
  211. 2110 SYSWO,W$,Z$:REM NAECHSTES WORT IN W$
  212. 2120 IFW$<>"DO"THENC%=17:GOTO3120
  213. 2130 CS%(C%)=Z%OR16384:C%=C%+1:REM WHILE-ZEILE EINTRAGEN
  214. 2140 Z%=Z%+1:GOTO1430:REM NAECHSTES WORT PRUEFEN
  215. 2150 :
  216. 2160 IFW$<>"REM"THEN2220
  217. 2170 :
  218. 2180 REM KOMMENTAR
  219. 2190 IFLEN(P$(Z%))=0THEN940:REM GANZE ZEILE IGNORIEREN
  220. 2200 Z%=Z%+1:GOTO940:REM NAECHSTE ZEILE
  221. 2210 :
  222. 2220 IFW$<>"IF"THEN2350
  223. 2230 :
  224. 2240 REM IF
  225. 2250 IFC%>CM%THENC%=10:GOTO3120
  226. 2260 SYSWO,W$,Z$:REM KONDITIONSAUSDRUCK IN W$
  227. 2270 IFW$=""THENC%=18:GOTO3120
  228. 2280 IFZ%>PM%THENC%=12:GOTO3120
  229. 2290 P$(Z%)="IF("+W$+")=0THEN"
  230. 2300 CS%(C%)=Z%:C%=C%+1:REM IF-ZEILE EINTRAGEN
  231. 2310 Z%=Z%+1:SYSWO,W$,Z$:REM NAECHSTES WORT IN W$
  232. 2320 IFW$<>"THEN"THENC%=19:GOTO3120
  233. 2330 GOTO1430:REM NAECHSTES WORT
  234. 2340 :
  235. 2350 IFW$<>"ELSE"THEN2460
  236. 2360 :
  237. 2370 REM ELSE
  238. 2380 C%=C%-1:IFC%<0THENC%=20:GOTO3120
  239. 2390 IFCS%(C%)>8191THENC%=20:GOTO3120
  240. 2400 I=CS%(C%):P$(I)=P$(I)+STR$(F%+Z%+1)
  241. 2410 IFZ%>PM%THENC%=12:GOTO3120
  242. 2420 P$(Z%)=P$(Z%)+"G[207]":REM UNBEDINGTER SPRUNG ANHAENGEN
  243. 2430 CS%(C%)=Z%:C%=C%+1:REM ZEILE MERKEN
  244. 2440 Z%=Z%+1:GOTO1430:REM NAECHSTES WORT
  245. 2450 :
  246. 2460 IFW$<>"GOTO"ANDW$<>"GOSUB"THEN2560
  247. 2470 :
  248. 2480 REM GOTO
  249. 2490 IFLEN(P$(Z%))<>0THENW$=" "+W$
  250. 2500 IFZ%>PM%THENC%=12:GOTO3120
  251. 2510 P$(Z%)=P$(Z%)+W$+" "
  252. 2520 IFZ$=""THENC%=21:GOTO3120
  253. 2530 IFLEFT$(Z$,1)=":"THENC%=21:GOTO3120
  254. 2540 SYSWO,W$,Z$:W$=W$+" ":REM SPRUNGMARKE+BLANK
  255. 2550 :
  256. 2560 IFZ%>PM%THENC%=12:GOTO3120
  257. 2570 P$(Z%)=P$(Z%)+W$:REM WORT IN ZEILE EINFUEGEN
  258. 2580 IFZ$<>""THEN1430:REM NAECHSTES WORT
  259. 2590 Z%=Z%+1:GOTO940:REM NAECHSTE ZEILE
  260. 2600 :
  261. 2610 REM ***********
  262. 2620 REM DURCHLAUF 2
  263. 2630 REM ***********
  264. 2640 :
  265. 2650 Z%=0:C%=2049:REM AUF 1.ZEILE ZEIGEN & LINKADRESSE=2049
  266. 2660 POKE1024,Z%AND255:IFP$(Z%)="ENDPROGRAM"THENRETURN:REM ENDE
  267. 2670 :
  268. 2680 Z$=P$(Z%):T$=Z$:P$(Z%)=""
  269. 2690 IFRIGHT$(Z$,1)=":"THENZ$=LEFT$(Z$,LEN(Z$)-1):GOTO2690
  270. 2700 SYSWO,W$,Z$:REM WORT IN W$
  271. 2710 IFW$="GOTO"ORW$="GOSUB"THEN2830:REM GOTO/GOSUB-BEFEHL GEFUNDEN
  272. 2720 P$(Z%)=P$(Z%)+W$:IFZ$<>""THEN2700:REM WEITERPRUEFEN
  273. 2730 :
  274. 2740 REM ZEILE TOKENISIEREN
  275. 2750 SYSDE,P$(Z%):REM ZEILE IN TOKENS UMWANDELN
  276. 2760 C%=C%+5+LEN(P$(Z%)):REM LINKADRESSE BERECHNEN
  277. 2770 L%=INT(C%/256):REM LINKADRESSE HIGH-BYTE
  278. 2780 M%=INT(F%/256):REM ZEILENNR HIGH-BYTE
  279. 2790 REM PROGRAMMZEILE BILDEN
  280. 2800 P$(Z%)=CHR$(C%AND255)+CHR$(L%)+CHR$(F%AND255)+CHR$(M%)+P$(Z%)+CHR$(0)
  281. 2810 Z%=Z%+1:F%=F%+1:GOTO2660:REM NAECHSTE ZEILE
  282. 2820 :
  283. 2830 P$(Z%)=P$(Z%)+W$:REM BEFEHL ANHAENGEN
  284. 2840 SYSWO,W$,Z$:REM SPRUNGMARKE IN W$
  285. 2850 GOSUB2940:REM SPRUNGMARKE IN TABLLE SUCHEN
  286. 2860 IFI<0THENC%=150:GOTO3120
  287. 2870 W$=STR$(LT%(I)):W$=RIGHT$(W$,LEN(W$)-1):REM SPRUNGZEILE IN W$ UMWANDELN
  288. 2880 GOTO2720:REM SPRUNGZEILE ANHAENGEN
  289. 2890 :
  290. 2900 REM ***************
  291. 2910 REM SUCHROUTINE LT$
  292. 2920 REM ***************
  293. 2930 :
  294. 2940 I=0:REM AUF 1.ELEMENT ZEIGEN
  295. 2950 IFW$=LT$(I)THENRETURN:REM WORT GEFUNDEN
  296. 2960 I=I+1:IFI<L%THEN2950:REM WEITERSUCHEN
  297. 2970 I=-1:RETURN:REM WORT NICHT GEFUNDEN
  298. 2980 :
  299. 2990 REM **************
  300. 3000 REM SUCHROUTINE M$
  301. 3010 REM **************
  302. 3020 :
  303. 3030 I=0:REM AUF 1.ELEMENT ZEIGEN
  304. 3040 IFW$=M$(0,I)THENRETURN:REM WORT GEFUNDEN
  305. 3050 I=I+1:IFI<M%THEN3040:REM WEITERSUCHEN
  306. 3060 I=-1:RETURN:REM WORT NICHT GEFUNDEN
  307. 3070 :
  308. 3080 REM **********************
  309. 3090 REM FEHLERMELDUNG AUSGEBEN
  310. 3100 REM **********************
  311. 3110 :
  312. 3120 PRINTT$:IFC%>127THENPRINTW$;:REM TEXTZEILE AUSGEBEN
  313. 3130 RESTORE:FORI=1TOC%AND127:READW$:NEXT:REM TEXT LESEN
  314. 3140 PRINTW$:CLOSE2:END:REM PROGRAMMENDE
  315. 3150 :
  316. 3160 DATA"TABLE OVERFLOW"," REDEFINITION OF LABEL","#?","MACRO TABLE OVERFLOW"
  317. 3170 DATA"@?"," REDEFINITION OF MACRO"," MACRO ?","!?"," UNDEF'D MACRO"
  318. 3180 DATA"STACK OVERFLOW","?WHILE..DO","TEXT TOO LONG","?IF..THEN","?REPEAT"
  319. 3190 DATA"UNTIL ?","WHILE ?","WHILE..?","IF?","IF..?","?IF..THEN"
  320. 3200 DATA"GOTO/GOSUB ?"," UNDEF'D LABEL","?FILE-NAME","FILE-NAME TOO LONG"
  321.