Basic-Start-Generator
Maschinenroutinen laden wie Basic-Programme und mit RUN starten, bleibt nicht länger ein Wunschtraum. Dieses Programm macht es möglich.
Wie war noch die Startadresse für den Monitor? Sie haben bestimmt auch schon öfter die Einsprungadresse eines Maschinenprogramms vergessen, wenn Sie viel mit Assembler-Programmen arbeiten. Abhilfe schafft diese kleine Routine, die Sie mit dem MSE eingeben müssen.
Das Programm macht aus einem im Speicher befindlichen Maschinenprogramm ein Programm, das einen normalen Basic-Start besitzt. Es braucht lediglich noch auf den Datenträger gespeichert zu werden — fertig! Das speichern geschieht mit SAVE"name",8(1). Damit entfällt die leidige Frage nach dem SYS-Befehl, was bei einer großen Programmsammlung schon lästig sein kann. Das so präparierte Programm kann normal (mit »,8« oder »,1«) geladen und mit RUN gestartet werden.
Ausgenommen sind Programme, die im Bereich von $0800 bis $09af und unter dem Basic- und Kernal-ROM liegen, da hier entweder der Basic-Start-Generator oder von ihm verwendete Routinen liegen.
Tips zur Bedienung
- Laden des zu bearbeitenden Maschinenprogramms
- NEW eingeben
- Laden des Basic-Start-Generators mit LOAD"name",8
- Starten mit RUN
- Eingabe von SYS 2089,[anfang],[ende+1],[einsprung]
- [anfang]: Beginn des Maschinenprogramms im Speicher
- [ende]: Ende des Maschinenprogramms im Speicher
- [einsprung]: Einsprungadresse, also der SYS-Wert, mit dem normalerweise das Programm gestartet wurde.
Alle Parameter müssen in dezimaler Schreibweise eingegeben werden, wobei der korrekte Bereich (0 bis 65535) selbst überprüft werden muß. Es wird ein »ILLEGAL QUANTITY ERROR« ausgegeben, falls [anfang] > = [ende] ist.
- Speichern des erzeugten Programms mit SAVE "name",8
Funktion
Nach der Eingabe und Umrechnung der Parameter in das 16-Bit-Format wird das Quellprogramm direkt hinter den Start-Generator kopiert (ab $08af). Dem Quellprogramm ist nun sein späterer Programmkopf vorgelagert. Des weiteren wird nun ein Teil des Start-Generators nach $C000 kopiert, der die weitere Arbeit übernimmt.
Jetzt werden der Programmkopf und das dahinter liegende Quellprogramm nach $0800, also dem Basic-Start, kopiert. Anschließend werden die Basic-Pointer (Anfang/Ende des Basic-Programms) und im Programmkopf die Adressen gesetzt. Nach der Meldung »READY TO SAVE« kann das bearbeitete Programm abgespeichert werden.
Nun eine nähere Erläuterung zum Programmkopf: Im Basic-ROM gibt es eine Unterroutine, die Speicherinhalte verschieben kann und deren Einsprungpunkt bei $A3BF liegt.
Diese Verschieberoutine macht sich der Basic-Start-Generator im Programmkopf zunutze, so daß das Quellprogramm wieder in seinen Ursprungsbereich kopiert werden kann. Die Übergabe der Kopierparameter erfolgt in den Adressen:
- $5F/$60 — alter Blockanfang
- $5A/$5B — altes Blockende + 1
- $58/$59 — neues Blockende + 1
Nach dem Start des mit einem Basic-Start versehenen Programms wird die Blockverschieberoutine aktiviert und das Programm in seinen Bereich kopiert und gestartet.
Soll das Programm nach RUN nur an seinen ursprünglichen Start verschoben werden, müssen Sie als Einsprungadresse eine Adresse wählen, bei der ein RTS (return to subroutine) steht. Beispielsweise 64922, eine Adresse im Betriebssystem des C 64. RTS entspricht einem RETURN in Basic. Es bewirkt, daß das Programm zwar verschoben, aber nicht gestartet wird. Haben Sie zum Beispiel den SMON mit dem Start-Generator behandelt, meldet sich der SMON nach RUN mit der Registeranzeige, wenn Sie als Einsprungadresse 49152 angegeben haben. Haben Sie 64922 angegeben, kommt die READY-Meldung. Mit SYS49152 können Sie dann den SMON starten.
(Hermann-Josef Rottkemper/hm)0990 | a9 | 2c | LDA #2C | > Blockanfang ($082C) | |
0992 | a0 | 08 | LDY #08 | ||
0994 | 85 | 5f | STA5F | > Übergabeadresse | |
0996 | 84 | 60 | STY 60 | ||
0998 | a9 | ff | LDA #?? | > Blockende+1 (wird qesetzt) |
|
099A | a0 | ff | LDY #?? | ||
099C | 85 | 5a | STA5A | > Übergabeadresse | |
099E | 84 | 5b | STY 5B | ||
09A0 | a9 | ff | LDA #?? | > neues Blockende+1 (wird gesetzt) | |
09A2 | a0 | ff | LDY #?? | ||
09A4 | 85 | 58 | STA58 | > Übergabeadresse | |
09A6 | 84 | 59 | STY 59 | ||
09A8 | 20 | bf | a3 | JSR A3BF | > Sprung in Verschieberoutine |
09AA | 4C | ff | ff | JMP FFFF | > Einsprungadresse (wird gesetzt) |
PROGRAMM : STARTGENERATOR 0801 09B0 ----------------------------------- 0801 : 0B 08 0A 00 9E 32 30 36 3C 0809 : 31 00 00 00 A9 37 85 01 A7 0811 : A9 09 8D 20 D0 8D 21 D0 46 0819 : A2 00 BD A2 08 20 D2 FF 4C 0821 : E8 E0 57 D0 F5 4C 74 A4 46 0829 : 20 90 08 86 FA 85 FB 20 70 0831 : 90 08 86 FC 85 FD 20 90 F0 0839 : 08 86 FE 85 FF A5 FB C5 9D 0841 : FD 90 0B D0 06 A5 FA C5 68 0849 : FC 90 03 4C 48 B2 A9 AF F8 0851 : 85 39 A9 09 85 3A A5 FA B5 0859 : 85 3B A5 FB 85 3C 20 F9 13 0861 : 08 A5 FC 85 2B A5 FD 85 0E 0869 : 2C A5 39 85 FA A5 3A 85 38 0871 : FB A9 00 85 39 A9 C0 85 E1 0879 : 3A A9 F9 85 3B A9 08 85 E3 0881 : 3C A9 83 85 FC A9 09 85 70 0889 : FD 20 F9 08 4C 1F C0 A9 2A 0891 : 00 85 0D 20 FD AE 20 9E AE 0899 : AD 20 9B BC A5 64 A6 65 B8 08A1 : 60 0E 12 93 9E 20 20 20 AB 08A9 : C2 C1 D3 D4 C1 D2 D4 20 21 08B1 : 2D 20 20 28 43 29 20 31 5C 08B9 : 39 38 35 20 C8 2D CA 20 C1 08C1 : D2 4F 54 54 4B 45 4D 50 8F 08C9 : 45 52 20 20 20 92 11 11 40 08D1 : 20 D3 59 4E 54 41 58 3A 20 08D9 : 20 D3 D9 D3 32 30 38 39 CC 08E1 : 2C C1 4E 46 41 4E 47 2C 46 08E9 : C5 4E 44 45 2B 31 2C CA 12 08F1 : 4D 50 2D C9 4E 11 11 99 D0 08F9 : A2 00 A1 3B 81 39 E6 39 5B 0901 : D0 02 E6 3A E6 3B D0 02 63 0909 : E6 3C A5 3B C5 FC D0 E8 37 0911 : A5 3C C5 FD D0 E2 60 A9 FE 0919 : 83 85 3B A9 09 85 3C A5 5C 0921 : FA 85 FC A5 FB 85 FD A9 09 0929 : 00 85 39 A9 08 85 3A 20 45 0931 : 00 C0 A5 39 85 2D A5 3A EF 0939 : 85 2E A5 2D 8D 16 08 A5 D9 0941 : 2E 8D 18 08 A5 2B 8D 1E 63 0949 : 08 A5 2C 8D 20 08 A5 FE B7 0951 : 8D 29 08 A5 FF 8D 2A 08 4F 0959 : A2 00 BD 78 C0 20 D2 FF D2 0961 : E8 E0 12 D0 F5 A9 01 85 14 0969 : 2B A9 08 85 2C 4C 74 A4 5C 0971 : 11 11 12 52 45 41 44 59 FC 0979 : 20 54 4F 20 53 41 56 45 BE 0981 : 92 11 00 0B 08 C1 07 9E E5 0989 : 32 30 36 31 00 00 00 A9 DA 0991 : 2C A0 08 85 5F 84 60 A9 AF 0999 : FF A0 FF 85 5A 84 5B A9 23 09A1 : FF A0 FF 85 58 84 59 20 F0 09A9 : BF A3 4C FF FF 00 00 27