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
|
.SALL
PAGE ,132 ;
TITLE SCRNTABL.ASM - SCREEN SHIFT TABLE CONTROL FOR MODE COMMAND
;��������������������������������� M A C R O S ����������������������������������������ͻ
;� �
SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG
PUSH AX
MOV AX,VALUE
MOV REG,AX
POP AX
ENDM
;� �
;��������������������������������� M A C R O S ����������������������������������������ͼ
;�������������������������������� E Q U A T E S ���������������������������������������ͻ
;� �
ROM_BIOS_SEG EQU 0F000H ;USED TO ADDRESS INIT TABLE IN ROM
VIDEO_VECTOR EQU 74H ;OFFSET INTO VECTOR TABLE (SEG=0)
;TO DOUBLE WORD POINTER TO VIDEO PARMS
VIDEO_PARMS_WORD_LEN EQU 32 ;NO. WORDS IN VIDEO PARM AREA
;� �
;�������������������������������� E Q U A T E S ���������������������������������������ͼ
PRINTF_CODE SEGMENT PUBLIC
ASSUME DS:NOTHING, CS:PRINTF_CODE
;�������������������������������� E X T R N S �����������������������������������������ͻ
;� �
EXTRN MODELOAD:NEAR
EXTRN RESSEG:DWORD ;ADD OF POINTER TO RESIDENT CODE
EXTRN NEW_SCRNTABL:ABS ;OFFSET OF INIT TABLE WITHIN THE RESIDENT CODE
EXTRN NEW_VIDEO_PARMS_OFFSET:WORD
EXTRN NEW_VIDEO_PARMS_SEGMENT:WORD
;� �
;�������������������������������� E X T R N S �����������������������������������������ͼ
;�������������������������������� P U B L I C S ���������������������������������������ͻ
;� �
;� �
;�������������������������������� P U B L I C S ���������������������������������������ͼ
ROM_BIOS SEGMENT AT 0F000H
ORG 0FFFEH
MACHINE_TYPE LABEL BYTE ;MACHINE TYPE BURNED IN ROM
ROM_BIOS ENDS
PAGE
;*********************************************************************************************
SCRNTAB PROC NEAR
PUBLIC SCRNTAB
; GO TO THE 64 BYTES POINTED TO BY THE VECTOR AT 0:74H AND MOVE A COPY
; OF THESE BYTES TO THE MODE COMMAND RESIDENT AREA LEAVING DS POINTING TO
; THE SEGMENT OF THE TABLE, AND BX CONTAINING THE OFFSET OF THE TABLE.
; BIGTOP BIOS OVERWRITES AREA AT 40:90, AS DO OTHER APPS SO MUST LOAD THE
; TABLE INTO MODE'S RESIDENT CODE.
PUSH ES ;SAVE ADDR OF PROGRAM HEADER PREFIX AREA
MOV AX,0 ;ADDR OF VECTOR TABLE
MOV DS,AX ;SET DATA SEGMENT TO 0 MEMORY
MOV BX,DS:VIDEO_VECTOR+2 ;SEGMENT OF VIDEO PARMS
CMP BX,ROM_BIOS_SEG
;$IF E ;IF haven't moved the table THEN
JNE $$IF1
;load the resident code
PUSH DS
SET DS,CS ;MODELOAD DEPENDS ON DS BEING SEG OF TO BE RES CODE
CALL MODELOAD ;LOAD RESIDENT CODE OVERLAYING PSP
POP DS ;RESTORE TO SEGMENT 0
;Save address of resident code
SET CS:NEW_VIDEO_PARMS_SEGMENT,< WORD PTR DS:RESSEG+2 >
MOV AX,WORD PTR DS:RESSEG ;AX=offset of MODETO within resident code
ADD AX,NEW_SCRNTABL ;AX=OFFSET OF VIDEO PARMS FROM RES CODE SEG
MOV WORD PTR CS:NEW_VIDEO_PARMS_OFFSET,AX ;SEE "RESCODE"
MOV DI,AX ;DI=NEW_VIDEO_PARMS_OFFSET, SET UP ES:DI FOR MOVSW INSTRUCTION
MOV AX,CS:NEW_VIDEO_PARMS_SEGMENT
MOV ES,AX ;ES=RESIDENT CODE SEGMENT
MOV SI,DS:VIDEO_VECTOR ;GET SEGMENT OF VIDEO PARMS
MOV DS:VIDEO_VECTOR,DI ;CHANGE VIDEO OFFSET
MOV DS:VIDEO_VECTOR+2,ES ;CHANGE VIDEO SEGMENT
MOV DS,BX ;CHANGE DS TO ROM SEGMENT
MOV CX,VIDEO_PARMS_WORD_LEN ;COUNT TO MOVE 32 WORDS
CLD ;INCREMENT SI AND DI WHILE MOVING THE TABLE
REP MOVSW ;MOVE 64 BYTES VIDEO PARMS TO RES AREA
;$ENDIF ;I HAVE MOVED IT YET
$$IF1:
SET DS,0
LDS BX,DS:RESSEG ;DS:BX POINTS TO RESIDENT CODE
ADD BX,NEW_SCRNTABL ;DS:BX POINTS TO NEW VIDEO TABLE
POP ES ;RESTORE ADDR OF PROGRAM HEADER PREFIX
RET ;RETURN TO MODESCRN PROC
SCRNTAB ENDP
PRINTF_CODE ENDS
END
|