5 INCLUDE STRUC.INC ;macro library for 'struc'
8 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;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 - ????".
17 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
19 SIGNITURE
SEGMENT AT 0C000H
21 SIGWORD
DW ?
;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT
27 EQUIP_FLAG EQU THIS
WORD
31 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
41 ;-------------------------------------------------------------------------------
44 find_number
MACRO num
, list
46 ;Purpose: See if num is in the list of numbers.
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.
53 ;Output: zero flag set if the number is found in 'list'
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.
58 ;Side effects: The direction flag is cleared.
65 CLD ;want to increment DI
66 MOV CX,list
&_len
;CX=number of nums in the list
74 ;-------------------------------------------------------------------------------
80 MOV BH,0 ;SELECT SCREEN 0
85 MODE_VIDEO
MACRO OPTION
93 MOV AH,1 ;SET CURSOR TYPE
94 MOV CX,CURSOR_TYPE
;ROW=0,COL=0
100 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
103 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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
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
128 EGA_SIG EQU
0AA55H ;SIGNITURE FOR EGA CARD
129 EMPTY EQU
0 ;THE REMAINING 6 CHARACTERS OF PARM1 SHOULD BE 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"
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]
152 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
157 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
168 PUBLIC GET_VIDEO_INFO
172 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
176 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
179 INCLUDE common.stc ;definition of the following struc
181 ;parm_list_entry STRUC ;used by parse_parameters and invoke
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
189 ;parm_list_entry ENDS
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")
203 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
208 ;THE FOLLOWING 'RECORD' STATEMENT DEFINES THE BITS BITS OF THE EQUIPMENT FLAG:
209 ;BIT 15,14 = NUMBER OF PRINTERS ATTACHED
211 ;BIT 12 = GAME I/O ATTACHED
212 ;BIT 11-9 = NUMBER OF RS232 CARDS ATTACHED
214 ;BIT 7,6 = NUMBER OF DISKETTE DRIVES
215 ;BIT 5,4 = INITIAL VIDEO MODE:
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)
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:
229 PRINTF_CODE
SEGMENT PUBLIC
230 ASSUME
CS:PRINTF_CODE
,DS:PRINTF_CODE
,SS:PRINTF_CODE
233 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
236 color_combos
label byte ;list of adapter/display combinations supporting color modes
244 color_combos_len EQU
$ - color_combos
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
249 mono_combos
label byte
253 mono_combos_len EQU
$ - mono_combos
256 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
259 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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
272 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
276 ;***********************************************************
277 ;SET VIDEO TO 40 X 25, BLACK AND WHITE
281 .IF <video_info_DI
.active_display
EQ all
> OR
282 find_number
<video_info_DI
.active_display
>,color_combos
284 find_number
<video_info_DI
.alternate_display
>,color_combos
287 MOV DL,BITBW40
;SET FOR BW 40 X 80
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
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"
305 RET ;RETURN TO MAIN ROUTINE
307 ;******************************************************
308 ;SET VIDEO TO 80 X 25, BLACK AND WHITE
312 .IF <video_info_DI
.active_display
EQ all
> OR
313 find_number
<video_info_DI
.active_display
>,color_combos
315 find_number
<video_info_DI
.alternate_display
>,color_combos
318 MOV DL,BITBW80
;80 X 25 BW USING GRAPHICS CARD
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
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"
338 ;******************************************************
339 ;SET VIDEO TO 80 X 25, MONOCHROME
343 .IF <video_info_DI
.active_display
EQ all
> OR
344 find_number
<video_info_DI
.active_display
>,mono_combos
346 find_number
<video_info_DI
.alternate_display
>,mono_combos
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
353 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
354 ;DH HAS BYTE OF VIDEO OPTION
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"
368 RET ;RETURN TO MAIN ROUTINE
370 ;*******************************************************
374 .IF <video_info_DI
.active_display
EQ all
> OR
375 find_number
<video_info_DI
.active_display
>,color_combos
377 find_number
<video_info_DI
.alternate_display
>,color_combos
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
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"
398 RET ;RETURN TO MAIN ROUTINE
400 ;******************************************************
404 .IF <video_info_DI
.active_display
EQ all
> OR
405 find_number
<video_info_DI
.active_display
>,color_combos
407 find_number
<video_info_DI
.alternate_display
>,color_combos
410 MOV DL,BITBW80
;80 X 25 USING COLOR CARD
411 MOV DH,OPTION_CO8025
; REQUEST COLOR
412 MOV CURSOR_TYPE
,COLOR_CURSOR_TYPE
414 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
415 ;DH HAS BYTE OF VIDEO OPTION
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"
429 RET ;RETURN TO MAIN ROUTINE
431 ;******************************************************
433 ;INPUT: DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
434 ; DH HAS BYTE OF VIDEO OPTION
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
443 MODE_VIDEO
DH ;SET MODE TO DESIRED OPTION
445 SET_CURSOR_POS
;TO ROW=0, COL=0
447 SET_CURSOR_TYPE
;TO 6,7 FOR COLOR MODES, B,C FOR MONO
449 RET ;RETURN TO CALLER
451 ;******************************************************
452 GET_VIDEO_INFO PROC
NEAR
454 ;Determine what display adapters are in the machine.
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.
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.
479 XOR AX,AX ;ZAP previous contents
480 MOV AH,01BH ;functionality/state information
483 MOV DI,OFFSET information_block
;initialize 'video_info_DI'
484 MOV BX,0 ;parm to allow for future expansion
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
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
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
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
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
517 MOV video_info_DI
.active_display
,ega_mono
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
525 .ELSE ;no display type call, no EGA
526 ;check for convertible
527 .IF <machine_type
EQ P14_model_byte
> AND
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
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
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
555 RET ;RETURN TO CALLER
559 ;******************************************************
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
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:
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
575 ;; verify_the_buffer_exists
580 ; CMP machine_type,P14_model_byte
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
590 ; POP AX ; AX=mono buffer base
591 ; CALL check_buff ; see if the MONO card exists
593 ;RET ;RETURN TO MAIN ROUTINE
595 ;******************************************************
597 ;SEE IF MEMORY EXISTS AT THE SEGMENT PASSED IN AX
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
612 ;********************************************************