summaryrefslogtreecommitdiff
path: root/v4.0/src/BIOS/STKINIT.INC
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/BIOS/STKINIT.INC')
-rw-r--r--v4.0/src/BIOS/STKINIT.INC271
1 files changed, 271 insertions, 0 deletions
diff --git a/v4.0/src/BIOS/STKINIT.INC b/v4.0/src/BIOS/STKINIT.INC
new file mode 100644
index 0000000..8298fb8
--- /dev/null
+++ b/v4.0/src/BIOS/STKINIT.INC
@@ -0,0 +1,271 @@
1;
2; To follow the standard interrupt sharing scheme, MSSTACK.ASM ;3.30
3; has been modified. This initialization routine also has to ;3.30
4; be modified because for the interrupt level 7 and 15, FirstFlag ;3.30
5; should be set to signal that this interrupt handler is the ;3.30
6; first handler hooked to this interrupt vector. ;3.30
7; We determine this by looking at the instruction pointed by ;3.30
8; this vector. If it is IRET, then this handler should be the ;3.30
9; first one. In our case, only the interrupt vector 77h is the ;3.30
10; interrupt level 15. (We don't hook interrupt level 7.) ;3.30
11; 9/10/1986 ;3.30
12; The followings are mainly due to M.R.T; PTM fix of P886 12/3/86;3.30
13; Some design changes are needed to the above interrupt sharing ;3.30
14; method. The above sharing scheme assumes that 1). Interrupt ;3.30
15; sharing is NEVER done on levels that have BIOS support. 2). "Phantom" ;3.30
16; interrupts would only be generated on levels 7 and 15. ;3.30
17; These assumptions are not true any more. We have to use the FirstFlag ;3.30
18; for EVERY level of interrupt. We will set the firstFlag on the following;3.30
19; conditions: ;3.30
20; a. if the CS portion of the vector is 0000, then "first" ;3.30
21; b. else if CS:IP points to valid shared header, then NOT "first" ;3.30
22; c. else if CS:IP points to an IRET, then "first" ;3.30
23; d. else if CS:IP points to DUMMY, then "first" ;3.30
24; where DUMMY is - the CS portion must be F000, and the IP portion must ;3.30
25; be equal to the value at F000:FF01. This location is the initial value ;3.30
26; from VECTOR_TABLE for interrupt 7, one of the preserved addresses in all;3.30
27; the BIOSes for all of the machines. ;3.30
28; ;3.30
29; System design group requests BIOS to handle the phantom interrupts. ;3.30
30; ;3.30
31; The "Phantom" interrupt is an illegal interrupt such as an interrupt ;3.30
32; produced by the bogus adapter card even without interrupt request is ;3.30
33; set. More specifically, 1). The 8259 has a feature when running in ;3.30
34; edge triggered mode to latch a pulse and present the interrupt when ;3.30
35; the processor indicates interrupt acknowledge (INTA). The interrupt ;3.30
36; pulse was exist at the time of INTA to get a "phantom" interrupt. ;3.30
37; 2). or, this is caused by adapter cards placing a glitch on the ;3.30
38; interrupt line. ;3.30
39; ;3.30
40; To handle those "phantom" interrupts, the main stack code will check ;3.30
41; the own FirstFlag, and if it is not "first" (which means the forward ;3.30
42; pointer points to the legal shared interrupt handler), then pass the ;3.30
43; control. If it is the first, then the following action should be ;3.30
44; taken. We don't have to implement skack logic in this case. ;3.30
45; ;3.30
46; To implement this logic, we rather choose a simple method. ;3.30
47; If ont of the above "FirstFlag" conditions is met, we are not ;3.30
48; going to hook this interrupt vector. The reason is if the original ;3.30
49; vector points to "IRET" and do nothing, we don't need ;3.30
50; to implement the stack logic for it. This will simplify implementation;3.30
51; while maintaining compatibility with the old version of DOS. ;3.30
52; This implies that in the main stack code, there might be a stack code ;3.30
53; that will never be used, a dead code. ;3.30
54; ;3.30
55; 12/3/86 ;3.30
56 ;3.30
57;In - CS, DS -> sysinitseg, ES -> relocated stack code & data. ;3.30
58 ;3.30
59 PAGE ;3.30
60 assume ds:sysinitseg ; sunilp SB340
61StackInit proc near ;3.30
62 ;3.30
63 PUSH AX ;SAVE ALL ;3.30
64 PUSH DS ;3.30
65 PUSH ES ;3.30
66 PUSH BX ;3.30
67 PUSH CX ;3.30
68 PUSH DX ;3.30
69 PUSH DI ;3.30
70 PUSH SI ;3.30
71 PUSH BP ;3.30
72 ;3.30
73;Currently ES -> stack code area ;3.30
74 MOV AX, cs:[STACK_COUNT] ;defined in CS ;3.30
75 MOV es:[STACKCOUNT], AX ;defined in STACK CODE AREA ;3.30
76 MOV AX, [STACK_SIZE] ;in CS ;3.30
77 MOV es:[STACKSIZE], AX ; ;3.30
78 MOV AX, WORD PTR cs:[STACK_ADDR] ; OFFSET ;3.30
79 MOV WORD PTR es:[STACKS], AX ;3.30
80 MOV AX, WORD PTR cs:[STACK_ADDR+WORD] ; SEGMENT ;3.30
81 MOV WORD PTR es:[STACKS+WORD], AX ;3.30
82 ;3.30
83; INITIALIZE THE DATA FIELDS WITH THE PARAMETERS ;3.30
84 ;3.30
85; "FIRSTENTRY" WILL ALWAYS BE AT STACKS ;3.30
86 ;3.30
87 MOV BP, word ptr es:STACKS ; GET OFFSET OF STACK ;3.30
88 MOV es:FIRSTENTRY,BP ;3.30
89 ;3.30
90; THE STACKS WILL ALWAYS IMMEDIATELY FOLLOW THE TABLE ENTRIES ;3.30
91 ;3.30
92 MOV AX,ENTRYSIZE ;3.30
93 MOV CX,es:STACKCOUNT ;3.30
94 MUL CX ;3.30
95 ADD AX,BP ;3.30
96 MOV es:STACKAT,AX ;3.30
97 MOV BX,AX ;3.30
98 SUB BX,2 ;3.30
99 ;3.30
100; ZERO THE ENTIRE STACK AREA TO START WITH ;3.30
101 ;3.30
102 MOV DI,es:STACKAT ;3.30
103 MOV AX,es:STACKSIZE ;3.30
104 MUL CX ;3.30
105 MOV CX,AX ;3.30
106 xor ax,ax ;3.30
107 push es ;3.30
108 pop ds ;ds = Relocated stack code seg.;3.30
109 assume ds:nothing ;3.30
110;Now, DS -> stack code area ;3.30
111 MOV ES, word ptr ds:[STACKS+2] ; GET SEGMENT OF STACK AREA.;3.30
112 CLD ;3.30
113 REP STOSB ;3.30
114 ;3.30
115 MOV CX, ds:STACKCOUNT ;3.30
116 ;3.30
117; LOOP FOR "COUNT" TIMES, BUILDING A TABLE ENTRY ;3.30
118; cs = sysinitseg, ds = Relocated stack code seg , es = segment of stack space;3.30
119; CX = NUMBER OF ENTRIES ;3.30
120; ES:BP => BASE OF STACKS - 2 ;3.30
121; ES:BX => FIRST TABLE ENTRY ;3.30
122 ;3.30
123BUILDLOOP: ;3.30
124 MOV ALLOCBYTE,FREE ;3.30
125 MOV INTLEVEL,AL ;AX = 0 ;3.30
126 MOV SAVEDSP,AX ;3.30
127 MOV SAVEDSS,AX ;3.30
128 ADD BX,ds:STACKSIZE ;3.30
129 MOV NEWSP,BX ;3.30
130 MOV ES:[BX],BP ;3.30
131 ADD BP,ENTRYSIZE ;3.30
132 ;3.30
133 LOOP BUILDLOOP ;3.30
134 ;3.30
135 SUB BP,ENTRYSIZE ;3.30
136 MOV ds:LASTENTRY,BP ;3.30
137 MOV ds:NEXTENTRY,BP ;3.30
138 ;3.30
139 push ds ;3.30
140 mov ax, 0f000h ;loook at the model byte ;3.30
141 mov ds, ax ;3.30
142 cmp ds:byte ptr [0fffeh], mdl_convert ;convertible? ;3.30
143 pop ds ;3.30
144 jne Skip_disableNMIS ;3.30
145 ;3.30
146 MOV AL,07H ; DISABLE Convertible NMIS ;3.30
147 OUT 72H,AL ;3.30
148 ;3.30
149Skip_disableNMIS: ;3.30
150 XOR AX,AX ;3.30
151 MOV es,AX ;es - SEGID OF VECTOR TABLE AT 0;3.30
152 ASSUME es:NOTHING ;ds - Relocated Stack code segment;3.30
153 ;3.30
154 CLI ;3.30
155 ;3.30
156 IRP AA,<02,08,09,70> ;3.30
157 ;3.30
158 MOV SI,AA&H*4 ;PASS WHERE VECTOR IS TO BE ADJUSTED ;3.30
159 mov di, offset Int19OLD&AA ;we have to set OLD&AA for Int19 handler too.;3.30
160 MOV BX,OFFSET OLD&AA ;PASS WHERE TO SAVE ORIGINAL OWNER POINTER;3.30
161 MOV DX,OFFSET INT&AA ;PASS WHERE NEW HANDLER IS ;3.30
162 CALL NEW_INIT_LOOP ;ADJUST THE VECTOR TO NEW HANDLER, ;3.30
163 ; SAVING POINTER TO ORIGINAL OWNER ;3.30
164 ENDM ;3.30
165 ;3.30
166 IRP AA,<0A,0B,0C,0D,0E,72,73,74,76,77> ;shared interrupts ;3.30
167 ;3.30
168 MOV SI,AA&H*4 ;PASS WHERE VECTOR IS TO BE ADJUSTED ;3.30
169 push ds ;save relocated stack code segment ;3.30
170 lds bx, es:[si] ;ds:bx -> original interrupt handler ;3.30
171 push ds ;3.30
172 pop dx ;dx = segment value ;3.30
173
174 cmp dx,0
175 jz int&AA&_first
176
177 cmp byte ptr ds:[bx],0cfh ;Does vector point to an IRET?
178 jz int&AA&_first
179
180 cmp word ptr ds:[bx.6],424Bh ;Magic offset (see INT&AA, msstack.inc)
181 jz int&AA&_Not_first
182
183 cmp dx,0f000h ;ROM BIOS segment
184 jnz int&AA&_Not_first
185
186 push es
187 push dx
188 mov dx,0f000h
189 mov es,dx
190 cmp bx,word ptr es:0ff01h
191 pop dx
192 pop es
193 jz int&AA&_first
194
195int&AA&_Not_first: ;Not the first. We are going to hook vector.;3.30
196 pop ds ;3.30
197 mov di, offset Int19OLD&AA ;we have to set OLD&AA for Int19 handler too.;3.30
198 mov BX, OFFSET OLD&AA ;PASS WHERE TO SAVE ORIGINAL OWNER POINTER;3.30
199 MOV DX, OFFSET INT&AA ;PASS WHERE NEW HANDLER IS ;3.30
200 CALL NEW_INIT_LOOP ;ADJUST THE VECTOR TO NEW HANDLER, SAVING;3.30
201 ;POINTER TO ORIGINAL OWNER. ;3.30
202 jmp short int&AA&_end ;3.30
203int&AA&_first: ;the first. Don't have to hook stack code.;3.30
204 pop ds ;3.30
205int&AA&_end: ;3.30
206 ;3.30
207 ENDM ;3.30
208 ;3.30
209 push ds ;3.30
210 mov ax, 0f000h ;loook at the model byte ;3.30
211 mov ds, ax ;3.30
212 cmp ds:byte ptr [0fffeh], mdl_convert ;PC convertible? ;3.30
213 pop ds ;3.30
214 jne Skip_EnableNMIS ;3.30
215 ;3.30
216 MOV AL,27H ; ENABLE Convertible NMIS ;3.30
217 OUT 72H,AL ;3.30
218 ;3.30
219Skip_EnableNMIS: ;3.30
220 STI ;3.30
221 MOV AX,code ;3.30
222 MOV DS,AX ;3.30
223 ASSUME DS:CODE ;3.30
224 ;3.30
225; MOV SI,OFFSET STKMSG1 ;3.30
226; CALL WRMSG ;3.30
227 ;3.30
228 mov [INT19SEM],1 ; INDICATE THAT INT 19 ;3.30
229 ; INITIALIZATION IS COMPLETE ;3.30
230 ;3.30
231 POP BP ; RESTORE ALL ;3.30
232 POP SI ;3.30
233 POP DI ;3.30
234 POP DX ;3.30
235 POP CX ;3.30
236 POP BX ;3.30
237 ;3.30
238 POP ES ;3.30
239 POP DS ;3.30
240 assume ds:sysinitseg ;3.30
241 POP AX ;3.30
242 RET ;3.30
243STACKINIT ENDP ;3.30
244; ;3.30
245 ;3.30
246NEW_INIT_LOOP PROC NEAR ;3.30
247;INPUT: SI=OFSET INTO VECTOR TABLE OF THE PARTICULAR INT VECTOR BEING ADJUSTED ;3.30
248; BX=ds:OFFSET OF OLDxx, WHERE WILL BE SAVED THE POINTER TO ORIGINAL OWNER;3.30
249; DX=ds:OFFSET OF INTxx, THE NEW INTERRUPT HANDLER ;3.30
250; di=offset value of Int19OLD&AA variable in BIOS. ;3.30
251; es=ZERO, SEGID OF VECTOR TABLE ;3.30
252; ds=Relocated Stack code segment ;3.30
253 ;3.30
254 MOV AX,es:[SI+0] ;REMEMBER OFFSET IN VECTOR ;3.30
255 MOV WORD PTR ds:[BX],AX ; TO ORIGINAL OWNER in DS ;3.30
256 MOV AX,es:[SI+2] ;REMEMBER SEGID IN VECTOR ;3.30
257 MOV WORD PTR ds:[BX]+2,AX ; TO ORIGINAL OWNER in DS ;3.30
258 push ds ;3.30
259 mov ax, code ;3.30
260 mov ds, ax ;Set Int19OLDxx value in BIOS for ;3.30
261 mov ax,es:[si+0] ;Int 19 handler ;3.30
262 mov word ptr ds:[di],ax ;3.30
263 mov ax,es:[si+2] ;3.30
264 mov word ptr ds:[di]+2,ax ;3.30
265 pop ds ;3.30
266 ;3.30
267 MOV WORD PTR es:[SI+0],DX ;SET VECTOR TO POINT TO NEW INT HANDLER ;3.30
268 MOV es:[SI+2],ds ;3.30
269 RET ;3.30
270NEW_INIT_LOOP ENDP ;3.30
271 ;3.30