UNNEW

Aus C64-Wiki
Wechseln zu: Navigation, Suche

Das englische Wort UNNEW (auch RENEW oder OLD) bezeichnet beim C64 den Vorgang des Rückgängigmachens des BASIC-Befehls NEW.

Dies lässt sich unter bestimmten Umständen mit POKEs erreichen, da NEW nur einige Verwaltungsinformationen des BASIC-Interpreters zurücksetzt. Das gilt auch für den Reset-Fall, wo ein implizites NEW auf ein üblicherweise unverändertes RAM trifft.
Am Ende befindet sich eine BASIC-Routine sowie im Buch Commodore 64 - Die besten Tips & Tricks.

BASIC-Erweiterungen, wie z.B. in Steckmodulen oder Schnellladern, enthalten oft einen entsprechenden, eigenständigen Befehl. Auch andere Quelltexte, die mit dem BASIC-Editor verwaltet werden (z.B. für Assembler) sind mit Hilfe der Erweiterungen wieder herstellbar. Manche Sprachumgebungen erweitern selbst den BASIC-Editor um einen entsprechenden Befehl. Die folgende Tabelle zeigt einige Beispiele:

Name Typ Befehl Kommentar
Simons Basic BASIC-Erweiterung OLD
Super BASIC BASIC-Erweiterung OLD
Final Cartridge 3 Steckmodul OLD
Action Replay Steckmodul OLD
Prologic DOS Classic Schnelllader OLD
Disk Booster 64 Steckmodul OLD
Final Expansion 3 Steckmodul (VC20) UNNEW
Hypradisk II Steckmodul OLD
Hypra-Tape-Modul II Steckmodul SYS 52008 Als OLD-Funktion bezeichnet.
Magic Formel Steckmodul OLD
Warp Speed Steckmodul UNNEW
Super Explode Steckmodul Funktionalität wird als "UN-NEW" bezeichnet.
Turbo Trans Schnelllader *
Jiffy-DOS Schnelllader @O "UN-NEW"
Speed-DOS Schnelllader ! "UnNew" (dt. iDOC-Manual)
Dolphin DOS Schnelllader &* Funktionalität wird als "RENEW" bezeichnet.
Profi DOS Steckmodul OLD
Professional DOS Schnelllader ! Funktion wird als "RENEW" bezeichnet.
Peeks & Pokes zum Commodore 64 Buch Routine wird als "RENEW" bezeichnet.
Help, Help Plus Steckmodul #B in Anleitung: BASIC-RENEW: RENEW eines Programmes
PLH BASIC-Erweiterung OLD
Hypra-Ass Assembler-Editor /O "OLD", Erweiterung des BASIC-Editors

BASIC-Routine[Bearbeiten]

Die Schritte zum Wiederherstellen des Programms unmittelbar nach einem NEW als Einzeiler für den Direktmodus sind:

POKE2050,1:SYS42291:POKE46,PEEK(35)-(PEEK(781)>253):POKE45,PEEK(781)+2AND255:CLR

In Kleinschreibung für Copy&Paste in ein Emulatorfenster:

poke2050,1:sys42291:poke46,peek(35)-(peek(781)>253):poke45,peek(781)+2and255:clr

Detaillierte Beschreibung der einzelnen Schritte:

BASIC-Code Erklärung
POKE2050,1 Verkettungszeiger (siehe Zeilenformat) der ersten BASIC-Zeile auf einen Wert ungleich Null setzen, damit die folgende Routine überhaupt startet. An die Stelle von 2050 schreibt man für ein beliebig im Speicher liegendes BASIC den Wert von PEEK(43)+256*PEEK(44)+1.
SYS42291 BASIC-ROM-Routine zum Neuberechnen der Verkettungszeiger aufrufen: Rechain-Lines (42291 bzw. $A533)
Das Ergebnis steht danach in 34/35 ($22/23). Allerdings wird durch die hier implizit aktive Ausdrucksauswertungsroutine des Interpreters im Zuge der SYS-Abarbeitung der Wert in Speicherstelle 34 ($22) zerstört.
POKE46,PEEK(35)-(PEEK(781)>253) Über die unmittelbar nach dem SYS-Befehl geretteten Register, kann dann im X-Register an Adresse 781 ($030D) dennoch der zuvor an Adresse 34 ($22) befindliche Wert ermittelt werden!
Der BASIC-Programm-Endezeiger muss jedoch den um 2 erhöhten Wert der Rechain-Lines-Routine haben. Das High-Byte des Endezeigers wird um +1 korrigiert, wenn das Low-Byte bei der Erhöhung um 2 überlaufen würde. D.h. die 2. Klammer ergibt -1, wenn das Low-Byte 254 oder 255 ist, sonst 0.
POKE45,PEEK(781)+2AND255 Das Low-Byte des Endezeigers mit dem um 2 erhöhten Wert der Rechaining-Lines-Routine. Ein etwaiger Überlauf (wurde schon im High-Byte zuvor berücksichtigt) wird hier mit dem AND-Operator entfernt, damit der Wert im Bereich 0 bis 255 bleibt (entspricht also einer Modulo-256-Operation). Da "AND" als Operator schwächer als "+" ist, kann eine Klammerung entfallen.
CLR Diverse sonstige Verwaltungsinformationen (Bereichsgrenzen, siehe BASIC-Speicherbelegung) wieder in einen konsistenten Zustand bringen. Ein RESTORE passiert dabei schon implizit.

Assembler-Routine[Bearbeiten]

Rechain = $A533
Clr     = $A660
;
LDY #$01
TYA
STA ($2B),Y   ; Wert>0 in High-Byte der ersten Link-Adresse schreiben
JSR Rechain
LDA $22       ; Basic-Ende/Variablenstart = Adresse der letzten gefundenen '0' + 2
CLC
ADC #$02
STA $2D
LDA $23
ADC #$00
STA $2E
JMP Clr

Anmerkungen[Bearbeiten]

Die BASIC- und die Assembler-Routine kann man auch beim VC20 anwenden.
Dazu müssen nur die Adressen der beiden Systemroutinen angepasst werden:

Rechain = $C533 ; = 50483
Clr     = $C65E ; = 50782