; ---------------------------------------------------------------------------
; Handle the (Pc) keyboard. Supports three modes: Keyboard, Joy 1 & Joy 2
; ---------------------------------------------------------------------------
Key_Install:Cli
            Mov   Ax,0
            Mov   Es,Ax
            Mov   Eax,[Es:09h*4]
            Mov   [Save09],Eax
            Mov   [Word Es:09h*4],Offset Int09
            Mov   [Word Es:09h*4+2],Cs
            Mov   [Key_Mode],Key_Keyboard
            Call  Key_Reset
            Sti
            Ret
; ---------------------------------------------------------------------------
Key_Restore:Cli
            Mov   Ax,0
            Mov   Es,Ax
            Mov   Eax,[Save09]
            Mov   [Es:09h*4],Eax
            Sti
            Ret
; ---------------------------------------------------------------------------
Key_Reset:  Push  Eax
            Push  Di
            Push  Cx
            Xor   Eax,Eax
            Mov   [Dword Keymatrix],Eax
            Mov   [Dword Keymatrix+4],Eax
            Mov   Di,Offset Keyboard
            Mov   Cx,80h/4
@@1:        Mov   [Cs:Di],Eax
            Add   Di,4
            Dec   Cx
            Jnz   @@1
            Push  Ds
            Mov   Ds,[Iodirect]
            Mov   Al,[Shadowdc00+0]
            Mov   [0DC00h],Al
            Mov   Al,[Shadowdc00+1]
            Mov   [0DC01h],Al
            Pop   Ds
            Pop   Cx
            Pop   Di
            Pop   Eax
            Ret
; ---------------------------------------------------------------------------
Int09:      Push  Ax 
            push  Bx 
            push  Cx 
            push  Ds
            Push  Cs
            Pop   Ds
Assume Ds:Emulator
            In    Al,60h
            Mov   Bl,Al
            And   Bx,7Fh
            Mov   Ah,Al
            Shr   Ah,7
            Not   Ah
            And   Ah,1
            Mov   [Keyboard+Bx],Ah
            Mov   Bl,[Key_Mode]
            Call  [@@Modes+Bx]
            Mov   Al,[Keyboard+1Dh]    ; Crtl
            And   Al,[Keyboard+38h]    ; Alt
            Je    @@Done
            Cmp   [Keyboard+53h],Al    ; Del
            Je    @@Reset
            Cmp   [Keyboard+39h],Al    ; Space
            Je    @@Halt
            Cmp   [Keyboard+01h],Al    ; Esc
            Je    @@Refresh
            Cmp   [Keyboard+3Bh],Al    ; F1
            Je    @@Joy1
            Cmp   [Keyboard+3Ch],Al    ; F2
            Je    @@Joy2
            Cmp   [Keyboard+25h],Al    ; K
            Je    @@Key
            Cmp   [Keyboard+26h],Al    ; L
            Je    @@Lock
@@Done:     In    Al,61h
            Or    Al,80h
            Out   61h,Al
            And   Al,7Fh
            Out   61h,Al
            Mov   Al,20h
            Out   20h,Al
            Pop   Ds 
            pop   Cx 
            pop   Bx 
            pop   Ax
            Iret
@@Halt:     Mov   [Word Next],Haltpatch
            Or    [Flags],Flag_I
            Call  Key_Reset
            Jmp   @@Done
@@Refresh:  Call  Flagrefresh
            Call  Key_Reset
            Int   3
            Jmp   @@Done
@@Reset:    Mov   [Word Next],Resetpatch
            Or    [Flags],Flag_I
            Push  Ds
            Mov   Ds,[Ramseg]
            Mov   [Byte 8004h],0
            Pop   Ds
@@Lock:     Xor   [Video_Lock],1
            Call  Key_Reset
            Jmp   @@Done
@@Key:      Mov   [Key_Mode],Key_Keyboard
            Call  Key_Reset
            Jmp   @@Done
@@Joy1:     Mov   [Key_Mode],Key_Joy1
            Call  Key_Reset
            Jmp   @@Done
@@Joy2:     Mov   [Key_Mode],Key_Joy2
            Call  Key_Reset
            Jmp   @@Done
@@Modes     Dw    Int09_Key,Int09_Joy1,Int09_Joy2
; ---------------------------------------------------------------------------
Int09_Key:  Cmp   Al,0E0h              ; Extended key
            Je    @@E0
            Cmp   Al,044h
            Je    @@Restore
            Cmp   Al,058h
            Je    @@Restore
            Mov   Bl,Al
            And   Bl,7Fh
            Cmp   Bl,36h               ; Right shift
            Je    @@Shift
            Cmp   Bl,2Ah               ; Left shift
            Je    @@Shift
@@5:        Or    Al,Al
            Js    @@1
            Call  @@Remap
            Or    [Keymatrix+Bx],Al
            Or    [Keymatrix+1],Ah     ; Shift
            Jmp   @@2
@@1:        Call  @@Remap
            Not   Ax
            And   [Keymatrix+Bx],Al
            And   [Keymatrix+1],Ah     ; Shift
            Mov   [Key_E0flag],0
@@2:        Call  Setdc01
            Ret
@@E0:       Mov   [Key_E0flag],1
            Ret
@@Shift:    Cmp   [Key_E0flag],0
            Je    @@5
            Xor   [Key_E0flag],2
            Ret
@@Restore:  Mov   [Word Next],Nmipatch
            Ret
@@Remap:    Mov   Bl,[Keymap+Bx]
            Cmp   Bl,-1
            Je    @@Remap0
            Mov   Ah,Bl
            And   Ah,80h
            And   Bl,7Fh
            Mov   Cl,Bl
            Shr   Cl,4
            And   Bl,7
            Mov   Al,1
            Rol   Al,Cl
            Ret
@@Remap0:   Mov   Ax,0
            Mov   Bl,0
            Ret
; ---------------------------------------------------------------------------
Int09_Joy2: Mov   Bl,0
            Jmp   Int09_Joy12
Int09_Joy1: Mov   Bl,1
Int09_Joy12:Mov   Al,0
            Cmp   Bh,[Keyboard+39h]    ; Space (Fire!)
            Rcl   Al,1
            Cmp   Bh,[Keyboard+4Dh]    ; Right
            Rcl   Al,1
            Cmp   Bh,[Keyboard+4Bh]    ; Left
            Rcl   Al,1
            Cmp   Bh,[Keyboard+50h]    ; Down
            Rcl   Al,1
            Cmp   Bh,[Keyboard+48h]    ; Up
            Rcl   Al,1
            Not   Al
            Mov   [Key_Joystat+Bx],Al
            And   Al,[Shadowdc00+Bx]
            Push  Ds
            Mov   Ds,[Iodirect]
            Mov   [0DC00h+Bx],Al
            Pop   Ds
            Ret
Assume Ds:Nothing
; ---------------------------------------------------------------------------
