GophHub - zajo/appler/src/KBDSETUP.ASM


Raw File

;  _____________________________________________
; |                                             |
; |  Project:   APPLER                          |
; |  File:      KBDSETUP.ASM                    |
; |  Compiler:  16-bit TASM (2.5)               |
; |                                             |
; |  Subject:   Keyboard Setup Utility          |
; |                                             |
; |  Author:    Emil Dotchevski                 |
; |_____________________________________________|

                include GLOBALS.INC
                include INTERFAC.INC
                include CONIO.INC

KBDsetup        segment public
                assume  cs:KBDsetup,ds:KBDsetup,es:Keyboard

GetLineParams   GL_ParamStruc  <?,0,1,1,5,0,0,20h,40h,2*80,?,?,0Bh,1,0,GetLineUser>
ScreenIOParams  SIO_ParamStruc <1,KBDsetup,0,0,offset Screen,seg Screen,1,0,1,1>
GetKeyParams    RK_ParamStruc  <1,Fkey,0,0,0,?,ShowAll,0>

KBDSetupInInit  proc    far
                cli
                push    ax ds es
                mov     ax,Emulate
                mov     es,ax
                assume  es:Emulate
                mov     al,es:[C000]
                mov     cs:KeyPressed,al
                mov     es:[C000],0
                assume  ds:CONio
                mov     ax,CONio
                mov     ds,ax
                mov     GL_ParamsOfs,  offset GetLineParams
                mov     GL_ParamsSeg,  seg    GetLineParams
                mov     SIO_ParamsOfs, offset ScreenIOParams
                mov     SIO_ParamsSeg, seg    ScreenIOParams
                mov     RK_ParamsOfs,  offset GetKeyParams
                mov     RK_ParamsSeg,  seg    GetKeyParams
                push    cs
                pop     ds
                assume  ds:KBDsetup
                mov     ax,Keyboard
                mov     es,ax
                assume  es:Keyboard
                mov     ax,OldKeys
                mov     es:k_Table,ax
                pop     es ds ax
                call    UnSetBreaks
                sti
                ret
KBDSetupInInit  endp

KeyPressed      db      0
OldKeys         dw      offset Keyboard:k_KbdSetupTable
KBDSetupOutInit proc    far
                cli
                push    ax ds es
                push    cs
                pop     ds
                mov     ax,Keyboard
                mov     es,ax
                assume  es:Keyboard
                mov     ax,es:k_Table
                mov     OldKeys,ax
                mov     ax,Emulate
                mov     es,ax
                assume  es:Emulate
                mov     al,KeyPressed
                mov     es:[C000],al
                mov     ax,seg T_Iflags
                mov     es,ax
		assume  es:seg T_Iflags
                mov     byte ptr es:T_Iflags,00000010b
                pop     es ds ax
		call    AppleKeysOn
                call    SetBreaks
                ret
KBDSetupOutInit endp

                assume  cs:KBDsetup,ds:KBDsetup,es:Keyboard

KBD_Keys        db      05h,06h,07h,08h,01h,02h,0Ah,18h,0Ch
KBD_Procs       dw      KBD_Left,KBD_Right,KBD_Up,KBD_Down,KBD_Home,KBD_End,KBD_Clear,KBD_Enter,KBD_Esc

KBDsetupRET:    push    cs
                pop     ds
                mov     ax,Keyboard
                mov     es,ax
KBDloop:        mov     cs:ActiveFlags,0000000000001000b
                mov     FkeysFlags,0000111111b
                mov     SA_Active,0
                mov     ShowASCII?,0
                mov     es:k_Table,offset k_KbdSetupTable
                mov     ScreenIOparams.CursorFlag,0
                mov     SA_MesFlag,1
                call    ReadKey
                mov     SA_MesFlag,0
                mov     es:k_Table,offset k_DebugTable
                mov     ShowASCII?,1
                xor     bx,bx
                mov     bl,ah
                mov     SA_Active,bx
                mov     si,es:k_Shifts
                mov     ST_Shifts,si
                mov     cs:ActiveFlags,0000000000010000b
                call    KBD_Home
                xchg    si,bx
                call    get_table_ofs
                mov     bx,es:k_AppleTable[bx]
                mov     bl,es:[si][bx]
                cmp     bl,85h
                ja      KBDloop1
KBDloop0:       mov     al,ST_Pos
                cmp     al,bl
                je      KBDloop1
                call    KBD_Down
                jmp     KBDloop0
KBDloop1:       mov     cx,100h
                call    ReadKey
                mov     di,offset KBD_Keys
                mov     cx,offset KBD_Procs- offset KBD_Keys
                call    CalcCommand
                jc      KBDloop1
                shl     di,1
                call    KBD_Procs[di]
                jnc     KBDloop1
                jmp     KBDloop

KBD_Left:       cmp     ST_Pos,16
                jb      KBD_LeftRet
                sub     ST_Pos,16
                mov     al,ST_Pos
                cmp     al,ST_BegPrint
                jae     KBD_LeftRet
                sub     ST_BegPrint,16
KBD_LeftRet:    clc
                ret

