home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er Special 80
/
64er_Magazin_Sonderheft_80_19xx_Markt__Technik_de_Side_B.d64
/
rbs-fertig
< prev
next >
Wrap
Text File
|
2022-10-26
|
18KB
|
1,025 lines
;**********************************
;* RAM - Erweiterung *
;**********************************
; * Bedienung :
; - rl anf.adr,endadr,"name" ->Laden aus RAM an Adresse(inh.von Datei )
; - rs anf.adr,endadr,"name" ->Speichern von Adresse in RAM in Datei
; - rf "name",Fuellzeichen ->Fuellen von Datei mit Fuellzeichen
; - rn "alter Name","neuer N"->Name aendern
; - r$ ->alle Dateinamen u. Adressen auflisten
; * benutzte Zwischenspeicher :
; - von : 61,62 (adr.)
; - bis : 63,64 (adr od ends.)
; - anf.s. : 65,66 (Original)
; 67,68 (umgewandelt)
; - modus : gleich verzweigt
; - Fuellz. : 61 (in ASCII)
; - von : 65,66 (seite)
; - Sp.st.1 : $2f1 (Speicherkonfiguration vor Aufruf)
; - Zw.sp. : 2,3,$b6,$bd,$2f0
;********************************
:komma = $aefd ;auf Komma testen
:getadr = $ad8a ;16-Bit-Zahl in FAC
:adrint = $b7f7 ;Zahl in Y/A ($14/15)
:getzah = $b79b ;8-Bit-Zahl nach X
:intout = $bdcd ;16-Bit-Zahl ausgeben
:chrget = $73 ;Z. aus BASIC-Text
;----------------------------
;{CBM-G} Makros {CBM-M}
;----------------------------
:strout m 1
lda #<@0
ldy #>@0
jsr $ab1e
/
;-----------------------------
;{CBM-G} Programmanfang {CBM-M}
;-----------------------------
;Initialisierung der neuen
; BASIC-Befehle
org 39700
lda #<erw
ldx #>erw
sta $308
stx $309
jmp $e18d ;OK ausgeben
;----------------------------
;BASIC-Erweiterung
:erw
lda $7a ;chrget-Zeiger
ldx $7b ;sichern
sta 2
stx 3
;1.Buchstabe
jsr chrget
cmp #'r ;1.Z. = R ?
beq wb
jmp interpr
:wb
jsr chrget ;2.Zeichen ueberspringen
cmp #'$
bne wz
jmp directory
:wz
jsr chrget ;3.Zeichen = "
sta $bd ;fuer spaetere Abfrage
cmp #'" ;nur Filename ?
bne anfadr
jmp filename2
;-----------------------
;Anfangsadr. holen
:anfadr
jsr getadr ;anf.
jsr adrint ;->Y/A
sty 61 ;low Zwischenspeicher (Zw.sp.)
sta 62 ;high
;Endadr. holen
jsr komma
jsr getadr
jsr adrint
sty 63 ;low Zw.sp.
sta 64 ;high
inc 63 ;auf Grund der Schleifen-
cld ;form (letze Adresse wird
lda #0 ;sonst nicht uebernommen)
adc 64
sta 64
;-------------------------
:filename
jsr chrget ;Anfuehrungszeichen vorh.
cmp #'"
beq filename2
jmp $a7ae ;provoziert Syntax Error
:filename2
ldy #8 ;textt loeschen
:lc
lda #0
sta textt,y
dey
bpl lc
:nextb
ldy #0
:loopb
sty $b6 ;Zw.sp.
jsr chrget ;Name zuende ?
cmp #'"
bne wb1
lda #0 ;ja
sta textt,y
jmp endeb
:wb1
sta textt,y
ldy $b6
iny
cpy #7
bne loopb
:endeb
strout textt
;---------------------------
; Vergleich
lda #0
sta $2f0 ;Zaehler der wievielte Eintrag Name ist
; fuer spaetere Rechnung) - Eintragzaehler
ldx #<verglt
lda #>verglt ;Anfang des Direktory (Dir.)
stx $9e
sta $9f
ldy #1
:vgl
ldx #0
inc $2f0
:loopv
lda verglt,y ;Vergleich
cmp textt,x
bne nvgl
iny ;eingetragener Name zuende ?
lda verglt,y
beq gleich ; ja
:wv
inx ;eingegebener Name zuende ?
lda textt,x
beq nvgl ; ja
jmp loopv
;------------
:nvgl
:loopn
iny ;Y bis Ende des Namen zaehlen
lda verglt,y
cmp #255
bne loopn
:endetest
tya ;Zeiger auf naechsten Namen
clc
cld
adc #8
tay
lda verglt,y
cmp #255 ;Dir. zuende
beq nichtgef
jmp vgl
;------------
:gleich
inx ;eingegebener Name auch zuende ? =>gleich Name im Dir
lda textt,x
beq gef ; ja
jmp nvgl ;naechster Name
:gef
ldy $2f0
:ladr
lda #11
clc
cld
adc $9e ;Zeiger auf Anf.adr. des Files mit entspr. Namen
sta $9e
lda #0
adc $9f ;Ueberlauf add.
sta $9f
dey
beq wgef
lda #6
clc
cld
adc $9e ;Zeiger auf naechsten Name
sta $9e
lda #0
adc $9f ;Ueberlauf add.
sta $9f
jmp ladr ;solange bis Eintragzaehler =0
:wgef ;Name gefunden
strout geft
lda $bd
cmp #'" ;alte oder
beq altew ;neue Werte
jmp wertes
;-------------
:nichtgef ;Name nicht gefunden
strout nichtt
jsr chrget
jmp $a7ae
;-------------------------------
:wertes
;Werte sichern ( in Dir. schreiben)
ldy #0 ;Anf.adr.,Endadr.
:loopwsi
lda 61,y
sta ($9e),y
iny
cpy #4
bne loopwsi
;weiter da Seite noch uebernommen
; werden muss
;-----------------------
;Werte aus Dir. uebernehmen
:altew
ldy #0
:loopws
lda ($9e),y
sta 61,y
iny
cpy #6
bne loopws
;------------------------
:befehlstest
lda 2 ;chrget-Zeiger holen
ldx 3
sta $7a
stx $7b
jsr chrget ;1.Zeichen ueberspringen ( "r" )
jsr chrget
sta $b6
ldy #0 ;Zaehler
:loopcheck
lda $b6
cmp bliste,y
beq weiterch
iny
cpy #5 ;Anzahl der Befehle
bne loopcheck
jmp interpr ;wenn nicht gefunden zu Interpreter
:weiterch
tya
asl ;*2
tay ;da Adr. 2 Byte
lda adrlist,y
sta jump+1
lda adrlist+1,y
sta jump+2
:jump jmp $ffff ;wird modifiziert (Adresse des entsprechenden
; Programmteiles
:interpr lda 2
ldx 3
sta $7a
stx $7b
jmp $a7e4 ;zu normal Inter-
; preterroutine
;---------------------------
;{CBM-G} Modifizierungsroutinen {CBM-M}
;---------------------------
:fuellen
jsr chrget ;1. " ueberspringen
:lg
jsr chrget ;2. Anf.z. suchen , da Zeiger zurueckgest.wurden
cmp #'"
bne lg
jsr chrget
cmp #', ;Zahl nach Namen ?
bne null ; wenn nicht mit 0 fuellen
jsr getzah ;8-Bit-Zahl holen
stx 3
jmp modif
:null
ldx #0
stx 3
:modif
ldy #0
:loopmf
lda modf,y ;kop. lda 3
sta mod1,y ; sta $de00,x
iny
cpy #16
bne loopmf
lda f66
sta mod3+1
;Seiten die gefuellt werden sollen holen
ldy #4 ;Zeiger auf Seite-Low
lda ($9e),y
sta 65 ;in entspr. Stelle schreiben
iny
lda ($9e),y ;Seite-High
sta 66
lda 66
cmp #7 ;8.Programm ? (bis Seite 2047- da letzter Eintrag)
beq p8 ;Anf.s. $700
ldy #21 ;Anfangsseite des naechsten Programmes holen
lda ($9e),y ; bis zu der Seite-1 fuellen
sta 63
iny
lda ($9e),y
sta 64
jmp endef
:p8
lda #<2047 ;Endseite File 8
sta 63
lda #>2047
sta 64
:endef
jsr eingpcl
jmp start ;zu ausfuehrenden Programmteil
;-------------------------------
:schreiben
ldy #0
:loopms
lda mods,y ;kop. lda (61),y
sta mod1,y ; sta $de00,x
iny ; lda 61
cpy #16
bne loopms
lda s62
sta mod3+1
jsr eingpcl
jmp start
;-------------------------------
:lesen
ldy #0
:loopml
lda modl,y ;kop. lda $de00,x
sta mod1,y ; sta (61),y
iny ; lda 61
cpy #16
bne loopml
lda l62
sta mod3+1
jsr eingpcl
jmp start
;-------------------------------
:tauschen
ldy #0
:loopmt
lda modt,y ;kop. lda (61),y
sta mod1,y ; sta 3
iny ; ...
cpy #16
bne loopmt
lda t62
sta mod3+1
jmp start
;------------------------
;{CBM-G} RAM-Erweiterung {CBM-M}
;{CBM-G} 1) beschreiben {CBM-M}
;{CBM-G} 2) lesen {CBM-M}
;{CBM-G} 3) fuellen {CBM-M}
;------------------------
:start
sei
lda 1
sta $2f1
and #%11111110 ;BASIC-ROM auf RAM
sta 1
;Seite berechnen ( da in $dffe Bit 0-5
; (und in $dfff Bit 3-7 benutzt wird)
jsr seiteber
;Seite beschreiben
:copys
ldx 67
ldy 68
stx $dffe
sty $dfff
ldx #0 ;Zaehler ob Seite
;voll
:loopsc
stx 2
ldy #0 ; {CBM-G}lesen {CBM-G}fuellen
:mod1
lda (61),y ; {CBM-G}lda $de00,x {CBM-G}lda 61
sta $de00,x ; {CBM-G}sta (61),y {CBM-G}sta de00,x
nop
nop
nop
nop
nop
nop
nop
nop
nop
:mod2
lda 61 ;fuer fuellen -> lda 65
cmp 63
bne weiters
:mod3
lda 62 ; -"- -> lda 66
cmp 64
bne weiters
jmp rendes ;wenn gleich -> ende
:weiters
cld
clc
lda #1
adc 61
sta 61
lda #0
adc 62
sta 62
ldx 2
inx
bne loopsc
;naechste Seite berechnen
jsr nextpage
:mout
jmp copys
:rendes
lda $2f1 ;alte Speicherkonf.
sta 1
cli
ldy #0 ;auf Seite 0 -> letzte Seite uebernommen
sty $dffe
sty $dfff
jmp $a7ae ;zur Interpr.-
; schleife
;-----------------------------
;{CBM-G} Rename {CBM-M}
;-----------------------------
:rename
;Zeiger $9e auf Anfang Filename setzen
lda $9e
sec
cld
sbc #10
sta $9e
lda $9f
sbc #0
sta $9f
jsr chrget ;1."
:lgr
jsr chrget ;2. Anf.z. suchn , da Zeiger zurueckgest.wurden
cmp #'"
bne lgr
jsr chrget
jsr komma
jsr $79 ;vor neuen Namen "
cmp #'"
beq wr
jmp $a7ae ;wenn nicht -> provoziert syntax error
:wr
ldy #0 ;Neuen Namen holen
:loopr
jsr chrget
cmp #'"
beq ender
sta ($9e),y ;und schreiben
iny
cpy #8
bne loopr
:ender
lda #0 ;Endkennzeichen
sta ($9e),y
jsr eingpcl
jmp $a7ae
;-----------------------------
;{CBM-G} Directory {CBM-M}
;-----------------------------
:directory
ldx #<verglt ;Anf.adr. Dir.
lda #>verglt
stx $9e
sta $9f
ldy #1 ;Zaehler fuer Adresse
ldx #8 ;Zaehler fuer Eintraege (Dir. zuende?)
sty 2
stx 3
:loopd1
sec
jsr $fff0 ;Cursorpos. holen
stx 69
ldy #0
clc
jsr $fff0 ; -"- setzen
ldy 2
:loopd2
lda ($9e),y ;Filename ausgeben
cmp #0
beq nextn
jsr $ffd2
iny
jmp loopd2
:nextn
ldy 2
:loopdn
iny ;Y bis Ende des Namen zaehlen
lda verglt,y
cmp #255
bne loopdn
iny ;Y auf Anf.adr.
sty 2
ldx 69 ;Cursorpos. setzen
ldy #10
clc
jsr $fff0
ldy 2 ;Anf.adr. holen
lda verglt,y
tax
iny
lda verglt,y
sty 2
jsr $bdcd ;und ausgeben
ldx 69
ldy #17
clc
jsr $fff0
ldy 2 ;Endadr. holen
iny
lda verglt,y
tax
iny
lda verglt,y
iny
iny ;Y auf naechsten Namen
iny
iny
sty 2
jsr $bdcd ;und ausgeben
lda #13 ;naechste Zeile
jsr $ffd2
dec 3 ;Dir. zuende ?
bne loopd1 ;nein
jsr eingpcl
jmp $a7ae
;-----------------------------
;{CBM-G} Unterprogramme {CBM-M}
;-----------------------------
;naechste Seite
:nextpage
cld
clc
lda #1
adc 65
sta 65
lda #0
adc 66
sta 66
;Berechnen der RAM-Seite (um in $dffe/$dfff zu schreiben)
:seiteber
stx $2a1 ;X,Y sichern
sty $2a2
ldy #0 ;$bd loeschen
sty $bd
lda 65 ;orig.Zahl in
sta 67 ;Sp.fuer umgew.
lda 66 ;Zahlen
sta 68
asl 68 ;5mal nach links
asl 68 ;verschieben
asl 68 ;(%0000 0111 ->
asl 68 ; %1110 0000 )
asl 68
sta 68
asl 67
rol $bd ;Carry -> $bd
asl 67
rol $bd ; -"-
lsr 67 ;low zurueck
lsr 67
clc
asl $bd
asl $bd
asl $bd
lda $bd
ora 68
sta 68
ldx $2a1
ldy $2a2
rts
;-----------------------------
; Eingabepuffer loeschen
:eingpcl
ldx #58 ;Eing.puffer loeschen
:loopl lda #0
sta $200,x
dex
bne loopl
rts
;-----------------------------
;{CBM-G} Texte und Daten {CBM-M}
;-----------------------------
;----------------------------
;{CBM-G} BASIC-Befehle {CBM-M}
;----------------------------
:bliste b 's,'l,'f,'t,'n
:adrlist w schreiben,lesen,fuellen,tauschen,rename
;----------------------------
;{CBM-G} Daten fuer Modifizierung {CBM-M}
;----------------------------
:mods
lda (61),y
sta $de00,x
nop
nop
nop
nop
nop
nop
nop
nop
nop
lda 61
:s62 b 62
;-----------------
:modl
lda $de00,x
sta (61),y
nop
nop
nop
nop
nop
nop
nop
nop
nop
lda 61
:l62 b 62
;-----------------
:modf
lda 3
sta $de00,x
nop
nop
nop
nop
nop
nop
nop
nop
nop
lda 65
:f66 b 66
;-----------------
:modt
lda (61),y
sta 3
lda $de00,x
sta (61),y
lda 3
sta $de00,x
lda 61
:t62 b 62
;----------------------------
;{CBM-G} Filenamen und Adressen {CBM-M}
;{CBM-G} Directory {CBM-M}
;----------------------------
:textt b 0,0,0,0,0,0,0,0,0 ;von Programm geaendert-aktueller Filename
:geft b " - gefunden ",13,0
:nichtt b " - nicht gefunden ",0
:verglt
b 0
;1.File
b '1,0,0,0,0,0,0,0 ;Filename ( =< 8 Buchst.)
b 0,255 ;Endkennzeichen
b 0,0 ;Startadresse
b 0,0 ;Endadresse
b 0,0 ;Anfangsseite (fest)
;2.File
b 0,'2,0,0,0,0,0,0,0,0,255
b 0,0,0,0
b 0,1 ;256
;3.File
b 0,'3,0,0,0,0,0,0,0,0,255
b 0,0,0,0
b 0,2 ;512
;4.File
b 0,'4,0,0,0,0,0,0,0,0,255
b 0,0,0,0
b 0,3
;5.File
b 0,'5,0,0,0,0,0,0,0,0,255
b 0,0,0,0
b 0,4
;6.File
b 0,'6,0,0,0,0,0,0,0,0,255
b 0,0,0,0
b 0,5
;7.File
b 0,'7,0,0,0,0,0,0,0,0,255
b 0,0,0,0
b 0,6
;8.File
b 0,'8,0,0,0,0,0,0,0,0,255
b 0,0,0,0
b 0,7 ;bis 2047
:letzte b 0,255
;**********************************
;**********************************
;**********************************
;**********************************
;**********************************