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

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