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 bist in Begriff, Forum64 zu verlassen, um auf die folgende Adresse weitergeleitet zu werden:
Bitte beachte, dass wir für den Inhalt der Zielseite nicht verantwortlich sind und unsere Datenschutzbestimmungen dort keine Anwendung finden.
letzter Beitrag von zzarko am
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
Das kleine Kunstwerk oben ergibt folgendes Ergebnis:
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 ?
Sieht dann so aus:
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.
Alles anzeigenCode
- !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
Sieht dann so aus:
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!