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 aus dem 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
Der folgende BASIC-Lader lädt eine UNNEW-Routine in den Speicher, kann muss allerdings vor dem Eingeben bzw. Laden des später zu rettenden Programms gestartet werden, da durch die Eingabe der Start des BASIC-RAMs überschrieben wird. Der Lader ist sehr flexibel, weil man einfach die Variable A
anpassen kann, um die Routine an eine andere Stelle im Speicher zu laden (die Maschinensprachen-Routine benutzt nur feste Adressen ausserhalb der Routine selbst, ist also frei im Speicher verschiebbar). Der Kassettenpuffer ab Adresse 828 ist allerdings ungeeignet, da er bei einem Reset überschrieben wird.
10 A=5E4:REM SYS 50000 / SYS 5E4 20 READ V:IF V=-1 THEN END 30 POKE A,V:A=A+1:GOTO 20 40 DATA 169,1,168,145,43,32,51,165,24 50 DATA 165,34,105,2,133,45,165,35,105 60 DATA 0,133,46,32,99,166,76,116,164 70 DATA -1
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