GET mit blinkendem Cursor

[Computer Persönlich, Jahrgang 1984, Nr. 11, Seite 56]

GET ist nicht gleich GET

Das hier vorgestellte Programm ist eine etwas modifizierte ROM-Routine, die den GET-Befehl mit blinkendem Cursor ermöglicht.
Nicht nur BASIC-Dialekt, sondern auch die Art und Weise der Ausführung von Befehlen variiert von System zu System. Was beim GET des Apple II-Basic unter Umständen als störend empfunden wird - es erscheint der Cursor und wartet auf eine Eingabe - sucht man beim Commodore vergebens; hier wird bei leerem Tastaturspeicher ein Leerzeichen übernommen.
Beide Lösungen haben Vor- und Nachteile. Es ergibt sich aber oft, daß im Programm Abfragen eingebaut sind, die narrensicher sein sollen. Das geht mit keinem INPUT-Befehl. Versucht man sich mit GET, muß in mühsamer »Handarbeit« ein Cursor simuliert werden.
Diese Hilfsroutine in Versionen für alle Commodore-Computer liefert uns ein GET mit Cursor. Nach dem SYS erhält man den ASCII-Wert der gedrückten Taste durch den angegebenen PEEK-Befehl; nach dem USR-Aufruf steht er in der Variablen. Der Eingabe kann nun wie bei ganz normalem GET eine Abfrage auf Zulässigkeit des Wertes folgen (zum Beispiel können alle oder bestimmte Control-Codes unterdrückt werden; kein unbedachtes »CLR HOME« etc.). Die Ausgabe des Zeichens erfolgt über PRINT.
(Reinhard Kratzberg)

Dieser Artikel  ist auch als eingescanntes PDF-Dokument (233 KB) verfügbar.

Hinweis:
Die im Artikel (s.u.) angegebenen verschiedenen ROM-Einsprungadressen für GETIN und CHROUT können auch durch die für alle hier aufgeführten Systeme gemeinsamen Adressen in der Kernalsprungtabelle ($FFXX) ersetzt werden:
$FFE4: GETIN
$FFD2: CHROUT
Assemblerlisting der GET-Routine für Commodore 64 und VC20
ASSEMBLERLISTING
Version VIC20 / CBM 64
HEXZAHLEN GELTEN FUER DEN CBM 64

 10 .,  033D A5 C6     START LDA KEY
 15 .,  033F 85 CC           STA CURSOR
 20 .,  0341 F0 FA           BEQ START
 25 .,  0343 78              SEI
 30 .,  0344 A5 CF           LDA BLINK
 35 .,  0346 F0 0C           BEQ MARK1
 40 .,  0348 A5 CE           LDA CHAR
 45 .,  034A AE 87 02        LDX COLOR
 50 .,  034D A0 00           LDY #$00
 55 .,  034F 84 CF           STY BLINK
 60 .,  0351 20 13 EA        JSR BSOUT
 65 .,  0354 20 B4 E5  MARK1 JSR GETIN
 70 .,  0357 8D 3C 03        STA ASCODE
 75 .,  035A 4C A2 B3  ENDE  JMP INTFP
READY.

 
Assemblelisting der GET-Routine für die Commodore-Computer der Serien 2001 bis 8001
ASSEMBLERLISTING
Version CBM 2/3/4/8000
DIE HEXZAHLEN GELTEN FUER CBM 4000

 10 .,  033D A5 9E     START LDA KEY
 15 .,  033F 85 A7           STA CURSOR
 20 .,  0341 F0 FA           BEQ START
 25 .,  0343 78              SEI
 30 .,  0344 A5 AA           LDA BLINK
 35 .,  0346 F0 0A           BEQ MARK1
 40 .,  0348 A5 A9           LDA CHAR
 45 .,  034A A0 00           LDY #$00
 50 .,  034C 84 AA           STY BLINK
 55 .,  034E A4 C6           LDY CURSP
 60 .,  0350 91 C4           STA (CURAD),Y
 65 .,  0352 20 A7 E0  MARK1 JSR GETIN
 70 .,  0355 8D 3C 03        STA ASCODE
 75 .,  0358 4C CB C4  ENDE  JMP INTFP
