home *** CD-ROM | disk | FTP | other *** search
/ 64'er 1986 December / 64er_Magazin_86-12_1986_Markt__Technik_de.d64 / precompiler (.txt) < prev    next >
Commodore BASIC  |  2022-10-26  |  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.