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@19903
|
14 group DGROUP _TEXT,_DATA,_BSS
|
pascal@19515
|
15 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
16
|
pascal@19903
|
17 segment _DATA byte public use16 'DATA'
|
pascal@19903
|
18
|
pascal@19903
|
19 overflow db "Loaded too close to 9000:0",0
|
pascal@19903
|
20
|
pascal@19903
|
21 ends _DATA
|
pascal@19903
|
22
|
pascal@19515
|
23 segment _BSS byte public use16 'BSS'
|
pascal@19515
|
24
|
pascal@19899
|
25 global _imgs:dword
|
pascal@19515
|
26
|
pascal@19515
|
27 ends _BSS
|
pascal@19515
|
28
|
pascal@19515
|
29
|
pascal@19515
|
30 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
31
|
pascal@19903
|
32 global _boot_kernel:near
|
pascal@19903
|
33 _boot_kernel:
|
pascal@19903
|
34 ; Shrink stack: we won't need much of it now and have no malloc() plans
|
pascal@19903
|
35 extrn _heap_top:word
|
pascal@19903
|
36 mov ax,[_heap_top]
|
pascal@19903
|
37 inc ah
|
pascal@19903
|
38 cmp ax,sp
|
pascal@19903
|
39 ja samesp
|
pascal@19903
|
40 xchg ax,sp
|
pascal@19903
|
41 samesp:
|
pascal@19903
|
42 ifdef NO386
|
pascal@19903
|
43 extrn _topseg:near
|
pascal@19903
|
44 call near _topseg
|
pascal@19903
|
45 mov es,ax
|
pascal@19903
|
46 xchg ax,bx
|
pascal@19903
|
47 mov cl,4
|
pascal@19903
|
48 mov ax,sp
|
pascal@19903
|
49 shr ax,cl
|
pascal@19903
|
50 else
|
pascal@19903
|
51 mov bx,9000h
|
pascal@19903
|
52 mov es,bx
|
pascal@19903
|
53 mov ax,sp
|
pascal@19903
|
54 shr ax,4
|
pascal@19903
|
55 endif
|
pascal@19903
|
56 mov dx,cs
|
pascal@19903
|
57 add ax,dx
|
pascal@19903
|
58 cmp ax,bx
|
pascal@19903
|
59 jb nooverflow
|
pascal@19903
|
60 ; Oops! We can stomp on our toes... better stop now
|
pascal@19903
|
61 mov bx,offset overflow
|
pascal@19903
|
62 extrn die:near
|
pascal@19903
|
63 jmp near die
|
pascal@19903
|
64 nooverflow:
|
pascal@19515
|
65 ;***************************************************************
|
pascal@19571
|
66 ;void set_sregs_jump_seg_ofs(u32 csip);
|
pascal@19515
|
67 ;****** Never returns
|
pascal@19515
|
68 ;***************************************************************
|
pascal@19515
|
69 global _set_sregs_jump_seg_ofs:near
|
pascal@19515
|
70 proc _set_sregs_jump_seg_ofs near
|
pascal@19515
|
71
|
pascal@19515
|
72 extrn dos_shutdown:near
|
pascal@19515
|
73
|
pascal@19636
|
74 cli ; we start doing destructive things to DOS
|
pascal@19571
|
75 push es
|
pascal@19571
|
76 pop ss
|
pascal@19571
|
77 mov sp,0A000h
|
pascal@19900
|
78 extrn _csip:dword
|
pascal@19900
|
79 push [dword _csip]
|
pascal@19636
|
80 extrn _rm_size:word
|
pascal@19636
|
81 mov si,offset _rm_size ; _rm_size, _pm_high, _rm_buf
|
pascal@19636
|
82 lodsw
|
pascal@19636
|
83 xchg ax,cx ; _rm_size
|
pascal@19636
|
84 lodsb ; _pm_high
|
pascal@19636
|
85 mov si,[si] ; _rm_buf
|
pascal@19571
|
86 xor di,di
|
pascal@19571
|
87 ;cld
|
pascal@19571
|
88 rep
|
pascal@19571
|
89 movsb
|
pascal@19571
|
90 extrn _cmdline:word
|
pascal@19571
|
91 mov si,[_cmdline]
|
pascal@19571
|
92 mov di,8000h
|
pascal@19571
|
93 mov ch,10h ; 4k
|
pascal@19571
|
94 rep
|
pascal@19571
|
95 movsb
|
pascal@19636
|
96 cmp al,cl ; load high ?
|
pascal@19515
|
97 jne isbzimage
|
pascal@19637
|
98 ifdef NO386
|
pascal@19637
|
99 add bh,9
|
pascal@19637
|
100 push bx ; topseg()+0x0900
|
pascal@19637
|
101 else
|
pascal@19637
|
102 push 9900h ; 4096 bytes for cmdline
|
pascal@19637
|
103 ;push 9820h ; 512 bytes for cmdline
|
pascal@19637
|
104 endif
|
pascal@19515
|
105 ; finish loading
|
pascal@19515
|
106 extrn @last_ditch$qv:near
|
pascal@19515
|
107 push cs
|
pascal@19515
|
108 call @last_ditch$qv
|
pascal@19899
|
109 mov ax,[word _imgs+2+2] ; get pm->fallback high word
|
pascal@19515
|
110 ; self move
|
pascal@19571
|
111 ;cld
|
pascal@19538
|
112 pop es ; min 2048 bytes for stack
|
pascal@19538
|
113 xor si,si ; A000 -9000 -0800(>movedend)
|
pascal@19515
|
114 xor di,di ; set ZF
|
pascal@19538
|
115 mov cx,offset movedend
|
pascal@19515
|
116 global _bss_end:byte
|
pascal@19538
|
117 ;mov cx,offset _bss_end
|
pascal@19515
|
118 rep
|
pascal@19515
|
119 movsb
|
pascal@19515
|
120 push es
|
pascal@19515
|
121 call near doretf ; mov cs,es
|
pascal@19571
|
122 push ss
|
pascal@19571
|
123 pop es
|
pascal@19515
|
124 push cs
|
pascal@19515
|
125 pop ds
|
pascal@19571
|
126 push ax
|
pascal@19515
|
127 call near dos_shutdown
|
pascal@19538
|
128 ;in al,70h
|
pascal@19538
|
129 ;or al,80h ; disable NMI
|
pascal@19538
|
130 ;out 70h,al
|
pascal@19538
|
131 pop bx
|
pascal@19515
|
132 ; move zImage pm
|
pascal@19515
|
133 mov ax,8
|
pascal@19900
|
134 cwd ; clear dx
|
pascal@19515
|
135 cmp bx,ax
|
pascal@19538
|
136 ja bufhigh
|
pascal@19515
|
137 sub ax,bx
|
pascal@19515
|
138 inc ax
|
pascal@19515
|
139 bufhigh:
|
pascal@19515
|
140 push ax
|
pascal@19515
|
141 push dx ; size=up to 512k
|
pascal@19515
|
142 push bx ; src ofs= pm.fallback
|
pascal@19515
|
143 push dx
|
pascal@19515
|
144 push dx ; srcseg=0
|
pascal@19636
|
145 ifdef NO386
|
pascal@19636
|
146 inc dx
|
pascal@19636
|
147 push dx ; dst
|
pascal@19636
|
148 dec dx
|
pascal@19636
|
149 else
|
pascal@19636
|
150 push 1 ; dst
|
pascal@19636
|
151 endif
|
pascal@19515
|
152 push dx ; ofs=64k
|
pascal@19515
|
153 extrn _memcpy32:near
|
pascal@19515
|
154 call _memcpy32
|
pascal@19538
|
155 add sp,14
|
pascal@19515
|
156
|
pascal@19515
|
157 ifndef noelks
|
pascal@19515
|
158 push ss
|
pascal@19515
|
159 pop ds
|
pascal@19515
|
160 ifndef NO386
|
pascal@19515
|
161 cmp [dword 1E6h],'SKLE'
|
pascal@19515
|
162 else
|
pascal@19515
|
163 cmp [word 1E6h],'LE'
|
pascal@19515
|
164 jne notelks
|
pascal@19515
|
165 cmp [word 1E8h],'SK'
|
pascal@19515
|
166 endif
|
pascal@19515
|
167 jne notelks
|
pascal@19636
|
168 ifdef NO386
|
pascal@19636
|
169 mov cx,120h
|
pascal@19636
|
170 push cx
|
pascal@19636
|
171 mov cl,0h
|
pascal@19636
|
172 push cx
|
pascal@19636
|
173 else
|
pascal@19636
|
174 push 120h
|
pascal@19515
|
175 push 100h
|
pascal@19636
|
176 endif
|
pascal@19515
|
177 pop es
|
pascal@19515
|
178 xor si,si
|
pascal@19515
|
179 xor di,di
|
pascal@19515
|
180 mov ch,05h
|
pascal@19515
|
181 rep
|
pascal@19515
|
182 movsw
|
pascal@19515
|
183 push es
|
pascal@19515
|
184 pop ss
|
pascal@19636
|
185 push cx
|
pascal@19515
|
186 notelks:
|
pascal@19515
|
187 endif
|
pascal@19515
|
188
|
pascal@19571
|
189 isbzimage:
|
pascal@19515
|
190 push ss
|
pascal@19515
|
191 pop ds
|
pascal@19571
|
192 ;push ss
|
pascal@19571
|
193 ;pop es
|
pascal@19636
|
194 ifndef NO386
|
pascal@19515
|
195 push ss
|
pascal@19515
|
196 pop fs
|
pascal@19515
|
197 push ss
|
pascal@19515
|
198 pop gs
|
pascal@19636
|
199 endif
|
pascal@19515
|
200 assume nothing
|
pascal@19515
|
201 assume cs:DGROUP
|
pascal@19515
|
202
|
pascal@19515
|
203 doretf:
|
pascal@19515
|
204 retf
|
pascal@19515
|
205
|
pascal@19515
|
206 movedend:
|
pascal@19515
|
207 endp _set_sregs_jump_seg_ofs
|
pascal@19515
|
208
|
pascal@19515
|
209 ends _TEXT
|
pascal@19515
|
210
|
pascal@19515
|
211 end
|
pascal@19515
|
212
|
pascal@19515
|
213 ;###### END OF FILE ############################################
|