summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/DISPLAY/DISPLAY.ASM
blob: 16738b7acf1fd89f4d0a3c590be758d063c31821 (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
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
PAGE	,132
TITLE	DOS - CONSOLE Code Page Switching Device Driver
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  FILENAME:	 DISPLAY.ASM
;  PROGRAM:	 DISPLAY.SYS (Main module)
;  LINK PROCEDURE:  Linkk
;  INSTALLATION:
;
;  This routine is structured as a DOS Device Driver.
;  IE it is installed via the CONFIG.SYS command:
;	 DEVICE=DISPLAY.SYS
;
;  The following device commands are supported:
;
;  00 hex - INIT
;  -------------
;  Install the CON device driver.  This is used for downloading of
;  the character sets (various Code Pages) according to the respective
;  display adapter.  The interface provided by the video BIOS is used
;  to download a block of 256 characters (in various resolutions - ie.
;  8x8, 8x14, and 8x16).  Also, the interrupt 2F hex is chained for
;  communication between the CON device driver and the keyboard routine.
;
;  Refer to INIT.ASM for code
;
;  13 hex - GENERIC IOCTL
;  ----------------------
;  INVOKE
;  ------
;  Invoke is use to activate the appropriate CP font.  The mechanism
;  is based soley on the code page value passed from the MODE & CHCP
;  commands.  Once a CP ahs benn INVOKED, it is loaded for ALL display
;  modes on the respective display adapter - ONLY IF the proper font
;  resolution can be accessed.
;
;  Refer to CPS-FUNC.INC for code
;
;  DESIGNATE START
;  ---------------
;  Designate start passes the list of designated code pages to load.
;  It is sent just prior to the IOCTL WRITE calls containing the 'CPI'
;  files.  The list of designated code pages is check for duplicates
;  and for invalids (-1).
;
;  Refer to CPS-FUNC.INC for code
;
;  DESIGNATE STOP
;  --------------
;  Once the data (for a DESIGNATION) has been routed to the CPS driver,
;  it is followed by a DESIGNATE STOP command.	This confirms the completion
;  of the DESIGNATE procedure.	If there was an error detected during the
;  DESIGNATE procedure, it must be followed by a DESIGNATE STOP.
;
;  Refer to CPS-FUNC.INC for code
;
;
;  0C hex - IOCTL OUTPUT
;  ---------------------
;  Following a DESIGNATE START, the contents of the specified data file
;  (expected .CPI format) is copied by DOS to the CPS driver.  This is
;  via the GENERIC IOCTL WRITE calls.  During these calls, the data is
;  parsed by the FONT-PARSER (F-PARSER.SRC) to select the CP and fonts
;  required.
;
;  Refer to CPS-FUNC.INC for code
;
;
;		 (C)Copyright 1988 Microsoft
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
					;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;      Request Header (Common portion)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IF1					;
	%OUT .Compiling:     DISPLAY.ASM
	%OUT .		     � CPS-CON driver
	%OUT .		     � Version 3.30
	%OUT .Include Files:
ENDIF					;
	INCLUDE MACROS.INC		;
	INCLUDE DEF-EQU.INC		;
					;
	PUBLIC	EOF_MARKER		;
	PUBLIC	CPD_ACTIVE		;
	PUBLIC	CPD_CLASS		;
	PUBLIC	CPD_HDWR_N_MAX		;
	PUBLIC	CPD_DESG_N_MAX		;
	PUBLIC	CPD_HDWR_N		;
	PUBLIC	CPD_DESG_N		;
	PUBLIC	CPD_FONTS_N		;
	PUBLIC	CPD_FONT_PNTER		;
	PUBLIC	IRPT_2			;
	PUBLIC	IRPT_CMD_EXIT		;
	PUBLIC	DEV_HDR 		;
	EXTRN	INIT:NEAR		;
					;
CODE	SEGMENT BYTE PUBLIC 'CODE'      ;
	ASSUME	CS:CODE,DS:CODE 	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;****************************************
;**	    Resident Code	       **
;****************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START	EQU	$			; begin resident data & code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; DEVICE HEADER - must be at offset zero within device driver
;		  (DHS is defined according to this structure)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	ORG	0000H			    ;
					    ;
DEV_HDR:DD    -1			    ; Pointer to next device header
	DW	0C053H			    ; Attribute (Char device)
	DW	OFFSET STRATEGY 	    ; Pnter to device "strategy"
	DW	OFFSET INTERRUPT	    ; Pnter to device "interrupt"
	DB	'CON     '                  ; Device name
					    ; and of course a descriptive name
					    ; which can be viewed by a TYPE!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	Console Description Table
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.XLIST					;
STACK_END	DW  1FFH+60H DUP(0)	; 200H + 'my' needs (re/ DOS 3.30 ref)
STACK_START	DW  0			;
OLD_STACK_S	DW  ?			;
OLD_STACK_O	DW  ?			;
.LIST					;
					;
BUF1:	   BUF_DATA <>			; exclude PAR_EXTRACTO
					;
CP_PNTER_TABLE	DW OFFSET CPD_HDWR_N	; TABLE OF POINTERS TO CP INFO
		DW OFFSET CPD_DESG_N	;
		DW OFFSET CPD_FONT_PNTER;
		DW OFFSET CPD_FONT_WRITE;
		DW OFFSET CPD_FONT_DATA ;
					;
CPD_TABLE	LABEL WORD		; TABLE DATA INFO FOR CP's
CPD_ACTIVE	DW     -1		; TEMPORARY
CPD_CLASS	DB	'........'      ; THIS IS SET TO (EGA, LCD)
CPD_FONTS_N	DW     -1		;
CPD_HDWR_N	DW	0		;
		DW  12	DUP(-1) 	; (HDWR_CP's)    (MAX=12)
CPD_HDWR_N_MAX	EQU ($-CPD_HDWR_N)/2-1	;
CPD_DESG_N	DW     -1		; # OF DESIG CP's
		DW  12	DUP(-1) 	; (DESG CP's)    (MAX=12)
CPD_DESG_N_MAX	EQU ($-CPD_DESG_N)/2-1	;
CPD_FONT_PNTER	DW  12	DUP(0,0)	; SEG_OFFSET POINTER TO DATA BUFFERS
CPD_FONT_WRITE	DW  12	DUP(0,0)	; SEG_OFFSET OF FONTS BEING WRITTEN
CPD_FONT_DATA	DW  12	DUP(0)		; COUNT OF FONT DATA TO SKIP/COPY!
FONT_PRIORITY	DB  8	DUP(-1) 	; USED TO CLASSIFY FONT PRIORITY
NUM_FONT_PRIORITY EQU ($-FONT_PRIORITY) ; DURING A DESIGNATION
CPD_TEMP_DESG	DW	0		; # OF DESIG CP's TEMP BUFFER
		DW  12	DUP(-1) 	; (DESG CP's)    (MAX=12)
CPD_REQ_DESG	DW	0		; # OF DESIG CP's REQUESTED
		DW  12	DUP(-1) 	; (DESG CP's)    (MAX=12)
;;;;;;;

ANSI_DA_INFO	DA_INFO_PACKET	<>	;J.K. Information packet to ANSI used for MODE SET INT10 call.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;      CON Device "strategy" entry point
;      Retain the Request Header address for use by Interrupt routine
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	ASSUME	DS:NOTHING		;
STRATEGY  PROC	FAR			;
	PUSH	BX			;
	PUSH	BX			;
	LEA	BX, BUF1		; BUF = BUF1  CS:[BX]
	POP	BUF.RH_PTRO		; OFFSET OF REQUEST HEADER
	MOV	BUF.RH_PTRS,ES		; SEGMENT
	POP	BX			;
	RET				;
STRATEGY  ENDP				;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;      Table of command processing routine entry points
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CMD_TABLE LABEL WORD			;
	DW	OFFSET INIT		;  0 - Initialization
	DW	OFFSET NO_OPERATION	;  1 - Media check
	DW	OFFSET NO_OPERATION	;  2 - Build BPB
	DW	OFFSET NO_OPERATION	;  3 - IOCTL input
	DW	OFFSET NO_OPERATION	;  4 - Input
	DW	OFFSET NO_OPERATION	;  5 - Non destructive input no wait
	DW	OFFSET NO_OPERATION	;  6 - Input status
	DW	OFFSET NO_OPERATION	;  7 - Input flush
	DW	OFFSET NO_OPERATION	;  8 - Write
	DW	OFFSET NO_OPERATION	;  9 - Output with verify
	DW	OFFSET NO_OPERATION	;  A - Output status
	DW	OFFSET NO_OPERATION	;  B - Output flush
	DW	OFFSET DESG_WRITE	;  C - IOCTL output
	DW	OFFSET NO_OPERATION	;  D - Device OPEN
	DW	OFFSET NO_OPERATION	;  E - Device CLOSE
	DW	OFFSET NO_OPERATION	;  F - Removable media
	DW	OFFSET NO_OPERATION	; 10 - Removable media
	DW	OFFSET NO_OPERATION	; 11 - Removable media
	DW	OFFSET NO_OPERATION	; 12 - Removable media
	DW	OFFSET GENERIC_IOCTL	; 13 - Removable media
MAX_CMD EQU	($-CMD_TABLE)/2 	; highest valid command follows
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; CON Device "interrupt" entry point
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTERRUPT  PROC FAR			; device interrupt entry point
	PUSH	AX			;
	PUSH	BX			;
	PUSH	CX			;
	PUSH	DI			;
	PUSH	SI			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Common interrupt entry :
; at entry, BUFn (CS:BX) of CON is defined
;
; Check if header link has to be set
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	LEA	BX, BUF1		;
	MOV	DI,OFFSET DEV_HDR	; CON Device header
					;
	MOV	BUF.DEV_HDRO,DI 	;
	MOV	BUF.DEV_HDRS,CS 	;
	CLD				; all moves forward
					;
	CMP	BUF.CON_STRAO, -1	;
	JNE	L4			; has been linked to DOS CON
	CMP	BUF.CON_STRAS, -1	;
	JNE	L4			; has been linked to DOS CON
					;  next device header :  ES:[DI]
	LDS	SI,DWORD PTR BUF.DEV_HDRO;
	LES	DI,DWORD PTR HP.DH_NEXTO;
					;
;$SEARCH WHILE				;  pointer to next device header is NOT
L1:					;
	PUSH	ES			;  -1
	POP	AX			;
	CMP	AX,-1			;
;$LEAVE  E,	 AND			; leave if both offset and segment are
	JNE	NOT0FFFF		;
					;
	CMP	DI,-1			;  0FFFFH
;$LEAVE  E				;
	JE	L4			;
NOT0FFFF:				;
	PUSH	DI			;
	PUSH	SI			;
	MOV	CX,NAME_LEN		;
	LEA	DI,NHD.DH_NAME		;
	LEA	SI,HP.DH_NAME		;
	REPE	CMPSB			;
	POP	SI			;
	POP	DI			;
	AND	CX,CX			;
;$EXITIF Z				; Exit if name is found in linked hd.
	JNZ	L3			; Name is not found
					; Name is found in the linked header
	MOV	AX,NHD.DH_STRAO 	; Get the STRATEGY address
	MOV	BUF.CON_STRAO,AX	;
	MOV	AX,ES			;
X1:	MOV	BUF.CON_STRAS,AX	;
					;
	MOV	AX,NHD.DH_INTRO 	; Get the INTERRUPT address
	MOV	BUF.CON_INTRO,AX	;
	MOV	AX,ES			;
X2:	MOV	BUF.CON_INTRS,AX	;
					;
;$ORELSE				; FInd next header to have the same
	JMP	L4			; Device Name
L3:					;
	LES	DI,DWORD PTR NHD.DH_NEXTO;
;$ENDLOOP				;
	JMP	L1			;
L4:					;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; COMMAND REQUEST
;      ES:DI  REQUEST HEADER
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	LES	DI,DWORD PTR BUF.RH_PTRO; GET RH ADDRESS PASSED TO
					; "STRATEGY"  INTO ES:DI
	MOV	AL,RH.RHC_CMD		; COMMAND CODE FROM REQUEST HEADER
	CBW				; ZERO AH (IF AL > 7FH, NEXT COMPARE
					; WILL CATCH THAT ERROR)
	CMP	AL,MAX_CMD		; IF COMMAND CODE IS TOO HIGH
	JAE	L6			; JUMP TO ERROR ROUTINE
					;
	ADD	AX,AX			; DOUBLE COMMAND CODE FOR TABLE OFFSET
	MOV	SI,AX			; PUT INTO INDEX REGISTER FOR JMP
					;
	CALL	CS:CMD_TABLE[SI]	; CALL ROUTINE TO HANDLE THE COMMAND
	JC	IRPT_CMD_EXIT		; CY=1 IF NO PASS_CONTROL REQ'D
	CALL	PASS_CONTROL		;
	JUMP	IRPT_2			;
					;
L6:	CALL	PASS_CONTROL		; CALL ROUTINE TO HANDLE THE COMMAND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  At entry to command processing routine
;
;      ES:DI   = Request Header address
;      CS:BX   = Buffer for CON
;      CS      = code segment address
;      AX      = 0
;
;      top of stack is return address, IRPT_CMD_EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IRPT_CMD_EXIT:				; RETURN FROM COMMAND ROUTINE
	LES	DI,DWORD PTR BUF.RH_PTRO; RESTORE ES:DI AS REQUEST HEADER PTR
	XOR	AX,AX			;
	OR	AX,BUF.STATUS		;
	JE	IRPT_0			;
	XOR	BUF.STATUS,AX		; SET STATUS BACK TO OK!
	OR	AX,STAT_CMDERR		;
	JUMP	IRPT_1			;
IRPT_0: OR	AH,STAT_DONE		; ADD "DONE" BIT TO STATUS WORD
IRPT_1: MOV	RH.RHC_STA,AX		; STORE STATUS INTO REQUEST HEADER
IRPT_2: POP	SI			; RESTORE REGISTERS
	POP	DI			;
	POP	CX			;
	POP	BX			;
	POP	AX			;
	RET				;
INTERRUPT  ENDP 			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	PASS CONTROL
;
;	This calls the attached device to perform any further
;	action on the call!
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PASS_CONTROL	PROC			;
	PUSH	BX			;
	PUSH	BX			;
	POP	SI			;
	LES	BX,DWORD PTR BUF.RH_PTRO; pass the request header to the
	CALL	DWORD PTR CS:[SI].CON_STRAO ; CON strategy routine.
	POP	BX			;
	CALL	DWORD PTR BUF.CON_INTRO ; interrupt the CON
	RET				;
PASS_CONTROL	ENDP			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_OPERATION	PROC			;
	CLC				;
	RET				;
NO_OPERATION	ENDP			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	PULL IN THE CODE PAGE FUNCTION CODE
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	INCLUDE INT2FCOM.INC		;
	INCLUDE INT10COM.INC		;
	INCLUDE CPS-FUNC.INC		;
	INCLUDE WRITE.INC		; SPECIAL MARKER IN WRITE.INC
	INCLUDE F-PARSER.INC		;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;      Adjust the assembly-time instruction counter to a paragraph
;      boundary
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	IF	($-START) MOD 16	;
	  ORG ($-START)+16-(($-START) MOD 16);
	ENDIF				;
EOF_MARKER   EQU $			; end of resident code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	END-OF-CODE
;
;;;;;;;;;;;;;;;;;
CODE	ENDS	;
	END	;
;;;;;;;;;;;;;;;;;