P-Basic-V2: Autostart mit Rückwärtsgang
Dieser Autostarter erzeugt nicht nur ein einfaches Lade-Programm für Basic und Assembler-Programme. Es wird zusätzlich die RUN/STOP-Taste gesperrt und ein Kopierschutz installiert. Um ein so behandeltes Programm wieder verändern zu können, kann mit einem Befehl der gesamte Vorgang rückgängig gemacht werden.
Das Programm »P-Basic-V2« läuft auf dem Commodore 64 (ohne Basic-Erweiterung) und der Floppy 1541 (nicht auf der Datasette, da das Programm beim Laden den Kassettenpuffer benutzt). Es ist zirka 260 Bytes lang und liegt im Speicher ab 49152 ($c000).
Nach dem normalen Laden und Starten des Basic-Programmes, ist das Basic-V2 um drei neue Befehle erweitert:
1. !SAVE"Name", Gerätenummer,1
2. !LOAD"Name", Gerätenummer,1
3. !NEW
Der Hauptbefehl ist !SAVE. Mit ihm kann man ein Basic-Programm oder ein Maschinenprogramm (mit Basic-Startzeile) so abspeichern, daß es nach dem Laden von allein startet. Außerdem wird die RUN/STOP/RESTORE-Taste abgestellt. Das Programm ist somit vor Änderungen gesichert. Auch das Kopieren ist nur mit besonderen Kopierprogrammen möglich. Doch durch eine Codewortabfrage in den ersten Zeilen wird es wohl keiner schaffen, das Programm zum Laufen zu bringen. Ein Programm, das mit dieser Basic-Hilfe abgespeichert wurde, muß mit dem Zusatz »,1« absolut, nicht ab Basic-Start (2049), geladen werden. Lädt man ein solches Programm ohne diesen kleinen Zusatz in den Speicher, so läßt es sich weder listen, noch starten. Weil ein normales Programm mit der Zwei-Byte-Startadresse am Anfang der Datei gespeichert wird, ist es durch ein nochmaliges anderes Abspeichern ganz verloren.
Man kann diese Routine natürlich auch nur zur Bequemlichkeit benutzen. Um die Stopp-Routine wieder zu aktivieren, hilft: POKE808,237 als erster Befehl des Programms.
Ist in dem geschützten Programm nun aber ein Fehler, oder will man es erweitern oder verbessern, so hilft der zweite Befehl. Mit !LOAD kann man alle Programme, die mit Autostart geschützt sind, knacken und nach eigener Lust bearbeiten.
Tritt bei den Arbeiten mit diesen Befehlen ein Fehler auf, den Sie oder das Betriebssystem (Floppy/Computer) verursacht haben, so können sie mit Eingabe von !NEW alle wichtigen Vektoren korrigieren und somit das gerade bearbeitete Programm wieder listen lassen.
Erläuterungen zum Assemblerlisting
In dem Programmabschnitt »Vektorsetzung« wird die Routine zur Erkennung der Befehls-Token (Basic-Befehle) auf die erweiterte Routine (Erkennung) umgelenkt und danach der Name der Basic-Erweiterung ausgegeben.
In der Erkennungsroutine werden die Befehls-Token mit dem neuen Befehl (!) und danach mit den eigentlichen Befehlen (SAVE, LOAD, NEW) verglichen. »SAVE« hat das Basic-Token 148, »LOAD« hat 147 und »NEW« hat 162. Wird keiner dieser Befehle interpretiert, so wird Syntax Error (Jmp $af08) angezeigt. Die DATAs werden in der Vektorsetzungsroutine ausgegeben.
Der Befehl »LOAD«, der wie der Befehl »SAVE« nur im Direktmodus verwendet werden darf, setzt zuerst das Programmodusflag, damit es keine Ausgabe wie »searching for…« und so weiter gibt. Danach werden die LOADparameter geholt ($e1d4) und nach LOAD verzweigt ($ffd5). Nachdem das Programm geladen ist, werden alle Vektoren mit der NEW-Routine wieder zurückgesetzt und dann zur END-Routine verzweigt ($a831).
Der Befehl »SAVE« gleicht am Anfang (bis Ende Zeile 166) dem LOAD-Befehl. In Zeile 168 wird die Steuerroutine in den Kassettenpuffer (Sprite 11) geladen. Dann werden die »Input«- und »Output«-Vektoren auf die Steuerroutine gesetzt und das Programm ab Byte 806 gespeichert. Die Vektoren werden dann mit der NEW-Routine normalisiert.
Die Steuerroutine arbeitet ungefähr so wie die NEW-Routine. Nur bei dieser Routine werden zusätzlich die RUN-Zeiger ($a659) gesetzt, die Run-Stop/Restore-Funktion abgeschaltet und dann zur Interpreterschleife verzweigt.
Bemerkungen zum Programm
Das Befehlszeichen »!« kann natürlich durch fast jedes Zeichen ersetzt werden, nur wenn das Zeichen ein Token ist, muß nicht der ASCII-Wert, sondern der Tokenwert angegeben werden, da sonst der Befehl nicht erkannt wird. Wenn das Zeichen ein Buchstabe ist, kann derselben Variablen kein Wert zugewiesen werden. Denn auch dabei entsteht ein Fehler.
(Jan Kusch/gk)100 rem***************************** 101 rem* p-basic-v2. * 102 rem* * 103 rem* geschrieben 1984 von * 104 rem* * 105 rem* jan kusch * 106 rem***************************** 107 forx=0to255:reada:s=s+a 108 poke49152+x,a:next 109 ifs=26106then112 110 print"{down}{down}{down}{down}{down}?fehler in datas :" 111 print"pruefsumme :"s" (26106)":end 112 poke49152+x,asc ("!") 113 sys49152:new 114 data169,17,141,8,3,169,192,141,9,3,169,49,160,192,76,30,171 115 data32,115,0,205,0,193,240,3,76,231,167,32,115,0,201,147,240 116 data64,201,148,240,88,201,162,240,3,76,8,175,76,180,192,147,144 117 data18,32,208,45,194,65,83,73,67,45,214,50,46,32,32,13,195 118 data45,54,52,32,38,32,214,195,45,49,53,52,49,13,195,79,80 119 data89,82,73,71,72,84,32,40,67,41,9,14,8,0,169,0,133 120 data157,32,115,0,32,212,225,169,0,166,43,164,44,133,10,32,213 121 data255,134,45,132,46,76,180,192,169,0,133,157,32,115,0,32,212 122 data225,162,0,189,218,192,157,64,3,232,201,255,208,245,169,38,133 123 data43,169,3,133,44,169,64,141,36,3,141,38,3,169,3,141,37 124 data3,141,39,3,32,68,229,32,89,225,169,1,133,43,169,8,133 125 data44,169,87,141,36,3,169,241,141,37,3,141,39,3,169,202,141 126 data38,3,169,237,141,40,3,169,0,133,198,76,49,168,169,1,133 127 data43,169,8,133,44,169,87,141,36,3,169,241,141,37,3,141,39 128 data3,169,202,141,38,3,169,225,141,40,3,32,89,166,76,174,167 129 data255
100 sys9*4096 : .opt oo 101 *=49152 102 ; 103 ; 104 ; 105 ;############################## 106 ;* * * p - basic - v2. * * * 107 ;############################## 108 ; 109 ; **************************** 110 ;*geschrieben1984von* 111 ;** 112 ;*jankusch(j-ksoft)* 113 ;** 114 ; **************************** 115 ; 116 ; 117 ;############################## 118 ;####### vektorsetzung ######## 119 ;############################## 120 ; 121 lda #<erkennung : sta $0308 122 lda #>erkennung : sta $0309 123 ; 124 lda #<datas : ldy #>datas 125 jmp $ab1e 126 ; 127 ; 128 ;############################## 129 ;######### erkennung ########## 130 ;############################## 131 erkennung jsr $0073 : cmp befehl 132 beq entscheidung 133 jmp $a7e7 134 ; 135 entscheidung jsr $0073 136 cmp #147 : beq load 137 cmp #148 : beq save 138 cmp #162 : beq new1 139 jmp $af08 140 ; 141 new1 jmp new 142 ; 143 ; 144 ;############################## 145 ;########### datas ############ 146 ;############################## 147 datas .asc "{clr}{blk}{rvon} P-Basic-V2. " 148 .byte 13 : .asc "C-64 & VC-1541" 149 .byte 13 : .asc "Copyright (c)" 150 .byte 9,14,8,0 151 ; 152 ;############################## 153 ;######## befehl .load ######## 154 ;############################## 155 load lda #0 : sta $9d 156 jsr $0073 : jsr $e1d4 157 lda #00 : ldx $2b : ldy $2c 158 sta $0a : jsr $ffd5 159 stx $2d : sty $2e 160 jmp new 161 ; 162 ;############################## 163 ;####### befehl .save ######### 164 ;############################## 165 save lda #00 166 sta $9d : jsr $0073 : jsr $e1d4 167 ; 168 ldx #00 169 verschiebung lda routine,x 170 sta $0340,x : inx 171 cmp #$ff : bne verschiebung 172 ; 173 lda #<806 : sta $2b 174 lda #>806 : sta $2c 175 lda #<832 : sta 804 : sta 806 176 lda #>832 : sta 805 : sta 807 177 ; 178 jsr $e544 : jsr $e159 179 ; 180 new lda #1 : sta $2b 181 lda #8 : sta $2c 182 lda #$57 : sta 804 183 lda #$f1 : sta 805 : sta 807 184 lda #$ca : sta 806 185 lda #237 : sta 808 186 lda #0 : sta 198 : jmp $a831 187 ; 188 ; 189 ;******* steuerroutiene ******* 190 ; 191 routine lda #1 : sta $2b 192 lda #8 : sta $2c 193 lda #$57 : sta 804 194 lda #$f1 : sta 805 : sta 807 195 lda #$ca : sta 806 196 lda #225 : sta 808 197 ; 198 jsr $a659 : jmp $a7ae 199 ; 200 .byte $ff 201 ; 202 befehl .byte "!" 203 ;