UNNEW
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 / TSB | BASIC-Erweiterung | OLD | |
Super BASIC | BASIC-Erweiterung | OLD | |
Paradoxon-Basic | BASIC-Erweiterung | OLD | |
IRQ-BASIC | BASIC-Erweiterung | OLD | |
Special Basic | BASIC-Erweiterung | OLD | |
GBASIC 64 | BASIC-Erweiterung (Steckmodul) |
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 |
Scientific BASIC | BASIC-Erweiterung | OLD | |
Business Basic | BASIC-Erweiterung | OLD | |
Laser BASIC | BASIC-Erweiterung | OLD | |
Structured BASIC | BASIC-Erweiterung | RENEW |
BASIC-Routine[Bearbeiten | Quelltext 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 | Quelltext 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 | Quelltext 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