Sorry, ich mus leider noch einmal hier nach Hilfe fragen, bin mit meinem Latein am Ende.
Das Problem: In ca. 20% der Fälle scheint der Raster IRQ nicht richtig initialisiert zu werden. Der Bitmap Map Modus wird eingeschaltet aber der IRQ ab Zeile 186 kommt nicht?
Das kann man auch an der Rahmen farbe sehen. (Siehe shots). Das passiert zufällig an allen 6 möglichen Iterationen des Vorspanns, auch gleich am Anfang.
Ablauf:
- Start im Textmodus
Loop:
- Datei Laden
- Raster IRQ starten Bitmap/Textmodus
- Ausgabe Hires Bitmap und Text, Warten (Press any key)
- Raster IRQ aus, Bitmap Modus an.
-> zu Loop .
Das Ganze wird 6x durchlaufen und funktioniert eigentlich. Ich hätte ja gesagt, dass es am doppelten Umschalten liegen könnte (2x Bitmap an) oder ggf noch ein IRQ kommen könnte. Dazu habe ich Schalter eingebaut, die eine Adress abfragen und dann die IRQ Routinen nichts machen. Dann noch ein Wairtframe (60 lines) eingebaut. Keine Änderung.
Bitte melde dich an, um diesen Anhang zu sehen. Bitte melde dich an, um diesen Anhang zu sehen.
Hier der Code:
Ich bab mal die Kommentare der Vorbilder zusätzlich dringelassen.
;------------------------------------------------
;-- Init Split Gfx mode
;--
RASTERIRQLINE_INITGFX = 0
RASTERIRQLINE_INITTEXT = 186
RASTERLINE_ADR = $D012 ; current raster line
IRQFLAGREG_ADR = $D019 ; interrupt flag reg
frame = $d020 ; frame color
border = $d021 ; border color
InitSplitGfxMode
sei
; set address for own raster IRQ function
lda #<HandleRasterIRQ ; set interrupt vectors, pointing to interrupt service routine below
sta $0314
lda #>HandleRasterIRQ
sta $0315
; set raster line
lda #RASTERIRQLINE_INITGFX ; set rasterline where interrupt shall occur
sta RASTERLINE_ADR
lda $D011 ;Zur Sicherheit auch noch
and #%01111111 ;das höhste Bit für den
sta $D011 ;gewünschten Raster-IRQ löschen
lda $D01A ;IRQs vom VIC-II aktivieren
ora #%00000001
sta $D01A
LDA #%01111111 ; switch off interrupt signals from CIA-1
STA $DC0D
cli
rts
;------------------------------------------------
;-- Exit Split Gfx mode
;--
ExitSplitGfxMode
sei
; set old service routine
lda #<KRNL_IRQ
sta $0314
lda #>KRNL_IRQ
sta $0315
;IRQs vom VIC-II deaktivieren
lda $D01A
and #%11111110
sta $D01A
cli
rts
;------------------------------------------------
;-- Handle Raster IRQ
;--
HandleRasterIRQ
; Check if VIC triggered an interrupt (bit 7=1 of $d019)
lda IRQFLAGREG_ADR
bmi executerasterirq
; Load interrupt control reg. This will clear all interrupts
lda $DC0D
cli ; enable interrupts
jmp KRNL_IRQ
executerasterirq
sta IRQFLAGREG_ADR
lda RASTERLINE_ADR
bne inittxt ; raster is not 0
; is GFX mode at line 0
lda #$00 ; black
sta frame
sta border
jsr InitBitmapMode
; init next raster irq
lda #RASTERIRQLINE_INITTEXT
sta RASTERLINE_ADR
jmp exit
inittxt
lda #$02 ; red
sta frame
sta border
jsr InitTextMode
; init next raster irq
lda #RASTERIRQLINE_INITGFX ; set rasterline where interrupt shall occur
sta RASTERLINE_ADR
exit
pla
tay
pla
tax
pla
rti
;------------------------------------------------
;-- Init bitmap mode
;--
InitBitmapMode
lda $D011 ; bitmap mode on
and #$9f ; %1 00 11111
ora #$20 ; %0 01 00000
sta $D011
lda $D016 ; hires/multicolor mode select
and #$EF ; set hires %11101111
sta $D016
lda $D018
lda #$18 ; select bitmap location. %00011000
sta $D018 ; screen ram at 1*1024 = $0400. bitmap at $2000
lda $DD00 ; select VICII bank in CIA2 PortA
ora #$03 ; %00000011 Bank 0
sta $DD00
rts
;------------------------------------------------
;-- Init text mode
;--
InitTextMode
lda $D011 ; text mode on
and #$9F ; % 10011111 clear ECM BMM
sta $D011
lda $D016 ; multicolor mode off
and #$EF ; % 11101111 clear MCM
sta $D016
lda #$14 ; %0001 010 x see above, screenmem at $0400, charset at $1000
sta $D018
lda $DD00 ; select VICII bank in CIA2 PortA
; and #$FC ; %1111100 (AND not needed, OR below sets all bits)
ora #$03 ; %00000011 Bank 0
sta $DD00
rts