; ; UROMKEYS.ASM -- Program to set/reset the Kaypro Universal ROM ; BIOS function keys to a given set of keys. ; ; ; By Tim Farley Copyright (c) 1986, Tim Farley ; 415 Ethel St, N.W. All Rights Reserved. ; Atlanta, GA 30318-7942 License granted for free non- ; commercial use ONLY. ; ; NOTE: only good with Kaypro version 2.2u. Do not even attempt ; to use this program with any other version of CP/M, nor ; with any other computer than a Kaypro, version 2.2u. ; ; ; Problem: How to dynamically redefine the function keys on ; a Kaypro using the new 'universal ROMs' without ; running CONFIG and rebooting the machine. EXKKEYS ; does not support the U-ROM's, and AUTOKEYS 4.0, though ; it claims to support them, does not work properly, ; especially if you have changed your memory size ; or installed a CCP replacement. ; ; Solution: Edit the vector keys and function (keypad) keys ; in the areas below to suit any given application ; you may have in mind. Assemble this program using ; ASM, LASM or MAC; and name it anything you like. ; Now you have a 1K .COM file that you can run just ; prior to running some other program, to reset ; the vector or keypad keys to anything you like. ; ; How it works: The program uses the largely undocumented Kaypro ; Universal ROM calls which are accessible by an ; 'extra' jump vector in the BIOS table, which is ; located by examining the WBOOT vector at location ; 0 in memory. Several other ROM calls are available ; that are of use--look for documentation about them ; from me in the future. ; ; --Tim Farley ; Atlanta, GA ; ; Ascii equates ; CTRL EQU 1FH ; CR EQU CTRL AND 'M' LF EQU CTRL AND 'J' bell equ 7 ; FS EQU 1CH ; Form separator, used for function keys ; ; ; Kaypro U-ROM equates ; ROMJMP EQU 037H ; Offset from start of BIOS that is a JMP ; leading directly into Kaypro ROM handler. ; CFGOFF EQU 03AH ; Offset from start of BIOS that is a word ; value (0224H in 2.2u1). Add this to base ; of BIOS table to find CONFIG area. ; ROMVER EQU 0FFF8H ; ROM version # in ASCII (4 chars) at this ; location. 4 bytes sum up to byte following ; the string in 2.00+ ROM's. ; ; ; CP/M Equates ; prstr equ 9 ; BDOS print string call bdos equ 5 ; Standard CP/M entry ; ; ORG 100H ; JMP START ; ; Here is where the Vector keys are defined. ; One byte per key only, total of four bytes. ; VECKEYS: DB CTRL AND 'K' ; Up Arrow (Default: 0BH, or ^K) DB CTRL AND 'J' ; Down Arrow (Default: 0AH, or ^J) DB CTRL AND 'H' ; Left Arrow (Default: 08H, or ^H) DB CTRL AND 'L' ; Right Arrow (Default: 0CH, or ^L) ; ; Here is a pre-built function key table. ; Only define the key strings in the DB's starting ; at KEY0: and proceeding to ENDKEY:, all the other ; values are built automatically. ; FNKEYS: DB KEY1-KEY0,KEY0-FNKEYS DB KEY2-KEY1,KEY1-FNKEYS DB KEY3-KEY2,KEY2-FNKEYS DB KEY4-KEY3,KEY3-FNKEYS DB KEY5-KEY4,KEY4-FNKEYS DB KEY6-KEY5,KEY5-FNKEYS DB KEY7-KEY6,KEY6-FNKEYS DB KEY8-KEY7,KEY7-FNKEYS DB KEY9-KEY8,KEY8-FNKEYS DB KEY10-KEY9,KEY9-FNKEYS DB KEY11-KEY10,KEY10-FNKEYS DB KEY12-KEY11,KEY11-FNKEYS DB KEY13-KEY12,KEY12-FNKEYS DB ENDKEY-KEY13,KEY13-FNKEYS ; ; Just modify the below strings to suit, any length such that total ; length is less than 241 bytes (so complete table fits in ; 255 bytes). ; KEY0: DB '0' ; 0 on keypad KEY1: DB '1' ; 1 on keypad KEY2: DB '2' ; 2 on keypad KEY3: DB '3' ; 3 on keypad KEY4: DB '4' ; 4 on keypad KEY5: DB '5' ; 5 on keypad KEY6: DB '6' ; 6 on keypad KEY7: DB '7' ; 7 on keypad KEY8: DB '8' ; 8 on keypad KEY9: DB '9' ; 9 on keypad KEY10: DB '-' ; Dash key on keypad KEY11: DB ',' ; Comma key on keypad KEY12: DB CR ; ENTER key on keypad KEY13: DB '.' ; Period key on keypad ENDKEY: DB 0 ; ; ; Actual start of program here, function table above for easy ; patching and the like. ; ORG FNKEYS+0100H ; START: lxi d,signon mvi c,prstr ; print sign-on to user call bdos ; ; The code between here and the 'jz doit' is taken ; from Kaypro's own PUTSYSU program, and is present ; in several other universal-ROM utility programs. ; It is the 'official' way to determine whether a ; Kaypro has the a U-ROM installed. ; mvi b,4 ; 4 chars in string: '2.00' lxi h,romver xra a ; sum = 0 to start next: adc m ; build checksum inx h dcr b ; next byte jnz next cmp m jz doit ; Checksum matches--go ahead ; ; lxi d,error ; Checksum did not match: wrong ROM! mvi c,prstr ; Print error and return to CCP call bdos ret ; signon: db cr,lf,'Replacing Kaypro CP/M 2.2u''s function keys....' db cr,lf,'$' ; error: db cr,lf,'ERROR! Program requires 2.00 ROM or higher!',bell,'$' ; ; ; Now that we are sure that this is a 2.00+ ROM, let's ; go ahead and do it. ; doit: lhld 0001H ; get warm boot vector xra a ; a=0 mov l,a ; set low byte to 0 (base of BIOS) mvi e,romjmp ; offset to Kaypro ROM jump mov d,a dad d ; Add to BIOS base to find jump shld jpat1+1 ; Put address into first CALL shld jpat2+1 ; and into second CALL ; lxi b,veckeys ; BC points to vector keys (4 bytes) mvi d,31H ; ROM function 31h: new vector keys jpat1: call 0 ; <-- vector here gets patched above ; lxi b,fnkeys ; BC points to function keys (255 bytes) mvi d,32H ; ROM function 32h: new keypad keys jpat2: call 0 ; <-- vector here gets patched above ; ret ; Return to CCP ; END