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
|