rev |
line source |
pascal@19515
|
1 ;***************************************************************
|
pascal@19515
|
2 ;****** This file is distributed under GPL
|
pascal@19515
|
3 ;***************************************************************
|
pascal@19515
|
4 ideal
|
pascal@24034
|
5 %PAGESIZE 255
|
pascal@19515
|
6 %crefref
|
pascal@19515
|
7 %noincl
|
pascal@19515
|
8 %nomacs
|
pascal@24019
|
9
|
pascal@24019
|
10 include "common.inc"
|
pascal@24019
|
11
|
pascal@19636
|
12 ifdef NO386
|
pascal@19636
|
13 p8086
|
pascal@19636
|
14 else
|
pascal@19515
|
15 p386
|
pascal@19636
|
16 endif
|
pascal@19515
|
17
|
pascal@23983
|
18 group DGROUP _TEXT
|
pascal@19515
|
19 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
20
|
pascal@19515
|
21 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
22
|
pascal@19905
|
23 ;***************************************************************
|
pascal@20473
|
24 ;void dos_shutdown()
|
pascal@20473
|
25 ;***************************************************************
|
pascal@20473
|
26
|
pascal@20473
|
27 macro dos_shutdown
|
pascal@24067
|
28 xor bx,bx
|
pascal@24013
|
29 ifdef QUICK_BOOT
|
pascal@24564
|
30 CMDNUMOFS = 20
|
pascal@24564
|
31 ifdef MINRAM
|
pascal@24564
|
32 CMDNUMOFS = CMDNUMOFS+4
|
pascal@24564
|
33 endif
|
pascal@24564
|
34 ifdef CPUTYPE
|
pascal@24564
|
35 CMDNUMOFS = CMDNUMOFS+4
|
pascal@24564
|
36 endif
|
pascal@24013
|
37 extrn _cmdnum:dword
|
pascal@24564
|
38 quickboot = (byte _cmdnum+CMDNUMOFS)
|
pascal@24067
|
39 cmp bl,[quickboot]
|
pascal@24067
|
40 mov ds,bx
|
pascal@24013
|
41 jne skip_shutdown
|
pascal@24013
|
42 else
|
pascal@24067
|
43 mov ds,bx
|
pascal@24013
|
44 endif
|
pascal@20473
|
45 ifndef NO386
|
pascal@24067
|
46 push [dword bx+4] ; save step
|
pascal@24067
|
47 mov [word bx+4],offset step19
|
pascal@20473
|
48 else
|
pascal@20473
|
49 mov ax,offset step19
|
pascal@24067
|
50 xchg ax,[word bx+4]
|
pascal@24067
|
51 push [word bx+6]
|
pascal@20473
|
52 push ax ; save step
|
pascal@20473
|
53 endif
|
pascal@20473
|
54 mov [word cs:sssp],sp
|
pascal@24067
|
55 ;cmp [byte bx+7],0F0h
|
pascal@20473
|
56 ;jnc notdos
|
pascal@24067
|
57 mov [bx+6],cs
|
pascal@20473
|
58 pushf
|
pascal@20473
|
59 pushf
|
pascal@20473
|
60 pop ax
|
pascal@20473
|
61 inc ah ; set TF
|
pascal@20473
|
62 push ax
|
pascal@20473
|
63 popf
|
pascal@24067
|
64 call [dword bx+4*19h]
|
pascal@20473
|
65 notdos:
|
pascal@20473
|
66 ifndef NO386
|
pascal@20473
|
67 lss sp,[dword cs:sssp]
|
pascal@20473
|
68 else
|
pascal@20473
|
69 lds ax,[dword cs:sssp]
|
pascal@20473
|
70 push ds
|
pascal@20473
|
71 pop ss
|
pascal@20473
|
72 xchg ax,sp
|
pascal@20473
|
73 endif
|
pascal@21342
|
74 xor si,si
|
pascal@21342
|
75 mov ds,si
|
pascal@21342
|
76 pop [dword si+4] ; restore step
|
pascal@24013
|
77 skip_shutdown:
|
pascal@20473
|
78 endm
|
pascal@20473
|
79 macro step19code
|
pascal@20473
|
80 step19:
|
pascal@21342
|
81 push si
|
pascal@20473
|
82 push ds
|
pascal@21342
|
83 mov si,sp
|
pascal@21342
|
84 lds si,[dword ss:si+4] ; read cs:ip
|
pascal@21342
|
85 cmp [word si],19CDh ; int 19h ?
|
pascal@20473
|
86 pop ds
|
pascal@21342
|
87 pop si
|
pascal@20473
|
88 je notdos
|
pascal@20473
|
89 iret
|
pascal@20473
|
90 endm
|
pascal@20473
|
91
|
pascal@20473
|
92
|
pascal@20473
|
93 ;***************************************************************
|
pascal@19905
|
94 ;void boot_kernel();
|
pascal@19905
|
95 ;****** Never returns
|
pascal@19905
|
96 ;***************************************************************
|
pascal@19905
|
97 proc _boot_kernel near
|
pascal@19905
|
98
|
pascal@21757
|
99 ifdef NO386
|
pascal@20142
|
100 p8086
|
pascal@19903
|
101 else
|
pascal@20142
|
102 p386
|
pascal@19903
|
103 endif
|
pascal@20473
|
104 ;cli ; we start doing destructive things to DOS
|
pascal@21757
|
105 extrn sssp:word
|
pascal@22288
|
106 mov ax,[sssp+2]
|
pascal@22288
|
107 mov es,ax
|
pascal@23996
|
108 extrn _cmdstr:word
|
pascal@23996
|
109 _cmdline = _cmdstr+0
|
pascal@19571
|
110 mov si,[_cmdline]
|
pascal@19571
|
111 mov di,8000h
|
pascal@24095
|
112 mov cx,1000h ; 4k for cmdline + 4k up to sp
|
pascal@19571
|
113 rep
|
pascal@24095
|
114 movsw
|
pascal@22288
|
115 push es
|
pascal@22288
|
116 pop ss
|
pascal@22288
|
117 mov sp,di
|
pascal@22019
|
118
|
pascal@24019
|
119 ifdef LINUX001
|
pascal@22288
|
120 mov dx,2000h
|
pascal@22288
|
121 global _csip_hilo:word
|
pascal@22288
|
122 org $-2
|
pascal@22288
|
123 _csip_hilo dw ?
|
pascal@22288
|
124 xchg al,dh ; 9020 / 9000
|
pascal@24019
|
125 else
|
pascal@24019
|
126 mov al,20h ; 9020:0
|
pascal@24019
|
127 xor dx,dx
|
pascal@24019
|
128 endif
|
pascal@22288
|
129 push ax
|
pascal@22288
|
130 push dx ; 0000 / 0042
|
pascal@22288
|
131
|
pascal@22288
|
132 mov cl,1 ; load high ?
|
pascal@22179
|
133 org $-1
|
pascal@22288
|
134 global _pm_low:byte
|
pascal@22288
|
135 _pm_low db ?
|
pascal@22019
|
136 push cx
|
pascal@24019
|
137 ifdef IPXE
|
pascal@22019
|
138 mov ax,[word ss:024Ch]
|
pascal@22019
|
139 xor ax,2b30h ; ipxe ?
|
pascal@22019
|
140 loopne @@notipxe
|
pascal@24019
|
141 else
|
pascal@24019
|
142 loop @@truebzimage
|
pascal@24019
|
143 endif
|
pascal@22019
|
144
|
pascal@22019
|
145 ; finish loading
|
pascal@22019
|
146 extrn @last_ditch$qv:near
|
pascal@22008
|
147 push cs
|
pascal@22008
|
148 call @last_ditch$qv
|
pascal@24019
|
149 ifdef SHUTDOWN
|
pascal@22152
|
150 dos_shutdown ; clear si; ds=0; kill VCPI
|
pascal@22152
|
151 push cs
|
pascal@22152
|
152 pop ds
|
pascal@24019
|
153 else
|
pascal@24019
|
154 xor si,si
|
pascal@24019
|
155 endif
|
pascal@22019
|
156
|
pascal@24019
|
157 @@truebzimage:
|
pascal@22019
|
158 @@notipxe:
|
pascal@22019
|
159 pop cx
|
pascal@22019
|
160 loop @@isbzimage
|
pascal@22019
|
161
|
pascal@20477
|
162 ; prepare memcpy32 size & srcofs param to move zImage pm
|
pascal@21781
|
163 ifndef NO386
|
pascal@21781
|
164 push 8 ; size hi
|
pascal@21781
|
165 else
|
pascal@20477
|
166 mov dx,8
|
pascal@20477
|
167 push dx ; size hi
|
pascal@21781
|
168 endif
|
pascal@22288
|
169 push si ; size lo=up to 512k
|
pascal@23984
|
170
|
pascal@23984
|
171 include "himem.inc"
|
pascal@23984
|
172
|
pascal@23984
|
173 extrn _imgs:image_himem
|
pascal@24034
|
174 ifdef NO386
|
pascal@24034
|
175 les ax,[_imgs.fallback] ; src ofs = pm.fallback
|
pascal@24034
|
176 push es
|
pascal@24034
|
177 push ax
|
pascal@24034
|
178 else
|
pascal@23984
|
179 push [_imgs.fallback] ; src ofs = pm.fallback
|
pascal@24034
|
180 endif
|
pascal@20477
|
181
|
pascal@19538
|
182 ;in al,70h
|
pascal@19538
|
183 ;or al,80h ; disable NMI
|
pascal@19538
|
184 ;out 70h,al
|
pascal@20477
|
185
|
pascal@22288
|
186 push si ; src seg=0
|
pascal@21628
|
187 inc cx
|
pascal@21628
|
188 push cx ; dst ofs hi
|
pascal@24013
|
189 push si ; dst ofs lo : 64k = 0x10000
|
pascal@22288
|
190
|
pascal@22288
|
191 ; self move
|
pascal@22288
|
192 extrn gdt_data
|
pascal@22288
|
193 mov cx,offset gdt_data+8
|
pascal@22288
|
194 ;xor di,di ; A000 -9000 -0800(>movedend)
|
pascal@22288
|
195
|
pascal@22288
|
196 ifdef NO386
|
pascal@22288
|
197 mov ax,ss
|
pascal@24034
|
198 add ax,800h+(4096/16)
|
pascal@22288
|
199 push ax ; topseg()+0x0900
|
pascal@22288
|
200 else
|
pascal@22288
|
201 push 9800h+(4096/16) ; 4096 bytes for cmdline
|
pascal@22288
|
202 endif
|
pascal@22288
|
203 pop es
|
pascal@22288
|
204 push es
|
pascal@22288
|
205
|
pascal@24019
|
206 ifdef ELKS
|
pascal@22288
|
207 call near @@movsb@jmp ; movsb; pop cs ; ds=es=ss
|
pascal@24019
|
208 elseifdef MOVE_SETUP
|
pascal@24019
|
209 call near @@movsb@jmp ; movsb; pop cs ; ds=es=ss
|
pascal@24019
|
210 else
|
pascal@24019
|
211 xor di,di
|
pascal@24019
|
212 rep
|
pascal@24019
|
213 movsb
|
pascal@24034
|
214 call near @@isbzimage ; pop cs ; ds=es=ss
|
pascal@24019
|
215 endif
|
pascal@22288
|
216
|
pascal@24034
|
217 ;mov es,cx
|
pascal@24034
|
218 ;mov [es:15*4+2],cs ; update int15/88h hook
|
pascal@24034
|
219
|
pascal@20528
|
220 extrn memcpy32:near
|
pascal@20528
|
221 call memcpy32
|
pascal@19515
|
222
|
pascal@22176
|
223 ifdef MOVE_SETUP
|
pascal@22288
|
224 mov si,0
|
pascal@22288
|
225 global _rm_offset:word
|
pascal@22288
|
226 org $-2
|
pascal@22288
|
227 _rm_offset dw ?
|
pascal@22176
|
228 ;xor di,di
|
pascal@22288
|
229 ;mov cx,8000h
|
pascal@22176
|
230 ;sub cx,si
|
pascal@22288
|
231 ;rep
|
pascal@22288
|
232 ; movsb
|
pascal@22176
|
233 endif
|
pascal@22176
|
234
|
pascal@24019
|
235 ifdef ELKS
|
pascal@22288
|
236 ifdef MOVE_SETUP
|
pascal@19515
|
237 ifndef NO386
|
pascal@22288
|
238 mov eax,[dword si+1E6h]
|
pascal@22288
|
239 xor eax,'SKLE'
|
pascal@22288
|
240 else
|
pascal@24162
|
241 cmp [word si+1E6h],'LE'
|
pascal@20473
|
242 jne @@notelks
|
pascal@22288
|
243 mov ax,[si+1E8h]
|
pascal@22288
|
244 xor ax,'SK'
|
pascal@22288
|
245 endif
|
pascal@19515
|
246 else
|
pascal@22288
|
247 ifndef NO386
|
pascal@22288
|
248 mov eax,[dword 1E6h]
|
pascal@22288
|
249 xor eax,'SKLE'
|
pascal@22288
|
250 else
|
pascal@22288
|
251 mov ax,[1E6h]
|
pascal@22288
|
252 xor ax,'LE'
|
pascal@19905
|
253 jne @@notelks
|
pascal@22288
|
254 mov ax,[1E8h]
|
pascal@20481
|
255 xor ax,'SK'
|
pascal@22288
|
256 endif
|
pascal@22288
|
257 endif
|
pascal@20473
|
258 jne @@notelks
|
pascal@22288
|
259 mov cx,100h ; DS=ES=SS=0100
|
pascal@22288
|
260 mov ss,cx
|
pascal@22288
|
261 push ss
|
pascal@22288
|
262 pop es
|
pascal@22288
|
263 mov cl,20h ; CS=0120
|
pascal@22288
|
264 push cx
|
pascal@22288
|
265 push ax ; IP=0000
|
pascal@19515
|
266 endif
|
pascal@22179
|
267 ifdef MOVE_SETUP
|
pascal@22288
|
268 @@notelks:
|
pascal@22288
|
269 mov ch,7Eh
|
pascal@22288
|
270 @@movsb@jmp:
|
pascal@22288
|
271 xor di,di
|
pascal@22288
|
272 rep
|
pascal@22288
|
273 movsb
|
pascal@22179
|
274 else
|
pascal@24019
|
275 ifdef ELKS
|
pascal@22288
|
276 xchg ax,si
|
pascal@22288
|
277 mov ch,7Eh ; 0Ah min, 7Eh max
|
pascal@22288
|
278 @@movsb@jmp:
|
pascal@22288
|
279 xor di,di
|
pascal@19515
|
280 rep
|
pascal@22288
|
281 movsb
|
pascal@19905
|
282 @@notelks:
|
pascal@22288
|
283 endif
|
pascal@19515
|
284 endif
|
pascal@19905
|
285 @@isbzimage:
|
pascal@19515
|
286 push ss
|
pascal@19515
|
287 pop ds
|
pascal@20475
|
288 push ss
|
pascal@20475
|
289 pop es
|
pascal@19636
|
290 ifndef NO386
|
pascal@19515
|
291 push ss
|
pascal@19515
|
292 pop fs
|
pascal@19515
|
293 push ss
|
pascal@19515
|
294 pop gs
|
pascal@19636
|
295 endif
|
pascal@19515
|
296 assume nothing
|
pascal@19515
|
297 assume cs:DGROUP
|
pascal@19515
|
298 retf
|
pascal@19515
|
299
|
pascal@24019
|
300 ifdef SHUTDOWN
|
pascal@20473
|
301 step19code
|
pascal@24019
|
302 endif
|
pascal@20477
|
303
|
pascal@20477
|
304 endp _boot_kernel
|
pascal@20477
|
305
|
pascal@19515
|
306 ends _TEXT
|
pascal@19515
|
307
|
pascal@19515
|
308 end
|
pascal@19515
|
309
|
pascal@19515
|
310 ;###### END OF FILE ############################################
|