mehrfarbentext.asm
Aus C64-Wiki
Zur Navigation springenZur Suche springen

;############################################################################### ;# 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 Rasterzeilen-Interrupt 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