KBD_Right:      cmp     ST_Pos,86h-16
                jnb     KBD_RightRet
                add     ST_Pos,16
                mov     al,ST_Pos
                sub     al,ST_BegPrint
                cmp     al,16*4
                jb      KBD_RightRet
                add     ST_BegPrint,16
KBD_RightRet:   clc
                ret

KBD_Up:         cmp     ST_Pos,0
                jz      KBD_UpRet
                dec     ST_Pos
                mov     al,ST_Pos
                cmp     al,ST_BegPrint
                jae     KBD_UpRet
                sub     ST_BegPrint,16
KBD_UpRet:      clc
                ret

KBD_Down:       cmp     ST_Pos,85h
                jae     KBD_DownRet
                inc     ST_Pos
                mov     al,ST_Pos
                sub     al,ST_BegPrint
                cmp     al,16*4
                jb      KBD_DownRet
                add     ST_BegPrint,16
KBD_DownRet:    clc
                ret

KBD_Home:       mov     ST_Pos,0
                mov     ST_BegPrint,0
                clc
                ret

KBD_End:        mov     ST_Pos,07Fh
                mov     ST_BegPrint,4*16
                clc
                ret

KBD_Clear:      mov     dl,ST_Pos
                mov     ST_Pos,86h
                call    KBD_Enter
                mov     ST_Pos,dl
                ret

KBD_Enter:      mov     bx,ST_Shifts
                call    get_table_ofs
                mov     si,es:k_AppleTable[bx]
                mov     al,ST_Pos
                mov     bx,SA_Active
                cmp     si,offset Keyboard:a_AltTable
                jne     KBD_Enter1
                mov     es:a_CtrlTable[bx],al
KBD_Enter1:     cmp     si,offset Keyboard:a_CtrlTable
                jne     KBD_Enter2
                mov     es:a_AltTable[bx],al
KBD_Enter2:     mov     es:[si][bx],al
KBD_Esc:        stc
                ret



FkeyProcs       dw      Fkey_F1,Fkey_F2,Fkey_F3,Fkey_F4,Fkey_F5
                dw      Fkey_F6,Fkey_F7,Fkey_F8,Fkey_F9,Fkey_F0
FkeysMasks      dw      1b,10b,100b,1000b,10000b,100000b,1000000b,10000000b,100000000b,1000000000b
Fkey            proc    far
                push    ax bx cx dx si di bp ds es
                push    cs
                pop     ds
                mov     bx,Keyboard
                mov     es,bx
                push    [ActiveFlags]
                push    word ptr [ScreenIOparams.CursorFlag]
                push    word ptr [ScreenIOparams.CursorLen]
                push    word ptr [ScreenIOparams.CursorColor]
                push    [FkeysFlags]
                push    word ptr [SA_MesFlag]
                mov     SA_MesFlag,0
                push    es:k_Table
                mov     es:k_Table,offset k_DebugTable
                xor     bx,bx
                mov     bl,al
                shl     bx,1
                mov     ax,FkeysMasks[bx]
                mov     ScreenIOparams.CursorLen,1
                mov     ScreenIOparams.CursorFlag,1
                test    FkeysFlags,ax
                jz      Fkey_Ret
                mov     FkeysFlags,0000001000b
                call    FkeyProcs[bx]
Fkey_Ret:       push    cs
                pop     ds
                mov     bx,Keyboard
                mov     es,bx
                pop     es:k_Table
                pop     word ptr [SA_MesFlag]
                pop     [FkeysFlags]
                pop     word ptr [ScreenIOparams.CursorColor]
                pop     word ptr [ScreenIOparams.CursorLen]
                pop     word ptr [ScreenIOparams.CursorFlag]
                pop     [ActiveFlags]
                pop     es ds bp di si dx cx bx ax
                ret
Fkey            endp


Fkey_F1:        mov     ax,CONio
                mov     es,ax
                assume  es:CONio
                xor     es:DKO_OldBuffFlag,1
                cmp     es:DKO_OldBuffFlag,0
                jnz     Fkey_F1_Ret
                call    ClearBuffer
Fkey_F1_Ret:    ret
                assume  es:Keyboard

Fkey_F2:        call    Prepare4DOS
                mov     dx,offset Filespec
                xor     cx,cx
                mov     ax,3C01h
                int     21h
                jc      Fkey_F2errorNC
                mov     bx,ax
                mov     dx,offset RecognizeBytes
                mov     cx,5
                mov     ah,40h
                int     21h
                jc      Fkey_F2error
                cmp     ax,cx
                jne     Fkey_F2error
                mov     dx,offset SR_KbdParam
                mov     cx,1
                mov     ah,40h
                int     21h
                jc      Fkey_F2error
                mov     cx,CONio
                mov     ds,cx
                mov     dx,offset CONio:DKO_OldBuffFlag
                mov     cx,1
                mov     ah,40h
                int     21h
                jc      Fkey_F2error
                mov     cx,Keyboard
                mov     ds,cx
                mov     dx,offset Keyboard:a_NormalTable
                mov     cx,6 * 54h
                mov     ah,40h
                int     21h
                jc      Fkey_F2error
                cmp     ax,cx
                jne     Fkey_F2error
                mov     ah,3Eh
                int     21h
                mov     cs:GetKeyParams.RK_ErrPtr,offset SMS_Saved
