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
|
;********************************************************************************
; File: S_DISPLY.ASM
;
; This module contains a subroutine for setting the mode of the display to
; 80X25 text mode.
;
; If ANSI.SYS is loaded, then the calls to change the mode go through it,
; otherwise standard BIOS calls are performed.
;
; If ANSI.SYS is to be used, then a version dated July 15, 1987 or later must
; be used.
;
;********************************************************************************
.ALPHA ;AN000;
.XLIST ;AN000;
INCLUDE STRUC.INC ;AN000;
.LIST ;AN000;
DATA SEGMENT BYTE PUBLIC 'DATA' ;AN000;
; Buffer for IOCTL calls
BUFFER LABEL BYTE ;AN000;
DB 0 ;AN000; INFO LEVEL
DB 0 ;AN000; RESERVED
DW 14 ;AN000; SIZE
FLAGS DW 0 ;AN000;
D_MODE DB 0 ;AN000; 1 = TEXT, 2 = APA
DB 0 ;AN000; RESERVED
COLORS DW 0 ;AN000;
B_WIDTH DW 0 ;AN000; PELS ==> -1 FOR TEXT
B_LENGTH DW 0 ;AN000; PELS ==> -1 FOR TEXT
COLS DW 0 ;AN000;
ROWS DW 0 ;AN000;
DATA ENDS ;AN000;
CODE_FAR SEGMENT BYTE PUBLIC 'CODE' ;AN000;
ASSUME CS:CODE_FAR, DS:DATA ;AN000;
;********************************************************************************
; SET_DISPLAY_MODE_ROUTINE: Set the display mode to 80X25 text mode.
;
; INPUT:
; None.
;
; OUTPUT:
; If CY = 1, then an error was encountered making a IOCTL call.
; If CY = 0, there were no errors.
;
; Operation: If ANSY.SYS is loaded, then the mode is set by calls to it,
; otherwise BIOS calls are used.
;
;********************************************************************************
PUBLIC SET_DISPLAY_MODE_ROUTINE ;AN000;
SET_DISPLAY_MODE_ROUTINE PROC FAR ;AN000;
;**********************************************************************
; See if ANSI.SYS is loaded
;**********************************************************************
MOV AX, 1A00H ;AC086;SEH changed from 1600h to avoid MICROSOFT collision ;AN000; Fn. for determining ANSI.SYS state
INT 2FH ;AN000; Returns AL = 0FFh if it is loaded
.IF < AL NE 0FFH > ;AN000; Is it loaded?
MOV AH, 15 ;AN000; No! Fn. number for getting the current video state
INT 10H ;AN000; Get the video state
.IF < AL EQ 07H > OR ;AN000; If in monochrome mode,
.IF < AL EQ 0FH> ;AN000; or monochrome graphics mode,
MOV AX, 07H ;AN000; Set monochrome mode
.ELSE ;AN000; Otherwise...
MOV AX, 03H ;AN000; Set mode 3: 80 column, color enabled
.ENDIF ;AN000;
INT 10H ;AN000; Set the mode
.ELSE ;AN000;
MOV AX, 440CH ;AN000; Get the info from ANSI.
MOV BX, 0 ;AN000;
MOV CX, 037FH ;AN000;
MOV DX, OFFSET BUFFER ;AN000;
INT 21H ;AN000;
.IF < C > ;AN000; Was there an error?
JMP ERROR_SETTING ;AN000; Yes! Exit the subroutine.
.ENDIF ;AN000;
MOV D_MODE, 1 ;AN000; Set to text mode
MOV B_WIDTH, -1 ;AN000; -1 for text mode
MOV B_LENGTH, -1 ;AN000; -1 for text mode
MOV COLS, 80 ;AN000; Number of columns
MOV ROWS, 25 ;AN000; Number of rows
.IF < COLORS NE 0 > ;AN000; If colors = 0, monochrome
MOV COLORS, 16 ;AN000; Otherwise set 16 color mode
.ENDIF ;AN000;
MOV AX, 440CH ;AN000; Set the new mode
MOV BX, 0 ;AN000;
MOV CX, 035FH ;AN000;
MOV DX, OFFSET BUFFER ;AN000;
INT 21H ;AN000;
.IF < C > ;AN000; Was there en error?
JMP ERROR_SETTING ;AN000; Yes! Exit the subroutine
.ENDIF ;AN000;
CLC ;AN000; Indicate there were no errors
.ENDIF ;AN000;
JMP EXIT_SET ;AN000;
ERROR_SETTING: ;AN000;
STC ;AN000; Indicate that there were errors
EXIT_SET: ;AN000;
RET ;AN000;
SET_DISPLAY_MODE_ROUTINE ENDP ;AN000;
CODE_FAR ENDS ;AN000;
END ;AN000;
|