Tips & Tricks für Profis
Auch diesmal haben wir für die Profis unter unseren Lesern einige interessante Hinweis. Beachtenswert ist unter anderem »das geheimnisvolle, reverse SHIFT-M«.
Schalten Sie den Reverse-Modus ein und drücken Sie dann die Tastenkombination SHIFT-M. Was dieser entstandene reverse Schrägbalken alles bewirken kann, möchte ich kurz schildern:
1. Innerhalb von REM-Zeilen
Geben Sie eine Zeilenummer und REM "" ein. Nun löschen Sie das zweite Hochkomma mit der DEL-Taste, schalten den Reverse-Modus ein und drücken die Tastenkombination SHIFT-M. Schalten Sie den Reverse-Modus wieder aus und setzen abermals ein Hochkomma, das Sie anschließend mit der DEL-Taste wieder löschen. Nun können Sie wie innerhalb eines PRINT-Befehls einen Text mit Farbcodes etc. eingeben. Nach der Eingabe drücken Sie die RETURN-Taste und listen das Programm. Sie werden erstaunt sein. Zur Veranschaulichung soll folgende Zeile gelten (die Kommata nicht mit eintippen):
10 REM " "{DEL, RVSON, SHIFT M, RVSOFF} "{DEL, SHIFT CLR/HOME, WHITE, RVSON} This Program is protected {RVSOFF, DARK BLUE}"
2. Im Directory
Geben Sie »SAVE« ein und erzeugen Sie den reversen Schrägbalken wie oben beschrieben. Dann tippen Sie den Programmnamen mit beliebig vielen Steuerzeichen (insgesamt 16 Zeichen) ein und schließen die Eingabe mit ",8 und RETURN ab. Auch hier zur Veranschaulichung wieder ein Beispiel:
SAVE " " {DEL, RVSON, SHIFT M, RVSOFF} "{DEL, RVSON} TEST {RVSOFF} ",8
Alle Codes werden ebenfalls aktiviert, wenn Sie eingeben: SAVE CHR$ (34) + {RVSON} Test {RVSOFF} ",8
3. Als Programmschutz
Wenn Sie am Anfang einer Programmzeile PRINT" {reverser Schrägbalken}" und danach weitere Basic-Befehle eingeben, können diese nach Drücken der RETURN-Taste nicht mehr geändert werden (nur durch Zeile löschen oder mit einem Monitor). Beim Listen des Programms werden die nachfolgenden Befehle um eine oder mehrere Zeilen nach unten gerückt (je nach dem, wieviele reverse Schrägbalken Sie in dem PRINT-Befehl verwendet haben), 80 Zeichen pro Zeile werden meistens überschritten. Will man diese Zeile durch Return abermals speichern, so wird nur der PRINT-Befehl gespeichert, alle anderen nachfolgenden Befehle gehen verloren. Ein Beispiel:
10 PRINT" " {DEL ,RVSON ,SHIFT M ,RVSOFF} ":PRINT "COPYRIGHT BY 64'ER-REDAKTION"
Nachdem Sie diese Zeile eingetippt haben und RETURN gedrückt haben, versuchen Sie einmal, den in den Hochkommata des zweiten PRINT-Befehls stehenden Text auszubessern. Nach dem Ausbesssern und RETURN-Drücken tritt entweder ein Syntax Error auf und die Zeile bleibt unverändert, oder in der Zeile 10 steht nur mehr PRINT".
4. Als Listschutz
Geben Sie das erste Beispiel ein, fügen Sie nach dem letzten Hochkomma noch das Zeichen SHIFT L hinzu, drücken Sie RETURN. Nun tippen Sie im Direktmodus POKE 2052,255 ein und speichern das Programm. Nach dem Laden ist der Listschutz noch immer vorhanden.
Durch diesen POKE bekommt die erste Zeile in einem Programm eine unzulässige Zeilennummer (größer als 63999). Sie kann daher nicht mehr gelöscht werden. Das Listen des Programms wird bei der ersten Zeile abgebrochen, Befehle wie LIST 20- (oder ähnliches) werden auch nicht ausgeführt, da der Computer glaubt, die erste Zeile sei wegen der hohen Zeilennummer die letzte. Der Listenschutz kann jedoch mit POKE 2052,0 wieder aufgehoben werden.
(Gert Harlacher/tr)Versteckspiel mit dem Directory
Wenn eine Diskette mit "N:NAME" + CHR$(0) + CHR$(0) + CHR$(0) +", ID" formatiert wird, so wird beim Laden und Auflisten des Directories nur noch der Name der Diskette angezeigt. Der Interpreter »denkt« nämlich, daß das Directory nach den drei Nullen zu Ende ist. Die Programme auf dieser Diskette lassen sich aber trotzdem noch laden.
Ein weiterer Trick besteht darin, beim Speichern eines Programms an den Namen ein »,S,W« anzuhängen (also zum Beispiel SAVE "TEST,S,W", 8).
Im Directory steht dieses File nun unter »SEQ« vermerkt. Wer versucht, dieses Programm »normal« mit LOAD zu laden, der wird von der Floppy die Fehlermeldung »64, FILE TYPE MISMATCH« erhalten.
Der Kundige jedoch wird das Programm mit »LOAD "NAME,S,R",8« laden, und sich des gelungenen Tricks erfreuen. Beide Methoden kombiniert ergeben einen recht wirkungsvollen Programmschutz.
(Oliver Rahm/tr)Englisch für Fortgeschrittene
Geben sie einmal folgende kleine Basic-Zeile sorgfältig ein.
0 rem">> {CBM-*} Os {CBM-J}o {CBM-I} {CBM-O}iti{SHIFT--} {CBM-Z} {CBM-M} Z {CBM-@} N {SHIFT-POUND} <<
Wenn Sie die Zeile listen, sehen Sie nichts Ungewöhnliches. Löschen Sie nun das Anführungszeichen hinter der REM-Anweisung und listen Sie die Zeile. Mehr wird hier nicht verraten. Lassen Sie sich überraschen!
(Yves Forkl/tr)Die mysteriöse Zahl 35072120
Zur Erinnerung: In der Ausgabe 1/86 schrieben wir, daß der List-Schutz-»POKE 808,225« durch die Eingabe der Zahl 35072120 wieder zurückgesetzt werden kann. Wir fragten weiterhin, worauf dieses Phänomen zurückzuführen ist.
Wir danken allen Lesern, die sich bei der Lösung des Problems beteiligt haben. Hier stellvertretend für viele Einsendungen die Erklärung von Frank Sander:
Nun, was geschieht da, besonders wo der C 64 derartig hohen Zeilennummern sonst nur mit einem kalten Lächeln (auch Syntax-Error genannt) begegnet?
Es geschieht folgendes:
Die Eingabewarteschleife ($A480) stellt fest, daß die soeben eingegebene Zeile (»35072120«) mit einer Ziffer beginnt und entscheidet daher, daß es sich um eine in das Programm einzubauende Programmzeile handelt.
Also übergibt sie die Zeile an die Routine zum Einfügen von Programmzeilen ($A49C).
Die Einfügeroutine versucht nun als erstes (und in diesem Falle auch als letztes), die Zeilennummer ins Low-/High-Byte-Format zu verwandeln. Dazu verzweigt sie nach $A96B, wo die Routine liegt, die für das ganze »Wunder« verantwortlich ist. Denn: Ist die Zeilennummer (wie unsere) zu groß, so versucht die Routine verzweifelt, einen Syntax-Error von sich zu geben (aber die entsprechende Ausgabeschleife ist für einen BRANCH-Befehl zu weit entfernt). Also (da man ja unmöglich drei Byte für einen »JMP $AF08« opfern konnte) wird nach $A953 verzweigt, in der Hoffnung, daß der Akku etwas anderes als $89 enthält. Denn $A953 liegt mitten in der ON-GOTO-Routine und dort wird, falls der Akku etwas anderes als den GOTO-Code (eben $89) enthält, zu einem Syntax-Error-Ansprung verzweigt.
Nur lautet die Zeilennummer 35072120, so ist der im Akku enthaltene »Rest« dummerweise gerade $89, also wird nicht zum Syntax-Error gesprungen, sondern der Prozessor beginnt eine Fahrt ins Ungewisse
- vorbei an total unpassenden Befehlen:
- vorbei an einem JSR CHRGET
- weiter bei einem erneuten Versuch, eine Zeilennummer zu holen (leider ist aber die Zeile zu Ende, also $00)
- dieses $00 ist auch nicht gleich einem Komma…
also muß der auf dem Stack liegende Code für ON-GOTO geholt werden (PLA) und das Ganze endet mit einem RTS.
Nur… es liegt ja gar kein ON-GOTO-Code auf dem Stack, sondern die Rücksprungadresse aus der Eingabewarteschleife!
Also wirft der ahnungslose Prozessor das Rücksprung-Low-Byte in die Ecke und hält nun das Rücksprung-High-Byte für ein Low-Byte und das nachfolgende Byte für ein High-Byte. Daraus folgt: der Prozessor springt ins Ungewisse: zu einer Adresse mit Low-Byte $A5. Als High-Byte liegt bei ordnungsgemäß gereinigtem Stack $79 obenauf (ehemaliger Rücksprung nach $A67A während der Basic-Initialisierung). Dies führt zu einem Sprung nach $79A5, wo der Professor hoffentlich auf ein BRK trifft, den sonst… Einen schweigenden, cursorlosen C 64 hat wohl jeder schon einmal gesehen.
Aber meist liegt dort ein BRK (oder ein mit TAX gepflasterter Weg dorthin), was den wild gewordenen Computer wieder auf den rechten Weg bringt: Nämlich die NMI-Routine.
Diese NMI-Routine, die bei unblockierter RUN/STOP-Taste auch über RUN/STOP-RESTORE erreichbar ist, setzt unter anderem den Stop-Vektor (Adresse 808/809!) neu und schon ist das Listing wieder auf den Beinen.
Hier noch einmal zusammengefaßt die Irrfahrt des C 64:
| A494 | BCC A49C | falls Zeile mit Ziffer am Anfang |
| A49C | JSR A96B | Zeilennummer in Low/High-Format wandeln |
| A96B | ||
| A97B | CMP #19 | |
| A97D | BCS A953 | falls die Zeilennummer zu groß wird |
| A953 | CMP #89 | was ja zutrifft |
| A955 | BNE A8E8 | Syntax-Error-Ansprung |
| A957 | DEC $65 | |
| A959 | BNE A95F | $65 war alles andere nur nicht 1, also verzweigen |
| A95F | JSR 0073 | CHRGET |
| A962 | JSR A96B | Zeilennummer holen, bei Zeilenende $00 |
| A965 | CMP #"," | $00 ist aber nicht gleich "," |
| A967 | BEQ A957 | also nicht verzweigen |
| A969 | PLA | läßt das Rücksprung-Low-Byte verschwinden |
| A96A | RTS |
Oben auf dem Stack hätte $9E, $A4, $79, $A6 gelegen, das $9E wurde jedoch durch das PLA vom Stack geholt. Also erfolgt ein »Rücksprung« nach $79A5.
Man kann dies ganz einfach ausprobieren, indem man in den (frisch eingeschalteten) Computer, ein POKE 31141,2 (=$79A5) eingibt. Dies führt dann bei Eingabe von »35072120« zum Absturz des Prozessors. (Befehl $02 = Prozessorabsturz).
So weit so gut. Nur — hätte es ein POKE 2,0:SYS2 nicht auch getan?
(Frank Sander/tr)HiRes-Scrolling per Interrupt
Wer hat nicht schon solche Titelbilder wie bei dem Spiel »Boulderdash« gesehen? Man hat den Eindruck, als ob der Hintergrund stufenlos scrollen würde, die Schrift aber stehenbliebe. Solch ein Effekt wäre natürlich auch hervorragend für eigene Spielszenen geeignet. Das folgende Maschinenprogramm läuft völlig interruptgesteuert und simuliert diese Funktion in vielfältiger Weise. Das Maschinenprogramm (Listing 1) wird zuerst mit »SYS 49152« gestartet.
Der erste Befehl schaltet das Pseudo-Scrolling ein. Die Syntax lautet: »SYS 49232,a,b,c«. Nun zu den Parametern: Der Parameter a ist für die Geschwindigkeit zuständig. Sinnvoll sind nur die Werte 1 bis 255, wobei 1 die höchste Geschwindigkeit bewirkt. Der Parameter b kann die Werte 0 oder 1 annehmen. Ist b=0, so wird nach dem Aufruf der gesamte Bildschirm mit dem zu scrollenden Zeichen aufgefüllt. Das ist zu Anfang ein kleiner Kreis, kann aber von Ihnen im Quelltext geändert werden. Ist b=1, so wird der Bildschirm nicht aufgefüllt. Dies wird zum Beispiel in dem Demoprogramm ausgenützt.
Der Parameter c kann ebenfalls die Werte 0 oder 1 annehmen. Ist c=0, so wird nach oben gescrollt, ist c=1, so wird nach unten gescrollt. Abgeschaltet wird das Ganze mit SYS 49400. Am besten starten Sie zu Anfang das Demoprogramm (Listing 2), um sich mit den Befehlen vertraut zu machen. Zuvor müssen Sie aber das Maschinenprogramm absolut (mit »,8,1«) geladen haben.
Zur Funktionsweise:
Zuerst wird der Zeichensatz umkopiert und einige Zeiger initialisiert. Der Trick beim Scrolling besteht darin, daß im Interrupt kontinuierlich das Zeichen »SHIFT-X« (Bildschirmcode=88) umdefiniert wird. Dadurch scheint der Hintergrund gescrollt zu werden. Unterbrechen Sie doch einmal das Demoprogramm mit RUN/STOP, löschen Sie den Bildschirm und listen das Programm. Sie werden sehen, daß sogar »im Listing« die Zeichen gescrollt werden.
Hinweis: Wenn Sie die neue Version vom »SMON« besitzen (64’er, Ausgabe 10/85), dann können Sie, nachdem Sie den SMON mit »Y8000« verschoben haben, das zu scrollende Zeichen beliebig mit dem »Z«-Befehl umdefinieren. Die Zeichendefinitionen liegen ab $C107.
(Bergerhoff/Nikolas/tr)PROGRAMM : PSEUDO-SCROLL C000 C15F ----------------------------------- C000 : 78 A5 01 48 29 FB 85 01 1F C008 : A9 D0 85 03 A9 38 85 05 58 C010 : A0 00 84 02 84 04 A2 10 25 C018 : B1 02 91 04 C8 D0 F9 E6 78 C020 : 03 E6 05 CA D0 F2 68 85 82 C028 : 01 AD 18 D0 09 0E 8D 18 87 C030 : D0 58 A9 08 20 D2 FF A2 76 C038 : 28 A0 00 BD 07 C1 99 C0 CE C040 : 3A E8 C8 C0 08 D0 F4 A9 67 C048 : 05 85 FA A9 00 85 FE 60 ED C050 : 20 37 C0 20 FD AE 20 9E 53 C058 : B7 8E 05 C1 20 FD AE 20 BD C060 : 9E B7 E0 00 D0 03 20 8D D3 C068 : C0 20 FD AE 20 9E B7 E0 25 C070 : 00 D0 0D 78 A9 AA A0 C0 1F C078 : 8D 14 03 8C 15 03 58 60 ED C080 : 78 A9 BF A0 C0 8D 14 03 9F C088 : 8C 15 03 58 60 A2 00 A9 D9 C090 : 58 9D 00 04 E8 D0 FA 9D 74 C098 : 00 05 E8 D0 FA 9D 00 06 18 C0A0 : E8 D0 FA 9D E8 06 E8 D0 67 C0A8 : FA 60 20 E7 C0 D0 35 E6 0D C0B0 : FA A6 FA E0 0B D0 05 A9 77 C0B8 : 03 AA 85 FA 4C D1 C0 20 68 C0C0 : E7 C0 D0 20 C6 FA A6 FA 14 C0C8 : E0 FF D0 05 A9 07 AA 85 05 C0D0 : FA A0 00 8A 0A 0A 0A AA DA C0D8 : BD 07 C1 99 C0 3A E8 C8 CF C0E0 : C0 08 D0 F4 4C 31 EA E6 3F C0E8 : FE A5 FE CD 05 C1 F0 03 5A C0F0 : A9 0A 60 A9 00 85 FE 60 D5 C0F8 : 78 A9 31 A0 EA 8D 14 03 17 C100 : 8C 15 03 58 60 00 00 3C 61 C108 : 3C 18 00 00 00 00 18 3C 29 C110 : 18 00 00 00 00 18 3C 18 0A C118 : 00 00 00 00 18 3C 3C 00 6D C120 : 00 00 00 18 3C 3C 18 00 2A C128 : 00 00 18 3C 3C 18 00 00 3B C130 : 00 18 3C 3C 18 00 00 00 55 C138 : 18 3C 3C 18 00 00 00 18 B1 C140 : 3C 3C 18 00 00 00 00 3C 19 C148 : 3C 18 00 00 00 00 18 3C 69 C150 : 18 00 00 00 00 18 3C 18 4A C158 : 00 00 00 00 18 3C 3C 57
0 rem ************************
1 rem ** pseudo-scroll-demo **
2 rem **--------------------**
3 rem ** (c) 1985 by **
4 rem ** n.bergerhoff **
5 rem ** meisenweg 22 **
6 rem ** 5020 frechen 4 **
7 rem ** tel. 02234/64610 **
8 rem ************************
9 :
10 init=49152:ein=49232:aus=49400
11 sysinit
12 :
100 print"{clr}{wht} XXX XXX XXXX X X XXX XXXX
110 print" X X X X X X X X X X
120 print" X X X X X X X X X X
130 print" XXX XX XXX X X X X X X
140 print" X X X X X X X X X
150 print" X X X X X X X X X
160 print" X XXX XXXX XX XXX XXXX
170 print
180 print" XXX XXX XXX XXXX X X
190 print" X X X X X X X X
200 print" X X X X X X X X
210 print" XX X XXX X X X X
220 print" X X X X X X X X
230 print" X X X X X X X X
240 print" XXX XXX X X XXXX XXXX XXXX
250 sysein,3,1,0
260 gosub1000:print"{lblu}{clr}"
270 sysein,3,0,0
280 printtab(11)"{down}{down}{down}{wht}pseudo-scroll-demo"
290 printtab(17)"{down}{down}{down}{down}hoch"
300 gosub1000
310 sysein,3,1,1
320 printtab(16)"{up}runter"
330 gosub1000
340 sysein,1,1,1
350 printtab(16)"{up}schnell"
360 gosub1000
370 sysein,10,1,1
380 printtab(16)"{up}langsam"
390 gosub1000
400 print"{lblu}{clr}":sysein,3,0,0
410 printtab(12)"{wht}taste{lblu}X{wht}druecken"
420 wait198,255:poke198,0:end
430 :
1000 fori=1to3000:next:return
100 -.BA$C000 110 -; 120 -; ********************* 130 -; ** PSEUDO-SCROLL ** 140 -; **-----------------** 150 -; ** (C) 1985 BY ** 160 -; ** N.BERGERHOFF ** 170 -; ** MEISENWEG 22 ** 180 -; ** 5020 FRECHEN 4 ** 190 -; ********************* 200 -; 210 -.GL V=53248 ;VIC-ADRESSE 220 -.GL SATZ=53248 ;ZEICHENSATZ 230 -.GL ZIEL=14336 ;ZIEL-ADRESSE 240 -.GL IRQVEC=$0314 ;IRQVECTOR 250 -.GL CHKOM=$AEFD ;KOMMA? 260 -.GL GETBYT=$B79E ;BYTE HOLEN 270 -.GL ZDEF=ZIEL+704 ;NEUES ZEICHEN 280 -.GL IRQALT=$EA31 ;ALTE ROUTINE 290 -; 300 -INIT SEI ;KEIN INTERRUPT 310 - LDA $01 ;REG.1 320 - PHA ;RETTEN 330 - AND #251 340 - STA $01 ; 350 - LDA #>(SATZ) ;HIGH-BYTE 360 - STA $03 ;MERKEN 370 - LDA #>(ZIEL) ;NOCHMAL FUER 380 - STA $05 ;DAS ZIEL 390 - LDY #00 400 - STY $02 ;LOW-BYTES 410 - STY $04 ;LOESCHEN 420 - LDX #$10 430 -COPY LDA (02),Y ;LADEN UND 440 - STA (04),Y ;KOPIEREN 450 - INY 460 - BNE COPY 470 - INC $03 ;HIGH-BYTES 480 - INC $05 ;ERHOEHEN 490 - DEX 500 - BNE COPY 510 - PLA ;VOM STACK 520 - STA $01 ;ZURUECKHOLEN 530 - LDA V+24 540 - ORA #14 ;NEUER 550 - STA V+24 ;ZEICHENSATZ 560 - CLI 570 - LDA #08 ;K/G SCHRIFT 580 - JSR $FFD2 ;BLOCKIEREN 590 -IN LDX #40 600 - LDY #00 610 -IN1 LDA DEF,X ;NEUE ZEICHEN- 620 - STA ZDEF,Y ;DEFINITION 630 - INX 640 - INY 650 - CPY #08 660 - BNE IN1 670 - LDA #05 680 - STA $FA ;MERKER1 690 - LDA #00 700 - STA $FE ;MERKER2 710 - RTS 720 -; 730 -AN JSR IN 740 - JSR CHKOM ;KOMMA? 750 - JSR GETBYT ;BYTE HOLEN 760 - STX SPEED ;MERKEN 770 - JSR CHKOM 780 - JSR GETBYT ;VIDEQRAM MIT 790 - CPX #00 ;88 FUELLEN? 800 - BNE A0 810 - JSR FULL ;JA 820 -A0 JSR CHKOM 830 - JSR GETBYT 840 - CPX #00 ;HOCH? 850 - BNE A1 860 - SEI ;JA 870 - LDA #<(IRQ1) 880 - LDY #>(IRQ1) 890 - STA IRQVEC 900 - STY IRQVEC+1 910 - CLI 920 - RTS 930 -A1 SEI ;RUNTER 940 - LDA #<(IRQ2) 950 - LDY #>(IRQ2) 960 - STA IRQVEC 970 - STY IRQVEC+1 980 - CLI 990 - RTS 1000 -; 1010 -FULL LDX #00 ;VIDEORAM 1020 - LDA #88 ;MIT 88 1030 -F1 STA 1024,X ;AUFFUELLEN 1040 - INX 1050 - BNE F1 1060 -F2 STA 1280,X 1070 - INX 1080 - BNE F2 1090 -F3 STA 1536,X 1100 - INX 1110 - BNE F3 1120 -F4 STA 1768,X 1130 - INX 1140 - BNE F4 1150 - RTS 1160 -; 1170 -IRQ1 JSR TIME ;IST ZEIT 1180 - BNE BACK ;ERREICHT? 1190 - INC $FA 1200 - LDX $FA 1210 - CPX #11 1220 - BNE IR1 1230 - LDA #03 1240 - TAX 1250 - STA $FA 1260 -IR1 JMP WEITER 1270 -; 1280 -IRQ2 JSR TIME ;IST ZEIT 1290 - BNE BACK ;ERREICHT? 1300 - DEC $FA 1310 - LDX $FA 1320 - CPX #$FF 1330 - BNE WEITER 1340 - LDA #07 1350 - TAX 1360 - STA $FA 1370 -WEITER LDY #00 1380 - TXA 1390 - ASL ; 1400 - ASL ; MAL 8 1410 - ASL ; 1420 - TAX 1430 -W1 LDA DEF,X ;LADEN UND NEU 1440 - STA ZDEF,Y ;DEFINIEREN 1450 - INX 1460 - INY 1470 - CPY #08 1480 - BNE W1 1490 -BACK JMP IRQALT ;ALTE ROUTINE 1500 -; 1510 -TIME INC $FE 1520 - LDA $FE 1530 - CMP SPEED 1540 - BEQ T1 1550 - LDA #10 1560 - RTS 1570 -T1 LDA #00 1580 - STA $FE 1590 - RTS 1600 -; 1610 -AUS SEI 1620 - LDA #$31 ;ALTE VECTOREN 1630 - LDY #$EA 1640 - STA IRQVEC ;HERSTELLEN 1650 - STY IRQVEC+1 1660 - CLI 1670 - RTS ;ZURUECK 1680 -; 1690 -SPEED .BY 0,0 1700 -; 1710 -; **** ZEICHENDEFINITIONEN **** 1720 -; 1730 -DEF .BY 60,60,24,0,0,0,0,24 1740 -.BY 60,24,0,0,0,0,24,60 1750 -.BY 24,0,0,0,0,24,60,60 1760 -.BY 0,0,0,0,24,60,60,24 1770 -.BY 0,0,0,24,60,60,24,0 1780 -.BY 0,0,24,60,60,24,0,0 1790 -.BY 0,24,60,60,24,0,0,0 1800 -.BY 24,60,60,24,0,0,0,0 1810 -.BY 60,60,24,0,0,0,0,24 1820 -.BY 60,24,0,0,0,0,24,60 1830 -.BY 24,0,0,0,0,24,60,60
1520-Plotter als vollwertiger Drucker
Dieses kleine Programm (Listing 3) schickt alle Druckausgaben, die zur Geräteadresse 4 gesendet werden, automatisch zum 1520-Plotter mit der Geräteadresse 6. Das heißt, daß fertige Programme nicht mehr mühselig nach OPEN-Befehlen durchkämmt werden müssen, um die Druckerausgaben entsprechend umzulenken. Weiterhin wird der Plotter automatisch auf Kleinschrift gestellt, wenn diese am C 64 eingeschaltet ist.
Auch läßt sich die Zeilenlänge am Plotter einstellen: »POKE 713,Z:POKE 754,Z«, wobei folgende Werte für Z zulässig sind:
- 0: 80 Zeichen/Zeile (eingestellter Wert)
- 1: 40 Zeichen/Zeile
- 2: 20 Zeichen/Zeile
10 dimh(75):fori=0to9 20 h(48+i)=i:h(65+i)=i+10:next 30 fori=679to764:reada$ 40 h=asc(a$):l=asc(right$(a$,1)) 50 d=h(h)*16+h(l):pokei,d 60 next:poke794,167:poke795,2 100 dataa5,b8,85,fb,a5,ba,c9,04,f0,03,4c,4a,f3,a9,03,85,b9,a9,06,85 110 databa,a9,7f,85,b8,20,4a,f3,a6,b8,20,c9,ff,a9,00,20,d2,ff,a5,b8 120 data20,c3,ff,a9,66,c5,b9,f0,15,85,b9,a9,7e,85,b8,ad,18,d0,29,02 130 data4a,18,69,30,8d,c9,02,4c,c0,02,a9,00,85,b9,a9,00,8d,c9,02,a5 140 datafb,85,b8,4c,4a,f3