Drei »Quickies«
Einzeiler lassen sich nicht nur in Basic, sondern auch in Assembler schreiben! Tippen Sie unsere drei »Quickies« ein, und lassen Sie sich überraschen, mit welchen Tricks da gearbeitet wurde.
Die beiden Basic-Programme »Zeichensatz ändern« und »invertierte Grafik« müssen Sie mit dem MSE eingeben. Dies hat zwei Gründe: Erstens einmal lassen sich dadurch Tippfehler leichter ausschalten und zweitens wäre die Eingabe über Basic sehr mühsam. Wenn Sie die »Einzeiler« auf Diskette gespeichert haben, können Sie sie ohne weiteres wie normale Basic-Listings laden, listen und mit »RUN« starten.
Stop!
1 fori = 828to839:reada:pokei,a:next:data72,173,141,2, 201,1,240, 249,104,76,202,241
| Einschalten | poke806,60:poke807,3 |
| Ausschalten | poke 806,202:poke807,241 |
In diesem kleinen Maschinenprogramm wird während des Listens eines Programms die Shift-Taste abgefragt und, wenn diese gedrückt ist, gewartet. Sonst wird zur Adresse 61898 (Ausgabe eines Zeichens) gesprungen. Durch die zwei POKEs wird der Ausgabe-Vektor ($F1CA) auf den Kassettenpuffer nach 828 »verbogen«.
| 828 | pha | : Akku sichern |
| 829 | lda 653 | : Flag fürSHIFT |
| 832 | cmp #1 | : gedrückt? |
| 834 | beq 829 | : ja, dann warten |
| 836 | pla | : Akku wiederherstellen |
| 837 | jmp 61898 | : zur Ausgaberoutine |
Zeichensatz ändern
Dieser Einzeiler verschiebt den Zeichensatz in den Speicherbereich Hexadezimal $2000 - $3000. Damit können jederzeit beliebige Zeichen geändert werden; zum Beispiel, um Sonderzeichen zu definieren.
Zum Aufbau des Programms (Listing 1a und 1b)
Ein PRINT-Befehl schreibt das Maschinenprogramm in den Bildschirmspeicher, wo es dann mit SYS 1024 gestartet wird.
Das Maschinenprogramm setzt zunächst das Interruptflag, um einen Interrupt durch den CIA 1 zu unterbinden. Das ist nötig, da der Computer sonst abstürzen würde, wenn das Zeichen-ROM eingeschaltet wird. Danach wird das ZeichenROM eingeschaltet. Jetzt wird nach der nötigen Parameterübergabe (alter Blockanfang, altes Blockende, neues Blockende) die Blockverschieberoutine des Interpreters aufgerufen. Dann wird der Zeichengenerator wieder abgeschaltet und der Zeiger auf den Zeichengenerator entsprechend geändert (Hexadezimal D018, Bit 1-3). Nach dem Löschen des Interruptflags erfolgt der Rücksprung ins Basic.
(Peter Sajonez/tr)PROGRAMM : CHR-RAM 0801 0859 ----------------------------------- 0801 : 4B 08 01 00 99 22 93 B8 FB 0809 : 12 29 33 45 92 41 12 29 F3 0811 : 92 40 12 20 D0 45 92 DF 8D 0819 : 12 44 92 A0 12 20 A0 45 35 0821 : 92 DA 12 44 92 DB 12 20 BE 0829 : 92 30 12 45 92 D8 12 44 C1 0831 : 92 D9 20 12 3F 23 29 37 1A 0839 : 45 92 41 12 29 92 58 12 07 0841 : 4D 92 58 12 D0 92 D8 A0 76 0849 : 22 00 55 08 02 00 9E 31 BF 0851 : 30 32 34 00 00 00 01 08 BC
$0400 78 SEI Interruptflag setzen $0401 A9 B3 LDA #$B3 $0403 85 01 STA $01 ;Zeichen-ROM ein $0405 A9 00 LDA #$00 $0407 A0 D0 LDY #$D0 $0409 85 5F STA $5F ;Alter Blockanfang Low-Byte $040B 84 60 STY $60 ;Alter Blockanfang High-Byte $040D A0 E0 LDY #$E0 $040F 85 5A STA $5A ;Altes Blockende Low-Byte $0411 84 5B STY $5B ;Altes Blockende High-Byte $0413 A0 30 LDY #$30 $0415 85 58 STA $58 ;Neues Blockende Low-Byte $0417 84 59 STY $59 ;Neues Blockende High-Byte $0419 20 BF A3 JSR $A3BF ;Blockverschieberoutine $041C A9 B7 LDA #$B7 $041E 85 01 STA $01 ;Zeichen-ROM aus $0420 A9 18 LDA #$18 $0422 8D 18 D0 STA $DO18 ;Zeiger für Zeichengenerator auf $2000 $0425 58 CLI ;Interruptflag löschen $0426 60 RTS
Invertierte Grafik
Dieser Einzeiler (Listing 2) invertiert eine im Speicher stehende Grafik. Gegenüber dem Einzeiler, der in der 64’er, 3/85 veröffentlicht wurde, braucht er zur Ausführung nur den Bruchteil einer Sekunde. Er besteht im wesentlichen aus einer kleinen Maschinenroutine, die mittels einem PRINT-Befehl in den Bildschirm geschrieben und mit SYS 1024 gestartet wird.
(Frank Meister/tr)PROGRAMM : GRAFIK INVERS 0801 0850 ----------------------------------- 0801 : 39 08 0A 00 99 22 93 12 DE 0809 : 29 BF 45 BD 20 92 20 12 56 0811 : 29 92 40 12 45 BB 44 BC 92 0819 : 29 92 C3 12 2A 29 92 40 75 0821 : 12 28 31 BB 92 C4 12 BD 1E 0829 : 51 BB C8 D0 B7 92 12 A6 4A 0831 : BC A4 BC D0 B1 92 22 00 C1 0839 : 4C 08 14 00 97 31 30 35 BD 0841 : 37 2C 39 36 3A 9E 31 30 61 0849 : 32 34 00 00 00 01 08 DF