Fkey_F2ret:     call    SOD4eraperP
                ret
Fkey_F2error:   mov     ah,3Eh
                int     21h
Fkey_F2errorNC: mov     cs:GetKeyParams.RK_ErrPtr,offset SMS_ErrorSave
                jmp     Fkey_F2ret


RecognizeBytes  db      0,0FFh,55h,0AAh,0
RecognizeBuffer db      5 dup (0)
Fkey_F3:        call    Prepare4DOS
                mov     dx,offset Filespec
                mov     ax,3D00h
                int     21h
                jc      Fkey_F3errorNC
                mov     bx,ax
                mov     dx,offset RecognizeBuffer
                mov     cx,5
                mov     ah,3Fh
                int     21h
                jc      Fkey_F3error
                cmp     ax,cx
                jne     Fkey_F3error
                push    cs
                pop     es
                mov     si,offset RecognizeBytes
                mov     di,offset RecognizeBuffer
                cld
        rep     cmpsb
                jne     Fkey_F3errorT
                mov     dx,offset SR_KbdParam
                mov     cx,1
                mov     ah,3Fh
                int     21h
                jc      Fkey_F3error
                mov     cx,CONio
                mov     ds,cx
                mov     dx,offset CONio:DKO_OldBuffFlag
                mov     cx,1
                mov     ah,3Fh
                int     21h
                jc      Fkey_F3error
                mov     cx,Keyboard
                mov     ds,cx
                mov     dx,offset Keyboard:a_NormalTable
                mov     cx,6 * 54h
                mov     ah,3Fh
                int     21h
                jc      Fkey_F3error
                cmp     ax,cx
                jne     Fkey_F3error
                mov     ah,3Eh
                int     21h
                call    UpdateKeyboard
                mov     cs:GetKeyParams.RK_ErrPtr,offset SMS_Restored
Fkey_F3ret:     call    SOD4eraperP
                ret
Fkey_F3error:   mov     ah,3Eh
                int     21h
Fkey_F3errorNC: mov     cs:GetKeyParams.RK_ErrPtr,offset SMS_ErrorLoad
                jmp     Fkey_F3ret
Fkey_F3errorT:  mov     ah,3Eh
                int     21h
                mov     cs:GetKeyParams.RK_ErrPtr,offset SMS_Type
                jmp     Fkey_F3ret

Fkey_F4:        call    GoAppleII
                ret

FkeyF5_Keys     db      7,8,5,6,18h,0Ch
FkeyF5_Procs    dw      FkeyF5_Up,FkeyF5_Down,FkeyF5_Left,FkeyF5_Right,FkeyF5_Enter,FkeyF5_Esc
Fkey_F5:        mov     ActiveFlags,1
FkeyF5Loop:     call    ReadKey
                mov     di,offset FkeyF5_Keys
                mov     cx,offset FkeyF5_Procs- offset FkeyF5_Keys
                call    CalcCommand
                jc      FkeyF5Loop
                shl     di,1
                mov     al,SR_KbdParam
                mov     ah,al
                call    FkeyF5_Procs[di]
                mov     SR_KbdParam,al
		call    UpdateKeyboard
                jnc     FkeyF5Loop
                ret

FkeyF5_Up:      and     ah,01100000b
                add     ah,00100000b
                and     ah,01100000b
                and     al,10011111b
                or      al,ah
                clc
                ret

FkeyF5_Down:    and     ah,01100000b
                sub     ah,00100000b
                and     ah,01100000b
                and     al,10011111b
                or      al,ah
                clc
                ret

FkeyF5_Left:    inc     ah
                and     ah,00011111b
                and     al,11100000b
                or      al,ah
                mov     di,offset SR_speeds_v
                mov     cx,10
		xchg    al,ah
                call    CalcCommand
		xchg    al,ah
                jc      FkeyF5_Left
                ret

FkeyF5_Right:   dec     ah
                and     ah,00011111b
                and     al,11100000b
                or      al,ah
                mov     di,offset SR_speeds_v
                mov     cx,10
		xchg    al,ah
                call    CalcCommand
		xchg    al,ah
                jc      FkeyF5_Right
                ret

FkeyF5_Enter:
FkeyF5_Esc:     stc
                ret


UpdateKeyboard  proc    far
                pushf
                push    ax
                mov     al,0ADh                 ; Disable Keyboard
                call    K_SendCommand
                jc      UK_Exit
                mov     al,0F3h
                call    K_SendData
                mov     al,cs:SR_KbdParam
                call    K_SendData
UK_Exit:        mov     al,0AEh                 ; Enable Keyboard
                out     64h,al
                pop     ax
		popf
                ret
UpdateKeyboard  endp


KBD_EXT         db      '.KBD',0
Fkey_F6:        mov     ActiveFlags,0000000000000100b
                mov     FkeysFlags,0000001000b
                mov     GetLineParams.GL_Buffer,offset Filespec
                mov     GetLineParams.GL_Pos,0
                mov     GetLineParams.GL_BegPrint,0
                mov     GetLineParams.GL_MaxLength,99
                mov     GetLineParams.GL_MaxPrint,27
                xor     bx,bx
