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/ANSIINIT.ASM | |
| 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/ANSIINIT.ASM')
| -rw-r--r-- | v4.0/src/DEV/ANSI/ANSIINIT.ASM | 413 |
1 files changed, 413 insertions, 0 deletions
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 | ||