summaryrefslogtreecommitdiff
path: root/v4.0/src/BIOS/MSCON.ASM
blob: 68fcfff94661c574930470a20c675fecf7900b69 (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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
	PAGE ,132 ;
	TITLE MSCON - BIOS
	%OUT	...MSCON.ASM
;==============================================================================
;REVISION HISTORY:
;AN000 - New for DOS Version 4.00 - J.K.
;AC000 - Changed for DOS Version 4.00 - J.K.
;AN00x - PTM number for DOS Version 4.00 - J.K.
;==============================================================================

	itest=0
	INCLUDE MSGROUP.INC	;DEFINE CODE SEGMENT
	INCLUDE JUMPMAC.INC
	INCLUDE MSEQU.INC
	INCLUDE MSMACRO.INC

;*** DOS 3.3 will not support more than 25 rows
;	INCLUDE DEVSYM.INC	;J.K. 4/29/86 for CON$GENIOCTL support
;	INCLUDE IOCTL.INC	;J.K. 4/29/86 for CON$GENIOCTL support

	EXTRN EXIT:NEAR 	;MSBIO1
	EXTRN BUS$EXIT:NEAR	;MSBIO1

;	EXTRN CMDERR:NEAR	;MSBIO1	J.K. 4/29/86

;DATA
	EXTRN PTRSAV:DWORD	;MSBIO1
	EXTRN FHAVEK09:BYTE	;MSDISK
	EXTRN ALTAH:BYTE	;MSBDATA
	EXTRN KEYRD_Func:Byte	;MSBDATA
	EXTRN KEYSTS_Func:Byte	;MSBDATA

;	EXTRN SAV_SC_INFO:BYTE	;MSBDATA J.K. 4/29/86
;	EXTRN SAV_SC_MODE:BYTE	;MSBDATA J.K. 4/29/86
;------------------------------------------------------
;
;	CONSOLE READ ROUTINE
;
	ASSUME DS:CODE		     ; THIS WAS SET BY THE CON DD ENTRY POINT
	PUBLIC	CON$READ
CON$READ PROC	NEAR
	JCXZ	CON$EXIT
CON$LOOP:
	CALL	CHRIN			;GET CHAR IN AL
	STOSB				;STORE CHAR AT ES:DI
	LOOP	CON$LOOP
CON$EXIT:
	JUMP	EXIT
CON$READ ENDP
;---------------------------------------------------------
;
;	INPUT SINGLE CHAR INTO AL
;
;J.K.5/12/87 We are going to issue extended keyboard function, if supported.
;The returning value of the extended key stroke of the extended key board
;function uses 0E0h in AL instead of 00 as in the conventional key board
;function.  This creates a conflict when the user entered real Greek Alpha
;charater (= 0E0h) to  distinguish the extended key stroke and the Greek Alpha.
;This case will be handled in the following manner;
;	AH = 16h
;	INT 16h
;	If AL == 0, then extended code (in AH)
;  else If AL == 0E0h, then
;	     IF AH <> 0, then extended code (in AH)
;	else Greek_Alpha character.
;Also, for compatibility reason, if an extended code is detected, then we
;are going to change the value in AL from 0E0h to 00h.


CHRIN	PROC	NEAR
;AN000;
;	 XOR	 AX,AX
	mov	ah,KEYRD_Func		;AN000; Set by MSINIT. 0 or 10h
	xor	al,al			;AN000;
	XCHG	AL,ALTAH		;GET CHARACTER & ZERO ALTAH

	OR	AL,AL
	JNZ	KEYRET
;SB34CON000**************************************************************
;SB  Keyboard I/O interrupt
;SB	AH already contains the keyboard read function number
;SB		1 LOC

	int	16h
;SB34CON000**************************************************************
ALT10:
	OR	AX,AX			;CHECK FOR NON-KEY AFTER BREAK
	JZ	CHRIN
	CMP	AX,7200H		;CHECK FOR CTRL-PRTSC
	JNZ	ALT_Ext_Chk		;AN000;
	MOV	AL,16
	jmp	KeyRet			;AN000;
ALT_Ext_Chk:
;SB34CON001**************************************************************
;SB  IF operation was extended function (i.e. KEYRD_Func != 0) THEN
;SB    IF character read was 0E0h THEN
;SB      IF extended byte was zero (i.e. AH == 0) THEN
;SB        goto keyret
;SB      ELSE
;SB        set AL to zero
;SB        goto ALT_SAVE
;SB      ENDIF
;SB    ENDIF
;SB  ENDIF
;SB		9 LOCS

	cmp	BYTE PTR KEYRD_Func,0
	jz	NOT_EXT
	cmp	al,0E0h
	jnz	NOT_EXT
	or	ah,ah
	jz	KEYRET
	xor	al,al
	jmp	short ALT_SAVE
NOT_EXT:

;SB34CON001**************************************************************
	OR	AL,AL			;SPECIAL CASE?
	JNZ	KEYRET
ALT_SAVE:
	MOV	ALTAH,AH		;STORE SPECIAL KEY
KEYRET:
	RET
CHRIN	ENDP

;--------------------------------------------------------------
;
;	KEYBOARD NON DESTRUCTIVE READ, NO WAIT
;
; PC-CONVERTIBLE-TYPE MACHINE: IF BIT 10 IS SET BY THE DOS IN THE STATUS WORD 
; OF THE REQUEST PACKET, AND THERE IS NO CHARACTER IN THE INPUT BUFFER, THE 
; DRIVER ISSUES A SYSTEM WAIT REQUEST TO THE ROM. ON RETURN FROM THE ROM, IT
; RETURNS A 'CHAR-NOT-FOUND' TO THE DOS.
;
CONBUSJ:
	ASSUME	DS:NOTHING
	JMP	CONBUS

	ASSUME DS:CODE		     ; THIS WAS SET BY THE CON DD ENTRY POINT
	PUBLIC	CON$RDND
CON$RDND:
	MOV	AL,[ALTAH]
	OR	AL,AL
	JZ	RD1
	JMP	RDEXIT

RD1:
;SB34CON002**************************************************************
;SB  Keyboard I/O interrupt
;SB	Get keystroke status (KEYSTS_Func)
;SB	 2 LOCS

	mov	ah,KEYSTS_Func
	int	16h
;SB34CON002**************************************************************
	JZ	NOCHR
	JMP	GOTCHR
NOCHR:
	CMP	FHAVEK09,0
	JZ	CONBUSJ
	LDS	BX,[PTRSAV]
	ASSUME	DS:NOTHING
	TEST	[BX].STATUS,0400H	; SYSTEM WAIT ENABLED?
	JZ	CONBUSJ

;********************************
; NEED TO WAIT FOR IBM RESPONSE TO REQUEST FOR CODE ON HOW TO USE THE SYSTEM
; WAIT CALL.
;********************************
	MESSAGE FTESTCON,<"SYSTEM WAIT STAGE",CR,LF>
	MOV	AX,4100H		; WAIT ON AN EXTERNAL EVENT
;	MOV	BX,0300H		; NO TIMEOUT
;	MOV	DX,60H			; LOOK AT I/O PORT 60H
	INT	15H			; CALL ROM FOR SYSTEM WAIT
	MESSAGE FTESTCON,<"OUT OF WAIT. AX IS ">
	MNUM	FTESTCON,AX
	MESSAGE FTESTCON,<CR,LF>
	JMP	CONBUS

	ASSUME	DS:CODE
GOTCHR:
	OR	AX,AX
	JNZ	NOTBRK			;CHECK FOR NULL AFTER BREAK
;SB34CON004**************************************************************
;SB  Keyboard I/O interrupt
;SB	Keyboard read function (KEYRD_Func)
;SB		2 LOCS

	mov	ah,KEYRD_Func
	int	16h
;SB34CON004**************************************************************
	JUMP	CON$RDND		;AND GET A REAL STATUS
NOTBRK:
	CMP	AX,7200H		;CHECK FOR CTRL-PRTSC
	JNZ	RD_Ext_Chk		;AN000;
	MOV	AL,16
	jmp	RDEXIT			;AN000;
RD_Ext_Chk:				;AN000;
	cmp	KEYRD_Func, 0		;AN000; Extended Keyboard function?
	jz	RDEXIT			;AN000; No. Normal exit.
	cmp	al,0E0h 		;AN000; Extended key value or Greek Alpha?
	jne	RDEXIT			;AN000;
	cmp	ah, 0			;AN000; Scan code exist?
	jz	RDEXIT			;AN000; Yes. Greek Alpha char.
	mov	al, 0			;AN000; No. Extended key stroke. Change it for compatibility
	PUBLIC	RDEXIT
RDEXIT:
	LDS	BX,[PTRSAV]
	ASSUME	DS:NOTHING
	MOV	[BX].MEDIA,AL
EXVEC:
	JUMP	EXIT

CONBUS:
	ASSUME	DS:NOTHING
	JUMP	BUS$EXIT
;--------------------------------------------------------------
;
;	KEYBOARD FLUSH ROUTINE
;
	ASSUME DS:CODE		     ; THIS WAS SET BY THE CON DD ENTRY POINT
	PUBLIC	CON$FLSH
CON$FLSH:
	CALL	FLUSH
	JUMP	EXIT

	PUBLIC	FLUSH
FLUSH:
	MOV	[ALTAH],0		;CLEAR OUT HOLDING BUFFER

FLLOOP:
;SB33012****************************************************************
			 ;SB	; Is there a char there?
	mov	AH, 1	 ;SB	; command code for check status
	int	16h	 ;SB	; call rom-bios keyboard routine
;SB33012****************************************************************
	JZ	FLDONE
;SB33013****************************************************************
	xor	AH, AH	 ;SB	; if zf is nof set, get character
	int	16h	 ;SB	; call rom-bios to get character
;SB33013****************************************************************
	JMP	FLLOOP
FLDONE:

	RET
;----------------------------------------------------------
;
;	CONSOLE WRITE ROUTINE
;
	ASSUME DS:CODE		     ; THIS WAS SET BY THE CON DD ENTRY POINT
	PUBLIC	CON$WRIT
CON$WRIT:
	JCXZ	EXVEC
CON$LP:
	MOV	AL,ES:[DI]		;GET CHAR
	INC	DI
	INT	CHROUT			;OUTPUT CHAR
	LOOP	CON$LP			;REPEAT UNTIL ALL THROUGH
	JUMP	EXIT
;-----------------------------------------------
;
;	BREAK KEY HANDLING
;
	PUBLIC CBREAK
CBREAK:
	MOV	CS:ALTAH,3		;INDICATE BREAK KEY SET

	PUBLIC INTRET
INTRET:
	IRET

;------------------------------------------------------------------------------
;J.K. 4/29/86 - CONSOLE GENERIC IOCTL SUPPORT FOR DOS 3.3.
;CON$GENIOCTL supports Get mode information, Set mode information functions.
;It will only save the value from "Set mode information" and will return
;the value through "Get mode information".  It is supposed to be set by
;the MODE.COM and other application program can retrieve information
;through "Get mode information" call.
;Initially, there is no valuable informaton until set by MODE command, so
;any attemp to "Get mode information" at that points will fail. (unknown
;command with carry set.)
;At entry:  CS = DS = code
;	    CS:[PTRSAV] has seg, address of the Request Header saved in
;	    in Strategy routine.
;
;	PUBLIC	CON$GENIOCTL
;	ASSUME	DS:CODE
;CON$GENIOCTL:
;	 les	 di, CS:[PTRSAV]		 ;get the request header
;	 cmp	 es:[di].MajorFunction, IOC_SC
;	 je	 Major_SC_OK
;SC_CMDERR:
;	 stc
;	 jmp	 cmderr 			 ;carry is set, exit to cmderr
;Major_SC_OK:
;	 mov	 al, es:[di].MinorFunction	 ;save minor function
;	 les	 di, es:[di].GenericIOCTL_Packet ;pointer of SC_MODE_INFO structure
;	 mov	 cx, es:[di].SC_INFO_LENGTH	 ;save length
;	 inc	 di
;	 inc	 di				 ;ES:DI -> SC_MODE in Info. Packet
;	 cmp	 cx, SC_INFO_PACKET_LENGTH	 ;currently 9.
;	 jne	 SC_CMDERR			 ;cannot accept the different packet
;	 cmp	 al, GET_SC_MODE		 ;minor function = 60h ?
;	 jne	 SC_SET_MODE_FUNC		 ;no, check if it is "Set mode function"
;	 cmp	 SAV_SC_MODE, 0 		 ;information set before?
;	 je	 SC_CMDERR			 ;no, cannot get the info.
;;SC_GET_MODE_FUNC:				 ;es:di -> SC_MODE in info. packet
;						 ;cx - length
;	 mov	 si, offset SAV_SC_INFO
;	 rep	 movsb		 ;ds:si -> sav_sc_info, es:di -> sc_mode
;	 jmp	 exit
;
;SC_SET_MODE_FUNC:				 ;es:di -> SC_MODE
;	 cmp	 al, SET_SC_MODE		 ;minor function = 40h ?
;	 jne	 SC_CMDERR
;	 mov	 si, offset SAV_SC_INFO
;	 xchg	 di, si
;	 push	 es
;	 push	 ds
;	 pop	 es
;	 pop	 ds
;	 rep	 movsb		 ;ds:si -> sc_mode, es:di -> sav_sc_info
;	 jmp	 exit
;
;J.K. 4/29/86 - End of CONSOLE GENERIC IOCTL SUPPORT FOR DOS 3.3.

CODE	ENDS
	END