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 >
Wrap
Commodore BASIC
|
2022-10-26
|
12KB
|
565 lines
10 open 1,8,1,"0:ganz neu.obj"
12 rem open 2,4
13 sys 32768; einsprung fuer neuen profiass
14 ;
15 ; ***************************
16 ; * universal-lader v6 *
17 ; * *
18 ; * von uwe gerlach *
19 ; * tel. 06151/316205 *
20 ; * bzw. 06622/3908 *
21 ; ***************************
22 ;
23 ;
24 ; zeigt den diskinhalt als menue und
25 ; startet das ausgewaehlte programm.
26 ; mit 'univ.lader.init' gekennzeich-
27 ; nete eintraege werden nicht bear-
28 ; beitet. byte 22 jedes eintrags
29 ; enthaelt dazu eine kennung.
30 ; bytes 23 und 24 enthalten die
31 ; startadresse fuer maschinencode.
32 ;
33 ;
100 .tit "universal-lader c64 & vc1541 "
110 .pag 69
120 .opt o1
130 ;
140 *=$0801; anfangsadresse
150 ;
200 puffer = $0300
210 ausgabe = $0400
220 zeiger = $3b
230 save = $05f0
240 fnam = $fb
250 pointer = $fd
260 print = $ffd2
270 chkout = $ffc9
280 clrch = $ffcc
290 setfls = $ffba
300 setnam = $ffbd
310 open = $ffc0
320 chkin = $ffc6
330 input = $ffcf
340 close = $ffc3
350 clear = $e544
360 end = $7000
370 bildmit = $0400+411+80
380 bildend = $0700+130
390 anf =end+2
400 ram = anf+2
410 oben = $0400+80+11
420 load = $ffd5
430 tpuf = $0277
500 ;
510 ;
520 ; basic - einsprung
530 ;
540 .byte $0b,$08,$0a,$00,$9e,$32
550 .byte $30,$36,$31,$00,$00,$00
560 ;
600 nop: nop: nop; platzhalter fuer sprungbefehl
1000 ;
1010 ; kanaele oeffnen
1020 ;
1050 strt lda #1
1060 ldx #8
1070 ldy #15
1080 jsr setfls; parameter 1,8,15
1082 lda #0
1085 jsr setnam; kein name
1090 jsr open; open 1,8,15
1250 ;
1260 ; floppyprogramm kopieren und anstossen
1270 ;
1300 ldy #0; offset zum lesen
1302 sty fnam; ziel-basisadresse beim kopieren
1350 on ldx #1
1360 jsr chkout; ausgabe auf befehlskanal
1400 lda #"m"
1410 jsr print
1420 lda #"-"
1430 jsr print
1440 lda #"w"
1450 jsr print
1460 lda fnam; adresse low
1470 jsr print
1480 lda #5; adresse high
1490 jsr print
1500 lda #34; anzahl der folgenden bytes
1510 jsr print
1520 ;
1590 ldx #0; zaeheler befehlslaenge
1600 fuellen lda proganf,y; byte holen und
1610 jsr print; als datum fuer m-w senden
1620 iny; offset erhoehen
1640 cpy #progend-proganf
1650 beq copyok; falls fertig uebertragen
1655 inx
1660 cpx #34; maximalinhalt befehlspuffer
1670 bne fuellen; falls noch platz
1691 jsr clrch; befehl ausfuehren
1692 lda fnam
1694 clc
1696 adc #34
1698 sta fnam; zieladresse erhoehen
1730 jmp on; und weiter uebertragen
1790 ;
1815 copyok jsr clrch; befehl ausfuehren
1816 ;
1817 ldx #1
1819 jsr chkout; ausgabe auf befehlskanal
1820 lda #"u"
1830 jsr print
1840 lda #"c"
1850 jsr print
1880 jsr clrch
2000 ;
2010 ; bildmaske aufbauen
2020 ;
2021 lda #0
2022 sta $d020; rahmenfarbe
2023 sta $d021; hintergrundfarbe
2025 lda #$0e
2030 sta $0286; schriftfarbe
2050 jsr clear; bildschirm loeschen
2060 ldy #0
2070 ausg lda progend,y
2080 jsr print
2085 iny
2090 cpy #text1-progend
2100 bne ausg
2150 clc
2200 ldx #24; zeile
2210 ldy #1; spalte
2220 jsr $e50a; cursor positionieren
2250 ldy #0
2260 aus lda text1,y
2270 jsr print
2280 iny
2290 cpy #text2-text1
2300 bne aus
2301 ;
2302 ;kopieren der lade- / startroutine
2303 ;
2310 ldy #0; offset
2311 lda #<text4
2312 sta fnam
2313 lda #>text4
2314 sta fnam+1; zeiger auf quelle
2315 lda #<$d000-(fin+2-text4)
2316 sta pointer
2317 lda #>$d000-(fin+2-text4)
2318 sta pointer+1; zeiger auf ziel
2319 copy lda (fnam),y
2320 sta (pointer),y; kopieren
2321 iny
2322 cpy #fin+3-text4
2324 bne copy
2325 ;
2326 ;vorbereiten des rams
2327 ;
2330 lda #>ram
2331 sta pointer+1
2332 lda #<ram
2334 sta pointer
2335 jsr raum; leereintraege erzeugen
2337 lda #>bildmit
2339 sta fnam+1
2340 lda #<bildmit
2341 sta fnam
2350 ldx #1
2360 jsr chkout; ausgabe in kommandokanal
2370 ldx #0
2380 kom lda text2,x
2390 jsr print; befehl "m-r"...
2395 inx
2400 cpx #text3-text2
2410 bne kom
2420 jsr clrch
2430 ;
2440 ;daten von floppy holen
2445 ;
2450 ldx #1
2460 jsr chkin; eingaben von floppy
2470 ldx #0
2480 fn jsr input
2490 jsr wandel
2500 sta $0400+13,x
2510 inx
2520 cpx #18; laenge des disknamens
2530 bne fn
2540 jsr input
2550 jsr wandel
2560 sta $0400+35
2570 jsr input
2580 jsr wandel
2590 sta $0400+36
2600 ;
2610 ; eintraege auf bildschirm und ins ram
2620 ;
2740 ;
2750 ldx #20; position im floppypuffer
2751 get ldy #0; zeiger speicher
2752 jsr input; markierung holen
2753 cmp #$ff; kennung letztes byte
2754 beq stop; falls ja
2755 sta (pointer),y; ins ram
2756 iny: inx
2758 jsr input; adressbyte holen
2759 sta (pointer),y; und ins ram
2760 iny: inx
2761 jsr input; adressbyte holen
2762 sta (pointer),y; auch ins ram
2763 iny: inx
2768 ;
2777 trans jsr input; filenamen holen
2778 sta (pointer),y; ins ram
2780 jsr wandel
2790 sta (fnam),y; auf den bildschirm
2830 inx
2860 iny
2870 cpy #19; laenge parameter + filename
2880 bne trans
2890 lda pointer; ram-zeiger
2900 clc
2910 adc #19; aktualisieren
2920 sta pointer
2930 bcc check
2940 inc pointer+1; ram-zeiger erhoehen
2950 check lda fnam
2960 clc
2970 adc #40; fuer naechste zeile
2980 sta fnam
2990 bcc look
3000 inc fnam+1
3005 look lda fnam+1
3010 cmp #>bildend; letzte directoryzeile
3020 bne get
3025 lda fnam
3030 cmp #<bildend; letzte directoryzeile
3040 bcc get; unbedingter sprung falls kleiner
3050 ;
3052 ; weitere eintraege ins ram
3054 ;
3060 get1 ldy #0
3070 trans1 jsr input
3080 cmp #$ff; letztes byte
3090 beq stop
3110 sta (pointer),y; ins ram
3120 inx
3130 bne (NULL)1
3140 jsr lies
3150 (NULL)1 iny
3160 cpy #19
3170 bne trans1
3180 lda pointer
3190 clc
3200 adc #19
3210 sta pointer
3220 bcc get1
3230 inc pointer+1; ram-zeiger erhoehen
3235 bcs get1; unbedingter sprung
3240 ;
3250 stop jsr raum; leereintraege
3260 jsr clrch; eingabe wieder von tastatur
3270 lda pointer
3272 sec
3274 sbc #<21*19
3280 sta end
3290 lda pointer+1
3300 sbc #>21*19
3305 sta end+1
3310 ;
3320 init lda #<ram
3330 sta anf
3340 lda #>ram
3350 sta anf+1
3355 ldx #17; <cursor down> vorbereiten
3360 ;
3362 ; anzeigen eines ramausschnitts
3364 ;
3400 bprnt lda anf
3410 sta pointer
3420 lda anf+1
3430 sta pointer+1; zeiger ins ram
3440 ;
3450 ldy #10*19
3460 lda (pointer),y; markierung holen
3470 cmp #"n"
3475 beq quest; zeile ueberspringen
3477 ;
3480 lda #>oben
3485 sta fnam+1
3490 lda #<oben
3495 sta fnam; zeiger ins bild
3499 ;
3500 zprnt ldy #3
3510 prnt lda (pointer),y; aus dem ram
3515 jsr wandel; ascii -> bildschirmcode
3520 sta (fnam),y;auf den bildschirm
3530 iny
3540 cpy #19
3550 bne prnt
3590 lda pointer
3600 clc
3610 adc #19
3620 sta pointer
3630 bcc check2
3640 inc pointer+1; ram-zeiger erhoehen
3650 check2 lda fnam
3660 clc
3670 adc #40; fuer naechste zeile
3680 sta fnam
3690 bcc look2
3700 inc fnam+1
3705 look2 lda fnam+1
3710 cmp #>bildend; letzte directoryzeile
3720 bne zprnt
3725 lda fnam
3730 cmp #<bildend; letzte directoryzeile
3740 bcc zprnt; unbedingter sprung
3745 ;
3750 ldx #3: lda #$21; farbe
3755 balk sta $d9eb,x; hintergrundfarbe
3757 inx
3760 cpx #19
3765 bne balk
3800 ;
3810 ; scrollen und laden
3820 ;
3825 jsr clrch
3830 sty $ba
3840 abfr jsr $ffe4; get von tastatur
3850 tax; ergebnis sichern
3860 quest cpx #145; <cursor up>
3870 beq upp
3880 cpx #17; <cursor down>
3890 beq down
3900 cpx #"q"; <taste q>
3910 beq quit
3912 cpx #3; <run/stop>
3914 beq quit
3915 cpx #" "; <space>
3916 bne cont
3917 jmp strt
3920 cont cpx #13; <return>
3930 bne abfr
4800 ;
4810 lda #2; filenummer
4815 ldx #8; geraeteadresse
4820 ldy #1; sekundaeradresse
4825 jsr setfls; parameter setzen
4827 ;
4830 lda anf
4832 clc
4835 adc #10*19; anfang markierte zeile
4836 sta pointer; lowbyte zeiger
4837 tax; nach x bringen
4838 bcc sname
4839 inc anf+1; falls uebertrag
4840 sname lda anf+1
4841 sta pointer+1; highbyte anfang filename: pha; sichern
4842 ldy #1: lda #$4c; befehl jmp: sta 2061
4843 lda (pointer),y: sta 2062: iny
4844 lda (pointer),y: sta 2063; jmp startadresse
4845 inx: inx: inx; x auf anfang filename stellen
4846 pla: tay; highbyte zeiger holen: lda #16; laenge filename
4847 jsr setnam
4848 jsr clear; bildschirm loeschen
4850 lda #0; flag fuer load
4855 ldx #$ff
4860 ldy #$ff
4865 jmp $d000-(fin+2-text4); zur kopierten routine
4870 ;
4890 quit lda #1: jsr close: jmp clear
4940 ;
4945 upp jmp up
4947 ;
4950 down lda anf+1; fensteranfang high
4960 cmp end+1; ablagespeicherende
4970 beq down1; falls anf=end
4975 bcs hilf; falls anf>=end
4990 down2 lda anf; fensteranfang low
5000 clc
5015 adc #19; naechste zeile
5020 sta anf
5025 bcc hilf1
5030 inc anf+1
5035 jmp bprnt; neuen ausschnitt anzeigen
5040 down1 lda anf
5050 cmp end
5060 bcs hilf
5065 bcc down2
5070 ;
5080 up lda anf+1
5090 cmp #>ram+19
5100 bcc hilf
5105 bne up1
5110 lda anf
5120 cmp #<ram+19
5130 bcc wtr
5140 up1 lda anf
5150 sec
5160 sbc #19; zeile hoch
5170 sta anf
5180 bcs hilf1
5190 dec anf+1
5200 hilf1 jmp bprnt
5210 wtr jmp abfr; keine reaktion
5220 ;
5230 hilf ldx #145; <cursor up> vorbereiten
5240 jmp bprnt; und ausschnitt angleichen
9200 ;
9210 ; wandlung ascii -> bildschirmcode
9220 ;
9250 wandel cmp #63
9260 bcs zahlen; falls >=63
9270 rts; ende wandlung, da <63
9280 zahlen cmp #96
9290 bcs gross; falls >=96
9300 sbc #63; (carry ist 0!)
9310 rts; ende wandlung
9320 gross sbc #32; (carry ist 1!)
9330 cmp #128
9340 bcs sonder; falls >=160
9350 rts; ende wandlung
9360 sonder sbc #96
9370 rts; ende wandlung
9400 ;
9410 ; leere eintraege erzeugen
9420 ;
9450 raum ldx #0
9460 ldy #0
9470 lda #" "
9480 jsr wandel
9490 fill sta (pointer),y; ins ram
9500 inc pointer
9510 bne jump
9520 inc pointer+1; highbyte erhoehen
9530 jump inx
9540 cpx #10*19; anzahl fuehrender leerzeichen
9550 bne fill
9560 rts; ende raum
9600 ;
9610 ; neue daten von disk holen
9620 ;
9630 lies tya
9640 pha; y retten
9645 jsr clrch
9650 ldx #1
9660 jsr chkout; zeichen auf kanal # 1
9670 ldx #0
9680 komm lda text3,x; "m-e"...
9690 jsr print
9700 inx
9710 cpx #text4-text3
9720 bne komm
9722 jsr clrch
9724 ldx #1
9726 jsr chkout
9728 ldx #0
9730 kmnd lda text2,x; "m-r"...
9732 jsr print
9734 inx
9736 cpx #text3-text2
9738 bne kmnd
9739 jsr clrch
9740 ldx #1
9750 jsr chkin; daten wieder von floppy
9755 ldx #0; wiederherstellen
9760 pla
9770 tay; y wiederholen
9790 rts; ende daten holen
10000 ;
10010 ;
10020 ; floppyprogramm
10030 ;
11000 proganf jsr $d042; floppy initialisieren
11005 start lda #18
11010 sta $06; track
11020 ldx #0
11030 stx $07; sektor
11032 lda #$80; jobcode "block lesen"
11034 sta $00; als auftrag fuer puffer 0
11036 warten lda $00; status puffer 0
11040 bmi warten; falls noch nicht fertig
11050 cmp #1; fehler abfragen
11060 bne ende; falls fehler aufgetreten
11100 ;
11110 dname lda puffer+144,x; disknamen holen
11120 sta ausgabe,x; in den ausgabepuffer
11130 inx
11140 cpx #20; name und id komplett
11150 bne dname; weiter falls nein
11500 ;
11510 next lda puffer; blockzeiger track
11520 beq ende; falls naechster track 0
11530 sta $06
11540 lda puffer+1; blockzeiger sektor
11550 sta $07
11560 lda #$80; jobcode "block lesen"
11570 sta $00; als auftrag fuer puffer 0
11580 warten1 lda $00; status puffer 0
11590 bmi warten1; falls noch nicht fertig
11700 lda #>puffer+2
11710 sta zeiger+1
11720 lda #<puffer+2; anfang 1. eintrag
11730 nochmal sta zeiger; zeiger in puffer herstellen
11750 ldy #0
11760 lda (zeiger),y; filetyp holen
11770 beq weiter; falls deleted
11800 ldy #22
11810 lda (zeiger),y; markierung holen
11820 bmi weiter; falls markiert
11830 sta ausgabe,x; sonst in den ausgabepuffer
11840 inx: iny
11842 lda (zeiger),y; reservierte bytes
11844 sta ausgabe,x; holen
11846 inx: iny
11847 lda (zeiger),y; (startadresse)
11848 sta ausgabe,x; und uebergeben
11849 inx
11850 ldy #3; anfang filename
11860 name lda (zeiger),y; zeichen holen
11870 sta ausgabe,x; und in den ausgabepuffer
11880 inx
11890 bne ok; falls puffer noch nicht voll
11950 sty save; y retten
11960 rts; rueckgabe der kontrolle ans dos
13000 ;
13010 einsprg ldx #0
13020 ldy save; register wieder herstellen
13050 ok iny
13060 cpy #19; letztes zeichen des namens
13070 bne name; falls noch nicht fertig
13100 weiter lda zeiger
13110 clc; addition vorbereiten
13120 adc #32; zeiger auf naechsten eintrag
13130 bcc nochmal; falls noch ein eintrag
13140 bcs next; sonst naechsten block
13190 ;
13200 ende lda #$ff; zeichen fuer ende
13210 sta ausgabe,x; in den ausgabepuffer
13220 rts; kontrolle zurueck ans dos
13250 ;
13395 progend .asc " disk-name: id: "
13400 text1 .asc "mit cursortasten auswaehlen und return[158]"
13410 text2 .asc "m-r": .byte <ausgabe, >ausgabe, 0
13420 text3 .asc "m-e": .byte <$0500+einsprg-proganf
13430 .byte >$0500+einsprg-proganf
14000 ;
14010 ; lade- / startroutine
14020 ;
14050 text4 jsr load
14060 stx $2d
14070 sty $2e; zeiger programmende
14868 jsr $a533
14870 lda #1: jsr close; ladekanal schliessen
14875 jsr clear; bildschirm loeschen
14877 pla: pla
14880 lda #$a7: pha
14882 lda #$ae: pha; stack aktualisieren
14884 fin jmp $a659; korrekter ruecksprung
14910 .end