Hallo Besucher, der Thread wurde 1,2k mal aufgerufen und enthält 6 Antworten

letzter Beitrag von Lazycow am

ROM einblenden und IRQ

  • Könnte wieder einen Tipp gebrauchen!
    Und zwar hab ich ein Spiel laufen mit der Speicherkonfiguration ram-IO-ram (lda #$35, sta $01)...
    Und es rennt natürlich ein Rasterinterrupt. (ohne Kernal, denn alles ROM ist ja abgeschalten)


    Wie komme ich nun aber an die 8k ROM aus einem Steckmodul das bei $8000 eingeblendet wird?
    Wenn ich versuche das $8000-ROM über $01 einzublenden, dann blendet der C64 das Kernal immer mit ein. (stimmts, oder hab ich was übersehen?) :prof:
    Und damit crasht natürlich mein IRQ...


    Irgendeine tolle Idee? Muss ich den IRQ dazu abschalten? Das wäre ja blöd. :(

  • Wegen Edit von @Endurion: Zeug ohne Bezug gelöscht ;)


    Die gesuchte Funkition (Cart LOROM ohne Kernal ROM) gibt es wohl leider nicht. IRQs kann man natürlich per Interrupt-Flag "blocken", aber ich vermute mal, dass das nicht das Problem löst. @Lazycow was willst du denn erreichen, also was ist der Zweck für das Cartridge ROM?

    Irgendeine tolle Idee?

    Eine ganz blöde Idee wäre $314/$315 auf eine Routine zeigen lassen, die erst den Stack wieder aufräumt (3 Register ziehen), denn die Rücksprungadresse auf eine zweite Routine modifiziert, dann alles auf RAM schaltet und ($FFFE) anspringt. Die zweite Routine schaltet dann $01 wieder auf ROM und macht ein JMP zur ursprünglichen Rücksprungadresse.


    Blöd aus zwei Gründen: Erstens ist es sehr kompliziert, zweitens kommt Murks raus wenn auch nur ein Raster-IRQ des Spiels die deutliche "Verspätung" nicht verträgt ;)


    Edit2: Wenn es nur um einen kurzen Zugriff ins ROM geht ist ein simples SEI/CLI drumherum vielleicht weniger problematisch. Kann natürlich auch einen präzise getimeten Raster-IRQ kaputtmachen, je nachdem ....

  • Ok, dann kommt $8000-ROM wohl immer im Dippelpack mit dem Kernal. Hab ich mich wohl nicht verlesen. Da liest an einmal richtig, und dann sowas! Mist!
    Das $8000-ROM wollte ich sozusagen nur als "schnelle Floppy" verwenden, also zum Nachladen.
    IRQ sollte dazu schon weiterticken...


    Ok, ich könnte im IRQ selbst das ROM einschalten, Daten ins RAM kopieren, ROM wieder ausschalten. Dabei geht halt wertvolle CPU-Zeit verloren.


    Das mit 314/315 ist interessant. Fragt sich nur ob sich der Aufwand lohnt...


    EDIT: Wie wäre es mit einem Kompromiss? Ich hab einen 2. IRQ-Handler der nur dann aufgerufen wird wenn das ROM eingeblendet wird. Und der spielt z.B. nur Musik und öffnet den vertikalen Rahmen und sonst nix. Wie bzw. wann schalte ich da gefahrlos um?

  • so macht das Caren wenn zB vom cart geladen wird. Dann läuft solange das wichtigste über 0314. Das ist auch das was die Cartversion von Maniac Mansion so fies gemacht hat. Das lädt nämlich ebenfalls im laufenden Spiel nach.

  • Ok, ich könnte im IRQ selbst das ROM einschalten, Daten ins RAM kopieren, ROM wieder ausschalten. Dabei geht halt wertvolle CPU-Zeit verloren.

    Naja es kommt sehr auf den existierenden Code an. Wenn du z.B. eine Struktur hast, bei der sagen wir mal ab irgendwo im oberen Rahmen bis zum Ende des normalen Screens kein IRQ ausgelöst wird, kannst du solchen Code an die Routine für den "oberen" IRQ einfach anhängen. Die paar Cycles für zweimal umschalten sollten dann im Verhältnis zu der Zeit, die zum Laden zur Verfügung steht, vernachlässigbar sein.


    Aber eine allgemeingültige Antwort ist hier kaum möglich, kommt wie gesagt sehr darauf an, was das Spiel normalerweise so tut ;)

  • Ich hab's nun so gemacht, dass $fffe auf irqBase (eine Kopie des ROMs, siehe unten) zeigt und damit läuft der IRQ nahtlos weiter wenn ich das KERNAL einblende. Der Nachteil ist, dass sich alle IRQs um ein paar Zyklen nach hinten verschoben haben, aber ich konnte das ausgleichen.

    Vielen Dank für die Tipps! Auf forum64 war wieder Verlass! ^^