home *** CD-ROM | disk | FTP | other *** search
/ 64'er Special 25 / 64er_Magazin_Sonderheft_25_19xx_Markt__Technik_de.d64 / univ.lader.asm (.txt) < prev    next >
Commodore BASIC  |  2022-10-26  |  12KB  |  565 lines

  1. 10 open 1,8,1,"0:ganz neu.obj"
  2. 12 rem open 2,4
  3. 13 sys 32768; einsprung fuer neuen profiass
  4. 14 ;
  5. 15 ;   ***************************
  6. 16 ;   *   universal-lader  v6   *
  7. 17 ;   *                         *
  8. 18 ;   *     von uwe gerlach     *
  9. 19 ;   *    tel. 06151/316205    *
  10. 20 ;   *     bzw. 06622/3908     *
  11. 21 ;   ***************************
  12. 22 ;
  13. 23 ;
  14. 24 ; zeigt den diskinhalt als menue und
  15. 25 ; startet das ausgewaehlte programm.
  16. 26 ; mit 'univ.lader.init' gekennzeich-
  17. 27 ; nete eintraege werden nicht bear-
  18. 28 ; beitet. byte 22 jedes eintrags
  19. 29 ; enthaelt dazu eine kennung.
  20. 30 ; bytes 23 und 24 enthalten die
  21. 31 ; startadresse fuer maschinencode.
  22. 32 ;
  23. 33 ;
  24. 100 .tit "universal-lader c64 & vc1541 "
  25. 110 .pag 69
  26. 120 .opt o1
  27. 130 ;
  28. 140 *=$0801; anfangsadresse
  29. 150 ;
  30. 200 puffer = $0300
  31. 210 ausgabe = $0400
  32. 220 zeiger = $3b
  33. 230 save = $05f0
  34. 240 fnam = $fb
  35. 250 pointer = $fd
  36. 260 print = $ffd2
  37. 270 chkout = $ffc9
  38. 280 clrch = $ffcc
  39. 290 setfls = $ffba
  40. 300 setnam = $ffbd
  41. 310 open = $ffc0
  42. 320 chkin = $ffc6
  43. 330 input = $ffcf
  44. 340 close = $ffc3
  45. 350 clear = $e544
  46. 360 end = $7000
  47. 370 bildmit = $0400+411+80
  48. 380 bildend = $0700+130
  49. 390 anf =end+2
  50. 400 ram = anf+2
  51. 410 oben = $0400+80+11
  52. 420 load = $ffd5
  53. 430 tpuf = $0277
  54. 500 ;
  55. 510 ;
  56. 520 ; basic - einsprung
  57. 530 ;
  58. 540 .byte $0b,$08,$0a,$00,$9e,$32
  59. 550 .byte $30,$36,$31,$00,$00,$00
  60. 560 ;
  61. 600 nop: nop: nop; platzhalter fuer sprungbefehl
  62. 1000 ;
  63. 1010 ; kanaele oeffnen
  64. 1020 ;
  65. 1050 strt lda #1
  66. 1060 ldx #8
  67. 1070 ldy #15
  68. 1080 jsr setfls; parameter 1,8,15
  69. 1082 lda #0
  70. 1085 jsr setnam; kein name
  71. 1090 jsr open; open 1,8,15
  72. 1250 ;
  73. 1260 ; floppyprogramm kopieren und anstossen
  74. 1270 ;
  75. 1300 ldy #0; offset zum lesen
  76. 1302 sty fnam; ziel-basisadresse beim kopieren
  77. 1350 on ldx #1
  78. 1360 jsr chkout; ausgabe auf befehlskanal
  79. 1400 lda #"m"
  80. 1410 jsr print
  81. 1420 lda #"-"
  82. 1430 jsr print
  83. 1440 lda #"w"
  84. 1450 jsr print
  85. 1460 lda fnam; adresse low
  86. 1470 jsr print
  87. 1480 lda #5; adresse high
  88. 1490 jsr print
  89. 1500 lda #34; anzahl der folgenden bytes
  90. 1510 jsr print
  91. 1520 ;
  92. 1590 ldx #0; zaeheler befehlslaenge
  93. 1600 fuellen lda proganf,y; byte holen und
  94. 1610 jsr print; als datum fuer m-w senden
  95. 1620 iny; offset erhoehen
  96. 1640 cpy #progend-proganf
  97. 1650 beq copyok; falls fertig uebertragen
  98. 1655 inx
  99. 1660 cpx #34; maximalinhalt befehlspuffer
  100. 1670 bne fuellen; falls noch platz
  101. 1691 jsr clrch; befehl ausfuehren
  102. 1692 lda fnam
  103. 1694 clc
  104. 1696 adc #34
  105. 1698 sta fnam; zieladresse erhoehen
  106. 1730 jmp on; und weiter uebertragen
  107. 1790 ;
  108. 1815 copyok jsr clrch; befehl ausfuehren
  109. 1816 ;
  110. 1817 ldx #1
  111. 1819 jsr chkout; ausgabe auf befehlskanal
  112. 1820 lda #"u"
  113. 1830 jsr print
  114. 1840 lda #"c"
  115. 1850 jsr print
  116. 1880 jsr clrch
  117. 2000 ;
  118. 2010 ; bildmaske aufbauen
  119. 2020 ;
  120. 2021 lda #0
  121. 2022 sta $d020; rahmenfarbe
  122. 2023 sta $d021; hintergrundfarbe
  123. 2025 lda #$0e
  124. 2030 sta $0286; schriftfarbe
  125. 2050 jsr clear; bildschirm loeschen
  126. 2060 ldy #0
  127. 2070 ausg lda progend,y
  128. 2080 jsr print
  129. 2085 iny
  130. 2090 cpy #text1-progend
  131. 2100 bne ausg
  132. 2150 clc
  133. 2200 ldx #24; zeile
  134. 2210 ldy #1; spalte
  135. 2220 jsr $e50a; cursor positionieren
  136. 2250 ldy #0
  137. 2260 aus lda text1,y
  138. 2270 jsr print
  139. 2280 iny
  140. 2290 cpy #text2-text1
  141. 2300 bne aus
  142. 2301 ;
  143. 2302 ;kopieren der lade- / startroutine
  144. 2303 ;
  145. 2310 ldy #0; offset
  146. 2311 lda #<text4
  147. 2312 sta fnam
  148. 2313 lda #>text4
  149. 2314 sta fnam+1; zeiger auf quelle
  150. 2315 lda #<$d000-(fin+2-text4)
  151. 2316 sta pointer
  152. 2317 lda #>$d000-(fin+2-text4)
  153. 2318 sta pointer+1; zeiger auf ziel
  154. 2319 copy lda (fnam),y
  155. 2320 sta (pointer),y; kopieren
  156. 2321 iny
  157. 2322 cpy #fin+3-text4
  158. 2324 bne copy
  159. 2325 ;
  160. 2326 ;vorbereiten des rams
  161. 2327 ;
  162. 2330 lda #>ram
  163. 2331 sta pointer+1
  164. 2332 lda #<ram
  165. 2334 sta pointer
  166. 2335 jsr raum; leereintraege erzeugen
  167. 2337 lda #>bildmit
  168. 2339 sta fnam+1
  169. 2340 lda #<bildmit
  170. 2341 sta fnam
  171. 2350 ldx #1
  172. 2360 jsr chkout; ausgabe in kommandokanal
  173. 2370 ldx #0
  174. 2380 kom lda text2,x
  175. 2390 jsr print; befehl "m-r"...
  176. 2395 inx
  177. 2400 cpx #text3-text2
  178. 2410 bne kom
  179. 2420 jsr clrch
  180. 2430 ;
  181. 2440 ;daten von floppy holen
  182. 2445 ;
  183. 2450 ldx #1
  184. 2460 jsr chkin; eingaben von floppy
  185. 2470 ldx #0
  186. 2480 fn jsr input
  187. 2490 jsr wandel
  188. 2500 sta $0400+13,x
  189. 2510 inx
  190. 2520 cpx #18; laenge des disknamens
  191. 2530 bne fn
  192. 2540 jsr input
  193. 2550 jsr wandel
  194. 2560 sta $0400+35
  195. 2570 jsr input
  196. 2580 jsr wandel
  197. 2590 sta $0400+36
  198. 2600 ;
  199. 2610 ; eintraege auf bildschirm und ins ram
  200. 2620 ;
  201. 2740 ;
  202. 2750 ldx #20; position im floppypuffer
  203. 2751 get ldy #0; zeiger speicher
  204. 2752 jsr input; markierung holen
  205. 2753 cmp #$ff; kennung letztes byte
  206. 2754 beq stop; falls ja
  207. 2755 sta (pointer),y; ins ram
  208. 2756 iny: inx
  209. 2758 jsr input; adressbyte holen
  210. 2759 sta (pointer),y; und ins ram
  211. 2760 iny: inx
  212. 2761 jsr input; adressbyte holen
  213. 2762 sta (pointer),y; auch ins ram
  214. 2763 iny: inx
  215. 2768 ;
  216. 2777 trans jsr input; filenamen holen
  217. 2778 sta (pointer),y; ins ram
  218. 2780 jsr wandel
  219. 2790 sta (fnam),y; auf den bildschirm
  220. 2830 inx
  221. 2860 iny
  222. 2870 cpy #19; laenge parameter + filename
  223. 2880 bne trans
  224. 2890 lda pointer; ram-zeiger
  225. 2900 clc
  226. 2910 adc #19; aktualisieren
  227. 2920 sta pointer
  228. 2930 bcc check
  229. 2940 inc pointer+1; ram-zeiger erhoehen
  230. 2950 check lda fnam
  231. 2960 clc
  232. 2970 adc #40; fuer naechste zeile
  233. 2980 sta fnam
  234. 2990 bcc look
  235. 3000 inc fnam+1
  236. 3005 look lda fnam+1
  237. 3010 cmp #>bildend; letzte directoryzeile
  238. 3020 bne get
  239. 3025 lda fnam
  240. 3030 cmp #<bildend; letzte directoryzeile
  241. 3040 bcc get; unbedingter sprung falls kleiner
  242. 3050 ;
  243. 3052 ; weitere eintraege ins ram
  244. 3054 ;
  245. 3060 get1 ldy #0
  246. 3070 trans1 jsr input
  247. 3080 cmp #$ff; letztes byte
  248. 3090 beq stop
  249. 3110 sta (pointer),y; ins ram
  250. 3120 inx
  251. 3130 bne (NULL)1
  252. 3140 jsr lies
  253. 3150 (NULL)1 iny
  254. 3160 cpy #19
  255. 3170 bne trans1
  256. 3180 lda pointer
  257. 3190 clc
  258. 3200 adc #19
  259. 3210 sta pointer
  260. 3220 bcc get1
  261. 3230 inc pointer+1; ram-zeiger erhoehen
  262. 3235 bcs get1; unbedingter sprung
  263. 3240 ;
  264. 3250 stop jsr raum; leereintraege
  265. 3260 jsr clrch; eingabe wieder von tastatur
  266. 3270 lda pointer
  267. 3272 sec
  268. 3274 sbc #<21*19
  269. 3280 sta end
  270. 3290 lda pointer+1
  271. 3300 sbc #>21*19
  272. 3305 sta end+1
  273. 3310 ;
  274. 3320 init lda #<ram
  275. 3330 sta anf
  276. 3340 lda #>ram
  277. 3350 sta anf+1
  278. 3355 ldx #17; <cursor down> vorbereiten
  279. 3360 ;
  280. 3362 ; anzeigen eines ramausschnitts
  281. 3364 ;
  282. 3400 bprnt lda anf
  283. 3410 sta pointer
  284. 3420 lda anf+1
  285. 3430 sta pointer+1; zeiger ins ram
  286. 3440 ;
  287. 3450 ldy #10*19
  288. 3460 lda (pointer),y; markierung holen
  289. 3470 cmp #"n"
  290. 3475 beq quest; zeile ueberspringen
  291. 3477 ;
  292. 3480 lda #>oben
  293. 3485 sta fnam+1
  294. 3490 lda #<oben
  295. 3495 sta fnam; zeiger ins bild
  296. 3499 ;
  297. 3500 zprnt ldy #3
  298. 3510 prnt lda (pointer),y; aus dem ram
  299. 3515 jsr wandel; ascii -> bildschirmcode
  300. 3520 sta (fnam),y;auf den bildschirm
  301. 3530 iny
  302. 3540 cpy #19
  303. 3550 bne prnt
  304. 3590 lda pointer
  305. 3600 clc
  306. 3610 adc #19
  307. 3620 sta pointer
  308. 3630 bcc check2
  309. 3640 inc pointer+1; ram-zeiger erhoehen
  310. 3650 check2 lda fnam
  311. 3660 clc
  312. 3670 adc #40; fuer naechste zeile
  313. 3680 sta fnam
  314. 3690 bcc look2
  315. 3700 inc fnam+1
  316. 3705 look2 lda fnam+1
  317. 3710 cmp #>bildend; letzte directoryzeile
  318. 3720 bne zprnt
  319. 3725 lda fnam
  320. 3730 cmp #<bildend; letzte directoryzeile
  321. 3740 bcc zprnt; unbedingter sprung
  322. 3745 ;
  323. 3750 ldx #3: lda #$21; farbe
  324. 3755 balk sta $d9eb,x; hintergrundfarbe
  325. 3757 inx
  326. 3760 cpx #19
  327. 3765 bne balk
  328. 3800 ;
  329. 3810 ; scrollen und laden
  330. 3820 ;
  331. 3825 jsr clrch
  332. 3830 sty $ba
  333. 3840 abfr jsr $ffe4; get von tastatur
  334. 3850 tax; ergebnis sichern
  335. 3860 quest cpx #145; <cursor up>
  336. 3870 beq upp
  337. 3880 cpx #17; <cursor down>
  338. 3890 beq down
  339. 3900 cpx #"q"; <taste q>
  340. 3910 beq quit
  341. 3912 cpx #3; <run/stop>
  342. 3914 beq quit
  343. 3915 cpx #" "; <space>
  344. 3916 bne cont
  345. 3917 jmp strt
  346. 3920 cont cpx #13; <return>
  347. 3930 bne abfr
  348. 4800 ;
  349. 4810 lda #2; filenummer
  350. 4815 ldx #8; geraeteadresse
  351. 4820 ldy #1; sekundaeradresse
  352. 4825 jsr setfls; parameter setzen
  353. 4827 ;
  354. 4830 lda anf
  355. 4832 clc
  356. 4835 adc #10*19; anfang markierte zeile
  357. 4836 sta pointer; lowbyte zeiger
  358. 4837 tax; nach x bringen
  359. 4838 bcc sname
  360. 4839 inc anf+1; falls uebertrag
  361. 4840 sname lda anf+1
  362. 4841 sta pointer+1; highbyte anfang filename: pha; sichern
  363. 4842 ldy #1: lda #$4c; befehl jmp: sta 2061
  364. 4843 lda (pointer),y: sta 2062: iny
  365. 4844 lda (pointer),y: sta 2063; jmp startadresse
  366. 4845 inx: inx: inx; x auf anfang filename stellen
  367. 4846 pla: tay; highbyte zeiger holen: lda #16; laenge filename
  368. 4847 jsr setnam
  369. 4848 jsr clear; bildschirm loeschen
  370. 4850 lda #0; flag fuer load
  371. 4855 ldx #$ff
  372. 4860 ldy #$ff
  373. 4865 jmp $d000-(fin+2-text4); zur kopierten routine
  374. 4870 ;
  375. 4890 quit lda #1: jsr close: jmp clear
  376. 4940 ;
  377. 4945 upp jmp up
  378. 4947 ;
  379. 4950 down lda anf+1; fensteranfang high
  380. 4960 cmp end+1; ablagespeicherende
  381. 4970 beq down1; falls anf=end
  382. 4975 bcs hilf; falls anf>=end
  383. 4990 down2 lda anf; fensteranfang low
  384. 5000 clc
  385. 5015 adc #19; naechste zeile
  386. 5020 sta anf
  387. 5025 bcc hilf1
  388. 5030 inc anf+1
  389. 5035 jmp bprnt; neuen ausschnitt anzeigen
  390. 5040 down1 lda anf
  391. 5050 cmp end
  392. 5060 bcs hilf
  393. 5065 bcc down2
  394. 5070 ;
  395. 5080 up lda anf+1
  396. 5090 cmp #>ram+19
  397. 5100 bcc hilf
  398. 5105 bne up1
  399. 5110 lda anf
  400. 5120 cmp #<ram+19
  401. 5130 bcc wtr
  402. 5140 up1 lda anf
  403. 5150 sec
  404. 5160 sbc #19; zeile hoch
  405. 5170 sta anf
  406. 5180 bcs hilf1
  407. 5190 dec anf+1
  408. 5200 hilf1 jmp bprnt
  409. 5210 wtr jmp abfr; keine reaktion
  410. 5220 ;
  411. 5230 hilf ldx #145; <cursor up> vorbereiten
  412. 5240 jmp bprnt; und ausschnitt angleichen
  413. 9200 ;
  414. 9210 ; wandlung ascii -> bildschirmcode
  415. 9220 ;
  416. 9250 wandel cmp #63
  417. 9260 bcs zahlen; falls >=63
  418. 9270 rts; ende wandlung, da <63
  419. 9280 zahlen cmp #96
  420. 9290 bcs gross; falls >=96
  421. 9300 sbc #63; (carry ist 0!)
  422. 9310 rts; ende wandlung
  423. 9320 gross sbc #32; (carry ist 1!)
  424. 9330 cmp #128
  425. 9340 bcs sonder; falls >=160
  426. 9350 rts; ende wandlung
  427. 9360 sonder sbc #96
  428. 9370 rts; ende wandlung
  429. 9400 ;
  430. 9410 ; leere eintraege erzeugen
  431. 9420 ;
  432. 9450 raum ldx #0
  433. 9460 ldy #0
  434. 9470 lda #" "
  435. 9480 jsr wandel
  436. 9490 fill sta (pointer),y; ins ram
  437. 9500 inc pointer
  438. 9510 bne jump
  439. 9520 inc pointer+1; highbyte erhoehen
  440. 9530 jump inx
  441. 9540 cpx #10*19; anzahl fuehrender leerzeichen
  442. 9550 bne fill
  443. 9560 rts; ende raum
  444. 9600 ;
  445. 9610 ; neue daten von disk holen
  446. 9620 ;
  447. 9630 lies tya
  448. 9640 pha; y retten
  449. 9645 jsr clrch
  450. 9650 ldx #1
  451. 9660 jsr chkout; zeichen auf kanal # 1
  452. 9670 ldx #0
  453. 9680 komm lda text3,x; "m-e"...
  454. 9690 jsr print
  455. 9700 inx
  456. 9710 cpx #text4-text3
  457. 9720 bne komm
  458. 9722 jsr clrch
  459. 9724 ldx #1
  460. 9726 jsr chkout
  461. 9728 ldx #0
  462. 9730 kmnd lda text2,x; "m-r"...
  463. 9732 jsr print
  464. 9734 inx
  465. 9736 cpx #text3-text2
  466. 9738 bne kmnd
  467. 9739 jsr clrch
  468. 9740 ldx #1
  469. 9750 jsr chkin; daten wieder von floppy
  470. 9755 ldx #0; wiederherstellen
  471. 9760 pla
  472. 9770 tay; y wiederholen
  473. 9790 rts; ende daten holen
  474. 10000 ;
  475. 10010 ;
  476. 10020 ; floppyprogramm
  477. 10030 ;
  478. 11000 proganf jsr $d042; floppy initialisieren
  479. 11005 start lda #18
  480. 11010 sta $06; track
  481. 11020 ldx #0
  482. 11030 stx $07; sektor
  483. 11032 lda #$80; jobcode "block lesen"
  484. 11034 sta $00; als auftrag fuer puffer 0
  485. 11036 warten lda $00; status puffer 0
  486. 11040 bmi warten; falls noch nicht fertig
  487. 11050 cmp #1; fehler abfragen
  488. 11060 bne ende; falls fehler aufgetreten
  489. 11100 ;
  490. 11110 dname lda puffer+144,x; disknamen holen
  491. 11120 sta ausgabe,x; in den ausgabepuffer
  492. 11130 inx
  493. 11140 cpx #20; name und id komplett
  494. 11150 bne dname; weiter falls nein
  495. 11500 ;
  496. 11510 next lda puffer; blockzeiger track
  497. 11520 beq ende; falls naechster track 0
  498. 11530 sta $06
  499. 11540 lda puffer+1; blockzeiger sektor
  500. 11550 sta $07
  501. 11560 lda #$80; jobcode "block lesen"
  502. 11570 sta $00; als auftrag fuer puffer 0
  503. 11580 warten1 lda $00; status puffer 0
  504. 11590 bmi warten1; falls noch nicht fertig
  505. 11700 lda #>puffer+2
  506. 11710 sta zeiger+1
  507. 11720 lda #<puffer+2; anfang 1. eintrag
  508. 11730 nochmal sta zeiger; zeiger in puffer herstellen
  509. 11750 ldy #0
  510. 11760 lda (zeiger),y; filetyp holen
  511. 11770 beq weiter; falls deleted
  512. 11800 ldy #22
  513. 11810 lda (zeiger),y; markierung holen
  514. 11820 bmi weiter; falls markiert
  515. 11830 sta ausgabe,x; sonst in den ausgabepuffer
  516. 11840 inx: iny
  517. 11842 lda (zeiger),y; reservierte bytes
  518. 11844 sta ausgabe,x; holen
  519. 11846 inx: iny
  520. 11847 lda (zeiger),y; (startadresse)
  521. 11848 sta ausgabe,x; und uebergeben
  522. 11849 inx
  523. 11850 ldy #3; anfang filename
  524. 11860 name lda (zeiger),y; zeichen holen
  525. 11870 sta ausgabe,x; und in den ausgabepuffer
  526. 11880 inx
  527. 11890 bne ok; falls puffer noch nicht voll
  528. 11950 sty save; y retten
  529. 11960 rts; rueckgabe der kontrolle ans dos
  530. 13000 ;
  531. 13010 einsprg ldx #0
  532. 13020 ldy save; register wieder herstellen
  533. 13050 ok iny
  534. 13060 cpy #19; letztes zeichen des namens
  535. 13070 bne name; falls noch nicht fertig
  536. 13100 weiter lda zeiger
  537. 13110 clc; addition vorbereiten
  538. 13120 adc #32; zeiger auf naechsten eintrag
  539. 13130 bcc nochmal; falls noch ein eintrag
  540. 13140 bcs next; sonst naechsten block
  541. 13190 ;
  542. 13200 ende lda #$ff; zeichen fuer ende
  543. 13210 sta ausgabe,x; in den ausgabepuffer
  544. 13220 rts; kontrolle zurueck ans dos
  545. 13250 ;
  546. 13395 progend .asc "  disk-name:                   id:      "
  547. 13400 text1 .asc "mit cursortasten auswaehlen und return[158]"
  548. 13410 text2 .asc "m-r": .byte <ausgabe, >ausgabe, 0
  549. 13420 text3 .asc "m-e": .byte <$0500+einsprg-proganf
  550. 13430 .byte >$0500+einsprg-proganf
  551. 14000 ;
  552. 14010 ; lade- / startroutine
  553. 14020 ;
  554. 14050 text4 jsr load
  555. 14060 stx $2d
  556. 14070 sty $2e; zeiger programmende
  557. 14868 jsr $a533
  558. 14870 lda #1: jsr close; ladekanal schliessen
  559. 14875 jsr clear; bildschirm loeschen
  560. 14877 pla: pla
  561. 14880 lda #$a7: pha
  562. 14882 lda #$ae: pha; stack aktualisieren
  563. 14884 fin jmp $a659; korrekter ruecksprung
  564. 14910 .end
  565.