;**************************************************** ; Tastatur-Eingabe, Version 15.04.88 ; - Unterstuetzung weiterer Steckplaetze fuer IFSS-Tastatur ; (z.B. Digitalisier-AP) ; - freie Belegbarkeit Kursor- und rechter Ziffernblock ;**************************************************** if1 ; Warmstart-Initialisierung Tastatur ;=================================== kbdwarm MACRO ld a,(lampbf) and (1 shl lmphcp)+(1 shl lmpb2r)+(1 shl lmpb2b)+(1 shl kbdcpb) ld (lampbf),a ;ruecksetzen Lampen ld hl,kbdsts ;Standard-Stringtabelle wiederherstellen ld (kbdsst),hl ENDM endif ;if1 ; Tastatur-Status ;================ kbdst: ; vor Pufferabfrage anstehende Zeichen lesen (falls 5ms Takt aus) di ;parallele Abfrage ueber 5ms verhindern call kbdsti ;interner Aufruf ei IF stpvar or monitor jp chksp ;Test auf Spezialfunktionen ELSE ret ENDIF kbdsti: ;kbdst-Aufruf intern kbdstz: call kbdst1 ;Taste neu gedrueckt ? jr z,kbdsnt ;nein call kbdrdt ;Taste in Puffer ablegen IF stpvar ELSE ld hl,synflg bit stoprq,(hl) ;STOP-Request? res stoprq,(hl) jr z,kbdstz ;nein call kbdbcl ;Puffer leeren kbdstw: call kbdst1 ;auf naechsten Tastendruck warten jr z,kbdstw ENDIF jr kbdstz ;auf neuen Tastendruck testen kbdsnt: ld a,(0ffffh) ;erstes Pufferzeichen crtm32 equ $-2 ;wird vom Kaltstart modifiziert or a ;Puffer leer? ret z ;ja ld a,0ffh ret ;------------------------------------------------------------ ; Taste umkodieren und im Puffer ablegen ;======================================= ; Achtung!! Dieses UP wird aus Interruptroutine aufgmrufen kbdrdt: call kbdrch ;Zeichen evtl. umkodieren ld hl,synflg cp ctlc ;Ersatz-Control-Taste ? jr nz,kbdnct ;nein ld a,(hl) xor 1 shl ctrlst ;CTRL-Status umkehren ld (hl),a ret ;und Zeichen ignorieren kbdnct: IF stpvar bit phyact,(hl) ;Taste physisch in Puffer? jp nz,kbdput ;ja, direkt ablegen ENDIF IF costu ld hl,costrt+1 call costr ;Nutzerstring? jr nz,kbdco ;ja ENDIF ld hl,(kbdsst) ;Adresse der Standardstringtabelle call costr ;Standardstring? jr z,kbdnco ;nein kbdco: dec e ;String der Laenge 0? ret z ;ja, zu ignorierende Taste dec e ;String exakt ein Zeichen lang? jp nz,kbdco1 ;nein, kann keine Sondertaste sein ld a,(hl) ;holen erstes Stringzeichen kbdnco: ld hl,synflg ; Auswertung Sondertasten, die nicht im Puffer abgelegt werden ;------------------------------------------------------------- cp stpc ;STOP ? jr nz,kbdnst set stoprq,(hl) ;Stop-Request vermerken ret kbdnst: IF stpvar IF chdvar cp SyLc ;Drucker Synchronisieren? jr nz,kbdnsy ;nein set synlrq,(hl) ;sonst vermerken ret kbdnsy: cp HrLc ;Hardcopy ein/aus ? jr nz,kbdnhc ld hl,conol ld a,(hl) xor 0cdh xor 0c3h ;CALL aus JP u.umgekehrt ld (hl),a ld a,1 shl lmphcp ;Hardcopy-Lampe jp kbdslm kbdnhc: ENDIF ENDIF ;stpvar IF monitor cp Monc ;Monitor-Taste ? jr nz,kbdnmn bit monact,(hl) ;Monitor aktiv ? jr nz,kbdmo2 ;ja set monrq,(hl) ;Vermerken Monitor-Request ret kbdmo2: ld a,0dh ;sonst CR substituieren jr kbdput kbdnmn: ENDIF cp Sel0 ;Selector 0? jr c,kbdnsl ;nein cp Sel3+1 ;Selector 0..3? jr nc,kbdnsl ;nein and 0fh ;Bit 0..3 jp kbdslm kbdnsl: or a ;Taste zu ignorieren? ret m ;ja bit ctrlst,(hl) ;Sondertaste mit Control? res ctrlst,(hl) ; loeschen evtl. Control-St. jr z,kbdcts ;nein push af ld a,'Q' and 1fh ;"^Q" call kbdput ;im Puffer ablegen pop af cp 08h ;"<-"-Taste? jr nz,kbdcts ;nein ld a,'S' and 1fh ;umwandeln in "^S" kbdcts: ; Zeichen im Puffer ablegen ;-------------------------- ; A und F bleiben erhalten! kbdput: ld hl,0ffffh ;Pufferadresse crtm35 equ $-2 ld bc,kbdbl ;Pufferlaenge push af ;A, F retten xor a ;Pufferende-Kennzeichen cpir jr nz,kbdpt1 ;Puffer voll ld (hl),a ;neues Pufferende anzeigen pop af ;A, F regenerieren dec hl ld (hl),a ;Zeichen puffern ret kbdpt1: call crtclk ;Puffer voll anzehgen pop af ;A, F regenerieren ret ; Ablegen String im Puffer ;------------------------- ; i E Stringlaenge -1 ; i HL Stringanfang kbdco1: inc e kbdco2: push hl push de ld a,(hl) call kbdput ;Zeichen in Puffer pop de pop hl inc hl dec e jr nz,kbdco2 ;wenn String noch nicht fertig ret ; Rest des Konsolpuffers streichen ;--------------------------------- kbdbcl: xor a ld (0ffffh),a crtm36 equ $-2 ret ; Holen naechstes Tastaturzeichen mit Warten ;=========================================== kbdmd1: ;Modifizierung bei K7634/36/37 mit: ;kbdwin:call kbdst ; jr z,kbdwin ; jp kbdinn kbdwin: ld hl,kbdwt ;wartefaktor ld b,100 ;fuer dauerfunktion kbdwt equ $-1 ld (hl),10 ;auf 10*0,01sec fuer ;gleiche taste jr kbdwst ;einspr. in zyklus kbdwa: push bc ld b,1 ;0,01 sec warten call wait10 pop bc kbdwst: call kbdst1 ;taste neu gedrueckt? jr nz,kbdwb ;ja, abholen ueber kbdst in a,(kbdpci) ;taste noch gedrueckt? or a ;(funktioniert nur bei K760X!) jr z,kbdwb ;nein; warten djnz kbdwa ;abwarten, wie lange call kbdrch ;Zeichen umkodieren or a ;Sondertaste? jp m,kbdwin ;ja, keine Dauerfunktion call kbdput ;sonst puffern jr kbdi ;und raus kbdwb: call kbdst ;abwarten tastendruck jr z,kbdwb kbdwe: ld hl,kbdwt ;bei neuer taste ld (hl),100 ;100*0.01 sec warten kbdinn: kbdi: ld de,0ffffh crtm33 equ $-2 ld a,(de) ;1.Zeichen lesen or a ;Puffer leer ? jr z,kbdwin ;ja: warten ld hl,0ffffh+1 ;Puffer umspeichdrn crtm34 equ $-2 ld bc,kbdbl ;einschl.(00h am Ende ldir ;parall. Tastatur-Interrupt ;stoert nicht, da alles umgesp. ret ;------------------------------------------------------------- ; Test, ob Taste (neu) gedrueckt ;=============================== ; oAF =0 und Z=1 keine Taste ; =FF und Z=0 es ist eine Taste gedrueckt kbdst1: ; Modifiziert bei K7604/06/34.54/36 mit: ;kbdst1:in a,(kbdpcs) ;Taste gedrueckt? ; cpl ; and 8 ; ret z ;nein, (a)=0, z=1 ; ld a,0ffh ; ret ;ja, (a)=ff, z=0 ; Modifiziert bei K7637 mit ;kbdst1:in a,(kbdscs) bzw. (kbddcs) ; and 1 ; ret z ; ld a,0ffh ; ret ; Version fuer K7634.58 (Control-Taste auf Statusbit!) ; und fuer DEG-Spezialtastatur in a,(kbdpcs) cpl and 8 ret z ;keine Taste, (a)=0, z=1 ld hl,synflg bit ctrlst,(hl) ;expl. CTRL (RESET)? jr nz,cst34a ;ja, CTRL ignorieren in a,(kbdpcs) bit 2,a ;CNTL-Taste gedrueckt? jr nz,cst34a ;nein set ctrlst,(hl) ;sonst vermerken cst34a: ld a,0ffh ret ;sonst (a)=ff, z=0 ;------------------------------------------------------------- ;Zeichen von Tastatur lesen , CAPS-Lock realisieren ;================================================== kbdrch: call kbdrcu ;Zeichen holen ld hl,lampbf bit kbdcpb,(hl) ;CAPS-Lock? ret z ;nein cp 'A' ret c cp 'Z'+1 jr c,kbdcp1 cp 'a' ret c cp 'z'+1 ret nc kbdcp1: xor 20h ;gross <-> klein ret ; Zeichen von Tastatur umkodieren ;================================ kbdrcu: in a,(kbdpci) ;Zeichen lesen kbdmt1 equ $-1 ;auf "kbdsci/kbddci" bei K7637 cocpm1: ld hl,kbdcpt ld bc,kbdcpl cpir ;Umcodieren ? jr nz,kbdrc1 ;nein ld bc,kbdcpl-1 ;-1 wegen CPIR add hl,bc ld a,(hl) ;umcodiertes Zeichen kbdrc1: cocpm2: kbdcr2: cp 20h ;Sondertaste? ret c ;<20h, ja or a ret m ;>=80h, ja ld hl,synflg ;norm. Taste mit Control? bit ctrlst,(hl) ret z res ctrlst,(hl) and 1fh ;CTRL realisieren ret ; Suchen, ob Taste (A) umzukodieren entspr. Stringtab ab (HL) ; ret z: nicht gefunden, A unveraendert ; ret nz: gefunden, A unveraendert ; E Stringlaenge +1 ; HL Stringanfang (nur gueltig falls E>1!) costr: ld d,0 costr0: ld c,(hl) ;Tastencode o. Tabende inc c ;Tabende? ret z ;ja, nicht gefunden inc hl ld e,(hl) ;Stringlaenge inc e ;+1 dec c ;Tastencode wiederherstellen cp c ;Zeichen umkodieren? jr z,costr1 ;ja add hl,de ;String uebergehen jr costr0 costr1: inc hl inc d ;ret nz ret IF costu ; Eintrag Taste (A) in Stringtab ab (HL)+1 ; ret po: Tabelle voll ; ret pe: ok, costda-Aufruf vorbereitet costdf: ld e,a ld c,(hl) ;Laenge Stringtab -1 inc hl xor a ld b,a dec a ;Endezeichen fuer Tab cpir ;suchen Tab-Ende, BC:=Restlng ret po ;bc=0, Tab. voll dec hl ;auf Tastencode ld (hl),e ;ablegen inc hl ;auf Stringlaenge ld (hl),b ;Stringlaenge :=0 ld (costdl),hl ;^Stringlaenge merken jr costdn ; Verlaengern aktuell definierten String um Zeichen (A) ; ret z: kein Platz ; ret nz: ok costda: ld c,0 ;c:=Restlaenge+1 costdr equ $-1 dec c ;noch Platz? ret z ;nein ld hl,0 ;^Stringlaenge costdl equ $-2 inc (hl) ;Stringlaenge +1 ld hl,0 ;^Tabende costdp equ $-2 ld (hl),a ;Stringzeichen dorthin costdn: inc hl ld (hl),0ffh ;neues Tabende ld (costdp),hl ;merken ld a,c ;max. (restliche) Stringlaenge ld (costdr),a ;merken ret ;ret nz / ret pe ENDIF ; Tastatur-Lampe umschalten ;========================== kbdslm: ld hl,lampbf xor (hl) ;Lampe ein/aus ld (hl),a ; Tastatur-Lampen ein/aus ;======================== ; Achtung! Diese Routine wird auch aus Interrupt-Routine ; aufgerufen (EI/DI darf hier nicht auftreten!!) lampen: kbdmd2: ;Routine fuer K7637, ; wird modifiziert bei K7604/06/34/36 lampen: ld a,(lampbf) xor 00h ;ermitteln veraenderte Bits lamplt equ $-1 ;Kopie Lampen-Puffer ret z ;unveraendert ld hl,intkbd ld (hl),21h ;call ... -> ld hl,... ;d.h. 5ms Tastaturabfrage verbieten ld h,55h ;Standard-Vorbyte ld l,a bit 7,l ;INS-MODE ? jr z,lampb6 ;nein ld a,h out (kbdsci),a k37dm3 equ $-1 ;modfiziert bei Digitalisier-AP call lmpout lampb6: bit 6,l ;Fehlerlampe ? jr z,lampb3 ;nein ld a,20h call lmpout lampb3: bit 3,l ;Sel3? jr z,lampb2 ld a,h out (kbdsci),a k37dm4 equ $-1 ;modfiziert bei Digitalisier-AP ld a,52h call lmpout lampb2: bit 2,l ;Sel2? jr z,lampb1 ld a,h out (kbdsci),a k37dm5 equ $-1 ;modfiziert bei Digitalisier-AP ld a,44h call lmpout lampb1: bit 1,l jr z,lampb0 ld a,h out (kbdsci),a k37dm6 equ $-1 ;modfiziert bei Digitalisier-AP ld a,20h call lmpout lampb0: bit 0,l jr z,lampbn ld a,52h call lmpout lampbn: ld a,(lampbf) ld (lamplt),a ;neuen Zustand merken ld hl,intkbd ld (hl),0cdh ;ld hl,... -> call ... ret lmpout: out (kbdsci),a k37dm7 equ $-1 ;modfiziert bei Digitalisier-AP lmpow: call kbdst1 ;warten auf Antwort jr z,lmpow in a,(kbdsci) k37dm8 equ $-1 ;modfiziert bei Digitalisier-AP and 0f0h cp typc37 ;Antwort da? jr nz,lmpow ;nein ret ; Die folgende phys. Code-Tabelle kann je nach Tastaturtyp ; beim Kaltstart modifiziert werden (bisher bei PC1715 noch ; nicht notwendig), dies ist bei Aenderung der Tastenzuord- ; nung zu beachten! ; Einige Tastencodes koennen mehrmals auftauchen (wenn sie ; bei den Tastaturen disjunkt sind), um auch bei falsch er- ; kanntem Tastaturtyp eine notduerftige Arbeit zu gestatten. kbdcpt: ; physik.Tastencodes (Standardbelegung) ; ~~~~~~~~~~~~~~~~~~ ; gilt fuer K7606 ; K7636 ;notduerftig fuer restliche Tastaturen DB 001H ;K7606/36 ->| ;K7634 ->| db 002H ;K7604/34 INSM db 003H,004H,005H ;K7606/36 INSL ^ v ;K7604/34 '\ ^ v db 006H,007H ;K7606/36 <- -> ;K7604/34 -> <- db 008H,009H ;K7604/34 EREO ERIN db 00AH,00BH ;K7606/36 <-' |<- ;K7604/34 <-' |<- DB 00CH,00FH ;K7606/36 '\ |<-| ;K7604/34 #### |<-| db 010H ;K7606/36 MON ;K7604/34 OFF ;K7637 PRNT db 011H,012H,013H,019H,01BH ;K7606/36 00 000 DELL CE DEL ;K7604/34 REC Dzif DELL #### DEL ;K7637 #### #### HLT #### ESC db 01cH,01eH,01fH ;K7604/34 DUP INS RESET ;ignor. 081h,082h,083h,084h,085h,086h,087h ;K7604/34 VLD KORR ROL< ROL> ,-> |<- ->| ;ignor. 08bh,08ch,08dh,08eh,08fh ;K7604/34 PA3 PA1 CLER PA2 CNCL ;K7604/34 091h,...09ch (siehe 0c1h,..0cch von K7637) db 09dh ;K7604/34 ENTR ;K7637 09xh (siehe 00xh von K7636) DB 0A0H,0A1H,0A2H,0A2H,0A8H,0AFH ;K7606/36 SEL0 SEL1 SEL2 SEL3 INSM CI ;K7637 0bxh (siehe 01xh von K7636) db 0c0h,0c1h,0c2h,0c3h,0c4h,0c5h,0c6h,0c7h ;K7606/36 S S1 S2 S3 S4 S5 S6 S7 ;K7637 ENTR PF1 PF2 PF3 PF4 PF5 PF6 PF7 db 0c8h,0c9h ;K7606/36 S8 S9 ;K7637 PF8 PF9 db 0cah,0cbh,0cch ;K7636 S10 S11 S12 ;K7637 PF10 PF11 PF12 db 0feh,0ffh ;K7606/36/37 ET2 ET1 kbdcpl EQU $-kbdcpt ;Laenge Tabelle phys. Codes ; zugehoerige log.Tastencodes ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; (direkt hinter phys. Codes!, in gleicher Ordnung) ; Die Vergabe der Codes ist entsprechend der CP/A-Philosophie ; tastaturunabhaengig, daher kommen auch Codes vor, die keine ; Entsprechung beim PC1715 haben, aber am BC A51xx! ; Kursortasten ;------------- kcurwl equ 0c1h kcurup equ 0c2h kcurwr equ 0c3h kcurlf equ 0c4h kcurpu equ 0c5h kcurri equ 0c6h kcurpd equ 0c7h kcurdw equ 0c8h ; Sondertasten ;------------- spcce equ 0cch ;CE spcins equ 0cdh ;INS ; Bei Einfuehrung neuer Sonderzeichen zwischen Sel0..Sel3 muss ; Test auf Sel0..3 zuletzt erfolgen, da diese als Gruppe ; getestet werden, aber nicht dicht liegen! Sel0 equ 0d1h;!!hintere!! ;LED 0 bei SEL 0 Sel1 equ 0d2h;!!Tetrade!! ;LED 1 bei SEL 1 Sel2 equ 0d4h;!!=2**LED!! ;LED 2 bei SEL 2 Sel3 equ 0d8h;!! !! ;LED 3 bei SEL 3 SyLc equ 0d9h ; Synch. List HrLc equ 0dah ; Hardcopy Monc equ 0dbh ; BIOS-Monitor z00c equ 0dch ; "00" im Ziffernblock z000 equ 0ddh ; "000" im Ziffernblock stpc equ 0deh ; allg. STOP ctlc equ 0dfh ; Control (-Ersatz) ; Funktionstasten ;---------------- pf0c equ 0e0h ;PF0 bzw. S0 pf1c equ 0e1h ;PF1... pf2c equ 0e2h pf3c equ 0e3h pf4c equ 0e4h pf5c equ 0e5h pf6c equ 0e6h pf7c equ 0e7h pf8c equ 0e8h pf9c equ 0e9h ;***die folgenden 3 Funktionstasten ex nicht bei allen ; Tastaturen, koennten aber durch andere Tasten ersetzt werden! pfac equ 0eah pfbc equ 0ebh pfcc equ 0ech ;***die folgenden 3 Funktionstasten ex. nicht bei A51xx: pfdc equ 0edh pfec equ 0eeh pffc equ 0efh ;rechter Ziffernblock ;-------------------- zbl0 equ 0f0h zbl1 equ 0f1h zbl2 equ 0f2h zbl3 equ 0f3h zbl4 equ 0f4h zbl5 equ 0f5h zbl6 equ 0f6h zbl7 equ 0f7h zbl8 equ 0f8h zbl9 equ 0f9h zbl00 equ z00c zbl000 equ z000 zblkom equ 0fah ;Komma im Ziffernblock zblmin equ 0fbh ;Minus im Ziffernblock ;Enter im Ziffernblock siehe "pf0c" ; zu ignorierende Tasten ;----------------------- cign equ 0ffh ;Taste ignorieren kbdcpb equ lmpsl0 ;0..3, Selectortaste fuer CAPS-Lock ; Beginn der Tabelle logischer Tastencodes ;========================================= DB kcurwr ; ->| db zblmin ; num. Minus db spcins ; INSL db kcurup ; ^ db kcurdw ; v db kcurlf ; <- db kcurri ; -> db pfec ; EREO als Ersatz PF14 db spcce ; ERIN als Ersatz CE db kcurpd ; <-' db kcurwl ; |<- db kcurpu ; '\ cophsp: ;Platz fuer Spezialtastatur-umkodierung (max. 10 Zeichen) db 009h ; |<-| als Ersatz Tab db pfec ; MON als PF14 db zbl00 ; 00 db zbl000 ; 000 db 01bh ; DELL als Ersatz ESC db spcce ; CE db 7fh ; DEL db cign ; DUP db spcins ; INS db ctlc ; Ersatz-Control-Taste K7634 (wieder loslassen) db 0dh ; ^M DB Sel0 db Sel1 db Sel2 db Sel3 db zblmin ; INSM als Ersatz num. '-' db pffc ; CI als Ersatz PF15 ; Es folgen die Funktionstasten. Diese werden unabhaengig von ; der Tastatur zunaechst auf einen einheitlichen 'logischen' ; Code pf0c,...,pffc abgebildet und dann i.a. ueber Standard- ; oder Nutzer-Stringumkodierung weiter umgesetzt. db pf0c,pf1c,pf2c,pf3c,pf4c,pf5c,pf6c,pf7c db pf8c,pf9c,pfac,pfbc,pfcc ;##ex. nicht## pfdc,pfec,pffc db ctlc ; ET2 als Control-Taste K7606/36 (wieder loaslassen) db 0dh ; ET1 als CR ;---------------------------------------------------------- ; String-Umkodierungstabellen ;============================ ; Standardstrings: kbdsts: costs db 0ffh ;Tab.ende IF costu ; Nutzerstrings liegen direkt vor Interruptvektoren ;================================================== ENDIF