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")
                                        ; ...