]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/ANSI/ANSI.ASM
2 TITLE CONDEV FANCY
CONSOLE DRIVER
4 ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
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 ;------------------------------------------------------------------------------
44 INCLUDE ANSI
.INC ; WGR equates and structures ;AN000;
46 INCLUDE STRUC.INC ; WGR include STRUC macros ;AN000;
49 BREAK <ANSI driver
code>
51 CR
=13 ;CARRIAGE RETURN
54 BRKADR
=6
CH ;006C BREAK VECTOR ADDRESS
55 ASNMAX
=400 ;WGR (increased) SIZE OF KEY ASSIGNMENT BUFFER
57 PUBLIC SWITCH_X
; WGR/X option for extended keyboard redefinition support;AN000;
58 PUBLIC SCAN_LINES
; WGR ;AN000;
59 PUBLIC VIDEO_MODE_TABLE
; WGR ;AN000;
60 PUBLIC VIDEO_TABLE_MAX
; WGR ;AN000;
61 public MAX_VIDEO_TAB_NUM
;P1767
62 PUBLIC PTRSAV
; WGR ;AN000;
63 PUBLIC ERR1
; WGR ;AN000;
64 PUBLIC ERR2
; WGR ;AN000;
65 PUBLIC EXT_16
; WGR ;AN000;
66 PUBLIC BRKADR
; WGR ;AN000;
67 PUBLIC BRKKY
; WGR ;AN000;
68 PUBLIC COUT
; WGR ;AN000;
69 PUBLIC BASE
; WGR ;AN000;
70 PUBLIC MODE
; WGR ;AN000;
71 PUBLIC MAXCOL
; WGR ;AN000;
72 PUBLIC TRANS
; WGR ;AN000;
73 PUBLIC STATUS
; WGR ;AN000;
74 PUBLIC EXIT
; WGR ;AN000;
75 PUBLIC NO_OPERATION
; WGR ;AN000;
76 PUBLIC HDWR_FLAG
; WGR ;AN000;
77 public Switch_L
;AN004;
78 public Switch_K
;AN005;
80 CODE SEGMENT PUBLIC BYTE
82 ASSUME
CS:CODE,DS:NOTHING
,ES:NOTHING
83 ;-----------------------------------------------
85 ; C O N - CONSOLE DEVICE DRIVER
88 EXTRN CON$INIT
:NEAR ; WGR ANSI initialization code
89 EXTRN GENERIC_IOCTL
:NEAR ; WGR Generic IOCTL code
90 EXTRN REQ_TXT_LENGTH
:WORD ; WGR current text length
91 EXTRN GRAPHICS_FLAG
:BYTE ; WGR graphics flag
93 CONDEV: ;HEADER FOR DEVICE "CON"
95 DW 1100000001010011B ;WGR changed to match CON ;AC000;
100 ;--------------------------------------------------------------
102 ; COMMAND JUMP TABLES
105 DW NO_OPERATION
; WGR ;AC000;
106 DW NO_OPERATION
; WGR ;AC000;
107 DW NO_OPERATION
; WGR ;AC000;
110 DW NO_OPERATION
; WGR ;AC000;
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;
124 MAX_CMD EQU
($ - CONTBL
)/2 ; WGR size of CONTBL ;AN000;
131 DW CUF
;cursor forward
135 DW CUP
;cursor position
141 DW CPR
;cursor postion report
143 DW CUP
;cursor position
149 DW SGR
;select graphics rendition
151 DW DSR
;device status report
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
157 DW PSCP
;save cursor postion
159 DW PRCP
;restore cursor position
162 GRMODE
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
186 ;---------------------------------------------------
190 CMDLEN
= 0 ;LENGTH OF THIS COMMAND
191 UNIT
= 1 ;SUB UNIT SPECIFIER
192 CMD
= 2 ;COMMAND CODE
194 MEDIA
= 13 ;MEDIA DESCRIPTOR
195 TRANS
= 14 ;TRANSFER ADDRESS
196 COUNT
= 18 ;COUNT OF BLOCKS OR CHARACTERS
197 START
= 20 ;FIRST BLOCK TO TRANSFER
201 BUF1: BUF_DATA
<> ; WGR Next CON Buffer area ;AN000;
206 MOV WORD PTR CS:[PTRSAV
],BX
207 MOV WORD PTR CS:[PTRSAV
+2],ES
222 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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;
230 MOV CONPTR
.DEV_HDRO
,DI ; WGR ;AN000;
231 MOV CONPTR
.DEV_HDRS
,CS ; WGR ;AN000;
232 CLD ; WGR all moves forward ;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;
242 ;$SEARCH WHILE ; WGR pointer to next device header is NOT ;AN000;
244 PUSH ES ; WGR -1 ;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;
250 CMP DI,-1 ; WGR 0FFFFH ;AN000;
251 ;$LEAVE E ; WGR ;AN000;
253 NOT0FFFF: ; 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;
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;
269 X1: MOV CONPTR
.CON_STRAS
,AX ; 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;
274 X2: MOV CONPTR
.CON_INTRS
,AX ; WGR ;AN000;
276 ;$ORELSE ; WGR FInd next header to have the same ;AN000;
277 JMP L4
; WGR Device Name ;AN000;
279 LES DI,DWORD PTR NHD
.DH_NEXTO
;WGR ;AN000;
280 ;$ENDLOOP ; WGR ;AN000;
284 LDS BX,CS:[PTRSAV
] ;GET PONTER TO I/O PACKET
286 MOV CX,WORD PTR DS:[BX].COUNT
;CX = COUNT
288 MOV AL,BYTE PTR DS:[BX].CMD
293 CMP AL,MAX_CMD
; WGR not a call for ANSI...chain to lower device;AC000;
296 LES DI,DWORD PTR DS:[BX].TRANS
303 JMP WORD PTR [SI] ;GO DO COMMAND
305 ;=====================================================
307 ;= SUBROUTINES SHARED BY MULTIPLE DEVICES
309 ;=====================================================
310 ;----------------------------------------------------------
312 ; EXIT - ALL ROUTINES RETURN THROUGH THIS PATH
314 BUS$EXIT
: ;DEVICE BUSY EXIT
318 NO_OPERATION: ; WGR ;AN000;
319 CALL PASS_CONTROL
; WGR Pass control to lower CON ;AN000;
320 JMP SHORT ERR2
; WGR ;AN000;
323 MOV AH,10000001B ;MARK ERROR RETURN
328 EXIT: MOV AH,00000001B
329 ERR1: LDS BX,CS:[PTRSAV
]
330 MOV WORD PTR [BX].STATUS
,AX ;MARK OPERATION COMPLETE
341 RET ;RESTORE REGS AND RETURN
343 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345 ; PASS CONTROL WGR ;AN000;
347 ; This calls the attached device to perform any further ;AN000;
348 ; action on the call! WGR ;AN000;
350 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
351 PASS_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;
357 PASS_CONTROL ENDP
; WGR ;AN000;
358 ;----------------------------------------------- ;AN000;
363 MOV CS:ALTAH
,3 ;INDICATE BREAK KEY SET
367 ; WARNING - Variables are very order dependent, be careful
368 ; when adding new ones! - c.p.
370 WRAP
DB 0 ; 0 = WRAP, 1 = NO WRAP
383 REPORT
DB ESC_CHAR
,'[00;00R',CR
;CURSOR POSTION REPORT BUFFER
384 ALTAH
DB 0 ;Special key handling
386 EXT_16
DB 0 ; WGR Extended INT 16h flag ;AN000;
387 Switch_X
DB OFF
; WGR /X flag ;AN000;
388 Switch_L db OFF
;DCR397; 1= /L flag entered.
389 Switch_K db OFF
;AN005; To control EXT_16
390 SCAN_LINES
DB ?
; WGR flag for available scan lines (VGA) ;AN000;
391 HDWR_FLAG
DW 0 ; WGR byte of flags indicating video support ;AN000;
393 VIDEO_MODE_TABLE
LABEL BYTE ; WGR table containing applicable ;AN000;
394 MODE_TABLE
<> ; WGR video modes and corresponding ;AN000;
395 MODE_TABLE
<> ; WGR data. ;AN000;
396 MODE_TABLE
<> ; WGR this table is initialized at ;AN000;
397 MODE_TABLE
<> ; WGR INIT time ;AN000;
398 MODE_TABLE
<> ; WGR ;AN000;
399 MODE_TABLE
<> ; WGR ;AN000;
400 MODE_TABLE
<> ; WGR ;AN000;
401 MODE_TABLE
<> ; WGR ;AN000;
402 MODE_TABLE
<> ; WGR ;AN000;
403 MODE_TABLE
<> ; WGR ;AN000;
404 MODE_TABLE
<> ; WGR ;AN000;
405 MODE_TABLE
<> ; WGR ;AN000;
406 MODE_TABLE
<> ; WGR ;AN000;
407 MODE_TABLE
<> ; WGR ;AN000;
408 MODE_TABLE
<> ; WGR ;AN000;
409 VIDEO_TABLE_MAX EQU
$ ; WGR maximum address for video table ;AN000;
410 MAX_VIDEO_TAB_NUM EQU
($-VIDEO_MODE_TABLE
)/TYPE MODE_TABLE
;P1767 Max number of table
412 ;-------------------------------------------------------------
414 ; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
417 ATTR
DB 00000111B ;CHARACTER ATTRIBUTE
418 BPAGE
DB 0 ;BASE PAGE
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;
471 MOV AH,BYTE PTR [REQ_TXT_LENGTH
] ; GHG Fix for ROUNDUP/PALACE
473 LF2: ; GHG Fix for ROUNDUP/PALACE
474 cmp [row
],AH ; GHG Fix for ROUNDUP/PALACE
476 DEC AH ; GHG Fix for ROUNDUP/PALACE
477 mov [row
],AH ; GHG Fix for ROUNDUP/PALACE
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.
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;
508 ;AN006;AN008; Other modes (=APA mode) use TeleType function of
509 ; writing LF to scroll the screen!.
516 MOV AL,[MAXCOL
] ; 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;
525 MOV AX,[REQ_TXT_LENGTH
] ; WGR ;AN000;
529 MOV CX,AX ; WGR ;AN000;
548 ; We must protect this with a critical section
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
556 cmp cs:[Hdwr_Flag
], MCGA_ACTIVE
;AN006;AN007;above CGA level?
557 jae Skip_Video_Off
;AN006;AN007;
565 out dx,al ;turn off video
566 Skip_Video_Off: ;AN006;
571 cmp cs:[Hdwr_Flag
], MCGA_ACTIVE
;AN006;AN007;
572 jae Skip_Video_On
;AN006;AN007;
575 out dx,al ;turn on video
577 Skip_Video_On: ;AN006;
578 mov ax,8100H
+ CritDevice
; Leave Device critical section
583 ;------------------------------------------------------
585 ; CONSOLE READ ROUTINE
591 CALL CHRIN
;GET CHAR IN AL
593 STOSB ;STORE CHAR AT ES:DI
597 ;---------------------------------------------------------
599 ; INPUT SINGLE CHAR INTO AL
602 XCHG AL,ALTAH
;GET CHARACTER & ZERO ALTAH
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;
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;
622 .ELSE ; WGR extended interrupt not available ;AN000;
623 INT 16H
; WGR ;AN000;
624 CALL SCAN
; WGR check for redefinition ;AN000;
626 JNZ ALT10
;IF NO MATCH JUST RETURN IT
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;
640 KEY5A: ; Jmp here to get rest of translation
641 CALL KEY5
;GET FIRST KEY FROM TRANSLATION
643 OR AX,AX ;Check for non-key after BREAK
645 OR AL,AL ;SPECIAL CASE?
647 MOV ALTAH
,AH ;STORE SPECIAL KEY
650 KEY5: MOV BX,KEYPTR
;GET A KEY FROM TRANSLATION TABLE
661 SCAN: MOV BX,OFFSET BUF
662 KEYLP: MOV CL,BYTE PTR [BX]
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;
671 CMP AL,BYTE PTR [BX+1] ; WGR no...compare the byte ;AN000;
678 ;--------------------------------------------------------------
680 ; KEYBOARD NON DESTRUCTIVE READ, NO WAIT
694 .IF <EXT_16
EQ ON> ; WGR extended INT16 available? ;AN000;
695 ADD AH,10H
; WGR yes....adjust to extended call ;AN000;
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;
709 INT 16H
; WGR ;AN000;
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;
722 MOV AL,BYTE PTR [BX+2]
723 CMP BYTE PTR [BX+1],0
725 MOV AL,BYTE PTR [BX+3]
726 RDEXIT: LDS BX,[PTRSAV
]
730 ;--------------------------------------------------------------
732 ; KEYBOARD FLUSH ROUTINE
735 MOV [ALTAH
],0 ;Clear out holding buffer
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
746 .IF <EXT_16
EQ ON> ; WGR is extended call available? ;AN000;
747 ADD AH,10H
; WGR yes....adjust for extended ;AN000;
752 .IF <EXT_16
EQ ON> ; WGR is extended call available? ;AN000;
753 ADD AH,10H
; WGR yes....adjust for extended ;AN000;
760 ;----------------------------------------------------------
762 ; CONSOLE WRITE ROUTINE
767 CON$LP
: MOV AL,ES:[DI] ;GET CHAR
769 CALL OUTC
;OUTPUT CHAR
770 LOOP CON$LP
;REPEAT UNTIL ALL THROUGH
791 XCHG AX,SI ; SAVE CHARACTER TO STUFF
792 MOV AX,40H
; POINT TO ROS BIOS
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
799 MOV WORD PTR CS:[BASE
],0B000H
800 NOT_BW: MOV AL,DS:[62H
] ; GET ACTIVE PAGE
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
809 SHR AX,CL ; CONVERT TO A SEGMENT
813 XCHG AX,SI ; GET BACK CHARACTER IN AL
827 ;----------------------------------------------------------
829 ; OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE
831 VIDEO: MOV SI,OFFSET STATE
837 S22: MOV WORD PTR [SI],OFFSET S3
847 MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO
856 XCHG AL,BYTE PTR [BX]
859 ADD BYTE PTR [BX],AL ;MOVE IN DIGIT
866 CMP AL,'"' ;BEGIN QUOTED STRING
870 S3E: MOV WORD PTR [SI],OFFSET S4
875 ; ENTER QUOTED STRINGS
878 S4: CMP AL,[INQ
] ;CHECK FOR STRING TERMINATOR
880 DEC PRMCNT
;TERMINATE STRING
881 MOV WORD PTR [SI],OFFSET S3
886 MOV WORD PTR [SI],OFFSET S4
889 ; LOOK FOR ANSI COMMAND SPECIFIED IN AL
892 S7: MOV BX,OFFSET CMDTABL
-3
900 S7B: MOV AX,WORD PTR [BX+1] ;AX = JUMP ADDRESS
903 ADD BX,ASNPTR
;BX = PTR TO PARM LIST
905 XOR DH,DH ;DX = FIRST PARAMETER
909 INC CX ;CX = DX, CX=1 IF DX=0
910 S7C: JMP AX ;AL = COMMAND
912 S1: CMP AL,ESC_CHAR
;ESCAPE SEQUENCE?
914 MOV WORD PTR [SI],OFFSET S2
918 S1A: MOV WORD PTR [STATE
],OFFSET S1
921 MOVCUR: CMP BYTE PTR [BX],AH
925 SETCUR: MOV DX,WORD PTR COL
931 CUP: .IF <GRAPHICS_FLAG
EQ GRAPHICS_MODE
> ; WGR ;AN000;
932 CMP CL,DEFAULT_LENGTH
; WGR ;AN000;
934 CMP CL,BYTE PTR [REQ_TXT_LENGTH
] ; WGR ;AN000;
938 MOV CH,BYTE PTR [BX+1]
952 CUF1: MOV BX,OFFSET COL
959 CUU1: MOV BX,OFFSET ROW
962 CUD: .IF <GRAPHICS_FLAG
EQ GRAPHICS_MODE
> ; WGR ;AN000;
963 MOV AH,DEFAULT_LENGTH
; WGR ;AN000;
965 MOV AH,BYTE PTR [REQ_TXT_LENGTH
] ; WGR ;AN000;
967 MOV AL,1 ; WGR ;AN000;
971 cmp dl, 0 ;AN003; DL = previous parameter
973 mov Switch_X
, OFF
;AN003; reset it if 0.
976 cmp dl, 1 ;AN003; 1 ?
978 jmp S1A
;AN003; ignore it
980 mov Switch_X
, ON ;AN003; set it if 1.
983 PSCP: MOV AX,WORD PTR COL
995 SGR1: MOV AL,BYTE PTR [BX]
998 SGR2: MOV AH,BYTE PTR [BX]
1004 MOV AX,WORD PTR [BX-2]
1015 MOV AL,MODE
; ;AN009;
1016 CMP AL,11H
; ;AN009;
1018 CMP AL,12H
; ;AN009;
1020 .IF <GRAPHICS_FLAG
EQ GRAPHICS_MODE
> ; WGR ;AN000;
1021 MOV DH,DEFAULT_LENGTH
; WGR ;AN000;
1023 MOV DH,BYTE PTR [REQ_TXT_LENGTH
] ; WGR ;AN000;
1024 .ENDIF
; WGR ;AN000;
1025 ERASE: 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;
1035 EL: MOV CX,WORD PTR COL
1045 DSR: 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
1053 MOV WORD PTR REPORT
+2,AX
1054 POP DX ; WGR ;AN000;
1055 MOV AL,DL ; WGR ;AN000;
1057 MOV WORD PTR REPORT
+5,AX
1059 MOV [KEYPTR
],OFFSET REPORT
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;
1092 XCHG DL,PRMCNT
;GET CHARACTER COUNT
1097 MOV AX,WORD PTR [BX] ;GET CHARACTER TO BE ASSIGNED
1098 CALL SCAN
;LOOK IT UP
1101 MOV DI,BX ;DELETE OLD DEFINITION
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.
1111 MOV CX,OFFSET BUF
+ASNMAX
1114 PUSH ES ;SAVE USER'S ES
1116 POP ES ;SET UP ES ADDRESSABILITY
1123 MOV BYTE PTR [BX-1],DL ;SET LENGTH
1124 ADD ASNPTR
,DX ;REMEMBER END OF LIST
1126 CMP ASNPTR
,ASNMAX
; Too much???
1128 SUB BX,DX ; Next three instructions undo the above
1130 KEYAS3: MOV BYTE PTR [BX-1],00
1131 MOV STATE
,OFFSET S1
;RETURN
1134 GETPTR: MOV BX,ASNPTR
1141 GET1: ADD BX,OFFSET BUF
1145 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
1147 ; CHECK_FOR_REMAP: 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;
1152 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
1154 CHECK_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;
1162 CHECK_FOR_REMAP ENDP
; WGR ;AN000;
1165 BUF
DB 4,00,72H
,16,0
1166 DB ASNMAX
+8-5 DUP (?
)