Worktool — eine Programmierhilfe
Drei nützliche Optionen zur Programmeingabe werden durch dieses Programm realisiert. Farbwahl, aktuelle Zeitangabe und Warnton bei mehr als 80 Zeichen Eingabe auf Tastendruck.
Wie der Name schon sagt, hilft das »Worktool« dem Programmierer bei der Eingabe seiner eigenen Programme. Mehrere Optionen, die ansonsten nur bei erheblich teureren Geräten oder Hardware-Erweiterungen zu finden sind, werden ohne Basicspeicherverlust vom Toolkit übernommen.
Mittels Funktionstasten werden folgende Erweiterungen angesprochen:
— F1: Rahmen, Innenteil und Cursor erscheinen in einer vorher von Ihnen festgelegten Farbkombination.
Beim Schreiben von Programmen oder deren Test wird die Farbkombination, die Sie zur Eingabe verwenden, oft durch das Programm geändert. Haben Sie die Worktoolerweiterung eingegeben, können Sie sich jetzt, nach dem Probelauf 20 Tastendrücke ersparen um Farbkombinationen, wie zum Beispiel braun-rot-violett in Ihre Lieblingskombination zu verwandeln.
— F3: Ausgabe der aktuellen Uhrzeit, oder einer Stoppuhr. Wollen Sie wissen wieviel Uhr es ist, oder wie lange Sie schon mit dem Toolkit arbeiten, so genügt ein Druck auf F3. Wie sonst nur bei Steckmodulen der oberen Preisklasse wird vom Computer in der Mitte der 1. Zeile die Zeit in reverser Darstellung ausgegeben. Jedoch nicht permanent, sondern nur solange die Taste gedrückt ist. Das hat den Vorteil, daß keine Bildschirmzeile verloren geht.
— F5 und F7: Falls der eine oder andere von Ihnen schon einmal am CBM 4032 gearbeitet hat, wird er bestimmt bemerkt haben, daß dieser eine praktische Eingabehilfe besitzt. Er gibt, wenn der Cursor eine bestimmte Spalte erreicht, einen Piepser aus. Diese Option wurde beim Worktool noch erheblich verbessert. Im Direktmodus gibt er jetzt immer einen hellen Ton (ähnlich Tastaturklick) aus, sobald der Cursor die Spalte 35 oder 75 erreicht. Im Programmeingabemodus dagegen wird bei 35 der Klick, bei 75 ein Sägezahnton, und bei 80 ein auf- und abschwellender Ton erzeugt. Jeder kennt das ungeheuer langwierige und nervenzermürbende Editieren einer falsch eingegebenen PRINT-Zeile. Gerade im Programmierrausch schreibt man oft über die maximale Zeilenlänge hinaus, und muß später zeitaufwendig ausbessern. Ist mit F5 die Tonoption eingeschaltet, gibt der Computer rechtzeitig die oben genannten »Erinnerungstöne« aus. Mit F7 läßt sich diese Funktion ausschalten (hebt das Klima beim Mittagsschlaf Ihrer Frau).
Im Programm selbst wurde weitgehend auf Steuerzeichen verzichtet, und stattdessen der CHR$ und POKE-Befehl verwendet. Die DATAs sind der Übersicht und der Arbeitsersparnis halber in hexadezimaler Form einzugeben und werden von einer Routine automatisch umgerechnet. Das Programm gibt bei Fehleingabe einen Checksumfehler mit der Angabe des betreffenden Datenblocks aus. Die Funktionen einzelner Abschnitte sind in REM-Zeilen kurz umrissen. Das Basic-Programm benötigt 3k Speicher. Nachdem Sie Ihre Eingaben gemacht haben, löscht sich der Basic-Teil selbst und nur noch zirka 250 Bytes im abgeteilten Maschinensprachespeicher bei $C000 sind nötig. Es ist also der gesamte Basic-RAM frei verfügbar.
(Ulrich Grothaus / rg)10-110 | Ausgabe von Kopf und Menü |
120-140 | Eingabe der gewünschten Farbkombinationen |
220 | Farbwerte für Maschinenprogramm merken |
230 | Eingabe der aktuellen Uhrzeit beziehungsweise wenn nur RETURN der Nullstellung der Stoppuhr |
240 | diese Funktion rechnet den Dezimalwert in den TOD-BCD-Wert um |
250-280 | Auswerten des Zeitstrings, Einlesen der Werte in die CIAs und initialisieren der TOD Register, sowie starten der Uhr |
260-410 | Einlesen der Vorroutine und des Hauptteils sowie Start der Vorroutine. Die GOSUBs springen zum Umrechnen und Einpoketeil |
490 | Mit dem POKE 792, 193 wird das Low- byte des NMI-Interruptvektors auf einen RTI gelenkt. Dadurch ist die RESTORE- Taste ausgeschaltet, was ein Zurücksetzen der unteren Pages verhindert. Im Bedarfsfall könnten Sie dies durch Löschen der Zeile oder nachträglich mit POKE792,71 rückgängig machen. |
500-590 | Kurze Erklärungen und Abfrage, ob sich das Basic-Programm löschen kann. Geben Sie »N« ein, beginnt es von vorne. |
660-690 | Ausgabe des Kopfes |
700-710 | Sobald eine Taste gedrückt wird, löscht sich der Bildschirm, der Basic-Teil, und das Maschinenprogramm wird gestartet. Ferner wird der Bildschirm gelöscht, so daß der gesamte Bildschirm zum Programmieren frei ist und kein Ausgabekopf stört. |
710 | Die Schleife dient auf recht unkonventionelle Weise dazu, das Basic-Programm zu löschen, aber trotzdem noch den SYS abzuarbeiten. |
720-760 | Einleseroutine für den 1. Maschinenspracheteil. Zeile 730 und 740 rechnen die hexadezimalen DATAs in Dezimalzahlen von 0 bis 255 um. |
770-790 | DieseDATA-Zeilen enthalten den 1. Teil des Maschinenprogramms. |
800-840 | Einleseroutine für den 2. Maschinenspracheteil. |
850-1180 | Diese DATA-Zeilen enthalten das Interruptprogramm. |
$ C000-C00D | Der lnterrruptvektor wird auf das Worktool zusätzlich zur normalen Interruptroutine des Betriebssystems jede sechzigstel Sekunde abgearbeitet wird. |
$ C00E-C03A | Hier wird entschieden ob aufgrund einer gedrückten Funktionstaste oder eines Registerwertes in ein Unterprogramm verzweigt werden soll. Am Ende dieses Teils beziehungsweise einer aufgerufenen Unterroutine wird die normale Interruptroutine angesprungen. |
$C040-C052 | Falls F1 gedrückt ist, setzt diese Routine die Farbregister auf den eingestellten Wert, das heißt der Bildschirm erscheint in den von Ihnen gewünschten Farben. |
$C057-C08E | Wenn F3 gedrückt ist, werden die TOD- Register ausgewertet und die Zeit aktualisiert beziehungsweise ausgegeben. Dies hat gegenüber ähnlichen Programmen den Vorteil daß Sie die Zeit bei ihrer Programmeingabe überschreiben können, was bei der Ausgabe der Zeit im Interrupt nicht möglich gewesen wäre. Sie könnten ansonsten die 1. Bildschirmzeilen nicht benutzen, weil das einen Syntax Error hervorrufen würde. |
$ C091-C0A6 | Die derzeitige Cursorposition wird abgefragt und bei Bedarf, sofern Sie diese Option aktiviert haben, in eine Tonausgaberoutine gesprungen. |
$ C0AD-C109 | In diesem Teil werden die verschiedenen Töne ausgegeben. |
0 rem{del}{del}{del}{del}{del}worktool 1 rem{del}{del}{del}{del}{del}ulrich grothaus 2 rem{del}{del}{del}{del}{del}fallweg 18 3 rem{del}{del}{del}{del}{del}8450 amberg 4 : 5 : 10 rem -------------------------------- 20 rem abfrage der optionswerte 30 rem -------------------------------- 40 : 50 : 60 restore:poke 53280,0:poke53281,0 70 printchr$(147):poke646,5:print"***************{wht}worktool{grn}*****************" 80 poke646,7:printtab(8)"von ulrich grothaus" 90 poke646,15:print:print:print:print"options:";,:poke646,10 100 print"f1=farbe setzen":print,"f3=zeit ausgeben":print,"f5=warnton ein" 110 print,"f7=warnton aus":print:print:poke646,14 120 input"farbcode rahmen";r 130 input"farbcode grund";g 140 input"farbcode cursor";c 150 : 160 : 170 rem ------------------------------- 180 rem wertuebergabe maschinenprogramm 190 rem ------------------------------- 200 : 210 : 220 poke49425,r:poke49426,g:poke49427,c 230 print:printtab(7);"hhmmss":printchr$(145);:input"zeit ";z$ 240 def fnf(x)=int(x/10)*16+(x-int(x/10)*10) 250 h=val(left$(z$,2)):m=val(mid$(z$,3,2)):s=val(right$(z$,2)) 260 poke56335,peek(56335)and127 270 poke56329,fnf(s):poke56330,fnf(m):poke56331,fnf(h):poke56328,0 280 poke56334,peek(56334)or128 290 : 300 : 310 rem ------------------------------- 320 rem einlesen der daten 330 rem ------------------------------- 340 : 350 : 360 gosub 720 370 fort=1to4:sys36500:next 380 fort=1to40:print:next 390 poke646,13:print"das einlesen des maschinenprogrammes dauert 15 sekunden" 400 gosub 800 410 fort=1to4:sys36500:next 420 : 430 : 440 rem ------------------------------ 450 rem benutzerhinweise 460 rem ------------------------------ 470 : 480 : 490 poke792,193:printchr$(147):poke646,7 500 print"aus programmtechnischen gruenden ist der {wht}nmi-interrupt";:poke646,7 510 print" ausgeschaltet(zeile 490)." 520 print"das worktool liegt bei 49152." 530 print"es sind 38911 bytes basic-ram free." 540 poke53280,0:poke646,3:print"{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}kann ich mich loeschen (j/n){$a0}?" 550 fort=1to11:getn$:next 560 geta$:ifa$=""then560 570 ifa$="n"thengoto60 580 : 590 : 600 rem ------------------------------- 610 rem loeschen des basicteils 620 rem start der tool-irq routine 630 rem ------------------------------- 640 : 650 : 660 poke53280,peek(49425):poke53281,peek(49426):poke646,peek(49427) 670 printchr$(147);"****************QworktoolQ**************" 680 print" -----38634 bytes free----":print 690 print"*************1984 by groto**************" 700 geta$:ifa$=""then700 710 printchr$(147):fort=2048to2060:poket,0:next:poke45,3:poke46,8:sys49152:end 720 ps=0:forad= 36500 to 36519 :readda$ 730 l=asc(left$(da$,1))-48:r=asc(right$(da$,1))-48 740 po=(l+(l>9)*7)*16+r+(r>9)*7:pokead,po:ps=ps+po:next 750 ifps<> 2456 thenprint"{clr}pruefsummenfehler im 1. datablock.":end 760 return 770 dataa0,00,a2,00,8e,20,d0,e8 780 dataf0,03,4c,98,8e,c8,f0,03 790 data4c,96,8e,60 800 ps=0:forad= 49152 to 49420 :readda$ 810 l=asc(left$(da$,1))-48:r=asc(right$(da$,1))-48 820 po=(l+(l>9)*7)*16+r+(r>9)*7:pokead,po:ps=ps+po:next 830 ifps<> 32697 thenprint"{clr}pruefsummenfehler im 2. datablock.":end 840 return 850 dataea,78,a9,0e,8d,14,03,a9 860 datac0,8d,15,03,58,60,8d,04 870 datad4,ea,a9,04,c5,c5,f0,28 880 dataa9,05,c5,c5,f0,39,a9,06 890 datac5,c5,d0,03,8d,10,c1,a9 900 data03,c5,c5,d0,03,8d,10,c1 910 dataad,10,c1,c9,06,f0,5a,4c 920 data31,ea,60,00,ea,ea,ea,ea 930 dataad,11,c1,8d,20,d0,ad,12 940 datac1,8d,21,d0,ad,13,c1,8d 950 data86,02,4c,18,c0,ea,ea,ad 960 data0b,dc,29,7f,a2,10,20,78 970 datac0,ad,0a,dc,a2,13,20,78 980 datac0,ad,09,dc,a2,16,20,78 990 datac0,ad,08,dc,4c,31,ea,00 1000 data48,29,f0,4a,4a,4a,4a,18 1010 data69,b0,9d,00,04,68,29,0f 1020 data18,69,b0,9d,01,04,60,ea 1030 dataea,a5,d3,c9,23,f0,11,a5 1040 datad3,c9,46,f0,2f,a5,d3,c9 1050 data4f,f0,4d,4c,31,ea,60,00 1060 dataea,ea,ea,a9,06,8d,00,d4 1070 dataa9,78,8d,01,d4,a9,0a,8d 1080 data18,d4,a9,33,8d,05,d4,a9 1090 data00,8d,06,d4,a9,11,8d,04 1100 datad4,4c,31,ea,ea,ea,ea,a9 1110 data06,8d,00,d4,a9,32,8d,01 1120 datad4,a9,0a,8d,18,d4,a9,63 1130 data8d,05,d4,a9,00,8d,06,d4 1140 dataa9,21,8d,04,d4,4c,31,ea 1150 dataa9,01,8d,03,d4,a9,0f,8d 1160 data18,d4,a9,ff,8d,06,d4,a9 1170 data00,8d,05,d4,a9,41,8d,04 1180 datad4,4c,31,ea,00