Assembler Tipps und Tricks

ZX-Team Forum
Benutzeravatar
PokeMon
User
Beiträge: 4223
Registriert: 31.08.2011, 23:41

Re: Keyboard Routine in Assembler nutzen

Beitrag von PokeMon » 16.02.2017, 21:44

Hier mal ein kleines Abfallprodukt aus meinem Screenshot Tool ZX81HCOP.P

Problem ist manchmal die Keyboardabfrage wobei man seltener mühsam die Tastaturmatrix auswerten möchte sondern den Wert einer gedruckten Taste haben möchte UND gleichzeitig die Debounce Funktionen nutzen will, also nur 1 Tastendruck auswerten möchte.

Code: Alles auswählen

.key:
        LD      HL,$403B
@@:     BIT     0,(HL)
        JR      Z,@b
        LD      BC,($4025)      ; sv LAST_K
        CALL    $0F4B           ; routine DEBOUNCE
        CALL    $07BD           ; routine DECODE
        LD      A,(HL)
        RET
Diese Routine ist eine Kopie der Tastaturauswertung aus dem ROM. Die kann man nicht direkt nutzen, weil kein Rücksprung möglich. Ist recht kurz, die ganze Routine braucht nur 19 Bytes inklusive RET. Sie wartet auf den Druck irgendeiner Taste und liefert dann den Code zurück.

Im CD_FLAG wird der Tastendruck von den ROM Bildschirmroutinen gesetzt inklusive Debounce Funktion. Sobald eine Taste gedrückt wurde wird der Debounce Counter zurückgesetzt und über die Decode Routine dann ausgewertet. Die Decode Routine liefert den Offset aus den ROM Tabellen. Im A Register wird dann der Code hochgeladen. Praktischerweise kann man damit einfach eine Teletype Routine schreiben, mit der man den Bildschirm volltippend kann sofern man die gefährlichen Codes rausfiltert (mit gesetztem Bit 6). Die bringen die Bildschirmanzeige sonst durcheinander.

Also im HL Register steht die Position des Codes, das LD A,(HL) liest dann den konkreten Code der Taste aus. Das funktioniert so für normale und geshiftete Tastaturcodes, sofern man den Status FUNC (SHIFT-NEWLINE) oder GRAPH (SHIFT-9) merkt und jeweils 39/78 Bytes Offset dazu addiert, bekommt man auch die FUNC und GRAPH Codes mitgeliefert. 39 Bytes deshalb weil sie sich das Byte für die SHIFT Taste jeweils gespart haben. :wink:

Code: Alles auswählen

; -------------------------------
; THE 'UNSHIFTED' CHARACTER CODES
; -------------------------------

;; K-UNSHIFT
L007E:  DEFB    $3F             ; Z
        DEFB    $3D             ; X
        DEFB    $28             ; C
        DEFB    $3B             ; V
        DEFB    $26             ; A
        DEFB    $38             ; S
        DEFB    $29             ; D
        DEFB    $2B             ; F
        DEFB    $2C             ; G
        DEFB    $36             ; Q
        DEFB    $3C             ; W
        DEFB    $2A             ; E
        DEFB    $37             ; R
        DEFB    $39             ; T
        DEFB    $1D             ; 1
        DEFB    $1E             ; 2
        DEFB    $1F             ; 3
        DEFB    $20             ; 4
        DEFB    $21             ; 5
        DEFB    $1C             ; 0
        DEFB    $25             ; 9
        DEFB    $24             ; 8
        DEFB    $23             ; 7
        DEFB    $22             ; 6
        DEFB    $35             ; P
        DEFB    $34             ; O
        DEFB    $2E             ; I
        DEFB    $3A             ; U
        DEFB    $3E             ; Y
        DEFB    $76             ; NEWLINE
        DEFB    $31             ; L
        DEFB    $30             ; K
        DEFB    $2F             ; J
        DEFB    $2D             ; H
        DEFB    $00             ; SPACE
        DEFB    $1B             ; .
        DEFB    $32             ; M
        DEFB    $33             ; N
        DEFB    $27             ; B

; -----------------------------
; THE 'SHIFTED' CHARACTER CODES
; -----------------------------


