summaryrefslogtreecommitdiff
path: root/v4.0/src/MAPPER/KBDSSTAT.ASM
blob: 1e76ffca1f81ca7016dd1b867d8c7960a443056e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
;
page 80,132
;
title CP/DOS KbdSetStatus

        .sall
        .xlist
        include kbd.inc       ; kbd set status data structure
        .list

kbddata segment word public 'kbddata'

        extrn   KbdBitMask:word
        extrn   KbdTurnAroundCharacter:word
        extrn   KbdInterimCharFlags:word

kbddata ends



kbdxxx  segment byte public 'kbd'
        assume  cs:kbdxxx,ds:nothing,es:nothing,ss:nothing
;
; ************************************************************************* *
; *
; *      MODULE:  kbdsetStatus
; *
; *
; *      CALLING SEQUENCE:
; *
; *                PUSH@ DWORD   data              ;  kbd data structure
; *                PUSH  WORD    handle            ;  kbd handle
; *
; *                CALL  kbdsetstatus
; *
; *      RETURN SEQUENCE:
; *
; *
; *
; *************************************************************************
;
        public kbdsetstatus

str     struc
old_bp  dw      ?
return  dd      ?
handle  dw      ?       ; kbd handle
data    dd      ?       ; kbd data strructure pointer
str     ends

kbdsetstatus    proc    far

        Enter   KbdSetStatus            ; save registers

        les     di,[bp].data            ; set up kbd data structure
        mov     ax,seg kbddata
        mov     ds,ax
        assume  ds:kbddata

        mov     ax,es:[di].Bit_Mask     ; get bit mask

CheckTurnAround:
        test    ax,040h                 ; define turnaround character ??
        jz      CheckInterimFlags       ; jump if not

        mov     bx,es:[di].Turn_Around_Char  ; else, save turnaround character
        mov     KbdTurnAroundCharacter,bx

CheckInterimFlags:
        test    ax,020h                 ; check for interim character flag ??
        jz      CheckShiftState         ; if not jump

        mov     bx,es:[di].Interim_Char_Flags   ; save interim character flag
        mov     KbdInterimCharFlags,bx

CheckShiftState:
        test    ax,010h                 ; check for shift state ??
        jz      CheckCookedOn           ; jump if not

        push    ds                      ; setup for shift state
        mov     bx,040h
        mov     ds,bx
        assume  ds:nothing

        mov     bx,es:[di].Status_Shift_State   ; save shift state data
        mov     ds:018h,bl

        pop     ds
        assume  ds:kbddata

CheckCookedOn:                              ; check for cooked mode ??
        test    ax,008h
        jz      CheckRawOn

        and     KbdBitMask,not RawModeOn    ; setup cooked mode status
        or      KbdBitMask,CookedModeOn

CheckRawOn:
        test    ax,004h                     ; check for raw mdoe ??
        jz      CheckEchoOff

        and     KbdBitMask,not CookedModeOn ; setup for raw mode
        or      KbdBitMask,RawModeOn

CheckEchoOff:
        test    ax,002h                     ; check for echo on
        jz      CheckEchoOn                 ; branch if so

        and     KbdBitMask,not EchoOn       ; else setup echo off
        or      KbdBitMask,EchoOff

CheckEchoOn:
        test    ax,001h
        jz      EverythingSet

        and     KbdBitMask,not EchoOff      ; setup echo on
        or      KbdBitMask,EchoOn

EverythingSet:
        Mexit                               ; pop registers

        ret     size str - 6                ; return

KbdSetStatus    endp

kbdxxx  ends

        end