wok view linld/stuff/src/JUMP.ASM @ rev 20745

azpainter: update WGET_URL
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Feb 10 10:35:42 2019 +0100 (2019-02-10)
parents af959ebf1305
children cbcb33ee9044
line source
1 ;***************************************************************
2 ;****** This file is distributed under GPL
3 ;***************************************************************
4 ideal
5 %crefref
6 %noincl
7 %nomacs
8 ifdef NO386
9 p8086
10 else
11 p386
12 endif
14 group DGROUP _TEXT,_DATA,_BSS
15 assume cs:DGROUP,ds:DGROUP
17 segment _DATA byte public use16 'DATA'
19 overflow db "Loaded too close to 9000:0",0
21 ends _DATA
23 segment _BSS byte public use16 'BSS'
25 global _imgs:dword
27 ends _BSS
30 segment _TEXT byte public use16 'CODE'
32 ;***************************************************************
33 ;void dos_shutdown()
34 ;***************************************************************
36 macro dos_shutdown
37 xor di,di
38 mov ds,di
39 ifndef NO386
40 push [dword di+4] ; save step
41 mov [word di+4],offset step19
42 else
43 mov ax,offset step19
44 xchg ax,[word di+4]
45 push [word di+6]
46 push ax ; save step
47 endif
48 mov [word cs:sssp],sp
49 ;cmp [byte di+7],0F0h
50 ;jnc notdos
51 mov [di+6],cs
52 pushf
53 pushf
54 pop ax
55 inc ah ; set TF
56 push ax
57 popf
58 call [dword di+4*19h]
59 notdos:
60 ifndef NO386
61 lss sp,[dword cs:sssp]
62 else
63 lds ax,[dword cs:sssp]
64 push ds
65 pop ss
66 xchg ax,sp
67 endif
68 xor di,di
69 mov ds,di
70 pop [dword di+4] ; restore step
71 endm
72 macro step19code
73 step19:
74 push di
75 push ds
76 mov di,sp
77 lds di,[dword ss:di+4] ; read cs:ip
78 cmp [word di],19CDh ; int 19h ?
79 pop ds
80 pop di
81 je notdos
82 iret
83 endm
86 ;***************************************************************
87 ;void boot_kernel();
88 ;****** Never returns
89 ;***************************************************************
90 global _boot_kernel:near
91 proc _boot_kernel near
93 p8086
94 extrn _heap_top:word
95 global sssp:dword
96 ifdef NO386
97 extrn _topseg:near
98 call near _topseg
99 mov cl,4
100 org $-4
101 sssp dd ?
102 mov [word sssp+2],ax
103 xchg ax,bx
104 mov ax,[_heap_top]
105 shr ax,cl
106 else
107 p386
108 mov ax,[_heap_top]
109 shr ax,4
110 mov bx,9000h
111 org $-4
112 sssp dd ?
113 endif
114 mov es,bx
115 mov dx,cs
116 add ax,dx
117 cmp ax,bx
118 jb @@nooverflow
119 ; Oops! We can stomp on our toes... better stop now
120 mov bx,offset overflow
121 extrn die:near
122 call near die
123 @@nooverflow:
124 ;cli ; we start doing destructive things to DOS
125 push es
126 pop ss
127 mov sp,0A000h
128 extrn _rm_size:word
129 ifdef NO386
130 mov si,offset _rm_size-2 ; _rm_size, _pm_high, _rm_buf
131 lodsw
132 push ax ; _csip high
133 push [word si-4] ; _csip low
134 else
135 extrn _csip:dword;
136 push [dword _csip] ; _csip
137 mov si,offset _rm_size ; _rm_size, _pm_high, _rm_buf
138 endif
139 lodsw
140 xchg ax,cx ; _rm_size
141 lodsb ; _pm_high
142 mov si,[si] ; _rm_buf
143 xor di,di
144 ;cld
145 rep
146 movsb
147 extrn _cmdline:word
148 mov si,[_cmdline]
149 mov di,8000h
150 mov ch,10h ; 4k
151 rep
152 movsb
153 ifdef NO386
154 add bh,9
155 push bx ; topseg()+0x0900
156 else
157 push 9800h+(4096/16) ; 4096 bytes for cmdline
158 endif
159 cmp al,cl ; load high ?
160 pushf
161 ; finish loading
162 extrn @last_ditch$qv:near
163 call @last_ditch$qv
164 dos_shutdown ; clear di; ds=0
165 push cs
166 pop ds
167 popf
168 ; self move
169 ;cld
170 pop es ; min 2048 bytes for stack
171 jne @@isbzimage
172 extrn gdt_data
173 mov cx,offset gdt_data+8
174 xor si,si ; A000 -9000 -0800(>movedend)
175 rep
176 movsb
177 mov ax,[word _imgs+2+2] ; get pm->fallback high word
178 push es
179 call near @@isbzimage ; pop cs ; ds=es=ss
181 ; prepare memcpy32 size & srcofs param to move zImage pm
182 mov dx,8
183 cmp ax,dx ; buf > 80000h ?
184 ja @@bufhigh
185 sub dx,ax
186 inc dx ; up to 90000h-1
187 @@bufhigh:
188 push dx ; size hi
189 push cx ; size lo=up to 512k
190 push ax ; src ofs ho = pm.fallback
192 ;in al,70h
193 ;or al,80h ; disable NMI
194 ;out 70h,al
196 xor di,di
197 push di ; src ofs lo
198 push di ; src seg=0
199 ifdef NO386
200 inc di
201 push di ; dst ofs hi
202 dec di
203 else
204 push 1 ; dst ofs hi
205 endif
206 push di ; dst ofs lo : 64k
207 extrn memcpy32:near
208 call memcpy32
210 ifndef noelks
211 ifndef NO386
212 cmp [dword 1E6h],'SKLE'
213 jne @@notelks
214 xor si,si
215 else
216 mov si,1E6h
217 lodsw
218 cmp ax,'LE'
219 jne @@notelks
220 lodsw
221 xor ax,'SK'
222 jne @@notelks
223 xchg ax,si
224 endif
225 push es
226 pop ss
227 mov cx,120h ; CS=0120
228 push cx
229 push si ; IP=0000
230 mov cl,0 ; DS=ES=SS=0100
231 mov es,cx
232 mov ch,05h ; 500h mini
233 rep
234 movsw
235 @@notelks:
236 endif
237 @@isbzimage:
238 push ss
239 pop ds
240 push ss
241 pop es
242 ifndef NO386
243 push ss
244 pop fs
245 push ss
246 pop gs
247 endif
248 assume nothing
249 assume cs:DGROUP
250 retf
252 step19code
254 endp _boot_kernel
256 movedend:
258 ends _TEXT
260 end
262 ;###### END OF FILE ############################################