Seek0_Loop:     cmp     FileSpec[bx],0
                jz      Seek0_Done
                inc     bl
                jmp     Seek0_Loop
Seek0_Done:     mov     GetLineParams.GL_Length,bl
                gotoxy  5,51
                GetLineService _GETLINE
                push    si di
                mov     si,offset KBD_EXT
                mov     di,offset Filespec
                call    AddExt
                pop     di si
                gotoxy  2,0
                mov     GetLineParams.GL_CX,cx
                ret

Fkey_F7:
Fkey_F8:
Fkey_F9:
Fkey_F0:        ret




; *******************************************************************
; **                                                               **
; **                                                               **
; **                        S H O W    A L L                       **
; **                                                               **
; **                                                               **
; *******************************************************************

ActiveFlags     dw      0
ShowAll         proc    far
                cli
                push    ax ds bp
                push    word ptr [ScreenIOparams.CursorColor]
                push    word ptr [ScreenIOparams.CursorLen]
                push    word ptr [ScreenIOparams.CursorFlag]
                push    cs
                pop     ds
                mov     ax,Keyboard
                mov     es,ax
                mov     ScreenIOparams.CursorLen,10
                mov     ScreenIOparams.CursorColor,10h
                mov     ScreenIOparams.CursorFlag,1
                call    ShowRepeat
                call    ShowBuffer
                call    ShowFilespec
                call    ShowAssignment
                call    ShowASCII
                call    ShowFuncKeys
                ScreenIOservice _SHOWLINE
                call    ShowTitle
                call    ShowMessage
                pop     word ptr [ScreenIOparams.CursorFlag]
                pop     word ptr [ScreenIOparams.CursorLen]
                pop     word ptr [ScreenIOparams.CursorColor]
                pop     bp ds ax
                sti
                ret
ShowAll         endp


; -- Draw box --------------------------
; Entry:
;  AH  = Active Flag Bit
;  CX  = HTAB & VTAB
;  BX  = Offset of the strings
;  DL  = Hi-light color
;  DH  = Number of lines - 1
; Destroy:
;  AX,BX,CX,DX
DB_CX           dw      ?
DrawBox:        push    ax
                mov     ax,cx
                add     ax,80 * 2
                mov     cs:DB_CX,ax
                pop     ax
                test    ActiveFlags,ax
                mov     ah,7
                jz      DB_ok1
                mov     ah,dl
DB_ok1:         ScreenIOservice _STRINGPRINT
                mov     bx,ScreenIOparams.SP_bx
                dec     dh
                mov     al,dh
                mov     dx,cs:DB_CX
DB_Loop1:       mov     cx,dx
                add     dx,80 * 2
                ScreenIOservice _STRINGPRINT
                dec     al
                jnz     DB_Loop1
                mov     cx,dx
                mov     bx,ScreenIOparams.SP_bx
                ScreenIOservice _STRINGPRINT
                ret


ST_StrX         db      '                              APPLER KEYBOARD SETUP                             ',0
ShowTitle:      push    ax bx cx
                gotoxy  1,0
                mov     ah,5Fh
                mov     bx,offset ST_StrX
                ScreenIOservice _STRINGPRINT
                gotoxy  2,0
                xor     ah,ah
                ScreenIOservice _STRINGPRINT
                pop     cx bx ax
                ret


SR_Str          db      'ÚRepeat SettingsÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ',0
                db      '³                                 ³ ',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ',0
SR_str1   db      1,7,'Delay:',0
SR_str2   db      1,7,' ms  Speed: ',0
SR_str3   db      1,7,' ch/s',0
SR_delays       dw      d250,d500,d750,d1000
SR_speeds_v     db      0,1,2,4,8,0Ah,0Dh,10h,14h,1Fh
SR_speeds       dw      s300,s267,s240,s200,s150,s100,s092,s075,s050,s020
d250            db      1,0Bh,' 250',0
d500            db      1,0Bh,' 500',0
d750            db      1,0Bh,' 750',0
d1000           db      1,0Bh,'1000',0
s300            db      1,0Bh,'30.0',0
s267            db      1,0Bh,'26.7',0
s240            db      1,0Bh,'24.0',0
s200            db      1,0Bh,'20.0',0
s150            db      1,0Bh,'15.0',0
s100            db      1,0Bh,'10.0',0
s092            db      1,0Bh,' 9.2',0
s075            db      1,0Bh,' 7.5',0
s050            db      1,0Bh,' 5.0',0
s020            db      1,0Bh,' 2.0',0
SR_KbdParam     db      0
ShowRepeat:     push    ax bx cx dx di
                gotoxy  3,0
                mov     bx,offset SR_Str
                mov     dx,30Eh
                mov     ax,0000000000000001b
                call    DrawBox
                gotoxy  5,2
                mov     bx,offset SR_Str1
                ScreenIOservice _STRINGPRINT
                xor     bx,bx
                mov     bl,SR_KbdParam
                shr     bl,5
                shl     bx,1
                mov     bx,SR_delays[bx]
                ScreenIOservice _STRINGPRINT
                mov     bx,offset SR_str2
                ScreenIOservice _STRINGPRINT
                xor     bx,bx
                mov     al,SR_KbdParam
                and     al,00011111b
                push    cx
                mov     di,offset SR_Speeds_v
                mov     cx,10
                call    CalcCommand
                pop     cx
                shl     di,1
                mov     bx,SR_speeds[di]
                ScreenIOservice _STRINGPRINT
                mov     bx,offset SR_str3
                ScreenIOservice _STRINGPRINT
                pop     di dx cx bx ax
                ret


