Escape-Taste für Gänsefüßchen-Modus
Beim Editieren geschieht es oft, daß man anstelle einer Cursorbewegung ein reverses Feld erhält, auch wenn man das gar nicht wünscht. Der einzige Weg zurück zur normalen Cursorkontrolle führte bis jetzt über das Drücken der RETURN-Taste. Mit dieser Routine kommen Sie durch einfachen Druck auf die »F7«-Taste aus dem »Gänsefüßchen-Modus« heraus.
Vielleicht haben Sie sich auch schon über die etwas exotisch klingenden Ausdrücke im Titel gewundert, aber sie beziehen sich auf eine typische Eigenschaft des Commodore Basic-Editors. Wenn man Anführungszeichen oder die INSERTTaste getippt hat, wird jedes Drücken einer Cursortaste nicht durch eine direkte Bewegung des Cursors, sondern durch ein reverses Steuerzeichen quittiert. Nebenbei: dasselbe geschieht beim Drücken der Funktions-, der CLR/HOME- oder der CTRL-Taste zusammen mit den Farbentasten. Dieser Modus, in dem sich der Editor dann befindet, wird Quote-Modus, zu deutsch »Gänsefüßchen-Modus« oder programmierter Cursor genannt.
Manchmal ist das sehr erwünscht, wenn man zum Beispiel die Cursor- oder Farbsteuersequenzen ins Programm einbinden möchte. Oft ist es aber auch unerwünscht, und man überschreibt durch Unachtsamkeit eine halbe Programmzeile mit reversen »Q« oder sonstigen Steuerzeichen. Aus dem »Gänsefüßchen-Modus« heraus gelangt man nur, indem man noch einmal die Taste für Anführungsstriche oder RETURN drückt. Wie gut wäre es, wenn man mit einem einfachen Tastendruck aus dem störenden Quote-Modus herausgelangen könnte, ohne irgendein Zeichen überschreiben zu müssen.
Die Escape-Routine realisiert diese Möglichkeit vollständig. Durch simplen Druck auf die Funktionstaste »F7« werden alle Bits gelöscht, die verhindern, daß sich der Cursor normal steuern läßt. »F7«ermöglichtalsodas Entkommen (englisch: escape) aus diesem Modus.
Damit Sie auch immer genau wissen, wann welcher Modus aktiv ist, stehen in der rechten oberen Bildschirmecke die entsprechenden Buchstaben in weißer Farbe. Haben Sie Anführungsstriche geschrieben, dann erscheint ein »Q« als Zeichen dafür, daß der Quote-Modus eingschaltet ist. Das »Q« steht dort so lange, bis der Modus ausgeschaltet wird, das heißt, bis entweder RETURN, Schlußzeichen oder »F7« gedrückt wurde. Wollen Sie etwas in reverser Schrift erscheinen lassen, dann müssen Sie CTRL/RVS ON drücken und schon erscheint ein weißes »R« als Abkürzung für Revers-Modus in der Bildschirmecke. Als drittes Zeichen kann noch das »I« vorkommen, nämlich dann, wenn die INSERT-Taste benutzt wurde. Im Insert-Modus kann man nicht einmal ein falsch eingetipptes Zeichen mit der DEL-Taste löschen, da nur reverse »T«s erzeugt werden, aber ein Druck auf »F7« genügt, und das Problem ist behoben.
Das Programm wird dann mit SYS49152 aufgerufen, und ab sofort ist die Routine »Escape-Taste« in den Systeminterrupt eingebunden. Das allerdings nur solange bis RUN/STOP-RESTORE gedrückt wird, dann wird der lnterruptvektorwieder direkt auf die normale Interruptroutine gelenkt und die neue Routine wird so lange übergangen, bis das Programm neu gestartet wird.
Da diese Routine für den Einsatz beim Programmieren gedacht ist, sollten dabei keine Probleme entstehen.
Als einzige Einschränkung muß gesagt werden, daß die Benutzer von Kassettengeräten bei einem Zugriff auf die Datasette die Routine mit RUN/STOP-RESTORE ausschalten sollten, da Kassettenoperationen den Interruptvektor auf spezielle Kassettenroutinen umschreiben und sich ein schon verstellter IRQ-Vektor negativ auswirkt.
(Christian Spörri/aw)Eingabehinweise
Wer im Besitz eines Assembler ist, kann das Assemblerprogramm (Listing 1) abtippen, alle anderen verwenden bitte den Weg über den MSE (Listing 2).
Die Startadresse des Programmes liegt bei $C000 gleich 49152 dezimal, die Endadresse bei $C08F oder 49295.
Das Programm wird natürlich nach dem Abtippen und Speichern wieder mit der Sekundäradresse 1, das heißt absolut geladen. Nach dem Laden muß »NEW« eingegeben werden, damit die Basic-Zeiger, die in den Bereich $C000-$CFFF verstellt wurden, wieder »zurechtgebogen« werden.
10 SYS9*4096 15 .OPT P,OO 20 ; 25 ;**************************************** 30 ;===== ESCAPE-TASTE FUER QUOTE-MODE ===== 35 ;* AUF COMMODORE 64 * 40 ;**************************************** 45 ;* * 50 ;* CHRISTIAN SPOERRI * 55 ;* LANGWEID 9 * 60 ;* CH-8045 ZUERICH/SCHWEIZ * 65 ;* * 70 ;* TEL.00411/463 65 94 * 75 ;* * 80 ;**************************************** 85 ; 90 ; 95 ; 100 ; 105 ; 110 COUNT =$FB ;VERZOEGERUNGSZAEHLER 115 DELAY =$02 ;ANZAHL DURCHLAEUFE BIS 120 : ;ZUR ABFRAGE 125 LASTKEY =$D7 ;ASCII-CODE DER LETZTEN 130 : ;GEDRUECKTEN TASTE 135 QUOTE =$D4 ;FLAGGE FUER QUOTE-MODE 140 : ;(GAENSEFUESSCHEN-MODUS) 145 INVERS =$C7 ;RVS FLAG FUER BILDSCHIRM 150 NINSERT =$DB ;ANZAHL FAELLIGER INSERTS 155 FLAG =$FC ;FLAGGE, OB ZEICHEN GE- 160 : ;LOESCHT WERDEN MUSS 165 BSPALTE =$D3 ;ZEIGER AUF BILDSCHIRM- 170 : ;SPALTE 175 ZEILE =$D1 ;VEKTOR, ZEIGT AUF ZEILENBE- 180 : ;GINN IM BILDSCHIRMSPEICHER 185 CHCURSOR=$CE ;ZEICHEN UNTER CURSOR 190 NOKEYS =$C6 ;ANZAHL ZEICHEN IM TASTATUR- 195 : ;PUFFER 200 KBBUFFER=$277 ;BEGINN DES TASTATURPUFFERS 205 F7 =$88 ;ASCII-CODE DER FUNKTIONS- 210 : ;TASTE 'F7' 215 QSCODE =$11 ;BILDSCHIRMCODE VON "Q" 220 RSCODE =$12 ;BILDSCHIRMCODE VON "R" 225 ISCODE =$09 ;BILDSCHIRMCODE VON "I" 230 NORMIRQ =$EA31 ;EINSPRUNGADRESSE FUER NOR- 235 : ;MALE INTERRUPTROUTINE 240 IRQVCT =$314 ;ADRESSE DES INTERRUPTVECTOR 245 COLOR =$01 ;FARBE DER INDIKATORBUCH- 250 : ;STABEN (WEISS) 255 SCREEN =$427 ;SPEICHERPLATZ IM BILD- 260 : ;SCHIRMSPEICHER 265 CLRTBL =$D827 ;SPEICHERPLATZ IN DER 270 : ;COLORTABELLE 275 ; 280 ; 285 *= $C000 290 ; 300 ; 305 SEI ;INTERRUPT VERHINDERN 310 LDA #<START ;STARTADRESSE DER NEU- 315 LDX #>START ;EN ROUTINE LADEN 316 STA IRQVCT ;IRQ-VEKTOR AUF NEUE 317 STX IRQVCT+1 ;ROUTINE STELLEN 318 CLI ;INTERRUPT ERLAUBEN 320 LDA #DELAY ;VERZOEGERUNGS- 325 STA COUNT ;ZAEHLER SETZEN 335 RTS ;ZURUECK INS BASIC 340 ; 345 START DEC COUNT ;VERZ. ZAEHLER-1 350 BEQ CHANGE ;GENUEGEND UEBERSPR. 355 JMP NORMIRQ ;NEIN, NORMALER IRQ 360 CHANGE LDA #DELAY ;JA,NEUE ROUTINE 365 STA COUNT ;ZAEHLER HOCHSETZEN 370 LDA #$00 375 STA FLAG ;FLAGGE LOESCHEN 380 LDA QUOTE ;EDITOR IM QUOTEMODE 385 BEQ NOTQUOTE ;NEIN, UEBERSPRINGEN 390 LDA #$FF 395 STA FLAG ;FLAGGE SETZEN 400 LDA #QSCODE ;LADE "Q" 405 STA SCREEN ;BRINGE AUF BILDSCHIRM 410 LDA #COLOR ;SETZE FARBE INS 415 STA CLRTBL ;FARBRAUM 420 JMP REVERS ;NAECHSTE ABFRAGE 425 NOTQUOTE LDA #" " ;LEERZEICHEN AN STELLE 430 STA SCREEN ;DES "Q" SCHREIBEN 435 REVERS LDA INVERS ;EDITOR IM REVERSMODE 440 BEQ NOREVERS ;NEIN, UEBERSPRINGE 445 LDA #RSCODE ;LADE "R", PRINTE EINE 450 STA SCREEN-1 ;STELLE LINKS VON "Q" 455 LDA #COLOR ;FARBE 460 STA CLRTBL-1 ;SETZEN 465 JMP INSERT ;NAECHSTE ABFRAGE 470 NOREVERS LDA #" " ;LEERZEICHEN AN STELLE 475 STA SCREEN-1 ;DES "R" SCHREIBEN 480 INSERT LDA NINSERT ;WURDE 'INSERT' 485 : ;GEDRUECKT 490 BEQ NOINSERT ;NEIN, UEBERSPRINGE 495 LDA #$FF 500 STA FLAG ;FLAGGE SETZEN 505 LDA #ISCODE ;"I" LINKS VON "R" 510 STA SCREEN-2 ;HINSCHREIBEN 515 LDA #COLOR ;FARBE 520 STA CLRTBL-2 ;SETZEN 525 JMP KEYTEST ;ZUR ABFRAGE VON ´F7´ 530 NOINSERT LDA #" " ;BLANK AN STELLE 535 STA SCREEN-2 ;DES "I" SCHREIBEN 540 KEYTEST LDA LASTKEY ;LETZTE GEDRUECKTE 545 CMP #F7 ;TASTE GLEICH ´F7´ 550 BNE END ;NEIN, ZUM ENDE 555 LDX #$00 ;JA 560 STX QUOTE ;QUOTE-MODE LOESCHEN 565 STX INVERS ;REVERS-FLAGGE AUS 570 STX NINSERT ;INSERT-MODUS AUS 575 LDA FLAG ;WENN FLAGGE GLEICH 580 BEQ END ;NULL, DANN ZEICHEN 585 : ;NICHT LOESCHEN 590 INX ;JETZT 1 IM X-REG 595 STX NOKEYS ;TASTATURPUFFER ENT- 600 : ;HAELT EIN ZEICHEN 605 LDY BSPALTE ;CURSOR EINE STELLE 610 DEY ;ZURUECKBEWEGEN 615 LDA CHCURSOR ;CHAR. UNTER CURSOR 620 STA (ZEILE),Y ;AUF BILDSCHIRM 625 LDA #$9D ;ASCII-CODE FUER 630 : ;CURSOR ZURUECK 635 STA KBBUFFER ;IN TASTATURPUFFER 640 END JMP NORMIRQ ;ENDE, GEHE ZUR NOR- 645 : ;MALEN IRQ-ROUTINE READY.
PROGRAMM : ESCAPE-T.COD C000 C090 ----------------------------------- C000 : 78 A9 11 A2 C0 8D 14 03 B4 C008 : 8E 15 03 58 A9 02 85 FB A5 C010 : 60 C6 FB F0 03 4C 31 EA 1D C018 : A9 02 85 FB A9 00 85 FC 4E C020 : A5 D4 F0 11 A9 FF 85 FC 38 C028 : A9 11 8D 27 04 A9 01 8D 4F C030 : 27 D8 4C 3A C0 A9 20 8D 13 C038 : 27 04 A5 C7 F0 0D A9 12 06 C040 : 8D 26 04 A9 01 8D 26 D8 DD C048 : 4C 50 C0 A9 20 8D 26 04 31 C050 : A5 D8 F0 11 A9 FF 85 FC 6A C058 : A9 09 8D 25 04 A9 01 8D 3B C060 : 25 D8 4C 6A C0 A9 20 8D 47 C068 : 25 04 A5 D7 C9 88 D0 1B 4E C070 : A2 00 86 D4 86 C7 86 D8 C1 C078 : A5 FC F0 0F E8 86 C6 A4 E0 C080 : D3 88 A5 CE 91 D1 A9 9D 64 C088 : 8D 77 02 4C 31 EA 00 2D A0