diff options
Diffstat (limited to 'v4.0/src/CMD/MODE/MODEVID.ASM')
| -rw-r--r-- | v4.0/src/CMD/MODE/MODEVID.ASM | 614 |
1 files changed, 614 insertions, 0 deletions
diff --git a/v4.0/src/CMD/MODE/MODEVID.ASM b/v4.0/src/CMD/MODE/MODEVID.ASM new file mode 100644 index 0000000..360a110 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODEVID.ASM | |||
| @@ -0,0 +1,614 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | TITLE MODEVID.SAL | ||
| 3 | |||
| 4 | .XLIST | ||
| 5 | INCLUDE STRUC.INC ;macro library for 'struc' | ||
| 6 | .LIST | ||
| 7 | |||
| 8 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 9 | ;º º ;AN000; | ||
| 10 | ;AN000; | ||
| 11 | ; AC000 - P3200: Was displaying a message that Sam Nunn had deleted from the | ||
| 12 | ; USA.MSG file because it looked like a common message. Now | ||
| 13 | ; I use a different (better) message. It was "Invalid paramters", | ||
| 14 | ; is now "Function not supported - ????". | ||
| 15 | |||
| 16 | ;º º ;AN000; | ||
| 17 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 18 | ;AN000; | ||
| 19 | SIGNITURE SEGMENT AT 0C000H | ||
| 20 | ORG 0 | ||
| 21 | SIGWORD DW ? ;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT | ||
| 22 | SIGNITURE ENDS | ||
| 23 | |||
| 24 | |||
| 25 | LOW_MEM SEGMENT AT 0 | ||
| 26 | ORG 410H | ||
| 27 | EQUIP_FLAG EQU THIS WORD | ||
| 28 | LOW_MEM ENDS | ||
| 29 | |||
| 30 | |||
| 31 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 32 | ;º º | ||
| 33 | |||
| 34 | |||
| 35 | DISPLAY MACRO MSG | ||
| 36 | MOV DX,OFFSET MSG | ||
| 37 | CALL PRINTF | ||
| 38 | ENDM | ||
| 39 | |||
| 40 | |||
| 41 | ;------------------------------------------------------------------------------- | ||
| 42 | |||
| 43 | |||
| 44 | find_number MACRO num, list | ||
| 45 | |||
| 46 | ;Purpose: See if num is in the list of numbers. | ||
| 47 | |||
| 48 | ;Input: num - number to be checked | ||
| 49 | ; list - label of list to scan | ||
| 50 | ; list_len - length of the list to scan. This name is built from the | ||
| 51 | ; label 'list' that is input. | ||
| 52 | |||
| 53 | ;Output: zero flag set if the number is found in 'list' | ||
| 54 | |||
| 55 | ;Assumption: A label of the name list_len exists and is in segment addressed by | ||
| 56 | ; DS, where 'list' is the label passed in. ES and DS are the same. | ||
| 57 | |||
| 58 | ;Side effects: The direction flag is cleared. | ||
| 59 | |||
| 60 | PUSH DI | ||
| 61 | PUSH CX | ||
| 62 | |||
| 63 | MOV AL,num | ||
| 64 | MOV DI,OFFSET list | ||
| 65 | CLD ;want to increment DI | ||
| 66 | MOV CX,list&_len ;CX=number of nums in the list | ||
| 67 | REPNE SCASB | ||
| 68 | |||
| 69 | POP CX | ||
| 70 | POP DI | ||
| 71 | |||
| 72 | ENDM | ||
| 73 | |||
| 74 | ;------------------------------------------------------------------------------- | ||
| 75 | |||
| 76 | |||
| 77 | SET_CURSOR_POS MACRO | ||
| 78 | MOV AH,2 ;SET CURSOR | ||
| 79 | MOV DX,0 ;ROW=0,COL=0 | ||
| 80 | MOV BH,0 ;SELECT SCREEN 0 | ||
| 81 | INT 10H | ||
| 82 | |||
| 83 | ENDM | ||
| 84 | |||
| 85 | MODE_VIDEO MACRO OPTION | ||
| 86 | MOV AH,0 ;SET MODE | ||
| 87 | MOV AL,OPTION | ||
| 88 | INT 10H | ||
| 89 | |||
| 90 | ENDM | ||
| 91 | |||
| 92 | SET_CURSOR_TYPE MACRO | ||
| 93 | MOV AH,1 ;SET CURSOR TYPE | ||
| 94 | MOV CX,CURSOR_TYPE ;ROW=0,COL=0 | ||
| 95 | INT 10H | ||
| 96 | |||
| 97 | ENDM | ||
| 98 | |||
| 99 | ;º º | ||
| 100 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 101 | |||
| 102 | |||
| 103 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 104 | ;º º | ||
| 105 | |||
| 106 | B EQU 0 ;POSITION OF "B" IN PARM1 FOR BW?0 | ||
| 107 | W EQU 1 ;POSITION OF "W" IN PARM1 FOR BW?0 | ||
| 108 | C EQU 0 ;POSITION OF "C" IN PARM1 FOR CO?0 | ||
| 109 | O EQU 1 ;POSITION OF "O" IN PARM1 FOR CO?0 | ||
| 110 | M EQU 0 ;POSITION OF "M" IN PARM1 FOR MONO | ||
| 111 | N EQU 2 ;POSITION OF "N" IN PARM1 FOR MONO | ||
| 112 | OH EQU 3 ;POSITION OF SECOND "O" IN PARM1 FOR MONO | ||
| 113 | |||
| 114 | all EQU 0FEH ;descreet value representing adapter/monitor that can be in mono and color | ||
| 115 | ALT_SELECT EQU 12H ;ALTERNATE SELECT FUNCTION OF INT10 | ||
| 116 | AMOAMA EQU 01 ;map to check 'all modes on all monitors active' bit of misc state info byte | ||
| 117 | bw7 EQU 7 ;another mono (emulation) mode (VGA with analog monochrome) | ||
| 118 | bw0B EQU 0BH ;analog black and white on a PALACE | ||
| 119 | cga EQU 02 ;plain color card | ||
| 120 | COLOR_CURSOR_TYPE EQU 0607H ;CURSOR TYPE FOR ALL COLOR AND BW MODES | ||
| 121 | color6 EQU 6 ;another color supporting combination (PGA with color display) | ||
| 122 | color8 EQU 8 ;another color supporting combination | ||
| 123 | colorA EQU 0AH ;yet another color combo (color display or ehnanced color display on PALACE) | ||
| 124 | colorC EQU 0CH ;even another color combo (PALACE with analog color) | ||
| 125 | ega_color EQU 4 ;value for color support of EGA | ||
| 126 | EGA_INFO EQU 10H ;RETURN EGA INFORMATION OPTION OF ALT. SELECT FUNCTION OF INT10 | ||
| 127 | EGA_MONO EQU 05H | ||
| 128 | EGA_SIG EQU 0AA55H ;SIGNITURE FOR EGA CARD | ||
| 129 | EMPTY EQU 0 ;THE REMAINING 6 CHARACTERS OF PARM1 SHOULD BE 0 | ||
| 130 | FALSE EQU 0 | ||
| 131 | get_sys_stat EQU 43H ;get system status function of INT 15H | ||
| 132 | LCD_attached EQU 00000000B ;bit 0=0 if the LCD is attached | ||
| 133 | LCD_bit EQU 00000001B ;mask to check the LCD attached bit of status byte | ||
| 134 | LOWERCASE EQU 20H ;OR THIS TO UPPER/LOWER CASE TO ASSURE LOWERCASE | ||
| 135 | mono_card EQU 1 ;BIOS INT 10 AH=1B representation of plain mono card | ||
| 136 | MONO_CURSOR_TYPE EQU 0B0CH | ||
| 137 | MONO_ON_IT EQU 1 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF MONO IN EFFECT | ||
| 138 | OPTION_BW4025 EQU 0 ;40 X 25 BW | ||
| 139 | OPTION_CO4025 EQU 1 ;40 X 25 COLOR | ||
| 140 | OPTION_BW8025 EQU 2 ;80 X 25 BW | ||
| 141 | OPTION_CO8025 EQU 3 ;80 X 25 COLOR | ||
| 142 | OPTION_MONO EQU 7 ;monochrome | ||
| 143 | parm_list EQU [BP] ;addressing for array of parsed parameters in form "parm_list_entry" | ||
| 144 | |||
| 145 | COLOR_ON_IT EQU 0 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF COLOR IN EFFECT | ||
| 146 | BITBW40 EQU 10H ;40X25 BW USING COLOR CARD | ||
| 147 | BITBW80 EQU 20H ;80X25 BW USING COLOR CARD | ||
| 148 | BITMONO EQU 30H ;80X25 BW CARD | ||
| 149 | video_info_DI EQU [DI] | ||
| 150 | |||
| 151 | ;º º | ||
| 152 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 153 | |||
| 154 | |||
| 155 | |||
| 156 | |||
| 157 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 158 | ;º º | ||
| 159 | |||
| 160 | PUBLIC ALT_SELECT | ||
| 161 | PUBLIC BW40 | ||
| 162 | PUBLIC BW80 | ||
| 163 | PUBLIC CHECK_BUFF | ||
| 164 | PUBLIC CO40 | ||
| 165 | PUBLIC CO80 | ||
| 166 | PUBLIC COLOR_ON_IT | ||
| 167 | PUBLIC EGA_INFO | ||
| 168 | PUBLIC GET_VIDEO_INFO | ||
| 169 | PUBLIC MONO | ||
| 170 | |||
| 171 | ;º º | ||
| 172 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 173 | |||
| 174 | |||
| 175 | |||
| 176 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 177 | ;º º | ||
| 178 | |||
| 179 | INCLUDE common.stc ;definition of the following struc | ||
| 180 | |||
| 181 | ;parm_list_entry STRUC ;used by parse_parameters and invoke | ||
| 182 | ; | ||
| 183 | ;parm_type DB bogus | ||
| 184 | ;item_tag DB 0FFH | ||
| 185 | ;value1 DW bogus ;used only for filespecs and code page numbers | ||
| 186 | ;value2 DW bogus ;used only for filespecs and code page numbers | ||
| 187 | ;keyword_switch_ptr DW 0 | ||
| 188 | ; | ||
| 189 | ;parm_list_entry ENDS | ||
| 190 | |||
| 191 | |||
| 192 | info_block STRUC ;layout of info returned by INT 10 AH=1B | ||
| 193 | who_cares1 DB 025H DUP ("V") | ||
| 194 | active_display DB "V" | ||
| 195 | alternate_display DB "V" | ||
| 196 | who_cares2 DB 6 DUP ("V") | ||
| 197 | misc_state_info DB "V" | ||
| 198 | who_cares3 DB 12H DUP ("V") | ||
| 199 | info_block ENDS | ||
| 200 | |||
| 201 | |||
| 202 | ;º º | ||
| 203 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 204 | |||
| 205 | |||
| 206 | |||
| 207 | |||
| 208 | ;THE FOLLOWING 'RECORD' STATEMENT DEFINES THE BITS BITS OF THE EQUIPMENT FLAG: | ||
| 209 | ;BIT 15,14 = NUMBER OF PRINTERS ATTACHED | ||
| 210 | ;BIT 13 = NOT USED | ||
| 211 | ;BIT 12 = GAME I/O ATTACHED | ||
| 212 | ;BIT 11-9 = NUMBER OF RS232 CARDS ATTACHED | ||
| 213 | ;BIT 8 = UNUSED | ||
| 214 | ;BIT 7,6 = NUMBER OF DISKETTE DRIVES | ||
| 215 | ;BIT 5,4 = INITIAL VIDEO MODE: | ||
| 216 | ; 00-UNUSED | ||
| 217 | ; 01-40X25 BW USING COLOR CARD | ||
| 218 | ; 10-80X25 BW USING COLOR CARD | ||
| 219 | ; 11-80X25 BW USING BW CARD | ||
| 220 | ;BIT 3,2 = PLANAR RAM SIZE (00=16K, 01=32K, 10=48K, 11=64K) | ||
| 221 | ;BIT 1 = NOT USED | ||
| 222 | ;BIT 0 = IPL FROM DISKETTE | ||
| 223 | FLAG RECORD PR:2,NA1:1,GAME:1,COMN:3,NA2:1,DISKD:2,VIDEO:2,RAM:2,NA3:1,IPL:1 | ||
| 224 | ;DEFINITION OF ABOVE VIDEO BITS: | ||
| 225 | |||
| 226 | |||
| 227 | |||
| 228 | PAGE | ||
| 229 | PRINTF_CODE SEGMENT PUBLIC | ||
| 230 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE | ||
| 231 | |||
| 232 | |||
| 233 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 234 | ;º º | ||
| 235 | |||
| 236 | color_combos label byte ;list of adapter/display combinations supporting color modes | ||
| 237 | DB bw0B | ||
| 238 | DB color6 | ||
| 239 | DB color8 | ||
| 240 | DB colorA | ||
| 241 | DB colorC | ||
| 242 | DB cga | ||
| 243 | DB ega_color | ||
| 244 | color_combos_len EQU $ - color_combos | ||
| 245 | |||
| 246 | CURSOR_TYPE DW 0607H ;HOLDER OF APPROPRIATE CURSOR TYPE | ||
| 247 | information_block info_block <> ;area to hold info returned from INT 10 AH=1B | ||
| 248 | |||
| 249 | mono_combos label byte | ||
| 250 | DB mono_card | ||
| 251 | DB ega_mono | ||
| 252 | DB bw7 | ||
| 253 | mono_combos_len EQU $ - mono_combos | ||
| 254 | |||
| 255 | ;º º | ||
| 256 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 257 | |||
| 258 | |||
| 259 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 260 | ;º º | ||
| 261 | |||
| 262 | EXTRN Function_not_supported:WORD ;'INVALID PARAMETERS' | ||
| 263 | EXTRN NOERROR:BYTE ;INDICATE THAT NO ERROR MESSAGES HAVE BEEN ISSUED YET | ||
| 264 | EXTRN not_supported_ptr:WORD ;pointer to the screen mode that the configuration can't do. | ||
| 265 | EXTRN machine_type:BYTE ;holder of model byte | ||
| 266 | EXTRN parm_lst:BYTE ;the array of the structure parm_list_entry max_pos_parms DUP (<>) | ||
| 267 | EXTRN PRINTF:NEAR ;"C" LIKE FORMATTED SCREEN OUTPUT ROUTINE | ||
| 268 | EXTRN PARM1:BYTE ;PARAMETER HOLDING AREA, SEE "RESCODE" | ||
| 269 | EXTRN P14_model_byte:ABS | ||
| 270 | |||
| 271 | ;º º | ||
| 272 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 273 | |||
| 274 | |||
| 275 | |||
| 276 | ;*********************************************************** | ||
| 277 | ;SET VIDEO TO 40 X 25, BLACK AND WHITE | ||
| 278 | BW40 PROC NEAR | ||
| 279 | |||
| 280 | CALL get_video_info | ||
| 281 | .IF <video_info_DI.active_display EQ all> OR | ||
| 282 | find_number <video_info_DI.active_display>,color_combos | ||
| 283 | .IF Z OR | ||
| 284 | find_number <video_info_DI.alternate_display>,color_combos | ||
| 285 | .IF Z THEN | ||
| 286 | |||
| 287 | MOV DL,BITBW40 ;SET FOR BW 40 X 80 | ||
| 288 | MOV DH,OPTION_BW4025 | ||
| 289 | MOV CURSOR_TYPE,COLOR_CURSOR_TYPE | ||
| 290 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 291 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 292 | CALL setup | ||
| 293 | |||
| 294 | .ELSE | ||
| 295 | |||
| 296 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 297 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 298 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 299 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 300 | DISPLAY Function_not_supported ;'Function not supported - BW40" | ||
| 301 | MOV NOERROR,FALSE | ||
| 302 | |||
| 303 | .ENDIF | ||
| 304 | |||
| 305 | RET ;RETURN TO MAIN ROUTINE | ||
| 306 | BW40 ENDP | ||
| 307 | ;****************************************************** | ||
| 308 | ;SET VIDEO TO 80 X 25, BLACK AND WHITE | ||
| 309 | BW80 PROC NEAR | ||
| 310 | |||
| 311 | CALL get_video_info | ||
| 312 | .IF <video_info_DI.active_display EQ all> OR | ||
| 313 | find_number <video_info_DI.active_display>,color_combos | ||
| 314 | .IF Z OR | ||
| 315 | find_number <video_info_DI.alternate_display>,color_combos | ||
| 316 | .IF Z THEN | ||
| 317 | |||
| 318 | MOV DL,BITBW80 ;80 X 25 BW USING GRAPHICS CARD | ||
| 319 | MOV DH,OPTION_BW8025 | ||
| 320 | MOV CURSOR_TYPE,COLOR_CURSOR_TYPE | ||
| 321 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 322 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 323 | CALL setup | ||
| 324 | |||
| 325 | .ELSE | ||
| 326 | |||
| 327 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 328 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 329 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 330 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 331 | DISPLAY Function_not_supported ;'Function not supported - BW80" | ||
| 332 | MOV NOERROR,FALSE | ||
| 333 | |||
| 334 | .ENDIF | ||
| 335 | |||
| 336 | RET | ||
| 337 | BW80 ENDP | ||
| 338 | ;****************************************************** | ||
| 339 | ;SET VIDEO TO 80 X 25, MONOCHROME | ||
| 340 | MONO PROC NEAR | ||
| 341 | |||
| 342 | CALL get_video_info | ||
| 343 | .IF <video_info_DI.active_display EQ all> OR | ||
| 344 | find_number <video_info_DI.active_display>,mono_combos | ||
| 345 | .IF Z OR | ||
| 346 | find_number <video_info_DI.alternate_display>,mono_combos | ||
| 347 | .IF Z THEN | ||
| 348 | |||
| 349 | MOV DL,BITMONO ;EQUIP FLAG INDICATING 80 X 25 BW USING MONO CARD | ||
| 350 | MOV DH,OPTION_MONO ;MONOCHROME MODE | ||
| 351 | MOV CURSOR_TYPE,MONO_CURSOR_TYPE | ||
| 352 | |||
| 353 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 354 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 355 | CALL SETUP | ||
| 356 | |||
| 357 | .ELSE | ||
| 358 | |||
| 359 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 360 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 361 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 362 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 363 | DISPLAY Function_not_supported ;'Function not supported - MONO" | ||
| 364 | MOV NOERROR,FALSE | ||
| 365 | |||
| 366 | .ENDIF | ||
| 367 | |||
| 368 | RET ;RETURN TO MAIN ROUTINE | ||
| 369 | MONO ENDP | ||
| 370 | ;******************************************************* | ||
| 371 | CO40 PROC NEAR | ||
| 372 | |||
| 373 | CALL get_video_info | ||
| 374 | .IF <video_info_DI.active_display EQ all> OR | ||
| 375 | find_number <video_info_DI.active_display>,color_combos | ||
| 376 | .IF Z OR | ||
| 377 | find_number <video_info_DI.alternate_display>,color_combos | ||
| 378 | .IF Z THEN | ||
| 379 | |||
| 380 | MOV DL,BITBW40 ;40 X 25 USING COLOR CARD | ||
| 381 | MOV DH,OPTION_CO4025 ; REQUEST COLOR | ||
| 382 | MOV CURSOR_TYPE,COLOR_CURSOR_TYPE | ||
| 383 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 384 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 385 | CALL setup | ||
| 386 | |||
| 387 | .ELSE | ||
| 388 | |||
| 389 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 390 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 391 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 392 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 393 | DISPLAY Function_not_supported ;'Function not supported - CO40" | ||
| 394 | MOV NOERROR,FALSE | ||
| 395 | |||
| 396 | .ENDIF | ||
| 397 | |||
| 398 | RET ;RETURN TO MAIN ROUTINE | ||
| 399 | CO40 ENDP | ||
| 400 | ;****************************************************** | ||
| 401 | CO80 PROC NEAR | ||
| 402 | |||
| 403 | CALL get_video_info | ||
| 404 | .IF <video_info_DI.active_display EQ all> OR | ||
| 405 | find_number <video_info_DI.active_display>,color_combos | ||
| 406 | .IF Z OR | ||
| 407 | find_number <video_info_DI.alternate_display>,color_combos | ||
| 408 | .IF Z THEN | ||
| 409 | |||
| 410 | MOV DL,BITBW80 ;80 X 25 USING COLOR CARD | ||
| 411 | MOV DH,OPTION_CO8025 ; REQUEST COLOR | ||
| 412 | MOV CURSOR_TYPE,COLOR_CURSOR_TYPE | ||
| 413 | |||
| 414 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 415 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 416 | CALL setup | ||
| 417 | |||
| 418 | .ELSE | ||
| 419 | |||
| 420 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 421 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 422 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 423 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 424 | DISPLAY Function_not_supported ;'Function not supported - CO80" | ||
| 425 | MOV NOERROR,FALSE | ||
| 426 | |||
| 427 | .ENDIF | ||
| 428 | |||
| 429 | RET ;RETURN TO MAIN ROUTINE | ||
| 430 | CO80 ENDP | ||
| 431 | ;****************************************************** | ||
| 432 | SETUP PROC NEAR | ||
| 433 | ;INPUT: DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 434 | ; DH HAS BYTE OF VIDEO OPTION | ||
| 435 | |||
| 436 | XOR AX,AX ;ZERO A REG | ||
| 437 | MOV ES,AX ;POINT TO SEGMENT AT ZERO | ||
| 438 | MOV AX,ES:EQUIP_FLAG ;GET CURRENT STATUS FLAG BYTE | ||
| 439 | AND AL,0FFH-MASK VIDEO ;CLEAR VIDEO DEFINITION BITS | ||
| 440 | OR AL,DL ;TURN ON REQUESTED VIDEO BITS | ||
| 441 | MOV ES:EQUIP_FLAG,AX ;RESTORE UPDATED FLAG BYTE | ||
| 442 | |||
| 443 | MODE_VIDEO DH ;SET MODE TO DESIRED OPTION | ||
| 444 | |||
| 445 | SET_CURSOR_POS ;TO ROW=0, COL=0 | ||
| 446 | |||
| 447 | SET_CURSOR_TYPE ;TO 6,7 FOR COLOR MODES, B,C FOR MONO | ||
| 448 | |||
| 449 | RET ;RETURN TO CALLER | ||
| 450 | SETUP ENDP | ||
| 451 | ;****************************************************** | ||
| 452 | GET_VIDEO_INFO PROC NEAR | ||
| 453 | |||
| 454 | ;Determine what display adapters are in the machine. | ||
| 455 | |||
| 456 | |||
| 457 | ;Assumption: | ||
| 458 | ; | ||
| 459 | ; | ||
| 460 | |||
| 461 | ;Notes: I assume that if an EGA is present then it is the active display. This | ||
| 462 | ; is not always the case, but the routines that call for that kind of | ||
| 463 | ; information do not care which is active, or already know. | ||
| 464 | |||
| 465 | ;Conventions: 'video_info_DI'([DI]) is used to address the info table returned | ||
| 466 | ; by INT 10 AH=1B as defined by the structure 'info_block' and | ||
| 467 | ; stored in 'information_block'. If the INT 10 AH=1A was | ||
| 468 | ; successfull then the result is stored here. | ||
| 469 | |||
| 470 | |||
| 471 | |||
| 472 | |||
| 473 | |||
| 474 | |||
| 475 | |||
| 476 | |||
| 477 | PUSH ES | ||
| 478 | |||
| 479 | XOR AX,AX ;ZAP previous contents | ||
| 480 | MOV AH,01BH ;functionality/state information | ||
| 481 | PUSH CS | ||
| 482 | POP ES | ||
| 483 | MOV DI,OFFSET information_block ;initialize 'video_info_DI' | ||
| 484 | MOV BX,0 ;parm to allow for future expansion | ||
| 485 | INT 010H | ||
| 486 | .IF <AL EQ 01BH> THEN NEAR ;IF the call is supported THEN | ||
| 487 | ;ES:DI=>info returned from BIOS | ||
| 488 | .IF <video_info_DI.alternate_display EQ 0> THEN NEAR ;only 1 display, so see if it can handle all modes | ||
| 489 | |||
| 490 | TEST video_info_DI.misc_state_info,AMOAMA ;check the 'all modes on all monitors active' bit | ||
| 491 | .IF NZ ;IF all modes are supported THEN | ||
| 492 | MOV video_info_DI.active_display,all ;return the active display type as everything | ||
| 493 | .ENDIF | ||
| 494 | |||
| 495 | .ENDIF | ||
| 496 | |||
| 497 | .ELSE ;display code call not supported, look for EGA | ||
| 498 | ;SINCE the display type call was not supported SEE IF IN AN EGA ADVANCED MODE | ||
| 499 | |||
| 500 | MOV AX,SIGNITURE | ||
| 501 | MOV ES,AX ;PUT SEGMENT OF SIGNITURE OF EGA IN ES | ||
| 502 | .IF <ES:SIGWORD EQ EGA_SIG> AND ;IF maybe an EGA IN THE MACHINE THEN | ||
| 503 | MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER | ||
| 504 | MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE | ||
| 505 | INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH | ||
| 506 | .IF <BL NE 010H> THEN ;EGA support available | ||
| 507 | .IF <BH EQ COLOR_ON_IT> THEN ;IF COLOR HOOKED TO EGA THEN | ||
| 508 | MOV video_info_DI.active_display,ega_color | ||
| 509 | |||
| 510 | MOV AX,0B000H ;GET BASE OF MONO SCREEN BUFFER | ||
| 511 | CALL check_buff ;IF THERE IS MEMORY WHERE THE MONO CARD HAS IT | ||
| 512 | .IF <AH EQ AL> THEN ;IF there is a monchrome card buffer present THEN | ||
| 513 | MOV video_info_DI.alternate_display,mono_card | ||
| 514 | .ENDIF | ||
| 515 | |||
| 516 | .ELSE | ||
| 517 | MOV video_info_DI.active_display,ega_mono | ||
| 518 | |||
| 519 | MOV AX,0B800H ;AX= BASE OF GRAPHICS SCREEN BUFFER | ||
| 520 | CALL CHECK_BUFF ;DATA PUT OUT IN AL, DATA RETURNED IN AH | ||
| 521 | .IF <AH EQ AL> THEN ;IF WHAT I GOT BACK IS SAME AS I PUT OUT, THEN BUFFER IS PRESENT | ||
| 522 | MOV video_info_DI.alternate_display,cga | ||
| 523 | .ENDIF | ||
| 524 | .ENDIF | ||
| 525 | .ELSE ;no display type call, no EGA | ||
| 526 | ;check for convertible | ||
| 527 | .IF <machine_type EQ P14_model_byte> AND | ||
| 528 | MOV AH,get_sys_stat | ||
| 529 | INT 15H ;AL=system status | ||
| 530 | AND AL,LCD_bit ;check bit 0 | ||
| 531 | .IF <AL EQ LCD_attached> THEN | ||
| 532 | MOV video_info_DI.active_display,all ;LCD supports mono and color | ||
| 533 | .ELSE ;no analog displays, no EGA, no LCD | ||
| 534 | |||
| 535 | MOV AX,0B000H ;GET BASE OF MONO SCREEN BUFFER | ||
| 536 | CALL check_buff ;IF THERE IS MEMORY WHERE THE MONO CARD HAS IT | ||
| 537 | .IF <AH EQ AL> THEN ;IF there is a monchrome card buffer present THEN | ||
| 538 | MOV video_info_DI.active_display,mono_card | ||
| 539 | .ENDIF | ||
| 540 | |||
| 541 | MOV AX,0B800H ;AX= BASE OF GRAPHICS SCREEN BUFFER | ||
| 542 | CALL CHECK_BUFF ;DATA PUT OUT IN AL, DATA RETURNED IN AH | ||
| 543 | .IF <AH EQ AL> THEN ;IF WHAT I GOT BACK IS SAME AS I PUT OUT, THEN BUFFER IS PRESENT | ||
| 544 | MOV video_info_DI.alternate_display,cga | ||
| 545 | .ENDIF | ||
| 546 | |||
| 547 | .ENDIF | ||
| 548 | |||
| 549 | .ENDIF | ||
| 550 | |||
| 551 | .ENDIF | ||
| 552 | |||
| 553 | POP ES | ||
| 554 | |||
| 555 | RET ;RETURN TO CALLER | ||
| 556 | |||
| 557 | |||
| 558 | GET_VIDEO_INFO ENDP | ||
| 559 | ;****************************************************** | ||
| 560 | ;VMONO PROC NEAR | ||
| 561 | ;;VERIFY THAT A MONOCHROME CARD EXISTS OR LCD IS ATTACHED | ||
| 562 | ;;Input: - AX=base of monochrome screen buffer | ||
| 563 | ;;Output: - AH=AL if have monochrome card or LCD attached | ||
| 564 | ;; AH<>AL if don't have mono card and LCD is not attached | ||
| 565 | ; | ||
| 566 | ;;One way to have a valid MONO setting on a P1X is to have the LCD attached. Another is | ||
| 567 | ;;to have the LCD detached and have a MONO card attached. | ||
| 568 | ;;The logic is as follows: | ||
| 569 | ;; | ||
| 570 | ;;BEGIN | ||
| 571 | ;; ok_to_put_in_MONO_mode:=false | ||
| 572 | ;; IF on a P1X AND LCD is attached THEN | ||
| 573 | ;; ok_to_put_in_MONO_mode:=true | ||
| 574 | ;; ELSE | ||
| 575 | ;; verify_the_buffer_exists | ||
| 576 | ;; ENDIF | ||
| 577 | ;;END | ||
| 578 | ; | ||
| 579 | ; PUSH AX | ||
| 580 | ; CMP machine_type,P14_model_byte | ||
| 581 | ; $IF E,AND | ||
| 582 | ; MOV AH,get_sys_stat | ||
| 583 | ; INT 15H ;AL=system status | ||
| 584 | ; AND AL,LCD_bit ;check bit 0 | ||
| 585 | ; CMP AL,LCD_attached | ||
| 586 | ; $IF E ;IF on a P1X AND LCD is attached THEN | ||
| 587 | ; POP AX ; clean the stack | ||
| 588 | ; MOV AX,0000H ; AH=ALðOK to put in MONO mode | ||
| 589 | ; $ELSE ;ELSE | ||
| 590 | ; POP AX ; AX=mono buffer base | ||
| 591 | ; CALL check_buff ; see if the MONO card exists | ||
| 592 | ; $ENDIF ;ENDIF | ||
| 593 | ;RET ;RETURN TO MAIN ROUTINE | ||
| 594 | ;VMONO ENDP | ||
| 595 | ;****************************************************** | ||
| 596 | CHECK_BUFF PROC NEAR | ||
| 597 | ;SEE IF MEMORY EXISTS AT THE SEGMENT PASSED IN AX | ||
| 598 | |||
| 599 | PUSH DS ;SAVE DATA SEGMENT REGISTER | ||
| 600 | ; MOVE SEG ID OF VIDEO BUFFER | ||
| 601 | MOV DS,AX ; TO THE DATA SEGMENT REG | ||
| 602 | MOV CH,DS:0 ;GET A BYTE FROM THAT BUFFER | ||
| 603 | MOV AL,55H ;GET A SAMPLE DATA BYTE | ||
| 604 | MOV DS:0,AL ; TO THE SCREEN BUFFER, IF THERE | ||
| 605 | PUSH BX ;TERMINATE THE BUS SO WE DON'T GET THE SAME THING | ||
| 606 | POP BX ;BACK BECAUSE IT WAS STILL ON THE BUS | ||
| 607 | MOV AH,DS:0 ;FETCH IT BACK | ||
| 608 | MOV DS:0,CH ;REPAIR THE DAMAGE IN THE BUFFER | ||
| 609 | POP DS ;RESTORE DATA SEGMENT REGISTER | ||
| 610 | RET | ||
| 611 | CHECK_BUFF ENDP | ||
| 612 | ;******************************************************** | ||
| 613 | PRINTF_CODE ENDS | ||
| 614 | END | ||