Anhalter — Programmstop auf Tastendruck
Mit dieser kleinen Maschinensprach-Routine können Sie jedes Programm anhalten. Der Computer stoppt so lange, bis Sie eine Taste drücken
Dieses kleine Maschinenprogramm kann Ihnen in vielerlei Hinsicht nützlich sein. Man kann sich beispielsweise folgende Anwendungsgebiete vorstellen: In einem selbstprogrammierten Spiel wird oft eine Pause-Taste benötigt, ähnlich, wie es sie auch in manchen kommerziellen Spielen gibt Auch das Auflisten von Programmen kann jederzeit angehalten werden und sogar der Datenfluß zur Floppy ist gegen eine Unterbrechung nicht gefeit Mit dem Programm »Anhalter« steht es Ihnen vollkommen frei, zu entscheiden, an welchen Stellen ein Programm angehalten werden soll.
Nach dem Starten des Programms (siehe Listing 1) werden Sie zunächst gefragt, wohin das Programm verschoben werden soll (bitte Dezimalzahlen eingeben). Da das Programm vollkommen frei verschiebbar ist, brauchen Sie keine weiteren Angaben zu machen. Danach brauchen Sie nur noch die Funktionstaste F1 zu drücken um Ihr Programm zu stoppen. Soll das Programm weiter laufen, so genügt es, eine beliebige Taste zu betätigen.
Falls Sie nicht die F1-Taste, sondern eine andere mit der Anhalte-Funktion belegen möchten, so ist dies möglich. Dazu brauchen Sie nur in die Speicherstelle (Startadresse + 16) den Wert der neuen Taste hineinschreiben. Diesen Wert erhalten Sie, indem Sie folgende Zeile im Direktmodus eingeben, die gewünschte Taste drücken und sich die angezeigte Zahl merken.
FOR I=1 TO 10000 : PRINT PEEK(203): NEXT
Jetzt können Sie die Abfrage ändern:
POKE Startadresse + 16,X (X=neuer Wert)
Listing 2 erläutert die genaue Funktionsweise des Programmes.
(Georg Kramer/aw)0 rem ***************************** 1 rem ** +++ anhalter +++ ** 2 rem **-------------------------** 3 rem ** written by georg kramer ** 4 rem ** auf dem moore 15 ** 5 rem ** 4783 anroechte ** 6 rem ** tel.: 02947/3511 ** 7 rem ** (c) 07.06.1985 ** 8 rem ***************************** 9 : 10 print"{clr}{down} ++ anhalter ++":print 15 input" {rvon}startadresse :{rvof} 49152{left}{left}{left}{left}{left}{left}{left}";s 20 ifs<0ors>65535then10 30 fori=0to33:reada:x=x+a 40 pokes+i,a:next 50 ifx<>4231thenprint"data-fehler !":end 60 pokes+7,(s+13)/256 70 pokes+2,(s+13)-peek(s+7)*256 80 sys(s) 90 print:print" programm anhalten => f1" 95 end 100 rem *** maschinenprogramm *** 101 data120,169,13,141,20,3,169,192,141,21,3,88,96,165,203,201,4,240,3,76 102 data49,234,32,135,234,165,203,201,64,240,247,76,49,234
,C000 7B SEI ;Interrupt abschalten ,C001 A9 0D LDA #$0D ;Interrupt auf C00D ,C003 8D 14 03 STA $0314 ;setzen ,C006 A9 C0 LDA #$C0 ; ,C008 8D 15 03 STA $0315 ; ,C00B 58 CLI ;Interrupt zulassen ,C00C 60 RTS ;Rückkehr zum Basic ,C00D A5 CB LDA $CB ;hole Wert der letzten gedrückten Taste ,C00F C9 04 CMP #$04 ;vergleiche mit Wert für F1-Taste ,C011 F0 03 BEQ $C016 ;verzweige:ja =eig.Routine, nein=norm.IRQ ,C013 4C 31 EA JMP $EA31 ;verlasse Routine zum normalen IRQ ,C016 20 87 EA JSR $EA87 ;springe zur normalen Tastaturabfrage ,C019 A5 CB LDA $CB ;hole Wert der letzten gedrückten Taste ,C01B C9 40 CMP #$40 ;vergleiche mit $40 (#64) = keine Taste ,C01D F0 F7 BEQ $C016 ;wenn keine Taste, dann zur Tastaturabf. ,C01F 4C 31 EA JMP $EA31 ;wenn Taste gedrückt, dann norm. IRQ