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