mehrfarbentext.asm

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Ergebnis
;###############################################################################
;# Programm:      Mehrfarbentext anzeigen (Rasterbar mit reversen Text)
;# Dateiname:     mehrfarbentext.asm
;#
;# Assembler:     ACME
;# Assemblierung: acme -f cbm -o mehrfarbentext.prg mehrfarbentext.asm
;#
;# Start mit:     RUN
;#
;# Quelltext:     * Kleinschreibung (bis auf Kommentare)
;#                * nur Leerzeichen, keine Tabulatoren
;#                * Abstand: jeweils 20 Zeichen (Label --> Befehl --> Kommentar)
;#                * Zeilenlänge max. 80 Zeichen
;#
;# Beschreibung:  Zeigt einen mehrfarbigen Text an.
;#
;###############################################################################

; ----- @Basic-Start@ -----

                    *=$0801             ; Basic-Startzeile "10 SYS2061" erzeugen
                    !word +             ; Zeiger auf nächste Basic-Zeile
                    !word 10            ; Basic Zeilennummer
                    !byte $9e           ; Basic-Token für SYS-Befehl
                    !text "2061"        ; Startadresse des Programms: 2061/$080D
                    !byte 0             ; Basic-Zeilenende
+                   !word 0             ; Basic-Programmende

; ----- @Hauptprogramm@ -----
    
                    sei                 ; Interrupts sperren
                    
                    lda #0
                    sta $0286           ; Textfarbe schwarz
                    sta $d020
                    sta $d021           ; Rahmen und Bildschirm schwarz
                    
                    jsr $e544           ; Bildschirm löschen
                    
                    ldy #0              ; Text ausgeben
-                   lda revers_text, y
                    beq textende
                    sta $0400, y
                    iny
                    bne -

textende:           lda #$7f
                    sta $dc0d           ; CIA 1 - Timer aus
                    sta $dd0d           ; CIA 2 - Timer aus
                    
                    lda $dc0d           ; bereits anstehenden CIA 1 IRQ löschen
                    lda $dd0d           ; bereits anstehenden CIA 2 IRQ löschen
                                        
                    lda #$1b            ; MSB-Bit löschen ==> Auslösung des
                    sta $d011           ; Raster-IRQs nur zwischen Zeile 0-255
                    
                    lda #0              ; Rasterzeilen-IRQ bei Rasterzeile 0
                    sta $d012
                    
                    lda #<irq           ; IRQ-Vektor auf eigene Routine umbiegen
                    sta $0314
                    lda #>irq
                    sta $0315
                    
                    lda #1              ; nur Rasterzeileninterrupt zulassen
                    sta $d01a         
                    
                    lda $d019           ; event. anstehenden Raster-IRQ löschen
                    sta $d019
                    
                    cli                 ; Interrupts freigeben
                    
                    jmp *               ; Endlosschleife, warte auf Interrupt
                    
; ----- @Text@ -----                    
                                ;1234567890123456789012345678901234567890
revers_text:        !scrxor $80, "******** ein graustufenverlauf  ********"
                    !scrxor $80, "******** ein roter farbverlauf  ********"
                    !scrxor $80, "******** ein blauer farbverlauf ********"

                    !for i, 1, 20 { !byte $20,$a0 } ; abwechselnd 20 mal
                                                    ; Space und revers Space
  
                    !byte 0                         ; Textende
                    
; ----- @IRQ-Routine@ -----

*=$0900                                 ; neue Page, um Extrazyklen zu vermeiden

irq:                lda $d019           ; Raster-IRQ-Bit löschen
                    sta $d019
                    
                    ldx #0
                    
                    lda #50             ; Warte auf Rasterzeile 50
-                   cmp $d012
                    bne -
                    
loop:               ldy wartezeiten, x  ; Hole Zyklus aus Tabelle und warte,
-                   dey                 ; um Stabilität zu erreichen
                    bne -
                    
                    nop
                    nop
                    lda farbtabelle, x  ; Hintergrundfarbe aus Tabelle
                    sta $d021           ; holen und schreiben
                    
                    inx
                    cpx #4 * 8          ; genau 4 Textzeilen mit je 8 Pixel
                    bne loop
                    
                    lda #0              ; Hintergrundfarbe schwarz
                    sta $d021           ; nach den Textzeilen
                    
                    jmp $ea7e           ; Sprung ans Ende der alten IRQ-Routine

; ----- @Daten@ -----
                    
wartezeiten:        !byte 8, 1, 8, 8, 8, 8, 8, 8
                    !byte 8, 1, 8, 8, 8, 8, 8, 8
                    !byte 8, 1, 8, 8, 8, 8, 8, 8
                    !byte 8, 1, 8, 8, 8, 8, 8, 8

farbtabelle:        !byte 11,12,15,01,01,15,12,0  ; Graustufen
                    !byte 09,02,08,10,15,07,01,0  ; Farbverlauf rot
                    !byte 06,14,03,01,01,03,14,0  ; Farbverlauf blau
                    !byte 03,13,01,13,03,13,05,0  ; Farbverlauf gruen