;; K-SHIFT
L00A5:  DEFB    $0E             ; :
        DEFB    $19             ; ;
        DEFB    $0F             ; ?
        DEFB    $18             ; /
        DEFB    $E3             ; STOP
        DEFB    $E1             ; LPRINT
        DEFB    $E4             ; SLOW
        DEFB    $E5             ; FAST
        DEFB    $E2             ; LLIST
        DEFB    $C0             ; ""
        DEFB    $D9             ; OR
        DEFB    $E0             ; STEP
        DEFB    $DB             ; <=
        DEFB    $DD             ; <>
        DEFB    $75             ; EDIT
        DEFB    $DA             ; AND
        DEFB    $DE             ; THEN
        DEFB    $DF             ; TO
        DEFB    $72             ; cursor-left
        DEFB    $77             ; RUBOUT
        DEFB    $74             ; GRAPHICS
        DEFB    $73             ; cursor-right
        DEFB    $70             ; cursor-up
        DEFB    $71             ; cursor-down
        DEFB    $0B             ; "
        DEFB    $11             ; )
        DEFB    $10             ; (
        DEFB    $0D             ; $
        DEFB    $DC             ; >=
        DEFB    $79             ; FUNCTION
        DEFB    $14             ; =
        DEFB    $15             ; +
        DEFB    $16             ; -
        DEFB    $D8             ; **
        DEFB    $0C             ;  £ 
        DEFB    $1A             ; ,
        DEFB    $12             ; >
        DEFB    $13             ; <
        DEFB    $17             ; *

; ------------------------------
; THE 'FUNCTION' CHARACTER CODES
; ------------------------------


;; K-FUNCT
L00CC:  DEFB    $CD             ; LN
        DEFB    $CE             ; EXP
        DEFB    $C1             ; AT
        DEFB    $78             ; KL
        DEFB    $CA             ; ASN
        DEFB    $CB             ; ACS
        DEFB    $CC             ; ATN
        DEFB    $D1             ; SGN
        DEFB    $D2             ; ABS
        DEFB    $C7             ; SIN
        DEFB    $C8             ; COS
        DEFB    $C9             ; TAN
        DEFB    $CF             ; INT
        DEFB    $40             ; RND
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $C2             ; TAB
        DEFB    $D3             ; PEEK
        DEFB    $C4             ; CODE
        DEFB    $D6             ; CHR$
        DEFB    $D5             ; STR$
        DEFB    $78             ; KL
        DEFB    $D4             ; USR
        DEFB    $C6             ; LEN
        DEFB    $C5             ; VAL
        DEFB    $D0             ; SQR
        DEFB    $78             ; KL
        DEFB    $78             ; KL
        DEFB    $42             ; PI
        DEFB    $D7             ; NOT
        DEFB    $41             ; INKEY$

; -----------------------------
; THE 'GRAPHIC' CHARACTER CODES
; -----------------------------


;; K-GRAPH
L00F3:  DEFB    $08             ; graphic
        DEFB    $0A             ; graphic
        DEFB    $09             ; graphic
        DEFB    $8A             ; graphic
        DEFB    $89             ; graphic
        DEFB    $81             ; graphic
        DEFB    $82             ; graphic
        DEFB    $07             ; graphic
        DEFB    $84             ; graphic
        DEFB    $06             ; graphic
        DEFB    $01             ; graphic
        DEFB    $02             ; graphic
        DEFB    $87             ; graphic
        DEFB    $04             ; graphic
        DEFB    $05             ; graphic
        DEFB    $77             ; RUBOUT
        DEFB    $78             ; KL
        DEFB    $85             ; graphic
        DEFB    $03             ; graphic
        DEFB    $83             ; graphic
        DEFB    $8B             ; graphic
        DEFB    $91             ; inverse )
        DEFB    $90             ; inverse (
        DEFB    $8D             ; inverse $
        DEFB    $86             ; graphic
        DEFB    $78             ; KL
        DEFB    $92             ; inverse >
        DEFB    $95             ; inverse +
        DEFB    $96             ; inverse -
        DEFB    $88             ; graphic
So sieht dann z.B. die "Blätter"-Funktion mit SHIFT-6 und SHIFT-7 dann aus, wo man zwischen mehreren gespeicherten Screenshots hin- und herblättern kann (Direktwahl durch 1-9 ebenso möglich. Mit der SPACE Taste wird das Programm beendet.

Code: Alles auswählen

hardcopy:
.loop:  CALL    .key
        PUSH    AF
        CP      $71 // shift 6, dn
        CALL    Z,.last
        CP      $70 // shift 7, up
        CALL    Z,.next
        CP      ,'0'
        JR      C,@f
        CP      ,'A'
        JR      NC,@f
        CALL    .direct
@@:
        POP     AF
        AND     A
        JR      NZ,.loop
.end:
        LD      B,H
        LD      C,L
        LD      HL,main_screen
        LD      (D_FILE),HL
        RET
Wer seinen Computer ehrt, lebt nicht verkehrt.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste