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