SB_Str          db      'ÚBufferÄÄÄÄ¿ ',0
                db      '³          ³ ',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÙ ',0
SB_Enabled      db      1,0Bh,'Enabled',0
SB_Disabled     db      1,0Bh,'Disabled',0
ShowBuffer:     push    ax bx cx dx es
                gotoxy  3,36
                mov     bx,offset SB_Str
                mov     dx,30Eh
                mov     ax,0000000000000010b
                call    DrawBox
                gotoxy  5,38
                mov     ax,CONio
                mov     es,ax
                assume  es:CONio
                test    es:DKO_OldBuffFlag,1
                mov     bx,offset SB_Disabled
                jz      SB_1
                mov     bx,offset SB_Enabled
SB_1:           ScreenIOservice _STRINGPRINT
                pop     es dx cx bx ax
                ret
                assume  es:Keyboard


SF_Str          db      'ÚFilenameÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0
                db      '³                             ³',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0
Filespec        db      'APPLER.KBD',100 dup (0)
ShowFilespec:   push    ax bx cx dx
                gotoxy  3,49
                mov     bx,offset SF_Str
                mov     dx,30Eh
                mov     ax,0000000000000100b
                call    DrawBox
                xor     dl,dl
                xchg    Filespec[27],dl
                mov     bx,offset Filespec
                gotoxy  5,51
                mov     ah,0Bh
                ScreenIOservice _STRINGPRINT
                xchg    Filespec[27],dl
                pop     dx cx bx ax
                ret


SA_Str          db      'ÚKeyboard MapÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0
                db      '³                                                                              ³',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0
SA_Message      db      1,0Fh,'Press a key to remap',0
SA_Keyboard     db      'ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿  ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿',0
                db      '³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³  ³  ³³  ³³  ³³  ³',0
                db      'ÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙ  ÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙ',0
                db      'ÚÄÄÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄÄÄ¿  ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿',0
                db      '³    ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³    ³  ³  ³³  ³³  ³³  ³',0
                db      'ÀÄÄÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀ¿   ³  ÀÄÄÙÀÄÄÙÀÄÄÙ³  ³',0
                db      'ÚÄÄÄÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿³   ³  ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿³  ³',0
                db      '³     ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³   ³  ³  ³³  ³³  ³³  ³',0
                db      'ÀÄÄÄÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÄÙ  ÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙ',0
                db      'ÚÄÄÄÄÄÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄÄÄÄÄÄÄÄ¿  ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿ÚÄÄ¿',0
                db      '³       ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³  ³³         ³  ³  ³³  ³³  ³³  ³',0
                db      'ÀÄÄÄÄÄÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÙÀÄÄÄÄÄÄÄÄÄÙ  ÀÄÄÙÀÄÄÙÀÄÄÙ³  ³',0
                db      'ÚÄÄÄÄ¿       ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿        ÚÄÄÄÄ¿  ÚÄÄÄÄÄÄ¿ÚÄÄ¿³  ³',0
                db      '³    ³       ³                               ³        ³    ³  ³      ³³  ³³  ³',0
                db      'ÀÄÄÄÄÙ       ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ        ÀÄÄÄÄÙ  ÀÄÄÄÄÄÄÙÀÄÄÙÀÄÄÙ',0
SA_SpcProcs     dw      SAS_Enter,SAS_Ctrl,SAS_Lshift,SAS_Div,SAS_Rshift,SAS_Caps,SAS_Num
SA_TblPtr       dw      ?
SA_Active       dw      0
SA_MesFlag      db      1
ShowAssignment: push    ax bx cx dx si di
                mov     bx,es:k_Shifts
                call    get_table_ofs
                mov     bx,es:k_AppleTable[bx]
                mov     SA_TblPtr,bx
                gotoxy  7,0
                mov     bx,offset SA_Str
                mov     dx,110Eh
                mov     ax,0000000000001000b
                call    DrawBox
                mov     bx,offset SA_Keyboard
                gotoxy  9,1
                mov     dx,15
                mov     ah,7
SA_Loop1:       ScreenIOservice _STRINGPRINT
                add     cx,2*2
                add     bx,79
                dec     dx
                jnz     SA_Loop1
                mov     bx,offset SA_Message
                gotoxy  8,58
                cmp     SA_MesFlag,0
                jz      SA_Dont1
                ScreenIOservice _STRINGPRINT
SA_Dont1:       mov     si,53h
SA_Loop2:       mov     al,SA_Y[si]
                or      al,al
                jz      SA_Next
                dec     al
                jz      SA_Special
                mov     ah,80 * 2
                mul     ah
                mov     cx,ax
                xor     ax,ax
                mov     al,SA_X[si]
                add     cx,ax
                add     cx,ax
