(*----------------------------------------------*) (* KEYSET.PAS - zeigt die aktuelle Tastatur- *) (* belegung auf dem Bildschirm an. *) (* Rechner: JOYCE (PCW 8256/8512) *) (* Prg.-Sprache: TURBO-PASCAL 3.0 *) (* CP/M-Version: CP/M 3 (PLUS) V. 1.4 *) (* written 1990 by NoFi *) (*----------------------------------------------*) PROGRAM KEYSET; CONST bios_userf = $FC5A; (* BIOS-Funktion #30 *) (* Ausgabetexte: *) stat_text : ARRAY[0..4] OF STRING[9] = ('NORMAL ','SHIFT ', 'ALT ','EXTRA ', 'ALT+EXTRA'); (* Definition des Tastenstatus: *) stat_bit : ARRAY[0..4] OF BYTE = ($00,$20,$80,$02,$A0); VAR key, ascii, i : BYTE; tflag : BOOLEAN; (*----------------------------------------------*) FUNCTION keynum : BYTE; (* holt ein Key-Token aus dem Tastaturpuffer *) (* und uebergibt die Tasten-Nummer *) CONST km_kt_get = $133B; (* System-Einsprung *) VAR tnum : BYTE; BEGIN INLINE( $CD/bios_userf/ (* L: CALL bios userf *) km_kt_get/ (* DEFW KM_KT_GET *) $30/$F9/ (* JR NC,L *) $79/ (* LD A,C *) $32/tnum); (* LD (tnum),A *) keynum:=tnum; END; (* keynum *) (*----------------------------------------------*) FUNCTION translate (key, stat : BYTE; VAR ret : BYTE) : BOOLEAN; (* Uebersetzt ein Key-Token entsprechend der *) (* aktuellen Tastaturbelegung *) CONST km_kt_translate = $1298;(* System-Einsprung *) VAR tret : BYTE; ttran : BOOLEAN; BEGIN INLINE( $3A/key/ (* LD A,(key) *) $4F/ (* LD C,A *) $3A/stat/ (* LD A,(stat) *) $47/ (* LD B,A *) $CD/bios_userf/ (* CALL bios_userf *) km_kt_translate/ (* DEFW KM_KT_TRANSLATE *) $32/tret/ (* LD (tret),A *) $9F/ (* SBC A,A *) $32/ttran); (* LD (ttran),A *) ret:= tret; translate:=ttran; END; (* translate *) (*----------------------------------------------*) PROCEDURE expand(zchn : BYTE); (* Liest den Expansions-String einer Taste *) (* und gibt ihn am Bildschirm aus. *) CONST km_get_expand = $1270; (* System-Einsprung *) zmask = $40; (* Maske fuer Z-Flag *) VAR zflag, exp_zchn : BYTE; exp_count : INTEGER; BEGIN IF zchn IN [$80..$9F] (* Nur ausfuehren, wenn *) THEN zflag := 0 (* Exp.-Code gueltig! *) ELSE zflag := 1; exp_count := 0; (* Exp.-string - Zaehler*) WHILE zflag = 0 DO BEGIN INLINE( $2A/exp_count/ (* LD HL,(exp_count) *) $3A/zchn/ (* LD A,(zchn) *) $CD/bios_userf/ (* CALL bios_userf *) km_get_expand/ (* DEFW km_get_expand *) $32/exp_zchn/ (* LD (exp_zchn),A *) $F5/ (* PUSH AF *) $C1/ (* POP BC *) $79/ (* LD A,C *) $E6/zmask/ (* AND A,zmask *) $32/zflag); (* LD (zflag),A *) IF zflag = 0 (* Ausfuehren, wenn *) THEN (* String-Ende noch nicht *) BEGIN (* erreicht *) exp_count := SUCC(exp_count); IF exp_zchn IN [$00..$1F] (* '^' -Code? *) THEN WRITE('^',CHR(exp_zchn + $40)) ELSE WRITE(exp_zchn); END; END; WRITELN; END; (* expand *) (*----------------------------------------------*) BEGIN (* main *) REPEAT CLRSCR; WRITE('Bitte Taste dr}cken ... '); WRITE(' (>STOP< = Ende) '); key:=keynum; (* Tastennummer holen *) WRITELN; WRITELN; WRITE('Sie haben die Taste f#',key); WRITELN(' gedr}ckt'); WRITELN('Die Taste ist wie folgt belegt:'); FOR i:= 0 TO 4 DO BEGIN (* Tasten-Belegung ausg. *) WRlTE(stat_text[i],': '); tflag:=translate(key,stat_bit[i],ascii); IF tflag = FALSE THEN WRITELN('n.b.') ELSE IF ascii IN [$80..$9E] (* Exp.-Code ? *) THEN expand(ascii) (* - Ja - *) ELSE (* - Nein - *) IF (ascii < $20) THEN WRITELN('^',CHR(ascii+$40)) ELSE WRITELN(CHR(ascii)); END; DELAY(2500); UNTIL key =66; (* Stop-Taste gedrueckt? *) END. (* main *) (*----------------------------------------------*)