home *** CD-ROM | disk | FTP | other *** search
- ; ----------------------------
- ; KEYS.DEM - Demoprogramm für die Routinen aus KEYS.MAB
- ; (für den A86)
- ;
- ; (c) Bernd Schemmer 1990 - 1992
- ; Letzter Update: 15.02.1992
- ;
- ; Übersetzen:
- ; A86 MACROS.MAC KEYS.MAB KEYS.DEM DEMOS.INC TO KEYS.COM
- ; ---------------------------
-
- jmp start ; Daten überspringen
-
- logo db CR,LF
- db 'KEYS.DEM - Demoprogramm für die Routinen aus KEYS.MAB'
- db CR,LF
- db '------------------------------------------------------'
- db CR,LF
- db 'Hinweis: <ALT>-<buchstabe> = Funktionstaste'
- db CR,LF
- db CR,LF
- GETLENGTH logo
-
- msg1 db
- db '┌─────────────────────────────────────────────────────────────────────────────┐',CR,LF
- db '│ Status der Sondertasten │',CR,LF
- db '│ ═══════════════════════ │',CR,LF
- db '│ SCROLLLOCK CAPSLOCK NUMLOCK INSERT L-SHIFT R-SHIFT CTRL ALT │',CR,LF
- db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
- db '│ │',CR,LF
- db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
- db '│ gedrückte Taste │',CR,LF
- db '│ ═══════════════ │',CR,LF
- db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
- db '│ Scancode (in AX) Funktions-Taste ASCII-Wert Zeichen │',CR,LF
- db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
- db '│ │',CR,LF
- db '╞═════════════════════════════════════════════════════════════════════════════╡',CR,LF
- db '│ Bitte Taste(n) drücken, <ESC> für Programmende ... │',CR,LF
- db '└─────────────────────────────────────────────────────────────────────────────┘',CR,LF
- GETLENGTH msg1
-
- ; Offsets der auszufüllenden Felder
- SCROLLLOCK_X EQU 10xD
- SCROLLLOCK_Y EQU 5
- STATUS_DIFF EQU 8
-
- SCANCODE_x EQU 9
- SCANCODE_y EQU 12xD
- KEY_DIFF EQU 20xD
- KEY_DIFF1 EQU 13xD
-
- msgStart dw ? ; Offset des ersten Zeichens von msg im
- ; Bildschirmspeicher
- Scancode dw 0 ; Scancode der gedrückten Taste
- OldStatus db 0ffH ; Status der Sondertasten
- aktpage db 0 ; akt. Bildschirmseite
-
- start:
- mov ah,0Fh
- int 010h
- mov aktpage,bh ; akt. Bildschirmseite ermitteln
-
- mov ax,0700h
- mov cx,0
- mov dx,24xD by 79xD
- mov bh,07h
- int 010h ; Bildschirm löschen
-
- mov dx,0
- mov bh,aktpage
- mov ah,02
- int 010h ; Cursor setzen
-
- mov cx,logo_length
- mov si,offset logo
- call WriteInt10h ; Logo ausgeben
-
- mov bh,aktpage
- mov ah,03h
- int 010h ; Cursor-Position ermitteln
- mov msgstart,dx ; und sichern
-
- mov cx,msg1_LENGTH
- mov si,offset msg1
- call writeInt10h ; Maske ausgeben
-
-
- MainLoop: ; Status der Sondertasten eintragen
- mov dx,msgstart
- add dl,67xD
- add dh,14xD
- mov ah,02h
- int 010h ; Cursor setzen
-
- keypressed
- jnz >l1 ; Taste gedrückt
- GetKBDStatus
- cmp al,OldStatus
- jz MainLoop ; keine Veränderungen eingetreten
- mov OldStatus,al
-
- l1:
- mov dx,msgstart
- add dx,SCROLLLOCK_Y by SCROLLLOCK_X
-
- ; Status der Sondertasten ausgeben
- mov bl,'N'
- ScrollLockAktiv?
- if nz mov bl,'J'
- call ShowStatus
-
- mov bl,'N'
- CapsLockAktiv?
- if nz mov bl,'J'
- call ShowStatus
-
- mov bl,'N'
- NumLockAktiv?
- if nz mov bl,'J'
- call ShowStatus
-
- mov bl,'N'
- InsertAktiv?
- if nz mov bl,'J'
- call ShowStatus
-
- mov bl,'N'
- LeftShiftPressed?
- if nz mov bl,'J'
- call ShowStatus
-
- mov bl,'N'
- RightShiftPressed?
- if nz mov bl,'J'
- call ShowStatus
-
- mov bl,'N'
- CtrlPressed?
- if nz mov bl,'J'
- call SHowStatus
-
- mov bl,'N'
- AltPressed?
- if nz mov bl,'J'
- call ShowStatus
-
- Inkey ; Testen, ob eine Taste gedrückt wurde
-
- if z jmp MainLoop ; keine Taste gedrückt
-
- ; Taste gedrückt, AX = Tastencode
- mov Scancode,ax ; AX sichern
-
- ; Werte der Taste ausgeben
- mov dx,msgstart
- add dx,SCANCODE_y BY SCANCODE_x
-
- mov bh,aktpage
- mov ah,02h
- int 010h ; Cursor setzen
-
- mov ax,Scancode
- call ShowScancode ; SANCODE eintragen
-
- add dl,KEY_DIFF
- mov bh,aktpage
- mov ah,02h
- int 010h ; Cursor setzen
-
- mov ax,Scancode
- mov bl,'N' ; auf Funktionstaste testen
- FunctionKey?
- jnz IsNoFunctionKey
- mov bl,'J' ; ist eine Funktionstaste
- mov Scancode,0
-
- IsNoFunctionkey:
- mov al,bl ; J oder N ausgeben
- mov bl,070h
- mov cx,1
- mov ah,09h
- int 010h
-
- ; ASCII-Wert eintragen
- add dl,KEY_DIFF1
- mov bh,aktpage
- mov ah,02h
- int 010h ; Cursor setzen
-
- ; SCANCode ausgeben
- mov ax,Scancode
- call ShowASCIICode
-
- add dl,KEY_DIFF1+3
- mov bh,aktpage
- mov ah,02h
- int 010h ; Cursor setzen
-
- ; und zugerhöriges Zeichen ausgeben
- mov al, b Scancode
- mov bl,070h
- cmp Scancode,0
- jnz >l1
- mov al,BLANK ; für Funktionstasten löschen
- mov bl,07h
- l1:
- mov cx,1
- mov ah,09h
- int 010h
-
- mov ax,SCANCode
- cmp al,ESC ; ESC gedrückt?
- je Ende ; ja, Ende
-
- MainLoop0:
- jmp Mainloop
-
- Ende:
- mov dx,24xD by 0xD
- mov bh,aktpage
- mov ah,02
- int 010h ; Cursor setzen
-
- EndProcess 0 ; und Programm beenden
-
- ; ----------------------------
- ; ShowSCANCode
- ;
- ; Funktion: Eintragen des SCANCodes in die Maske
- ;
- ; Eingabe: AX = Scancode
- ;
- s0004 db '????h'
- s0005 EQU $ - Offset s0004
-
- ShowSCANCode:
- mov di,offset s0004
- mov si,di
- call Konvert_AX_To_Hexstring
- mov cx,s0005
- call WriteInt10h
- ret
-
- ; ----------------------------
- ; ShowASCIICode
- ;
- ; Funktion: Eintragen des ASCII-Codes in die Maske
- ;
- ; Eingabe: AX = SCANCode
- ;
- s000 db '???xD, '
- s001 db '??h'
- s002 EQU $ - Offset s000
-
- s003 db ' '
-
- ShowASCIICode:
- or ax,ax
- jnz >l1
- mov si,offset s003 ; für Funktionstasten löschen
- jmp >l2
- l1:
- push ax
- mov di,offset s000
- call Konvert_AL_To_Dezstring
- pop ax
- mov di,offset s001
- call Konvert_AL_To_Hexstring
- mov si,offset s000
- l2:
- mov cx,s002
- call WriteInt10h
- ret
-
- ; ----------------------------
- ; ShowStatus
- ;
- ; Funktion: Schreibt den akt. Status in die Maske
- ;
- ; Eingabe: BL = Wert (J oder N)
- ; DX = Cursorposition
- ;
- ; AUsgabe: DL um STATUS_DIFF erhöht
- ;
- ShowStatus:
- ; Cursor setzen
- mov bh,aktpage
- mov ah,02h
- int 010h
-
- ; und Wert in Maske eintragen
- mov al,bl
- mov bl,070h
- mov cx,1
- mov ah,09h
- int 010h
-
- add dl,STATUS_Diff ; DL korrigieren
- ret
-
- ; ----------------------------
- ; WriteInt10h
- ;
- ; Funktion: Ausgabe einer Zeichenkette über die Funktion 0Eh des
- ; Interrupt 10h
- ;
- ; Eingabe: CX = Länge der Zeichenkette
- ; SI = Offset der Zeichenkette
- ;
- WriteInt10h:
-
- l0:
- push cx
- lodsb
- mov ah,0Eh
- int 010h
- pop cx
- loop l0
-
- ret
-
-