SA_SpecialRet:  mov     bx,SA_TblPtr
                mov     bl,es:[bx][si]
                cmp     bl,85h
                ja      SA_Next
                xor     bh,bh
                add     cx,81*2
                cmp     bl,20h
                mov     ax,0B00h+' '
                jae     SA_NoCtrl
                mov     al,'^'
SA_NoCtrl:      ScreenIOservice _SYMBPRINT
                mov     al,SA_Table[bx]
                ScreenIOservice _SYMBPRINT
SA_Next:        dec     si
                jnz     SA_Loop2
                jmp     SA_Ret

SA_Special:     xor     bx,bx
                mov     bl,SA_X[si]
                shl     bx,1
                mov     ah,7
                call    SA_SpcProcs[bx]
                jmp     SA_SpecialRet

SA_Ret:         pop     di si dx cx bx ax
                ret

SAS_Enter:      mov     bx,SA_TblPtr
                mov     bl,es:[bx][si]
                xor     bh,bh
                gotoxy  21,76
                cmp     bl,20h
                mov     ax,0B00h+' '
                jae     SASE_NoCtrl
                mov     al,'^'
SASE_NoCtrl:    ScreenIOservice _SYMBPRINT
                mov     al,SA_Table[bx]
                ScreenIOservice _SYMBPRINT
                gotoxy  12,56
                ret

SAS_CtrlStr     db      'Ctrl',0
SAS_Ctrl:       gotoxy  22,2
                mov     bx,offset SAS_CtrlStr
                test    es:k_Shifts,1
                mov     ah,7
                jz      SAS_Ctrl1
                mov     ah,0Fh
SAS_Ctrl1:      ScreenIOservice _STRINGPRINT
                gotoxy  22,56
                ScreenIOservice _STRINGPRINT
                ret

SAS_ShiftStr    db      'Shift',0
SAS_Lshift:     gotoxy  19,3
                mov     bx,offset SAS_ShiftStr
                test    es:k_Shifts,M_LEFT_SHIFT or M_RIGHT_SHIFT
                mov     ah,7
                jz      SAS_LS1
                mov     ah,0Fh
SAS_LS1:        ScreenIOservice _STRINGPRINT
                ret

SAS_Rshift:     gotoxy  19,53
                mov     bx,offset SAS_ShiftStr
                test    es:k_Shifts,M_LEFT_SHIFT or M_RIGHT_SHIFT
                mov     ah,7
                jz      SAS_RS1
                mov     ah,0Fh
SAS_RS1:        ScreenIOservice _STRINGPRINT
                ret

SAS_CapsStr     db      'Caps',0
SAS_Caps:       gotoxy  16,2
                mov     bx,offset SAS_CapsStr
                test    es:k_Shifts,M_CAPS_LOCK
                mov     ah,7
                jz      SAS_Caps1
                mov     ah,0Fh
SAS_Caps1:      ScreenIOservice _STRINGPRINT
                ret

SAS_NumStr      db      'NL',0
SAS_Num:        gotoxy  10,64
                mov     bx,offset SAS_NumStr
                test    es:k_Shifts,M_NUM_LOCK
                mov     ah,7
                jz      SAS_Num1
                mov     ah,0Fh
SAS_Num1:       ScreenIOservice _STRINGPRINT
                ret

SAS_Div:        mov     bx,SA_TblPtr
                mov     bl,es:[bx][si]
                xor     bh,bh
                gotoxy  10,68
                cmp     bl,20h
                mov     ax,0B00h+' '
                jae     SASD_NoCtrl
                mov     al,'^'
SASD_NoCtrl:    ScreenIOservice _SYMBPRINT
                mov     al,SA_Table[bx]
                ScreenIOservice _SYMBPRINT
                gotoxy  18,46
                ret


;                        0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
SA_X            db       0,01,05,09,13,17,21,25,29,33,37,41,45,49,57, 2 ; 00
                db      07,11,15,19,23,27,31,35,39,43,47,51, 0, 1,08,12 ; 10
                db      16,20,24,28,32,36,40,44,48,52, 2,53,10,14,18,22 ; 20
                db      26,30,34,38,42, 3, 4,71, 0,28, 5, 0, 0, 0, 0, 0 ; 30
                db       0, 0, 0, 0, 0, 6, 0,63,67,71,75,63,67,71,75,63 ; 40
                db      67,71,65,71                                     ; 50

;                        0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
SA_Y            db       0,09,09,09,09,09,09,09,09,09,09,09,09,09,09,12 ; 00
                db      12,12,12,12,12,12,12,12,12,12,12,12, 1, 1,15,15 ; 10
                db      15,15,15,15,15,15,15,15,15,15, 1,09,18,18,18,18 ; 20
                db      18,18,18,18,18, 1, 1,09, 0,21, 1, 0, 0, 0, 0, 0 ; 30
                db       0, 0, 0, 0, 0, 1, 0,12,12,12,09,15,15,15,14,18 ; 40
                db      18,18,21,21                                     ; 50

;                        0123456789ABCDEF0123456789ABCDEF
SA_Table        db      '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_' ; 00
                db      'ú!"#$%&''()*+,-./0123456789:;<=>?'; 20
                db      '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_' ; 40
                db      '`abcdefghijklmnopqrstuvwxyz{|}~±' ; 60
                db      1,2,1Bh,1Ah,18h,19h                ; 80


