summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/DISPLAY/DISPLAY.ASM
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DEV/DISPLAY/DISPLAY.ASM
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/DEV/DISPLAY/DISPLAY.ASM')
-rw-r--r--v4.0/src/DEV/DISPLAY/DISPLAY.ASM388
1 files changed, 388 insertions, 0 deletions
diff --git a/v4.0/src/DEV/DISPLAY/DISPLAY.ASM b/v4.0/src/DEV/DISPLAY/DISPLAY.ASM
new file mode 100644
index 0000000..16738b7
--- /dev/null
+++ b/v4.0/src/DEV/DISPLAY/DISPLAY.ASM
@@ -0,0 +1,388 @@
1PAGE ,132
2TITLE DOS - CONSOLE Code Page Switching Device Driver
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;
5; FILENAME: DISPLAY.ASM
6; PROGRAM: DISPLAY.SYS (Main module)
7; LINK PROCEDURE: Linkk
8; INSTALLATION:
9;
10; This routine is structured as a DOS Device Driver.
11; IE it is installed via the CONFIG.SYS command:
12; DEVICE=DISPLAY.SYS
13;
14; The following device commands are supported:
15;
16; 00 hex - INIT
17; -------------
18; Install the CON device driver. This is used for downloading of
19; the character sets (various Code Pages) according to the respective
20; display adapter. The interface provided by the video BIOS is used
21; to download a block of 256 characters (in various resolutions - ie.
22; 8x8, 8x14, and 8x16). Also, the interrupt 2F hex is chained for
23; communication between the CON device driver and the keyboard routine.
24;
25; Refer to INIT.ASM for code
26;
27; 13 hex - GENERIC IOCTL
28; ----------------------
29; INVOKE
30; ------
31; Invoke is use to activate the appropriate CP font. The mechanism
32; is based soley on the code page value passed from the MODE & CHCP
33; commands. Once a CP ahs benn INVOKED, it is loaded for ALL display
34; modes on the respective display adapter - ONLY IF the proper font
35; resolution can be accessed.
36;
37; Refer to CPS-FUNC.INC for code
38;
39; DESIGNATE START
40; ---------------
41; Designate start passes the list of designated code pages to load.
42; It is sent just prior to the IOCTL WRITE calls containing the 'CPI'
43; files. The list of designated code pages is check for duplicates
44; and for invalids (-1).
45;
46; Refer to CPS-FUNC.INC for code
47;
48; DESIGNATE STOP
49; --------------
50; Once the data (for a DESIGNATION) has been routed to the CPS driver,
51; it is followed by a DESIGNATE STOP command. This confirms the completion
52; of the DESIGNATE procedure. If there was an error detected during the
53; DESIGNATE procedure, it must be followed by a DESIGNATE STOP.
54;
55; Refer to CPS-FUNC.INC for code
56;
57;
58; 0C hex - IOCTL OUTPUT
59; ---------------------
60; Following a DESIGNATE START, the contents of the specified data file
61; (expected .CPI format) is copied by DOS to the CPS driver. This is
62; via the GENERIC IOCTL WRITE calls. During these calls, the data is
63; parsed by the FONT-PARSER (F-PARSER.SRC) to select the CP and fonts
64; required.
65;
66; Refer to CPS-FUNC.INC for code
67;
68;
69; (C)Copyright 1988 Microsoft
70;
71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
72 ;
73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
74;
75; Request Header (Common portion)
76;
77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
78IF1 ;
79 %OUT .Compiling: DISPLAY.ASM
80 %OUT . ô CPS-CON driver
81 %OUT . õ Version 3.30
82 %OUT .Include Files:
83ENDIF ;
84 INCLUDE MACROS.INC ;
85 INCLUDE DEF-EQU.INC ;
86 ;
87 PUBLIC EOF_MARKER ;
88 PUBLIC CPD_ACTIVE ;
89 PUBLIC CPD_CLASS ;
90 PUBLIC CPD_HDWR_N_MAX ;
91 PUBLIC CPD_DESG_N_MAX ;
92 PUBLIC CPD_HDWR_N ;
93 PUBLIC CPD_DESG_N ;
94 PUBLIC CPD_FONTS_N ;
95 PUBLIC CPD_FONT_PNTER ;
96 PUBLIC IRPT_2 ;
97 PUBLIC IRPT_CMD_EXIT ;
98 PUBLIC DEV_HDR ;
99 EXTRN INIT:NEAR ;
100 ;
101CODE SEGMENT BYTE PUBLIC 'CODE' ;
102 ASSUME CS:CODE,DS:CODE ;
103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104;****************************************
105;** Resident Code **
106;****************************************
107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
108START EQU $ ; begin resident data & code
109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
110;
111; DEVICE HEADER - must be at offset zero within device driver
112; (DHS is defined according to this structure)
113;
114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
115 ORG 0000H ;
116 ;
117DEV_HDR:DD -1 ; Pointer to next device header
118 DW 0C053H ; Attribute (Char device)
119 DW OFFSET STRATEGY ; Pnter to device "strategy"
120 DW OFFSET INTERRUPT ; Pnter to device "interrupt"
121 DB 'CON ' ; Device name
122 ; and of course a descriptive name
123 ; which can be viewed by a TYPE!
124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
125;
126; Console Description Table
127;
128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
129.XLIST ;
130STACK_END DW 1FFH+60H DUP(0) ; 200H + 'my' needs (re/ DOS 3.30 ref)
131STACK_START DW 0 ;
132OLD_STACK_S DW ? ;
133OLD_STACK_O DW ? ;
134.LIST ;
135 ;
136BUF1: BUF_DATA <> ; exclude PAR_EXTRACTO
137 ;
138CP_PNTER_TABLE DW OFFSET CPD_HDWR_N ; TABLE OF POINTERS TO CP INFO
139 DW OFFSET CPD_DESG_N ;
140 DW OFFSET CPD_FONT_PNTER;
141 DW OFFSET CPD_FONT_WRITE;
142 DW OFFSET CPD_FONT_DATA ;
143 ;
144CPD_TABLE LABEL WORD ; TABLE DATA INFO FOR CP's
145CPD_ACTIVE DW -1 ; TEMPORARY
146CPD_CLASS DB '........' ; THIS IS SET TO (EGA, LCD)
147CPD_FONTS_N DW -1 ;
148CPD_HDWR_N DW 0 ;
149 DW 12 DUP(-1) ; (HDWR_CP's) (MAX=12)
150CPD_HDWR_N_MAX EQU ($-CPD_HDWR_N)/2-1 ;
151CPD_DESG_N DW -1 ; # OF DESIG CP's
152 DW 12 DUP(-1) ; (DESG CP's) (MAX=12)
153CPD_DESG_N_MAX EQU ($-CPD_DESG_N)/2-1 ;
154CPD_FONT_PNTER DW 12 DUP(0,0) ; SEG_OFFSET POINTER TO DATA BUFFERS
155CPD_FONT_WRITE DW 12 DUP(0,0) ; SEG_OFFSET OF FONTS BEING WRITTEN
156CPD_FONT_DATA DW 12 DUP(0) ; COUNT OF FONT DATA TO SKIP/COPY!
157FONT_PRIORITY DB 8 DUP(-1) ; USED TO CLASSIFY FONT PRIORITY
158NUM_FONT_PRIORITY EQU ($-FONT_PRIORITY) ; DURING A DESIGNATION
159CPD_TEMP_DESG DW 0 ; # OF DESIG CP's TEMP BUFFER
160 DW 12 DUP(-1) ; (DESG CP's) (MAX=12)
161CPD_REQ_DESG DW 0 ; # OF DESIG CP's REQUESTED
162 DW 12 DUP(-1) ; (DESG CP's) (MAX=12)
163;;;;;;;
164
165ANSI_DA_INFO DA_INFO_PACKET <> ;J.K. Information packet to ANSI used for MODE SET INT10 call.
166
167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
168;
169; CON Device "strategy" entry point
170; Retain the Request Header address for use by Interrupt routine
171;
172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
173 ASSUME DS:NOTHING ;
174STRATEGY PROC FAR ;
175 PUSH BX ;
176 PUSH BX ;
177 LEA BX, BUF1 ; BUF = BUF1 CS:[BX]
178 POP BUF.RH_PTRO ; OFFSET OF REQUEST HEADER
179 MOV BUF.RH_PTRS,ES ; SEGMENT
180 POP BX ;
181 RET ;
182STRATEGY ENDP ;
183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
184;
185; Table of command processing routine entry points
186;
187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
188CMD_TABLE LABEL WORD ;
189 DW OFFSET INIT ; 0 - Initialization
190 DW OFFSET NO_OPERATION ; 1 - Media check
191 DW OFFSET NO_OPERATION ; 2 - Build BPB
192 DW OFFSET NO_OPERATION ; 3 - IOCTL input
193 DW OFFSET NO_OPERATION ; 4 - Input
194 DW OFFSET NO_OPERATION ; 5 - Non destructive input no wait
195 DW OFFSET NO_OPERATION ; 6 - Input status
196 DW OFFSET NO_OPERATION ; 7 - Input flush
197 DW OFFSET NO_OPERATION ; 8 - Write
198 DW OFFSET NO_OPERATION ; 9 - Output with verify
199 DW OFFSET NO_OPERATION ; A - Output status
200 DW OFFSET NO_OPERATION ; B - Output flush
201 DW OFFSET DESG_WRITE ; C - IOCTL output
202 DW OFFSET NO_OPERATION ; D - Device OPEN
203 DW OFFSET NO_OPERATION ; E - Device CLOSE
204 DW OFFSET NO_OPERATION ; F - Removable media
205 DW OFFSET NO_OPERATION ; 10 - Removable media
206 DW OFFSET NO_OPERATION ; 11 - Removable media
207 DW OFFSET NO_OPERATION ; 12 - Removable media
208 DW OFFSET GENERIC_IOCTL ; 13 - Removable media
209MAX_CMD EQU ($-CMD_TABLE)/2 ; highest valid command follows
210;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
211;
212; CON Device "interrupt" entry point
213;
214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
215INTERRUPT PROC FAR ; device interrupt entry point
216 PUSH AX ;
217 PUSH BX ;
218 PUSH CX ;
219 PUSH DI ;
220 PUSH SI ;
221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
222;
223; Common interrupt entry :
224; at entry, BUFn (CS:BX) of CON is defined
225;
226; Check if header link has to be set
227;
228;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
229 LEA BX, BUF1 ;
230 MOV DI,OFFSET DEV_HDR ; CON Device header
231 ;
232 MOV BUF.DEV_HDRO,DI ;
233 MOV BUF.DEV_HDRS,CS ;
234 CLD ; all moves forward
235 ;
236 CMP BUF.CON_STRAO, -1 ;
237 JNE L4 ; has been linked to DOS CON
238 CMP BUF.CON_STRAS, -1 ;
239 JNE L4 ; has been linked to DOS CON
240 ; next device header : ES:[DI]
241 LDS SI,DWORD PTR BUF.DEV_HDRO;
242 LES DI,DWORD PTR HP.DH_NEXTO;
243 ;
244;$SEARCH WHILE ; pointer to next device header is NOT
245L1: ;
246 PUSH ES ; -1
247 POP AX ;
248 CMP AX,-1 ;
249;$LEAVE E, AND ; leave if both offset and segment are
250 JNE NOT0FFFF ;
251 ;
252 CMP DI,-1 ; 0FFFFH
253;$LEAVE E ;
254 JE L4 ;
255NOT0FFFF: ;
256 PUSH DI ;
257 PUSH SI ;
258 MOV CX,NAME_LEN ;
259 LEA DI,NHD.DH_NAME ;
260 LEA SI,HP.DH_NAME ;
261 REPE CMPSB ;
262 POP SI ;
263 POP DI ;
264 AND CX,CX ;
265;$EXITIF Z ; Exit if name is found in linked hd.
266 JNZ L3 ; Name is not found
267 ; Name is found in the linked header
268 MOV AX,NHD.DH_STRAO ; Get the STRATEGY address
269 MOV BUF.CON_STRAO,AX ;
270 MOV AX,ES ;
271X1: MOV BUF.CON_STRAS,AX ;
272 ;
273 MOV AX,NHD.DH_INTRO ; Get the INTERRUPT address
274 MOV BUF.CON_INTRO,AX ;
275 MOV AX,ES ;
276X2: MOV BUF.CON_INTRS,AX ;
277 ;
278;$ORELSE ; FInd next header to have the same
279 JMP L4 ; Device Name
280L3: ;
281 LES DI,DWORD PTR NHD.DH_NEXTO;
282;$ENDLOOP ;
283 JMP L1 ;
284L4: ;
285;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
286;
287; COMMAND REQUEST
288; ES:DI REQUEST HEADER
289;
290;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
291 LES DI,DWORD PTR BUF.RH_PTRO; GET RH ADDRESS PASSED TO
292 ; "STRATEGY" INTO ES:DI
293 MOV AL,RH.RHC_CMD ; COMMAND CODE FROM REQUEST HEADER
294 CBW ; ZERO AH (IF AL > 7FH, NEXT COMPARE
295 ; WILL CATCH THAT ERROR)
296 CMP AL,MAX_CMD ; IF COMMAND CODE IS TOO HIGH
297 JAE L6 ; JUMP TO ERROR ROUTINE
298 ;
299 ADD AX,AX ; DOUBLE COMMAND CODE FOR TABLE OFFSET
300 MOV SI,AX ; PUT INTO INDEX REGISTER FOR JMP
301 ;
302 CALL CS:CMD_TABLE[SI] ; CALL ROUTINE TO HANDLE THE COMMAND
303 JC IRPT_CMD_EXIT ; CY=1 IF NO PASS_CONTROL REQ'D
304 CALL PASS_CONTROL ;
305 JUMP IRPT_2 ;
306 ;
307L6: CALL PASS_CONTROL ; CALL ROUTINE TO HANDLE THE COMMAND
308;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
309; At entry to command processing routine
310;
311; ES:DI = Request Header address
312; CS:BX = Buffer for CON
313; CS = code segment address
314; AX = 0
315;
316; top of stack is return address, IRPT_CMD_EXIT
317;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
318IRPT_CMD_EXIT: ; RETURN FROM COMMAND ROUTINE
319 LES DI,DWORD PTR BUF.RH_PTRO; RESTORE ES:DI AS REQUEST HEADER PTR
320 XOR AX,AX ;
321 OR AX,BUF.STATUS ;
322 JE IRPT_0 ;
323 XOR BUF.STATUS,AX ; SET STATUS BACK TO OK!
324 OR AX,STAT_CMDERR ;
325 JUMP IRPT_1 ;
326IRPT_0: OR AH,STAT_DONE ; ADD "DONE" BIT TO STATUS WORD
327IRPT_1: MOV RH.RHC_STA,AX ; STORE STATUS INTO REQUEST HEADER
328IRPT_2: POP SI ; RESTORE REGISTERS
329 POP DI ;
330 POP CX ;
331 POP BX ;
332 POP AX ;
333 RET ;
334INTERRUPT ENDP ;
335;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
336;
337; PASS CONTROL
338;
339; This calls the attached device to perform any further
340; action on the call!
341;
342;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
343PASS_CONTROL PROC ;
344 PUSH BX ;
345 PUSH BX ;
346 POP SI ;
347 LES BX,DWORD PTR BUF.RH_PTRO; pass the request header to the
348 CALL DWORD PTR CS:[SI].CON_STRAO ; CON strategy routine.
349 POP BX ;
350 CALL DWORD PTR BUF.CON_INTRO ; interrupt the CON
351 RET ;
352PASS_CONTROL ENDP ;
353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
354;
355;
356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
357NO_OPERATION PROC ;
358 CLC ;
359 RET ;
360NO_OPERATION ENDP ;
361;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
362;
363; PULL IN THE CODE PAGE FUNCTION CODE
364;
365;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
366 INCLUDE INT2FCOM.INC ;
367 INCLUDE INT10COM.INC ;
368 INCLUDE CPS-FUNC.INC ;
369 INCLUDE WRITE.INC ; SPECIAL MARKER IN WRITE.INC
370 INCLUDE F-PARSER.INC ;
371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
372;
373; Adjust the assembly-time instruction counter to a paragraph
374; boundary
375;
376;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
377 IF ($-START) MOD 16 ;
378 ORG ($-START)+16-(($-START) MOD 16);
379 ENDIF ;
380EOF_MARKER EQU $ ; end of resident code
381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
382;
383; END-OF-CODE
384;
385;;;;;;;;;;;;;;;;;
386CODE ENDS ;
387 END ;
388;;;;;;;;;;;;;;;;;