von Frederik Holst Los geht es gleich mit einer Adresse, die in den alten und neuen Geräten eine unterschiedliche Bedeutung hat: 121, 122 $79, $7a KEYDEF Bei den XL Geräten ist dies der Pointer auf die Keyboarddefinitionstabelle. Das sind die Werte, die in 764 stehen. Man kann dem Keyboard willkürliche ASCII-Zeichen zuweisen. Folgender Aufbau muß beachtet werden: Erstes Drittel Kleinbuchstaben, zweites Drittel mit Shift und letztes Drittel mit Control. Bei den alten Geräte war diese Tabelle festgelegt. Hier wurden die beiden Register für Zeichenroutinen benutzt. 123 $7b SWPFLG Flag, das anzeigt, ob Textwindow RAM und normales RAM ausgetauscht sind (255) oder nicht (0). Wird benutzt, um entweder ins Grafikfenster oder ins Textfenster zu plotten. 124 $7c HOLDCH Hier steht der ursprungscharakter, bevor er mit Shift oder Control maskiert wird. 125 $7d INSDAT Wird benutzt, um das Zeichen unter dem Cursor oder das Zeilenende zu speichern (temporär). 126, 127 $7e, $7f COUNTR Anzahl der Punkte die noch geplottet werden müssen. 128, 129 $80, $81 LOMEM Ab hier beginnen die Zeropagevariablen, die für die Programmiersprachen und Spiele verwendbar sind. Zeiger auf die niedrigste, von Basic ansprechbare Adrese, wobei die ersten 256 Bytes als Ausgabebuffer dienen. Bei einer Veränderung von LOMEM sollte man MEMLO (743, 744) anpassen. Hier setzen nun auch Schutzmechanismen für Programme ein: Wenn ein Programm gesavet wird, dann werden die sieben Zeiger von LOMEM bis STARP mit aufgeschrieben, wobei von dem Zeigerwert immer LOMEM abgezogen wird. Wenn man nun LOMEM mit einem sinnlosen Wert füllt, und dann das Programm abspeichert, so ist das Listing nachher nicht mehr wiederzuerkennen, da ja alle Tabellen mitverrutschen. Diese Zeile schafft Unheil: Y=DPEEK(128)+3:DPOKE 128,Y:SAVE "NAME.BAS" 130, 131 $82, $83 VNPT Beginn der Variablentabelle. Die Abspeicherung erfolgt folgendermassen: Stringvariablen enden mit einem $-Zeichen, Indizierte Variablen mit einer (. Das letzte Zeichen einer Variable ist immer invers (Bit 7=1). Jeder Schreibfehler, der mit einem Buchstaben beginnt wird als Variable gewertet. Wenn man längere Programme schreibt, so sollte man das Programm ab und zu mit LIST "D:NAME.LST" sichern, dann NEW und es dann wieder einENTERN. So wird nämlich die Variablenliste nicht mit abgespeichert, was bei SAVE der Fall ist. Auch hier gibt es wieder eine schöne Möglichkeit, ein Programm zu schützen: Alle Variablen werden durch eine ersetzt, wen der Wert VAL größer als 128 ist, bei 128 gibt es gar keine und bei <128 haben sie kein Ende. Setzt man 155 ein (Code für Return), so werden die Listings sehr lang. FOR A=DPEEK(130) TO DPEEK(132):POKE A,VAL:NEXT J 132, 133 $85, $86 VNTD Zeiger auf das Ende der Variablentabelle. 134, 135 $87, $88 VVTP Zeiger auf die Variablenwertetabelle. Jede Variable benötigt acht Byte, das erste gibt die Variablenart an: 0 = Skalar (normale Variable) 64= indizierte Variable 129=String Das zweite Byte gibt die Variablennummer von 0 bis 127 an. Beim Array sind Byte 3 und 4 die Lage, 5 und 6 die erste Dimensionierung +1, Byte 6 und 7 die zweite +1. Bei einfacher Dimensionierung haben 6 und 7 den Wert 0. Bei Strings geben Byte 3 und 4 die Lage, 5 und 6 die gegenwärtige Länge und 6 und 7 die geDIMte Länge. 136, 137 $88, $89 STMTAB Zeiger auf das BASIC Programm in tokenisierter Form. 138, 139 $8a, $8b STMCUR Zeiger auf das laufende BASIC-Statement. Auch hier gibt es einen Listschutz: 32766 DPOKE (138)+2,0:SAVE "D:NAME.BAS":NEW Start mit GOTO 32766 Das war's mal wieder.