ST_Str          db      'ÚÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄ¿',0
                db      '³            ³            ³            ³            ³',0
                db      'ÀÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÙ',0
ST_Str1         db      1,0Eh,'³',1,7,' ASCII Char ',1,0Eh,'³',1,7,' ASCII Char ',1,0Eh,'³',1,7,' ASCII Char ',1,0Eh,'³',1,7,' ASCII Char ',1,0Eh,'³',0
ST_Str2         db      1,0Eh,'³',1,7,' ÄÄÄÄÄ ÄÄÄÄ ',1,0Eh,'³',1,7,' ÄÄÄÄÄ ÄÄÄÄ ',1,0Eh,'³',1,7,' ÄÄÄÄÄ ÄÄÄÄ ',1,0Eh,'³',1,7,' ÄÄÄÄÄ ÄÄÄÄ ',1,0Eh,'³',0
ST_Mes0         db      1,2Fh,'                                                   ',0
ST_Mes1         db      1,2Fh,'Select new char to assign to <',0
ST_Mes2         db      1,2Fh,'>',0

ST_ShiftTable   dw      ST_None
                dw      ST_Ctrl
                dw      ST_Ctrl
                dw      ST_Caps
                dw      ST_CapsShift
                dw      ST_Shift
                dw      ST_Num
ST_None         db      0
ST_Ctrl         db      'Ctrl+',0
ST_Shift        db      'Shift+',0
ST_Caps         db      'Caps+',0
ST_CapsShift    db      'Caps+Shift+',0
ST_Num          db      'Num+',0

ShowASCII?      db      0
ST_Shifts       dw      0
ST_BegPrint     db      0
ST_Pos          db      0
ShowASCII:      push    ax bx cx dx si di
                cmp     ShowASCII?,0
                jnz     ST_Go
                jmp     ST_Ret1
ST_Go:          mov     FkeysFlags,0000001000b
                gotoxy  4,14
                mov     bx,offset ST_Str
                mov     dx,130Eh
                mov     ax,0000000000010000b
                call    DrawBox
                gotoxy  5,14
                mov     bx,offset ST_Str1
                ScreenIOservice _STRINGPRINT
                gotoxy  6,14
                mov     bx,offset ST_Str2
                ScreenIOservice _STRINGPRINT
                gotoxy  7,18
                mov     si,cx
                mov     di,cx
                xor     bx,bx
                mov     bl,ST_BegPrint
                mov     dl,4
ST_Loop0:       mov     dh,16
ST_Loop:        mov     al,bl
                cmp     al,85h
                ja      ST_Ret
                mov     ah,7
                ScreenIOservice _BYTEPRINT
                add     cx,6
                cmp     bl,20h
                mov     al,' '
                jae     ST_NoCtrl
                mov     al,'^'
ST_NoCtrl:      mov     ah,0Fh
                ScreenIOservice _SYMBPRINT
                mov     al,SA_Table[bx]
                ScreenIOservice _SYMBPRINT
                cmp     bl,ST_Pos
                je      ST_ShowCursor
ST_ShowCursorR: inc     bx
                add     si,80*2
                mov     cx,si
                dec     dh
                jnz     ST_Loop
                add     di,26
                mov     si,di
                mov     cx,di
                dec     dl
                jnz     ST_Loop0
ST_Ret:         gotoxy  23,15
                mov     bx,offset ST_Mes0
                ScreenIOservice _STRINGPRINT
                gotoxy  23,15
                mov     bx,offset ST_Mes1
                ScreenIOservice _STRINGPRINT
                mov     bx,ST_Shifts
                call    get_table_ofs
                mov     bx,ST_ShiftTable[bx]
                mov     ah,2Eh
                ScreenIOservice _STRINGPRINT
                mov     bx,SA_Active
                mov     al,ST_Table[bx]
                cmp     al,20h
                jbe     ST_Special
                ScreenIOservice _SYMBPRINT
ST_SpecRet:     mov     bx,offset ST_Mes2
                ScreenIOservice _STRINGPRINT
ST_Ret1:        pop     di si dx cx bx ax
                ret

ST_ShowCursor:  push    cx
                sub     cx,9*2
                ScreenIOservice _CALCXY
                mov     cs:ScreenIOparams.CursorColor,40h
                ScreenIOservice _SHOWCURSOR
                pop     cx
                jmp     ST_ShowCursorR

ST_Special:     xor     bx,bx
                mov     bl,al
                shl     bx,1
                mov     bx,ST_Specials[bx]
                ScreenIOservice _STRINGPRINT
                jmp     ST_SpecRet

ST_Specials     dw      STS_Esc,STS_BS,STS_Tab,STS_Enter,STS_Space,STS_Num
                dw      STS_Home,STS_Up,STS_PgUp,STS_Left,STS_Cntr,STS_Right
                dw      STS_End,STS_Down,STS_PgDn,STS_Ins,STS_Del
