Hallo Besucher, der Thread wurde 3,1k mal aufgerufen und enthält 15 Antworten

letzter Beitrag von zzarko am

Bildschirmaufteilung auf dem C16/116/Plus4 mit $ff0b statt $d012...?!?

  • 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?

  • 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.

  • 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:


  • 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.


  • 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):


    Code
    1. LDA #$FE
    2. CMP $FF1C
    3. BEQ *-3     ; wait until $FF1C ≠ 0
    4. CMP $FF1C
    5. BNE *-3 ; wait until $FF1C ≠ 1
    6. ; at this point, you're sure that the raster is counting from the real zero line
    7. LDA #$37 ; example with the value #$37
    8. CMP $FF1D
    9. BNE *-3