diff options
Diffstat (limited to 'v4.0/src/DEV/DISPLAY/INT10COM.INC')
| -rw-r--r-- | v4.0/src/DEV/DISPLAY/INT10COM.INC | 1029 |
1 files changed, 1029 insertions, 0 deletions
diff --git a/v4.0/src/DEV/DISPLAY/INT10COM.INC b/v4.0/src/DEV/DISPLAY/INT10COM.INC new file mode 100644 index 0000000..6931ca6 --- /dev/null +++ b/v4.0/src/DEV/DISPLAY/INT10COM.INC | |||
| @@ -0,0 +1,1029 @@ | |||
| 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2 | ; | ||
| 3 | ; INT10COM.INC | ||
| 4 | ; | ||
| 5 | ; THESE FOLLOWING ROUTINES ARE USED TO LOCATE AND LOAD | ||
| 6 | ; THE FONTS FOR THE SPECIFIED CODE PAGE. IT IS DESIGNED | ||
| 7 | ; TO WORK ON THE FOLLOWING DISPLAY ADAPTERS; | ||
| 8 | ; | ||
| 9 | ; - EGA 1501200 (minimal configuration) no expansion card needed | ||
| 10 | ; - PC Convertible (with LCD display adapter) | ||
| 11 | ; - plus literally a half-dozen code-named unreleased IBM products | ||
| 12 | ; | ||
| 13 | ; SUPPORT FOR THE 'CGA' (Colour Graphics Adapter) and | ||
| 14 | ; 'MONO' (Monochrome/Printer Adapter) IS LIMITED TO THE | ||
| 15 | ; HARDWARE CODE PAGE ONLY (ie. not soft-loadable devices). | ||
| 16 | ; | ||
| 17 | ; PSEUDO CODE: | ||
| 18 | ; =========== | ||
| 19 | ; INT_10_PROC STARTS | ||
| 20 | ; GET MODE (AL=?) | ||
| 21 | ; CALL rom_int_10 | ||
| 22 | ; GET FONT_SIZE | ||
| 23 | ; if FONT_SIZE <> 0FFH | ||
| 24 | ; if FONT_SIZE = available | ||
| 25 | ; GET LOAD_MECHANISM | ||
| 26 | ; if LOAD_MECHANISM = BIOS technique | ||
| 27 | ; CALL LOAD_BIOS_CHAR | ||
| 28 | ; endif | ||
| 29 | ; if LOAD_MECHANISM = VECTOR technique | ||
| 30 | ; CALL LOAD_VECTOR_CHAR | ||
| 31 | ; endif | ||
| 32 | ; endif | ||
| 33 | ; endif | ||
| 34 | ; IRET | ||
| 35 | ; INT_10_PROC ENDS | ||
| 36 | ; | ||
| 37 | ; (C)Copyright 1988 Microsoft | ||
| 38 | ; | ||
| 39 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 40 | IF1 ; | ||
| 41 | %OUT . �INT10COM.INC� | ||
| 42 | ENDIF | ||
| 43 | |||
| 44 | ;Modification history ********************************************************* | ||
| 45 | ;AN001; P1497 Cursor disappearance problem after codepage switch 10/9/87 J.K. | ||
| 46 | ;****************************************************************************** | ||
| 47 | PUBLIC MODE_VALUE ; | ||
| 48 | PUBLIC ROM_INT_10 ; | ||
| 49 | PUBLIC ROM_INT_1F ; | ||
| 50 | PUBLIC OLD_INT_1F ; | ||
| 51 | PUBLIC ROM_INT_44 ; | ||
| 52 | PUBLIC INT_10_COM ; | ||
| 53 | PUBLIC ASK_BIOS_FONT_SIZE ; | ||
| 54 | PUBLIC ASK_BIOS_SCAN_LINES ; | ||
| 55 | ; | ||
| 56 | ROM_INT_10 DW ? ; Int 10H vector offset | ||
| 57 | DW ? ; Int 10H vector segment | ||
| 58 | ROM_INT_1F DW ? ; Int 1FH vector offset | ||
| 59 | DW ? ; Int 1FH vector segment | ||
| 60 | OLD_INT_1F DW ? ; OLD Int 1FH vector offset | ||
| 61 | DW ? ; OLD Int 1FH vector segment | ||
| 62 | ROM_INT_44 DW ? ; Int 44H vector offset | ||
| 63 | DW ? ; Int 44H vector segment | ||
| 64 | MODE_VALUE DB ? ; VALUE OF AL DURING INT 10H (AH=0) | ||
| 65 | BYTES_PER_CHAR DB ? ; VALUE OF BYTES/CHARACTER IN MODES | ||
| 66 | LOAD_MECHANISM DB ? ; SUPPORT SCHEME FOR ACTIVE MODE | ||
| 67 | CHARACTER_SOURCE DB ? ; FLAG TO INDICATE: 0 = HDWR | ||
| 68 | ; 1 = DESG | ||
| 69 | INVALID_MODE EQU 0FFH ; | ||
| 70 | MASK_BIOS_LOAD EQU 00000011b ; | ||
| 71 | MASK_VECTOR_LOAD EQU 00110000B ; | ||
| 72 | MODE_MASK EQU 01111111B ; GHG Emulator Problem | ||
| 73 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 74 | ; | ||
| 75 | ; CONFIGURATION TABLES FOR CHARACTER LOADING | ||
| 76 | ; | ||
| 77 | ; TABLE WILL BE FILLED IN BY INIT.ASM | ||
| 78 | ; | ||
| 79 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 80 | PUBLIC LOAD_MECH ; | ||
| 81 | LOAD_MECH LABEL BYTE ; RESERVE 32 MODE SETTINGS | ||
| 82 | DB 32 DUP(?) ; REFER TO TABLES.INC FOR DETAILS | ||
| 83 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 84 | ; | ||
| 85 | ; CONFIGURATION TABLES FOR CHARACTER SIZES | ||
| 86 | ; | ||
| 87 | ; TABLE WILL BE FILLED IN BY INIT.ASM | ||
| 88 | ; | ||
| 89 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 90 | PUBLIC FONT_SIZE ; | ||
| 91 | FONT_SIZE LABEL BYTE ; RESERVE 32 MODE SETTINGS | ||
| 92 | DB 32 DUP(?) ; REFER TO TABLES.INC FOR DETAILS | ||
| 93 | NUM_FONT_SIZES EQU ($-FONT_SIZE) ; | ||
| 94 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 95 | ; | ||
| 96 | ; INTERRUPT 10H SUPPORT CODE | ||
| 97 | ; | ||
| 98 | ; THE INIT ROUTINE WILL INSTALL THIS CODE INTO THE | ||
| 99 | ; INTERRUPT 10H VIDEO BIOS CALL. IT CHAINS TO THE | ||
| 100 | ; LOWER LEVEL (usually BIOS for Device Drivers). | ||
| 101 | ; | ||
| 102 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 103 | INT_10_COM PROC FAR ; | ||
| 104 | STI ; | ||
| 105 | OR AH,AH ; TEST THE SUBFUNCTION CALL=0 | ||
| 106 | JE INT_1 ; RESERVED FOR THE COM PATH! | ||
| 107 | JMP DWORD PTR CS:ROM_INT_10 ; | ||
| 108 | ; | ||
| 109 | INT_1: ; | ||
| 110 | PUSHF ; PREPARE FOR IRET! | ||
| 111 | CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command | ||
| 112 | PUSH AX ; | ||
| 113 | PUSH BX ; WGR ;AN000; | ||
| 114 | MOV AH,GET_MODE ; WGR get actual mode set ;AN000; | ||
| 115 | PUSHF ; WGR ;AN000; | ||
| 116 | CALL DWORD PTR CS:ROM_INT_10 ; WGR ;AN000; | ||
| 117 | MOV CS:MODE_VALUE,AL ; SAVE MODE_VALUE BEFORE CALL | ||
| 118 | and CS:MODE_VALUE,mode_mask ; GHG Emulator Problem..... | ||
| 119 | POP BX ; WGR ;AN000; | ||
| 120 | ; | ||
| 121 | CALL TEST_CP ; FIND OUT IF CP CAN BE SUPPORTED? | ||
| 122 | JNC INT_2 ; | ||
| 123 | ; | ||
| 124 | MOV CS:CHARACTER_SOURCE,0 ; IF AN ERROR OCCURRED IN FINDING THE | ||
| 125 | MOV AL,INTER_1FH ; FONT DATA INFORMATION...THEN THE | ||
| 126 | CALL VECTOR_LOAD ; INTERRUPT 1F hex VECTOR MUST BE | ||
| 127 | JUMP INT_3 ; SET TO THE HDWR CP - ELSE WRONG | ||
| 128 | ; DATA MAY BE DISPLAYED | ||
| 129 | INT_2: MOV CS:SETMODE_FLAG,OFF ; WGR ;AN000; | ||
| 130 | CALL INVOKE_DATA ; IF SO, THEN LOAD THE DATA | ||
| 131 | INT_3: POP AX ; | ||
| 132 | ; | ||
| 133 | IRET ; | ||
| 134 | INT_10_COM ENDP ; | ||
| 135 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 136 | ; | ||
| 137 | ; SET BLOCK SPECIFIER = 0 | ||
| 138 | ; | ||
| 139 | ; THIS IS USED TO ACTIVATE BLOCK = 0 FONT. THIS PERFORMS | ||
| 140 | ; DIFFERENT OPERATIONS ON VARIOUS DISPLAY ADAPTERS. THE | ||
| 141 | ; RESULTS OF WHICH ARE TO ACTIVATE THE DESIGNATED FONT. | ||
| 142 | ; | ||
| 143 | ; INPUT: | ||
| 144 | ; none | ||
| 145 | ; OUTPUT: | ||
| 146 | ; none | ||
| 147 | ; | ||
| 148 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 149 | SET_BLOCK_SP0 PROC ; | ||
| 150 | PUSH AX ; | ||
| 151 | PUSH BX ; | ||
| 152 | MOV AX,1103H ; SET BLOCK SPECIFIER | ||
| 153 | MOV BL,ZERO ; CHAR GEN BLOCK SPECIFIER | ||
| 154 | INT 10H ; PERFORM CALL... | ||
| 155 | POP BX ; | ||
| 156 | POP AX ; | ||
| 157 | RET ; | ||
| 158 | SET_BLOCK_SP0 ENDP ; | ||
| 159 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 160 | ; | ||
| 161 | ; FIND_FONT | ||
| 162 | ; | ||
| 163 | ; THE ROUTINE STARTS WITH THE FONT DATA POINTER, AND | ||
| 164 | ; TRIES TO FIND THE FONT RESOLUTION THAT IS NEEDED. | ||
| 165 | ; THIS FONT RESOLUTION IS BASED ON THE PRESENT SCREEN | ||
| 166 | ; MODE WHICH IS ACTIVE. | ||
| 167 | ; | ||
| 168 | ; INPUT: | ||
| 169 | ; ES : DI points to beginning | ||
| 170 | ; of font data | ||
| 171 | ; OUTPUT: | ||
| 172 | ; ES : DI points to font data | ||
| 173 | ; for needed resolution | ||
| 174 | ; CY = 0 if found | ||
| 175 | ; = 1 if not found | ||
| 176 | ; | ||
| 177 | ; DS = CS assumed | ||
| 178 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 179 | FIND_FONT PROC ; | ||
| 180 | PUSH AX ; | ||
| 181 | PUSH CX ; | ||
| 182 | PUSH DX ; | ||
| 183 | ; | ||
| 184 | MOV CX,CPD_FONTS_N ; GET NUMBER OF FONT STYLES | ||
| 185 | FF_0: MOV AH,BYTES_PER_CHAR ; GET BYTES_PER_CHAR FOR COMPARISON | ||
| 186 | ; | ||
| 187 | MOV AL,ES:[DI] ; GET #ROWS OF POINTED DATA | ||
| 188 | CMP AL,AH ; COMPARE BYTES_PER_CHAR AGAINST #ROWS | ||
| 189 | JE FF_3 ; IF MATCHED...THEN ADJUST ES:DI (CY=0) | ||
| 190 | ; | ||
| 191 | PUSH CX ; ELSE, MOVE ES:DI TO NEXT FONT START | ||
| 192 | MOV CX,ES:[DI+4] ; GET count OF CHARACTERS IN LIST | ||
| 193 | XOR AH,AH ; PREPARE AX FOR MULT | ||
| 194 | MUL CX ; CALCULATE DELTA TO NEXT FONT START | ||
| 195 | POP CX ; | ||
| 196 | ; | ||
| 197 | ADD AX,SIX ; ADD FONT STYLE HEADER OF SIX BYTES | ||
| 198 | ADD DI,AX ; ADJUST THE DI POINTER | ||
| 199 | ; THERE CAN BE NO CARRY DUE TO STRUCTURE | ||
| 200 | LOOP FF_0 ; OF FONT DATA (ie. no straddling) | ||
| 201 | STC ; | ||
| 202 | JUMP FF_4 ; | ||
| 203 | FF_3: ADD DI,SIX ; POINT TO VERY START OF DATA | ||
| 204 | CLC ; SET FLAG TO OK! | ||
| 205 | FF_4: POP DX ; | ||
| 206 | POP CX ; | ||
| 207 | POP AX ; | ||
| 208 | RET ; | ||
| 209 | FIND_FONT ENDP ; | ||
| 210 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 211 | ; | ||
| 212 | ; BIOS_LOAD | ||
| 213 | ; | ||
| 214 | ; THIS CALL IS USED TO LOAD THE ACTIVE CP. IT LOADS | ||
| 215 | ; THE ACTIVE CP WHETHER IT IS DESIGNATED OR HDWR. THE | ||
| 216 | ; ACTUAL LOADING OF THE FONT IS PERFORMED BY THE 'EGA CLASS' | ||
| 217 | ; BIOS ROUTINES (different for some adapters). | ||
| 218 | ; | ||
| 219 | ; INPUT: | ||
| 220 | ; AL = ? load mechanism | ||
| 221 | ; | ||
| 222 | ; 7 6 5 4 3 2 1 0 | ||
| 223 | ; 0 0 0 0 0 0 x x | ||
| 224 | ; � ��� 1 - AX=1100H | ||
| 225 | ; ����� 1 = AX=1400H | ||
| 226 | ; | ||
| 227 | ; ES : DI points to start of font data | ||
| 228 | ; CX = ? count of characters to load | ||
| 229 | ; BH = bytes per character | ||
| 230 | ; DS = CS assumed... | ||
| 231 | ; | ||
| 232 | ; OUTPUT: | ||
| 233 | ; none | ||
| 234 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 235 | AX_1100H EQU 00000001b ; | ||
| 236 | AX_1400H EQU 00000010b ; | ||
| 237 | EGA_INFO EQU 0487H ; ADDRESS OF INFO BYTE | ||
| 238 | EGA_ACTIVE EQU 00001000b ; MASK FOR EGA_ACTIVE/NON-ACTIVE | ||
| 239 | ; | ||
| 240 | BIOS_LOAD PROC ; | ||
| 241 | CALL GET_CURSOR_POS ; ONE MUST RECORD THE CURSOR POS DURING | ||
| 242 | ; A FONT LOAD...ELSE CURSOR TO (1,1) | ||
| 243 | PUSH BX ; | ||
| 244 | PUSH DX ; | ||
| 245 | ; | ||
| 246 | MOV DX,ZERO ; CHARACTER OFFSET INTO TABLE | ||
| 247 | MOV BL,ZERO ; BLOCK TO LOAD (Block=0) | ||
| 248 | ; | ||
| 249 | TEST AL,AX_1100H ; DETERMINE IF EGA_TYPE LOAD? | ||
| 250 | JNZ BL_00 ; IF NOT, THEN TRY FOR LCD_TYPE... | ||
| 251 | JMP BL_3 ; | ||
| 252 | ; | ||
| 253 | BL_00: PUSH BP ; SAVE REGISTERS TO BE USED | ||
| 254 | PUSH AX ; | ||
| 255 | CMP CHARACTER_SOURCE,ZERO ; TEST IF CP = HDWR | ||
| 256 | JE BL_0 ; | ||
| 257 | ; | ||
| 258 | MOV BP,DI ; POINTER TO USER TABLE (ES:BP) | ||
| 259 | MOV AX,1100H ; USER ALPHA LOAD | ||
| 260 | JUMP BL_2 ; | ||
| 261 | ; | ||
| 262 | BL_0: MOV AX,1102H ; ROM 8X8 DOUBLE DOT | ||
| 263 | CMP BYTES_PER_CHAR,8 ; | ||
| 264 | JE BL_2 ; | ||
| 265 | BL_1: MOV AL,01H ; ROM MONOCHROME SET | ||
| 266 | CMP BYTES_PER_CHAR,14 ; | ||
| 267 | JE BL_2 ; | ||
| 268 | MOV AL,04H ; ROM 8X16 SET | ||
| 269 | CMP BYTES_PER_CHAR,16 ; | ||
| 270 | JE BL_2 ; | ||
| 271 | JUMP BL_2A ; PERFORM BIOS CALL... | ||
| 272 | ; | ||
| 273 | BL_2: PUSH DS ; THIS TEST VERIFIES THAT THE EGA | ||
| 274 | PUSH AX ; ADAPTER IS PRESENTLY ACTIVE. | ||
| 275 | XOR AX,AX ; IF IT IS NOT, THEN THE EGA WILL | ||
| 276 | MOV DS,AX ; REPROGRAM THE ACTIVE CRT TO THE EGA | ||
| 277 | MOV AL,DS:EGA_INFO ; SPECIFICATION....HAZARDOUS RESULTS! | ||
| 278 | AND AL,EGA_ACTIVE ; MASK FOR EGA ACTIVE/NON-ACTIVE | ||
| 279 | POP AX ; | ||
| 280 | POP DS ; | ||
| 281 | ; | ||
| 282 | JZ BL_2AA ; IF ZERO, THE EGA IS ACTIVE...AND OK! | ||
| 283 | STC ; ELSE, EGA IS NOT ACTIVE | ||
| 284 | POP AX ; | ||
| 285 | POP BP ; AND WE MUST | ||
| 286 | JUMP BL_7 ; LEAVE WITH AN ERROR.... | ||
| 287 | ; | ||
| 288 | BL_2AA: | ||
| 289 | CMP CS:SETMODE_FLAG,OFF ; WGR MODE SET REQUIRED?.. ;AN000; | ||
| 290 | JE BL_2B ; WGR NO...JUMP TO CHARACTER LOAD. ;AN000; | ||
| 291 | PUSH AX ; WGR ;AN000; | ||
| 292 | PUSH DS ; WGR ;AN000; | ||
| 293 | XOR AX,AX ; WGR ;AN000; | ||
| 294 | MOV DS,AX ; WGR ;AN000; | ||
| 295 | PUSH DS:[VIDEO_CTRL] ; WGR ;AN000; | ||
| 296 | MOV AL,CS:MODE_VALUE ; WGR GET CURRENT MODE ;AN000; | ||
| 297 | OR AL,NOT MODE_MASK ; WGR MODE SET WITHOUT BUFFER CLEARED ;AN000; | ||
| 298 | |||
| 299 | call Info_Ansi_ModeSet ;J.K.Tell ANSI that DISPLAY.SYS is going to call INT 10h, SET MODE function. | ||
| 300 | |||
| 301 | XOR AH,AH ; WGR MODE SET CALL.. ;AN000; | ||
| 302 | PUSHF ; WGR ;AN000; | ||
| 303 | CALL DWORD PTR CS:ROM_INT_10 ; WGR ;AN000; | ||
| 304 | |||
| 305 | call Info_Ansi_ModeDone ;J.K.Tell ANSI that it is through. | ||
| 306 | |||
| 307 | POP DS:[VIDEO_CTRL] ; WGR ;AN000; | ||
| 308 | POP DS ; WGR ;AN000; | ||
| 309 | POP AX ; WGR ;AN000; | ||
| 310 | BL_2B: ; WGR WAS ISSUED (BY ME) ;AN000; | ||
| 311 | OR AX,CS:RE_CALC ; WGR INCASE RECALC IS NEEDED. ;AN000; | ||
| 312 | INT 10H ; | ||
| 313 | ;AN001; EGA ROM BIOS has a bug when AX=1110h, INT 10h is issued. | ||
| 314 | ; Cursor type is changed to 0C0Dh which causes the cursor to | ||
| 315 | ; disappear!!! | ||
| 316 | ; We are going to set Cursor type back to 0607h for EGA. | ||
| 317 | |||
| 318 | cmp ax, 1110h ;AN001; | ||
| 319 | jne Skip_Cursor_Problem ;AN001; | ||
| 320 | push cx ;AN001; | ||
| 321 | mov ah, 1 ;AN001; | ||
| 322 | mov cx, 0607h ;AN001; | ||
| 323 | int 10h ;AN001; | ||
| 324 | pop cx ;AN001; | ||
| 325 | |||
| 326 | Skip_Cursor_Problem: | ||
| 327 | MOV CS:RE_CALC,OFF ; WGR RESET RE_CALC VALUE ;AN000; | ||
| 328 | CALL SET_BLOCK_SP0 ; AND THEN SET_BLOCK_SPECIFIER (0) | ||
| 329 | BL_2A: POP AX ; | ||
| 330 | POP BP ; | ||
| 331 | ; | ||
| 332 | BL_3: TEST AL,AX_1400H ; | ||
| 333 | JZ BL_6 ; | ||
| 334 | ; | ||
| 335 | PUSH AX ; SAVE INDICATOR | ||
| 336 | ; | ||
| 337 | CMP CHARACTER_SOURCE,ZERO ; TEST IF CP = HDWR | ||
| 338 | JE BL_4 ; | ||
| 339 | ; | ||
| 340 | MOV AX,1400H ; LOAD USER SPECIFIED FONT | ||
| 341 | JUMP BL_5 ; | ||
| 342 | ; | ||
| 343 | BL_4: MOV AX,1401H ; ASK FOR ROM LOAD FONT | ||
| 344 | MOV BL,ZERO ; | ||
| 345 | BL_5: INT 10H ; PERFORM THE LOAD! | ||
| 346 | CALL SET_BLOCK_SP0 ; AND ALSO DO THE SET BLOCK SPECIFIER | ||
| 347 | POP AX ; | ||
| 348 | ; | ||
| 349 | BL_6: CLC ; | ||
| 350 | BL_7: POP DX ; | ||
| 351 | POP BX ; | ||
| 352 | ; | ||
| 353 | CALL SET_CURSOR_POS ; RESTORE THE CURSOR POSITION | ||
| 354 | RET ; | ||
| 355 | BIOS_LOAD ENDP ; | ||
| 356 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 357 | ; | ||
| 358 | ; ASK_BIOS_INFO | ||
| 359 | ; | ||
| 360 | ; THIS ROUTINE IS DESIGNED TO MAKE USE OF THE NEW BIOS | ||
| 361 | ; CALL IN THE '???????' AND FOLLOW-ONS. REFER TO THE | ||
| 362 | ; 'Personal Systems Architecture' DCR #405 (written | ||
| 363 | ; by DD). IF THIS SUPPORT IS NOT FOUND ON THE | ||
| 364 | ; DISPLAY ADAPTER, THEN THE CARRY FLAG IS SET! | ||
| 365 | ; | ||
| 366 | ; INPUT: | ||
| 367 | ; none | ||
| 368 | ; OUTPUT: | ||
| 369 | ; CY = 0 if found | ||
| 370 | ; 1 if not supported | ||
| 371 | ; | ||
| 372 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 373 | RETURN_INFO LABEL BYTE ; | ||
| 374 | DW ? ; OFFSET TO STATIC FUNCTIONALITY INFO | ||
| 375 | DW ? ; SEGMENT TO STATIC FUNCTIONALITY INFO | ||
| 376 | DB ? ; VIDEO MODE | ||
| 377 | DW ? ; COLUMNS ON SCREEN | ||
| 378 | DW ? ; LEN OF REGEN BUFFER | ||
| 379 | DW ? ; START ADDRESS IN REGEN BUFFER | ||
| 380 | DW ? ; CURSOR POSITION OF PAGE #0 | ||
| 381 | DW ? ; CURSOR POSITION OF PAGE #1 | ||
| 382 | DW ? ; CURSOR POSITION OF PAGE #2 | ||
| 383 | DW ? ; CURSOR POSITION OF PAGE #3 | ||
| 384 | DW ? ; CURSOR POSITION OF PAGE #4 | ||
| 385 | DW ? ; CURSOR POSITION OF PAGE #5 | ||
| 386 | DW ? ; CURSOR POSITION OF PAGE #6 | ||
| 387 | DW ? ; CURSOR POSITION OF PAGE #7 | ||
| 388 | DW ? ; CURSOR MODE SETTING | ||
| 389 | DB ? ; ACTIVE DISPLAY PAGE | ||
| 390 | DW ? ; CRT CONTROLLER ADDRESS | ||
| 391 | DB ? ; CRT_MODE_SET | ||
| 392 | DB ? ; CRT_PALETTE | ||
| 393 | DB ? ; ROWS ON SCREEN | ||
| 394 | CHAR_H LABEL WORD ; | ||
| 395 | DW ? ; CHARACTER HEIGHT | ||
| 396 | DB ? ; DISPLAY COMBINATION (ACTIVE) | ||
| 397 | DB ? ; DISPLAY COMBINATION (ALTERNATE) | ||
| 398 | L_RET_INFO EQU ($-RETURN_INFO) ; | ||
| 399 | DB (40h-L_RET_INFO) DUP (?) ; REMAINING DATA.... | ||
| 400 | ; | ||
| 401 | STATIC_INFO STRUC ; | ||
| 402 | DB ? ; VIDEO MODES (part 1) | ||
| 403 | DB ? ; VIDEO MODES (part 2) | ||
| 404 | DB ? ; VIDEO MODES (part 3) | ||
| 405 | DB ? ; RESERVED | ||
| 406 | DB ? ; RESERVED | ||
| 407 | DB ? ; RESERVED | ||
| 408 | DB ? ; RESERVED | ||
| 409 | SI_LINE DB ? ; SCAN LINES AVAILABLE IN TEXT MODES | ||
| 410 | STATIC_INFO ENDS ; | ||
| 411 | ; | ||
| 412 | ASK_BIOS_INFO PROC ; | ||
| 413 | PUSH ES ; | ||
| 414 | PUSH DI ; | ||
| 415 | PUSH BX ; | ||
| 416 | PUSH AX ; | ||
| 417 | ; | ||
| 418 | MOV AX,1B00H ; BIOS CALL FOR 'EGA +' INFORMATION | ||
| 419 | MOV BX,0 ; | ||
| 420 | MOV DI,OFFSET RETURN_INFO ; SETUP THE RETURN ADDRESS (above) | ||
| 421 | PUSH CS ; | ||
| 422 | POP ES ; | ||
| 423 | INT 10H ; | ||
| 424 | ; | ||
| 425 | CMP AL,1BH ; IF AL <> 1BH, THEN ADAPTER DOES | ||
| 426 | JNZ ABI_3 ; NOT SUPPORT THIS CALL...EXIT w/ERROR | ||
| 427 | CLC ; | ||
| 428 | JUMP ABI_4 ; ELSE, LEAVE w/o ERROR | ||
| 429 | ; WITH THE TABLE ALL FILLED IN.... | ||
| 430 | ABI_3: STC ; | ||
| 431 | ABI_4: POP AX ; | ||
| 432 | POP BX ; | ||
| 433 | POP DI ; | ||
| 434 | POP ES ; | ||
| 435 | RET ; | ||
| 436 | ASK_BIOS_INFO ENDP ; | ||
| 437 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 438 | ; | ||
| 439 | ; ASK_BIOS_FONT_SIZE | ||
| 440 | ; | ||
| 441 | ; THIS ROUTINE RETURNS THE PRESENT FONT RESOLUTION. | ||
| 442 | ; IT IS SUPPORTED VIA THE ENHANCED INT 10H BIOS CALL. | ||
| 443 | ; REFER TO THE 'ASK_BIOS_INFO' FOR DETAILS. | ||
| 444 | ; | ||
| 445 | ; INPUT: | ||
| 446 | ; none | ||
| 447 | ; OUTPUT: | ||
| 448 | ; AL = bytes/character | ||
| 449 | ; CY = 0 if found | ||
| 450 | ; 1 if not supported (and AL = unchanged) | ||
| 451 | ; | ||
| 452 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 453 | ASK_BIOS_FONT_SIZE PROC ; | ||
| 454 | PUSH BX ; | ||
| 455 | CALL ASK_BIOS_INFO ; | ||
| 456 | JC ABFS_1 ; | ||
| 457 | MOV BX,CHAR_H ; | ||
| 458 | MOV AL,BL ; | ||
| 459 | CMP AL,ZERO ; PERFORM CHECK FOR BIOS ERROR! | ||
| 460 | JNZ ABFS_0 ; | ||
| 461 | STC ; | ||
| 462 | JUMP ABFS_1 ; | ||
| 463 | ABFS_0: CLC ; | ||
| 464 | ABFS_1: POP BX ; | ||
| 465 | RET ; | ||
| 466 | ASK_BIOS_FONT_SIZE ENDP ; | ||
| 467 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 468 | ; | ||
| 469 | ; ASK_BIOS_SCAN_LINES | ||
| 470 | ; | ||
| 471 | ; THIS IS SIMILAR TO THE ASK_BIOS_FONT_SIZE, EXCEPT IT | ||
| 472 | ; WILL RETURN THE AVAILABLE VERTICAL SCAN LINES FOR ALL | ||
| 473 | ; TEXT MODES. REFER TO REFERENCED DCR #405. | ||
| 474 | ; | ||
| 475 | ; INPUT: | ||
| 476 | ; none | ||
| 477 | ; OUTPUT: | ||
| 478 | ; AL = encoded SCAN LINES (in text modes) | ||
| 479 | ; CY = 0 if found | ||
| 480 | ; 1 if not supported | ||
| 481 | ; | ||
| 482 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 483 | ASK_BIOS_SCAN_LINES PROC ; | ||
| 484 | CALL ASK_BIOS_INFO ; ASK BIOS FOR DETAILED INFO... | ||
| 485 | JC ABSL_0 ; IF CY = 1, THEN BIOS NOT SMART ENOUGH! | ||
| 486 | PUSH BX ; | ||
| 487 | PUSH SI ; | ||
| 488 | PUSH ES ; | ||
| 489 | LEA SI,RETURN_INFO ; GET POINTERS TO STATIC TABLE.... | ||
| 490 | MOV BX,CS:[SI+2] ; GET STATIC INFO SEGMENT | ||
| 491 | MOV ES,BX ; & | ||
| 492 | MOV SI,CS:[SI] ; GET STATIC INFO OFFSET | ||
| 493 | MOV AL,ES:[SI].SI_LINE ; THEN, FINALLY THE ENCODED SCAN_LINES | ||
| 494 | POP ES ; | ||
| 495 | POP SI ; | ||
| 496 | POP BX ; | ||
| 497 | ABSL_0: RET ; | ||
| 498 | ASK_BIOS_SCAN_LINES ENDP ; | ||
| 499 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 500 | ; | ||
| 501 | ; VECTOR_LOAD | ||
| 502 | ; | ||
| 503 | ; THIS ROUTINE WORKS SIMILARLY TO THE BIOS_LOAD, EXCEPT THAT | ||
| 504 | ; THE FONT SUPPORT IS LOADED VIA A VECTOR MECHANISM...RATHER | ||
| 505 | ; THAN USING BIOS. THE BIOS_LOAD METHOD IS USED EXCLUSIVELY | ||
| 506 | ; FOR TEXT MODES ONLY....WHILE THE VECTOR_LOAD IS FOR APA | ||
| 507 | ; (all points addressable). | ||
| 508 | ; | ||
| 509 | ; THE VECTOR SUPPORT IS BASED ON THE INTERRUPT VECTORS 1F hex | ||
| 510 | ; AND 43 hex. THE INTERRUPT 1F hex HAS SPECIAL CONSIDERATIONS | ||
| 511 | ; DUE TO THE 'GRAFTABL.COM' PROGRAM PROVIDED ON DOS. REFER | ||
| 512 | ; TO THE 'CPS DESIGN DOCUMENT' (written by IBM Canada Lab) FOR | ||
| 513 | ; DETAILS. | ||
| 514 | ; | ||
| 515 | ; INPUT: | ||
| 516 | ; AL = ? load mechanism | ||
| 517 | ; | ||
| 518 | ; 7 6 5 4 3 2 1 0 | ||
| 519 | ; x x x x 0 0 0 0 | ||
| 520 | ; � ����������� 1 = INT 1FH | ||
| 521 | ; ������������� 1 = INT 43H | ||
| 522 | ; 1 = int 1FH special handling | ||
| 523 | ; | ||
| 524 | ; | ||
| 525 | ; ES : DI points to start of font data | ||
| 526 | ; CX = ? count of characters to load | ||
| 527 | ; BH = bytes per character | ||
| 528 | ; | ||
| 529 | ; DS = CS assumed | ||
| 530 | ; | ||
| 531 | ; *********************************************************** | ||
| 532 | ; ************** SCHEDULED FOR OPTIMIZATION ***************** | ||
| 533 | ; *********************************************************** | ||
| 534 | ; | ||
| 535 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 536 | VECTOR_MODE DB ? ; | ||
| 537 | INTER_43H EQU 00100000b ; | ||
| 538 | INTER_1FH EQU 00010000b ; | ||
| 539 | LCD_1FH EQU 01000000b ; | ||
| 540 | INTER_44H EQU 10000000b ; | ||
| 541 | ; | ||
| 542 | VECTOR_LOAD PROC ; | ||
| 543 | TEST AL,INTER_1FH ; CHECK IF ANY INTERRUPT 1FH PROCESSING | ||
| 544 | JNZ VL_00 ; IS NEEDED. | ||
| 545 | JUMP VL_3 ; IS NEEDED. | ||
| 546 | ; | ||
| 547 | VL_00: MOV CS:VECTOR_MODE,AL ; | ||
| 548 | PUSH AX ; SAVE AX REGISTER.... | ||
| 549 | MOV AX,0B000H ; INTERFACE CALL TO GRAFTABL TO SEE | ||
| 550 | INT 2FH ; IF SUPPORT IS LOADED. | ||
| 551 | CMP AL,0FFH ; IF SO, THEN EXIT! | ||
| 552 | POP AX ; RESTORE AX REGISTER.. | ||
| 553 | JNE VL_2AA ; IF NOT 0FFH=AL, THEN NOT LOADED! | ||
| 554 | JUMP VL_3 ; EXIT, GRAFTABL HAS CONTROL | ||
| 555 | ; | ||
| 556 | VL_2AA: CMP CHARACTER_SOURCE,0 ; TEST IF CP = HDWR | ||
| 557 | JE VL_1 ; | ||
| 558 | ; | ||
| 559 | PUSH DS ; | ||
| 560 | PUSH AX ; | ||
| 561 | XOR AX,AX ; | ||
| 562 | MOV DS,AX ; | ||
| 563 | MOV AX,DI ; PUT DI INTO AX FOR ADJUSTMENT | ||
| 564 | ADD AX,8*128 ; | ||
| 565 | ; | ||
| 566 | CLI ; | ||
| 567 | MOV DS:WORD PTR INT_1F_LOW,AX; SET THE HIGH 128 CHARACTERS | ||
| 568 | MOV DS:WORD PTR INT_1F_HI,ES; | ||
| 569 | STI ; | ||
| 570 | MOV CS:OLD_INT_1F,AX ; SAVE VALUE TO INTERNAL STORAGE | ||
| 571 | MOV CS:OLD_INT_1F+2,ES ; | ||
| 572 | POP AX ; | ||
| 573 | POP DS ; | ||
| 574 | JUMP VL_3 ; | ||
| 575 | ; | ||
| 576 | VL_1: TEST CS:VECTOR_MODE,LCD_1FH ; CHECK IF LCD ACTIVE | ||
| 577 | JZ VL_11A ; | ||
| 578 | ; | ||
| 579 | PUSH DS ; SET INT 44 hex WITH HDWR CP | ||
| 580 | PUSH DI ; | ||
| 581 | PUSH AX ; | ||
| 582 | XOR AX,AX ; | ||
| 583 | MOV DS,AX ; | ||
| 584 | CLI ; | ||
| 585 | MOV DI,CS:ROM_INT_1F ; | ||
| 586 | MOV DS:WORD PTR INT_1F_LOW,DI; SET NEW VECTOR | ||
| 587 | MOV CS:OLD_INT_1F,DI ; SAVE VALUE TO INTERNAL STORAGE | ||
| 588 | MOV DI,CS:ROM_INT_1F+2 ; | ||
| 589 | MOV DS:WORD PTR INT_1F_HI,DI; | ||
| 590 | MOV CS:OLD_INT_1F+2,DI ; | ||
| 591 | STI ; | ||
| 592 | POP AX ; | ||
| 593 | POP DI ; | ||
| 594 | POP DS ; | ||
| 595 | JUMP VL_3 ; | ||
| 596 | ; | ||
| 597 | VL_11A: PUSH ES ; SET INT 1F hex WITH HDWR CP | ||
| 598 | PUSH DS ; | ||
| 599 | PUSH BP ; | ||
| 600 | PUSH AX ; | ||
| 601 | PUSH BX ; | ||
| 602 | PUSH CX ; | ||
| 603 | PUSH DX ; | ||
| 604 | MOV AX,1130H ; GET EGA INFORMATION | ||
| 605 | MOV BH,4 ; GET ROM DOUBLE DOT PTR (TOP) | ||
| 606 | INT 10H ; | ||
| 607 | XOR AX,AX ; | ||
| 608 | MOV DS,AX ; | ||
| 609 | CLI ; | ||
| 610 | MOV DS:WORD PTR INT_1F_LOW,BP; SET THE HIGH 128 CHARACTERS | ||
| 611 | MOV DS:WORD PTR INT_1F_HI,ES; | ||
| 612 | STI ; | ||
| 613 | MOV CS:OLD_INT_1F,BP ; SAVE VALUE TO INTERNAL STORAGE | ||
| 614 | MOV CS:OLD_INT_1F+2,ES ; | ||
| 615 | POP DX ; | ||
| 616 | POP CX ; | ||
| 617 | POP BX ; | ||
| 618 | POP AX ; | ||
| 619 | POP BP ; | ||
| 620 | POP DS ; | ||
| 621 | POP ES ; | ||
| 622 | ; | ||
| 623 | VL_3: TEST AL,INTER_43H ; | ||
| 624 | JZ VL_8 ; | ||
| 625 | ; | ||
| 626 | CMP CHARACTER_SOURCE,0 ; TEST IF CP = HDWR | ||
| 627 | JE VL_5 ; | ||
| 628 | ; | ||
| 629 | PUSH DS ; SET INT 43 hex WITH USER TABLE | ||
| 630 | PUSH AX ; | ||
| 631 | XOR AX,AX ; | ||
| 632 | MOV DS,AX ; | ||
| 633 | CLI ; | ||
| 634 | MOV DS:WORD PTR INT_43_LOW,DI; | ||
| 635 | MOV DS:WORD PTR INT_43_HI,ES; | ||
| 636 | STI ; | ||
| 637 | POP AX ; | ||
| 638 | POP DS ; | ||
| 639 | JUMP VL_9 ; | ||
| 640 | ; | ||
| 641 | VL_5: PUSH BX ; SET INT 43 hex WITH HDWR CP | ||
| 642 | MOV BH,3 ; RETURN ROM DOUBLE DOT PTR | ||
| 643 | CMP BYTES_PER_CHAR,8 ; WORK FOR HARDWARE CP's | ||
| 644 | JE VL_6 ; | ||
| 645 | ; | ||
| 646 | MOV BH,2 ; RETURN ROM 8X14 PTR | ||
| 647 | CMP BYTES_PER_CHAR,14 ; | ||
| 648 | JE VL_6 ; | ||
| 649 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 650 | ; THIS IS BH=6 (??????? WAS IN ERROR). THE ?????? HAS | ||
| 651 | ; THE LATEST FIX SUPPORT. | ||
| 652 | ; | ||
| 653 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 654 | MOV BH,6 ; SET FOR ROM 8X16 PTR | ||
| 655 | CMP BYTES_PER_CHAR,16 ; | ||
| 656 | JNE VL_7 ; | ||
| 657 | ; | ||
| 658 | VL_6: PUSH AX ; YES, ONCE AGAIN, SAVE THOSE REG'ies | ||
| 659 | PUSH CX ; | ||
| 660 | PUSH DX ; | ||
| 661 | PUSH DS ; | ||
| 662 | PUSH ES ; | ||
| 663 | PUSH BP ; | ||
| 664 | MOV AX,1130H ; GET EGA INFORMATION (PTR=ES:DI) | ||
| 665 | INT 10H ; | ||
| 666 | XOR AX,AX ; | ||
| 667 | MOV DS,AX ; | ||
| 668 | CLI ; | ||
| 669 | MOV DS:WORD PTR INT_43_LOW,BP; SET THE FULL CHARACTER SET | ||
| 670 | MOV DS:WORD PTR INT_43_HI,ES; | ||
| 671 | STI ; | ||
| 672 | POP BP ; | ||
| 673 | POP ES ; | ||
| 674 | POP DS ; | ||
| 675 | POP DX ; | ||
| 676 | POP CX ; | ||
| 677 | POP AX ; | ||
| 678 | VL_7: POP BX ; | ||
| 679 | ; | ||
| 680 | VL_8: TEST AL,INTER_44H ; Test for INTERRUPT 44 Hex | ||
| 681 | JZ VL_9 ; | ||
| 682 | ; | ||
| 683 | CMP CHARACTER_SOURCE,0 ; TEST IF CP = HDWR | ||
| 684 | JE VL_8A ; | ||
| 685 | ; | ||
| 686 | PUSH DS ; SET INT 43 hex WITH USER TABLE | ||
| 687 | PUSH AX ; | ||
| 688 | XOR AX,AX ; | ||
| 689 | MOV DS,AX ; | ||
| 690 | CLI ; | ||
| 691 | MOV DS:WORD PTR INT_44_LOW,DI; | ||
| 692 | MOV DS:WORD PTR INT_44_HI,ES; | ||
| 693 | STI ; | ||
| 694 | POP AX ; | ||
| 695 | POP DS ; | ||
| 696 | JUMP VL_9 ; | ||
| 697 | ; | ||
| 698 | VL_8A: PUSH DS ; SET INT 44 hex WITH HDWR CP | ||
| 699 | PUSH DI ; | ||
| 700 | PUSH AX ; | ||
| 701 | XOR AX,AX ; | ||
| 702 | MOV DS,AX ; | ||
| 703 | CLI ; | ||
| 704 | MOV DI,CS:ROM_INT_44 ; | ||
| 705 | MOV DS:WORD PTR INT_44_LOW,DI; | ||
| 706 | MOV DI,CS:ROM_INT_44+2 ; | ||
| 707 | MOV DS:WORD PTR INT_44_HI,DI; | ||
| 708 | STI ; | ||
| 709 | POP AX ; | ||
| 710 | POP DI ; | ||
| 711 | POP DS ; | ||
| 712 | ; | ||
| 713 | VL_9: RET ; | ||
| 714 | VECTOR_LOAD ENDP ; | ||
| 715 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 716 | ; | ||
| 717 | ; LOAD CODE PAGE | ||
| 718 | ; | ||
| 719 | ; This routine is called by INVOKE_DATA and | ||
| 720 | ; by the INT_10H code. | ||
| 721 | ; | ||
| 722 | ; EXIT: | ||
| 723 | ; CP_ES points to the final CP data segment | ||
| 724 | ; CP_DI points to the final CP data offset | ||
| 725 | ; | ||
| 726 | ; CY = 0 if no error detected | ||
| 727 | ; 1 if error occurred | ||
| 728 | ; AX = 0000 if hardware code page matched | ||
| 729 | ; AX = 0001 if routine is presently busy | ||
| 730 | ; | ||
| 731 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 732 | CP_ES DW ? ; | ||
| 733 | CP_DI DW ? ; | ||
| 734 | LOAD_CP_SEMA DB 0 ; SEMAPHORE TO TELL IF ROUTINE IS | ||
| 735 | ; ALREADY ACTIVE.... | ||
| 736 | ; | ||
| 737 | ANSI_BUFFER LABEL BYTE ; WGR BUFFER FOR ANSI ;AN000; | ||
| 738 | DB ZERO ; WGR INFO LEVEL ;AN000; | ||
| 739 | DB ZERO ; WGR ;AN000; | ||
| 740 | DW ANSI_BUF_SIZE ; WGR LENGTH OF DATA ;AN000; | ||
| 741 | DW ? ; WGR CONTROL FLAGS ;AN000; | ||
| 742 | D_MODE LABEL BYTE ; WGR DISPLAY MODE ;AN000; | ||
| 743 | DB ? ; WGR ;AN000; | ||
| 744 | DB ? ; WGR RESERVED ;AN000; | ||
| 745 | DW ? ; WGR COLORS ;AN000; | ||
| 746 | DW ? ; WGR WIDTH ;AN000; | ||
| 747 | DW ? ; WGR LENGTH ;AN000; | ||
| 748 | DW ? ; WGR COLUMNS ;AN000; | ||
| 749 | SCR_ROWS LABEL WORD ; WGR ROWS ;AN000; | ||
| 750 | DW ? ; WGR ;AN000; | ||
| 751 | ; | ||
| 752 | RE_CALC DW OFF ; WGR VALUE TO OR IN CHARACTER LOAD ;AN000; | ||
| 753 | SETMODE_FLAG DB OFF ; WGR FLAG INDICATING A MODE SET IS REQUIRED ;AN000; | ||
| 754 | ; | ||
| 755 | TEST_CP PROC ; | ||
| 756 | CMP CS:LOAD_CP_SEMA,ZERO ; TEST IF ALREADY ACTIVE! | ||
| 757 | JE I10_0 ; | ||
| 758 | STC ; IF ALREADY ACTIVE, THEN SET ERROR | ||
| 759 | MOV AX,ONE ; TO INDICATE THAT ACTIVE.... | ||
| 760 | RET ; | ||
| 761 | ; | ||
| 762 | I10_0: MOV CS:LOAD_CP_SEMA,ONE ; SET ROUTINE NOW ACTIVE... | ||
| 763 | PUSH BX ; | ||
| 764 | PUSH CX ; | ||
| 765 | PUSH DX ; WGR ;AN000; | ||
| 766 | PUSH SI ; | ||
| 767 | PUSH DI ; | ||
| 768 | PUSH DS ; | ||
| 769 | PUSH ES ; | ||
| 770 | ; | ||
| 771 | PUSH CS ; | ||
| 772 | POP DS ; SETUP DS SEGMENT TO CS | ||
| 773 | PUSH CS ; | ||
| 774 | POP ES ; SETUP ES SEGMENT TO CS | ||
| 775 | ; | ||
| 776 | XOR AH,AH ; AH=0 FOR MODE SET, AL=MODE_TYPE | ||
| 777 | MOV AL,MODE_VALUE ; | ||
| 778 | MOV SI,AX ; ESTABLISH INDEX INTO LOAD_MECH table | ||
| 779 | MOV AL,[SI].FONT_SIZE ; GET FONT_SIZE FOR THIS MODE_VALUE | ||
| 780 | OR AL,AL ; TEST FOR MODE_VALUE=0 | ||
| 781 | JNZ I10_2 ; | ||
| 782 | ; | ||
| 783 | CALL ASK_BIOS_FONT_SIZE ; GET BIOS TO INDICATE FONT_SIZE | ||
| 784 | JC I10_A ; IF CY=1 THEN ERROR OCCURRED | ||
| 785 | ; | ||
| 786 | I10_2: PUSH AX ; WGR SAVE FONT SIZE ;AN000; | ||
| 787 | MOV Ah,ANSI_2F ; WGR REQUEST TO ANSI FOR SCREEN SIZE ;AN000; | ||
| 788 | mov al,IOCTL_2F ; IOCTL request | ||
| 789 | MOV CL,GET_SUBFUNC ; WGR GET CHARACTERISTICS FUNCTION ;AN000; | ||
| 790 | LEA DX,ANSI_BUFFER ; WGR BUFFER FOR REQUEST STORAGE ;AN000; | ||
| 791 | INT 2FH ; WGR ;AN000; | ||
| 792 | JC I10_3 ; WGR IF CARRY THEN ERROR..CONT AS BEFORE ;AN000; | ||
| 793 | CMP AL,16H ; WGR ENSURE THAT ANSI WAS THERE.. ;AN000; | ||
| 794 | JNE I10_3 ; WGR NO....CONT AS BEFORE ;AN000; | ||
| 795 | CMP D_MODE,ON ; WGR ARE WE IN A TEXT MODE? ;AN000; | ||
| 796 | JNE I10_3 ; WGR NO...CONT AS BEFORE.. ;AN000; | ||
| 797 | CMP SCR_ROWS,DEFAULT_LEN ; WGR IS IT JUST 25 LINES?.. ;AN000; | ||
| 798 | JE I10_3 ; WGR THEN...CONT AS BEFORE.. ;AN000; | ||
| 799 | POP AX ; WGR GREATER THAN 25 LINES SO...POP OFF.. ;AN000; | ||
| 800 | MOV CS:RE_CALC,RECALC_ON ; WGR RECALCULATION REQUIRED ;AN000; | ||
| 801 | MOV CS:SETMODE_FLAG,ON ; WGR A MODE SET IS REQUIRED ;AN000; | ||
| 802 | MOV AL,EIGHT ; WGR OLD FONT SIZE AND USE AN 8 HIGH BOX. ;AN000; | ||
| 803 | JMP I10_4 ; WGR ;AN000; | ||
| 804 | ; | ||
| 805 | I10_3: POP AX ; WGR RESTORE OLD VALUE ;AN000; | ||
| 806 | MOV CS:SETMODE_FLAG,OFF ; WGR NO MODE SET IS REQUIRED. ;AN000; | ||
| 807 | ; | ||
| 808 | I10_4: MOV BYTES_PER_CHAR,AL ; SAVE VALUE DETERMINED | ||
| 809 | ; | ||
| 810 | MOV CX,CPD_ACTIVE ; | ||
| 811 | CMP CX,-1 ; CHECK IF ACTIVE CP=PLACE_HOLDER | ||
| 812 | JE I10_A ; IF SO, THEN STAY SLEEPING | ||
| 813 | ; | ||
| 814 | PUSH CX ; | ||
| 815 | CALL FIND_CP ; DETERMINE IF THE CODE PAGE=HDWR | ||
| 816 | MOV BL,CL ; | ||
| 817 | POP CX ; RESTORE CP VALUE FOR FUTURE REF | ||
| 818 | JC I10_A ; | ||
| 819 | MOV CHARACTER_SOURCE,BL ; | ||
| 820 | OR BL,BL ; TEST TYPE OF CP? | ||
| 821 | JE I10_B ; IF CODE PAGE=HDWR THEN RESOLUTION OK! | ||
| 822 | ; | ||
| 823 | CALL FIND_FONT ; CHECK IF THE FONT RESOLUTION IS HERE | ||
| 824 | JC I10_A ; IF CY=0 THEN ES:DI POINT TO FONT | ||
| 825 | MOV CS:CP_DI,DI ; | ||
| 826 | MOV DI,ES ; | ||
| 827 | MOV CS:CP_ES,DI ; | ||
| 828 | JUMP I10_B ; | ||
| 829 | ; | ||
| 830 | I10_A: XOR AX,AX ; | ||
| 831 | STC ; | ||
| 832 | I10_B: POP ES ; | ||
| 833 | POP DS ; | ||
| 834 | POP DI ; | ||
| 835 | POP SI ; | ||
| 836 | POP DX ; WGR ;AN000; | ||
| 837 | POP CX ; | ||
| 838 | POP BX ; | ||
| 839 | MOV CS:LOAD_CP_SEMA,ZERO ; SET ROUTINE NOW COMPLETED.... | ||
| 840 | RET ; | ||
| 841 | TEST_CP ENDP ; | ||
| 842 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 843 | ; | ||
| 844 | ; INVOKE DATA | ||
| 845 | ; | ||
| 846 | ; THIS ROUTINE PERFORMS THE LOADING OF THE CODE PAGE | ||
| 847 | ; INFORMATION. IT USES THE POINTERS FROM THE TEST_CP | ||
| 848 | ; ROUTINE. | ||
| 849 | ; | ||
| 850 | ; ENTRY: | ||
| 851 | ; CP_ES points to the actual data of CP segment | ||
| 852 | ; CP_DI points to the actual data of CP offset | ||
| 853 | ; | ||
| 854 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 855 | INVOKE_DATA PROC ; | ||
| 856 | PUSH BX ; | ||
| 857 | PUSH CX ; | ||
| 858 | PUSH SI ; | ||
| 859 | PUSH DI ; | ||
| 860 | PUSH DS ; | ||
| 861 | PUSH ES ; | ||
| 862 | ; | ||
| 863 | MOV DI,CS:CP_ES ; GET THE ES:DI COMBO FROM TEST_CP | ||
| 864 | MOV ES,DI ; | ||
| 865 | MOV DI,CS:CP_DI ; | ||
| 866 | ; | ||
| 867 | XOR AH,AH ; | ||
| 868 | MOV AL,MODE_VALUE ; CREATE INDEX TO GET LOAD_MECH | ||
| 869 | MOV SI,AX ; | ||
| 870 | MOV AL,[SI].LOAD_MECH ; | ||
| 871 | MOV LOAD_MECHANISM,AL ; SAVE THIS VALUE FOR OTHER ROUTINES | ||
| 872 | TEST AL,MASK_BIOS_LOAD ; FIND OUT IF INT 10H SUPPORTS | ||
| 873 | JZ INV_7 ; | ||
| 874 | ; | ||
| 875 | MOV CX,256 ; **** HARD CODED COUNT **** | ||
| 876 | MOV BH,BYTES_PER_CHAR ; | ||
| 877 | CALL BIOS_LOAD ; GET BIOS CODE TO GIVE THE CP SUPPORT | ||
| 878 | JC INV_A ; | ||
| 879 | ; | ||
| 880 | INV_7: TEST AL,MASK_VECTOR_LOAD ; | ||
| 881 | JZ INV_8 ; | ||
| 882 | ; | ||
| 883 | CALL VECTOR_LOAD ; ESTABLISH THE VECTORS FOR CP SUPPORT | ||
| 884 | JC INV_A ; | ||
| 885 | ; | ||
| 886 | INV_8: CLC ; | ||
| 887 | JUMP INV_B ; | ||
| 888 | INV_A: XOR AX,AX ; | ||
| 889 | STC ; | ||
| 890 | INV_B: POP ES ; | ||
| 891 | POP DS ; | ||
| 892 | POP DI ; | ||
| 893 | POP SI ; | ||
| 894 | POP CX ; | ||
| 895 | POP BX ; | ||
| 896 | RET ; | ||
| 897 | INVOKE_DATA ENDP ; | ||
| 898 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 899 | ; | ||
| 900 | ; GET_CURSOR_POSITION | ||
| 901 | ; | ||
| 902 | ; This routine is called by BIOS_LOAD. It is used | ||
| 903 | ; to ask for the cursor position before a character | ||
| 904 | ; download...since BIOS puts the cursor to (1,1). | ||
| 905 | ; | ||
| 906 | ; | ||
| 907 | ; INPUT: | ||
| 908 | ; none | ||
| 909 | ; OUTPUT: | ||
| 910 | ; BX = page number | ||
| 911 | ; DX = cursor position | ||
| 912 | ; | ||
| 913 | ; DS = CS assumed | ||
| 914 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 915 | ACTIVE_PAGE DW ? ; | ||
| 916 | CURSOR_POS DW ? ; | ||
| 917 | ; | ||
| 918 | GET_CURSOR_POS PROC ; | ||
| 919 | PUSHF ; | ||
| 920 | PUSH DX ; | ||
| 921 | PUSH CX ; | ||
| 922 | PUSH BX ; | ||
| 923 | PUSH AX ; | ||
| 924 | MOV AH,15 ; CALL TO GET CURRENT_VIDEO_STATE | ||
| 925 | PUSHF ; | ||
| 926 | CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command | ||
| 927 | MOV ACTIVE_PAGE,BX ; | ||
| 928 | ; | ||
| 929 | MOV AH,3 ; | ||
| 930 | PUSHF ; | ||
| 931 | CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command | ||
| 932 | MOV CURSOR_POS,DX ; | ||
| 933 | POP AX ; | ||
| 934 | POP BX ; | ||
| 935 | POP CX ; | ||
| 936 | POP DX ; | ||
| 937 | POPF ; | ||
| 938 | RET ; | ||
| 939 | GET_CURSOR_POS ENDP ; | ||
| 940 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 941 | ; | ||
| 942 | ; SET_CURSOR_POSITION | ||
| 943 | ; | ||
| 944 | ; This routine is called by BIOS_LOAD. It is used | ||
| 945 | ; to tell BIOS where to put the cursor. | ||
| 946 | ; | ||
| 947 | ; INPUT: | ||
| 948 | ; BX = page number | ||
| 949 | ; DX = cursor position | ||
| 950 | ; OUTPUT: | ||
| 951 | ; none | ||
| 952 | ; | ||
| 953 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 954 | SET_CURSOR_POS PROC ; | ||
| 955 | PUSHF ; | ||
| 956 | PUSH DX ; | ||
| 957 | PUSH BX ; | ||
| 958 | PUSH AX ; | ||
| 959 | MOV AH,2 ; | ||
| 960 | MOV BX,ACTIVE_PAGE ; | ||
| 961 | MOV DX,CURSOR_POS ; | ||
| 962 | PUSHF ; | ||
| 963 | CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command | ||
| 964 | POP AX ; | ||
| 965 | POP BX ; | ||
| 966 | POP DX ; | ||
| 967 | POPF ; | ||
| 968 | RET ; | ||
| 969 | SET_CURSOR_POS ENDP ; | ||
| 970 | |||
| 971 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 972 | ; Info_Ansi_ModeSet | ||
| 973 | ; | ||
| 974 | ; INPUT:None | ||
| 975 | ; OUTPUT:None | ||
| 976 | ; | ||
| 977 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 978 | Info_Ansi_ModeSet proc near | ||
| 979 | push ax | ||
| 980 | push dx | ||
| 981 | push ds | ||
| 982 | push si | ||
| 983 | pushf | ||
| 984 | push cs | ||
| 985 | pop ds | ||
| 986 | lea si, ANSI_DA_INFO | ||
| 987 | mov [si].DA_SETMODE_FLAG, 1 ;Tell ANSI we are calling int10h, Set Mode funciton | ||
| 988 | mov dx, si | ||
| 989 | mov ah, ANSI_2F | ||
| 990 | mov al, DA_INFO_2F | ||
| 991 | int 2fh ;We don't worry about whether ANSI installed or not. | ||
| 992 | popf | ||
| 993 | pop si | ||
| 994 | pop ds | ||
| 995 | pop dx | ||
| 996 | pop ax | ||
| 997 | ret | ||
| 998 | Info_Ansi_ModeSet endp | ||
| 999 | |||
| 1000 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1001 | ; Info_Ansi_ModeDone | ||
| 1002 | ; | ||
| 1003 | ; INPUT:None | ||
| 1004 | ; OUTPUT:None | ||
| 1005 | ; | ||
| 1006 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1007 | Info_Ansi_ModeDone proc near | ||
| 1008 | push ax | ||
| 1009 | push dx | ||
| 1010 | push ds | ||
| 1011 | push si | ||
| 1012 | pushf | ||
| 1013 | push cs | ||
| 1014 | pop ds | ||
| 1015 | lea si, ANSI_DA_INFO | ||
| 1016 | mov [si].DA_SETMODE_FLAG, 0 ;Tell ANSI we are done with int10h, Set Mode funciton | ||
| 1017 | mov dx, si | ||
| 1018 | mov ah, ANSI_2F | ||
| 1019 | mov al, DA_INFO_2F | ||
| 1020 | int 2fh ;We don't worry about whether ANSI installed or not. | ||
| 1021 | popf | ||
| 1022 | pop si | ||
| 1023 | pop ds | ||
| 1024 | pop dx | ||
| 1025 | pop ax | ||
| 1026 | ret | ||
| 1027 | Info_Ansi_ModeDone endp | ||
| 1028 | |||
| 1029 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||