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