[...] folgende Strategie, die deinem an- und ausschalten ähnelt: Da ein Hardware-Resetbutton angelötet werden konnte [...]
Sorry, wat? Beim C16/C116/+4 war ein Reset-Button ab Werk eingebaut.
Und mit Aus- und wieder Einschalten hatte das auch nichts zu tun, bzw. damit war nichts gedient: zumindest bei meinem C116 war der RAM-Inhalt auch schon nach kürzestem Ausfall der Versorgungsspannung Matsch.
Die Methode, die ich beschrieben hab' greift zudem zu einem wesentlich früheren Zeitpunkt an, eben dann, wenn der Code zwar vollständig in den Speicher geschrieben aber noch nicht ausgeführt worden war. Ansonsten hat man eben das Problem, daß man nach kürzester Zeit nicht mehr den Originalzustand des Spiels wegspeichern kann ... besonders kritisch ist es dann, wenn das Spiel unmittelbar nach seiner Initialisierung eben genau diese Init-Routinen mit Nullen überschreibt.
Zitat... kann der Loader überhaupt die Zeropage überbügeln?
Klar konnte so ein (Fast-)loader das. Ein großer Teil des Loaders wurde durch einen Trick (mit einem "überlangen" Dateinamen) in den Tapebuffer geladen, ein anderer Teil überschrieb in der "erweiterten" Zeropage einige Vektoren und löste so den Autostart aus.
ZitatIch meine schon, ich meine mich zu entsinnen, das Games nicht auf Hardwarereset reagierten, also zumindest nach Start des Games der Resetvektor beschrieben wurde!?
Wenn die CPU-Zugriffe im TED auf RAM gesetzt werden, dann ist halt das ROM ausgeblendet und die CPU sieht auch nach einem Reset erstmal nur den Reset-Vektor im RAM. Das BASIC 3.5 schreibt darum ans RAM-Ende eine kleine Routine, die bei "Reset während RAM ein" erstmal wieder das ROM einblendet und dann in die eigentliche Reset-Routine durchstartet.
Ein Spiel, welches dauerhaft das ROM ausblendet (da nicht benötigt) kann sich so dann natürlich gegen einen Reset wehren, indem der Reset-Vektor im RAM auf eine Routine umgebogen wird, die entweder das Spiel neu startet oder in eine "Absturz"-Routine verzweigt. Letzteres hat z.B. das Spiel "Gullwing-Falcon" gemacht.
Aber auch von dem Spiel konnte ich eine Kopie auf Disk anfertigen, mit meiner zuvor beschriebenen Methode. ![]()