GophHub - zajo/appler/src/KEYBOARD.ASM


Raw File

    1	;  _____________________________________________
    2	; |                                             |
    3	; |  Project:   APPLER                          |
    4	; |  File:      KEYBOARD.ASM                    |
    5	; |  Compiler:  16-bit TASM (2.5)               |
    6	; |                                             |
    7	; |  Subject:   Keyboard Manager                |
    8	; |                                             |
    9	; |  Author:    Emil Dotchevski                 |
   10	; |_____________________________________________|
   11	
   12	                include GLOBALS.INC
   13	                include INTERFAC.INC
   14	
   15	Keyboards       group   Keyboard,SimKbd
   16	Keyboard        segment public
   17	                assume  cs:Keyboard, ds:Keyboard, es:Emulate, ss:Data
   18	
   19	
   20	DATA_PORT       =       60h
   21	COMMAND_PORT    =       64h
   22	OUTPUT_FULL     =       01h             ; Output buffer full flag bit
   23	INPUT_EMPTY     =       02h             ; Input buffer empty flag bit
   24	DISABLE_KEYBOARD=       0ADh            ; Disable keyboard command code
   25	ENABLE_KEYBOARD =       0AEh            ; Enable keyboard command code
   26	LED_SET         =       0EDh            ; Set keyboard LEDs command code
   27	ACKNOWLEDGE     =       0FAh            ; Keyboard ACK
   28	TIME_OUT        =       0FFFFh          ; 8042 time out counter value
   29	
   30	K_KeyboardRet1  label   byte
   31	SetLEDs         proc    far                     ; AL - LED data
   32	                push    ax
   33	                mov     al,DISABLE_KEYBOARD
   34	                call    K_SendCommand
   35	                jc      SetLEDs_Exit
   36	                mov     al,LED_SET
   37	                call    K_SendData
   38	                jc      SetLEDs_Exit
   39	                pop     ax
   40	                push    ax
   41	                call    K_SendData
   42	SetLEDs_Exit:   mov     al,ENABLE_KEYBOARD
   43	                out     COMMAND_PORT,al
   44	                pop     ax
   45	                ret
   46	SetLEDs         endp
   47	LightsData      db      0
   48	
   49	K_KeyboardRet2  label   byte
   50	K_SendCommand   proc    far
   51	                push    ax
   52	                call    WaitInputEmpty
   53	                jc      K_SC_Ret
   54	                out     COMMAND_PORT,al
   55	                call    WaitOutputFull
   56	                jc      K_SC_Ret
   57	                in      al,DATA_PORT
   58	                call    WaitInputEmpty
   59	K_SC_Ret:       pop     ax
   60	                ret
   61	K_SendCommand   endp
   62	
   63	K_KeyboardRet3  label   byte
   64	K_SendData      proc    far
   65	                push    ax
   66	                call    WaitInputEmpty
   67	                jc      K_SD_Ret
   68	                out     DATA_PORT,al
   69	                call    WaitOutputFull
   70	                jc      K_SD_Ret
   71	                in      al,DATA_PORT
   72	                call    WaitInputEmpty
   73	K_SD_Ret:       pop     ax
   74	                ret
   75	K_SendData      endp
   76	
   77	K_KeyboardRet4  label   byte
   78	K_GetData       proc    far
   79	                in      al,DATA_PORT
   80	                call    WaitInputEmpty
   81	                ret
   82	K_GetData       endp
   83	
   84	WaitInputEmpty  proc    near
   85	                push    ax cx
   86	                mov     cx,TIME_OUT
   87	WIE_Loop:       in      al,COMMAND_PORT
   88	                test    al,INPUT_EMPTY
   89	                jz      WIE_Exit
   90	                loop    WIE_Loop
   91	                stc
   92	WIE_Exit:       pop     cx ax
   93	                ret
   94	WaitInputEmpty  endp
   95	
   96	WaitOutputFull  proc    near
   97	                push    ax cx
   98	                mov     cx,TIME_OUT
   99	WOF_Loop:       in      al,COMMAND_PORT
  100	                test    al,OUTPUT_FULL
  101	                jz      WOF_Exit
  102	                loop    WOF_Loop
  103	                stc
  104	WOF_Exit:       pop     cx ax
  105	                ret
  106	WaitOutputFull  endp
  107	
  108	
  109	k_BufferFlag    db      0
  110	k_BuffPtr1      db      0
  111	k_BuffPtr2      db      0
  112	k_Buffer        db      64 dup (?)
  113	
  114	ClearBuffer     proc    far
  115	                mov     cs:k_BuffPtr1,0
  116	                mov     cs:k_BuffPtr2,0
  117	                ret
  118	ClearBuffer     endp
  119	
  120	PutBuffer       proc    near
  121	                test    C000,10000000b
  122	                jz      k_NoBuff
  123	                test    k_BufferFlag,1
  124	                jz      k_NoBuff
  125	                xor     bx,bx
  126	                mov     bl,k_BuffPtr2
  127	                mov     k_Buffer[bx],al
  128	                inc     bl
  129	                cmp     bl,size k_Buffer
  130	                jb      PB_1
  131	                xor     bx,bx
  132	PB_1:           cmp     bl,k_BuffPtr1
  133	                je      PB_Ret
  134	                mov     k_BuffPtr2,bl
  135	                jmp     PB_Ret
  136	k_NoBuff:       mov     C000,al
  137	PB_Ret:         ret
  138	PutBuffer       endp
  139	
  140	GetBuffer       proc    far
  141	                pushf
  142	                push    ax bx ds es
  143	                push    cs
  144	                pop     ds
  145	                cmp     k_BufferFlag,0
  146	                jz      GB_Ret
  147	                mov     ax,Emulate
  148	                mov     es,ax
  149	                xor     bx,bx
  150	                mov     bl,k_BuffPtr1
  151	                mov     al,k_Buffer[bx]
  152	                cmp     bl,k_BuffPtr2
  153	                je      GB_Ret
  154	                inc     bl
  155	                cmp     bl,size k_Buffer
  156	                jb      GB_1
  157	                xor     bx,bx
  158	GB_1:           mov     k_BuffPtr1,bl
  159	                mov     [C000],al
  160	GB_Ret:         pop     es ds bx ax
  161	                popf
  162	                ret
  163	GetBuffer       endp
  164	
  165	get_table_ofs   proc    far
  166	                push    ax
  167	                mov     al,bl
  168	                xor     bx,bx
  169	                test    al,M_ALT
  170	                mov     bl,2 shl 1
  171	                jnz     gto_ModeOK
  172	                test    al,M_CTRL
  173	                mov     bl,1 shl 1
  174	                jnz     gto_ModeOK
  175	                test    al,M_CAPS_LOCK
  176	                jz      gto_not_caps
  177	                test    al,M_LEFT_SHIFT or M_RIGHT_SHIFT
  178	                mov     bl,4 shl 1
  179	                jnz     gto_ModeOK
  180	                mov     bl,3 shl 1
  181	                jmp     gto_ModeOK
  182	gto_not_caps:   test    al,M_LEFT_SHIFT or M_RIGHT_SHIFT
  183	                mov     bl,5 shl 1
  184	                jnz     gto_ModeOK
  185	                test    al,M_NUM_LOCK
  186	                mov     bl,6 shl 1
  187	                jnz     gto_ModeOK
  188	                xor     bx,bx
  189	gto_ModeOK:     pop     ax
  190	                ret
  191	get_table_ofs   endp
  192	
  193	k_Fire1         =       80h
  194	k_Fire2         =       81h
  195	k_LeftArrow     =       82h
  196	k_RightArrow    =       83h
  197	k_UpArrow       =       84h
  198	k_DownArrow     =       85h
  199	None            =       86h
  200	Ctrl            =       87h
  201	Lshift          =       88h
  202	Rshift          =       89h
  203	Caps            =       8Ah
  204	ALT             =       8Bh
  205	k_Reset         =       8Ch
  206	k_Pause         =       8Dh
  207	k_F1            =       8Eh
  208	k_F2            =       8Fh
  209	k_F3            =       90h
  210	k_F4            =       91h
  211	k_F5            =       92h
  212	k_F6            =       93h
  213	k_F7            =       94h
  214	k_F8            =       95h
  215	k_F9            =       96h
  216	k_F10           =       97h
  217	k_DosShell      =       98h
  218	k_QuitAppler    =       99h
  219	k_F11           =       9Ah
  220	k_F12           =       9Bh
  221	k_NumLock       =       9Ch
  222	
  223	k_KeyPressed    db      1
  224	k_Flags         dw      0
  225	k_KeyCode       db      0
  226	k_ScanCode      db      0
  227	k_Shifts        dw      0
  228	k_Table         dw      k_AppleTable
  229	k_AppleTable    dw      a_NormalTable           ; Normal table
  230	                dw      a_CtrlTable             ; Ctrl pressed
  231	                dw      a_AltTable              ; Ctrl and Alt pressed
  232	                dw      a_CapsTable             ; Caps Lock mode
  233	                dw      a_CpsShfTable           ; Shift in Caps Lock mode
  234	                dw      a_ShiftTable            ; Shift mode
  235	                dw      a_NumTable              ; Num Lock mode
  236	k_DebugTable    dw      d_NormalTable
  237	                dw      d_NormalTable
  238	                dw      d_AltTable
  239	                dw      d_CapsTable
  240	                dw      d_CpsShfTable
  241	                dw      d_ShiftTable
  242	                dw      d_NormalTable
  243	k_KbdSetupTable dw      k_NormalTable
  244	                dw      k_NormalTable
  245	                dw      k_AltTable
  246	                dw      k_NormalTable
  247	                dw      k_NormalTable
  248	                dw      k_NormalTable
  249	                dw      k_NormalTable
  250	
  251	
  252	k_int09:        push    ax
  253	                in      al,DATA_PORT
  254	                push    ax
  255	                in      al,61h
  256	                or      al,11000000b
  257	                jmp     $+2
  258	                out     61h,al
  259	                and     al,01111111b
  260	                jmp     $+2
  261	                out     61h,al
  262	                mov     al,20h
  263	                out     20h,al
  264	                pop     ax
  265	                call    far ptr KeyStopPlay
  266	                xchg    sp,bp
  267	                or      [bp+6],ax
  268	                xchg    sp,bp
  269	k_int09_iret:   pop     ax
  270	                iret
  271	
  272	KeyStopPlay:    or      al,al
  273	                js      Key
  274	                call    SimKbdClr
  275	Key:            push    bx si ds es
  276	                push    cs
  277	                pop     ds
  278	                mov     k_Flags,0
  279	                test    k_PauseFlag,1
  280	                jnz     k_KeyPause
  281	                mov     bx,Emulate
  282	                mov     es,bx
  283	                mov     ah,al
  284	                xor     bx,bx
  285	                mov     bl,ah
  286	                and     bl,01111111b
  287	                cmp     bl,58h
  288	                ja      k_ret
  289	                mov     al,bl
  290	                mov     bx,k_Shifts
  291	                call    get_table_ofs
  292	                mov     si,k_Table
  293	                mov     bx,[si][bx]
  294	                xlat
  295	                mov     k_KeyCode,al
  296	                or      al,al
  297	                js      k_SpecialKey
  298	                or      ah,ah
  299	                js      k_ret
  300	                or      al,10000000b
  301	                call    PutBuffer
  302	k_record_ret:   mov     al,ah
  303	                call    RecordKey
  304	k_ret:          and     ah,01111111b
  305	                mov     k_ScanCode,ah
  306	                mov     ax,k_Flags
  307	                pop     es ds si bx
  308	                retf
  309	
  310	k_KeyPause:     or      al,al
  311	                js      k_ret
  312	                mov     k_PauseFlag,0
  313	                jmp     k_ret
  314	
  315	k_SpecialKey:   cmp     ah,k_OldSpcKey
  316	                je      k_ret
  317	                push    ax
  318	                and     al,01111111b
  319	                or      ah,ah
  320	                mov     si,offset k_KeyOnSub
  321	                jns     k_SK_on
  322	                mov     si,offset k_KeyOffSub
  323	                xor     ah,ah
  324	k_SK_on:        mov     k_OldSpcKey,ah
  325	                xor     bh,bh
  326	                mov     bl,al
  327	                shl     bx,1
  328	                mov     ax,k_Shifts
  329	                call    [si][bx]
  330	                mov     k_Shifts,ax
  331	                mov     k_KeyPressed,1
  332	                pop     ax
  333	                jmp     k_record_ret
  334	k_OldSpcKey     db      0
  335	k_KeyOnSub      dw      k_Fire1_ON,k_Fire2_ON,k_LA_ON,k_RA_ON,k_UA_ON,k_DA_ON
  336	                dw      k_None
  337	                dw      k_Ctrl_ON,k_Lshift_ON,k_Rshift_ON,k_Caps_ON,k_ALT_ON
  338	                dw      k_Reset_ON,k_Pause_ON
  339	                dw      k_F_ON,k_F_ON,k_F_ON,k_F_ON,k_F_ON,k_F_ON,k_F_ON,k_F_ON,k_F_ON,k_F_ON
  340	                dw      k_F_ON,k_F_ON
  341	                dw      k_None,k_F12_ON,k_Num_ON
  342	k_KeyOffSub     dw      k_Fire1_OFF,k_Fire2_OFF,k_LA_OFF,k_RA_OFF,k_UA_OFF,k_DA_OFF
  343	                dw      k_None
  344	                dw      k_Ctrl_OFF,k_Lshift_OFF,k_Rshift_OFF,k_Caps_OFF,k_ALT_OFF
  345	                dw      k_Reset_OFF,k_None
  346	                dw      k_None,k_None,k_None,k_None,k_None,k_None,k_None,k_None,k_None,k_None
  347	                dw      k_None,k_None
  348	                dw      k_None,k_None,k_Num_OFF
  349	
  350	k_Ctrl_OFF:     and     al,not M_CTRL
  351	k_None:         ret
  352	k_Lshift_OFF:   and     al,not M_LEFT_SHIFT
  353	                ret
  354	k_Rshift_OFF:   and     al,not M_RIGHT_SHIFT
  355	k_Caps_OFF:     ret
  356	k_ALT_OFF:      and     al,not M_ALT
  357	                ret
  358	k_Reset_OFF:    and     ResetFlag,11111110b
  359	                mov     C000,0
  360	                ret
  361	k_Fire1_OFF:    mov     es:JoyButton1,7Fh
  362	                ret
  363	k_Fire2_OFF:    mov     es:JoyButton2,7Fh
  364	                ret
  365	k_LA_OFF:       and     es:JoyStick,not 00000001b
  366	                ret
  367	k_RA_OFF:       and     es:JoyStick,not 00000010b
  368	                ret
  369	k_UA_OFF:       and     es:JoyStick,not 00000100b
  370	                ret
  371	k_DA_OFF:       and     es:JoyStick,not 00001000b
  372	                ret
  373	
  374	k_Ctrl_ON:      or      al,M_CTRL
  375	                ret
  376	k_Lshift_ON:    cmp     k_ScanCode,060h
  377	                je      k_Lshift_ON_ret
  378	                or      al,M_LEFT_SHIFT
  379	k_Lshift_ON_ret:ret
  380	k_Rshift_ON:    cmp     k_ScanCode,060h
  381	                je      k_Rshift_ON_ret
  382	                or      al,M_RIGHT_SHIFT
  383	k_Rshift_ON_ret:ret
  384	k_Caps_ON:      xor     al,M_CAPS_LOCK
  385	                push    ax
  386	                xor     LightsData,00000100b
  387	                mov     al,LightsData
  388	                call    SetLEDs
  389	                pop     ax
  390	                ret
  391	k_ALT_ON:       or      al,M_ALT
  392	                ret
  393	k_Num_ON:       xor     al,M_NUM_LOCK
  394	                push    ax
  395	                xor     LightsData,00000010b
  396	                mov     al,LightsData
  397	                call    SetLEDs
  398	                test    al,00000010b
  399	                mov     ss:C0xxRead[2*61h], offset C0612r
  400	                mov     ss:C0xxRead[2*62h], offset C0612r
  401	                mov     ss:C0xxRead[2*64h], offset C0645r
  402	                mov     ss:C0xxRead[2*65h], offset C0645r
  403	                jz      k_Num_ON1
  404	                mov     ss:C0xxRead[2*61h], offset C061r
  405	                mov     ss:C0xxRead[2*62h], offset C062r
  406	                mov     ss:C0xxRead[2*64h], offset C064r
  407	                mov     ss:C0xxRead[2*65h], offset C065r
  408	                mov     es:JoyStick,0
  409	k_Num_ON1:      pop     ax
  410	k_Num_OFF:      ret
  411	k_Fire1_ON:     mov     es:JoyButton1,0FFh
  412	                ret
  413	k_Fire2_ON:     mov     es:JoyButton2,0FFh
  414	                ret
  415	k_LA_ON:        or      es:JoyStick,00000001b
  416	                ret
  417	k_RA_ON:        or      es:JoyStick,00000010b
  418	                ret
  419	k_UA_ON:        or      es:JoyStick,00000100b
  420	                ret
  421	k_DA_ON:        or      es:JoyStick,00001000b
  422	                ret
  423	k_Reset_ON:     test    al,M_CTRL
  424	                jz      k_Reset_ON_J
  425	                test    ResetFlag,00000001b
  426	                jnz     k_Reset_ON_J
  427	                or      ResetFlag,00000001b
  428	                jmp     RESET
  429	k_Reset_ON_J:   ret
  430	
  431	k_PauseFlag     db      0
  432	k_OldIRQ        db      ?
  433	k_Pause_ON:     push    ax
  434	                in      al,21h
  435	                mov     k_OldIRQ,al
  436	                mov     al,11111101b
  437	                out     21h,al
  438	                mov     k_PauseFlag,1
  439	                mov     al,00000111b
  440	                call    SetLEDs
  441	                sti
  442	k_PauseLoop:    test    k_PauseFlag,1
  443	                jnz     k_PauseLoop
  444	                cli
  445	                mov     al,k_OldIRQ
  446	                out     21h,al
  447	                mov     al,LightsData
  448	                call    SetLEDs
  449	                pop     ax
  450	                and     al,not M_CTRL
  451	                ret
  452	
  453	k_ProcessIDs    db      PID_DEBUGGER
  454	                db      PID_FILE_MANAGER
  455	                db      PID_FLOPPY_DISK_MANAGER
  456	                db      PID_KEYBOARD_SETUP
  457	                db      PID_DONT_SWITCH
  458	                db      PID_DONT_SWITCH
  459	                db      PID_DONT_SWITCH
  460	                db      PID_DONT_SWITCH
  461	                db      PID_ABOUT_SCREEN
  462	                db      PID_HELP_SCREEN
  463	                db      PID_DOS_SHELL
  464	                db      PID_QUIT_APPLER
  465	
  466	k_F_ON:         push    es
  467	                mov     ax,seg RetWhere?
  468	                mov     es,ax
  469	                assume  es:seg RetWhere?
  470	                shr     bx,1
  471	                sub     bl,k_F1 and 01111111b
  472	                mov     al,k_ProcessIDs[bx]
  473	                mov     k_OldSpcKey,0
  474	                mov     es:RetWhere?,al
  475	                or      word ptr k_Flags,0000000100000000b
  476	                pop     es
  477	                mov     ax,k_Shifts
  478	                and     al,not(M_CTRL or M_LEFT_SHIFT or M_RIGHT_SHIFT or M_ALT)
  479	                ret
  480	                assume  es:Emulate
  481	
  482	k_F12_ON:       xor     es:synchro_push_ax,0FAh xor 0C3h
  483	                ret
  484	
  485	
  486	a_NormalTable   db      None,1Bh,'1234567890-=',8                 ; Normal Table
  487	                db      9,'QWERTYUIOP[]',0Dh
  488	                db      Ctrl,'ASDFGHJKL;',27h,'`'
  489	                db      LShift,'\ZXCVBNM,./',RShift,'*'
  490	                db      ALT,' ',Caps
  491	                db      k_F1,k_F2,k_F3,k_F4,k_F5,k_F6,k_F7,k_F8,k_F9,k_F10
  492	                db      k_NumLock,k_Reset,None,0Bh,None,'-'
  493	                db      8,None,15h,'+',None,0Ah,None,9,4
  494	                db      None,None,None,None,k_F12
  495	
  496	a_CtrlTable     db      None,1Bh,'1234567890-=',8                 ; CtrlTable
  497	                db      9,11h,17h,5,12h,14h,19h,15h,9,0Fh,10h,1Bh,1Dh,0Dh
  498	                db      Ctrl,1,13h,4,6,7,8,0Ah,0Bh,0Ch,';',27h,1Eh
  499	                db      LShift,0,1Ah,18h,3,16h,2,0Eh,0Dh,',./',RShift,'*'
  500	                db      ALT,' ',Caps
  501	                db      k_F1,k_F2,k_F3,k_F4,k_F5,k_F6,k_F7,k_F8,k_F9,k_F10
  502	                db      k_Pause,k_Reset,None,0Bh,None,'-'
  503	                db      8,None,15h,'+',None,0Ah,None,9,k_Reset
  504	                db      None,None,None,None,k_F12
  505	
  506	a_ShiftTable    db      None,1Bh,'!@#$%^&*()_+',15h               ; ShiftTable
  507	                db      9,'qwertyuiop{}',0Dh
  508	                db      Ctrl,'asdfghjkl:"~'
  509	                db      LShift,'|zxcvbnm<>?',RShift,'*'
  510	                db      ALT,' ',Caps
  511	                db      k_F1,k_F2,k_F3,k_F4,k_F5,k_F6,k_F7,k_F8,k_F9,k_F10
  512	                db      k_NumLock,k_Reset,'789-456+1230.'
  513	                db      None,None,None,None,k_F12
  514	
  515	a_CapsTable     db      None,1Bh,'1234567890-=',8                 ; CapsTable
  516	                db      9,'qwertyuiop[]',0Dh
  517	                db      Ctrl,'asdfghjkl;',27h,'`'
  518	                db      LShift,'\zxcvbnm,./',RShift,'*'
  519	                db      ALT,' ',Caps
  520	                db      k_F1,k_F2,k_F3,k_F4,k_F5,k_F6,k_F7,k_F8,k_F9,k_F10
  521	                db      k_NumLock,k_Reset,None,0Bh,None,'-'
  522	                db      8,None,15h,'+',None,0Ah,None,9,4
  523	                db      None,None,None,None,k_F12
  524	
  525	a_CpsShfTable   db      None,1Bh,'!@#$%^&*()_+',15h               ; CpsShfTable
  526	                db      9,'QWERTYUIOP[]',0Dh
  527	                db      Ctrl,'ASDFGHJKL:"~'
  528	                db      LShift,'|ZXCVBNM,./',RShift,'*'
  529	                db      ALT,' ',Caps
  530	                db      k_F1,k_F2,k_F3,k_F4,k_F5,k_F6,k_F7,k_F8,k_F9,k_F10
  531	                db      k_NumLock,k_Reset,'789-456+1230.'
  532	                db      None,None,None,None,k_F12
  533	
  534	a_AltTable      db      None,k_DosShell,'1234567890-=',8 ; AltTable
  535	                db      9,11h,17h,5,12h,14h,19h,15h,9,0Fh,10h,1Bh,1Dh,0Dh
  536	                db      Ctrl,1,13h,4,6,7,8,0Ah,0Bh,0Ch,';',27h,1Eh
  537	                db      LShift,0,1Ah,k_QuitAppler,3,16h,2,0Eh,0Dh,',./',RShift,'*'
  538	                db      ALT,' ',Caps
  539	                db      k_F1,k_F2,k_F3,k_F4,k_F5,k_F6,k_F7,k_F8,k_F9,k_F10
  540	                db      k_NumLock,k_Reset,None,0Bh,None,'-'
  541	                db      8,None,15h,'+',None,0Ah,None,9,None
  542	                db      None,None,None,None,k_F12
  543	
  544	a_NumTable      db      None,1Bh,'1234567890-=',8          ; Num Table
  545	                db      9,'QWERTYUIOP[]',0Dh
  546	                db      Ctrl,'ASDFGHJKL;',27h,'`'
  547	                db      LShift,'\ZXCVBNM,./',RShift,'*'
  548	                db      ALT,' ',Caps
  549	                db      k_F1,k_F2,k_F3,k_F4,k_F5,k_F6,k_F7,k_F8,k_F9,k_F10
  550	                db      k_NumLock,k_Reset,None,k_UpArrow,None,'-'
  551	                db      k_LeftArrow,None,k_RightArrow,'+',None,k_DownArrow,None,k_Fire1,k_Fire2
  552	                db      None,None,None,None,k_F12
  553	
  554	
  555	
  556	;  1 Home
  557	;  2 End
  558	;  3 PgUp
  559	;  4 PgDn
  560	;  5 Left
  561	;  6 Right
  562	;  7 Up
  563	;  8 Down
  564	;  9 Ins
  565	;  A Del
  566	;  B BS
  567	;  C Esc
  568	;  D Tab
  569	;  E F1
  570	;  F F2
  571	; 10 F3
  572	; 11 F4
  573	; 12 F5
  574	; 13 F6
  575	; 14 F7
  576	; 15 F8
  577	; 16 F9
  578	; 17 F10
  579	; 18 Enter
  580	; 19 Cntr
  581	; 1A Dos Shell
  582	; 1B Quit
  583	
  584	d_NormalTable   db      None,0Ch,'1234567890-=',0Bh
  585	                db      0Dh,'qwertyuiop[]',18h
  586	                db      Ctrl,'asdfghjkl;',27h,'`'
  587	                db      LShift,'\zxcvbnm,./',RShift,'*'
  588	                db      ALT,' ',Caps
  589	                db      0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h
  590	                db      k_NumLock,None,1,7,3,'-'
  591	                db      5,19h,6,'+',2,8,4,9,0Ah
  592	                db      None,None,None,None,None
  593	
  594	d_ShiftTable    db      None,0Ch,'!@#$%^&*()_+',0Bh
  595	                db      0Dh,'QWERTYUIOP{}',18h
  596	                db      Ctrl,'ASDFGHJKL:"~'
  597	                db      LShift,'|ZXCVBNM<>?',RShift,'*'
  598	                db      ALT,' ',Caps
  599	                db      0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h
  600	                db      k_NumLock,None,1,7,3,'-'
  601	                db      5,19h,6,'+',2,8,4,9,0Ah
  602	                db      None,None,None,None,None
  603	
  604	d_CapsTable     db      None,0Ch,'1234567890-=',0Bh
  605	                db      0Dh,'QWERTYUIOP[]',18h
  606	                db      Ctrl,'ASDFGHJKL;',27h,'`'
  607	                db      LShift,'\ZXCVBNM,./',RShift,'*'
  608	                db      ALT,' ',Caps
  609	                db      0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h
  610	                db      k_NumLock,None,1,7,3,'-'
  611	                db      5,19h,6,'+',2,8,4,9,0Ah
  612	                db      None,None,None,None,None
  613	
  614	d_CpsShfTable   db      None,0Ch,'!@#$%^&*()_+',0Bh
  615	                db      0Dh,'qwertyuiop{}',18h
  616	                db      Ctrl,'asdfghjkl:"~'
  617	                db      LShift,'|zxcvbnm<>?',RShift,'*'
  618	                db      ALT,' ',Caps
  619	                db      0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h
  620	                db      k_NumLock,None,1,7,3,'-'
  621	                db      5,19h,6,'+',2,8,4,9,0Ah
  622	                db      None,None,None,None,None
  623	
  624	d_AltTable      db      None,1Ah,'1234567890-=',0Bh
  625	                db      0Dh,'qwertyuiop[]',18h
  626	                db      Ctrl,'asdfghjkl;',27h,'`'
  627	                db      LShift,'\z',1Bh,'cvbnm,./',RShift,'*'
  628	                db      ALT,' ',Caps
  629	                db      0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h
  630	                db      k_NumLock,None,1,7,3,'-'
  631	                db      5,19h,6,'+',2,8,4,9,0Ah
  632	                db      None,None,None,None,None
  633	
  634	k_NormalTable   db      None,'..............'
  635	                db      '..............'
  636	                db      Ctrl,'............'
  637	                db      LShift,'...........',RShift,'.'
  638	                db      ALT,'.',Caps
  639	                db      0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h
  640	                db      k_NumLock,None,'....'
  641	                db      '.........'
  642	                db      None,None,None,None,None
  643	
  644	k_AltTable      db      None,1Ah,'.............'
  645	                db      '..............'
  646	                db      Ctrl,'............'
  647	                db      LShift,'..',1Bh,'........',RShift,'.'
  648	                db      ALT,'.',Caps
  649	                db      0Eh,0Fh,10h,11h,12h,13h,14h,15h,16h,17h
  650	                db      k_NumLock,None,'....'
  651	                db      '........',1Bh
  652	                db      None,None,None,None,None
  653	Keyboard        ends
  654	
  655	
  656	
  657	SimKbd          segment public
  658	                assume  cs:SimKbd,ds:SimKbd,es:Emulate
  659	
  660	; Entry:
  661	;   DS:SI -> keys
  662	;   CF    -- keys format type: 1 - single, 0 - double
  663	SimKbdRq        proc    far
  664	                push    ax cx dx
  665	                mov     al,0
  666	                jnc     SKR_1
  667	                inc     al
  668	SKR_1:          mov     cs:SK_SpeedType,al
  669	                mov     word ptr cs:SK_Address,si
  670	                mov     word ptr cs:SK_Address[2],ds
  671	                xor     ax,ax
  672	                mov     al,cs:SK_Speed
  673	                mov     cx,cs
  674	                mov     dx,offset SimKbdTimer
  675	                call    TimerReq
  676	                pop     dx cx ax
  677	                ret
  678	SimKbdRq        endp
  679	
  680	SimKbdClrKeys   db      0
  681	SimKbdClr       proc    far
  682	                push    si ds
  683	                push    cs
  684	                pop     ds
  685	                mov     si,offset SimKbdClrKeys
  686	                stc
  687	                call    SimKbdRq
  688	                pop     ds si
  689	                ret
  690	SimKbdClr       endp
  691	
  692	key_taken       proc    far
  693	                mov     cs:SK_WaitFlag,0
  694	                ret
  695	key_taken       endp
  696	
  697	SK_SpeedType    db      1
  698	SK_Address      dd      ?
  699	SK_Speed        db      1
  700	SK_WaitFlag     db      0
  701	SimKbdTimer     proc    far
  702	                mov     ax,seg C000
  703	                mov     es,ax
  704	                lds     si,cs:SK_Address
  705	                cmp     cs:SK_WaitFlag,0
  706	                jz      SK_ok
  707	                mov     ax,1
  708	                mov     cx,cs
  709	                mov     dx,offset SimKbdTimer
  710	                call    TimerReq
  711	                ret
  712	SK_ok:          cld
  713	                lodsb
  714	                or      al,al
  715	                jz      SK_Ret
  716	                cmp     al,0FFh
  717	                jne     SK_DoIt
  718	                lodsb
  719	                mov     cs:SK_Speed,al
  720	                jmp     SK_CallRq
  721	SK_DoIt:        mov     es:C000,0
  722	                call    far ptr Key
  723	                mov     bl,es:C000
  724	                mov     cs:SK_WaitFlag,bl
  725	                mov     bx,seg TimerFlags
  726	                mov     es,bx
  727	                assume  es:seg TimerFlags
  728	                or      es:TimerFlags,ax
  729	                cmp     cs:SK_SpeedType,1
  730	                je      SK_CallRq
  731	                lodsb
  732	                mov     cs:SK_Speed,al
  733	SK_CallRq:      cmc
  734	                call    SimKbdRq
  735	SK_Ret:         ret
  736	SimKbdTimer     endp
  737	
  738	;------------------------------------------------------ Recording & Playback ---
  739	
  740	; Entry:
  741	;   ES:DI -> buffer
  742	;   CX    -- buffer length
  743	StartRecord     proc    far
  744	                push    ax ds
  745	                push    cs
  746	                pop     ds
  747	                mov     RK_RecordAddrLo,di
  748	                mov     RK_RecordAddrHi,es
  749	                mov     RK_MaxRecord,cx
  750	                mov     RK_InitialCount,cx
  751	                mov     ax,40h
  752	                mov     ds,ax
  753	                mov     ax,word ptr ds:[6Ch]
  754	                mov     cs:RK_RecordTime,ax
  755	                pop     ds ax
  756	                ret
  757	StartRecord     endp
  758	
  759	
  760	RK_InitialCount dw      0
  761	
  762	; Exit:
  763	;   CX -- recorded keys count
  764	StopRecord      proc    far
  765	                push    ax di es
  766	                mov     cx,cs:RK_InitialCount
  767	                sub     cx,cs:RK_MaxRecord
  768	                xor     ax,ax
  769	                mov     cs:RK_MaxRecord,ax
  770	                les     di,cs:RK_RecordAddr
  771	                inc     ax
  772	                stosw
  773	                pop     es di ax
  774	                ret
  775	StopRecord      endp
  776	
  777	
  778	RK_RecordAddr   label   dword
  779	RK_RecordAddrLo dw      0
  780	RK_RecordAddrHi dw      0
  781	RK_RecordTime   dw      0
  782	RK_MaxRecord    dw      0
  783	RK_GoToDebug    db      0FFh,1,38h,3Bh,0B8h
  784	                db      1Fh,14h,18h,19h,2Ah,02h,0AAh,39h,30h,16h,21h
  785	                DB      21h,12h,13h,39h,21h,16h,26h,26h,2Ah,02h,0AAh
  786	                db      0
  787	
  788	; Entry:
  789	;   AL -- key to be recorded
  790	RecordKey       proc    far
  791	                push    ax bx di ds es
  792	                push    cs
  793	                pop     ds
  794	                cmp     RK_MaxRecord,0
  795	                jz      RK_ret
  796	                mov     bx,40h
  797	                mov     es,bx
  798	                mov     bx,word ptr es:[6Ch]
  799	                xchg    bx,RK_RecordTime
  800	                sub     bx,RK_RecordTime
  801	                neg     bx
  802	                or      bx,bx
  803	                jnz     RK_1
  804	                inc     bx
  805	RK_1:           or      bh,bh
  806	                jz      RK_2
  807	                mov     bl,0FFh
  808	RK_2:           les     di,RK_RecordAddr
  809	                cld
  810	                mov     ah,al
  811	                mov     al,bl
  812	                stosw
  813	                mov     RK_RecordAddrLo,di
  814	                dec     RK_MaxRecord
  815	                jnz     RK_Ret
  816	                call    StopRecord
  817	                mov     si,offset RK_GoToDebug
  818	                stc
  819	                call    SimKbdRq
  820	RK_ret:         pop     es ds di bx ax
  821	                ret
  822	RecordKey       endp
  823	
  824	SimKbd          ends
  825	
  826	                end
  827	

Generated by GNU Enscript 1.6.6, and GophHub 1.3.