STS_Esc         db      'Esc',0
STS_BS          db      'BackSpace',0
STS_Tab         db      'Tab',0
STS_Enter       db      'Enter',0
STS_Space       db      'Space',0
STS_Num         db      'Num',0
STS_Home        db      'Home',0
STS_Up          db      'Up',0
STS_PgUp        db      'PgUp',0
STS_Left        db      'Left',0
STS_Cntr        db      'Center',0
STS_Right       db      'Right',0
STS_End         db      'End',0
STS_Down        db      'Down',0
STS_PgDn        db      'PgDn',0
STS_Ins         db      'Ins',0
STS_Del         db      'Del',0

ST_Table        db      0,0,'1234567890-=',1
                db      2,'QWERTYUIOP[]',3
                db      0,'ASDFGHJKL;''`'
                db      0,'\ZXCVBNM,./',0,'*'
                db      0,4,0,0,0,0,0,0,0,0,0,0,0
                db      5,0,6,7,8,'-',9,10,11,'+',12,13,14,15,16



SFK_Str         db      '1       2       3       4       5       '
                db      '6       7       8       9      10       ',0
FkeysFlags      dw      0000111111b
SFK_FkeysMain   dw      SFK_Buffer, SFK_Save,   SFK_Load,     SFK_Cont,    SFK_Repeat
                dw      SFK_Name  , SFK_None  , SFK_None  ,   SFK_None,    SFK_None
SFK_None        db      '      ',0
SFK_Cont        db      'Apple ',0
SFK_Load        db      'Load  ',0
SFK_Save        db      'Save  ',0
SFK_Repeat      db      'Repeat',0
SFK_Buffer      db      'Buffer',0
SFK_Assign      db      'Assign',0
SFK_Name        db      'Name  ',0

ShowFuncKeys:   push    ax bx cx dx si
                gotoxy  19h,0
                mov     bx,offset SFK_Str
                mov     ah,7
                ScreenIOservice _STRINGPRINT
                gotoxy  19h,1
                xor     si,si
                mov     dx,cs:FkeysFlags
SFK_Loop0:      shr     dx,1
                mov     ah,58h
                jnc     SFK_Next0
                mov     ah,5Fh
SFK_Next0:      mov     bx,cs:SFK_FkeysMain[si]
                ScreenIOservice _STRINGPRINT
                add     cx,4
                add     si,2
                cmp     si,20
                jb      SFK_Loop0
                pop     si dx cx bx ax
                ret



SMS_Restored    db      ' Keyboard setup successfully restored',0
SMS_Saved       db      '    Keyboard setup successfully saved',0
SMS_ErrorLoad   db      1,0Ch,'       Error restoring keyboard setup',0
SMS_ErrorSave   db      1,0Ch,'          Error saving keyboard setup',0
SMS_Type        db      1,0Ch,'This file isn''t a keyboard setup file',0
ShowMessage:    cmp     GetKeyParams.RK_ErrPtr,0
                jz      SMS_Ret
                push    ax bx cx dx
                mov     bx,GetKeyParams.RK_ErrPtr
                mov     ah,0Ah
                gotoxy  8,41
                ScreenIOservice _STRINGPRINT
                pop     dx cx bx ax
SMS_Ret:        ret




                assume  es:Emulate

Upcase:         cmp     al,'A'
                jb      UPCSret
                cmp     al,'Z'
                ja      UPCSret
                or      al,20h
UPCSret:        ret

CalcCommand:    push    ax bx cx es             ; Returns number of a command
                push    cs                      ; Input:
                pop     es                      ;   di -> offset Commands
                call    Upcase                  ;   al -> search command
                cld                             ;   cx -> commands count
                mov     bx,di
                repne   scasb                   ; Output:
                stc                             ;   di <- Number of the command
                jne     CC_end                  ;   cf <- 1 if not found
                sub     di,bx
                dec     di
                clc
CC_end:         pop     es cx bx ax
                ret



; -- Hook INT 24h ----------------------

OldFlags        dw      ?
OldFkeys        dw      ?
Prepare4DOS:    saveall
                xor     ax,ax
                xchg    ax,cs:ActiveFlags
                mov     cs:OldFlags,ax
                xor     ax,ax
                xchg    ax,cs:FkeysFlags
                mov     cs:OldFkeys,ax
                call    ShowAll
                ScreenIOservice _SHOWSCREEN
                call    far ptr SystemTINI
                restoreall
                ret



; -- Unhook INT 24h --------------------

SOD4eraperP:    saveall
                mov     ax,cs:OldFlags
                mov     cs:ActiveFlags,ax
                mov     ax,cs:OldFkeys
                mov     cs:FkeysFlags,ax
                mov     ax,Emulate
                mov     es,ax
                mov     byte ptr [C000],0
                call    far ptr SystemINIT
                restoreall
                ret


GetLineUser     proc    far
                ret
GetLineUser     endp


GoAppleII:      push    ax bx es
                call    ShowAll
                ScreenIOservice _SHOWSCREEN
		mov     ax,Emulate
                mov     es,ax
                mov     al,C050
                ScreenIOservice _SetScreen
                xor     bx,bx
                xchg    bx,ActiveFlags
                SwitchToProcess PID_EMULATOR
                mov     ActiveFlags,bx
                pop     es bx ax
                ret


KBDsetup        ends

		END

Generated by GNU Enscript 1.6.6, and GophHub 1.3.