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

Add libsbc
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Feb 12 12:12:36 2019 +0100 (2019-02-12)
parents 7f39f4ab7511
children 094f58ac8183
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 mov si,offset _rm_size ; _rm_size, _pm_high, _rm_buf
136 push [dword si-4] ; _csip
137 endif
138 lodsw
139 xchg ax,cx ; _rm_size
140 lodsb ; _pm_high
141 mov si,[si] ; _rm_buf
142 xor di,di
143 ;cld
144 rep
145 movsb
146 extrn _cmdline:word
147 mov si,[_cmdline]
148 mov di,8000h
149 mov ch,10h ; 4k
150 rep
151 movsb
152 ifdef NO386
153 add bh,9
154 push bx ; topseg()+0x0900
155 else
156 push 9800h+(4096/16) ; 4096 bytes for cmdline
157 endif
158 cmp al,cl ; load high ?
159 pushf
160 ; finish loading
161 extrn @last_ditch$qv:near
162 call @last_ditch$qv
163 dos_shutdown ; clear di; ds=0
164 push cs
165 pop ds
166 popf
167 ; self move
168 ;cld
169 pop es ; min 2048 bytes for stack
170 jne @@isbzimage
171 extrn gdt_data
172 mov cx,offset gdt_data+8
173 xor si,si ; A000 -9000 -0800(>movedend)
174 rep
175 movsb
176 mov ax,[word _imgs+2+2] ; get pm->fallback high word
177 push es
178 call near @@isbzimage ; pop cs ; ds=es=ss
180 ; prepare memcpy32 size & srcofs param to move zImage pm
181 mov dx,8
182 cmp ax,dx ; buf > 80000h ?
183 ja @@bufhigh
184 sub dx,ax
185 inc dx ; up to 90000h-1
186 @@bufhigh:
187 push dx ; size hi
188 push cx ; size lo=up to 512k
189 push ax ; src ofs ho = pm.fallback
191 ;in al,70h
192 ;or al,80h ; disable NMI
193 ;out 70h,al
195 xor di,di
196 push di ; src ofs lo
197 push di ; src seg=0
198 ifdef NO386
199 inc di
200 push di ; dst ofs hi
201 dec di
202 else
203 push 1 ; dst ofs hi
204 endif
205 push di ; dst ofs lo : 64k
206 extrn memcpy32:near
207 call memcpy32
209 ifndef noelks
210 ifndef NO386
211 cmp [dword 1E6h],'SKLE'
212 jne @@notelks
213 xor si,si
214 else
215 mov si,1E6h
216 lodsw
217 cmp ax,'LE'
218 jne @@notelks
219 lodsw
220 xor ax,'SK'
221 jne @@notelks
222 xchg ax,si
223 endif
224 push es
225 pop ss
226 mov cx,120h ; CS=0120
227 push cx
228 push si ; IP=0000
229 mov cl,0 ; DS=ES=SS=0100
230 mov es,cx
231 mov ch,05h ; 500h mini
232 rep
233 movsw
234 @@notelks:
235 endif
236 @@isbzimage:
237 push ss
238 pop ds
239 push ss
240 pop es
241 ifndef NO386
242 push ss
243 pop fs
244 push ss
245 pop gs
246 endif
247 assume nothing
248 assume cs:DGROUP
249 retf
251 step19code
253 endp _boot_kernel
255 movedend:
257 ends _TEXT
259 end
261 ;###### END OF FILE ############################################