summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/ANSI
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/ANSI
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/ANSI')
-rw-r--r--v4.0/src/DEV/ANSI/ANSI.ASM1169
-rw-r--r--v4.0/src/DEV/ANSI/ANSI.INC312
-rw-r--r--v4.0/src/DEV/ANSI/ANSI.LNK8
-rw-r--r--v4.0/src/DEV/ANSI/ANSI.SKL16
-rw-r--r--v4.0/src/DEV/ANSI/ANSIINIT.ASM413
-rw-r--r--v4.0/src/DEV/ANSI/ANSIVID.INC54
-rw-r--r--v4.0/src/DEV/ANSI/IOCTL.ASM1126
-rw-r--r--v4.0/src/DEV/ANSI/MAKEFILE33
-rw-r--r--v4.0/src/DEV/ANSI/PARSER.ASM325
9 files changed, 3456 insertions, 0 deletions
diff --git a/v4.0/src/DEV/ANSI/ANSI.ASM b/v4.0/src/DEV/ANSI/ANSI.ASM
new file mode 100644
index 0000000..a1d59c6
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/ANSI.ASM
@@ -0,0 +1,1169 @@
1PAGE ,132
2TITLE CONDEV FANCY CONSOLE DRIVER
3
4;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
5;
6; ADDRESSES FOR I/O
7;
8;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
9;------------------------------------------------------------------------------
10;AN000; New functionality in DOS 4.00
11;AN001; GHG fix scrolling flashes on Mod 25/30's
12;AN002; P1767 VIDEO_MODE_TABLE not initialized correctly 10/16/87 J.K.
13;AN003; D375 /X needs to be supported by ANSI sequence also 12/14/87 J.K.
14;AN004; D397 /L option for Enforcing number of lines 12/17/87 J.K.
15;AN005; D479 An option to disable the extended keyboard functions 02/12/88 J.K.
16;AN006; P4241 AN001 fix be Revised to fix this problem 04/20/88 J.K.
17;AN007; P4532 Scrolling has a snow for CGA adapter 04/27/88 J.K.
18;AN008; P4533 In mode Dh, Eh, Fh, 10h and 13h, Scrolling not working 04/27/88 J.K.
19;AN009; P4766 In mode 11h, and 12h erase display leaves bottom 5 05/24/88 F.G.
20;------------------------------------------------------------------------------
21
22TRUE EQU 0FFFFh
23FALSE EQU 0
24
25BREAK MACRO subtitle
26 SUBTTL subtitle
27 PAGE ,132
28ENDM
29
30AsmVars Macro varlist
31IRP var,<varlist>
32AsmVar var
33ENDM
34ENDM
35
36AsmVar Macro var
37IFNDEF var
38var = FALSE
39ENDIF
40ENDM
41
42INCLUDE VECTOR.INC
43INCLUDE MULT.INC
44INCLUDE ANSI.INC ; WGR equates and structures ;AN000;
45.xlist
46INCLUDE STRUC.INC ; WGR include STRUC macros ;AN000;
47.list
48
49BREAK <ANSI driver code>
50
51 CR=13 ;CARRIAGE RETURN
52 BACKSP=8 ;BACKSPACE
53 ESC_CHAR=1BH
54 BRKADR=6CH ;006C BREAK VECTOR ADDRESS
55 ASNMAX=400 ;WGR (increased) SIZE OF KEY ASSIGNMENT BUFFER
56
57PUBLIC SWITCH_X ; WGR/X option for extended keyboard redefinition support;AN000;
58PUBLIC SCAN_LINES ; WGR ;AN000;
59PUBLIC VIDEO_MODE_TABLE ; WGR ;AN000;
60PUBLIC VIDEO_TABLE_MAX ; WGR ;AN000;
61public MAX_VIDEO_TAB_NUM ;P1767
62PUBLIC PTRSAV ; WGR ;AN000;
63PUBLIC ERR1 ; WGR ;AN000;
64PUBLIC ERR2 ; WGR ;AN000;
65PUBLIC EXT_16 ; WGR ;AN000;
66PUBLIC BRKADR ; WGR ;AN000;
67PUBLIC BRKKY ; WGR ;AN000;
68PUBLIC COUT ; WGR ;AN000;
69PUBLIC BASE ; WGR ;AN000;
70PUBLIC MODE ; WGR ;AN000;
71PUBLIC MAXCOL ; WGR ;AN000;
72PUBLIC TRANS ; WGR ;AN000;
73PUBLIC STATUS ; WGR ;AN000;
74PUBLIC EXIT ; WGR ;AN000;
75PUBLIC NO_OPERATION ; WGR ;AN000;
76PUBLIC HDWR_FLAG ; WGR ;AN000;
77public Switch_L ;AN004;
78public Switch_K ;AN005;
79 ;AN000;
80CODE SEGMENT PUBLIC BYTE
81
82 ASSUME CS:CODE,DS:NOTHING,ES:NOTHING
83;-----------------------------------------------
84;
85; C O N - CONSOLE DEVICE DRIVER
86;
87
88EXTRN CON$INIT:NEAR ; WGR ANSI initialization code
89EXTRN GENERIC_IOCTL:NEAR ; WGR Generic IOCTL code
90EXTRN REQ_TXT_LENGTH:WORD ; WGR current text length
91EXTRN GRAPHICS_FLAG:BYTE ; WGR graphics flag
92
93CONDEV: ;HEADER FOR DEVICE "CON"
94 DW -1,-1
95 DW 1100000001010011B ;WGR changed to match CON ;AC000;
96 DW STRATEGY
97 DW ENTRY
98 DB 'CON '
99
100;--------------------------------------------------------------
101;
102; COMMAND JUMP TABLES
103CONTBL:
104 DW CON$INIT
105 DW NO_OPERATION ; WGR ;AC000;
106 DW NO_OPERATION ; WGR ;AC000;
107 DW NO_OPERATION ; WGR ;AC000;
108 DW CON$READ
109 DW CON$RDND
110 DW NO_OPERATION ; WGR ;AC000;
111 DW CON$FLSH
112 DW CON$WRIT
113 DW CON$WRIT
114 DW NO_OPERATION ; WGR ;AC000;
115 DW NO_OPERATION ; WGR ;AC000;
116 DW NO_OPERATION ; WGR ;AC000;
117 DW NO_OPERATION ; WGR ;AC000;
118 DW NO_OPERATION ; WGR ;AC000;
119 DW NO_OPERATION ; WGR ;AC000;
120 DW NO_OPERATION ; WGR ;AN000;
121 DW NO_OPERATION ; WGR ;AN000;
122 DW NO_OPERATION ; WGR ;AN000;
123 DW GENERIC_IOCTL ; WGR generic IOCTL routine offset ;AN000;
124MAX_CMD EQU ($ - CONTBL)/2 ; WGR size of CONTBL ;AN000;
125
126CMDTABL DB 'A'
127 DW CUU ;cursor up
128 DB 'B'
129 DW CUD ;cursor down
130 DB 'C'
131 DW CUF ;cursor forward
132 DB 'D'
133 DW CUB ;cursor back
134 DB 'H'
135 DW CUP ;cursor position
136 DB 'J'
137 DW ED ;erase display
138 DB 'K'
139 DW EL ;erase line
140 DB 'R'
141 DW CPR ;cursor postion report
142 DB 'f'
143 DW CUP ;cursor position
144 DB 'h'
145 DW SM ;set mode
146 DB 'l'
147 DW RM ;reset mode
148 DB 'm'
149 DW SGR ;select graphics rendition
150 DB 'n'
151 DW DSR ;device status report
152 DB 'p'
153 DW KEYASN ;key assignment
154 db 'q' ;AN003; dynamic support of /X option through ansi sequence
155 dw ExtKey ;AN003; esc[0q = reset it. esc[1q = set it
156 DB 's'
157 DW PSCP ;save cursor postion
158 DB 'u'
159 DW PRCP ;restore cursor position
160 DB 00
161
162GRMODE DB 00,00000000B,00000111B
163 DB 01,11111111B,00001000B
164 DB 04,11111000B,00000001B
165 DB 05,11111111B,10000000B
166 DB 07,11111000B,01110000B
167 DB 08,10001000B,00000000B
168 DB 30,11111000B,00000000B
169 DB 31,11111000B,00000100B
170 DB 32,11111000B,00000010B
171 DB 33,11111000B,00000110B
172 DB 34,11111000B,00000001B
173 DB 35,11111000B,00000101B
174 DB 36,11111000B,00000011B
175 DB 37,11111000B,00000111B
176 DB 40,10001111B,00000000B
177 DB 41,10001111B,01000000B
178 DB 42,10001111B,00100000B
179 DB 43,10001111B,01100000B
180 DB 44,10001111B,00010000B
181 DB 45,10001111B,01010000B
182 DB 46,10001111B,00110000B
183 DB 47,10001111B,01110000B
184 DB 0FFH
185
186;---------------------------------------------------
187;
188; Device entry point
189;
190CMDLEN = 0 ;LENGTH OF THIS COMMAND
191UNIT = 1 ;SUB UNIT SPECIFIER
192CMD = 2 ;COMMAND CODE
193STATUS = 3 ;STATUS
194MEDIA = 13 ;MEDIA DESCRIPTOR
195TRANS = 14 ;TRANSFER ADDRESS
196COUNT = 18 ;COUNT OF BLOCKS OR CHARACTERS
197START = 20 ;FIRST BLOCK TO TRANSFER
198
199PTRSAV DD 0
200
201BUF1: BUF_DATA <> ; WGR Next CON Buffer area ;AN000;
202
203STRATP PROC FAR
204
205STRATEGY:
206 MOV WORD PTR CS:[PTRSAV],BX
207 MOV WORD PTR CS:[PTRSAV+2],ES
208 RET
209
210STRATP ENDP
211
212ENTRY:
213 PUSH SI
214 PUSH AX
215 PUSH CX
216 PUSH DX
217 PUSH DI
218 PUSH BP
219 PUSH DS
220 PUSH ES
221 PUSH BX
222;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
223; WGR ;AN000;
224; Check if header link has to be set WGR (Code ported from ;AN000;
225; WGR DISPLAY.SYS) ;AN000;
226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
227 LEA BX, BUF1 ; WGR ;AN000;
228 MOV DI,OFFSET CONDEV ; WGR CON Device header ;AN000;
229 ; WGR ;AN000;
230 MOV CONPTR.DEV_HDRO,DI ; WGR ;AN000;
231 MOV CONPTR.DEV_HDRS,CS ; WGR ;AN000;
232 CLD ; WGR all moves forward ;AN000;
233 ; WGR ;AN000;
234 CMP CONPTR.CON_STRAO, -1 ; WGR ;AN000;
235 JNE L4 ; WGR has been linked to DOS CON ;AN000;
236 CMP CONPTR.CON_STRAS, -1 ; WGR ;AN000;
237 JNE L4 ; WGR has been linked to DOS CON ;AN000;
238 ; WGR next device header : ES:[DI] ;AN000;
239 LDS SI,DWORD PTR CONPTR.DEV_HDRO;WGR ;AN000;
240 LES DI,DWORD PTR HP.DH_NEXTO; WGR ;AN000;
241 ; WGR ;AN000;
242;$SEARCH WHILE ; WGR pointer to next device header is NOT ;AN000;
243L1: ; WGR ;AN000;
244 PUSH ES ; WGR -1 ;AN000;
245 POP AX ; WGR ;AN000;
246 CMP AX,-1 ; WGR ;AN000;
247;$LEAVE E, AND ; WGR leave if both offset and segment are ;AN000;
248 JNE NOT0FFFF ; WGR ;AN000;
249 ; WGR ;AN000;
250 CMP DI,-1 ; WGR 0FFFFH ;AN000;
251;$LEAVE E ; WGR ;AN000;
252 JE L4 ; WGR ;AN000;
253NOT0FFFF: ; WGR ;AN000;
254 PUSH DI ; WGR ;AN000;
255 PUSH SI ; WGR ;AN000;
256 MOV CX,NAME_LEN ; WGR ;AN000;
257 LEA DI,NHD.DH_NAME ; WGR ;AN000;
258 LEA SI,HP.DH_NAME ; WGR ;AN000;
259 REPE CMPSB ; WGR ;AN000;
260 POP SI ; WGR ;AN000;
261 POP DI ; WGR ;AN000;
262 AND CX,CX ; WGR ;AN000;
263;$EXITIF Z ; WGR Exit if name is found in linked hd. ;AN000;
264 JNZ L3 ; WGR Name is not found ;AN000;
265 ; WGR Name is found in the linked header ;AN000;
266 MOV AX,NHD.DH_STRAO ; WGR Get the STRATEGY address ;AN000;
267 MOV CONPTR.CON_STRAO,AX ; WGR ;AN000;
268 MOV AX,ES ; WGR ;AN000;
269X1: MOV CONPTR.CON_STRAS,AX ; WGR ;AN000;
270 ; WGR ;AN000;
271 MOV AX,NHD.DH_INTRO ; WGR Get the INTERRUPT address ;AN000;
272 MOV CONPTR.CON_INTRO,AX ; WGR ;AN000;
273 MOV AX,ES ; WGR ;AN000;
274X2: MOV CONPTR.CON_INTRS,AX ; WGR ;AN000;
275 ; WGR ;AN000;
276;$ORELSE ; WGR FInd next header to have the same ;AN000;
277 JMP L4 ; WGR Device Name ;AN000;
278L3: ; WGR ;AN000;
279 LES DI,DWORD PTR NHD.DH_NEXTO;WGR ;AN000;
280;$ENDLOOP ; WGR ;AN000;
281 JMP L1 ; WGR ;AN000;
282L4: ; WGR ;AN000;
283
284 LDS BX,CS:[PTRSAV] ;GET PONTER TO I/O PACKET
285
286 MOV CX,WORD PTR DS:[BX].COUNT ;CX = COUNT
287
288 MOV AL,BYTE PTR DS:[BX].CMD
289 CBW
290 MOV SI,OFFSET CONTBL
291 ADD SI,AX
292 ADD SI,AX
293 CMP AL,MAX_CMD ; WGR not a call for ANSI...chain to lower device;AC000;
294 JA NO_OPERATION
295
296 LES DI,DWORD PTR DS:[BX].TRANS
297
298 PUSH CS
299 POP DS
300
301 ASSUME DS:CODE
302
303 JMP WORD PTR [SI] ;GO DO COMMAND
304
305;=====================================================
306;=
307;= SUBROUTINES SHARED BY MULTIPLE DEVICES
308;=
309;=====================================================
310;----------------------------------------------------------
311;
312; EXIT - ALL ROUTINES RETURN THROUGH THIS PATH
313;
314BUS$EXIT: ;DEVICE BUSY EXIT
315 MOV AH,00000011B
316 JMP SHORT ERR1
317
318NO_OPERATION: ; WGR ;AN000;
319 CALL PASS_CONTROL ; WGR Pass control to lower CON ;AN000;
320 JMP SHORT ERR2 ; WGR ;AN000;
321
322ERR$EXIT:
323 MOV AH,10000001B ;MARK ERROR RETURN
324 JMP SHORT ERR1
325
326EXITP PROC FAR
327
328EXIT: MOV AH,00000001B
329ERR1: LDS BX,CS:[PTRSAV]
330 MOV WORD PTR [BX].STATUS,AX ;MARK OPERATION COMPLETE
331ERR2:
332 POP BX ; WGR ;AN000;
333 POP ES
334 POP DS
335 POP BP
336 POP DI
337 POP DX
338 POP CX
339 POP AX
340 POP SI
341 RET ;RESTORE REGS AND RETURN
342EXITP ENDP
343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
344; WGR ;AN000;
345; PASS CONTROL WGR ;AN000;
346; WGR ;AN000;
347; This calls the attached device to perform any further ;AN000;
348; action on the call! WGR ;AN000;
349; WGR ;AN000;
350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
351PASS_CONTROL PROC ; WGR ;AN000;
352 LEA SI,BUF1 ; WGR ;AN000;
353 LES BX,CS:[PTRSAV] ; WGR pass the request header to the ;AN000;
354 CALL DWORD PTR CS:[SI].CON_STRAO ; CON strategy routine. ;AN000;
355 CALL DWORD PTR CS:[SI].CON_INTRO ; WGR interrupt the CON ;AN000;
356 RET ; WGR ;AN000;
357PASS_CONTROL ENDP ; WGR ;AN000;
358;----------------------------------------------- ;AN000;
359;
360; BREAK KEY HANDLING
361;
362BRKKY:
363 MOV CS:ALTAH,3 ;INDICATE BREAK KEY SET
364INTRET: IRET
365
366;
367; WARNING - Variables are very order dependent, be careful
368; when adding new ones! - c.p.
369;
370WRAP DB 0 ; 0 = WRAP, 1 = NO WRAP
371ASNPTR DW 4
372STATE DW S1
373MODE DB 3 ;*
374MAXCOL DB 79 ;*
375COL DB 0
376ROW DB 0
377SAVCR DW 0
378INQ DB 0
379PRMCNT LABEL BYTE
380PRMCNTW DW 0
381KEYCNT DB 0
382KEYPTR DW BUF
383REPORT DB ESC_CHAR,'[00;00R',CR ;CURSOR POSTION REPORT BUFFER
384ALTAH DB 0 ;Special key handling
385
386EXT_16 DB 0 ; WGR Extended INT 16h flag ;AN000;
387Switch_X DB OFF ; WGR /X flag ;AN000;
388Switch_L db OFF ;DCR397; 1= /L flag entered.
389Switch_K db OFF ;AN005; To control EXT_16
390SCAN_LINES DB ? ; WGR flag for available scan lines (VGA) ;AN000;
391HDWR_FLAG DW 0 ; WGR byte of flags indicating video support ;AN000;
392
393VIDEO_MODE_TABLE LABEL BYTE ; WGR table containing applicable ;AN000;
394MODE_TABLE <> ; WGR video modes and corresponding ;AN000;
395MODE_TABLE <> ; WGR data. ;AN000;
396MODE_TABLE <> ; WGR this table is initialized at ;AN000;
397MODE_TABLE <> ; WGR INIT time ;AN000;
398MODE_TABLE <> ; WGR ;AN000;
399MODE_TABLE <> ; WGR ;AN000;
400MODE_TABLE <> ; WGR ;AN000;
401MODE_TABLE <> ; WGR ;AN000;
402MODE_TABLE <> ; WGR ;AN000;
403MODE_TABLE <> ; WGR ;AN000;
404MODE_TABLE <> ; WGR ;AN000;
405MODE_TABLE <> ; WGR ;AN000;
406MODE_TABLE <> ; WGR ;AN000;
407MODE_TABLE <> ; WGR ;AN000;
408MODE_TABLE <> ; WGR ;AN000;
409VIDEO_TABLE_MAX EQU $ ; WGR maximum address for video table ;AN000;
410MAX_VIDEO_TAB_NUM EQU ($-VIDEO_MODE_TABLE)/TYPE MODE_TABLE ;P1767 Max number of table
411 ;AN000;
412;-------------------------------------------------------------
413;
414; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
415;
416ATTRW LABEL WORD
417ATTR DB 00000111B ;CHARACTER ATTRIBUTE
418BPAGE DB 0 ;BASE PAGE
419base dw 0b800h
420screen_seg dw 00000h
421
422chrout: cmp al,13
423 jnz trylf
424 mov [col],0
425 jmp short setit
426
427trylf: cmp al,10
428 jz lf
429 cmp al,7
430 jnz tryback
431torom:
432 mov bx,[attrw]
433 and bl,7
434 mov ah,14
435 int 10h
436ret5: ret
437
438tryback:
439 cmp al,8
440 jnz outchr
441 cmp [col],0
442 jz ret5
443 dec [col]
444 jmp short setit
445
446outchr:
447 mov bx,[attrw]
448 mov cx,1
449 mov ah,9
450 int 10h
451 inc [col]
452 mov al,[col]
453 cmp al,[maxcol]
454 jbe setit
455 cmp [wrap],0
456 jz outchr1
457 dec [col]
458 ret
459outchr1:
460 mov [col],0
461lf: inc [row]
462 MOV AH,30 ; GHG Fix for ROUNDUP/PALACE
463 MOV AL,MODE ; GHG Fix for ROUNDUP/PALACE
464 CMP AL,11H ; GHG Fix for ROUNDUP/PALACE
465 JE LF2 ; GHG Fix for ROUNDUP/PALACE
466 CMP AL,12H ; GHG Fix for ROUNDUP/PALACE
467 JE LF2 ; GHG Fix for ROUNDUP/PALACE
468 .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
469 MOV AH,DEFAULT_LENGTH ; WGR ;AN000;
470 .ELSE ; WGR ;AN000;
471 MOV AH,BYTE PTR [REQ_TXT_LENGTH] ; GHG Fix for ROUNDUP/PALACE
472 .ENDIF ; WGR ;AN000;
473LF2: ; GHG Fix for ROUNDUP/PALACE
474 cmp [row],AH ; GHG Fix for ROUNDUP/PALACE
475 jb setit
476 DEC AH ; GHG Fix for ROUNDUP/PALACE
477 mov [row],AH ; GHG Fix for ROUNDUP/PALACE
478 call scroll
479
480setit: mov dh,row
481 mov dl,col
482 mov bh,[bpage]
483 mov ah,2
484 int 10h
485 ret
486
487;AN006;Writing a LF char through Teletype function to scroll the screen
488;has a side effect of changing the color of the cursor when the PROMPT
489;setting in PTM P4241 is used. AN001 uses this method to fix the strobing
490;problem of the palace machine. The old method of scrolling used to directly
491;write into video buffer. The old method has been used by AN001 for
492;CGA adater of mode 2 or 3 only.
493;To solve P4241, but to maintain the fix of the strobing problem of palace
494;machine, we return back to the old logic but the old logic has to be
495;Revised for the displays above CGA level. For the adapters above
496;CGA display, we don't need to turn off/on the video - this will causes
497;a strobing, if you use do this, for Palace machine.
498;This logic will be only applied to mode 2 and 3 only.
499
500scroll:
501;AN006;AN008; Myscroll is only for Mode 2 and 3 of all display unit.
502; .IF <BIT HDWR_FLAG eq CGA_ACTIVE> ; GHG is this the CGA? ;AN000;
503 .IF < MODE eq 2 > or
504 .IF < MODE eq 3 >
505 jmp myscroll
506 .ENDIF
507; .ENDIF
508;AN006;AN008; Other modes (=APA mode) use TeleType function of
509; writing LF to scroll the screen!.
510 mov al,10 ; GHG
511 jmp torom ; GHG
512
513myscroll:
514 mov bh,[attr]
515 mov bl,' '
516 MOV AL,[MAXCOL] ; WGR ;AN000;
517 CBW ; WGR ;AN000;
518 INC AX ; WGR ;AN000;
519 MOV BP,AX ; WGR ;AN000;
520 MOV SI,BP ; WGR ;AN000;
521 ADD SI,BP ; WGR ;AN000;
522 .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
523 MOV AX,DEFAULT_LENGTH ; WGR ;AN000;
524 .ELSE ; WGR ;AN000;
525 MOV AX,[REQ_TXT_LENGTH] ; WGR ;AN000;
526 .ENDIF ; WGR ;AN000;
527 DEC AX ; WGR ;AN000;
528 MUL BP ; WGR ;AN000;
529 MOV CX,AX ; WGR ;AN000;
530 mov ax,[base]
531 add ax,[screen_seg]
532 mov es,ax
533 mov ds,ax
534 xor di,di
535 cld
536 cmp cs:[base],0b800h
537 jz colorcard
538
539 rep movsw
540 mov ax,bx
541 mov cx,bp
542 rep stosw
543sret: push cs
544 pop ds
545 ret
546
547colorcard:
548; We must protect this with a critical section
549;
550; INT 29H calls to device drivers do not enter CritDevice
551; The user MIGHT hit Ctrl-NumLock in the middle of this
552; which will leave the screen blanked.
553 mov ax,8000H + CritDevice ; Enter Device critical section
554 int int_IBM
555
556 cmp cs:[Hdwr_Flag], MCGA_ACTIVE ;AN006;AN007;above CGA level?
557 jae Skip_Video_Off ;AN006;AN007;
558
559 mov dx,3dah
560wait2: in al,dx
561 test al,8
562 jz wait2
563 mov al,25h
564 mov dx,3d8h
565 out dx,al ;turn off video
566Skip_Video_Off: ;AN006;
567 rep movsw
568 mov ax,bx
569 mov cx,bp
570 rep stosw
571 cmp cs:[Hdwr_Flag], MCGA_ACTIVE ;AN006;AN007;
572 jae Skip_Video_On ;AN006;AN007;
573 mov al,29h
574 mov dx,3d8h
575 out dx,al ;turn on video
576
577Skip_Video_On: ;AN006;
578 mov ax,8100H + CritDevice ; Leave Device critical section
579 int int_IBM
580
581 jmp sret
582
583;------------------------------------------------------
584;
585; CONSOLE READ ROUTINE
586;
587CON$READ:
588 JCXZ CON$EXIT
589CON$LOOP:
590 PUSH CX ;SAVE COUNT
591 CALL CHRIN ;GET CHAR IN AL
592 POP CX
593 STOSB ;STORE CHAR AT ES:DI
594 LOOP CON$LOOP
595CON$EXIT:
596 JMP EXIT
597;---------------------------------------------------------
598;
599; INPUT SINGLE CHAR INTO AL
600;
601CHRIN: XOR AX,AX
602 XCHG AL,ALTAH ;GET CHARACTER & ZERO ALTAH
603 OR AL,AL
604 JNZ KEYRET
605
606INAGN: CMP KEYCNT,0
607 JNZ KEY5A
608
609 XOR AH,AH
610 .IF <EXT_16 EQ ON> ; WGR extended interrupt available? ;AN000;
611 MOV AH,10h ; WGR yes..perform extended call ;AN000;
612 INT 16H ; WGR ;AN000;
613 .IF <SWITCH_X EQ OFF> ; WGR /X switch used? ;AN000;
614 CALL CHECK_FOR_REMAP ; WGR no....map to normal call ;AN000;
615 .ENDIF ; WGR ;AN000;
616 CALL SCAN ; WGR check for redefinition ;AN000;
617 .IF NZ AND ; WGR no redefinition?...and ;AN000;
618 .IF <SWITCH_X EQ ON> ; WGR /X switch used? ;AN000;
619 CALL CHECK_FOR_REMAP ; WGR then remap.. ;AN000;
620 OR BX,BX ; WGR reset zero flag for jump test in old code ;AN000;
621 .ENDIF ; WGR ;AN000;
622 .ELSE ; WGR extended interrupt not available ;AN000;
623 INT 16H ; WGR ;AN000;
624 CALL SCAN ; WGR check for redefinition ;AN000;
625 .ENDIF ; WGR ;AN000;
626 JNZ ALT10 ;IF NO MATCH JUST RETURN IT
627
628 DEC CX
629 DEC CX
630 INC BX
631 INC BX
632 .IF <AL EQ 0> OR ; WGR check whether the ;AN000;
633 .IF <AL EQ 0E0H> AND ; WGR keypacket is an extended one? ;AN000;
634 .IF <SWITCH_X EQ 1> ; WGR switch must be set for 0E0h extended ;AN000;
635 DEC CX ; WGR adjust pointers ;AN000;
636 INC BX ; WGR appropiately ;AN000;
637 .ENDIF
638 MOV KEYCNT,CL
639 MOV KEYPTR,BX
640KEY5A: ; Jmp here to get rest of translation
641 CALL KEY5 ;GET FIRST KEY FROM TRANSLATION
642ALT10:
643 OR AX,AX ;Check for non-key after BREAK
644 JZ INAGN
645 OR AL,AL ;SPECIAL CASE?
646 JNZ KEYRET
647 MOV ALTAH,AH ;STORE SPECIAL KEY
648KEYRET: RET
649
650KEY5: MOV BX,KEYPTR ;GET A KEY FROM TRANSLATION TABLE
651 MOV AX,WORD PTR [BX]
652 DEC KEYCNT
653 INC BX
654 OR AL,AL
655 JNZ KEY6
656 INC BX
657 DEC KEYCNT
658KEY6: MOV KEYPTR,BX
659 RET
660
661SCAN: MOV BX,OFFSET BUF
662KEYLP: MOV CL,BYTE PTR [BX]
663 XOR CH,CH
664 OR CX,CX
665 JZ NOTFND
666 .IF <AL EQ 0> OR ; WGR check whether the ;AN000;
667 .IF <AL EQ 0E0H> AND ; WGR keypacket is an extended one. ;AN000;
668 .IF <SWITCH_X EQ ON> ; WGR switch must be set for 0E0h extended ;AN000;
669 CMP AX,WORD PTR [BX+1] ; WGR yes...compare the word ;AN000;
670 .ELSE ; WGR ;AN000;
671 CMP AL,BYTE PTR [BX+1] ; WGR no...compare the byte ;AN000;
672 .ENDIF ; WGR ;AN000;
673 JZ MATCH
674 ADD BX,CX
675 JMP KEYLP
676NOTFND: OR BX,BX
677MATCH: RET
678;--------------------------------------------------------------
679;
680; KEYBOARD NON DESTRUCTIVE READ, NO WAIT
681;
682CON$RDND:
683 MOV AL,[ALTAH]
684 OR AL,AL
685 JNZ RDEXIT
686
687 CMP [KEYCNT],0
688 JZ RD1
689 MOV BX,[KEYPTR]
690 MOV AL,BYTE PTR [BX]
691 JMP SHORT RDEXIT
692
693RD1: MOV AH,1
694 .IF <EXT_16 EQ ON> ; WGR extended INT16 available? ;AN000;
695 ADD AH,10H ; WGR yes....adjust to extended call ;AN000;
696 .ENDIF
697 INT 16H
698 JZ CONBUS
699 OR AX,AX
700 JNZ RD2
701 MOV AH,0
702 .IF <EXT_16 EQ ON> ; WGR extended interrupt available? ;AN000;
703 MOV AH,10h ; WGR yes..perform extended call ;AN000;
704 INT 16H ; WGR ;AN000;
705 .IF <SWITCH_X EQ OFF> ; WGR /X switch used? ;AN000;
706 CALL CHECK_FOR_REMAP ; WGR no....map to normal call ;AN000;
707 .ENDIF ; WGR ;AN000;
708 .ELSE ; WGR ;AN000;
709 INT 16H ; WGR ;AN000;
710 .ENDIF ; WGR ;AN000;
711 JMP CON$RDND
712
713RD2: CALL SCAN
714 .IF NZ AND ; WGR if no redefinition ;AN000;
715 .IF <EXT_16 EQ ON> AND ; WGR and extended INT16 used ;AN000;
716 .IF <SWITCH_X EQ ON> ; WGR and /x used ....then ;AN000;
717 CALL CHECK_FOR_REMAP ; WGR remap to standard call ;AN000;
718 OR BX,BX ; WGR reset zero flag for jump test in old code ;AN000;
719 .ENDIF
720 JNZ RDEXIT
721
722 MOV AL,BYTE PTR [BX+2]
723 CMP BYTE PTR [BX+1],0
724 JNZ RDEXIT
725 MOV AL,BYTE PTR [BX+3]
726RDEXIT: LDS BX,[PTRSAV]
727 MOV [BX].MEDIA,AL
728EXVEC: JMP EXIT
729CONBUS: JMP BUS$EXIT
730;--------------------------------------------------------------
731;
732; KEYBOARD FLUSH ROUTINE
733;
734CON$FLSH:
735 MOV [ALTAH],0 ;Clear out holding buffer
736 MOV [KEYCNT],0
737
738; PUSH DS
739; XOR BP,BP
740; MOV DS,BP ;Select segment 0
741; MOV DS:BYTE PTR 41AH,1EH ; Reset KB queue head pointer
742; MOV DS:BYTE PTR 41CH,1EH ;Reset tail pointer
743; POP DS
744
745Flush: mov ah,1
746 .IF <EXT_16 EQ ON> ; WGR is extended call available? ;AN000;
747 ADD AH,10H ; WGR yes....adjust for extended ;AN000;
748 .ENDIF ; WGR ;AN000;
749 int 16h
750 jz FlushDone
751 mov ah,0
752 .IF <EXT_16 EQ ON> ; WGR is extended call available? ;AN000;
753 ADD AH,10H ; WGR yes....adjust for extended ;AN000;
754 .ENDIF ; WGR ;AN000;
755 int 16h
756 jmp Flush
757FlushDone:
758
759 JMP EXVEC
760;----------------------------------------------------------
761;
762; CONSOLE WRITE ROUTINE
763;
764CON$WRIT:
765 JCXZ EXVEC
766
767CON$LP: MOV AL,ES:[DI] ;GET CHAR
768 INC DI
769 CALL OUTC ;OUTPUT CHAR
770 LOOP CON$LP ;REPEAT UNTIL ALL THROUGH
771 JMP EXVEC
772
773COUT: STI
774 PUSH DS
775 PUSH CS
776 POP DS
777 CALL OUTC
778 POP DS
779 IRET
780
781OUTC: PUSH AX
782 PUSH BX
783 PUSH CX
784 PUSH DX
785 PUSH SI
786 PUSH DI
787 PUSH ES
788 PUSH BP
789
790 MOV [BASE],0B800H
791 XCHG AX,SI ; SAVE CHARACTER TO STUFF
792 MOV AX,40H ; POINT TO ROS BIOS
793 MOV DS,AX
794 MOV AX,DS:[49H] ; AL=MODE, AH=MAX COL
795 DEC AH ; ANSI NEEDS 0-79 OR 0-39
796 MOV WORD PTR CS:[MODE],AX ; SAVE MODE AND MAX COL
797 CMP AL,7
798 JNZ NOT_BW
799 MOV WORD PTR CS:[BASE],0B000H
800NOT_BW: MOV AL,DS:[62H] ; GET ACTIVE PAGE
801 MOV CS:[BPAGE],AL
802 CBW
803 ADD AX,AX
804 MOV BX,AX
805 MOV AX,DS:[BX+50H] ; AL=COL, AH=ROW
806 MOV WORD PTR CS:[COL],AX ; SAVE ROW AND COLUMN
807 MOV AX,DS:[4EH] ; GET START OF SCREEN SEG
808 MOV CL,4
809 SHR AX,CL ; CONVERT TO A SEGMENT
810 PUSH CS
811 POP DS
812 MOV [SCREEN_SEG],AX
813 XCHG AX,SI ; GET BACK CHARACTER IN AL
814
815 CALL VIDEO
816 POP BP
817 POP ES
818 POP DI
819 POP SI
820 POP DX
821 POP CX
822 POP BX
823 POP AX
824 RET
825
826
827;----------------------------------------------------------
828;
829; OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE
830;
831VIDEO: MOV SI,OFFSET STATE
832 JMP [SI]
833
834S2: CMP AL,'['
835 JZ S22
836 JMP S1
837S22: MOV WORD PTR [SI],OFFSET S3
838 XOR BX,BX
839 MOV WORD PTR INQ,BX
840 JMP SHORT S3B
841
842S3: CMP AL,';'
843 JNZ S3C
844S3A: INC PRMCNT
845S3B: CALL GETPTR
846 XOR AX,AX
847 MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO
848 RET
849
850S3C: CMP AL,'0'
851 JB S3D
852 CMP AL,'9'
853 JA S3D
854 CALL GETPTR
855 SUB AL,'0'
856 XCHG AL,BYTE PTR [BX]
857 MOV AH,10
858 MUL AH ;*10
859 ADD BYTE PTR [BX],AL ;MOVE IN DIGIT
860 RET
861
862S3D: CMP AL,'='
863 JZ S3RET
864 CMP AL,'?'
865 JZ S3RET
866 CMP AL,'"' ;BEGIN QUOTED STRING
867 JZ S3E
868 CMP AL,"'"
869 JNZ S7
870S3E: MOV WORD PTR [SI],OFFSET S4
871 MOV [INQ],AL
872S3RET: RET
873
874;
875; ENTER QUOTED STRINGS
876;
877
878S4: CMP AL,[INQ] ;CHECK FOR STRING TERMINATOR
879 JNZ S4A
880 DEC PRMCNT ;TERMINATE STRING
881 MOV WORD PTR [SI],OFFSET S3
882 RET
883
884S4A: CALL GETPTR
885 MOV BYTE PTR [BX],AL
886 MOV WORD PTR [SI],OFFSET S4
887 JMP S3A
888;
889; LOOK FOR ANSI COMMAND SPECIFIED IN AL
890;
891
892S7: MOV BX,OFFSET CMDTABL-3
893;
894S7A: ADD BX,3
895 CMP BYTE PTR [BX],0
896 JZ S1B
897 CMP BYTE PTR [BX],AL
898 JNZ S7A
899;
900S7B: MOV AX,WORD PTR [BX+1] ;AX = JUMP ADDRESS
901 MOV BX,OFFSET BUF
902 INC BX
903 ADD BX,ASNPTR ;BX = PTR TO PARM LIST
904 MOV DL,BYTE PTR [BX]
905 XOR DH,DH ;DX = FIRST PARAMETER
906 MOV CX,DX
907 OR CX,CX
908 JNZ S7C
909 INC CX ;CX = DX, CX=1 IF DX=0
910S7C: JMP AX ;AL = COMMAND
911
912S1: CMP AL,ESC_CHAR ;ESCAPE SEQUENCE?
913 JNZ S1B
914 MOV WORD PTR [SI],OFFSET S2
915 RET
916
917S1B: CALL CHROUT
918S1A: MOV WORD PTR [STATE],OFFSET S1
919 RET
920
921MOVCUR: CMP BYTE PTR [BX],AH
922 JZ SETCUR
923 ADD BYTE PTR [BX],AL
924 LOOP MOVCUR
925SETCUR: MOV DX,WORD PTR COL
926 XOR BX,BX
927 MOV AH,2
928 INT 16
929 JMP S1A
930
931CUP: .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
932 CMP CL,DEFAULT_LENGTH ; WGR ;AN000;
933 .ELSE ; WGR ;AN000;
934 CMP CL,BYTE PTR [REQ_TXT_LENGTH] ; WGR ;AN000;
935 .ENDIF ; WGR ;AN000;
936 JA SETCUR
937 MOV AL,MAXCOL
938 MOV CH,BYTE PTR [BX+1]
939 OR CH,CH
940 JZ CUP1
941 DEC CH
942CUP1: CMP AL,CH
943 JA CUP2
944 MOV CH,AL
945CUP2: XCHG CL,CH
946 DEC CH
947 MOV WORD PTR COL,CX
948 JMP SETCUR
949
950CUF: MOV AH,MAXCOL
951 MOV AL,1
952CUF1: MOV BX,OFFSET COL
953 JMP MOVCUR
954
955CUB: MOV AX,00FFH
956 JMP CUF1
957
958CUU: MOV AX,00FFH
959CUU1: MOV BX,OFFSET ROW
960 JMP MOVCUR
961
962CUD: .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
963 MOV AH,DEFAULT_LENGTH ; WGR ;AN000;
964 .ELSE ; WGR ;AN000;
965 MOV AH,BYTE PTR [REQ_TXT_LENGTH] ; WGR ;AN000;
966 .ENDIF ; WGR ;AN000;
967 MOV AL,1 ; WGR ;AN000;
968 JMP CUU1
969
970ExtKey: ;AN003;
971 cmp dl, 0 ;AN003; DL = previous parameter
972 jne ExtKey_1 ;AN003;
973 mov Switch_X, OFF ;AN003; reset it if 0.
974 jmp S1A ;AN003;
975ExtKey_1: ;AN003;
976 cmp dl, 1 ;AN003; 1 ?
977 je SetExtKey ;AN003;
978 jmp S1A ;AN003; ignore it
979SetExtKey: ;AN003;
980 mov Switch_X, ON ;AN003; set it if 1.
981 jmp S1A ;AN003;
982
983PSCP: MOV AX,WORD PTR COL
984 MOV SAVCR,AX
985 JMP SETCUR
986
987PRCP: MOV AX,SAVCR
988 MOV WORD PTR COL,AX
989 JMP SETCUR
990
991SGR: XOR CX,CX
992 XCHG CL,PRMCNT
993 CALL GETPTR
994 INC CX
995SGR1: MOV AL,BYTE PTR [BX]
996 PUSH BX
997 MOV BX,OFFSET GRMODE
998SGR2: MOV AH,BYTE PTR [BX]
999 ADD BX,3
1000 CMP AH,0FFH
1001 JZ SGR3
1002 CMP AH,AL
1003 JNZ SGR2
1004 MOV AX,WORD PTR [BX-2]
1005 AND ATTR,AL
1006 OR ATTR,AH
1007SGR3: POP BX
1008 INC BX
1009 LOOP SGR1
1010 JMP SETCUR
1011
1012ED: XOR CX,CX
1013 MOV WORD PTR COL,CX
1014 MOV DH,30 ; ;AN009;
1015 MOV AL,MODE ; ;AN009;
1016 CMP AL,11H ; ;AN009;
1017 JE ERASE ; ;AN009;
1018 CMP AL,12H ; ;AN009;
1019 JE ERASE ; ;AN009;
1020 .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
1021 MOV DH,DEFAULT_LENGTH ; WGR ;AN000;
1022 .ELSE ; WGR ;AN000;
1023 MOV DH,BYTE PTR [REQ_TXT_LENGTH] ; WGR ;AN000;
1024 .ENDIF ; WGR ;AN000;
1025ERASE: MOV DL,MAXCOL
1026 .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR if we are in a graphics mode.. ;AN000;
1027 XOR BH,BH ; WGR then use 0 as attribute... ;AN000;
1028 .ELSE ; WGR else... ;AN000;
1029 MOV BH,ATTR ; WGR ...use active attribute ;AC000;
1030 .ENDIF ; WGR ;AN000;
1031 MOV AX,0600H
1032 INT 16
1033ED3: JMP SETCUR
1034
1035EL: MOV CX,WORD PTR COL
1036 MOV DH,CH
1037 JMP ERASE
1038
1039BIN2ASC:MOV DL,10
1040 INC AL
1041 XOR AH,AH
1042 DIV DL
1043 ADD AX,'00'
1044 RET
1045DSR: MOV AH,REQ_CRSR_POS ; WGR ;AN000;
1046 PUSH BX ; WGR ;AN000;
1047 XOR BH,BH ; WGR ;AN000;
1048 INT 10H ; WGR ;AN000;
1049 POP BX ; WGR ;AN000;
1050 PUSH DX ; WGR ;AN000;
1051 MOV AL,DH ;REPORT CURRENT CURSOR POSITION
1052 CALL BIN2ASC
1053 MOV WORD PTR REPORT+2,AX
1054 POP DX ; WGR ;AN000;
1055 MOV AL,DL ; WGR ;AN000;
1056 CALL BIN2ASC
1057 MOV WORD PTR REPORT+5,AX
1058 MOV [KEYCNT],9
1059 MOV [KEYPTR],OFFSET REPORT
1060CPR: JMP S1A
1061
1062RM: MOV CL,1
1063 JMP SHORT SM1
1064
1065SM: XOR CX,CX
1066SM1: MOV AL,DL
1067 .IF <AL LT MODE7> OR ;; WGR check to see if valid mode.. ;AN000;
1068 .IF <AL GE MODE13> AND ;; WGR (0-6,13-19) ;AN000;
1069 .IF <AL LE MODE19> ;; WGR ;AN000;
1070 .IF <BIT HDWR_FLAG AND LCD_ACTIVE> ;; WGR is this the LCD? ;AN000;
1071 PUSH DS ;; WGR yes... ;AN000;
1072 PUSH AX ;; WGR save mode ;AN000;
1073 MOV AX,ROM_BIOS ;; WGR ;AN000;
1074 MOV DS,AX ;; WGR get equipment status flag.. ;AN000;
1075 MOV AX,DS:[EQUIP_FLAG] ;; WGR ;AN000;
1076 AND AX,INIT_VID_MASK ;; WGR clear initial video bits.. ;AN000;
1077 OR AX,LCD_COLOR_MODE ;; WGR .....set bits as color ;AN000;
1078 MOV DS:[EQUIP_FLAG],AX ;; WGR replace updated flag. ;AN000;
1079 POP AX ;; WGR restore mode. ;AN000;
1080 POP DS ;; WGR ;AN000;
1081 .ENDIF ;; WGR ;AN000;
1082 MOV AH,SET_MODE ;; WGR yes....set mode.. ;AN000;
1083 INT 10H ;; WGR ;AN000;
1084 .ELSE ;; WGR no...check for 7 (wrap at EOL) ;AN000;
1085 .IF <AL EQ 7> ;; WGR ;AN000;
1086 MOV [WRAP],CL ;; WGR yes....wrap... ;AN000;
1087 .ENDIF ;; WGR ;AN000;
1088 .ENDIF ;; WGR ;AN000;
1089 JMP CPR
1090
1091KEYASN: XOR DX,DX
1092 XCHG DL,PRMCNT ;GET CHARACTER COUNT
1093 INC DX
1094 INC DX
1095
1096 CALL GETPTR
1097 MOV AX,WORD PTR [BX] ;GET CHARACTER TO BE ASSIGNED
1098 CALL SCAN ;LOOK IT UP
1099 JNZ KEYAS1
1100
1101 MOV DI,BX ;DELETE OLD DEFINITION
1102 SUB ASNPTR,CX
1103 MOV KEYCNT,0 ; This delete code shuffles the
1104 ; key definition table all around.
1105 ; This will cause all sorts of trouble
1106 ; if we are in the middle of expanding
1107 ; one of the definitions being shuffled.
1108 ; So shut off the expansion.
1109 MOV SI,DI
1110 ADD SI,CX
1111 MOV CX,OFFSET BUF+ASNMAX
1112 SUB CX,SI
1113 CLD
1114 PUSH ES ;SAVE USER'S ES
1115 PUSH CS
1116 POP ES ;SET UP ES ADDRESSABILITY
1117 REP MOVSB
1118 POP ES ;RESTORE ES
1119
1120KEYAS1: CALL GETPTR
1121 CMP DL,3
1122 JB KEYAS3
1123 MOV BYTE PTR [BX-1],DL ;SET LENGTH
1124 ADD ASNPTR,DX ;REMEMBER END OF LIST
1125 ADD BX,DX
1126 CMP ASNPTR,ASNMAX ; Too much???
1127 JB KEYAS3 ; No
1128 SUB BX,DX ; Next three instructions undo the above
1129 SUB ASNPTR,DX
1130KEYAS3: MOV BYTE PTR [BX-1],00
1131 MOV STATE,OFFSET S1 ;RETURN
1132 RET
1133
1134GETPTR: MOV BX,ASNPTR
1135 INC BX
1136 ADD BX,PRMCNTW
1137 CMP BX,ASNMAX + 8
1138 JB GET1
1139 DEC PRMCNT
1140 JMP GETPTR
1141GET1: ADD BX,OFFSET BUF
1142 RET
1143
1144
1145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
1146; WGR ;AN000;
1147; CHECK_FOR_REMAP: WGR ;AN000;
1148; WGR ;AN000;
1149; This function esnures that the keypacket WGR ;AN000;
1150; passed to it in AX is mapped to a standard INT16h call WGR ;AN000;
1151; WGR ;AN000;
1152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
1153 ;AN000;
1154CHECK_FOR_REMAP PROC NEAR ; WGR ;AN000;
1155 .IF <AL EQ 0E0h> ; WGR is this an extended key? ;AN000;
1156 OR AH,AH ; WGR probably...but check for alpha character ;AN000;
1157 .IF NZ ; WGR if it's not an alpha character ....then ;AN000;
1158 XOR AL,AL ; WGR map extended to standard ;AN000;
1159 .ENDIF ; WGR ;AN000;
1160 .ENDIF ; WGR ;AN000;
1161 RET ; WGR ;AN000;
1162CHECK_FOR_REMAP ENDP ; WGR ;AN000;
1163
1164
1165BUF DB 4,00,72H,16,0
1166 DB ASNMAX+8-5 DUP (?)
1167
1168CODE ENDS
1169 END
diff --git a/v4.0/src/DEV/ANSI/ANSI.INC b/v4.0/src/DEV/ANSI/ANSI.INC
new file mode 100644
index 0000000..ff0a217
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/ANSI.INC
@@ -0,0 +1,312 @@
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2;
3; Equates and Strucs.
4;
5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6;------------------------------------------------------------------------------
7;AN001; D425 For OS2 compatibiltiy box, /L option status query 01/14/88 J.K.
8;AN002; D493 New INIT request structure for error message 02/25/88 J.K.
9;AN003; P4934 Change ANSI 2F function number t0 1Ah 05/20/88 F.G.
10;------------------------------------------------------------------------------
11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12;
13; DEVICE Header DS:[SI] -- to locate the next CON header
14; NEXT device header ES:[DI]
15;
16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17HP EQU DS:[SI] ; ;AN000;
18NHD EQU ES:[DI] ; ;AN000;
19 ;
20NAME_LEN EQU 8 ; ;AN000;
21 ;
22DHS STRUC ; ;AN000;
23DH_NEXTO DW ? ; offset of pointer to next header ;AN000;
24DH_NEXTS DW ? ; segment of pointer to next header ;AN000;
25 DW ? ; attribute ;AN000;
26DH_STRAO DW ? ; offset to strategy routine ;AN000;
27DH_INTRO DW ? ; offset to interrupt routine ;AN000;
28DH_NAME DB NAME_LEN DUP(0) ; device name in this header ;AN000;
29DHS ENDS ; end of common portion ;AN000;
30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31;
32; CON data structure CS:[BX]
33;
34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35CONPTR EQU CS:[BX] ; ;AN000;
36 ; STATES ;AN000;
37BUF_DATA STRUC ; ;AN000;
38DEV_HDRO DW -1 ; device driver header offset ;AN000;
39DEV_HDRS DW -1 ; ;AN000;
40CON_STRAO DW -1 ; dos CON strategy offset ;AN000;
41CON_STRAS DW -1 ; ;AN000;
42CON_INTRO DW -1 ; dos CON strategy offset ;AN000;
43CON_INTRS DW -1 ; ;AN000;
44BUF_DATA ENDS ; ;AN000;
45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
46;
47; INIT Structures and equates
48;
49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
50ROM_BIOS EQU 40h ; Segment of ROM_BIOS data area ;AN000;
51EQUIP_FLAG EQU 10h ; equipment flag. (for LCD) ;AN000;
52KBD_FLAG_3 EQU 96h ; offset of KBD_FLAG_3 in data area ;AN000;
53NUM_ROWS EQU 84h ; offset of number of rows in data area;AN000;
54EXT16_FLAG EQU 00010000b ; mask for Extended INT16 bit ;AN000;
55INIT_VID_MASK EQU 0FFCFh ; mask for equipment list ;AN000;
56LCD_COLOR_MODE EQU 20h ; LCD as color ;AN000;
57LCD_MONO_MODE EQU 30h ; LCD as MONOchrome ;AN000;
58UNKNOWN_CMD EQU 8103H ; unknown command status byte ;AN000;
59RC_EOL EQU -1 ; parser return code for EOL ;AN000;
60RC_NO_ERROR EQU 0 ; parser return code for not in switch list ;AN000;
61INVALID_PARM EQU 10 ; PARSE Invalid parameter message number ;AN000;
62SSTRING EQU 3 ; PARSE Too many parameters message ;AN000;
63FUNC_CALL EQU 1BH ; VGA functionality call ;AN000;
64ALT_SELECT EQU 12H ; EGA alternate select call ;AN000;
65EGA_INFO EQU 10H ; EGA return information subcall ;AN000;
66ALT_PRT_SC EQU 20H ; select alternate print screen subcall;AN000;
67MONOCHROME EQU 1 ; monochrome attached to EGA ;AN000;
68COLOR EQU 0 ; some color attached to EGA ;AN000;
69PS2_MONO EQU 7 ; display adapter types... ;AN000;
70PS2_COLOR EQU 8 ; ;AN000;
71MOD30_MONO EQU 0BH ; ;AN000;
72MOD30_COLOR EQU 0CH ; ;AN000;
73LCD_MODEL EQU 0F9H ; Convertible model byte value ;AN000;
74GET_SYS_ID EQU 0C0H ; INT15H call for system identification;AN000;
75GET_STATUS EQU 43H ; read system status (Convertible) ;AN000;
76MONO_ADDRESS EQU 0B000H ; base address for monochrome ;AN000;
77COLOR_ADDRESS EQU 0B800H ; base address for CGA ;AN000;
78UNOCCUPIED EQU -1 ; value in VIDEO_MODE_TABLE if space unused ;AN000;
79LCD_ACTIVE EQU 00000001B ; LCD adapter is present ;AN000;
80MONO_ACTIVE EQU 00000010B ; monochrome adapter is present ;AN000;
81CGA_ACTIVE EQU 00000100B ; CGA adapter is present ;AN000;
82MCGA_ACTIVE EQU 00001000B ; MCGA is present ;AN000;
83E5151_ACTIVE EQU 00010000B ; EGA with monochrome is present ;AN000;
84E5153_ACTIVE EQU 00100000B ; EGA with color display is present ;AN000;
85E5154_ACTIVE EQU 01000000B ; EGA with enhanced color display is present ;AN000;
86VGA_ACTIVE EQU 10000000B ; VGA is present ;AN000;
87INT10_LOW EQU (4*10H) ; interrupt 10 vector location ;AN000;
88INT10_HI EQU (4*10H)+2 ; ;AN000;
89INT2F_LOW EQU (4*2FH) ; interrupt 2F vector location ;AN000;
90INT2F_HI EQU (4*2FH)+2 ; ;AN000;
91ONE EQU 1 ; ;AN000;
92THREE EQU 3 ; ;AN000;
93EIGHT EQU 8 ; ;AN000;
94NINE EQU 9 ; ;AN000;
95FOURTEEN EQU 14 ; ;AN000;
96REQ_CRSR_POS EQU 3 ; function call to return cursor position ;AN000;
97MODE7 EQU 7 ; ;AN000;
98MODE13 EQU 13 ; ;AN000;
99MODE15 EQU 15 ; ;AN000;
100MODE19 EQU 19 ; ;AN000;
101 ; ;AN000;
102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000;
103;
104; Request Header Structure (INIT)
105;
106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
107INIT_REQ_HDR STRUC ; INIT Request header structure ;AN000;
108 DB 13 DUP(?) ; standard request header ;AN000;
109NUM_UNITS DB ? ; number of units (N/A) ;AN000;
110END_ADDRESS_O DW ? ; ending address of resident code ;AN000;
111END_ADDRESS_S DW ? ; ;AN000;
112ARG_PTR DD ? ; ptr. to remaining arguments ;AN000;
113DRIVE_NUM DB ? ; drive number (N/A) ;AN000;
114CONFIG_ERRMSG dw 0 ;Flag to control "Error in CONFIG.SYS.." msg.;AN002;
115INIT_REQ_HDR ENDS ; ;AN000;
116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117;
118; Information Block Structure
119; (for functionality call)
120;
121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
122INFO_BLOCK STRUC ; information block for functionality call ;AN000;
123STATIC_ADDRESS DD ? ; address of static functionality table ;AN000;
124 DB 33 DUP(?) ; don't care ;AN000;
125ACTIVE_DISPLAY DB ? ; active display code ;AN000;
126ALT_DISPLAY DB ? ; alternate display code ;AN000;
127 DB 3 DUP(?) ; don't care ;AN000;
128CURRENT_SCANS DB ? ; current number of scan lines ;AN000;
129 DB 2 DUP(?) ; don't care ;AN000;
130MISC_INFO DB ? ; miscellaneous state information ;AN000;
131 DB 18 DUP(?) ; don't care ;AN000;
132INFO_BLOCK ENDS ; ;AN000;
133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
134;
135; Video table entry structure
136;
137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
138MODE_TABLE STRUC ; ;AN000;
139V_MODE DB -1 ; video mode ;AN000;
140D_MODE DB -1 ; display mode ;AN000;
141RESERVED_BYTE DB 0 ; reserved ;AN000;
142COLORS DW -1 ; colors ;AN000;
143SCR_WIDTH DW -1 ; screen width (pels) ;AN000;
144SCR_LENGTH DW -1 ; screen length (pels) ;AN000;
145SCR_COLS DW -1 ; number columns ;AN000;
146SCR_ROWS DW -1 ; number rows ;AN000;
147MODE_TABLE ENDS ; ;AN000;
148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149;
150; Structure of Static Block
151; (for functionality call
152;
153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
154STATIC_BLOCK STRUC ; format of static functionality table ;AN000;
155 DB 7 DUP(?) ; don't care ;AN000;
156SCAN_TEXT DB ? ; available scan lines in text modes ;AN000;
157STATIC_BLOCK ENDS ; ;AN000;
158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
159;
160; Structure of System ID call return block
161;
162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
163SYS_ID STRUC ; format of return system config data ;AN000;
164 DW ? ; don't care ;AN000;
165MODEL_BYTE DB ? ; model byte ;AN000;
166SYS_ID ENDS ; ;AN000;
167
168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
169;
170; INT2f Strucs and Equates
171;
172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
173MULT_ANSI EQU 1Ah ; ANSI multiplex number ;AC003;
174;Catagory code
175INSTALL_CHECK EQU 0 ; install check for ANSI ;AN000;
176IOCTL_2F EQU 1 ; 2F interface to IOCTL ;AN000;
177DA_INFO_2F EQU 2h ;J.K. Information passing to ANSI.
178;Subfunction code for IOCTL_2F
179GET_SUBFUNC EQU 7FH ; WGR Same structure as GET_IOCTL(ANSI);AN000;
180
181;Info Struture for DA_INFO_2F. (DS:DX point to this packet)
182;J.K. Note: For DOS 4.00, DA_INFO_PACKET is used by DISPLAY.SYS to signal ANSI.SYS that
183;DISPLAY.SYS is calling/finishing INT 10h SET MODE call. ANSI.SYS needs this
184;infomration since it also hooks INT 10h vector.
185;For this DA_SETMODE_FLAG purpose, DA_INFO_LEVEL and DA_INFO_DIRECTION should always be
186;set to 0. This can be extended for another information passing scheme between
187;DISPLAY.SYS and ANSI.SYS in the future version.
188;For DA_SETMODE_FLAG, DISPLAY.SYS should be extremely careful that when it calls
189;with DA_SETMODE_FLAG =1, then it should calls with DA_SETMODE_FLAG=0
190;when it finished INT 10h function call. Otherwise, the system goes .....
191;
192;D425. At the request of OS2 compatibility box, when the user ask to ANSI
193; with DA_INFO_LEVEL=1, then ANSI sets DA_OPTION_L_STATE based on /L option
194; status.
195
196DA_INFO_PACKET struc
197DA_INFO_LEVEL db 0 ; 0=used for SET_MODE_FLAG 1=for OPTION_L_STATE
198DA_SETMODE_FLAG db 0 ; 1: DISPLAY.SYS is calling INT 10h call, SET MODE. 0=finished.
199DA_OPTION_L_STATE db 0 ; 1 = /L active, 0 = /L inactive
200DA_INFO_PACKET ends
201
202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
203;
204; GENERIC IOCTL Strucs and Equates
205;
206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
207 ; ;AN000;
208DISPLAY_TYPE EQU 3 ; MAJ_FUNC type for display ;AN000;
209GET_FUNC EQU 7FH ; MIN_FUNC for get subfunction ;AN000;
210SET_FUNC EQU 5FH ; MIN_FUNC for set subfunction ;AN000;
211REQ_VID_MODE EQU 0FH ; request video mode INT10h function call ;AN000;
212DONE EQU 0100H ; set done bit for IOCTL status ;AN000;
213CMD_ERROR EQU 8000H ; set error bit for IOCTL status ;AN000;
214INVALID_FUNC EQU 1 ; invalid function ;AN000;
215NOT_SUPPORTED EQU 10 ; return code non-supported ioctl function ;AN000;
216NOT_AVAILABLE EQU 12 ; return code for font not available ;AN000;
217TEXT_MODE EQU 1 ; text mode = 1 in request packet ;AN000;
218GRAPHICS_MODE EQU 2 ; graphics mode = 2 ;AN000;
219DEFAULT_LENGTH EQU 25 ; normal screen length ;AN000;
220OFF EQU 0000H ; ;AN000;
221ON EQU 0001H ; ;AN000;
222INT_BIT EQU 00100000b ; mask for int. bit from functionality call ;AN000;
223FOUND EQU 1 ; flag value for FOUND ;AN000;
224NOT_FOUND EQU 0 ; flag value for not FOUND ;AN000;
225SET_MODE EQU 0 ; set mode INT10H function number ;AN000;
226DISPLAY_CHECK EQU 0AD00H ; install check for DISPLAY.SYS ;AN000;
227CHECK_ACTIVE EQU 0AD02H ; active code page check for DISPLAY.SY;AN000;
228INSTALLED EQU 0FFH ; present in AL if installed ;AN000;
229LOAD_8X8 EQU 1112H ; register value for 8x8 ROM load ;AN000;
230SET_BLOCK_0 EQU 1103H ; activate block = 0. ;AN000;
231CHECK_FOR_FONT EQU 0AD10H ; check for 8x8 RAM font - DISPLAY.SYS ;AN000;
232SELECT_SCAN EQU 30H ; subfunction to set scan lines (VGA) ;AN000;
233SET_INTENSIFY EQU 0 ; value to enable intensify. ;AN000;
234SET_BLINK EQU 1 ; value to enable blink. ;AN000;
235BLINK_TOGGLE EQU 1003H ; INT10 call to toggle int/blink bit. ;AN000;
236CURSOR_FLAG EQU 87H ; cursor flag byte in ROM_BIOS ;AN000;
237SET_CURSOR_CALL EQU 1 ; INT10 function call to set cursor typ;AN000;
238VIDEO_MASK EQU 7FH ; turn of clear buffer bit of mode value ;AN000;
239MULT_ANSI EQU 1Ah ; ANSI multiplex number ;AC003;
240INSTALL_CHECK EQU 0 ; install check for ANSI ;AN000;
241IOCTL_2F EQU 1 ; 2F interface to IOCTL ;AN000;
242NOT_CY EQU 0FFFEH ; turn carry bit off ;AN000;
243CY EQU 1 ; turn carry bit off ;AN000;
244INVALID_FLAGS EQU 0FFFEH ; test for invalid flags in control word ;AN000;
245TURN_OFF EQU 0FEH ; values to turn off and on cursor.. ;AN000;
246TURN_ON EQU NOT TURN_OFF ; emulation ;AN000;
247SUB_SIZE EQU 11 ; sublist size ;AN000;
248LEFT_ASCIIZ EQU 00010000B ; left-aligned asciiz string ;AN000;
249UNLIMITED EQU 0 ; unlimited message size. ;AN000;
250 ; ;AN000;
251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
252;
253; Request Header Structure (Generic IOCTL)
254;
255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
256INIT_REQ_HDR STRUC ; ;AN000;
257 DB 13 DUP(?) ; standard request header ;AN000;
258MAJ_FUNC DB ? ; major function ;AN000;
259MIN_FUNC DB ? ; minor function ;AN000;
260IOCTL_SI DW ? ; contents of SI ;AN000;
261IOCTL_DI DW ? ; contents of DI ;AN000;
262REQ_PCKT_PTR DD ? ; pointer to request packet ;AN000;
263INIT_REQ_HDR ENDS ; ;AN000;
264;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
265;
266; REQUEST PACKET STRUCTURE (Generic IOCTL)
267;
268;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
269REQ_PCKT STRUC ; ;AN000;
270INFO_LEVEL DB ? ; information level (should be 0) ;AN000;
271 DB ? ; reserved ;AN000;
272DATA_LENGTH DW ? ; length of remaining data ;AN000;
273RP_FLAGS DW ? ; control flags ;AN000;
274RP_MODE DB ? ; display mode ;AN000;
275RESERVED2 DB ? ; reserved ;AN000;
276RP_COLORS DW ? ; # of colors ;AN000;
277RP_WIDTH DW ? ; screen width ;AN000;
278RP_LENGTH DW ? ; screen length ;AN000;
279RP_COLS DW ? ; columns ;AN000;
280RP_ROWS DW ? ; rows ;AN000;
281REQ_PCKT ENDS ; ;AN000;
282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
283;
284; Scan Lines available structure
285;
286;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
287SCAN_LINE_STR STRUC ; ;AN000;
288NUM_LINES DW ? ; number of scan lines ;AN000;
289REP_1BH DB ? ; representation in 1Bh call ;AN000;
290REP_12H DB ? ; representation in 12h call ;AN000;
291SCAN_LINE_STR ENDS ; ;AN000;
292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
293;
294; SUBLIST struc
295;
296;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
297SUB_STRUC STRUC ; ;AN000;
298 DB 2 DUP(?) ; ;AN000;
299SUB_PTR_O DW ? ; ;AN000;
300SUB_PTR_S DW ? ; ;AN000;
301SUB_STRUC ENDS ; ;AN000;
302;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
303;
304; RESULT BUFFER struc
305;
306;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
307RESULT_STRUC STRUC ; ;AN000;
308RESULT_TYPE DB ? ; ;AN000;
309 DB ? ; ;AN000;
310RES_SYN_PTR DW ? ; ;AN000;
311RES_PTR DD ? ; ;AN000;
312RESULT_STRUC ENDS ; ;AN000;
diff --git a/v4.0/src/DEV/ANSI/ANSI.LNK b/v4.0/src/DEV/ANSI/ANSI.LNK
new file mode 100644
index 0000000..1099d81
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/ANSI.LNK
@@ -0,0 +1,8 @@
1ANSI.OBJ+
2 IOCTL.OBJ+
3 ANSIINIT.OBJ+
4 PARSER.OBJ
5ANSI.EXE
6ANSI.MAP /M
7;
8 \ No newline at end of file
diff --git a/v4.0/src/DEV/ANSI/ANSI.SKL b/v4.0/src/DEV/ANSI/ANSI.SKL
new file mode 100644
index 0000000..d797678
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/ANSI.SKL
@@ -0,0 +1,16 @@
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2;
3; Message Skeleton file for ANSI.SYS
4;
5; Author: WGR
6;
7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
9:util ANSI ; utility name
10
11:class A
12:use 1 COMMON1 ; 'Incorrect DOS version'
13:def 10 "Invalid parameter - %1",CR,LF ; 'Invalid parameter'
14
15:end
16 \ No newline at end of file
diff --git a/v4.0/src/DEV/ANSI/ANSIINIT.ASM b/v4.0/src/DEV/ANSI/ANSIINIT.ASM
new file mode 100644
index 0000000..352150e
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/ANSIINIT.ASM
@@ -0,0 +1,413 @@
1PAGE ,132
2TITLE ANSI Console device CON$INIT routine
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;
6; MODULE_NAME: CON$INIT
7;
8; FUNCTION:
9; THIS PROCEDURE PERFORMS ALL NECESSARY INITIALIZATION ROUTINES
10; FOR ANSI.SYS.
11;
12; THIS ROUTINE WAS SPLIT FROM THE ORIGINAL ANSI.ASM SOURCE FILE
13; FOR RELEASE 4.00 OF DOS. ALL CHANGED LINES HAVE BEEN MARKED WITH
14; WGR. NEW PROCS HAVE BEEN MARKED AS SUCH.
15;
16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17;AN001; P1767 VIDEO_MODE_TABLE not initialized correctly 10/16/87 J.K.
18;AN002; P2617 Order dependecy problem with Display.sys 11/23/87 J.K.
19;AN003; D479 An option to disable the extended keyboard functions 02/12/88 J.K.
20;AN004; D493 New INIT request structure for error message 02/25/88 J.K.
21;-------------------------------------------------------------------------------
22
23INCLUDE ANSI.INC ; WGR equates and strucs ;AN000;
24.XLIST
25INCLUDE STRUC.INC ; WGR structured macros ;AN000;
26.LIST
27
28PUBLIC CON$INIT ; WGR ;AN000;
29
30
31CODE SEGMENT PUBLIC BYTE
32 ASSUME CS:CODE,DS:CODE
33
34EXTRN VIDEO_MODE_TABLE:BYTE ; WGR ;AN000;
35EXTRN FUNC_INFO:BYTE ; WGR ;AN000;
36EXTRN HDWR_FLAG:WORD ; WGR ;AN000;
37EXTRN VIDEO_TABLE_MAX:ABS ; WGR ;AN000;
38EXTRN SCAN_LINES:BYTE ; WGR ;AN000;
39EXTRN PTRSAV:DWORD ; WGR ;AN000;
40EXTRN PARSE_PARM:NEAR ; WGR ;AN000;
41EXTRN ERR2:NEAR ; WGR ;AN000;
42EXTRN EXT_16:BYTE ; WGR ;AN000;
43EXTRN BRKADR:ABS ; WGR ;AN000;
44EXTRN BRKKY:NEAR ; WGR ;AN000;
45EXTRN COUT:NEAR ; WGR ;AN000;
46EXTRN BASE:WORD ; WGR ;AN000;
47EXTRN MODE:BYTE ; WGR ;AN000;
48EXTRN MAXCOL:BYTE ; WGR ;AN000;
49EXTRN TRANS:ABS ; WGR ;AN000;
50EXTRN STATUS:ABS ; WGR ;AN000;
51EXTRN EXIT:NEAR ; WGR ;AN000;
52EXTRN MAX_SCANS:BYTE ; WGR ;AN000;
53EXTRN ROM_INT10:WORD ; WGR ;AN000;
54EXTRN INT10_COM:NEAR ; WGR ;AN000;
55EXTRN ROM_INT2F:WORD ; WGR ;AN000;
56EXTRN INT2F_COM:NEAR ; WGR ;AN000;
57EXTRN ABORT:BYTE ; WGR ;AN000;
58extrn Display_Loaded_Before_me:byte ;AN002;Defined in IOCTL.ASM
59extrn Switch_K:Byte ;AN003;
60
61INCLUDE ANSIVID.INC ; WGR video tables data ;AN000;
62
63CON$INIT:
64 LDS BX,CS:[PTRSAV] ; WGR establish addressability to request header ;AC000;
65 LDS SI,[BX].ARG_PTR ; WGR DS:SI now points to rest of DEVICE=statement;AN000;
66 CALL PARSE_PARM ; WGR parse DEVICE= command line ;AN000;
67 JNC CONT_INIT ; WGR no error in parse...continue install ;AN000;
68 LDS BX,CS:[PTRSAV] ; WGR prepare to abort install ;AC000;
69 XOR AX,AX ; WGR ;AC000;
70 MOV [BX].NUM_UNITS,AL ; WGR set number of units to zero ;AC000;
71 MOV [BX].END_ADDRESS_O,AX ; WGR set ending address offset to 0 ;AC000;
72 MOV [BX].END_ADDRESS_S,CS ; WGR set ending address segment to CS ;AC000;
73 mov word ptr [bx].CONFIG_ERRMSG, -1 ;AN004; Let IBMBIO display "Error in CONFIG.SYS..".
74 MOV AX,UNKNOWN_CMD ; WGR set error in status ;AC000;
75 MOV WORD PTR [BX].STATUS,AX ; WGR set error status ;AC000;
76 JMP ERR2 ; WGR prepare to exit ;AN000;
77
78CONT_INIT: ; WGR ;AN000;
79 PUSH CS ; WGR ;AN000;
80 POP DS ; WGR restore DS to ANSI segment ;AN000;
81 MOV AX,ROM_BIOS ; WGR ;AN000;
82 MOV ES,AX ; WGR DS now points to BIOS data area ;AN000;
83 MOV AH,ES:[KBD_FLAG_3] ; WGR load AH with KBD_FLAG_3 ;AN000;
84 .IF <BIT AH AND EXT16_FLAG> AND ; WGR see if extended INT16 is loaded ;AN000;
85 .IF <Switch_K EQ OFF> ;The user does not want to disable the extended INT 16h ;AN003;
86 MOV EXT_16,ON ; WGR extended INT16 available, set flag ;AN000;
87 .ENDIF ; WGR ;AN000;
88 CALL DET_HDWR ; WGR procedure to determine video hardware status;AN000;
89 .IF <HDWR_FLAG GE MCGA_ACTIVE> ; WGR if we have EGA or better then.. ;AN000;
90 MOV AH,ALT_SELECT ; WGR issue select alternate print.. ;AN000;
91 MOV BL,ALT_PRT_SC ; WGR screen routine call.. ;AN000;
92 INT 10H ; WGR ;AN000;
93 .ENDIF
94 CALL LOAD_INT10 ; WGR load interrupt 10h handler ;AN000;
95 CALL LOAD_INT2F ; WGR load interrupt 2Fh handler ;AN000;
96 int 11h
97 and al,00110000b
98 cmp al,00110000b
99 jnz iscolor
100 mov [base],0b000h ;look for bw card
101iscolor:
102 cmp al,00010000b ;look for 40 col mode
103 ja setbrk
104 mov [mode],0
105 mov [maxcol],39
106
107setbrk:
108 XOR BX,BX
109 MOV DS,BX
110 MOV BX,BRKADR
111 MOV WORD PTR [BX],OFFSET BRKKY
112 MOV WORD PTR [BX+2],CS
113
114 MOV BX,29H*4
115 MOV WORD PTR [BX],OFFSET COUT
116 MOV WORD PTR [BX+2],CS
117
118 LDS BX,CS:[PTRSAV]
119 MOV WORD PTR [BX].TRANS,OFFSET CON$INIT ;SET BREAK ADDRESS
120 MOV [BX].TRANS+2,CS
121 JMP EXIT
122
123
124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
125;
126; PROCEDURE_NAME: DET_HDWR
127;
128; FUNCTION:
129; THIS CODE DETERMINES WHAT VIDEO HARDWARE IS AVAILABLE. THIS INFORMATION
130; IS USED TO LOAD APPROPRIATE VIDEO TABLES INTO MEMORY FOR USE IN THE
131; GENERIC IOCTL.
132;
133; AT ENTRY:
134;
135; AT EXIT:
136; NORMAL: FLAG WORD WILL CONTAIN BITS SET FOR THE APPROPRIATE
137; TABLES. IN ADDITION, FOR VGA SUPPORT, A FLAG BYTE
138; WILL CONTAIN THE AVAILABLE SCAN LINE SETTINGS FOR THE
139; INSTALLED ADAPTER.
140; VIDEO TABLES WILL BE LOADED INTO MEMORY REFLECTING
141; APPLICABLE MODE SETTINGS AND SCREEN LINE LENGTHS.
142;
143; ERROR: N/A
144;
145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
146
147DET_HDWR PROC NEAR ;AN000;
148 MOV AH,GET_SYS_ID ; see if this is a Convertible ;AN000;
149 INT 15H ; ;AN000;
150 .IF <ES:[BX].MODEL_BYTE EQ LCD_MODEL> AND ; yes...check for LCD attached? ;AN000;
151 MOV AH,GET_STATUS ; system status will tell us ;AN000;
152 INT 15H ; ;AN000;
153 .IF <BIT AL NAND ON> ; if bit 0 = 0 then LCD.. ;AN000;
154 OR HDWR_FLAG,LCD_ACTIVE ; so ...set hdwr flag and... ;AN000;
155 LEA SI,COLOR_TABLE ; ;AN000;
156 MOV CX,COLOR_NUM ; load color table (for LCD) ;AN000;
157 CALL LOAD_TABLE ; ;AN000;
158 LEA SI,MONO_TABLE ; and mono table ;AN000;
159 MOV CX,MONO_NUM ; ;AN000;
160 CALL LOAD_TABLE ; ;AN000;
161 .ELSE ; not LCD...check for CGA and mono ;AN000;
162 MOV AX,MONO_ADDRESS ; write to mono buffer to see if present ;AN000;
163 CALL CHECK_BUF ; ;AN000;
164 .IF <AH EQ AL> ; if present then... ;AN000;
165 OR HDWR_FLAG,MONO_ACTIVE ; set hdwr flag and.. ;AN000;
166 LEA SI,MONO_TABLE ; ;AN000;
167 MOV CX,MONO_NUM ; load mono table ;AN000;
168 CALL LOAD_TABLE ; ;AN000;
169 .ENDIF ; ;AN000;
170 MOV AX,COLOR_ADDRESS ; write to CGA buffer to see if present ;AN000;
171 CALL CHECK_BUF ; ;AN000;
172 .IF <AH EQ AL> ; if present then.. ;AN000;
173 OR HDWR_FLAG,CGA_ACTIVE ; set hdwr flag and... ;AN000;
174 LEA SI,COLOR_TABLE ; ;AN000;
175 MOV CX,COLOR_NUM ; load color table ;AN000;
176 CALL LOAD_TABLE ; ;AN000;
177 .ENDIF ; ;AN000;
178 .ENDIF ; ;AN000;
179 PUSH CS ; setup addressiblity for ;AN000;
180 POP ES ; functionality call ;AN000;
181 XOR AX,AX ; ;AN000;
182 MOV AH,FUNC_CALL ; functionality call ;AN000;
183 XOR BX,BX ; implementation type 0 ;AN000;
184 LEA DI,FUNC_INFO ; block to hold data ;AN000;
185 INT 10H ; ;AN000;
186 .IF <AL EQ FUNC_CALL> ; if call supported then.. ;AN000;
187 .IF <BIT [DI].MISC_INFO AND ON> ; test bit to see if VGA ;AN000;
188 OR HDWR_FLAG,VGA_ACTIVE ; yes ....so ;AN000;
189 LEA SI,COLOR_TABLE ; set hdwr flag and... ;AN000;
190 MOV CX,COLOR_NUM ; load color table +.. ;AN000;
191 CALL LOAD_TABLE ; ;AN000;
192 LEA SI,VGA_TABLE ; load VGA table ;AN000;
193 MOV CX,VGA_NUM ; ;AN000;
194 CALL LOAD_TABLE ; ;AN000;
195 .ELSE ; not VGA...then must be MCGA ;AN000;
196 .IF <[DI].ACTIVE_DISPLAY EQ MOD30_MONO> OR ;AN000;
197 .IF <[DI].ACTIVE_DISPLAY EQ MOD30_COLOR> OR ;AN000;
198 .IF <[DI].ALT_DISPLAY EQ MOD30_MONO> OR ;AN000;
199 .IF <[DI].ALT_DISPLAY EQ MOD30_COLOR> ;AN000;
200 OR HDWR_FLAG,MCGA_ACTIVE ; so...set hdwr flag and... ;AN000;
201 LEA SI,COLOR_TABLE ; ;AN000;
202 MOV CX,COLOR_NUM ; load color table +.. ;AN000;
203 CALL LOAD_TABLE ; ;AN000;
204 LEA SI,MCGA_TABLE ; load MCGA table ;AN000;
205 MOV CX,MCGA_NUM ; ;AN000;
206 CALL LOAD_TABLE ; ;AN000;
207 .ENDIF ; ;AN000;
208 .ENDIF ; ;AN000;
209 MOV AL,[DI].CURRENT_SCANS ; copy current scan line setting.. ;AN000;
210 MOV MAX_SCANS,AL ; as maximum text mode scan setting. ;AN000;
211 LES DI,[DI].STATIC_ADDRESS ; point to static functionality table ;AN000;
212 MOV AL,ES:[DI].SCAN_TEXT ; load available scan line flag byte.. ;AN000;
213 MOV SCAN_LINES,AL ; and store it in resident data. ;AN000;
214 .ELSE ; call not supported..try EGA ;AN000;
215 MOV AH,ALT_SELECT ; alternate select call ;AN000;
216 MOV BL,EGA_INFO ; get EGA information subcall ;AN000;
217 INT 10H ; ;AN000;
218 .IF <BL NE EGA_INFO> ; check if call was valid ;AN000;
219 .IF <BH EQ MONOCHROME> ; yes...check for monochrome ;AN000;
220 OR HDWR_FLAG,E5151_ACTIVE ; ..5151 found so set hdwr flag and.. ;AN000;
221 LEA SI,EGA_5151_TABLE ; ;AN000;
222 MOV CX,EGA_5151_NUM ; load 5151 table. ;AN000;
223 CALL LOAD_TABLE ; ;AN000;
224 .ELSE ; ;AN000;
225 AND CL,0FH ; clear upper nibble of switch setting byte ;AN000;
226 .IF <CL EQ NINE> OR ; test for switch settings of 5154 ;AN000;
227 .IF <CL EQ THREE> ; ..5154 found.. ;AN000;
228 OR HDWR_FLAG,E5154_ACTIVE ; so..set hdwr flag and... ;AN000;
229 LEA SI,COLOR_TABLE ; ;AN000;
230 MOV CX,COLOR_NUM ; load color table +.. ;AN000;
231 CALL LOAD_TABLE ; ;AN000;
232 LEA SI,EGA_5154_TABLE ; load 5154 table ;AN000;
233 MOV CX,EGA_5154_NUM ; ;AN000;
234 CALL LOAD_TABLE ; ;AN000;
235 .ELSE ; 5154 not found...must be 5153... ;AN000;
236 OR HDWR_FLAG,E5153_ACTIVE ; so..set hdwr flag and... ;AN000;
237 LEA SI,COLOR_TABLE ; ;AN000;
238 MOV CX,COLOR_NUM ; load color table +.. ;AN000;
239 CALL LOAD_TABLE ; ;AN000;
240 LEA SI,EGA_5153_TABLE ; load 5153 table ;AN000;
241 MOV CX,EGA_5153_NUM ; ;AN000;
242 CALL LOAD_TABLE ; ;AN000;
243 .ENDIF ; ;AN000;
244 .ENDIF ; ;AN000;
245 .ENDIF ; ;AN000;
246 .ENDIF ; ;AN000;
247 RET
248DET_HDWR ENDP
249
250
251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
252;
253; PROCEDURE_NAME: CHECK_BUF
254;
255; FUNCTION:
256; THIS PROCEDURE WRITES TO THE VIDEO BUFFER AND READS THE DATA BACK
257; AGAIN TO DETERMINE THE EXISTANCE OF THE VIDEO CARD.
258;
259; AT ENTRY:
260;
261; AT EXIT:
262; NORMAL: AH EQ AL IF BUFFER PRESENT
263; AH NE AL IF NO BUFFER
264;
265; ERROR: N/A
266;
267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
268
269CHECK_BUF PROC NEAR ; write to video buffer to see if it is present ;AN000;
270 PUSH DS ; ;AN000;
271 MOV DS,AX ; load DS with address of buffer ;AN000;
272 MOV CH,DS:0 ; save buffer information (if present) ;AN000;
273 MOV AL,55H ; prepare to write sample data ;AN000;
274 MOV DS:0,AL ; write to buffer ;AN000;
275 PUSH BX ; terminate the bus so that lines.. ;AN000;
276 POP BX ; are reset ;AN000;
277 MOV AH,DS:0 ; bring sample data back... ;AN000;
278 MOV DS:0,CH ; repair damage to buffer ;AN000;
279 POP DS ; ;AN000;
280 RET ;AN000;
281CHECK_BUF ENDP
282
283;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
284;
285; PROCEDURE_NAME: LOAD_TABLE
286;
287; FUNCTION:
288; THIS PROCEDURE COPIES ONE OF THE VIDEO TABLES INTO RESIDENT DATA.
289; IT MAY BE REPEATED TO LOAD SEVERAL TABLES INTO THE SAME DATA SPACE.
290; MATCHING MODES WILL BE OVERWRITTEN...THEREFORE..CARE MUST BE TAKEN
291; IN LOAD ORDERING.
292;
293; AT ENTRY:
294; SI: POINTS TO TOP OF TABLE TO COPY
295; CX: NUMBER OF RECORDS TO COPY
296;
297; AT EXIT:
298; NORMAL: TABLE POINTED TO BY SI IS COPIED INTO RESIDENT DATA AREA
299;
300; ERROR: N/A
301;
302;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
303
304LOAD_TABLE PROC NEAR ;AN000;
305 PUSH DI ; save DI ;AN000;
306 PUSH ES ; and ES ;AN000;
307 PUSH CS ; setup ES to code segment ;AN000;
308 POP ES ; ;AN000;
309 LEA DI,VIDEO_MODE_TABLE ; point DI to resident video table ;AN000;
310 .WHILE <CX NE 0> AND ; do for as many records as there are ;AN000;
311 .WHILE <DI LT VIDEO_TABLE_MAX> ; check to ensure other data not overwritten ;AN000;
312 MOV AL,[DI].V_MODE ; prepare to check resident table ;AN000;
313 .IF <AL NE UNOCCUPIED> AND ; if this spot is occupied...and ;AN000;
314 .IF <AL NE [SI].V_MODE> ; ...is not the same mode then... ;AN000;
315 ADD DI,TYPE MODE_TABLE ; do not touch...go to next mode ;AN000;
316 .ELSE ; can write at this location ;AN000;
317 PUSH CX ; save record count ;AN000;
318 MOV CX,TYPE MODE_TABLE ; load record length ;AN000;
319 REP MOVSB ; copy record to resident data ;AN000;
320 lea DI,VIDEO_MODE_TABLE ;AN001; Set DI to the top of the target again.
321 POP CX ; restore record count and.. ;AN000;
322 DEC CX ; decrement ;AN000;
323 .ENDIF ; ;AN000;
324 .ENDWHILE ; ;AN000;
325 POP ES ; restore.. ;AN000;
326 POP DI ; registers ;AN000;
327 RET ; ;AN000;
328LOAD_TABLE ENDP
329
330
331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
332;
333; PROCEDURE_NAME: LOAD_INT10
334;
335; FUNCTION:
336; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT10H
337;
338; AT ENTRY:
339;
340; AT EXIT:
341; NORMAL: INTERRUPT 10H VECTOR POINTS TO INT10_COM. OLD INT 10H
342; VECTOR STORED.
343;
344; ERROR: N/A
345;
346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
347
348LOAD_INT10 PROC NEAR ;AN000;
349 PUSH ES ;AN000;
350 XOR AX,AX ; point ES to low.. ;AN000;
351 MOV ES,AX ; memory. ;AN000;
352 MOV CX,ES:WORD PTR INT10_LOW ; store original.. ;AN000;
353 MOV CS:ROM_INT10,CX ; interrupt 10h.. ;AN000;
354 MOV CX,ES:WORD PTR INT10_HI ; location.. ;AN000;
355 MOV CS:ROM_INT10+2,CX ; ;AN000;
356 CLI ; ;AN000;
357 MOV ES:WORD PTR INT10_LOW,OFFSET INT10_COM ; replace vector.. ;AN000;
358 MOV ES:WORD PTR INT10_HI,CS ; with our own.. ;AN000;
359 STI ; ;AN000;
360 mov ax, DISPLAY_CHECK ;AN002;DISPLAY.SYS already loaded?
361 int 2fh ;AN002;
362 cmp al, INSTALLED ;AN002;
363 jne L_INT10_Ret ;AN002;
364 mov cs:Display_Loaded_Before_Me,1 ;AN002;
365L_INT10_Ret: ;AN002;
366 POP ES ; ;AN000;
367 RET ; ;AN000;
368LOAD_INT10 ENDP
369
370
371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
372;
373; PROCEDURE_NAME: LOAD_INT2F
374;
375; FUNCTION:
376; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT2FH
377;
378; AT ENTRY:
379;
380; AT EXIT:
381; NORMAL: INTERRUPT 2FH VECTOR POINTS TO INT2F_COM. OLD INT 2FH
382; VECTOR STORED.
383;
384; ERROR: N/A
385;
386;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
387
388LOAD_INT2F PROC NEAR ;AN000;
389 PUSH ES ;AN000;
390 XOR AX,AX ; point ES to low.. ;AN000;
391 MOV ES,AX ; memory. ;AN000;
392 MOV AX,ES:WORD PTR INT2F_LOW ; store original.. ;AN000;
393 MOV CS:ROM_INT2F,AX ; interrupt 2Fh.. ;AN000;
394 MOV CX,ES:WORD PTR INT2F_HI ; location.. ;AN000;
395 MOV CS:ROM_INT2F+2,CX ; ;AN000;
396 OR AX,CX ; check if old int2F.. ;AN000;
397 .IF Z ; is 0. ;AN000;
398 MOV AX,OFFSET ABORT ; yes....point to.. ;AN000;
399 MOV CS:ROM_INT2F,AX ; IRET. ;AN000;
400 MOV AX,CS ; ;AN000;
401 MOV CS:ROM_INT2F+2,AX ; ;AN000;
402 .ENDIF ; ;AN000;
403 CLI ; ;AN000;
404 MOV ES:WORD PTR INT2F_LOW,OFFSET INT2F_COM ; replace vector.. ;AN000;
405 MOV ES:WORD PTR INT2F_HI,CS ; with our own.. ;AN000;
406 STI ; ;AN000;
407 POP ES ; ;AN000;
408 RET ; ;AN000;
409LOAD_INT2F ENDP ;AN000;
410
411
412CODE ENDS
413 END
diff --git a/v4.0/src/DEV/ANSI/ANSIVID.INC b/v4.0/src/DEV/ANSI/ANSIVID.INC
new file mode 100644
index 0000000..77adb52
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/ANSIVID.INC
@@ -0,0 +1,54 @@
1VGA_TABLE LABEL BYTE ;AN000;
2 MODE_TABLE < 1, 1,, 16, -1, -1, 40, -1> ; mode 1 Ä¿ To give preference;AN000;
3 MODE_TABLE < 0, 1,, 16, -1, -1, 40, -1> ; mode 0 ³ of COxx over ;AN000;
4 MODE_TABLE < 3, 1,, 16, -1, -1, 80, -1> ; mode 3 ³ BWxx. ;AN000;
5 MODE_TABLE < 2, 1,, 16, -1, -1, 80, -1> ; mode 2 ÄÙ (see text) ;AN000;
6 MODE_TABLE < 7, 1,, 0, -1, -1, 80, -1> ; mode 7 ;AN000;
7 MODE_TABLE <13, 2,, 16, 320, 200, 40, 25> ; mode 13 ;AN000;
8 MODE_TABLE <14, 2,, 16, 640, 200, 80, 25> ; mode 14 ;AN000;
9 MODE_TABLE <15, 2,, 0, 640, 350, 80, 25> ; mode 15 ;AN000;
10 MODE_TABLE <16, 2,, 16, 640, 350, 80, 25> ; mode 16 ;AN000;
11 MODE_TABLE <17, 2,, 2, 640, 480, 80, 30> ; mode 17 ;AN000;
12 MODE_TABLE <18, 2,, 16, 640, 480, 80, 30> ; mode 18 ;AN000;
13 MODE_TABLE <19, 2,,256, 320, 200, 40, 25> ; mode 19 ;AN000;
14VGA_NUM EQU ($ - VGA_TABLE)/(TYPE MODE_TABLE) ;AN000;
15
16MCGA_TABLE LABEL BYTE ;AN000;
17 MODE_TABLE <17, 2,, 2, 640, 480, 80, 30> ; mode 17 ;AN000;
18 MODE_TABLE <19, 2,,256, 320, 200, 40, 25> ; mode 19 ;AN000;
19MCGA_NUM EQU ($ - MCGA_TABLE)/(TYPE MODE_TABLE) ;AN000;
20
21EGA_5154_TABLE LABEL BYTE ;AN000;
22 MODE_TABLE < 1, 1,, 16, -1, -1, 40, 43> ; mode 1 Ä¿ To give preference;AN000;
23 MODE_TABLE < 0, 1,, 16, -1, -1, 40, 43> ; mode 0 ³ of COxx over ;AN000;
24 MODE_TABLE < 3, 1,, 16, -1, -1, 80, 43> ; mode 3 ³ BWxx. ;AN000;
25 MODE_TABLE < 2, 1,, 16, -1, -1, 80, 43> ; mode 2 ÄÙ (see text) ;AN000;
26 MODE_TABLE <13, 2,, 16, 320, 200, 40, 25> ; mode 13 ;AN000;
27 MODE_TABLE <14, 2,, 16, 640, 200, 80, 25> ; mode 14 ;AN000;
28 MODE_TABLE <16, 2,, 16, 640, 350, 80, 25> ; mode 16 ;AN000;
29EGA_5154_NUM EQU ($ - EGA_5154_TABLE)/(TYPE MODE_TABLE) ;AN000;
30
31EGA_5153_TABLE LABEL BYTE ;AN000;
32 MODE_TABLE <13, 2,, 16, 320, 200, 40, 25> ; mode 13 ;AN000;
33 MODE_TABLE <14, 2,, 16, 640, 200, 80, 25> ; mode 14 ;AN000;
34EGA_5153_NUM EQU ($ - EGA_5153_TABLE)/(TYPE MODE_TABLE) ;AN000;
35
36EGA_5151_TABLE LABEL BYTE ;AN000;
37 MODE_TABLE < 7, 1,, 0, -1, -1, 80, 43> ; mode 7 ;AN000;
38 MODE_TABLE <15, 2,, 0, 640, 350, 80, 25> ; mode 15 ;AN000;
39EGA_5151_NUM EQU ($ - EGA_5151_TABLE)/(TYPE MODE_TABLE) ;AN000;
40
41MONO_TABLE LABEL BYTE ;AN000;
42 MODE_TABLE < 7, 1,, 0, -1, -1, 80, 25> ; mode 7 ;AN000;
43MONO_NUM EQU ($ - MONO_TABLE)/(TYPE MODE_TABLE) ;AN000;
44
45COLOR_TABLE LABEL BYTE ;AN000;
46 MODE_TABLE < 1, 1,, 16, -1, -1, 40, 25> ; mode 1 Ä¿ To give preference;AN000;
47 MODE_TABLE < 0, 1,, 16, -1, -1, 40, 25> ; mode 0 ³ of COxx over ;AN000;
48 MODE_TABLE < 3, 1,, 16, -1, -1, 80, 25> ; mode 3 ³ BWxx. ;AN000;
49 MODE_TABLE < 2, 1,, 16, -1, -1, 80, 25> ; mode 2 ÄÙ (see text) ;AN000;
50 MODE_TABLE < 4, 2,, 4, 320, 200, 40, 25> ; mode 4 ;AN000;
51 MODE_TABLE < 5, 2,, 2, 320, 200, 40, 25> ; mode 5 ;AN000;
52 MODE_TABLE < 6, 2,, 2, 640, 200, 80, 25> ; mode 6 ;AN000;
53COLOR_NUM EQU ($ - COLOR_TABLE)/(TYPE MODE_TABLE) ;AN000;
54 \ No newline at end of file
diff --git a/v4.0/src/DEV/ANSI/IOCTL.ASM b/v4.0/src/DEV/ANSI/IOCTL.ASM
new file mode 100644
index 0000000..506e06c
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/IOCTL.ASM
@@ -0,0 +1,1126 @@
1PAGE ,132
2TITLE ANSI Generic IOCTL Code
3
4;****************** START OF SPECIFICATIONS **************************
5;
6; MODULE NAME: IOCTL.ASM
7;
8; DESCRIPTIVE NAME: PERFORM THE GENERIC IOCTL CALL IN ANSI.SYS
9;
10; FUNCTION: THE GENERIC DEVICE IOCTL IS USED TO SET AND GET THE
11; MODE OF THE DISPLAY DEVICE ACCORDING TO PARAMETERS PASSED
12; IN A BUFFER. ADDITIONALLY, THE CALL CAN TOGGLE THE
13; USE OF THE INTENSITY BIT, AND CAN LOAD THE 8X8 CHARACTER
14; SET, EFFECTIVELY GIVING MORE LINES PER SCREEN. THE
15; AVAILABILITY OF THIS FUNCTION VARIES STRONGLY WITH HARDWARE
16; ATTACHED.
17;
18; ENTRY POINT: GENERIC_IOCTL
19;
20; INPUT: LOCATION OF REQUEST PACKET STORED DURING STRATEGY CALL.
21;
22; AT EXIT:
23; NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET
24;
25; ERROR: CARRY SET - ERROR CODE IN AX.
26; AX = 1 - INVALID FUNCTION. EXTENDED ERROR = 20
27; AX = 10 - UNSUPPORTED FUNCTION ON CURRENT HARDWARE.
28; EXTENDED ERROR = 29
29; AX = 12 - DISPLAY.SYS DOES NOT HAVE 8X8 RAM CHARACTER SET.
30; EXTENDED ERROR = 31
31;
32; INTERNAL REFERENCES:
33;
34; ROUTINES: GET_IOCTL - PERFORMS THE GET DEVICE CHARACTERISTICS
35; SET_IOCTL - PERFORMS THE SET DEVICE CHARACTERISTICS
36; TEST_LENGTH - TESTS FOR VALIDITY OF A SCREEN SIZE VALUE
37; CTL_FLAG - READS THE CURRENT USE FOR THE INT/BLINK BIT
38; SET_CTL_FLAG - SETS THE USE FOR THE INT/BLINK BIT
39; GET_SEARCH - SEARCHES THE INTERNAL VIDEO TABLE FOR THE
40; CURRENT MODE MATCH
41; SET_SEARCH - SEARCHES THE INTERNAL VIDEO TABEL FOR THE
42; CURRENT MODE MATCH
43; SET_CURSOR_EMUL - SETS THE BIT THAT CONTROLS CURSOR EMULATION
44; INT10_COM - INTERRUPT 10H HANDLER TO KEEP CURRENT SCREEN SIZE
45; INT2F_COM - INTERRUPT 2FH INTERFACE TO GENERIC IOCTL
46; MAP_DOWN - PERFORMS CURSOR TYPE MAPPING FOR EGA WITH MONOCHROME
47; SET_VIDEO_MODE - SETS THE VIDEO MODE
48; ROM_LOAD_8X8 - LOADS THE 8X8 CHARACTER SET.
49; PROCESS_NORMAL - DOES THE SET PROCESS FOR ADAPTERS OTHER THAN
50; THE VGA
51; PROCESS_VGA - DOES THE SET PROCESS FOR THE VGA ADAPTER
52; CHECK_FOR_DISPLAY - CHECKS FOR DISPLAY.SYS SUPPORT
53;
54; DATA AREAS: SCAN_LINE_TABLE - HOLDS SCAN LINE INFORMATION FOR PS/2
55; FUNC_INFO - BUFFER FOR PS/2 FUNCTIONALITY CALL.
56;
57;
58; EXTERNAL REFERENCES:
59;
60; ROUTINES: INT 10H SERVICES
61;
62; DATA AREAS: VIDEO_MODE_TABLE - INTERNAL TABLE FOR CHARACTERISTICS TO MODE
63; MATCH-UPS
64;
65; NOTES:
66;
67; REVISION HISTORY:
68;
69; Label: "DOS ANSI.SYS Device Driver"
70; "Version 4.00 (C) Copyright 1988 Microsoft"
71; "Licensed Material - Program Property of Microsoft"
72;
73;****************** END OF SPECIFICATIONS ****************************
74;Modification history *********************************************************
75;AN001; P1350 Codepage switching not working on EGA 10/10/87 J.K.
76;AN002; P1626 ANSI does not allow lines=43 with PS2,Monochrome 10/15/87 J.K.
77;AN003; p1774 Lines=43 after selecting cp 850 does not work 10/20/87 J.K.
78;AN004; p1740 MODE CON LINES command causes problem with PE2 w PS/210/24/87 J.K.
79;AN005; p2167 Does'nt say EGA in medium resol. cannot do 43 lines 10/30/87 J.K.
80;AN006; p2236 After esc [=0h, issuing INT10h,AH=fh returns mode=1. 11/3/87 J.K.
81;AN007; p2305 With ANSI loaded, loading RDTE hangs the system 11/06/87 J.K.
82;AN008; P2617 Order dependecy problem with Display.sys 11/23/87 J.K.
83;AN009; p2716 HOT key of VITTORIA does not work properly 12/03/87 J.K.
84;AN010; d398 /L option for Enforcing the number of lines 12/17/87 J.K.
85;AN011; D425 For OS2 compatibiltiy box, /L option status query 01/14/88 J.K.
86;******************************************************************************
87
88INCLUDE ANSI.INC ;AN000;
89.XLIST ;AN000;
90INCLUDE STRUC.INC ;AN000;
91.LIST ;AN000;
92 ;AN000;
93PUBLIC GENERIC_IOCTL ;AN000;
94PUBLIC FUNC_INFO ;AN000;
95PUBLIC MAX_SCANS ;AN000;
96PUBLIC INT10_COM ;AN000;
97PUBLIC ROM_INT10 ;AN000;
98PUBLIC INT2F_COM ;AN000;
99PUBLIC ROM_INT2F ;AN000;
100PUBLIC ABORT ;AN000;
101PUBLIC REQ_TXT_LENGTH ;AN000;
102PUBLIC GRAPHICS_FLAG ;AN000;
103public Display_Loaded_Before_Me ;AN008;
104 ;AN000;
105CODE SEGMENT PUBLIC BYTE ;AN000;
106 ASSUME CS:CODE,DS:CODE ;AN000;
107 ;AN000;
108EXTRN PTRSAV:DWORD ;AN000;
109EXTRN NO_OPERATION:NEAR ;AN000;
110EXTRN ERR1:NEAR ;AN000;
111EXTRN VIDEO_MODE_TABLE:BYTE ;AN000;
112extrn MAX_VIDEO_TAB_NUM:ABS
113EXTRN HDWR_FLAG:WORD ;AN000;
114EXTRN SCAN_LINES:BYTE ;AN000;
115extrn Switch_L:Byte ;AN010;Defined in ANSI.ASM
116 ;AN000;
117 ;AN000;
118SCAN_LINE_TABLE LABEL BYTE ;AN000;
119 SCAN_LINE_STR <200,000000001B,0> ; 200 scan lines ;AN000;
120 SCAN_LINE_STR <344,000000010B,1> ; 350 scan lines ;AN000;
121 SCAN_LINE_STR <400,000000100B,2> ; 400 scan lines ;AN000;
122SCANS_AVAILABLE EQU ($ - SCAN_LINE_TABLE)/TYPE SCAN_LINE_STR ;AN000;
123 ;AN000;
124;This is used when ANSI calls Get_IOCTL, Set_IOCTL by itself.
125In_Generic_IOCTL_flag db 0 ;AN004;
126I_AM_IN_NOW EQU 00000001b ;AN004;
127SET_MODE_BY_DISPLAY EQU 00000010b ;AN004;Display.sys calls Set mode INT 10h.
128CALLED_BY_INT10COM EQU 00000100b ;AN009;To prevent from calling set mode int 10h again.
129
130INT10_V_Mode db 0ffh ;AN006;Used by INT10_COM
131
132My_IOCTL_Req_Packet REQ_PCKT <0,0,0Eh,0,?,0,?,?,?,?,?> ;AN004;
133 ;AN000;
134FUNC_INFO INFO_BLOCK <> ; data block for functionality call ;AN000;
135ROM_INT10 DW ? ; segment and offset of original.. ;AN000;
136 DW ? ; interrupt 10h vector. ;AN000;
137ROM_INT2F DW ? ; segment and offset of original.. ;AN000;
138 DW ? ; interrupt 2Fh vector. ;AN000;
139INTENSITY_FLAG DW OFF ; intensity flag initially off ;AN000;
140REQ_TXT_LENGTH DW DEFAULT_LENGTH ; requested text screen length ;AN000;
141SCAN_DESIRED DB 0 ; scan lines desired ;AN000;
142MAX_SCANS DB 0 ; maximum scan line setting ;AN000;
143GRAPHICS_FLAG DB TEXT_MODE ; flag for graphics mode ;AN000;
144ERROR_FLAG DB OFF ; flag for error conditions ;AN000;
145Display_Loaded_Before_Me db 0 ;AN008;flag
146ANSI_SetMode_Call_Flag db 0 ;AN008;Ansi is issuing INT10,AH=0.
147
148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149;
150; PROCEDURE_NAME: GENERIC_IOCTL
151;
152; FUNCTION:
153; TO GET OR SET DEVICE CHARACTERISTICS ACCORDING TO THE BUFFER PASSED
154; IN THE REQUEST PACKET.
155;
156; AT ENTRY:
157;
158; AT EXIT:
159; NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET
160;
161; ERROR: CARRY SET - ERROR CODE IN AL. (SEE MODULE DESCRIPTION ABOVE).
162;
163; NOTE: THIS PROC IS PERFORMED AS A JMP AS WITH THE OLD ANSI CALLS.
164;
165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
166
167GENERIC_IOCTL: ; ;AN000;
168 LES BX,[PTRSAV] ; establish addressability to request header ;AN000;
169 .SELECT ; check for get or set subfunction ;AN000;
170 .WHEN <ES:[BX].MIN_FUNC EQ GET_FUNC> ; is this the get subfunction? ;AN000;
171 LES DI,ES:[BX].REQ_PCKT_PTR ; point to request packet ;AN000;
172 CALL GET_IOCTL ; yes...execute routine ;AN000;
173 .WHEN <ES:[BX].MIN_FUNC EQ SET_FUNC> ; is this the set subfunction? ;AN000;
174 LES DI,ES:[BX].REQ_PCKT_PTR ; point to request packet ;AN000;
175 CALL SET_IOCTL ; yes....execute routine ;AN000;
176 .OTHERWISE ; not for us....so.. ;AN000;
177 JMP NO_OPERATION ; call lower CON device ;AN000;
178 .ENDSELECT ; ;AN000;
179 .IF C ; error?.... ;AN000;
180 OR AX,CMD_ERROR ; yes...set error bit in status ;AN000;
181 .ENDIF ; ;AN000;
182 OR AX,DONE ; add done bit to status ;AN000;
183 JMP ERR1 ; return with status in AX ;AN000;
184 ;AN000;
185 ;AN000;
186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
187;
188; PROCEDURE_NAME: GET_IOCTL
189;
190; FUNCTION:
191; THIS PROCEDURE RETURNS DEVICE CHARACTERISTICS.
192;
193; AT ENTRY: ES:DI POINTS TO REQUEST BUFFER
194;
195; AT EXIT:
196; NORMAL: CARRY CLEAR - REQUEST BUFFER CONTAINS DEVICE CHARACTERISTICS
197;
198; ERROR: CARRY SET - ERROR CONDITION IN AX
199;
200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
201
202GET_IOCTL PROC NEAR ;AN000;
203 .IF <ES:[DI].INFO_LEVEL NE 0> OR ; check for valid info level ;AN000;
204 .IF <ES:[DI].DATA_LENGTH LT <TYPE MODE_TABLE+1>> ; and buffer size. ;AN000;
205 MOV AX,INVALID_FUNC ; not valid...unsupported ;AN000;
206 STC ; function..set error flag and ;AN000;
207 .ELSE ; ;AN000;
208 MOV ES:[DI].INFO_LEVEL+1,0 ; set reserved byte to 0. ;AN000;
209 MOV AH,REQ_VID_MODE ; request current video mode ;AN000;
210 INT 10H ; ;AN000;
211 AND AL,VIDEO_MASK ; ;AN000;
212 LEA SI,VIDEO_MODE_TABLE ; point to resident video table ;AN000;
213 CALL GET_SEARCH ; perform search ;AN000;
214 .IF C ; found? ;AN000;
215 MOV AX,NOT_SUPPORTED ; no....load unsupported function ;AN000;
216 .ELSE ; ;AN000;
217 push di ;AN001;AN003;Save Request Buffer pointer
218 MOV WORD PTR ES:[DI].DATA_LENGTH,(TYPE MODE_TABLE)+1 ;length of data is struc size ;AN000;
219 INC SI ; skip mode value ;AN000;
220 ADD DI,RP_FLAGS ; point to flag word ;AN000;
221 .IF <HDWR_FLAG GE MCGA_ACTIVE> ; if we have an EGA or better ;AN000;
222 CALL CTL_FLAG ; then ..process control flag ;AN000;
223 .ELSE ; else... ;AN000;
224 MOV WORD PTR ES:[DI],OFF ; we always have blink. ;AN000;
225 .ENDIF ; ;AN000;
226 INC DI ; point to next field.. ;AN000;
227 INC DI ; ..(display mode) ;AN000;
228 MOV CX,(TYPE MODE_TABLE)-1 ; load count ;AN000;
229 REP MOVSB ; transfer data from video table to request packet;AN000;
230 SUB SI,TYPE MODE_TABLE ; point back to start of mode data ;AN000;
231 .IF <[SI].D_MODE EQ TEXT_MODE> AND ; if we are in text mode and.. ;AN000;
232 .IF <[SI].SCR_ROWS NE DEFAULT_LENGTH> ; length <> 25 then we have an EGA or VGA ;AN000;
233 DEC DI ; point back to length entry in req packet ;AN000;
234 DEC DI ; ;AN000;
235 PUSH DS ; ;AN000;
236 MOV AX,ROM_BIOS ; load ROM BIOS data area segment ;AN000;
237 MOV DS,AX ; ;AN000;
238 MOV AL,BYTE PTR DS:[NUM_ROWS] ; load current number of rows ;AN000;
239 CBW ; ;AN000;
240 INC AX ; add 1 to row count ;AN000;
241 MOV WORD PTR ES:[DI],AX ; and copy to request packet ;AN000;
242 POP DS ; ;AN000;
243 .ENDIF ; ;AN000;
244 XOR AX,AX ; no errors ;AN000;
245 CLC ; clear error flag ;AN000;
246 pop di ;AN001; AN003;Restore Request Buffer pointer
247 .ENDIF ; ;AN000;
248 .ENDIF ; ;AN000;
249 RET ; return to calling module ;AN000;
250GET_IOCTL ENDP ;AN000;
251 ;AN000;
252
253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
254;
255; PROCEDURE_NAME: SET_IOCTL
256;
257; FUNCTION:
258; THIS PROCEDURE SETS THE VIDEO MODE AND CHARACTER SET ACCORDING
259; TO THE CHARACTERSTICS PROVIDED.
260;
261; AT ENTRY:
262; ES:[DI] POINTS TO REQUEST BUFFER
263;
264; AT EXIT:
265; NORMAL: CLEAR CARRY - VIDEO MODE SET
266;
267; ERROR: CARRY SET - ERROR CONDITION IN AX
268;
269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
270
271SET_IOCTL PROC NEAR ;AN000;
272 or cs:In_Generic_IOCTL_Flag, I_AM_IN_NOW ;AN004; Signal GENERIC_IOCTL request being processed
273 MOV ERROR_FLAG,OFF ; clear any errors ;AN000;
274 .IF <ES:[DI].INFO_LEVEL NE 0> OR ; check for valid info level ;AN000;
275 .IF <ES:[DI].DATA_LENGTH NE <TYPE MODE_TABLE+1>> OR ; and buffer size. ;AN000;
276 MOV AX,ES:[DI].RP_FLAGS ; test for invalid flags. ;AN000;
277 .IF <BIT AX AND INVALID_FLAGS> OR ; ;AN000;
278 .IF <BIT ES:[DI].RP_FLAGS AND ON> AND ; if intensity is requested and.. ;AN000;
279 .IF <HDWR_FLAG LT MCGA_ACTIVE> ; hardware does not support it then.. ;AN000;
280 MOV AX,INVALID_FUNC ; not valid...unsupported.. ;AN000;
281 MOV ERROR_FLAG,ON ; function..set error and.. ;AN000;
282 .ELSE ; ;AN000;
283 CALL SET_SEARCH ; search table for match ;AN000;
284 .IF C ; if match not found then.. ;AN000;
285 MOV AX,NOT_SUPPORTED ; not supported.... ;AN000;
286 MOV ERROR_FLAG,ON ; ;AN000;
287 .ELSE ; ;AN000;
288 .IF <[SI].D_MODE EQ TEXT_MODE> ; is a text mode being requested? ;AN000;
289 PUSH REQ_TXT_LENGTH ; save old value in case of error ;AN000;
290 MOV AX,ES:[DI].RP_ROWS ; save new requested value. ;AN000;
291 MOV REQ_TXT_LENGTH,AX ; ;AN000;
292; .IF <[SI].SCR_ROWS NE UNOCCUPIED> ; yes...check for VGA support.. ;AN000;
293; CALL PROCESS_NORMAL ; no..process other adapters.. ;AN000;
294; .ELSE ; VGA support available.. ;AN000;
295; CALL PROCESS_VGA ; process the VGA support code. ;AN000;
296; .ENDIF ; ;AN000;
297 .IF <[SI].SCR_ROWS E UNOCCUPIED> OR ;AN002;
298 .IF <BIT Hdwr_Flag AND VGA_ACTIVE> ;AN002;
299 call process_VGA ;AN002;
300 .ELSE ;AN002;
301 call process_Normal ;AN002;
302 .ENDIF ;AN002;
303 .IF <ERROR_FLAG EQ OFF> ; if we had no errors then.. ;AN000;
304 POP AX ; discard saved text length ;AN000;
305 call DO_ROWS ;AN004;
306 .IF <HDWR_FLAG GE E5151_ACTIVE> ; does hardware support gt 25 lines? ;AN000;
307 CALL SET_CURSOR_EMUL ; yes..ensure cursor emulation is.. ;AN000;
308 .ENDIF ; set accordingly. ;AN000;
309 .ELSE ; ;AN000;
310 POP REQ_TXT_LENGTH ; error...so restore old value. ;AN000;
311 .ENDIF ; ;AN000;
312 .ELSE ; request is for graphics mode ;AN000;
313 CALL SET_VIDEO_MODE ; so set video mode. ;AN000;
314 .ENDIF ; ;AN000;
315 .IF <ERROR_FLAG EQ OFF> AND ; no errors? then.. ;AN000;
316 .IF <HDWR_FLAG GE MCGA_ACTIVE> AND ; for the EGA and better .... ;AN000;
317 .IF <[SI].V_MODE EQ TEXT_MODE> ; and in text mode do... ;AN000;
318 CALL SET_CTL_FLAG ; set intensity bit to control value ;AN000;
319 .ENDIF ; ;AN000;
320 .ENDIF ; ;AN000;
321 .ENDIF ; ;AN000;
322 and cs:In_Generic_IOCTL_Flag, NOT I_AM_IN_NOW ;AN004; Turn the flag off
323 .IF <ERROR_FLAG EQ OFF> ; no errors? ;AN000;
324 XOR AX,AX ; clear error register ;AN000;
325 CLC ; clear error flag ;AN000;
326 .ELSE ; ;AN000;
327 STC ; ;AN000;
328 .ENDIF ; yes...set error flag ;AN000;
329 RET ; ;AN000;
330SET_IOCTL ENDP ;AN000;
331
332
333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
334;
335; PROCEDURE_NAME: PROCESS_NORMAL
336;
337; FUNCTION:
338; THIS PROCEDURE PROCESSES THE SET IOCTL FOR ADAPTERS OTHER THAN
339; THE VGA.
340;
341; AT ENTRY: AX - SCREEN LENGTH DESIRED
342; DS:SI - POINTS TO MODE RECORD IN VIDEO TABLE.
343;
344; AT EXIT:
345; NORMAL: MODE SET
346;
347; ERROR: ERROR_FLAG IS ON. ERROR CODE IN AX.
348;
349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
350
351PROCESS_NORMAL PROC NEAR ;AN000;
352 .IF <AX NE DEFAULT_LENGTH> AND ; no..see if length requested.. ;AN000;
353 .IF <AX NE [SI].SCR_ROWS> ; is valid.... ;AN000;
354 MOV AX,NOT_SUPPORTED ; not valid....so ;AN000;
355 MOV ERROR_FLAG,ON ; set error flag and.. ;AN000;
356 .ELSE ; length is valid so.. ;AN000;
357 CALL CHECK_FOR_DISPLAY ; see if we need and have DISPLAY.SYS.. ;AN000;
358 .IF NC ; support...if no problems then.. ;AN000;
359 .IF <HDWR_FLAG GE E5151_ACTIVE>; yes...check for cursor emulation ;AN000;
360 CALL SET_CURSOR_EMUL ; ;AN000;
361 .ENDIF ; ;AN000;
362 CALL SET_VIDEO_MODE ; ..and set the mode. ;AN000;
363 .ELSE ; no.. ;AN000;
364 MOV AX,NOT_AVAILABLE ; font not available.. ;AN000;
365 MOV ERROR_FLAG,ON ; ;AN000;
366 .ENDIF ; ;AN000;
367 .ENDIF ; ;AN000;
368 RET
369PROCESS_NORMAL ENDP
370
371
372;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373;
374; PROCEDURE_NAME: PROCESS_VGA
375;
376; FUNCTION:
377; THIS PROCEDURE PROCESSES THE SET IOCTL FOR THE VGA ADAPTER
378;
379; AT ENTRY: AX - SCREEN LENGTH DESIRED
380; DS:SI - POINTS TO MODE RECORD IN VIDEO TABLE.
381;
382; AT EXIT:
383; NORMAL: MODE SET
384;
385; ERROR: ERROR_FLAG IS ON. ERROR CODE IN AX.
386;
387;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
388
389PROCESS_VGA PROC NEAR ;AN000;
390 CALL TEST_LENGTH ; check to see if screen length ;AN000;
391 .IF C ; is applicable.... ;AN000;
392 MOV AX,NOT_SUPPORTED ; no..so set error condition ;AN000;
393 MOV ERROR_FLAG,ON ; ;AN000;
394 .ELSE ; ;AN000;
395 CALL CHECK_FOR_DISPLAY ; see if we need and have DISPLAY.SYS.. ;AN000;
396 .IF NC ; support.....yes so.. ;AN000;
397 .IF <REQ_TXT_LENGTH EQ DEFAULT_LENGTH> ; 25 lines requested? ;AN000;
398 MOV AL,MAX_SCANS ; desired scan setting should be.. ;AN000;
399 MOV SCAN_DESIRED,AL ; the maximum. ;AN000;
400 .ENDIF ; ;AN000;
401 MOV AH,ALT_SELECT ; set the appropriate number.. ;AN000;
402 MOV BL,SELECT_SCAN ; of scan lines.. ;AN000;
403 MOV AL,SCAN_DESIRED ; ;AN000;
404 INT 10H ; ;AN000;
405 CALL SET_VIDEO_MODE ; and set the mode. ;AN000;
406 .ELSE ; DISPLAY.SYS does not have the font. ;AN000;
407 MOV AX,NOT_AVAILABLE ; so...load error code.. ;AN000;
408 MOV ERROR_FLAG,ON ; ;AN000;
409 .ENDIF ; ;AN000;
410 .ENDIF ; ;AN000;
411 RET ;AN000;
412PROCESS_VGA ENDP ;AN000;
413
414
415;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
416; Procedure name: DO_ROWS
417; Function:
418; Only called for TEXT_MODE.
419; If (REQ_TXT_LENGTH <> DEFAULT_LENGTH) &
420; (DISPLAY.SYS not loaded or CODEPAGE not active)
421; then
422; LOAD ROM 8X8 charater.
423;
424;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
425DO_ROWS proc near ;AN004;
426 .IF <REQ_TXT_LENGTH NE DEFAULT_LENGTH> ;AN004;
427 push ds ;AN004;
428 push es ;AN004;
429 push di ;AN004;
430 push si ;AN004;
431 mov ax, DISPLAY_CHECK ;AN004;
432 int 2fh ;AN004;
433 .IF <al NE INSTALLED> OR ;AN004;
434 mov ax, CHECK_ACTIVE ;AN004;
435 int 2fh ;AN004;
436 .IF C ;AN004;
437 call ROM_LOAD_8X8 ;AN004;
438 .ENDIF ;AN004;
439 pop si ;AN004;
440 pop di ;AN004;
441 pop es ;AN004;
442 pop ds ;AN004;
443 .ENDIF ;AN004;
444 ret ;AN004;
445DO_ROWS endp ;AN004;
446
447;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
448;
449; PROCEDURE_NAME: TEST_LENGTH
450;
451; FUNCTION:
452; THIS PROCEDURE ENSURES THAT THE SCREEN LENGTH REQUESTED CAN BE
453; OBTAINED USING THE AVAILABLE SCAN LINE SETTINGS. (VGA ONLY!)
454;
455; AT ENTRY:
456;
457;
458; AT EXIT:
459; NORMAL: CARRY CLEAR - SCAN_DESIRED CONTAINS SETTING REQUIRED
460;
461; ERROR: CARRY SET
462;
463;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
464
465TEST_LENGTH PROC NEAR ;AN000;
466 push bp ;AN007;
467 MOV AX,REQ_TXT_LENGTH ; load AX with length requested ;AN000;
468 MOV BP,EIGHT ; ;AN000;
469 MUL BP ; mulitply by 8 to get scan lines ;AN000;
470 LEA BX,SCAN_LINE_TABLE ; load BX with scan line table start ;AN000;
471 MOV CX,SCANS_AVAILABLE ; total number of scan lines settings ;AN000;
472 MOV BP,NOT_FOUND ; set flag ;AN000;
473 .WHILE <BP EQ NOT_FOUND> AND ; while not found and still valid.. ;AN000;
474 .WHILE <CX NE 0> ; settings left..do.. ;AN000;
475 .IF <AX EQ [BX].NUM_LINES> ; pointing at the right setting.. ;AN000;
476 MOV DL,[BX].REP_1BH ; ;AN000;
477 .IF <BIT SCAN_LINES AND DL> ; does the hardware have it?.. ;AN000;
478 MOV BP,FOUND ; yes....found!! ;AN000;
479 .ELSE ; ;AN000;
480 XOR CX,CX ; no...set CX to exit loop. ;AN000;
481 .ENDIF ; ;AN000;
482 .ELSE ; ;AN000;
483 ADD BX,TYPE SCAN_LINE_STR ; not this setting..point to next ;AN000;
484 DEC CX ; record and decrement count ;AN000;
485 .ENDIF ; ;AN000;
486 .ENDWHILE ; ;AN000;
487 .IF <BP EQ NOT_FOUND> ; was it found and available? ;AN000;
488 STC ; no....set error flag ;AN000;
489 .ELSE ; yes so..... ;AN000;
490 MOV CL,[BX].REP_12H ; store value to set it. ;AN000;
491 MOV SCAN_DESIRED,CL ; ;AN000;
492 CLC ; clear error flag ;AN000;
493 .ENDIF ; ;AN000;
494 pop bp ;AN007;
495 RET ; return to calling module ;AN000;
496TEST_LENGTH ENDP ;AN000;
497 ;AN000;
498 ;AN000;
499;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
500;
501; PROCEDURE_NAME: CTL_FLAG
502;
503; FUNCTION:
504; THIS PROCEDURE RETURNS THE CURRENT USE FOR THE INTENSITY/BLINKING
505; BIT.
506;
507; AT ENTRY:
508;
509; AT EXIT:
510; NORMAL:
511; VGA,MCGA: VALUE RETURNED FROM FUNCTIONALITY CALL
512; EGA: VALUE LAST SET THROUGH IOCTL. DEFAULT IS BLINKING.
513; CGA,MONO: BLINKING
514;
515; ERROR: N/A
516;
517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
518 ;AN000;
519CTL_FLAG PROC NEAR ;AN000;
520 .IF <BIT HDWR_FLAG AND VGA_ACTIVE> ; VGA supported? ;AN000;
521 PUSH ES ; yes...prepare for ;AN000;
522 PUSH DI ; functionality call ;AN000;
523 PUSH DS ; ;AN000;
524 POP ES ; ;AN000;
525 LEA DI,FUNC_INFO ; point to data block ;AN000;
526 MOV AH,FUNC_CALL ; load function number ;AN000;
527 XOR BX,BX ; implementation type 0 ;AN000;
528 INT 10H ; ;AN000;
529 MOV AL,ES:[DI].MISC_INFO ; load misc info byte ;AN000;
530 .IF <BIT AL AND INT_BIT> ; is blink bit set? ;AN000;
531 AND INTENSITY_FLAG,NOT ON ; yes....turn off intensity flag ;AN000;
532 .ELSE ; no... ;AN000;
533 OR INTENSITY_FLAG,ON ; ensure that intensity is set ;AN000;
534 .ENDIF ; ;AN000;
535 POP DI ; restore registers ;AN000;
536 POP ES ; ;AN000;
537 .ENDIF ; ;AN000;
538 MOV AX,INTENSITY_FLAG ; write the control flag.. ;AN000;
539 MOV ES:[DI],AX ; to the request packet ;AN000;
540 RET ; ;AN000;
541CTL_FLAG ENDP ;AN000;
542
543
544;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
545;
546; PROCEDURE_NAME: SET_CTL_FLAG
547;
548; FUNCTION:
549; THIS PROCEDURE SET THE TOGGLE/INTENSITY BIT AS SPECIFIED IN THE
550; CONTROL FLAG IOCTL SET SUBFUNCTION. THIS ROUTINE IS ONLY CALLED FOR
551; AN EGA, MCGA, OR VGA.
552;
553; AT ENTRY: ES:DI POINTS TO REQUEST BUFFER
554;
555; AT EXIT:
556; NORMAL: INTENSITY_FLAG SET APPROPRIATELY AND SYSTEM BIT SET
557;
558; ERROR: N/A
559;
560;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
561
562SET_CTL_FLAG PROC NEAR ;AN000;
563 .IF <BIT ES:[DI].RP_FLAGS AND ON> ;AN000;
564 OR INTENSITY_FLAG,ON ;AN000;
565 MOV BL,SET_INTENSIFY ;AN000;
566 .ELSE ;AN000;
567 AND INTENSITY_FLAG,NOT ON ;AN000;
568 MOV BL,SET_BLINK ;AN000;
569 .ENDIF ;AN000;
570 MOV AX,BLINK_TOGGLE ;AN000;
571 INT 10H ;AN000;
572 RET ;AN000;
573SET_CTL_FLAG ENDP
574
575
576;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
577;
578; PROCEDURE_NAME: SET_SEARCH
579;
580; FUNCTION:
581; THIS PROCEDURE SEARCHES THE RESIDENT VIDEO TABLE IN ATTEMPT TO
582; FIND A MODE THAT MATHCES THE CHARACTERISTICS REQUESTED.
583;
584; AT ENTRY:
585;
586; AT EXIT:
587; NORMAL: CARRY CLEAR - SI POINTS TO APPLICABLE RECORD
588;
589; ERROR: CARRY SET
590;
591;AN006; When INT10_V_Mode <> 0FFH, then assumes that the user
592; issuing INT10h, Set mode function call. Unlike Generic IOCTL
593; set mode call, the user already has taken care of the video mode.
594; So, we also find the matching V_MODE.
595;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
596 ;AN000;
597SET_SEARCH PROC NEAR ;AN000;
598 push bp ;AN007;
599 LEA SI,VIDEO_MODE_TABLE ; point to video table ;AN000;
600 MOV BP,NOT_FOUND ; set flag indicating not found ;AN000;
601 MOV CX,MAX_VIDEO_TAB_NUM ; load counter, # of tables ;AN000;
602 .WHILE <BP EQ NOT_FOUND> AND ; while not found and we still.. ;AN000;
603 .WHILE <[SI].V_MODE NE UNOCCUPIED> AND ; have valid entries.. ;AN000;
604 .WHILE <CX NE 0> ; do... ;AN000;
605 mov al, cs:INT10_V_Mode ;AN006;
606 .if <AL NE 0FFh> AND ;AN006;if issued by INT10h Set Mode call,
607 .if <[SI].V_MODE NE AL> ;AN006; and V_MODE <> AL
608 add si, type MODE_TABLE ;AN006; then, this is not the correct entry.
609 dec cx ;AN006;Let's find the next entry.
610 .else ;AN006; Else, continue...
611 MOV AL,ES:[DI].RP_MODE ; load register for compare. ;AN000;
612 .IF <[SI].D_MODE EQ AL> ; match?...... ;AN000;
613 MOV AX,ES:[DI].RP_COLORS ; yes...prepare next field ;AN000;
614 .IF <[SI].COLORS EQ AX> ; match?... ;AN000;
615 .IF <ES:[DI].RESERVED2 EQ 0> ; yes...ensure reserved byte is 0 ;AN000;
616 .IF <ES:[DI].RP_MODE EQ GRAPHICS_MODE> ; for graphics mode..check the following;AN000;.
617 MOV AX,ES:[DI].RP_WIDTH ; screen width. ;AN000;
618 .IF <[SI].SCR_WIDTH EQ AX> ; ;AN000;
619 MOV AX,ES:[DI].RP_LENGTH ; screen length ;AN000;
620 .IF <[SI].SCR_LENGTH EQ AX> ; (ignore #rows and #columns ;AN000;
621 MOV BP,FOUND ; found...set flag ;AN000;
622 .ENDIF ; ;AN000;
623 .ENDIF ; ;AN000;
624 .ELSE ; and for text check the columns.. ;AN000;
625 MOV AX,ES:[DI].RP_COLS ; the rows are matched in the main routine. ;AN000;
626 .IF <[SI].SCR_COLS EQ AX> ; ;AN000;
627 MOV BP,FOUND ; found...set flag ;AN000;
628 .ENDIF ; ;AN000;
629 .ENDIF ; ;AN000;
630 .ENDIF ; ;AN000;
631 .ENDIF ; ;AN000;
632 .ENDIF ; ;AN000;
633 ADD SI,TYPE MODE_TABLE ; point to next record and.. ;AN000;
634 DEC CX ; decrement count ;AN000;
635 .endif ;AN006;
636 .ENDWHILE ; ;AN000;
637 .IF <BP EQ NOT_FOUND> ; if we never found it then.. ;AN000;
638 STC ; set error flag and.. ;AN000;
639 .ELSE ; ;AN000;
640 SUB SI,TYPE MODE_TABLE ; position us at the appropriate record ;AN000;
641 CLC ; clear error flag ;AN000;
642 .ENDIF ; ;AN000;
643 mov cs:INT10_V_Mode, 0FFh ;AN006; Done. Reset the value
644 pop bp ;AN007;
645 RET ; return to calling module ;AN000;
646SET_SEARCH ENDP ;AN000;
647
648
649;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
650;
651; PROCEDURE_NAME: GET_SEARCH
652;
653; FUNCTION:
654; THIS PROCEDURE SEARCHES THE VIDEO TABLE LOOKING FOR A MATCHING
655; VIDEO MODE.
656;
657; AT ENTRY: DS:SI POINTS TO VIDEO TABLE
658; AL CONTAINS THE MODE REQUESTED
659;
660; AT EXIT:
661; NORMAL: CARRY CLEAR, DS:SI POINTS TO MATCHING RECORD
662;
663; ERROR: CARRY SET
664;
665;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
666
667GET_SEARCH PROC NEAR ;AN000;
668 MOV CX,MAX_VIDEO_TAB_NUM ; # of total tables ;AN000;
669 .WHILE <[SI].V_MODE NE AL> AND ; while we are not pointing to ;AN000;
670 .WHILE <[SI].V_MODE NE UNOCCUPIED> AND ; the right mode and we are still ;AN000;
671 .WHILE <CX NE 0> ; looking at valid data..do.. ;AN000;
672 ADD SI,TYPE MODE_TABLE ; point to the next mode ;AN000;
673 DEC CX ; decrement counter ;AN000;
674 .ENDWHILE ; ;AN000;
675 .IF <CX EQ 0> OR ; did we find the mode? ;AN000;
676 .IF <[SI].V_MODE EQ UNOCCUPIED> ; ;AN000;
677 STC ; no ...so set error flag ;AN000;
678 .ELSE ; ;AN000;
679 CLC ; yes...clear error flag ;AN000;
680 .ENDIF ; ;AN000;
681 RET ; ;AN000;
682GET_SEARCH ENDP
683
684
685;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
686;
687; PROCEDURE_NAME: SET_CURSOR_EMUL
688;
689; FUNCTION:
690; THIS PROCEDURE SETS THE CURSOR EMULATION BIT OFF IN ROM BIOS. THIS
691; IS TO PROVIDE A CURSOR ON THE EGA WITH THE 5154 LOADED WITH AN 8X8
692; CHARACTER SET.
693;
694; AT ENTRY:
695;
696; AT EXIT:
697; NORMAL: CURSOR EMULATION BIT SET FOR APPLICABLE HARDWARE
698;
699; ERROR: N/A
700;
701;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
702
703SET_CURSOR_EMUL PROC NEAR ;AN000;
704 .IF <BIT HDWR_FLAG AND E5154_ACTIVE> ; EGA with 5154?.. ;AN000;
705 PUSH SI ; ;AN000;
706 PUSH DS ; yes..so.. ;AN000;
707 MOV AX,ROM_BIOS ; check cursor emulation.. ;AN000;
708 MOV DS,AX ; ;AN000;
709 MOV SI,CURSOR_FLAG ; ;AN000;
710 MOV AL,BYTE PTR [SI] ; ;AN000;
711 .IF <CS:REQ_TXT_LENGTH EQ DEFAULT_LENGTH> gt 25 lines requested? ;AN000;
712 AND AL,TURN_OFF ; no....set it OFF ;AN000;
713 .ELSE ; ;AN000;
714 OR AL,TURN_ON ; yes...set it ON ;AN000;
715 .ENDIF ; ;AN000;
716 MOV BYTE PTR [SI],AL ; ;AN000;
717 POP DS ; ;AN000;
718 POP SI ; ;AN000;
719 .ENDIF ; ;AN000;
720 RET ; return to calling module ;AN000;
721SET_CURSOR_EMUL ENDP ;AN000;
722
723
724;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
725;
726; PROCEDURE_NAME: INT10_COM
727;
728; FUNCTION:
729; THIS IS THE INTERRUPT 10H HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS:
730;
731; AH=1H (SET CURSOR TYPE). CURSOR EMULATION IS PERFORMED IF WE HAVE
732; AND EGA WITH A 5151 MONITOR, AND 43 LINES IS REQUESTED.
733;
734; AH=0H (SET MODE) SCREEN LENGTH IS MAINTAINED WHEN POSSIBLE. (IE. IN
735; TEXT MODES ONLY.)
736; AN004; Capturing Set Mode call and enforcing the # of Rows based on the
737; previous Set_IOCTL request lines was a design mistake. ANSI cannot
738; covers the all the application program out there which use INT 10h
739; directly to make a full screen interface by their own way.
740; This part of logic has been taken out by the management decision.
741; Instead, for each set mdoe INT 10h function call, if it were not
742; issued by SET_IOCTL procedures itself, or by DISPLAY.SYS program,
743; then we assume that it was issued by an APPS, that usually does not
744; know the new ANSI GET_IOCTL/SET_IOCTL interfaces.
745; In this case, ANSI is going to call GET_IOCTL and SET_IOCTL function
746; call - This is not to lose the local data consistency in ANSI.
747;
748; AT ENTRY:
749;
750; AT EXIT:
751; NORMAL:
752;
753; ERROR:
754;
755;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
756
757INT10_COM PROC NEAR ;AN000;
758 STI ; restore interrupts ;AN000;
759 .IF <AH NE SET_CURSOR_CALL> AND ; ;AN000;
760 .IF <AH NE SET_MODE> ;AN000;
761 JMP DWORD PTR CS:ROM_INT10 ; no...pass it on. ;AN000;
762 .ENDIF ;AN000;
763 .IF <AH EQ SET_CURSOR_CALL> ;Set cursor call? ;AN000;
764 PUSH AX ; ;AN000;
765 .IF <BIT CS:HDWR_FLAG AND E5151_ACTIVE> AND ; yes...check if we have an ega.. ;AN000;
766 .IF <CS:REQ_TXT_LENGTH NE DEFAULT_LENGTH> AND ; ;AN000;
767 .IF <CS:GRAPHICS_FLAG EQ TEXT_MODE> AND ; with 5151..so perform cursor mapping ;AN000;
768 .IF <CL GE 8> ; ;AN000;
769 MOV AL,CH ; check for cursor.. ;AN000;
770; AND AL,06H ; off emulation.!!!!!Wrong!!! TypeO error ;AN000;
771 and al, 60h ; off emulation. J.K.
772 .IF <AL NE 020H> ; ;AN000;
773 MOV AL,CH ; start position for cursor ;AN000;
774 CALL MAP_DOWN ; ;AN000;
775 MOV CH,AL ; ;AN000;
776 MOV AL,CL ; end position for cursor ;AN000;
777 CALL MAP_DOWN ; ;AN000;
778 MOV CL,AL ; ;AN000;
779 .ENDIF ; ;AN000;
780 .ENDIF ; ;AN000;
781 POP AX ; ;AN000;
782 JMP DWORD PTR CS:ROM_INT10 ; continue interrupt processing ;AN000;
783 .ELSE NEAR ; must be set mode call.. ;AN000;
784 PUSHF ; prepare for IRET ;AN000;
785 mov cs:ANSI_SetMode_Call_Flag, 1 ;AN008; Used by INT2F_COM
786 CALL DWORD PTR CS:ROM_INT10 ; call INT10 routine ;AN000;
787 mov cs:ANSI_SetMode_Call_Flag, 0 ;AN008; Reset it
788 push bp ;AN007;
789 push es ;AN007;
790 PUSH DS ; ;AN000;
791 PUSH SI ; ;AN000;
792 PUSH DI ; ;AN000;
793 PUSH DX ; ;AN000;
794 PUSH CX ; ;AN000;
795 PUSH BX ; ;AN000;
796 PUSH AX ; ;AN000;
797 PUSH CS ; ;AN000;
798 POP DS ; ;AN000;
799 MOV AH,REQ_VID_MODE ; get current mode.. ;AN000;
800 PUSHF ; ;AN000;
801 CALL DWORD PTR CS:ROM_INT10 ; ;AN000;
802 AND AL,VIDEO_MASK ; mask bit 7 (refresh) ;AN000;
803 test In_Generic_IOCTL_Flag, (I_AM_IN_NOW + SET_MODE_BY_DISPLAY) ;AN004; Flag is on?
804 .IF Z AND ;AN010;AN004;If not (I_AM_IN_NOW or SET_MODE_BY_DISPLAY),
805 .if <Switch_L EQ 0> ;AN010;
806 push ax ;AN004;Save mode
807 push es ;AN004;
808 push cs ;AN004;
809 pop es ;AN004;
810 mov di, offset My_IOCTL_Req_Packet ;AN004;
811 mov INT10_V_Mode, al ;AN006;Save current mode for SET_SEARCH
812 call Get_IOCTL ;AN004;
813 .IF NC ;AN004;
814 mov di, offset MY_IOCTL_Req_Packet ;AN004;
815 or In_Generic_IOCTL_Flag, CALLED_BY_INT10COM ;AN009;Do not set mode INT 10h again. Already done.
816 call Set_IOCTL ;AN004;
817 and In_Generic_IOCTL_Flag, not CALLED_BY_INT10COM ;AN009;
818 .ENDIF ;AN004;
819 pop es ;AN004;
820 pop ax ;AN004;Restore mode
821 mov INT10_V_Mode, 0FFh ;AN006;
822 .ENDIF ;AN004;
823 LEA SI,VIDEO_MODE_TABLE ; ;AN000;
824 CALL GET_SEARCH ; look through table for mode selected. ;AN000;
825 .IF NC ; if found then.. ;AN000;
826 .IF <[SI].D_MODE NE TEXT_MODE> ; text mode?.... ;AN000;
827 MOV GRAPHICS_FLAG,GRAPHICS_MODE ; no...set graphics flag. ;AN000;
828 .ELSE ; ;AN000;
829 MOV GRAPHICS_FLAG,TEXT_MODE ; yes...set text flag.. ;AN000;
830 .ENDIF ; ;AN000;
831 .ENDIF ; ;AN000;
832
833 test In_Generic_IOCTL_Flag, I_AM_IN_NOW ;AN010;
834 .if z AND ;AN010;
835 .if <Graphics_Flag EQ TEXT_MODE> AND ;
836 .if <Switch_L EQ 1> ;AN010;
837 call DO_ROWS ;AN010;
838 .endif ;AN010;
839
840;AN004;The following has been taken out!
841;AN004; .IF <REQ_TXT_LENGTH NE DEFAULT_LENGTH> ; 25 lines active? ;AN000;
842;AN004; MOV AX,DISPLAY_CHECK ; is DISPLAY.SYS there? ;AN000;
843;AN004; INT 2FH ; ;AN000;
844;AN004; .IF <AL NE INSTALLED> OR ; if not installed or.. ;AN000;
845;AN004; MOV AX,CHECK_ACTIVE ; if a code page has not.. ;AN000;
846;AN004; INT 2FH ; been selected then.. ;AN000;
847;AN004; .IF C ; ;AN000;
848;AN004; .IF <GRAPHICS_FLAG EQ TEXT_MODE> ; is this a text mode? ;AN000;
849;AN004; CALL ROM_LOAD_8X8 ; yes..load ROM 8x8 character set. ;AN000;
850;AN004; .ENDIF ; ;AN000;
851;AN004; .ENDIF ; ;AN000;
852;AN004; .ENDIF ; ;AN000;
853;AN004;Instead, for each SET mode function int 10h function call, if it is not
854;AN004;issued by ANSI GET_IOCTL and SET_IOCTL procedure themselves, we assume
855;AN004;that the APPS, which usually does not know the ANSI GET_IOCTL/SET_IOCTL
856;AN004;interfaces, intend to change the screen mode. In this case, ANSI is
857;AN004;kind enough to call GET_IOCTL and SET_IOCTL function call for themselves.
858
859 POP AX ; ;AN000;
860 POP BX ; ;AN000;
861 POP CX ; ;AN000;
862 POP DX ; ;AN000;
863 POP DI ; ;AN000;
864 POP SI ; ;AN000;
865 POP DS ; ;AN000;
866 pop es ;AN007;
867 pop bp ;AN007;
868 .ENDIF ; ;AN000;
869 IRET ; ;AN000;
870INT10_COM ENDP
871
872
873;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
874;
875; PROCEDURE_NAME: INT2F_COM
876;
877; FUNCTION:
878; THIS IS THE INTERRUPT 2FH HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS:
879;
880; AX=1A00H INSTALL REQUEST. ANSI WILL RETURN AL=FFH IF LOADED.
881;
882; AH=1A01H THIS IS THE INT2FH INTERFACE TO THE GENERIC IOCTL.
883; NOTE: THE GET CHARACTERISTICS FUNCTION CALL WILL RETURN
884; THE REQ_TXT_LENGTH IN THE BUFFER AS OPPOSED TO
885; THE ACTUAL HARDWARE SCREEN_LENGTH
886; Ax=1A02h This is an information passing from DISPLAY.SYS about
887; the INT 10h, SET MODE call.
888;
889; AT ENTRY:
890;
891; AT EXIT:
892; NORMAL:
893;
894; ERROR:
895;
896;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
897
898INT2F_COM PROC NEAR ;AN000;
899 STI ; ;AN000;
900 .IF <AH NE MULT_ANSI> OR ; is this for ANSI? ;AN000;
901; .IF <AL GT IOCTL_2F> ; ;AN000;
902 .IF <AL GT DA_INFO_2F> ;AN004;=2h
903 JMP DWORD PTR CS:ROM_INT2F ; no....jump to old INT2F ;AN000;
904 .ENDIF ; ;AN000;
905 .SELECT ; ;AN000;
906 .WHEN <AL EQ INSTALL_CHECK> NEAR ; if install check then.. ;AN000;
907 MOV AL,INSTALLED ; load value to indicate installed ;AN000;
908 CLC ; clear error flag. ;AN000;
909; .WHEN <AL EQ IOCTL_2F> ; request for IOCTL? ;AN000;
910 .WHEN <AL BE DA_INFO_2F> NEAR ;AN004;IOCTL or INFO passing?
911 PUSH BP ; ;AN000;
912 PUSH AX ; s ;AN000;
913 PUSH CX ; a ;AN000;
914 PUSH DX ; v ;AN000;
915 PUSH DS ; e r ;AN000;
916 PUSH ES ; e ;AN000;
917 PUSH DI ; g ;AN000;
918 PUSH SI ; s. ;AN000;
919 PUSH BX ; ;AN000;
920 PUSH DS ; load ES with DS (for call) ;AN000;
921 POP ES ; ;AN000;
922 MOV DI,DX ; load DI with DX (for call) ;AN000;
923 PUSH CS ; setup local addressability ;AN000;
924 POP DS ; ;AN000;
925 .IF <AL EQ IOCTL_2F> ;IOCTL request
926 .IF <CL EQ GET_FUNC> ; get function requested. ;AN000;
927 CALL GET_IOCTL ; ;AN000;
928 .IF NC AND ; if no error and... ;AN000;
929 .IF <HDWR_FLAG GE E5151_ACTIVE> AND ; gt 25 lines supported and.. ;AN000;
930 .IF <[SI].D_MODE EQ TEXT_MODE> ; this is a text mode then.. ;AN000;
931 .if <cs:Switch_L EQ 1> OR ;AN010;
932 .if <cs:ANSI_SetMode_Call_Flag NE 1> OR ;AN008; if not originated by ANSI thru. AH=0, INT10,
933 .if <cs:Display_Loaded_Before_me NE 1> ;AN008; or Display.sys not loaded before ANSI,
934 MOV BX,REQ_TXT_LENGTH ; then use REQ_TXT_LENGTH instead.. ;AN000;
935 MOV ES:[DI].RP_ROWS,BX ;
936 .endif
937 CLC ; ;AN000;
938 .ENDIF ; ;AN000;
939 .ELSEIF <CL EQ SET_FUNC> ; ;AN000;
940 CALL SET_IOCTL ; set function requested. ;AN000;
941 .ELSE ; invalid function... ;AN000;
942 MOV AX,INVALID_FUNC ; load error and... ;AN000;
943 STC ; set error flag. ;AN000;
944 .ENDIF ; ;AN000;
945 .ELSE ;AN004;Info. passing
946 .IF <ES:[DI].DA_INFO_LEVEL EQ 0> ;AN004; 0 = DA_SETMODE_FLAG request.
947 .IF <ES:[DI].DA_SETMODE_FLAG EQ 1> ;AN004;
948 or cs:In_Generic_IOCTL_Flag, SET_MODE_BY_DISPLAY ;AN004;Turn the flag on
949 .ELSE ;AN004;
950 and cs:In_Generic_IOCTL_Flag, not SET_MODE_BY_DISPLAY ;AN004;Turn the flag off
951 .ENDIF ;AN004;
952 .ELSE
953 .IF <ES:[DI].DA_INFO_LEVEL EQ 1> ;AN011; 1 = DA_OPTION_L_STATE query
954 mov al, cs:[Switch_L] ;AN011;
955 mov es:[di].DA_OPTION_L_STATE, al ;AN011;
956 .ENDIF
957 .ENDIF ;AN004;
958 clc ;AN004;clear carry. There is no Error in DOS 4.00 for this call.
959 .ENDIF
960 POP BX ; restore all.. ;AN000;
961 POP SI ; ;AN000;
962 POP DI ; registers except.. ;AN000;
963 POP ES ; ;AN000;
964 POP DS ; BP. ;AN000;
965 POP DX ; ;AN000;
966 POP CX ; ;AN000;
967 PUSH AX ; save error condition ;AN000;
968 MOV BP,SP ; setup frame pointer ;AN000;
969 MOV AX,[BP+10] ; load stack flags ;AN000;
970 .IF NC ; carry set?.. ;AN000;
971 AND AX,NOT_CY ; no.. set carry off. ;AN000;
972 MOV [BP+10],AX ; put back on stack. ;AN000;
973 POP AX ; remove error flag from stack ;AN000;
974 POP AX ; no error so bring back function call ;AN000;
975 XCHG AH,AL ; exchange to show that ANSI present ;AN000;
976 .ELSE ; ;AN000;
977 OR AX,CY ; yes...set carry on. ;AN000;
978 MOV [BP+10],AX ; put back on stack. ;AN000;
979 POP AX ; restore error flag ;AN000;
980 POP BP ; pop off saved value of AX (destroyed) ;AN000;
981 .ENDIF ; ;AN000;
982 POP BP ; restore final register. ;AN000;
983 .ENDSELECT ; ;AN000;
984ABORT: IRET ; ;AN000;
985INT2F_COM ENDP ;AN000;
986
987
988;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
989;
990; PROCEDURE_NAME: MAP_DOWN
991;
992; FUNCTION:
993; THIS PROCEDURE MAPS THE CURSOR START (END) POSITION FROM A 14 PEL
994; BOX SIZE TO AN 8 PEL BOX SIZE.
995;
996; AT ENTRY: AL HAS THE CURSOR START (END) TO BE MAPPED.
997;
998; AT EXIT:
999; NORMAL: AL CONTAINS THE MAPPED POSITION FOR CURSOR START (END)
1000;
1001; ERROR: N/A
1002;
1003;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1004
1005MAP_DOWN PROC NEAR ;AN000;
1006 PUSH BX ; ;AN000;
1007 XOR AH,AH ; clear upper byte of cursor position ;AN000;
1008 MOV BL,EIGHT ; multiply by current box size. ;AN000;
1009 PUSH DX ; al x ;AN000;
1010 MUL BL ; ---- = --- ;AN000;
1011 POP DX ; 14 8 ;AN000;
1012 MOV BL,FOURTEEN ; ;AN000;
1013 DIV BL ; divide by box size expected. ;AN000;
1014 POP BX ; ;AN000;
1015 RET ; ;AN000;
1016MAP_DOWN ENDP
1017
1018
1019;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1020;
1021; PROCEDURE_NAME: SET_VIDEO_MODE
1022;
1023; FUNCTION:
1024; THIS PROCEDURE SETS THE VIDEO MODE SPECIFIED IN DS:[SI].V_MODE.
1025;
1026; AT ENTRY: DS:SI.V_MODE CONTAINS MODE NUMBER
1027;
1028; AT EXIT:
1029; NORMAL: MODE SET
1030;
1031; ERROR: N/A
1032;
1033;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1034
1035SET_VIDEO_MODE PROC NEAR ;AN000;
1036 .if <BIT cs:In_Generic_IOCTL_Flag NAND CALLED_BY_INT10COM> ;AN009;
1037 MOV AL,[SI].V_MODE ; ..issue set mode ;AN000;
1038 .IF <BIT HDWR_FLAG AND LCD_ACTIVE> OR ; is this the LCD? ;AN000;
1039 .IF <BIT HDWR_FLAG AND VGA_ACTIVE> ; or VGA (done for BRECON card) ;AN000;
1040 PUSH DS ; yes... ;AN000;
1041 MOV BL,AL ; save mode ;AN000;
1042 MOV AX,ROM_BIOS ; ;AN000;
1043 MOV DS,AX ; get equipment status flag.. ;AN000;
1044 MOV AX,DS:[EQUIP_FLAG] ; ;AN000;
1045 AND AX,INIT_VID_MASK ; clear initial video bits.. ;AN000;
1046 .IF <BL EQ MODE7> OR ; are we setting mono? ;AN000;
1047 .IF <BL EQ MODE15> ; ;AN000;
1048 OR AX,LCD_MONO_MODE ; yes...set bits as mono ;AN000;
1049 .ELSE ; ;AN000;
1050 OR AX,LCD_COLOR_MODE ; no...set bits as color ;AN000;
1051 .ENDIF ; ;AN000;
1052 MOV DS:[EQUIP_FLAG],AX ; replace updated flag. ;AN000;
1053 MOV AL,BL ; restore mode. ;AN000;
1054 POP DS ; ;AN000;
1055 .ENDIF ; ;AN000;
1056 MOV AH,SET_MODE ; set mode ;AN000;
1057 INT 10H ;AN000;
1058 .endif ;AN009;
1059 RET ;AN000;
1060SET_VIDEO_MODE ENDP ;AN000;
1061
1062
1063;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1064;
1065; PROCEDURE_NAME: ROM_LOAD_8X8
1066;
1067; FUNCTION:
1068; THIS PROCEDURE LOADS THE ROM 8X8 CHARACTER SET AND ACTIVATES BLOCK=0
1069; FONT.
1070;
1071; AT ENTRY:
1072;
1073; AT EXIT:
1074; NORMAL: 8X8 ROM CHARACTER SET LOADED
1075;
1076; ERROR: N/A
1077;
1078;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1079
1080ROM_LOAD_8X8 PROC NEAR ;AN000;
1081 MOV AX,LOAD_8X8 ; load 8x8 ROM font ;AN000;
1082 XOR BL,BL ; ;AN000;
1083 PUSHF ;AN000;
1084 CALL DWORD PTR CS:ROM_INT10 ;AN000;
1085 MOV AX,SET_BLOCK_0 ; activate block = 0 ;AN000;
1086 XOR BL,BL ;AN000;
1087 PUSHF ;AN000;
1088 CALL DWORD PTR CS:ROM_INT10 ;AN000;
1089 RET ;AN000;
1090ROM_LOAD_8X8 ENDP ;AN000;
1091 ;AN000;
1092
1093;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1094;
1095; PROCEDURE_NAME: CHECK_FOR_DISPLAY
1096;
1097; FUNCTION:
1098; THIS PROCEDURE CHECKS TO SEE IF WE DISPLAY.SYS IS THERE, AND IF
1099; IT IS..IT HAS THE REQUIRED FONT.
1100;
1101; AT ENTRY: AX - DESIRED SCREEN LENGTH
1102;
1103; AT EXIT:
1104; NORMAL: CARRY CLEAR IF ALL OKAY
1105;
1106; ERROR: CARRY SET IF FONT NOT AVAILABLE.
1107;
1108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1109
1110CHECK_FOR_DISPLAY PROC NEAR ;AN000;
1111 .IF <AX EQ DEFAULT_LENGTH> OR ; is it just 25 lines needed? ;AN000;
1112 MOV AX,DISPLAY_CHECK ; ;AN000;
1113 INT 2FH ; ;AN000;
1114 .IF <AL NE INSTALLED> OR ; or is DISPLAY.SYS not there? ;AN000;
1115 MOV AX,CHECK_FOR_FONT ; ;AN000;
1116 INT 2FH ; or if it is does it have the.. ;AN000;
1117 .IF NC ; 8X8 font then. ;AN000;
1118 CLC ; clear carry ;AN000;
1119 .ELSE ; ;AN000;
1120 STC ; no font...set carry ;AN000;
1121 .ENDIF ; ;AN000;
1122 RET ; ;AN000;
1123CHECK_FOR_DISPLAY ENDP
1124
1125CODE ENDS
1126 END
diff --git a/v4.0/src/DEV/ANSI/MAKEFILE b/v4.0/src/DEV/ANSI/MAKEFILE
new file mode 100644
index 0000000..f249f75
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/MAKEFILE
@@ -0,0 +1,33 @@
1#*********************** Makefile for ansi.sys ****************************
2
3dos =..\..\dos
4inc =..\..\inc
5msg =..\..\messages
6
7#
8####################### Dependencies Begin Here ##########################
9#
10
11all: ansi.sys
12
13ansi.ctl: ansi.skl $(msg)\$(COUNTRY).msg
14
15ansi.obj: ansi.asm ansi.inc \
16 $(inc)\vector.inc \
17 $(inc)\mult.inc \
18 $(inc)\struc.inc
19
20ioctl.obj: ioctl.asm ansi.inc \
21 $(inc)\struc.inc
22
23ansiinit.obj: ansiinit.asm ansi.inc ansivid.inc \
24 $(inc)\struc.inc
25
26parser.obj: parser.asm ansi.inc $(inc)\sysmsg.inc $(inc)\parse.asm \
27 $(inc)\struc.inc ansi.ctl $(inc)\versiona.inc
28
29ansi.sys: ansi.obj ioctl.obj ansiinit.obj parser.obj ansi.lnk makefile
30 link @ansi.lnk
31 exe2bin ansi.exe ansi.sys
32 del ansi.exe
33
diff --git a/v4.0/src/DEV/ANSI/PARSER.ASM b/v4.0/src/DEV/ANSI/PARSER.ASM
new file mode 100644
index 0000000..8136db6
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/PARSER.ASM
@@ -0,0 +1,325 @@
1PAGE ,132
2TITLE PARSE CODE AND CONTROL BLOCKS FOR ANSI.SYS
3
4;****************** START OF SPECIFICATIONS **************************
5;
6; MODULE NAME: PARSER.ASM
7;
8; DESCRIPTIVE NAME: PARSES THE DEVICE= STATEMENT IN CONFIG.SYS FOR
9; ANSI.SYS
10;
11; FUNCTION: THE COMMAND LINE PASSED TO ANSI.SYS IN THE CONFIG.SYS
12; STATEMENT IS PARSED TO CHECK FOR THE /X SWITCH. A FLAG
13; IS CLEARED IF NOT FOUND.
14;
15; ENTRY POINT: PARSE_PARM
16;
17; INPUT: DS:SI POINTS TO EVERYTHING AFTER DEVICE=
18;
19; AT EXIT:
20; NORMAL: SWITCH FLAGS WILL BE SET IF /X or /L IS FOUND
21;
22; ERROR: CARRY SET
23;
24; INTERNAL REFERENCES:
25;
26; ROUTINES: SYSLOADMSG - MESSAGE RETRIEVER LOADING CODE
27; SYSDISPMSG - MESSAGE RETRIEVER DISPLAYING CODE
28; PARM_ERROR - DISPLAYS ERROR MESSAGE
29; SYSPARSE - PARSING CODE
30;
31; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE
32;
33; EXTERNAL REFERENCES:
34;
35; ROUTINES: N/A
36;
37; DATA AREAS: SWITCH - BYTE FLAG FOR EXISTENCE OF SWITCH PARAMETER
38;
39; NOTES:
40;
41; REVISION HISTORY:
42; A000 - DOS Version 4.00
43;
44; Label: "DOS ANSI.SYS Device Driver"
45; "Version 4.00 (C) Copyright 1988 Microsoft"
46; "Licensed Material - Program Property of Microsoft"
47;
48;****************** END OF SPECIFICATIONS ****************************
49;Modification history**********************************************************
50;AN001; P1529 ANSI /x /y gives wrong error message 10/8/87 J.K.
51;AN002; D397 /L option for "Enforcing" the line number 12/17/87 J.K.
52;AN003; D479 An option to disable the extended keyboard functions 02/12/88 J.K.
53;******************************************************************************
54
55
56INCLUDE ANSI.INC ; ANSI equates and structures ;AN000;
57.XLIST
58INCLUDE STRUC.INC ; Structured macros ;AN000;
59
60INCLUDE SYSMSG.INC ; Message retriever code ;AN000;
61MSG_UTILNAME <ANSI> ; Let message retriever know its ANSI.SYS ;AN000;
62.LIST
63
64PUBLIC PARSE_PARM ; near procedure for parsing DEVICE= statement ;AN000;
65
66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
67;
68; Set assemble switches for parse code that is not required!!
69;
70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
71
72DateSW EQU 0 ;AN000;
73TimeSW EQU 0 ;AN000;
74CmpxSW EQU 0 ;AN000;
75DrvSW EQU 0 ;AN000;
76QusSW EQU 0 ;AN000;
77NumSW EQU 0 ;AN000;
78KeySW EQU 0 ;AN000;
79Val1SW EQU 0 ;AN000;
80Val2SW EQU 0 ;AN000;
81Val3SW EQU 0 ;AN000;
82
83
84CODE SEGMENT PUBLIC BYTE
85 ASSUME CS:CODE
86
87.XLIST
88MSG_SERVICES <MSGDATA> ;AN000;
89MSG_SERVICES <DISPLAYmsg,LOADmsg,CHARmsg> ;AN000;
90MSG_SERVICES <ANSI.CL1> ;AN000;
91MSG_SERVICES <ANSI.CL2> ;AN000;
92MSG_SERVICES <ANSI.CLA> ;AN000;
93
94INCLUDE PARSE.ASM ; Parsing code ;AN000;
95.LIST
96
97
98EXTRN SWITCH_X:BYTE ; /X switch flag ;AN000;
99extrn Switch_L:Byte ;AN002; /L switch flag
100extrn Switch_K:Byte ;AN003; /K switch
101
102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103;
104; PARM control blocks for ANSI
105; Parsing DEVICE= statment from CONFIG.SYS
106;
107; DEVICE=[d:][path]ANSI.SYS [/X]
108;
109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
110 ;AN000;
111PARMS LABEL WORD ;AN000;
112 DW PARMSX ;AN000;
113 DB 0 ; no extra delimeters or EOLs. ;AN000;
114 ;AN000;
115PARMSX LABEL BYTE ;AN000;
116 DB 1,1 ;AN001; 1 valid positional operand
117 DW FILENAME ;AN001; filename
118 DB 1 ;AN002; 1 switche definition in the following
119 DW Switches ;AN002;
120 DB 0 ;AN001; no keywords
121 ;AN000;
122FILENAME LABEL WORD ;AN000;
123 DW 0200H ; file spec ;AN000;
124 DW 0001H ; cap by file table ;AN000;
125 DW RESULT_BUF ; result ;AN000;
126 DW NOVALS ; no value checking done ;AN000;
127 DB 0 ; no switch/keyword synonyms ;AN000;
128 ;AN000;
129Switches LABEL WORD ;AN000;
130 DW 0 ; switch with no value ;AN000;
131 DW 0 ; no functions ;AN000;
132 DW RESULT_BUF ; result ;AN000;
133 DW NOVALS ; no value checking done ;AN000;
134 DB 3 ;AN002;AN003; 3 switch synonym
135X_SWITCH DB "/X",0 ;AN002; /X name
136L_SWITCH DB "/L",0 ;AN002; /L
137K_SWITCH DB "/K",0 ;AN003; /K
138
139NOVALS LABEL BYTE ;AN000;
140 DB 0 ; no value checking done ;AN000;
141
142RESULT_BUF LABEL BYTE ;AN000;
143 DB ? ; type returned (number, string, etc.) ;AN000;
144 DB ? ; matched item tag (if applicable) ;AN000;
145SYNONYM_PTR DW 0 ; synonym ptr (if applicable) ;AN000;
146 DD ? ; value ;AN000;
147 ;AN000;
148SUBLIST LABEL DWORD ; list for substitution ;AN000;
149 DB SUB_SIZE ;AN000;
150 DB 0 ;AN000;
151 DD ? ;AN000;
152 DB 1 ;AN000;
153 DB LEFT_ASCIIZ ;AN000;
154 DB UNLIMITED ;AN000;
155 DB 1 ;AN000;
156 DB " " ;AN000;
157
158Old_SI dw ? ;AN001;
159Saved_Chr db 0 ;AN001;
160Continue_Flag db ON ;AN002;
161Parse_Err_Flag db OFF ;AN002;
162
163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
164;
165; PROCEDURE_NAME: PARSE_PARM
166;
167; FUNCTION:
168; THIS PROCEDURE PARSES THE DEVICE= PARAMETERS FROM THE INIT REQUEST
169; BLOCK. ERROR MESSAGES ARE DISPLAYED ACCORDINGLY.
170;
171; AT ENTRY: DS:SI POINTS TO EVERYTHING AFTER THE DEVICE= STATEMENT
172;
173; AT EXIT:
174; NORMAL: CARRY CLEAR - SWITCH FLAG BYTE SET TO 1 IF /X FOUND
175;
176; ERROR: CARRY SET
177;
178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
179
180PARSE_PARM PROC NEAR ;AN000;
181 CALL SYSLOADMSG ; load message ;AN000;
182 .IF C NEAR ;AN000;
183 CALL SYSDISPMSG ; display error message ;AN000;
184 STC ; ensure carry still set ;AN000;
185 .ELSE NEAR ;AN000;
186 PUSH CS ; establish ES .. ;AN000;
187 POP ES ; addressability to data ;AN000;
188 LEA DI,PARMS ; point to PARMS control block ;AN000;
189 XOR CX,CX ; clear both CX and DX for ;AN000;
190 XOR DX,DX ; SYSPARSE ;AN000;
191 CALL SYSPARSE ; move pointer past file spec ;AN000;
192 mov Switch_L, OFF ;AN002;
193 mov Switch_X, OFF ;AN002;
194 .WHILE <Continue_Flag EQ ON> ;AN002;
195 mov Old_SI, SI ;AN001;to be use by PARM_ERROR
196 call SysParse ;AN002;
197 .IF <AX EQ RC_EOL> ;AN002;
198 mov Continue_Flag, OFF ;AN002;
199 .ELSE ;AN002;
200 .IF <AX NE RC_NO_ERROR> ;AN002;
201 mov Continue_Flag, OFF ;AN002;
202 mov Switch_X, OFF ;AN002;
203 mov Switch_L, OFF ;AN002;
204 mov Switch_K, OFF ;AN003;
205 call Parm_Error ;AN002;
206 mov Parse_Err_Flag,ON;AN002;
207 .ELSE ;AN002;
208 .IF <Synonym_ptr EQ <offset X_SWITCH>> ;AN002;
209 mov Switch_X, ON ;AN002;
210 .ELSE ;AN002;
211 .IF <Synonym_ptr EQ <offset L_SWITCH>> ;AN003;
212 mov Switch_L, ON ;AN002;
213 .ELSE ;AN003;Must be /K option.
214 mov Switch_K, ON ;AN003;/K entered.
215 .ENDIF ;AN003;
216 .ENDIF ;AN002;
217 clc ;AN002;
218 .ENDIF ;AN002;
219 .ENDIF ;AN002;
220 .ENDWHILE ;AN002;
221 .IF <Parse_Err_Flag EQ ON> ;AN002;
222 stc ;AN002;
223 .ELSE ;AN002;
224 clc ;AN002;
225 .ENDIF ;AN002;
226 .ENDIF ;AN002;
227
228; mov cs:Old_SI, SI ;AN001; Save pointer to parm
229; CALL SYSPARSE ; look for /X switch ;AN000;
230; .IF <AX EQ RC_EOL> ; if EOL then.. ;AN000;
231; MOV ES:SWITCH_X,0 ; no switch...clear flag ;AN000;
232; CLC ; clear carry ;AN000;
233; .ELSE ; else.. ;AN000;
234; .IF <AX GT RC_NO_ERROR> ;AN001;If any error
235; call parm_error ;AN001; the show the error msg
236; stc ;AN001;
237; .ELSE ; else..leave flag set.. ;AN000;
238; mov cs:Old_SI, SI ;AN001;
239; CALL SYSPARSE ; check for further parms ;AN000;
240; .IF <AX NE RC_EOL> ; if other parms then... ;AN000;
241; CALL PARM_ERROR ; display 'Invalid parameter' message ;AN000;
242; STC ; error! ;AN000;
243; .ELSE ; no other parms so.. ;AN000;
244; CLC ; clear carry ;AN000;
245; .ENDIF ; ;AN000;
246; .ENDIF ; ;AN000;
247; .ENDIF ; ;AN000;
248; .ENDIF ; ;AN000;
249
250 RET ;AN000;
251PARSE_PARM ENDP ;AN000;
252 ;AN000;
253
254;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
255;
256; PROCEDURE_NAME: PARM_ERROR
257;
258; FUNCTION:
259; LOADS AND DISPLAYS "Invalid parameter" MESSAGE
260;
261; AT ENTRY:
262; DS:Old_SI -> parms that is invalid
263;
264; AT EXIT:
265; NORMAL: ERROR MESSAGE DISPLAYED
266;
267; ERROR: N/A
268;
269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
270
271PARM_ERROR PROC NEAR ;AN000;
272 PUSH CX ;AN000;
273 PUSH SI ;AN000;
274 PUSH ES ; ;AN000;
275 PUSH DS ; ;AN000;
276
277; PUSH CS ; ;AN000;
278; POP DS ; establish addressability ;AN000;
279; MOV BX,DX ; ;AN000;
280; LES DX,[BX].RES_PTR ; find offending parameter ;AN000;
281 push ds ;AN001;
282 pop es ;AN001;
283 mov si, cs:Old_SI ;AN001;Now es:dx -> offending parms
284 push si ;AN001;Save it
285Get_CR:
286 cmp byte ptr es:[si], 13 ;AN001;CR?
287 je Got_CR ;AN001;
288 inc si ;AN001;
289 jmp Get_CR ;AN001;
290Got_CR: ;AN001;
291 inc si ;AN001; The next char.
292 mov al, byte ptr es:[si] ;AN001;
293 mov cs:Saved_Chr, al ;AN001; Save the next char
294
295 mov byte ptr es:[si], 0 ;AN001; and make it an ASCIIZ
296 mov cs:Old_SI, si ;AN001; Set it again
297 pop dx ;AN001; saved SI -> DX
298
299 push cs ;AN001;
300 pop ds ;AN001;for addressability
301
302 LEA SI,SUBLIST ; ..and place the offset.. ;AN000;
303 MOV [SI].SUB_PTR_O,DX ; ..in the SUBLIST.. ;AN000;
304 MOV [SI].SUB_PTR_S,ES ; ;AN000;
305 MOV AX,INVALID_PARM ; load 'Invalid parameter' message number ;AN000;
306 MOV BX,STDERR ; to standard error ;AN000;
307 MOV CX,ONE ; 1 substitution ;AN000;
308 XOR DL,DL ; no input ;AN000;
309 MOV DH,UTILITY_MSG_CLASS ; parse error ;AN000;
310 CALL SYSDISPMSG ; display error message ;AN000;
311 mov si, cs:Old_SI ;AN001;restore the original char.
312 mov cl, cs:Saved_Chr ;AN001;
313 mov byte ptr es:[si], cl ;AN001;
314
315 POP DS ;AN000;
316 POP ES ;AN000;
317 POP SI ;AN000;
318 POP CX ;AN000;
319 RET ;AN000;
320PARM_ERROR ENDP
321
322include msgdcl.inc
323
324CODE ENDS
325 END