home *** CD-ROM | disk | FTP | other *** search
- ;
- ; ### Function key redefining program by JM v 1.02 ###
- ;
- ; - Created 890126 by JM -
- ;
- ;
- ; This program changes the default function key values set by the FKey
- ; program.
- ;
- ;
- ;
- ;
- ; Bugs: yet unknown
- ;
- ;
- ; Edited:
- ;
- ; - 890126 by JM -> v0.01 - uh-huh
- ; - 890126 by JM -> v0.02 - should work.
- ; - 890126 by JM -> v0.03 - well, try to learn the difference betw.
- ; a0 and d0 - that will save you from many
- ; troubles.
- ; - 890126 by JM -> v0.04 - ctrl key capability added.
- ; - 890127 by JM -> v0.10 - comments improved.
- ; - 890127 by JM -> v0.11 - alt and shft+alt support added (needed with
- ; some national keymaps to get a #).
- ; - 890127 by JM -> v0.12 - key ? can be used to list the current
- ; definitions.
- ; - 890127 by JM -> v1.0 - MESSAGE added.
- ; - 890311 by JM -> v1.01 - two branches converted to .s.
- ; - 890513 by JM -> v1.02 - Now makes the fkey string empty if necessary.
- ;
- ;
-
-
-
- include "exec.xref"
- include "dos.xref"
- include "console.xref"
- include "JMPLibs.i"
- include "relative.i"
- include "com.i"
- include "string.i"
- include "numeric.i"
- include "exec/types.i"
- include "exec/nodes.i"
- include "exec/lists.i"
- include "exec/ports.i"
- include "exec/memory.i"
- include "exec/devices.i"
- include "exec/io.i"
- include "exec/tasks.i"
- include "devices/input.i"
- include "devices/inputevent.i"
-
-
- strcpy macro * a0,a1
- strcpy\@ move.b (\1)+,(\2)+
- bne.s strcpy\@
- endm
-
-
- RELATIVE equ 1
-
- .var allocates variables from stack
- dl _DosBase using LINK a4,#-size
- dl _ConsoleDeviceBase
- dl cmdlin
- dl cderror
- dl ioreq
- dl ievent
- dl globport
- dl buffer
-
-
- start .begin this turns to LINK a4,#-NN
- move.l a0,cmdlin(a4)
- clr.b -1(a0,d0.w) add NULL to the end of cmd line
- moveq.l #-1,d0
- move.l d0,cderror(a4) set variables to known values
- clr.l _DosBase(a4)
- clr.l _ConsoleDeviceBase(a4)
- lea IORequest,a0 get addr if IORequest struct
- move.l a0,ioreq(a4)
- lea IEvent,a0 get addr of InputEvent struct
- move.l a0,ievent(a4)
-
- openlib Dos,cleanup open dos.library
- bsr getconsbase open console.device
- bcs.s cleanup_i
-
- lea portname(pc),a1 test if port already exists
- lib Exec,FindPort
- move.l d0,globport(a4) save port address
- beq.s install_first
-
- move.l cmdlin(a4),a0 check if LIST command
- cmp.b #'?',(a0)
- bne.s define
-
- lea MESSAGE(pc),a0
- printa a0
- bsr listdef list definitions
- cleanup_i bra.s cleanup
-
- define bsr.s setdef re-define a fkey
- bra.s cleanup
-
- install_first lea INSTALLREQ(pc),a0 request the user to run fkey
- printa a0
-
- cleanup bsr closeconsole close console.device
- closlib Dos close dos.library
- moveq.l #0,d0
- .end UNLK and RTS
-
-
-
-
-
- *************************************************************************
- * *
- * Set definitions *
- * Command line parsing is very simple. The command name must be *
- * followed by one space and the function key number 1...20. *
- * After the number one space is needed. The rest of the command line *
- * is interpreted as the string for the function key. *
- * *
- *************************************************************************
-
- setdef move.l cmdlin(a4),a0 get fkey number
- numlib get10 (gets a number in d0)
- bcs.s setdef_e1 -> illegal number
- subq.l #1,d0
- blt.s setdef_e1 check if legal number
- cmp.l #19,d0
- bgt.s setdef_e1
-
- move.l globport(a4),a1 get messageport address
- move.l MP_SIZE(a1),a1 pointer to fkey strings
- asl.w #6,d0 multiply by 64
- add.w d0,a1 add index to pointer
-
- tst.b (a0) see if there is no string
- beq.s setdef_ok -> make the fkey empty
- cmpi.b #' ',(a0)+ must be num<spc>string
- bne.s setdef_e1
-
- moveq.l #31,d2 counter
- setloop1 move.b (a0)+,d0 get a char to convert
- beq.s setdef_ok null -> end of string
- moveq.l #'^',d1
- cmp.b d1,d0 if ^ -> ctrl code
- bne.s setloop2
- move.b (a0)+,d0 actual ctrl char
- beq.s setdef_ok
- cmp.b d1,d0 ^^ converted to ^
- beq.s setloop2
- and.w #31,d0 convert to ctrl code
- setloop2 bsr.s give_me_raw
- bcs.s setdef_e2 -> code unknown
- move.b d0,(a1)+ set raw key code
- move.b d1,31(a1) set qualifier
- dbf d2,setloop1
- lea STRLONG(pc),a0
- setdef_e printa a0 print error message
- rts
- setdef_ok move.b #-1,(a1) end mark
- rts
-
- setdef_e1 lea ILLNUM(pc),a0 error messages
- bra.s setdef_e
- setdef_e2 lea ILLCODE(pc),a0
- bra.s setdef_e
-
-
-
-
- *************************************************************************
- * *
- * Vanilla-to-Rawkey conversion routine. Doesn't handle dead keys, *
- * however. *
- * The routine first sets the qualifier value to zero and tries all *
- * raw key codes $0...$7f with RawKeyConvert() to find the correct *
- * raw key code. If it fails it then tries all raw key codes with *
- * different qualifier combinations as specified in the qtab. *
- * If it still fails an error is returned to the caller. *
- * *
- * This routine is very slow because it may need to call RawKeyConvert() *
- * thousands of times. However, this way we don't have to include a *
- * conversion table with the program code AND the program uses the *
- * keymap currently selected when doing the conversions. *
- * *
- * Inputs: d0=vanillakey *
- * Outputs: d0=rawkeycode; d1=qualifier; if (error) -> .C=1 *
- * *
- *************************************************************************
-
- give_me_raw push d2-d4/a0-a3/a5/a6
- move.b d0,d4 original vanilla code
- move.l ievent(a4),a3 InputEvent structure
- lea buffer(a4),a5 buffer for vanilla code
- clr.l ie_NextEvent(a3)
- move.b #IECLASS_RAWKEY,ie_Class(a3)
- clr.b ie_SubClass(a3)
- clr.l ie_EventAddress(a3)
-
- moveq.l #0,d2 index to qualifier table
- gmrlp1 moveq.l #0,d3 raw key code
- gmrlp2 move.w d3,ie_Code(a3)
- move.w qtab(pc,d2.w),ie_Qualifier(a3)
- clr.w (a5) clear buffer
- move.l a3,a0 InputEvent*
- move.l a5,a1 buffer*
- moveq.l #1,d1 length
- sub.l a2,a2 use default keymap
- lib ConsoleDevice,RawKeyConvert
- cmp.b (a5),d4 check if vanilla found
- beq.s give_me_raw_ok
- addq.b #1,d3
- bpl.s gmrlp2 check all raw codes
- addq.w #2,d2 try the next qualifier
- move.w qtab(pc,d2.w),d0 last one?
- bpl.s gmrlp1
-
- give_me_raw_e setc flag: code unknown
- pull d2-d4/a0-a3/a5/a6
- rts
-
- *Known qualifiers:
- qtab dc.w 0,1,8,16,17,-1 none,lshift,ctrl,lalt,shft+lalt,end
-
- give_me_raw_ok move.l d3,d0 raw key code
- move.w qtab(pc,d2.w),d1 qualifier
- pull d2-d4/a0-a3/a5/a6
- clrc flag: code found
- rts
-
-
-
- *************************************************************************
- * *
- * Routine to list the current function key definitions. *
- * *
- *************************************************************************
-
- listdef move.l globport(a4),a5 get messageport address
- move.l MP_SIZE(a5),a5 pointer to fkey strings
- move.l ievent(a4),a3 InputEvent structure
-
- clr.l ie_NextEvent(a3)
- move.b #IECLASS_RAWKEY,ie_Class(a3)
- clr.b ie_SubClass(a3)
- clr.l ie_EventAddress(a3)
-
- moveq.l #0,d2 index to qualifier table
- move.l #outbuffer,d5 output buffer
- listlp1 move.l d5,a0
- lea 64(a5),a1 addr of next fkey string
- move.l a1,d4
- move.l d2,d0
- addq.l #1,d0
- numlib sput10
- move.l a0,a2
- move.b #' ',(a2)+
- listlp2 moveq.l #0,d0
- move.b (a5)+,d0
- bmi.s list_k_ok -> end of string
- move.w d0,ie_Code(a3)
- move.b 31(a5),d0
- move.w d0,ie_Qualifier(a3)
- move.l a3,a0 InputEvent*
- move.l a2,a1 buffer*
- moveq.l #1,d1 length
- move.l a2,d3
- sub.l a2,a2 use default keymap
- lib ConsoleDevice,RawKeyConvert
- move.l d3,a2
- addq.l #1,a2
- bra.s listlp2
- list_k_ok move.b #10,(a2)+ add LF
- clr.b (a2) add NULL
- printa d5
- move.l d4,a5
- addq.l #1,d2
- cmp.w #20,d2
- blo.s listlp1
- rts
-
-
- *************************************************************************
- * *
- * Routines to open and close console.device. *
- * getconsbase also sets the console.library pointer. *
- * *
- *************************************************************************
-
- getconsbase lea consname(pc),a0 open console and get lib.base
- moveq #-1,d0 unit
- move.l ioreq(a4),a1 iorequest
- moveq #0,d1 flags
- lib Exec,OpenDevice
- move.l d0,cderror(a4)
- bne.s getcons_e
- move.l ioreq(a4),a0 ioreq
- move.l IO_DEVICE(a0),_ConsoleDeviceBase(a4)
- beq.s getcons_e
- clrc
- rts
- getcons_e setc
- rts
-
-
- closeconsole move.l cderror(a4),d0 close console.device
- bne.s closecons_ok
- move.l ioreq(a4),a1
- lib Exec,CloseDevice
- closecons_ok rts
-
-
- numlib ;contains get10 subroutine
- ;(gets a base-10 number into
- ; d0 from (a0))
-
-
- *************************************************************************
- * *
- * ASCII strings *
- * *
- *************************************************************************
-
- consname dc.b 'console.device',0
- portname dc.b 'FKeyPort',0
- INSTALLREQ dc.b 'Install FKeys first',10,0
- ILLNUM dc.b 'Illegal function key number',10,0
- ILLCODE dc.b 'Illegal character',10,0
- STRLONG dc.b 'String too long',10,0
- MESSAGE dc.b 'KEY 1.02 by Supervisor Software 1989',10,0
-
-
-
- *************************************************************************
- * *
- * Library names (only dos.library used in this program). *
- * *
- *************************************************************************
-
- libnames
-
-
-
- *************************************************************************
- * *
- * Structures defined in bss chunk to make the program file smaller. *
- * *
- *************************************************************************
-
- section struct,bss
-
- IORequest ds.b IO_SIZE struct IOStdReq
- IEvent ds.b ie_SIZEOF struct InputEvent
- outbuffer ds.b 64 buffer for LIST command
-
- end
-
-