basic erweiterung.asm
Aus C64-Wiki
Zur Navigation springenZur Suche springen;############################################################################### ;# Programm: BASIC-Erweiterung mit 2 neuen Befehlen @A und @B ;# Dateiname: basic_erweiterung.asm ;# ;# Assembler: ACME ;# Assemblierung: acme -f cbm -o basic_erweiterung.prg basic_erweiterung.asm ;# ;# Start mit: SYS 49152 ;# ;# Quelltext: * Kleinschreibung (bis auf Kommentare) ;# * nur Leerzeichen, keine Tabulatoren ;# * Abstand: jeweils 20 Zeichen (Label --> Befehl --> Kommentar) ;# * Zeilenlänge max. 80 Zeichen ;# ;# Beschreibung: BASIC-Erweiterung als Wedge-Methode in der ;# Interpreterschleifenvektor-Variante: ;# Befehl: @A Adresse, 16-Bit-Wert ;# Befehl: @B Rahmenfarbe, Hintergrundfarbe ;# ;############################################################################### *=$c000 ; Startadresse des Programms: 49152 ; ----- @Initialisierung@ ----- lda #<start ; Vektor ($0308) der Interpreterschleife sta $0308 ; auf eigene Routine umbiegen lda #>start sta $0309 lda #<$0803 ; Programmende zurücksetzen sta $2d lda #>$0803 sta $2e rts ; Rücksprung zu BASIC ; ----- @neue Interpreterschleife@ ----- start: jsr $0073 ; CHRGET: Byte aus Programm holen cmp #"@" ; auf @ prüfen bne normal ; wenn kein @ --> verzweige nach normal jsr $0073 ; holt weiteres Byte jsr $b113 ; auf Buchstaben prüfen bcc fehler ; nein, dann Syntax-Error ausgeben sbc #65 ; ja, dann 65 subtrahieren ; --> A=0, B=1, C=2, .... asl ; Zahl verdoppeln A=0, B=2, C=4, .... tay ; Y = A lda tabelle+1,y ; Befehlsadresse MSB holen pha ; am Stapel sichern lda tabelle,y ; Befehlsadresse LSB holen pha ; am Stapel sichern jmp $0073 ; holt Byte und führt Befehl aus normal: jsr $0079 ; CHRGOT: letztes Byte auffrischen jmp $a7e7 ; zur alten Interpreterschleife nach dem CHRGET fehler: jmp $af08 ; Fehlermeldung "?SYNTAX ERROR" ausgeben ; ----- @Befehl: @A Adresse, 16Bit-Wert@ ----- befehl_a: jsr $ad8a ; Ausdruck holen jsr $b7f7 ; auf numerisch prüfen ; Selbstmodifizierender Code: sty adresse+1 ; Adresse Low-Byte schreiben sta adresse+2 ; Adresse High-Byte schreiben jsr $aefd ; auf "," prüfen jsr $ad8a ; Ausdruck holen (Wert in Y/A) jsr $b7f7 ; auf numerisch prüfen ldx #1 ; mit High-Byte beginnen adresse: sta $0000,x ; Adresse wir oben modifiziert tya ; Low-Byte dex bpl adresse ; beim 3. Durchlauf verlassen jmp $a7ae ; zurück in die alte Interpreterschleife ; ----- @Befehl: @B Rahmenfarbe, Hintergrundfarbe@ ----- befehl_b: jsr $ad8a ; Ausdruck holen jsr $b7f7 ; auf numerisch prüfen sty $d020 ; Rahmenfarbe setzen jsr $aefd ; auf "," prüfen jsr $ad8a ; Ausdruck holen jsr $b7f7 ; auf numerisch prüfen sty $d021 ; Hintergrundfarbe setzen jmp $a7ae ; zurück in die alte Interpreterschleife ; ----- @Zeigertabelle der neuen Befehle@ ----- tabelle: !word befehl_a - 1 ; Zeiger Befehl @A minus 1 !word befehl_b - 1 ; Zeiger Befehl @B minus 1 !word $af07 ; Zeiger Befehl @C ("Syntax Error") !word $af07 ; Zeiger Befehl @D ("Syntax Error") !word $af07 ; Zeiger Befehl @E ("Syntax Error") ; ...