Hmmm... wollte auf dem Plus4 den Bildschirm aufteilen wie auf dem C64 via $d012.
Egal welchen Wert ich im IRQ in $ff0b schreibe, erscheint z.B. mein Rasterbar trotzdem immer am unteren Bildschirmende wo der Rahmen anfängt.
Was mache ich falsch?
Es gibt 15 Antworten in diesem Thema, welches 4.070 mal aufgerufen wurde. Der letzte Beitrag (
Hmmm... wollte auf dem Plus4 den Bildschirm aufteilen wie auf dem C64 via $d012.
Egal welchen Wert ich im IRQ in $ff0b schreibe, erscheint z.B. mein Rasterbar trotzdem immer am unteren Bildschirmende wo der Rahmen anfängt.
Was mache ich falsch?
Du hast dran gedacht Bit 0 von $FF0A zu löschen? Das ist das 9. Bit für die Zeilenposition des Raster-IRQ.
Inwiefern steht denn deine Interrupt-Routine für sich?
Wenn Du wieder in die Original-Routine im KERNAL zurückspringst (wegen Tastaturabfrage u.ä.) - da wird der Rasterinterrupt auch genutzt und stellt dir ggfs. $FF0A/$FF0B wieder auf Standardwerte.
Unter anderem realisiert der Rechner so ja GRAPHIC 2 und GRAPHIC 4 mit den 5 Zeilen Text unten, eben über zwei Raster-IRQs.
ggfs
Nicht 'ggf' sondern 'ganz gewiss'- die IRQ-Routine setzt die Rasterzeile aktiv neu.
Hatte das in etwa so zum testen fix eingetippt:
...
lda #$58
(a1) cmp $ff0b
bne (a1)
ldx #$00
(a2) lda col1,x
sta $ff15
sta $ff19
inx
cpx #$10
bne (a2)
jmp $ce42
Bitte melde dich an, um diesen Anhang zu sehen.
Das kleine Kunstwerk oben ergibt folgendes Ergebnis:
Bitte melde dich an, um diesen Anhang zu sehen.
Dabei wollte ich den Farbbalken ca. in der Mitte des Bildschirms haben.
Experimente mit $ff09, $ff0a und $ff0b ergaben entweder keine Änderung oder kompletten Absturz.
Was mache ich falsch?
die IRQ-Routine setzt die Rasterzeile aktiv neu.
Jo.
Was mache ich falsch?
Die zwei Befehle im ROM bei $CE58 und $CE5A sind deine Feinde.
Wie ich im ersten Post schon geschrieben hab: die Interrupt-Routine im KERNAL funkt dir aktiv dazwischen, solange Du sie mit in deine Interrupt-Routine hineinnimmst, bzw. bei einem einfachen Polling ihre Ausführung zuläßt.
Schau dir in einem guten ROM-Listing mal die Interrupt-Routine ab $CE00 an und dann bau mit dieser Grundlage eine eigene Interrupt-Routine neu, die den Raster-Interrupt unter voller Kontrolle hat.
Sorry, ich versteh nur Bahnhof.
Es geht eigentlich nur darum, die Funktion von $d012 (C64) auf dem Plus4 zu übertragen.
Ich werde dann wohl weiter experimentieren und vieleicht eine Lösung des Problems finden. Ich werde dies dann hier posten, für den Fall, das jemand mal in eine ähnliche Problematik gerät, und kein Revers Engineering des ebenso genialen wie lausigen Betriebssystem des Plus4 betreiben möchte.
Ich hatte vor einiger Zeit auch mal etwas mit dem P4 experimentiert. Vielleicht kannst Du damit etwas anfangen ?
!to "p4_rirq.prg",cbm
TEDGraph1 = $FF06 ; $FF06: TED Graphic-Register 1
TEDGraph2 = $FF07 ; $FF07: TED Graphic-Register 2
TEDKLatch = $FF08 ; $FF08: TED Keyboard Latch
TEDIRQ = $FF09 ; $FF09: TED IRQ Status Register
TEDIRQM = $FF0A ; $FF0A: TED IRQ Mask Register
TEDIRQR = $FF0B ; $FF0B: TED Raster IRQ Register
TEDCUR_H = $FF0C ; $FF0C: TED Cursor H
TEDCUR_L = $FF0D ; $FF0D: TED Cursor L
TEDSND1 = $FF0E ; $FF0E: TED Sound Voice #1 L
TEDSND2 = $FF0F ; $FF0F: TED Sound Voice #2 L
TEDSND1H = $FF10 ; $FF10: TED Sound Voice #1 H
TEDSND = $FF11 ; $FF11: TED Sound Volume,on/off,Wave,D/A
TEDREG = $FF12 ; $FF12: TED Register
TEDREGA = $FF13 ; $FF13: TED Register
TEDVRAM = $FF14 ; $FF14: TED Video-RAM
TEDBACK = $FF15 ; $FF15: Background-Color
TEDCOL1 = $FF16 ; $FF16: TED Color 1
TEDCOL2 = $FF17 ; $FF17: TED Color 2
TEDCOL3 = $FF18 ; $FF18: TED Color 3
TEDFRAME = $FF19 ; $FF19: TED FRAME
TEDCHARH = $FF1A ; $FF1A: TED Char Position H
TEDRASTH = $FF1C ; $FF1C: TED Rasterline H
TEDRASTL = $FF1D ; $FF1D: TED Rasterline L
TEDRASTC = $FF1E ; $FF1E: TED Rastercolumn
TEDRASTV = $FF1F ; $FF1F: TED Raster vertical
TEDROM = $FF3E ; $FF3E: TED ROM ON
TEDRAM = $FF3F
*= $2000
;--------------------------------------------------
; Commodore 16 - TED Rastersplit
;--------------------------------------------------
screen=$0c00
sei
lda #$70
sta $a0
lda #$93
jsr $ffd2
ldx #$00
- lda text,x
sta $0c00+160,x
lda text1,x
sta $0c00+800,x
inx
cpx #$28
bne -
lda #<rasterirq
sta $0314
lda #>rasterirq
sta $0315
cli
jmp*
rasterirq: lda $a0
cmp #$01
beq +
dec $a0
+ lda TEDREG
and #$fb
sta TEDREG
lda TEDREGA ; ram charset $1000
and #$03
ora #$18
sta TEDREGA
lda #$f1
lda TEDGraph2
ora #$90
sta TEDGraph2
sta TEDBACK
sta TEDFRAME
- ldx TEDRASTL ; splitline
cpx #$70
bne -
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
lda #$c4
sta TEDREG
lda #$d0 ; rom charset $d000
sta TEDREGA
lda TEDGraph2
and #$00
ora #$08
sta TEDGraph2
lda #$94
sta TEDBACK
sta TEDFRAME
- ldx TEDRASTL
cpx #$ff ; endline
bne -
endirq: jmp $fcc3
text: !scr " W scramble ram charset just ripped W "
text1: !scr " rom charset at $d000 for second part "
*=$1000
!bin "scramblezs",,2
Alles anzeigen
Sieht dann so aus:
Bitte melde dich an, um diesen Anhang zu sehen.
Es geht eigentlich nur darum, die Funktion von $d012 (C64) auf dem Plus4 zu übertragen.
Das geht eben nicht so direkt weil es beim Plus/4 eben 9Bit für die Rasterzeile sind und der KERNAL selbst auch Raster-IRQs benutzt (GRAPHIC 2 / 4).
Gerrit, es gibt auch beim VIC-II am C64 ein 9. Bit für die Rasterzeile, es ist in $D011 gespeichert. Das hat mit der Problematik hier überhaupt nichts zu tun.
HOLY MOSES, dir wurde ja jetzt von cbmhardware eine Lösung auf dem Silbertablett präsentiert.
Es geht eigentlich nur darum, die Funktion von $d012 (C64) auf dem Plus4 zu übertragen.
Da brauchst Du nichts weiter zu tun, der TED gibt das schon her. Es gibt nur halt noch einen weiteren Nutzer ...
und kein Revers Engineering des ebenso genialen wie lausigen Betriebssystem des Plus4 betreiben möchte.
... und das ist das "geniale wie lausige Betriebssystem des Plus/4"! Was ist eigentlich so schwer daran zu verstehen, daß sich dein Programm und der KERNAL um eben dieses Register streiten, in dem den Auslösezeile für den Raster-IRQ vermerkt wird?
Auf dem C64 wird $D012 vom KERNAL nicht angeschaut (nur 'versehentlich' mit initialisiert beim Reset, und deswegen macht dir beim C64 der KERNAL die Benutzung von Raster-Interrupts nicht streitig - höchstens das gemeinsame Auftreten eines Timer-Interrupts vom CIA muß man sinnvoll handhaben (oder die Timer-Interrupts eben ausschalten).
Beim C16/C116/+4 laufen sowohl Tastatur, Uhrzeit als eben auch die Raster-Effekte (sprich: geteilter Grafik-/Textbildschirm) über den Raster-Interrupt. Der KERNAL hat hier also solange das Sagen, wie Du die originale Interrupt-Routine noch mitlaufen läßt.
...
Jegliche weitere Bemerkung von dir, daß Du kein Interesse daran hast, dich da mal in die Details einzulesen, bringt dich auf meine Ignore-Liste. Aus dem Thread hier bin ich jetzt auf jeden Fall raus.
Edit:
Das war mir nicht bekannt, ich dachte für Tastatur und Uhrzeit würde der KERNAL im Plus/4 einen der 3 Timer die TED bereitstellt verwenden.
Hast PN.
Beim C16/C116/+4 laufen sowohl Tastatur, Uhrzeit als eben auch die Raster-Effekte (sprich: geteilter Grafik-/Textbildschirm) über den Raster-Interrupt.
Das war mir nicht bekannt, ich dachte für Tastatur und Uhrzeit würde der KERNAL im Plus/4 einen der 3 Timer die TED bereitstellt verwenden.
Alles anzeigenIch hatte vor einiger Zeit auch mal etwas mit dem P4 experimentiert. Vielleicht kannst Du damit etwas anfangen ?
Super, vielen Dank für dieses lebendige, tolle Bespiel. Werde mir das unbedingt mal live am +4 zu Gemüte führen.
Komischerweise nutzt Du "TEDIRQM" und "TEDIRQR" (also $ff0a und $ff0b) garnicht.
Das wird mir sicher weiterhelfen es zu verstehen.
Code Alles anzeigen!to "p4_rirq.prg",cbm TEDGraph1 = $FF06 ; $FF06: TED Graphic-Register 1 TEDGraph2 = $FF07 ; $FF07: TED Graphic-Register 2 TEDKLatch = $FF08 ; $FF08: TED Keyboard Latch TEDIRQ = $FF09 ; $FF09: TED IRQ Status Register TEDIRQM = $FF0A ; $FF0A: TED IRQ Mask Register TEDIRQR = $FF0B ; $FF0B: TED Raster IRQ Register TEDCUR_H = $FF0C ; $FF0C: TED Cursor H TEDCUR_L = $FF0D ; $FF0D: TED Cursor L TEDSND1 = $FF0E ; $FF0E: TED Sound Voice #1 L TEDSND2 = $FF0F ; $FF0F: TED Sound Voice #2 L TEDSND1H = $FF10 ; $FF10: TED Sound Voice #1 H TEDSND = $FF11 ; $FF11: TED Sound Volume,on/off,Wave,D/A TEDREG = $FF12 ; $FF12: TED Register TEDREGA = $FF13 ; $FF13: TED Register TEDVRAM = $FF14 ; $FF14: TED Video-RAM TEDBACK = $FF15 ; $FF15: Background-Color TEDCOL1 = $FF16 ; $FF16: TED Color 1 TEDCOL2 = $FF17 ; $FF17: TED Color 2 TEDCOL3 = $FF18 ; $FF18: TED Color 3 TEDFRAME = $FF19 ; $FF19: TED FRAME TEDCHARH = $FF1A ; $FF1A: TED Char Position H TEDRASTH = $FF1C ; $FF1C: TED Rasterline H TEDRASTL = $FF1D ; $FF1D: TED Rasterline L TEDRASTC = $FF1E ; $FF1E: TED Rastercolumn TEDRASTV = $FF1F ; $FF1F: TED Raster vertical TEDROM = $FF3E ; $FF3E: TED ROM ON TEDRAM = $FF3F *= $2000 ;-------------------------------------------------- ; Commodore 16 - TED Rastersplit ;-------------------------------------------------- screen=$0c00 sei lda #$70 sta $a0 lda #$93 jsr $ffd2 ldx #$00 - lda text,x sta $0c00+160,x lda text1,x sta $0c00+800,x inx cpx #$28 bne - lda #<rasterirq sta $0314 lda #>rasterirq sta $0315 cli jmp* rasterirq: lda $a0 cmp #$01 beq + dec $a0 + lda TEDREG and #$fb sta TEDREG lda TEDREGA ; ram charset $1000 and #$03 ora #$18 sta TEDREGA lda #$f1 lda TEDGraph2 ora #$90 sta TEDGraph2 sta TEDBACK sta TEDFRAME - ldx TEDRASTL ; splitline cpx #$70 bne - nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop lda #$c4 sta TEDREG lda #$d0 ; rom charset $d000 sta TEDREGA lda TEDGraph2 and #$00 ora #$08 sta TEDGraph2 lda #$94 sta TEDBACK sta TEDFRAME - ldx TEDRASTL cpx #$ff ; endline bne - endirq: jmp $fcc3 text: !scr " W scramble ram charset just ripped W " text1: !scr " rom charset at $d000 for second part " *=$1000 !bin "scramblezs",,2Sieht dann so aus:
Bitte melde dich an, um diesen Anhang zu sehen.
Alles anzeigenGerrit, es gibt auch beim VIC-II am C64 ein 9. Bit für die Rasterzeile, es ist in $D011 gespeichert. Das hat mit der Problematik hier überhaupt nichts zu tun.
HOLY MOSES, dir wurde ja jetzt von cbmhardware eine Lösung auf dem Silbertablett präsentiert.
Ja, ich weiß, daß erste, lebendige Beispiel das helfen könnte es zu verstehen.
Da brauchst Du nichts weiter zu tun, der TED gibt das schon her. Es gibt nur halt noch einen weiteren Nutzer ...
Nun, ich muss zugeben, daß hilft mir nicht wirklich weiter. Wenn Du nicht wirklich praktisch helfen willst, ist das für mich völlig okay. Ich nehme die Ignorierung somit dankend an.
Hi all, sorry for resurrecting old thread, I wanted to ask is it possible to split the screen at any line on screen? The code example above works perfectly if starting line is is $38 or above, but does not work if split line is below that number. What should I do to place a split for example at line 8 (just after the first line of characters)?
Hi all, sorry for resurrecting old thread, I wanted to ask is it possible to split the screen at any line on screen? The code example above works perfectly if starting line is is $38 or above, but does not work if split line is below that number. What should I do to place a split for example at line 8 (just after the first line of characters)?
$FF1D rapresents the low nibble only of the whole 312 ($0138) rasterlines in PAL video format. if your code start IRQing from a generic line in the middle, the very first $FF1D = #$38 it meets will probably be a $0138 and not the desired $0038 you would match. The high nibble lies into $FF1C. My suggestion is that before checking for $FF1D, doublecheck for $FF1C: first you check it's 1 (TED actually writes #$FF) then you check it returns to 0 (TED actually writes #$FE):
Wow, Luca, thanks!!! I actually also tried to check high raster bit, but not like this, and it didn't work. Your code works like a charm!