READY.

 
Ein typischer Anwendungsfall
ANWENDUNG:
 
BEISPIEL MIT SYS:
 
 100 SYS829:A=PEEK(828):A$=CHR$(A)
 110 IFA....
 
 190 PRINTA$;:GOTO100
 
BEISPIEL MIT USR:

 100 POKEUS,61:POKEUS+1,3
 110 A=USR(A):A$=CHR$(A)
 120 IFA....
 
 190 PRINTA$;:GOTO100

VOR ANWENDUNG DER USR-FUNKTION MUSS DER
USR-VEKTOR GESETZT WERDEN. DAZU WIRD DER
VARIABLEN 'US' DER WERT '1' BZW. BEIM
CBM 64 DER WERT '785' ZUGEWIESEN.
 
ROM-Routinen und Systemadressen für alle Commodore-Systeme
ROMROUTINEN UND SYSTEM-ADRESSEN:

 2000  3000  4000  8000  VC20  CBM64  NAME   BESCHREIBUNG
 
  $01   $01   $01   $01   $01  $0311  USRL   USR-VEKTOR LOW-BYTE
  $02   $02   $02   $02   $02  $0312  USRH   USR-VEKTOR HIGH-BYTE
  $E0   $C4   $C4   $C4   $D1    $D1  CURAD  CURSORSTELLUNG IM BILDSCHIRM-RAM
  $E2   $C6   $C6   $C6   $D3    $D3  CURSP  CURSORSPALTE (0-39)
$020D   $9E   $9E   $9E   $C6    $C6  KEY    ANZAHL DER BYTES IM TASTATURPUFFER
$0224   $A7   $A7   $A7   $CC    $CC  CURSOR FLAG FUER CURSOR AN/AUS
$0226   $A9   $A9   $A9   $CE    $CE  CHAR   ZEICHEN UNTER CURSOR (BSC-CODE)
$0227   $AA   $AA   $AA   $CF    $CF  BLINK  FLAG FUER CURSOR IN BLINKPHASE
                        $0287  $0287  COLOR  FARBE UNTER DEM CURSOR
$033C $033C $033C $033C $033C  $033C  ASCODE ASCII-CODE DER GEDRUECKTEN TASTE
$D287 $D27C $C4CB $C4CB $D3A2  $B3A2  INTFP  WANDELT INTEGERZAHL AUS A-REGISTER
                                             IN FLOATINGPOINTZAHL IN ACCU#1
            $E606 $E606 $EAA1  $EA13  BSOUT  SETZT ZEICHEN (BSC-CODE) AUF SCHIRM
$E27D $E285 $E0A7 $E0A7 $E5CF  $E5B4  GETIN  HOLT ZEICHEN VON DER TASTATUR
$E3EA $E3D8 $E202 $E202 $E742  $E716  CHROUT GIBT ASCII-ZEICHEN AUF DEN SCHIRM
 
ACHTUNG:
BEIM CBM 2001 IST ZU BEACHTEN, DASS MANCHE SYSTEM-ADRESSEN IM GEGENSATZ ZU DEN
ANDEREN RECHNERN NICHT IN DER ZEROPAGE LIEGEN: DAS ASSEMBLERLISTING MUSS ALSO
HIER ANSTELLE DER ZEROPAGE-BEFEHLE ABSOLUTE ADRESSIERUNGEN ENTHALTEN; DADURCH
AENDERN SICH AUCH DIE RELATIVEN SPRUENGE!
 

[Seitenanfang] [Artikel] [Info] [Links] [Download] [Home]
Erstellt von WTE, am 10. Februar 2006; überarbeitet am 11. Februar 2006