Hallo an alle,
ich brauche mal wieder Hilfe für mein Problem.
Wie immer bastle ich immer noch meine mein kleines Adventure. Vor geraumer Zeit kam ich auf die glorreiche Idee das Adventure mit Bilder zu gestallten. Da der Mega65 dafür
schöne Basic-Befehle hat.
Nur hat sich die Freude schnell verflogen. Ich konnte zwar auf die schnelle ein Bild auf den Bildschirm zauberen, auber das bezog immer auf den gesamten Bildschirm.
Habe also gar keine Möglichkeit Text einzugeben. Obwohl stimmt nicht ganz, im Forum hat man mich aufmerksam gemacht auf den Char-Befehl.
Damit läst sich sehr wohl Text auf den Bildschrim zaubern. Aber auch dort war die Freude schnell verflogen. Denn der Char-Befehl malt immer über vorhandenen Grafikdaten.
Also wenn ich einen neuen lesbaren Text haben möchte, mußte vorher mit einen Revers-Space den alten Text übermalen, damit ich eine saubere Stelle bekomme.
Ist für micht nicht die Bestre Lösung.
Dann kam ich auf die Glorreiche Idee einen Split-Screen zu machen, Oben Grafik und unten normler Text-Bildschirm.
Um jetzt hier einen ganzen Roman zu schreiben - hier mal der CODE-vom Assemblerprogramm
!to "split02b.prg",cbm
!cpu m65
; #############################################################
; Adresskonstanten für VIC-II/VIC-IV und CIA-Register (MEGA65/C64)
; #############################################################
irq_alt = $f95c ; MEGA65: Standard-IRQ-Rücksprungadresse
vic_border = $d020 ; Randfarben-Register
vic_background = $d021 ; Hintergrundfarben-Register
vic_raster = $d012 ; Rasterzeilen-Register
vic_yscroll = $d011 ; Y-Scroll-Register (Bildschirm an/aus)
vic_scrollreg = $d016 ; X-Scroll-Register
vic_charset = $d018 ; Zeichensatz-Adresse (Screen+Charset-Base!)
vic_irr = $d019 ; Interrupt-Request-Register
vic_imr = $d01a ; Interrupt-Masken-Register
cia_timer1 = $dc0d ; CIA-Timer-Register
vic4_gfxmode = $d054 ; VIC-IV Grafikmodus-Register
vic4_scrlo = $d060 ; VIC-IV Screenadresse LOW
vic4_scrhi = $d061 ; VIC-IV Screenadresse HIGH
vic4_scrmd = $d062 ; VIC-IV Screenadresse MID
raster1 = 50 ; Start-Rasterzeile für oberen Bereich
raster2 = 150 ; Split: Wechsel von Grafik zu Text (bei Zeile 150)
; Neue Konstanten für die VRAM-Adressen
GFX_BASE = $40000 ; Basisadresse für das Bild
TEXT_BASE = $0800 ; Basisadresse für den Textbildschirm
;------------------------------------------------------------------------------
*=$1600
sei ; interrupts deaktivieren
lda #%01111111 ; alle cia-interruptquellen löschen
sta $dc0d ; cia-1 Interrupt-Control
lda #$1b ; oberes Bit in vic control löschen (Standard)
sta $d011
lda $dc0d ; ausstehende cia1-IRQs bestätigen
lda $dd0d ; ausstehende cia2-IRQs bestätigen
lda #raster1 ; erste Rasterzeile (IRQ Start)
sta $d012
lda #$47 ; VIC-IV aktivieren (Magic-Wert 1)
sta $d02f
lda #$53 ; VIC-IV aktivieren (Magic-Wert 2)
sta $d02f
lda #<irq1 ; IRQ-Vektor auf IRQ1-Routine setzen (Low)
sta $0314
lda #>irq1 ; IRQ-Vektor auf IRQ1-Routine setzen (High)
sta $0315
lda #1 ; Raster-IRQ vom VIC aktivieren (Bit 0 = 1)
sta $d01a
cli ; globale Interrupts wieder zulassen
rts
;------------------------------------------------------------------------------
; Hilfsroutine: IRQ zurücksetzen (sauberer Systemrücksprung)
;------------------------------------------------------------------------------
_unregisterIrq:
sei
lda #%01111111
sta $dc0d
lda #$1b
sta $d011
lda $dc0d
lda $dd0d
lda #<irq_alt ; IRQ-Vektor zurück auf Standard (Low)
sta $0314
lda #>irq_alt ; IRQ-Vektor zurück auf Standard (High)
sta $0315
cli
rts
;------------------------------------------------------------------------------
; IRQ1: Obere Hälfte – Grafikmodus (IFF-Bild) aktivieren
;------------------------------------------------------------------------------
irq1:
jsr _setgraphicsmode ; Wechsel in den Grafikmodus (oberer Bereich)
lda #0 ; Hintergrundfarbe: schwarz
sta vic_background
lda #<irq2 ; IRQ-Vektor auf IRQ2-Routine setzen (Low)
sta $0314
lda #>irq2 ; IRQ-Vektor auf IRQ2-Routine setzen (High)
sta $0315
lda #raster2 ; nächste Rasterzeile (Split bei Zeile 150)
sta $d012
asl $d019 ; VIC-IRQ quittieren (Flag löschen)
jmp irq_alt ; Rücksprung an Standard-IRQ
;------------------------------------------------------------------------------
; IRQ2: Untere Hälfte – Textmodus aktivieren
;------------------------------------------------------------------------------
irq2:
jsr _settextmode ; Wechsel in den Textmodus
lda #6 ; Hintergrundfarbe: blau
sta vic_background
lda #<irq1 ; IRQ-Vektor zurück zu IRQ1 (Low)
sta $0314
lda #>irq1 ; IRQ-Vektor zurück zu IRQ1 (High)
sta $0315
lda #raster1 ; Rasterzeile für nächsten IRQ (zurück zum oberen Bereich)
sta $d012
asl $d019
jmp irq_alt
;------------------------------------------------------------------------------
; _setgraphicsmode: Grafikmodus aktivieren – Anzeige des IFF-Bildes
;------------------------------------------------------------------------------
_setgraphicsmode:
; Grafikmodus aktivieren (Wert $80 als Beispiel; ggf. anpassen)
lda #$80
sta vic4_gfxmode
lda #<GFX_BASE ; Low-Byte
sta vic4_scrlo
lda #>GFX_BASE ; High-Byte
sta vic4_scrhi
lda #$00 ; MID-Register auf 0 setzen
sta vic4_scrmd
lda #11
sta vic_border
rts
;------------------------------------------------------------------------------
; _settextmode: Textmodus aktivieren – Standard Textbildschirm
;------------------------------------------------------------------------------
_settextmode:
; Grafikmodus deaktivieren = Textmodus aktivieren
lda #$00
sta vic4_gfxmode
; Screen-Pointer setzen – TEXT_BASE/64 (TEXT_BASE = $0800)
lda #<TEXT_BASE ; Low-Byte
sta vic4_scrlo
lda #>TEXT_BASE ; High-Byte
sta vic4_scrhi
lda #$00 ; MID-Register auf 0 setzen
sta vic4_scrmd
lda #11
sta vic_border
rts
Alles anzeigen
Die Ursprungsroutine stammt von einen Rastersplit mit 2 Farben. Diesen Code habe ich dann mit Hilfe von KI auf meine Bedürfnisse angepasst.
Der Grafik-Bereich liegt bei $40000, Text-Bereich bei $0800 (Standart)
Bitte melde dich an, um diesen Anhang zu sehen.
Dann habe ich aber festgestellt, das ich den LOADIFF-Befehl nicht mehr ausführen kann. Denn dieser setzt immer die Basic-Befehle Graphic und Screen vorraus.
Denn sonst gibt es eine Fehlermeldung "screen not oben error"
Wenn ich dann kleines Basic-Programm starte um meine Bilder anzeigen zu lasse,
überlagert der Graphic-Befehl meine Splitscreen-Routine.
Dann gibt es ja noch den Basic-Befehl Bload übrig, der kann Daten an gewünschte Adressen laden.
Aber nun sind aber meine Bilder in das IFF-Format gespeichert, habe sie trotzdem mal mit den Bload nach $40000 geladen.
Ein kurzes aufblinken, aber es hat sich im oberen Bereich nichts geändert.
Jetzt meine Frage, ist die Assemblerroutine so in Ordnung, oder ist da was falsch?
Und wie soll ich meine Bilder speichern, damit ich die nach $40000 laden kann und dann auch sehen kann.
Wenn ihr die Routine Testen wollt mit SYS 5632 starten