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@19515
|
14 group DGROUP _TEXT,_DATA
|
pascal@19515
|
15 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
16
|
pascal@19515
|
17 segment _DATA byte public use16 'DATA'
|
pascal@19515
|
18 ends _DATA
|
pascal@19515
|
19
|
pascal@19515
|
20 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
21
|
pascal@19515
|
22 ;***************************************************************
|
pascal@19515
|
23 ;void dos_shutdown()
|
pascal@19515
|
24 ;***************************************************************
|
pascal@19515
|
25 global dos_shutdown:near
|
pascal@19515
|
26 proc dos_shutdown near
|
pascal@19515
|
27
|
pascal@19515
|
28 dos_shutdown:
|
pascal@19538
|
29 ifndef NO386
|
pascal@19538
|
30 ;pusha
|
pascal@19538
|
31 else
|
pascal@19538
|
32 ;push bp si di
|
pascal@19538
|
33 endif
|
pascal@19515
|
34 xor bx,bx
|
pascal@19515
|
35 mov ds,bx
|
pascal@19538
|
36 ifndef NO386
|
pascal@19515
|
37 push [dword bx+4] ; save step
|
pascal@19515
|
38 mov ax,sp
|
pascal@19515
|
39 push ss
|
pascal@19515
|
40 push ax
|
pascal@19515
|
41 pop [dword cs:sssp]
|
pascal@19538
|
42 else
|
pascal@19538
|
43 push [word bx+6]
|
pascal@19538
|
44 push [word bx+4] ; save step
|
pascal@19538
|
45 mov [word cs:sssp],sp
|
pascal@19538
|
46 mov [word cs:sssp+2],ss
|
pascal@19538
|
47 endif
|
pascal@19515
|
48 ;cmp [byte bx+7],0F0h
|
pascal@19515
|
49 ;jnc notdos
|
pascal@19515
|
50 mov [word bx+4],offset step19
|
pascal@19515
|
51 mov [bx+6],cs
|
pascal@19515
|
52 pushf
|
pascal@19515
|
53 pop ax
|
pascal@19515
|
54 inc ah ; set TF
|
pascal@19515
|
55 push ax
|
pascal@19515
|
56 popf
|
pascal@19636
|
57 jmp [dword bx+4*19h]
|
pascal@19515
|
58 doiret:
|
pascal@19515
|
59 iret
|
pascal@19515
|
60 sssp:
|
pascal@19515
|
61 dd 0
|
pascal@19515
|
62 step19:
|
pascal@19515
|
63 push bx
|
pascal@19515
|
64 push ds
|
pascal@19515
|
65 mov bx,sp
|
pascal@19515
|
66 lds bx,[dword ss:bx+4] ; read cs:ip
|
pascal@19515
|
67 cmp [word bx],19CDh ; int 19h ?
|
pascal@19515
|
68 pop ds
|
pascal@19515
|
69 pop bx
|
pascal@19515
|
70 jne doiret
|
pascal@19515
|
71 notdos:
|
pascal@19538
|
72 ifndef NO386
|
pascal@19515
|
73 lss sp,[dword cs:sssp]
|
pascal@19538
|
74 else
|
pascal@19538
|
75 lds bx,[dword cs:sssp]
|
pascal@19538
|
76 push ds
|
pascal@19538
|
77 pop ss
|
pascal@19538
|
78 mov sp,bx
|
pascal@19538
|
79 endif
|
pascal@19515
|
80 xor bx,bx
|
pascal@19515
|
81 mov ds,bx
|
pascal@19538
|
82 ifndef NO386
|
pascal@19515
|
83 pop [dword bx+4] ; restore step
|
pascal@19538
|
84 ;popa
|
pascal@19538
|
85 else
|
pascal@19538
|
86 pop [word bx+4] ; restore step
|
pascal@19538
|
87 pop [word bx+6]
|
pascal@19538
|
88 ;pop di si bp
|
pascal@19538
|
89 endif
|
pascal@19515
|
90 push cs
|
pascal@19515
|
91 pop ds
|
pascal@19515
|
92 ret
|
pascal@19515
|
93
|
pascal@19515
|
94 endp dos_shutdown
|
pascal@19515
|
95
|
pascal@19515
|
96
|
pascal@19515
|
97 ;***************************************************************
|
pascal@19538
|
98 ;void memcpy32(u32 dstofs,u16 srcseg,u32 srcofs,u32 size);
|
pascal@19515
|
99 ;***************************************************************
|
pascal@19515
|
100 ;****** Uses: Flags
|
pascal@19515
|
101 ;***************************************************************
|
pascal@19515
|
102 global _memcpy32:near
|
pascal@19515
|
103 proc _memcpy32 near
|
pascal@19515
|
104
|
pascal@19515
|
105 ; rm32,imm16 helper
|
pascal@19515
|
106 macro addzx_e rm,i
|
pascal@19515
|
107 db 66h
|
pascal@19515
|
108 add rm,i
|
pascal@19515
|
109 dw 0
|
pascal@19515
|
110 endm
|
pascal@19538
|
111 arg dstofs :dword, \
|
pascal@19515
|
112 srcseg :word, \
|
pascal@19515
|
113 srcofs :dword, \
|
pascal@19515
|
114 sz :dword = PARAM_SIZE
|
pascal@19515
|
115
|
pascal@19515
|
116 local GDTR :pword, \
|
pascal@19515
|
117 oldGDTR :pword = TEMP_SIZE
|
pascal@19515
|
118
|
pascal@19515
|
119 ;****** Init ***************************************************
|
pascal@19634
|
120
|
pascal@19634
|
121 ifndef NO386
|
pascal@19634
|
122
|
pascal@19634
|
123 enter TEMP_SIZE,0
|
pascal@19571
|
124 ;cld
|
pascal@19515
|
125 pushf
|
pascal@19538
|
126 push ds es
|
pascal@19538
|
127 pushad
|
pascal@19571
|
128 mov cl,4
|
pascal@19515
|
129 movzx esi,[srcseg]
|
pascal@19571
|
130 shl esi,cl
|
pascal@19571
|
131 add esi,[srcofs]
|
pascal@19571
|
132 mov [srcofs],esi ; for memcpy_vcpi
|
pascal@19538
|
133 mov edi,[dstofs]
|
pascal@19538
|
134
|
pascal@19515
|
135 ifndef pm_only
|
pascal@19538
|
136 mov eax,esi
|
pascal@19571
|
137 shr eax,cl
|
pascal@19515
|
138 mov edx,edi
|
pascal@19571
|
139 shr edx,cl
|
pascal@19571
|
140 mov ecx,esi
|
pascal@19571
|
141 or ecx,edi
|
pascal@19571
|
142 shr ecx,20 ; >1mb ?
|
pascal@19571
|
143 jnz @@pmcopy
|
pascal@19515
|
144 @@movlp:
|
pascal@19515
|
145 mov ds,ax
|
pascal@19515
|
146 mov es,dx
|
pascal@19515
|
147 inc ax
|
pascal@19515
|
148 inc dx
|
pascal@19538
|
149 mov cl,0Fh
|
pascal@19538
|
150 and si,cx
|
pascal@19538
|
151 and di,cx
|
pascal@19538
|
152 inc cx
|
pascal@19538
|
153 sub [sz],ecx
|
pascal@19538
|
154 rep movsb
|
pascal@19515
|
155 ja @@movlp
|
pascal@19571
|
156 jmp @@done
|
pascal@19515
|
157 endif
|
pascal@19571
|
158 @@pmcopy:
|
pascal@19538
|
159 else
|
pascal@19538
|
160
|
pascal@19634
|
161 push bp
|
pascal@19634
|
162 mov bp,sp
|
pascal@19634
|
163 sub sp,TEMP_SIZE
|
pascal@19634
|
164 ;cld
|
pascal@19634
|
165 pushf
|
pascal@19634
|
166 push ds es
|
pascal@19538
|
167 push si
|
pascal@19538
|
168 xor bx,bx
|
pascal@19538
|
169 xor dx,dx
|
pascal@19538
|
170 xor si,si
|
pascal@19571
|
171 mov ax,[bp+8] ; srcseg
|
pascal@19538
|
172 call near N_LXLSH@4
|
pascal@19571
|
173 add [bp+10],ax ; srcofs lo
|
pascal@19571
|
174 adc [bp+10+2],dx ; srcofs hi
|
pascal@19538
|
175 @@2flat:
|
pascal@19538
|
176 mov ax,[bp+si+10] ; srcofs, dstofs lo
|
pascal@19538
|
177 mov dx,[bp+si+10+2] ; srcofs, dstofs hi
|
pascal@19538
|
178 call near N_LXURSH@4
|
pascal@19538
|
179 or bx,dx ; >=1mb flag
|
pascal@19538
|
180 push ax ; srcseg, dstseg
|
pascal@19538
|
181 xor si,-6
|
pascal@19538
|
182 jnz @@2flat
|
pascal@19538
|
183 pop dx ; dstseg
|
pascal@19538
|
184 pop ax ; srcseg
|
pascal@19571
|
185 test bx,bx ; <1mb ? (clear C)
|
pascal@19571
|
186 jnz @@pmcopy
|
pascal@19538
|
187 push di
|
pascal@19538
|
188 @@movlp:
|
pascal@19538
|
189 mov ds,ax
|
pascal@19538
|
190 mov es,dx
|
pascal@19538
|
191 inc ax
|
pascal@19538
|
192 inc dx
|
pascal@19538
|
193 mov cl,0Fh
|
pascal@19538
|
194 mov si,cx
|
pascal@19538
|
195 mov di,cx
|
pascal@19538
|
196 and si,[word srcofs]
|
pascal@19538
|
197 and di,[word dstofs]
|
pascal@19538
|
198 inc cx
|
pascal@19538
|
199 sub [word sz],cx
|
pascal@19538
|
200 rep movsb
|
pascal@19571
|
201 ja @@movlp
|
pascal@19538
|
202 dec [word sz+2]
|
pascal@19571
|
203 jns @@movlp ; mov 1-16 more bytes...
|
pascal@19571
|
204 pop di
|
pascal@19571
|
205 @@pmcopy:
|
pascal@19538
|
206 pop si
|
pascal@19571
|
207 js @@done16
|
pascal@19636
|
208 p386
|
pascal@19538
|
209 pushad
|
pascal@19538
|
210 mov esi,[srcofs]
|
pascal@19538
|
211 mov edi,[dstofs]
|
pascal@19538
|
212
|
pascal@19538
|
213 endif
|
pascal@19538
|
214
|
pascal@19515
|
215 mov ecx,[sz]
|
pascal@19571
|
216 jecxz @@done
|
pascal@19538
|
217
|
pascal@19538
|
218 smsw ax
|
pascal@19538
|
219 test al,1
|
pascal@19538
|
220 jz @@real_mode
|
pascal@19538
|
221 ; Note: bp points to std stack frame now. bp will be passed to
|
pascal@19538
|
222 ; pm routine. This allows params to be passed on stack
|
pascal@19538
|
223 extrn do_memcpy_vcpi:near
|
pascal@19538
|
224 push offset do_memcpy_vcpi
|
pascal@19538
|
225 extrn call_pm_routine:near
|
pascal@19538
|
226 call near call_pm_routine ; Call pm copy routine via vcpi pm
|
pascal@19538
|
227 pop ax
|
pascal@19571
|
228 jmp @@done
|
pascal@19538
|
229 @@real_mode:
|
pascal@19515
|
230 cmp esi,edi
|
pascal@19515
|
231 jae @@do_copy
|
pascal@19515
|
232 add esi,ecx ;src<dst: we must do
|
pascal@19515
|
233 dec esi ; copy backwards to avoid
|
pascal@19515
|
234 add edi,ecx ; overwrite bug
|
pascal@19515
|
235 dec edi ;
|
pascal@19515
|
236 std ;
|
pascal@19515
|
237 @@do_copy:
|
pascal@19515
|
238 cli
|
pascal@19515
|
239 sgdt [oldGDTR]
|
pascal@19515
|
240
|
pascal@19515
|
241 ;****** Load gdtr **********************************************
|
pascal@19515
|
242 mov eax,cs
|
pascal@19515
|
243 shl eax,4
|
pascal@19515
|
244 addzx_e ax,<offset GDT>
|
pascal@19634
|
245 or [word GDTR],-1 ;GDT limit = 0FFFFh
|
pascal@19515
|
246 mov [dword GDTR+2],eax ;GDT base
|
pascal@19515
|
247 lgdt [GDTR]
|
pascal@19515
|
248
|
pascal@19515
|
249 ;****** Go into pm *********************************************
|
pascal@19515
|
250 mov eax,cr0
|
pascal@19571
|
251 inc ax ;CR0_PE on
|
pascal@19515
|
252 mov cr0,eax
|
pascal@19515
|
253 jmp short $+2 ;*Required*!
|
pascal@19515
|
254 ;3+ NOPs also work fine (chkd on 386)
|
pascal@19515
|
255 ;****** Move data **********************************************
|
pascal@19515
|
256 push 0008h
|
pascal@19515
|
257 pop ds ;base=0, lim = 4gb
|
pascal@19515
|
258 push ds ;
|
pascal@19515
|
259 pop es ;
|
pascal@19634
|
260 ;db 66h ;operand width override for ecx
|
pascal@19515
|
261 db 67h ;address width override for esi/edi
|
pascal@19515
|
262 rep movsb
|
pascal@19571
|
263 cld
|
pascal@19515
|
264
|
pascal@19515
|
265 ;****** Return to rm *******************************************
|
pascal@19515
|
266 dec ax ;CR0_PE off
|
pascal@19515
|
267 mov cr0,eax ;ds/es limits are *not* reset to 64kb
|
pascal@19515
|
268 ; but who cares :-)
|
pascal@19515
|
269 jmp short $+2
|
pascal@19515
|
270
|
pascal@19515
|
271 ;****** Return *************************************************
|
pascal@19515
|
272 lgdt [oldGDTR]
|
pascal@19571
|
273 @@done:
|
pascal@19538
|
274 popad
|
pascal@19636
|
275 p8086
|
pascal@19571
|
276 @@done16:
|
pascal@19538
|
277 pop es ds
|
pascal@19515
|
278 popf
|
pascal@19634
|
279 ifndef NO386
|
pascal@19636
|
280 p386
|
pascal@19634
|
281 leave
|
pascal@19634
|
282 else
|
pascal@19538
|
283 mov sp,bp
|
pascal@19538
|
284 pop bp
|
pascal@19634
|
285 endif
|
pascal@19515
|
286 ret
|
pascal@19515
|
287
|
pascal@19515
|
288 ;****** Const data *********************************************
|
pascal@19515
|
289 org $-8 ;save 8 bytes - they are unused anyway
|
pascal@19515
|
290 ;0000: unused
|
pascal@19515
|
291 GDT dd ?,?
|
pascal@19515
|
292 ;0008: Data seg [0,FFFFFFFF]
|
pascal@19515
|
293 ; lim_lo base_lo
|
pascal@19515
|
294 dw 1111111111111111b, 0000000000000000b
|
pascal@19515
|
295 db 00000000b,10010010b,10001111b,00000000b
|
pascal@19515
|
296 ; base_med P S D A G ??l_hi base_hi
|
pascal@19515
|
297 ; Pl E W D
|
pascal@19515
|
298
|
pascal@19515
|
299 endp _memcpy32
|
pascal@19515
|
300
|
pascal@19538
|
301 ifdef NO386
|
pascal@19538
|
302 global N_LXURSH@:near
|
pascal@19538
|
303 global N_LXURSH@4:near
|
pascal@19538
|
304 proc N_LXURSH@4 near
|
pascal@19538
|
305
|
pascal@19538
|
306 mov cl,4
|
pascal@19538
|
307 N_LXURSH@:
|
pascal@19538
|
308 mov ch,0
|
pascal@19538
|
309 @@loop:
|
pascal@19538
|
310 shr dx,1
|
pascal@19538
|
311 rcr ax,1
|
pascal@19538
|
312 loop @@loop
|
pascal@19538
|
313 ret
|
pascal@19538
|
314
|
pascal@19538
|
315 endp N_LXURSH@4
|
pascal@19538
|
316
|
pascal@19538
|
317 global N_LXLSH@:near
|
pascal@19538
|
318 global N_LXLSH@4:near
|
pascal@19538
|
319 proc N_LXLSH@4 near
|
pascal@19538
|
320
|
pascal@19538
|
321 mov cl,4
|
pascal@19538
|
322 N_LXLSH@:
|
pascal@19538
|
323 mov ch,0
|
pascal@19538
|
324 @@loop:
|
pascal@19538
|
325 shl ax,1
|
pascal@19538
|
326 rcl dx,1
|
pascal@19538
|
327 loop @@loop
|
pascal@19538
|
328 ret
|
pascal@19538
|
329
|
pascal@19538
|
330 endp N_LXLSH@4
|
pascal@19538
|
331
|
pascal@19538
|
332 endif
|
pascal@19538
|
333
|
pascal@19515
|
334 ends _TEXT
|
pascal@19515
|
335
|
pascal@19515
|
336 end
|
pascal@19515
|
337
|
pascal@19515
|
338 ;###### END OF FILE ############################################
|