diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DEV/ANSI | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/DEV/ANSI')
| -rw-r--r-- | v4.0/src/DEV/ANSI/ANSI.ASM | 1169 | ||||
| -rw-r--r-- | v4.0/src/DEV/ANSI/ANSI.INC | 312 | ||||
| -rw-r--r-- | v4.0/src/DEV/ANSI/ANSI.LNK | 8 | ||||
| -rw-r--r-- | v4.0/src/DEV/ANSI/ANSI.SKL | 16 | ||||
| -rw-r--r-- | v4.0/src/DEV/ANSI/ANSIINIT.ASM | 413 | ||||
| -rw-r--r-- | v4.0/src/DEV/ANSI/ANSIVID.INC | 54 | ||||
| -rw-r--r-- | v4.0/src/DEV/ANSI/IOCTL.ASM | 1126 | ||||
| -rw-r--r-- | v4.0/src/DEV/ANSI/MAKEFILE | 33 | ||||
| -rw-r--r-- | v4.0/src/DEV/ANSI/PARSER.ASM | 325 |
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 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE 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 | |||
| 22 | TRUE EQU 0FFFFh | ||
| 23 | FALSE EQU 0 | ||
| 24 | |||
| 25 | BREAK MACRO subtitle | ||
| 26 | SUBTTL subtitle | ||
| 27 | PAGE ,132 | ||
| 28 | ENDM | ||
| 29 | |||
| 30 | AsmVars Macro varlist | ||
| 31 | IRP var,<varlist> | ||
| 32 | AsmVar var | ||
| 33 | ENDM | ||
| 34 | ENDM | ||
| 35 | |||
| 36 | AsmVar Macro var | ||
| 37 | IFNDEF var | ||
| 38 | var = FALSE | ||
| 39 | ENDIF | ||
| 40 | ENDM | ||
| 41 | |||
| 42 | INCLUDE VECTOR.INC | ||
| 43 | INCLUDE MULT.INC | ||
| 44 | INCLUDE ANSI.INC ; WGR equates and structures ;AN000; | ||
| 45 | .xlist | ||
| 46 | INCLUDE STRUC.INC ; WGR include STRUC macros ;AN000; | ||
| 47 | .list | ||
| 48 | |||
| 49 | BREAK <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 | |||
| 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; | ||
| 79 | ;AN000; | ||
| 80 | CODE SEGMENT PUBLIC BYTE | ||
| 81 | |||
| 82 | ASSUME CS:CODE,DS:NOTHING,ES:NOTHING | ||
| 83 | ;----------------------------------------------- | ||
| 84 | ; | ||
| 85 | ; C O N - CONSOLE DEVICE DRIVER | ||
| 86 | ; | ||
| 87 | |||
| 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 | ||
| 92 | |||
| 93 | CONDEV: ;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 | ||
| 103 | CONTBL: | ||
| 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; | ||
| 124 | MAX_CMD EQU ($ - CONTBL)/2 ; WGR size of CONTBL ;AN000; | ||
| 125 | |||
| 126 | CMDTABL 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 | |||
| 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 | ||
| 184 | DB 0FFH | ||
| 185 | |||
| 186 | ;--------------------------------------------------- | ||
| 187 | ; | ||
| 188 | ; Device entry point | ||
| 189 | ; | ||
| 190 | CMDLEN = 0 ;LENGTH OF THIS COMMAND | ||
| 191 | UNIT = 1 ;SUB UNIT SPECIFIER | ||
| 192 | CMD = 2 ;COMMAND CODE | ||
| 193 | STATUS = 3 ;STATUS | ||
| 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 | ||
| 198 | |||
| 199 | PTRSAV DD 0 | ||
| 200 | |||
| 201 | BUF1: BUF_DATA <> ; WGR Next CON Buffer area ;AN000; | ||
| 202 | |||
| 203 | STRATP PROC FAR | ||
| 204 | |||
| 205 | STRATEGY: | ||
| 206 | MOV WORD PTR CS:[PTRSAV],BX | ||
| 207 | MOV WORD PTR CS:[PTRSAV+2],ES | ||
| 208 | RET | ||
| 209 | |||
| 210 | STRATP ENDP | ||
| 211 | |||
| 212 | ENTRY: | ||
| 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; | ||
| 243 | L1: ; 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; | ||
| 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; | ||
| 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; | ||
| 269 | X1: 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; | ||
| 274 | X2: 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; | ||
| 278 | L3: ; WGR ;AN000; | ||
| 279 | LES DI,DWORD PTR NHD.DH_NEXTO;WGR ;AN000; | ||
| 280 | ;$ENDLOOP ; WGR ;AN000; | ||
| 281 | JMP L1 ; WGR ;AN000; | ||
| 282 | L4: ; 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 | ; | ||
| 314 | BUS$EXIT: ;DEVICE BUSY EXIT | ||
| 315 | MOV AH,00000011B | ||
| 316 | JMP SHORT ERR1 | ||
| 317 | |||
| 318 | NO_OPERATION: ; WGR ;AN000; | ||
| 319 | CALL PASS_CONTROL ; WGR Pass control to lower CON ;AN000; | ||
| 320 | JMP SHORT ERR2 ; WGR ;AN000; | ||
| 321 | |||
| 322 | ERR$EXIT: | ||
| 323 | MOV AH,10000001B ;MARK ERROR RETURN | ||
| 324 | JMP SHORT ERR1 | ||
| 325 | |||
| 326 | EXITP PROC FAR | ||
| 327 | |||
| 328 | EXIT: MOV AH,00000001B | ||
| 329 | ERR1: LDS BX,CS:[PTRSAV] | ||
| 330 | MOV WORD PTR [BX].STATUS,AX ;MARK OPERATION COMPLETE | ||
| 331 | ERR2: | ||
| 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 | ||
| 342 | EXITP 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; | ||
| 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; | ||
| 356 | RET ; WGR ;AN000; | ||
| 357 | PASS_CONTROL ENDP ; WGR ;AN000; | ||
| 358 | ;----------------------------------------------- ;AN000; | ||
| 359 | ; | ||
| 360 | ; BREAK KEY HANDLING | ||
| 361 | ; | ||
| 362 | BRKKY: | ||
| 363 | MOV CS:ALTAH,3 ;INDICATE BREAK KEY SET | ||
| 364 | INTRET: IRET | ||
| 365 | |||
| 366 | ; | ||
| 367 | ; WARNING - Variables are very order dependent, be careful | ||
| 368 | ; when adding new ones! - c.p. | ||
| 369 | ; | ||
| 370 | WRAP DB 0 ; 0 = WRAP, 1 = NO WRAP | ||
| 371 | ASNPTR DW 4 | ||
| 372 | STATE DW S1 | ||
| 373 | MODE DB 3 ;* | ||
| 374 | MAXCOL DB 79 ;* | ||
| 375 | COL DB 0 | ||
| 376 | ROW DB 0 | ||
| 377 | SAVCR DW 0 | ||
| 378 | INQ DB 0 | ||
| 379 | PRMCNT LABEL BYTE | ||
| 380 | PRMCNTW DW 0 | ||
| 381 | KEYCNT DB 0 | ||
| 382 | KEYPTR DW BUF | ||
| 383 | REPORT DB ESC_CHAR,'[00;00R',CR ;CURSOR POSTION REPORT BUFFER | ||
| 384 | ALTAH DB 0 ;Special key handling | ||
| 385 | |||
| 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; | ||
| 392 | |||
| 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 | ||
| 411 | ;AN000; | ||
| 412 | ;------------------------------------------------------------- | ||
| 413 | ; | ||
| 414 | ; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE | ||
| 415 | ; | ||
| 416 | ATTRW LABEL WORD | ||
| 417 | ATTR DB 00000111B ;CHARACTER ATTRIBUTE | ||
| 418 | BPAGE DB 0 ;BASE PAGE | ||
| 419 | base dw 0b800h | ||
| 420 | screen_seg dw 00000h | ||
| 421 | |||
| 422 | chrout: cmp al,13 | ||
| 423 | jnz trylf | ||
| 424 | mov [col],0 | ||
| 425 | jmp short setit | ||
| 426 | |||
| 427 | trylf: cmp al,10 | ||
| 428 | jz lf | ||
| 429 | cmp al,7 | ||
| 430 | jnz tryback | ||
| 431 | torom: | ||
| 432 | mov bx,[attrw] | ||
| 433 | and bl,7 | ||
| 434 | mov ah,14 | ||
| 435 | int 10h | ||
| 436 | ret5: ret | ||
| 437 | |||
| 438 | tryback: | ||
| 439 | cmp al,8 | ||
| 440 | jnz outchr | ||
| 441 | cmp [col],0 | ||
| 442 | jz ret5 | ||
| 443 | dec [col] | ||
| 444 | jmp short setit | ||
| 445 | |||
| 446 | outchr: | ||
| 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 | ||
| 459 | outchr1: | ||
| 460 | mov [col],0 | ||
| 461 | lf: 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; | ||
| 473 | LF2: ; 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 | |||
| 480 | setit: 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 | |||
| 500 | scroll: | ||
| 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 | |||
| 513 | myscroll: | ||
| 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 | ||
| 543 | sret: push cs | ||
| 544 | pop ds | ||
| 545 | ret | ||
| 546 | |||
| 547 | colorcard: | ||
| 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 | ||
| 560 | wait2: 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 | ||
| 566 | Skip_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 | |||
| 577 | Skip_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 | ; | ||
| 587 | CON$READ: | ||
| 588 | JCXZ CON$EXIT | ||
| 589 | CON$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 | ||
| 595 | CON$EXIT: | ||
| 596 | JMP EXIT | ||
| 597 | ;--------------------------------------------------------- | ||
| 598 | ; | ||
| 599 | ; INPUT SINGLE CHAR INTO AL | ||
| 600 | ; | ||
| 601 | CHRIN: XOR AX,AX | ||
| 602 | XCHG AL,ALTAH ;GET CHARACTER & ZERO ALTAH | ||
| 603 | OR AL,AL | ||
| 604 | JNZ KEYRET | ||
| 605 | |||
| 606 | INAGN: 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 | ||
| 640 | KEY5A: ; Jmp here to get rest of translation | ||
| 641 | CALL KEY5 ;GET FIRST KEY FROM TRANSLATION | ||
| 642 | ALT10: | ||
| 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 | ||
| 648 | KEYRET: RET | ||
| 649 | |||
| 650 | KEY5: 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 | ||
| 658 | KEY6: MOV KEYPTR,BX | ||
| 659 | RET | ||
| 660 | |||
| 661 | SCAN: MOV BX,OFFSET BUF | ||
| 662 | KEYLP: 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 | ||
| 676 | NOTFND: OR BX,BX | ||
| 677 | MATCH: RET | ||
| 678 | ;-------------------------------------------------------------- | ||
| 679 | ; | ||
| 680 | ; KEYBOARD NON DESTRUCTIVE READ, NO WAIT | ||
| 681 | ; | ||
| 682 | CON$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 | |||
| 693 | RD1: 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 | |||
| 713 | RD2: 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] | ||
| 726 | RDEXIT: LDS BX,[PTRSAV] | ||
| 727 | MOV [BX].MEDIA,AL | ||
| 728 | EXVEC: JMP EXIT | ||
| 729 | CONBUS: JMP BUS$EXIT | ||
| 730 | ;-------------------------------------------------------------- | ||
| 731 | ; | ||
| 732 | ; KEYBOARD FLUSH ROUTINE | ||
| 733 | ; | ||
| 734 | CON$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 | |||
| 745 | Flush: 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 | ||
| 757 | FlushDone: | ||
| 758 | |||
| 759 | JMP EXVEC | ||
| 760 | ;---------------------------------------------------------- | ||
| 761 | ; | ||
| 762 | ; CONSOLE WRITE ROUTINE | ||
| 763 | ; | ||
| 764 | CON$WRIT: | ||
| 765 | JCXZ EXVEC | ||
| 766 | |||
| 767 | CON$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 | |||
| 773 | COUT: STI | ||
| 774 | PUSH DS | ||
| 775 | PUSH CS | ||
| 776 | POP DS | ||
| 777 | CALL OUTC | ||
| 778 | POP DS | ||
| 779 | IRET | ||
| 780 | |||
| 781 | OUTC: 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 | ||
| 800 | NOT_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 | ; | ||
| 831 | VIDEO: MOV SI,OFFSET STATE | ||
| 832 | JMP [SI] | ||
| 833 | |||
| 834 | S2: CMP AL,'[' | ||
| 835 | JZ S22 | ||
| 836 | JMP S1 | ||
| 837 | S22: MOV WORD PTR [SI],OFFSET S3 | ||
| 838 | XOR BX,BX | ||
| 839 | MOV WORD PTR INQ,BX | ||
| 840 | JMP SHORT S3B | ||
| 841 | |||
| 842 | S3: CMP AL,';' | ||
| 843 | JNZ S3C | ||
| 844 | S3A: INC PRMCNT | ||
| 845 | S3B: CALL GETPTR | ||
| 846 | XOR AX,AX | ||
| 847 | MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO | ||
| 848 | RET | ||
| 849 | |||
| 850 | S3C: 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 | |||
| 862 | S3D: 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 | ||
| 870 | S3E: MOV WORD PTR [SI],OFFSET S4 | ||
| 871 | MOV [INQ],AL | ||
| 872 | S3RET: RET | ||
| 873 | |||
| 874 | ; | ||
| 875 | ; ENTER QUOTED STRINGS | ||
| 876 | ; | ||
| 877 | |||
| 878 | S4: 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 | |||
| 884 | S4A: 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 | |||
| 892 | S7: MOV BX,OFFSET CMDTABL-3 | ||
| 893 | ; | ||
| 894 | S7A: ADD BX,3 | ||
| 895 | CMP BYTE PTR [BX],0 | ||
| 896 | JZ S1B | ||
| 897 | CMP BYTE PTR [BX],AL | ||
| 898 | JNZ S7A | ||
| 899 | ; | ||
| 900 | S7B: 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 | ||
| 910 | S7C: JMP AX ;AL = COMMAND | ||
| 911 | |||
| 912 | S1: CMP AL,ESC_CHAR ;ESCAPE SEQUENCE? | ||
| 913 | JNZ S1B | ||
| 914 | MOV WORD PTR [SI],OFFSET S2 | ||
| 915 | RET | ||
| 916 | |||
| 917 | S1B: CALL CHROUT | ||
| 918 | S1A: MOV WORD PTR [STATE],OFFSET S1 | ||
| 919 | RET | ||
| 920 | |||
| 921 | MOVCUR: CMP BYTE PTR [BX],AH | ||
| 922 | JZ SETCUR | ||
| 923 | ADD BYTE PTR [BX],AL | ||
| 924 | LOOP MOVCUR | ||
| 925 | SETCUR: MOV DX,WORD PTR COL | ||
| 926 | XOR BX,BX | ||
| 927 | MOV AH,2 | ||
| 928 | INT 16 | ||
| 929 | JMP S1A | ||
| 930 | |||
| 931 | CUP: .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 | ||
| 942 | CUP1: CMP AL,CH | ||
| 943 | JA CUP2 | ||
| 944 | MOV CH,AL | ||
| 945 | CUP2: XCHG CL,CH | ||
| 946 | DEC CH | ||
| 947 | MOV WORD PTR COL,CX | ||
| 948 | JMP SETCUR | ||
| 949 | |||
| 950 | CUF: MOV AH,MAXCOL | ||
| 951 | MOV AL,1 | ||
| 952 | CUF1: MOV BX,OFFSET COL | ||
| 953 | JMP MOVCUR | ||
| 954 | |||
| 955 | CUB: MOV AX,00FFH | ||
| 956 | JMP CUF1 | ||
| 957 | |||
| 958 | CUU: MOV AX,00FFH | ||
| 959 | CUU1: MOV BX,OFFSET ROW | ||
| 960 | JMP MOVCUR | ||
| 961 | |||
| 962 | CUD: .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 | |||
| 970 | ExtKey: ;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; | ||
| 975 | ExtKey_1: ;AN003; | ||
| 976 | cmp dl, 1 ;AN003; 1 ? | ||
| 977 | je SetExtKey ;AN003; | ||
| 978 | jmp S1A ;AN003; ignore it | ||
| 979 | SetExtKey: ;AN003; | ||
| 980 | mov Switch_X, ON ;AN003; set it if 1. | ||
| 981 | jmp S1A ;AN003; | ||
| 982 | |||
| 983 | PSCP: MOV AX,WORD PTR COL | ||
| 984 | MOV SAVCR,AX | ||
| 985 | JMP SETCUR | ||
| 986 | |||
| 987 | PRCP: MOV AX,SAVCR | ||
| 988 | MOV WORD PTR COL,AX | ||
| 989 | JMP SETCUR | ||
| 990 | |||
| 991 | SGR: XOR CX,CX | ||
| 992 | XCHG CL,PRMCNT | ||
| 993 | CALL GETPTR | ||
| 994 | INC CX | ||
| 995 | SGR1: MOV AL,BYTE PTR [BX] | ||
| 996 | PUSH BX | ||
| 997 | MOV BX,OFFSET GRMODE | ||
| 998 | SGR2: 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 | ||
| 1007 | SGR3: POP BX | ||
| 1008 | INC BX | ||
| 1009 | LOOP SGR1 | ||
| 1010 | JMP SETCUR | ||
| 1011 | |||
| 1012 | ED: 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; | ||
| 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; | ||
| 1031 | MOV AX,0600H | ||
| 1032 | INT 16 | ||
| 1033 | ED3: JMP SETCUR | ||
| 1034 | |||
| 1035 | EL: MOV CX,WORD PTR COL | ||
| 1036 | MOV DH,CH | ||
| 1037 | JMP ERASE | ||
| 1038 | |||
| 1039 | BIN2ASC:MOV DL,10 | ||
| 1040 | INC AL | ||
| 1041 | XOR AH,AH | ||
| 1042 | DIV DL | ||
| 1043 | ADD AX,'00' | ||
| 1044 | RET | ||
| 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 | ||
| 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 | ||
| 1060 | CPR: JMP S1A | ||
| 1061 | |||
| 1062 | RM: MOV CL,1 | ||
| 1063 | JMP SHORT SM1 | ||
| 1064 | |||
| 1065 | SM: XOR CX,CX | ||
| 1066 | SM1: 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 | |||
| 1091 | KEYASN: 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 | |||
| 1120 | KEYAS1: 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 | ||
| 1130 | KEYAS3: MOV BYTE PTR [BX-1],00 | ||
| 1131 | MOV STATE,OFFSET S1 ;RETURN | ||
| 1132 | RET | ||
| 1133 | |||
| 1134 | GETPTR: MOV BX,ASNPTR | ||
| 1135 | INC BX | ||
| 1136 | ADD BX,PRMCNTW | ||
| 1137 | CMP BX,ASNMAX + 8 | ||
| 1138 | JB GET1 | ||
| 1139 | DEC PRMCNT | ||
| 1140 | JMP GETPTR | ||
| 1141 | GET1: 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; | ||
| 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; | ||
| 1161 | RET ; WGR ;AN000; | ||
| 1162 | CHECK_FOR_REMAP ENDP ; WGR ;AN000; | ||
| 1163 | |||
| 1164 | |||
| 1165 | BUF DB 4,00,72H,16,0 | ||
| 1166 | DB ASNMAX+8-5 DUP (?) | ||
| 1167 | |||
| 1168 | CODE 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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 17 | HP EQU DS:[SI] ; ;AN000; | ||
| 18 | NHD EQU ES:[DI] ; ;AN000; | ||
| 19 | ; | ||
| 20 | NAME_LEN EQU 8 ; ;AN000; | ||
| 21 | ; | ||
| 22 | DHS STRUC ; ;AN000; | ||
| 23 | DH_NEXTO DW ? ; offset of pointer to next header ;AN000; | ||
| 24 | DH_NEXTS DW ? ; segment of pointer to next header ;AN000; | ||
| 25 | DW ? ; attribute ;AN000; | ||
| 26 | DH_STRAO DW ? ; offset to strategy routine ;AN000; | ||
| 27 | DH_INTRO DW ? ; offset to interrupt routine ;AN000; | ||
| 28 | DH_NAME DB NAME_LEN DUP(0) ; device name in this header ;AN000; | ||
| 29 | DHS ENDS ; end of common portion ;AN000; | ||
| 30 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 31 | ; | ||
| 32 | ; CON data structure CS:[BX] | ||
| 33 | ; | ||
| 34 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 35 | CONPTR EQU CS:[BX] ; ;AN000; | ||
| 36 | ; STATES ;AN000; | ||
| 37 | BUF_DATA STRUC ; ;AN000; | ||
| 38 | DEV_HDRO DW -1 ; device driver header offset ;AN000; | ||
| 39 | DEV_HDRS DW -1 ; ;AN000; | ||
| 40 | CON_STRAO DW -1 ; dos CON strategy offset ;AN000; | ||
| 41 | CON_STRAS DW -1 ; ;AN000; | ||
| 42 | CON_INTRO DW -1 ; dos CON strategy offset ;AN000; | ||
| 43 | CON_INTRS DW -1 ; ;AN000; | ||
| 44 | BUF_DATA ENDS ; ;AN000; | ||
| 45 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; | ||
| 46 | ; | ||
| 47 | ; INIT Structures and equates | ||
| 48 | ; | ||
| 49 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 50 | ROM_BIOS EQU 40h ; Segment of ROM_BIOS data area ;AN000; | ||
| 51 | EQUIP_FLAG EQU 10h ; equipment flag. (for LCD) ;AN000; | ||
| 52 | KBD_FLAG_3 EQU 96h ; offset of KBD_FLAG_3 in data area ;AN000; | ||
| 53 | NUM_ROWS EQU 84h ; offset of number of rows in data area;AN000; | ||
| 54 | EXT16_FLAG EQU 00010000b ; mask for Extended INT16 bit ;AN000; | ||
| 55 | INIT_VID_MASK EQU 0FFCFh ; mask for equipment list ;AN000; | ||
| 56 | LCD_COLOR_MODE EQU 20h ; LCD as color ;AN000; | ||
| 57 | LCD_MONO_MODE EQU 30h ; LCD as MONOchrome ;AN000; | ||
| 58 | UNKNOWN_CMD EQU 8103H ; unknown command status byte ;AN000; | ||
| 59 | RC_EOL EQU -1 ; parser return code for EOL ;AN000; | ||
| 60 | RC_NO_ERROR EQU 0 ; parser return code for not in switch list ;AN000; | ||
| 61 | INVALID_PARM EQU 10 ; PARSE Invalid parameter message number ;AN000; | ||
| 62 | SSTRING EQU 3 ; PARSE Too many parameters message ;AN000; | ||
| 63 | FUNC_CALL EQU 1BH ; VGA functionality call ;AN000; | ||
| 64 | ALT_SELECT EQU 12H ; EGA alternate select call ;AN000; | ||
| 65 | EGA_INFO EQU 10H ; EGA return information subcall ;AN000; | ||
| 66 | ALT_PRT_SC EQU 20H ; select alternate print screen subcall;AN000; | ||
| 67 | MONOCHROME EQU 1 ; monochrome attached to EGA ;AN000; | ||
| 68 | COLOR EQU 0 ; some color attached to EGA ;AN000; | ||
| 69 | PS2_MONO EQU 7 ; display adapter types... ;AN000; | ||
| 70 | PS2_COLOR EQU 8 ; ;AN000; | ||
| 71 | MOD30_MONO EQU 0BH ; ;AN000; | ||
| 72 | MOD30_COLOR EQU 0CH ; ;AN000; | ||
| 73 | LCD_MODEL EQU 0F9H ; Convertible model byte value ;AN000; | ||
| 74 | GET_SYS_ID EQU 0C0H ; INT15H call for system identification;AN000; | ||
| 75 | GET_STATUS EQU 43H ; read system status (Convertible) ;AN000; | ||
| 76 | MONO_ADDRESS EQU 0B000H ; base address for monochrome ;AN000; | ||
| 77 | COLOR_ADDRESS EQU 0B800H ; base address for CGA ;AN000; | ||
| 78 | UNOCCUPIED EQU -1 ; value in VIDEO_MODE_TABLE if space unused ;AN000; | ||
| 79 | LCD_ACTIVE EQU 00000001B ; LCD adapter is present ;AN000; | ||
| 80 | MONO_ACTIVE EQU 00000010B ; monochrome adapter is present ;AN000; | ||
| 81 | CGA_ACTIVE EQU 00000100B ; CGA adapter is present ;AN000; | ||
| 82 | MCGA_ACTIVE EQU 00001000B ; MCGA is present ;AN000; | ||
| 83 | E5151_ACTIVE EQU 00010000B ; EGA with monochrome is present ;AN000; | ||
| 84 | E5153_ACTIVE EQU 00100000B ; EGA with color display is present ;AN000; | ||
| 85 | E5154_ACTIVE EQU 01000000B ; EGA with enhanced color display is present ;AN000; | ||
| 86 | VGA_ACTIVE EQU 10000000B ; VGA is present ;AN000; | ||
| 87 | INT10_LOW EQU (4*10H) ; interrupt 10 vector location ;AN000; | ||
| 88 | INT10_HI EQU (4*10H)+2 ; ;AN000; | ||
| 89 | INT2F_LOW EQU (4*2FH) ; interrupt 2F vector location ;AN000; | ||
| 90 | INT2F_HI EQU (4*2FH)+2 ; ;AN000; | ||
| 91 | ONE EQU 1 ; ;AN000; | ||
| 92 | THREE EQU 3 ; ;AN000; | ||
| 93 | EIGHT EQU 8 ; ;AN000; | ||
| 94 | NINE EQU 9 ; ;AN000; | ||
| 95 | FOURTEEN EQU 14 ; ;AN000; | ||
| 96 | REQ_CRSR_POS EQU 3 ; function call to return cursor position ;AN000; | ||
| 97 | MODE7 EQU 7 ; ;AN000; | ||
| 98 | MODE13 EQU 13 ; ;AN000; | ||
| 99 | MODE15 EQU 15 ; ;AN000; | ||
| 100 | MODE19 EQU 19 ; ;AN000; | ||
| 101 | ; ;AN000; | ||
| 102 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; | ||
| 103 | ; | ||
| 104 | ; Request Header Structure (INIT) | ||
| 105 | ; | ||
| 106 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 107 | INIT_REQ_HDR STRUC ; INIT Request header structure ;AN000; | ||
| 108 | DB 13 DUP(?) ; standard request header ;AN000; | ||
| 109 | NUM_UNITS DB ? ; number of units (N/A) ;AN000; | ||
| 110 | END_ADDRESS_O DW ? ; ending address of resident code ;AN000; | ||
| 111 | END_ADDRESS_S DW ? ; ;AN000; | ||
| 112 | ARG_PTR DD ? ; ptr. to remaining arguments ;AN000; | ||
| 113 | DRIVE_NUM DB ? ; drive number (N/A) ;AN000; | ||
| 114 | CONFIG_ERRMSG dw 0 ;Flag to control "Error in CONFIG.SYS.." msg.;AN002; | ||
| 115 | INIT_REQ_HDR ENDS ; ;AN000; | ||
| 116 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 117 | ; | ||
| 118 | ; Information Block Structure | ||
| 119 | ; (for functionality call) | ||
| 120 | ; | ||
| 121 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 122 | INFO_BLOCK STRUC ; information block for functionality call ;AN000; | ||
| 123 | STATIC_ADDRESS DD ? ; address of static functionality table ;AN000; | ||
| 124 | DB 33 DUP(?) ; don't care ;AN000; | ||
| 125 | ACTIVE_DISPLAY DB ? ; active display code ;AN000; | ||
| 126 | ALT_DISPLAY DB ? ; alternate display code ;AN000; | ||
| 127 | DB 3 DUP(?) ; don't care ;AN000; | ||
| 128 | CURRENT_SCANS DB ? ; current number of scan lines ;AN000; | ||
| 129 | DB 2 DUP(?) ; don't care ;AN000; | ||
| 130 | MISC_INFO DB ? ; miscellaneous state information ;AN000; | ||
| 131 | DB 18 DUP(?) ; don't care ;AN000; | ||
| 132 | INFO_BLOCK ENDS ; ;AN000; | ||
| 133 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 134 | ; | ||
| 135 | ; Video table entry structure | ||
| 136 | ; | ||
| 137 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 138 | MODE_TABLE STRUC ; ;AN000; | ||
| 139 | V_MODE DB -1 ; video mode ;AN000; | ||
| 140 | D_MODE DB -1 ; display mode ;AN000; | ||
| 141 | RESERVED_BYTE DB 0 ; reserved ;AN000; | ||
| 142 | COLORS DW -1 ; colors ;AN000; | ||
| 143 | SCR_WIDTH DW -1 ; screen width (pels) ;AN000; | ||
| 144 | SCR_LENGTH DW -1 ; screen length (pels) ;AN000; | ||
| 145 | SCR_COLS DW -1 ; number columns ;AN000; | ||
| 146 | SCR_ROWS DW -1 ; number rows ;AN000; | ||
| 147 | MODE_TABLE ENDS ; ;AN000; | ||
| 148 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 149 | ; | ||
| 150 | ; Structure of Static Block | ||
| 151 | ; (for functionality call | ||
| 152 | ; | ||
| 153 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 154 | STATIC_BLOCK STRUC ; format of static functionality table ;AN000; | ||
| 155 | DB 7 DUP(?) ; don't care ;AN000; | ||
| 156 | SCAN_TEXT DB ? ; available scan lines in text modes ;AN000; | ||
| 157 | STATIC_BLOCK ENDS ; ;AN000; | ||
| 158 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 159 | ; | ||
| 160 | ; Structure of System ID call return block | ||
| 161 | ; | ||
| 162 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 163 | SYS_ID STRUC ; format of return system config data ;AN000; | ||
| 164 | DW ? ; don't care ;AN000; | ||
| 165 | MODEL_BYTE DB ? ; model byte ;AN000; | ||
| 166 | SYS_ID ENDS ; ;AN000; | ||
| 167 | |||
| 168 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 169 | ; | ||
| 170 | ; INT2f Strucs and Equates | ||
| 171 | ; | ||
| 172 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 173 | MULT_ANSI EQU 1Ah ; ANSI multiplex number ;AC003; | ||
| 174 | ;Catagory code | ||
| 175 | INSTALL_CHECK EQU 0 ; install check for ANSI ;AN000; | ||
| 176 | IOCTL_2F EQU 1 ; 2F interface to IOCTL ;AN000; | ||
| 177 | DA_INFO_2F EQU 2h ;J.K. Information passing to ANSI. | ||
| 178 | ;Subfunction code for IOCTL_2F | ||
| 179 | GET_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 | |||
| 196 | DA_INFO_PACKET struc | ||
| 197 | DA_INFO_LEVEL db 0 ; 0=used for SET_MODE_FLAG 1=for OPTION_L_STATE | ||
| 198 | DA_SETMODE_FLAG db 0 ; 1: DISPLAY.SYS is calling INT 10h call, SET MODE. 0=finished. | ||
| 199 | DA_OPTION_L_STATE db 0 ; 1 = /L active, 0 = /L inactive | ||
| 200 | DA_INFO_PACKET ends | ||
| 201 | |||
| 202 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 203 | ; | ||
| 204 | ; GENERIC IOCTL Strucs and Equates | ||
| 205 | ; | ||
| 206 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 207 | ; ;AN000; | ||
| 208 | DISPLAY_TYPE EQU 3 ; MAJ_FUNC type for display ;AN000; | ||
| 209 | GET_FUNC EQU 7FH ; MIN_FUNC for get subfunction ;AN000; | ||
| 210 | SET_FUNC EQU 5FH ; MIN_FUNC for set subfunction ;AN000; | ||
| 211 | REQ_VID_MODE EQU 0FH ; request video mode INT10h function call ;AN000; | ||
| 212 | DONE EQU 0100H ; set done bit for IOCTL status ;AN000; | ||
| 213 | CMD_ERROR EQU 8000H ; set error bit for IOCTL status ;AN000; | ||
| 214 | INVALID_FUNC EQU 1 ; invalid function ;AN000; | ||
| 215 | NOT_SUPPORTED EQU 10 ; return code non-supported ioctl function ;AN000; | ||
| 216 | NOT_AVAILABLE EQU 12 ; return code for font not available ;AN000; | ||
| 217 | TEXT_MODE EQU 1 ; text mode = 1 in request packet ;AN000; | ||
| 218 | GRAPHICS_MODE EQU 2 ; graphics mode = 2 ;AN000; | ||
| 219 | DEFAULT_LENGTH EQU 25 ; normal screen length ;AN000; | ||
| 220 | OFF EQU 0000H ; ;AN000; | ||
| 221 | ON EQU 0001H ; ;AN000; | ||
| 222 | INT_BIT EQU 00100000b ; mask for int. bit from functionality call ;AN000; | ||
| 223 | FOUND EQU 1 ; flag value for FOUND ;AN000; | ||
| 224 | NOT_FOUND EQU 0 ; flag value for not FOUND ;AN000; | ||
| 225 | SET_MODE EQU 0 ; set mode INT10H function number ;AN000; | ||
| 226 | DISPLAY_CHECK EQU 0AD00H ; install check for DISPLAY.SYS ;AN000; | ||
| 227 | CHECK_ACTIVE EQU 0AD02H ; active code page check for DISPLAY.SY;AN000; | ||
| 228 | INSTALLED EQU 0FFH ; present in AL if installed ;AN000; | ||
| 229 | LOAD_8X8 EQU 1112H ; register value for 8x8 ROM load ;AN000; | ||
| 230 | SET_BLOCK_0 EQU 1103H ; activate block = 0. ;AN000; | ||
| 231 | CHECK_FOR_FONT EQU 0AD10H ; check for 8x8 RAM font - DISPLAY.SYS ;AN000; | ||
| 232 | SELECT_SCAN EQU 30H ; subfunction to set scan lines (VGA) ;AN000; | ||
| 233 | SET_INTENSIFY EQU 0 ; value to enable intensify. ;AN000; | ||
| 234 | SET_BLINK EQU 1 ; value to enable blink. ;AN000; | ||
| 235 | BLINK_TOGGLE EQU 1003H ; INT10 call to toggle int/blink bit. ;AN000; | ||
| 236 | CURSOR_FLAG EQU 87H ; cursor flag byte in ROM_BIOS ;AN000; | ||
| 237 | SET_CURSOR_CALL EQU 1 ; INT10 function call to set cursor typ;AN000; | ||
| 238 | VIDEO_MASK EQU 7FH ; turn of clear buffer bit of mode value ;AN000; | ||
| 239 | MULT_ANSI EQU 1Ah ; ANSI multiplex number ;AC003; | ||
| 240 | INSTALL_CHECK EQU 0 ; install check for ANSI ;AN000; | ||
| 241 | IOCTL_2F EQU 1 ; 2F interface to IOCTL ;AN000; | ||
| 242 | NOT_CY EQU 0FFFEH ; turn carry bit off ;AN000; | ||
| 243 | CY EQU 1 ; turn carry bit off ;AN000; | ||
| 244 | INVALID_FLAGS EQU 0FFFEH ; test for invalid flags in control word ;AN000; | ||
| 245 | TURN_OFF EQU 0FEH ; values to turn off and on cursor.. ;AN000; | ||
| 246 | TURN_ON EQU NOT TURN_OFF ; emulation ;AN000; | ||
| 247 | SUB_SIZE EQU 11 ; sublist size ;AN000; | ||
| 248 | LEFT_ASCIIZ EQU 00010000B ; left-aligned asciiz string ;AN000; | ||
| 249 | UNLIMITED EQU 0 ; unlimited message size. ;AN000; | ||
| 250 | ; ;AN000; | ||
| 251 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 252 | ; | ||
| 253 | ; Request Header Structure (Generic IOCTL) | ||
| 254 | ; | ||
| 255 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 256 | INIT_REQ_HDR STRUC ; ;AN000; | ||
| 257 | DB 13 DUP(?) ; standard request header ;AN000; | ||
| 258 | MAJ_FUNC DB ? ; major function ;AN000; | ||
| 259 | MIN_FUNC DB ? ; minor function ;AN000; | ||
| 260 | IOCTL_SI DW ? ; contents of SI ;AN000; | ||
| 261 | IOCTL_DI DW ? ; contents of DI ;AN000; | ||
| 262 | REQ_PCKT_PTR DD ? ; pointer to request packet ;AN000; | ||
| 263 | INIT_REQ_HDR ENDS ; ;AN000; | ||
| 264 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 265 | ; | ||
| 266 | ; REQUEST PACKET STRUCTURE (Generic IOCTL) | ||
| 267 | ; | ||
| 268 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 269 | REQ_PCKT STRUC ; ;AN000; | ||
| 270 | INFO_LEVEL DB ? ; information level (should be 0) ;AN000; | ||
| 271 | DB ? ; reserved ;AN000; | ||
| 272 | DATA_LENGTH DW ? ; length of remaining data ;AN000; | ||
| 273 | RP_FLAGS DW ? ; control flags ;AN000; | ||
| 274 | RP_MODE DB ? ; display mode ;AN000; | ||
| 275 | RESERVED2 DB ? ; reserved ;AN000; | ||
| 276 | RP_COLORS DW ? ; # of colors ;AN000; | ||
| 277 | RP_WIDTH DW ? ; screen width ;AN000; | ||
| 278 | RP_LENGTH DW ? ; screen length ;AN000; | ||
| 279 | RP_COLS DW ? ; columns ;AN000; | ||
| 280 | RP_ROWS DW ? ; rows ;AN000; | ||
| 281 | REQ_PCKT ENDS ; ;AN000; | ||
| 282 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 283 | ; | ||
| 284 | ; Scan Lines available structure | ||
| 285 | ; | ||
| 286 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 287 | SCAN_LINE_STR STRUC ; ;AN000; | ||
| 288 | NUM_LINES DW ? ; number of scan lines ;AN000; | ||
| 289 | REP_1BH DB ? ; representation in 1Bh call ;AN000; | ||
| 290 | REP_12H DB ? ; representation in 12h call ;AN000; | ||
| 291 | SCAN_LINE_STR ENDS ; ;AN000; | ||
| 292 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 293 | ; | ||
| 294 | ; SUBLIST struc | ||
| 295 | ; | ||
| 296 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 297 | SUB_STRUC STRUC ; ;AN000; | ||
| 298 | DB 2 DUP(?) ; ;AN000; | ||
| 299 | SUB_PTR_O DW ? ; ;AN000; | ||
| 300 | SUB_PTR_S DW ? ; ;AN000; | ||
| 301 | SUB_STRUC ENDS ; ;AN000; | ||
| 302 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 303 | ; | ||
| 304 | ; RESULT BUFFER struc | ||
| 305 | ; | ||
| 306 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 307 | RESULT_STRUC STRUC ; ;AN000; | ||
| 308 | RESULT_TYPE DB ? ; ;AN000; | ||
| 309 | DB ? ; ;AN000; | ||
| 310 | RES_SYN_PTR DW ? ; ;AN000; | ||
| 311 | RES_PTR DD ? ; ;AN000; | ||
| 312 | RESULT_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 @@ | |||
| 1 | ANSI.OBJ+ | ||
| 2 | IOCTL.OBJ+ | ||
| 3 | ANSIINIT.OBJ+ | ||
| 4 | PARSER.OBJ | ||
| 5 | ANSI.EXE | ||
| 6 | ANSI.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 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE 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 | |||
| 23 | INCLUDE ANSI.INC ; WGR equates and strucs ;AN000; | ||
| 24 | .XLIST | ||
| 25 | INCLUDE STRUC.INC ; WGR structured macros ;AN000; | ||
| 26 | .LIST | ||
| 27 | |||
| 28 | PUBLIC CON$INIT ; WGR ;AN000; | ||
| 29 | |||
| 30 | |||
| 31 | CODE SEGMENT PUBLIC BYTE | ||
| 32 | ASSUME CS:CODE,DS:CODE | ||
| 33 | |||
| 34 | EXTRN VIDEO_MODE_TABLE:BYTE ; WGR ;AN000; | ||
| 35 | EXTRN FUNC_INFO:BYTE ; WGR ;AN000; | ||
| 36 | EXTRN HDWR_FLAG:WORD ; WGR ;AN000; | ||
| 37 | EXTRN VIDEO_TABLE_MAX:ABS ; WGR ;AN000; | ||
| 38 | EXTRN SCAN_LINES:BYTE ; WGR ;AN000; | ||
| 39 | EXTRN PTRSAV:DWORD ; WGR ;AN000; | ||
| 40 | EXTRN PARSE_PARM:NEAR ; WGR ;AN000; | ||
| 41 | EXTRN ERR2:NEAR ; WGR ;AN000; | ||
| 42 | EXTRN EXT_16:BYTE ; WGR ;AN000; | ||
| 43 | EXTRN BRKADR:ABS ; WGR ;AN000; | ||
| 44 | EXTRN BRKKY:NEAR ; WGR ;AN000; | ||
| 45 | EXTRN COUT:NEAR ; WGR ;AN000; | ||
| 46 | EXTRN BASE:WORD ; WGR ;AN000; | ||
| 47 | EXTRN MODE:BYTE ; WGR ;AN000; | ||
| 48 | EXTRN MAXCOL:BYTE ; WGR ;AN000; | ||
| 49 | EXTRN TRANS:ABS ; WGR ;AN000; | ||
| 50 | EXTRN STATUS:ABS ; WGR ;AN000; | ||
| 51 | EXTRN EXIT:NEAR ; WGR ;AN000; | ||
| 52 | EXTRN MAX_SCANS:BYTE ; WGR ;AN000; | ||
| 53 | EXTRN ROM_INT10:WORD ; WGR ;AN000; | ||
| 54 | EXTRN INT10_COM:NEAR ; WGR ;AN000; | ||
| 55 | EXTRN ROM_INT2F:WORD ; WGR ;AN000; | ||
| 56 | EXTRN INT2F_COM:NEAR ; WGR ;AN000; | ||
| 57 | EXTRN ABORT:BYTE ; WGR ;AN000; | ||
| 58 | extrn Display_Loaded_Before_me:byte ;AN002;Defined in IOCTL.ASM | ||
| 59 | extrn Switch_K:Byte ;AN003; | ||
| 60 | |||
| 61 | INCLUDE ANSIVID.INC ; WGR video tables data ;AN000; | ||
| 62 | |||
| 63 | CON$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 | |||
| 78 | CONT_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 | ||
| 101 | iscolor: | ||
| 102 | cmp al,00010000b ;look for 40 col mode | ||
| 103 | ja setbrk | ||
| 104 | mov [mode],0 | ||
| 105 | mov [maxcol],39 | ||
| 106 | |||
| 107 | setbrk: | ||
| 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 | |||
| 147 | DET_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 | ||
| 248 | DET_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 | |||
| 269 | CHECK_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; | ||
| 281 | CHECK_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 | |||
| 304 | LOAD_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; | ||
| 328 | LOAD_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 | |||
| 348 | LOAD_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; | ||
| 365 | L_INT10_Ret: ;AN002; | ||
| 366 | POP ES ; ;AN000; | ||
| 367 | RET ; ;AN000; | ||
| 368 | LOAD_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 | |||
| 388 | LOAD_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; | ||
| 409 | LOAD_INT2F ENDP ;AN000; | ||
| 410 | |||
| 411 | |||
| 412 | CODE 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 @@ | |||
| 1 | VGA_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; | ||
| 14 | VGA_NUM EQU ($ - VGA_TABLE)/(TYPE MODE_TABLE) ;AN000; | ||
| 15 | |||
| 16 | MCGA_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; | ||
| 19 | MCGA_NUM EQU ($ - MCGA_TABLE)/(TYPE MODE_TABLE) ;AN000; | ||
| 20 | |||
| 21 | EGA_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; | ||
| 29 | EGA_5154_NUM EQU ($ - EGA_5154_TABLE)/(TYPE MODE_TABLE) ;AN000; | ||
| 30 | |||
| 31 | EGA_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; | ||
| 34 | EGA_5153_NUM EQU ($ - EGA_5153_TABLE)/(TYPE MODE_TABLE) ;AN000; | ||
| 35 | |||
| 36 | EGA_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; | ||
| 39 | EGA_5151_NUM EQU ($ - EGA_5151_TABLE)/(TYPE MODE_TABLE) ;AN000; | ||
| 40 | |||
| 41 | MONO_TABLE LABEL BYTE ;AN000; | ||
| 42 | MODE_TABLE < 7, 1,, 0, -1, -1, 80, 25> ; mode 7 ;AN000; | ||
| 43 | MONO_NUM EQU ($ - MONO_TABLE)/(TYPE MODE_TABLE) ;AN000; | ||
| 44 | |||
| 45 | COLOR_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; | ||
| 53 | COLOR_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 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE 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 | |||
| 88 | INCLUDE ANSI.INC ;AN000; | ||
| 89 | .XLIST ;AN000; | ||
| 90 | INCLUDE STRUC.INC ;AN000; | ||
| 91 | .LIST ;AN000; | ||
| 92 | ;AN000; | ||
| 93 | PUBLIC GENERIC_IOCTL ;AN000; | ||
| 94 | PUBLIC FUNC_INFO ;AN000; | ||
| 95 | PUBLIC MAX_SCANS ;AN000; | ||
| 96 | PUBLIC INT10_COM ;AN000; | ||
| 97 | PUBLIC ROM_INT10 ;AN000; | ||
| 98 | PUBLIC INT2F_COM ;AN000; | ||
| 99 | PUBLIC ROM_INT2F ;AN000; | ||
| 100 | PUBLIC ABORT ;AN000; | ||
| 101 | PUBLIC REQ_TXT_LENGTH ;AN000; | ||
| 102 | PUBLIC GRAPHICS_FLAG ;AN000; | ||
| 103 | public Display_Loaded_Before_Me ;AN008; | ||
| 104 | ;AN000; | ||
| 105 | CODE SEGMENT PUBLIC BYTE ;AN000; | ||
| 106 | ASSUME CS:CODE,DS:CODE ;AN000; | ||
| 107 | ;AN000; | ||
| 108 | EXTRN PTRSAV:DWORD ;AN000; | ||
| 109 | EXTRN NO_OPERATION:NEAR ;AN000; | ||
| 110 | EXTRN ERR1:NEAR ;AN000; | ||
| 111 | EXTRN VIDEO_MODE_TABLE:BYTE ;AN000; | ||
| 112 | extrn MAX_VIDEO_TAB_NUM:ABS | ||
| 113 | EXTRN HDWR_FLAG:WORD ;AN000; | ||
| 114 | EXTRN SCAN_LINES:BYTE ;AN000; | ||
| 115 | extrn Switch_L:Byte ;AN010;Defined in ANSI.ASM | ||
| 116 | ;AN000; | ||
| 117 | ;AN000; | ||
| 118 | SCAN_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; | ||
| 122 | SCANS_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. | ||
| 125 | In_Generic_IOCTL_flag db 0 ;AN004; | ||
| 126 | I_AM_IN_NOW EQU 00000001b ;AN004; | ||
| 127 | SET_MODE_BY_DISPLAY EQU 00000010b ;AN004;Display.sys calls Set mode INT 10h. | ||
| 128 | CALLED_BY_INT10COM EQU 00000100b ;AN009;To prevent from calling set mode int 10h again. | ||
| 129 | |||
| 130 | INT10_V_Mode db 0ffh ;AN006;Used by INT10_COM | ||
| 131 | |||
| 132 | My_IOCTL_Req_Packet REQ_PCKT <0,0,0Eh,0,?,0,?,?,?,?,?> ;AN004; | ||
| 133 | ;AN000; | ||
| 134 | FUNC_INFO INFO_BLOCK <> ; data block for functionality call ;AN000; | ||
| 135 | ROM_INT10 DW ? ; segment and offset of original.. ;AN000; | ||
| 136 | DW ? ; interrupt 10h vector. ;AN000; | ||
| 137 | ROM_INT2F DW ? ; segment and offset of original.. ;AN000; | ||
| 138 | DW ? ; interrupt 2Fh vector. ;AN000; | ||
| 139 | INTENSITY_FLAG DW OFF ; intensity flag initially off ;AN000; | ||
| 140 | REQ_TXT_LENGTH DW DEFAULT_LENGTH ; requested text screen length ;AN000; | ||
| 141 | SCAN_DESIRED DB 0 ; scan lines desired ;AN000; | ||
| 142 | MAX_SCANS DB 0 ; maximum scan line setting ;AN000; | ||
| 143 | GRAPHICS_FLAG DB TEXT_MODE ; flag for graphics mode ;AN000; | ||
| 144 | ERROR_FLAG DB OFF ; flag for error conditions ;AN000; | ||
| 145 | Display_Loaded_Before_Me db 0 ;AN008;flag | ||
| 146 | ANSI_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 | |||
| 167 | GENERIC_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 | |||
| 202 | GET_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; | ||
| 250 | GET_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 | |||
| 271 | SET_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; | ||
| 330 | SET_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 | |||
| 351 | PROCESS_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 | ||
| 369 | PROCESS_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 | |||
| 389 | PROCESS_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; | ||
| 412 | PROCESS_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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 425 | DO_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; | ||
| 445 | DO_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 | |||
| 465 | TEST_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; | ||
| 496 | TEST_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; | ||
| 519 | CTL_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; | ||
| 541 | CTL_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 | |||
| 562 | SET_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; | ||
| 573 | SET_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; | ||
| 597 | SET_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; | ||
| 646 | SET_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 | |||
| 667 | GET_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; | ||
| 682 | GET_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 | |||
| 703 | SET_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; | ||
| 721 | SET_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 | |||
| 757 | INT10_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; | ||
| 870 | INT10_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 | |||
| 898 | INT2F_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; | ||
| 984 | ABORT: IRET ; ;AN000; | ||
| 985 | INT2F_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 | |||
| 1005 | MAP_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; | ||
| 1016 | MAP_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 | |||
| 1035 | SET_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; | ||
| 1060 | SET_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 | |||
| 1080 | ROM_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; | ||
| 1090 | ROM_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 | |||
| 1110 | CHECK_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; | ||
| 1123 | CHECK_FOR_DISPLAY ENDP | ||
| 1124 | |||
| 1125 | CODE 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 | |||
| 3 | dos =..\..\dos | ||
| 4 | inc =..\..\inc | ||
| 5 | msg =..\..\messages | ||
| 6 | |||
| 7 | # | ||
| 8 | ####################### Dependencies Begin Here ########################## | ||
| 9 | # | ||
| 10 | |||
| 11 | all: ansi.sys | ||
| 12 | |||
| 13 | ansi.ctl: ansi.skl $(msg)\$(COUNTRY).msg | ||
| 14 | |||
| 15 | ansi.obj: ansi.asm ansi.inc \ | ||
| 16 | $(inc)\vector.inc \ | ||
| 17 | $(inc)\mult.inc \ | ||
| 18 | $(inc)\struc.inc | ||
| 19 | |||
| 20 | ioctl.obj: ioctl.asm ansi.inc \ | ||
| 21 | $(inc)\struc.inc | ||
| 22 | |||
| 23 | ansiinit.obj: ansiinit.asm ansi.inc ansivid.inc \ | ||
| 24 | $(inc)\struc.inc | ||
| 25 | |||
| 26 | parser.obj: parser.asm ansi.inc $(inc)\sysmsg.inc $(inc)\parse.asm \ | ||
| 27 | $(inc)\struc.inc ansi.ctl $(inc)\versiona.inc | ||
| 28 | |||
| 29 | ansi.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 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE 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 | |||
| 56 | INCLUDE ANSI.INC ; ANSI equates and structures ;AN000; | ||
| 57 | .XLIST | ||
| 58 | INCLUDE STRUC.INC ; Structured macros ;AN000; | ||
| 59 | |||
| 60 | INCLUDE SYSMSG.INC ; Message retriever code ;AN000; | ||
| 61 | MSG_UTILNAME <ANSI> ; Let message retriever know its ANSI.SYS ;AN000; | ||
| 62 | .LIST | ||
| 63 | |||
| 64 | PUBLIC 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 | |||
| 72 | DateSW EQU 0 ;AN000; | ||
| 73 | TimeSW EQU 0 ;AN000; | ||
| 74 | CmpxSW EQU 0 ;AN000; | ||
| 75 | DrvSW EQU 0 ;AN000; | ||
| 76 | QusSW EQU 0 ;AN000; | ||
| 77 | NumSW EQU 0 ;AN000; | ||
| 78 | KeySW EQU 0 ;AN000; | ||
| 79 | Val1SW EQU 0 ;AN000; | ||
| 80 | Val2SW EQU 0 ;AN000; | ||
| 81 | Val3SW EQU 0 ;AN000; | ||
| 82 | |||
| 83 | |||
| 84 | CODE SEGMENT PUBLIC BYTE | ||
| 85 | ASSUME CS:CODE | ||
| 86 | |||
| 87 | .XLIST | ||
| 88 | MSG_SERVICES <MSGDATA> ;AN000; | ||
| 89 | MSG_SERVICES <DISPLAYmsg,LOADmsg,CHARmsg> ;AN000; | ||
| 90 | MSG_SERVICES <ANSI.CL1> ;AN000; | ||
| 91 | MSG_SERVICES <ANSI.CL2> ;AN000; | ||
| 92 | MSG_SERVICES <ANSI.CLA> ;AN000; | ||
| 93 | |||
| 94 | INCLUDE PARSE.ASM ; Parsing code ;AN000; | ||
| 95 | .LIST | ||
| 96 | |||
| 97 | |||
| 98 | EXTRN SWITCH_X:BYTE ; /X switch flag ;AN000; | ||
| 99 | extrn Switch_L:Byte ;AN002; /L switch flag | ||
| 100 | extrn 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; | ||
| 111 | PARMS LABEL WORD ;AN000; | ||
| 112 | DW PARMSX ;AN000; | ||
| 113 | DB 0 ; no extra delimeters or EOLs. ;AN000; | ||
| 114 | ;AN000; | ||
| 115 | PARMSX 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; | ||
| 122 | FILENAME 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; | ||
| 129 | Switches 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 | ||
| 135 | X_SWITCH DB "/X",0 ;AN002; /X name | ||
| 136 | L_SWITCH DB "/L",0 ;AN002; /L | ||
| 137 | K_SWITCH DB "/K",0 ;AN003; /K | ||
| 138 | |||
| 139 | NOVALS LABEL BYTE ;AN000; | ||
| 140 | DB 0 ; no value checking done ;AN000; | ||
| 141 | |||
| 142 | RESULT_BUF LABEL BYTE ;AN000; | ||
| 143 | DB ? ; type returned (number, string, etc.) ;AN000; | ||
| 144 | DB ? ; matched item tag (if applicable) ;AN000; | ||
| 145 | SYNONYM_PTR DW 0 ; synonym ptr (if applicable) ;AN000; | ||
| 146 | DD ? ; value ;AN000; | ||
| 147 | ;AN000; | ||
| 148 | SUBLIST 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 | |||
| 158 | Old_SI dw ? ;AN001; | ||
| 159 | Saved_Chr db 0 ;AN001; | ||
| 160 | Continue_Flag db ON ;AN002; | ||
| 161 | Parse_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 | |||
| 180 | PARSE_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; | ||
| 251 | PARSE_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 | |||
| 271 | PARM_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 | ||
| 285 | Get_CR: | ||
| 286 | cmp byte ptr es:[si], 13 ;AN001;CR? | ||
| 287 | je Got_CR ;AN001; | ||
| 288 | inc si ;AN001; | ||
| 289 | jmp Get_CR ;AN001; | ||
| 290 | Got_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; | ||
| 320 | PARM_ERROR ENDP | ||
| 321 | |||
| 322 | include msgdcl.inc | ||
| 323 | |||
| 324 | CODE ENDS | ||
| 325 | END | ||