rev |
line source |
pascal@19515
|
1 ;***************************************************************
|
pascal@19515
|
2 ;****** This file is distributed under GPL
|
pascal@19515
|
3 ;***************************************************************
|
pascal@19515
|
4 ideal
|
pascal@21984
|
5 %PAGESIZE 1000
|
pascal@19515
|
6 %crefref
|
pascal@19515
|
7 %noincl
|
pascal@19515
|
8 %nomacs
|
pascal@19636
|
9 ifdef NO386
|
pascal@19636
|
10 p8086
|
pascal@19636
|
11 else
|
pascal@19515
|
12 p386
|
pascal@19636
|
13 endif
|
pascal@19515
|
14
|
pascal@20477
|
15 group DGROUP _TEXT
|
pascal@19515
|
16 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
17
|
pascal@19515
|
18 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
19
|
pascal@19515
|
20 ;***************************************************************
|
pascal@19538
|
21 ;void memcpy32(u32 dstofs,u16 srcseg,u32 srcofs,u32 size);
|
pascal@19515
|
22 ;***************************************************************
|
pascal@19515
|
23 ;****** Uses: Flags
|
pascal@19515
|
24 ;***************************************************************
|
pascal@20528
|
25 global memcpy32:near
|
pascal@20528
|
26 proc memcpy32 near
|
pascal@19515
|
27
|
pascal@19515
|
28 ; rm32,imm16 helper
|
pascal@19515
|
29 macro addzx_e rm,i
|
pascal@19515
|
30 db 66h
|
pascal@19515
|
31 add rm,i
|
pascal@19515
|
32 dw 0
|
pascal@19515
|
33 endm
|
pascal@19538
|
34 arg dstofs :dword, \
|
pascal@19515
|
35 srcseg :word, \
|
pascal@19515
|
36 srcofs :dword, \
|
pascal@19515
|
37 sz :dword = PARAM_SIZE
|
pascal@19515
|
38
|
pascal@19515
|
39 local GDTR :pword, \
|
pascal@19515
|
40 oldGDTR :pword = TEMP_SIZE
|
pascal@19515
|
41
|
pascal@19515
|
42 ;****** Init ***************************************************
|
pascal@19634
|
43
|
pascal@19903
|
44 ifndef NO386
|
pascal@19634
|
45
|
pascal@19634
|
46 enter TEMP_SIZE,0
|
pascal@19571
|
47 ;cld
|
pascal@19515
|
48 pushf
|
pascal@19538
|
49 push ds es
|
pascal@20534
|
50 pushad ; struct declared in VCPI.ASM
|
pascal@19571
|
51 mov cl,4
|
pascal@19515
|
52 movzx esi,[srcseg]
|
pascal@19571
|
53 shl esi,cl
|
pascal@19571
|
54 add esi,[srcofs]
|
pascal@19571
|
55 mov [srcofs],esi ; for memcpy_vcpi
|
pascal@19538
|
56 mov edi,[dstofs]
|
pascal@19538
|
57
|
pascal@19515
|
58 ifndef pm_only
|
pascal@19538
|
59 mov eax,esi
|
pascal@19571
|
60 shr eax,cl
|
pascal@19515
|
61 mov edx,edi
|
pascal@19571
|
62 shr edx,cl
|
pascal@19571
|
63 mov ecx,esi
|
pascal@19571
|
64 or ecx,edi
|
pascal@19571
|
65 shr ecx,20 ; >1mb ?
|
pascal@19571
|
66 jnz @@pmcopy
|
pascal@19515
|
67 @@movlp:
|
pascal@19515
|
68 mov ds,ax
|
pascal@19515
|
69 mov es,dx
|
pascal@19515
|
70 inc ax
|
pascal@19515
|
71 inc dx
|
pascal@19538
|
72 mov cl,0Fh
|
pascal@19538
|
73 and si,cx
|
pascal@19538
|
74 and di,cx
|
pascal@19538
|
75 inc cx
|
pascal@19538
|
76 sub [sz],ecx
|
pascal@20534
|
77 jae @@movpara
|
pascal@20534
|
78 add ecx,[sz]
|
pascal@20534
|
79 @@movpara:
|
pascal@19538
|
80 rep movsb
|
pascal@19515
|
81 ja @@movlp
|
pascal@19571
|
82 jmp @@done
|
pascal@19515
|
83 endif
|
pascal@19571
|
84 @@pmcopy:
|
pascal@19538
|
85 else
|
pascal@19538
|
86
|
pascal@19634
|
87 push bp
|
pascal@19634
|
88 mov bp,sp
|
pascal@19634
|
89 sub sp,TEMP_SIZE
|
pascal@19634
|
90 ;cld
|
pascal@19634
|
91 pushf
|
pascal@19634
|
92 push ds es
|
pascal@19538
|
93 push si
|
pascal@19538
|
94 xor bx,bx
|
pascal@19538
|
95 xor si,si
|
pascal@19903
|
96 mov ax,[srcseg]
|
pascal@20528
|
97 extrn N_LXLSH@4:near
|
pascal@20528
|
98 call near ptr N_LXLSH@4
|
pascal@19903
|
99 add [word srcofs],ax
|
pascal@19903
|
100 adc [word srcofs+2],dx
|
pascal@19538
|
101 @@2flat:
|
pascal@21791
|
102 les ax,[dword si+srcofs] ; srcofs, dstofs
|
pascal@21791
|
103 mov dx,es
|
pascal@21791
|
104 mov cl,4
|
pascal@21791
|
105 @@loop:
|
pascal@21791
|
106 shr dx,1
|
pascal@21791
|
107 rcr ax,1
|
pascal@21791
|
108 loop @@loop
|
pascal@19538
|
109 or bx,dx ; >=1mb flag
|
pascal@19538
|
110 push ax ; srcseg, dstseg
|
pascal@19538
|
111 xor si,-6
|
pascal@19538
|
112 jnz @@2flat
|
pascal@19538
|
113 pop dx ; dstseg
|
pascal@19538
|
114 pop ax ; srcseg
|
pascal@19903
|
115 dec bx ; <1mb ?
|
pascal@19903
|
116 jns @@pmcopy
|
pascal@19538
|
117 push di
|
pascal@19538
|
118 @@movlp:
|
pascal@19538
|
119 mov ds,ax
|
pascal@19538
|
120 mov es,dx
|
pascal@19538
|
121 inc ax
|
pascal@19538
|
122 inc dx
|
pascal@19538
|
123 mov cl,0Fh
|
pascal@19538
|
124 mov si,cx
|
pascal@19538
|
125 mov di,cx
|
pascal@19538
|
126 and si,[word srcofs]
|
pascal@19538
|
127 and di,[word dstofs]
|
pascal@19538
|
128 inc cx
|
pascal@19538
|
129 sub [word sz],cx
|
pascal@20520
|
130 ;jae @@movpara
|
pascal@20520
|
131 sbb [word sz+2],0
|
pascal@20520
|
132 jae @@movpara
|
pascal@20520
|
133 add cx,[word sz]
|
pascal@20520
|
134 ;stc
|
pascal@20520
|
135 @@movpara:
|
pascal@19538
|
136 rep movsb
|
pascal@20485
|
137 jae @@movlp
|
pascal@20520
|
138 dec cx ; set S
|
pascal@19571
|
139 pop di
|
pascal@19571
|
140 @@pmcopy:
|
pascal@19538
|
141 pop si
|
pascal@19571
|
142 js @@done16
|
pascal@19636
|
143 p386
|
pascal@20534
|
144 pushad ; struct declared in VCPI.ASM
|
pascal@19538
|
145 mov esi,[srcofs]
|
pascal@19538
|
146 mov edi,[dstofs]
|
pascal@19538
|
147
|
pascal@19538
|
148 endif
|
pascal@19538
|
149
|
pascal@19515
|
150 mov ecx,[sz]
|
pascal@19571
|
151 jecxz @@done
|
pascal@19538
|
152
|
pascal@19538
|
153 smsw ax
|
pascal@20453
|
154 and al,1 ;MSW_PE
|
pascal@19538
|
155 jz @@real_mode
|
pascal@19538
|
156 ; Note: bp points to std stack frame now. bp will be passed to
|
pascal@19538
|
157 ; pm routine. This allows params to be passed on stack
|
pascal@20534
|
158 extrn vcpi_pm_copy_routine:near
|
pascal@20534
|
159 call near vcpi_pm_copy_routine ; Call pm copy routine via vcpi pm
|
pascal@19571
|
160 jmp @@done
|
pascal@19538
|
161 @@real_mode:
|
pascal@19515
|
162 cmp esi,edi
|
pascal@19515
|
163 jae @@do_copy
|
pascal@19515
|
164 add esi,ecx ;src<dst: we must do
|
pascal@19515
|
165 dec esi ; copy backwards to avoid
|
pascal@19515
|
166 add edi,ecx ; overwrite bug
|
pascal@19515
|
167 dec edi ;
|
pascal@19515
|
168 std ;
|
pascal@19515
|
169 @@do_copy:
|
pascal@19515
|
170 cli
|
pascal@19515
|
171 sgdt [oldGDTR]
|
pascal@19515
|
172
|
pascal@19515
|
173 ;****** Load gdtr **********************************************
|
pascal@19515
|
174 mov eax,cs
|
pascal@19515
|
175 shl eax,4
|
pascal@19515
|
176 addzx_e ax,<offset GDT>
|
pascal@19634
|
177 or [word GDTR],-1 ;GDT limit = 0FFFFh
|
pascal@19515
|
178 mov [dword GDTR+2],eax ;GDT base
|
pascal@19515
|
179 lgdt [GDTR]
|
pascal@19515
|
180
|
pascal@19515
|
181 ;****** Go into pm *********************************************
|
pascal@19515
|
182 mov eax,cr0
|
pascal@19571
|
183 inc ax ;CR0_PE on
|
pascal@19515
|
184 mov cr0,eax
|
pascal@19515
|
185 jmp short $+2 ;*Required*!
|
pascal@19515
|
186 ;3+ NOPs also work fine (chkd on 386)
|
pascal@19515
|
187 ;****** Move data **********************************************
|
pascal@19515
|
188 push 0008h
|
pascal@19515
|
189 pop ds ;base=0, lim = 4gb
|
pascal@19515
|
190 push ds ;
|
pascal@19515
|
191 pop es ;
|
pascal@19634
|
192 ;db 66h ;operand width override for ecx
|
pascal@19515
|
193 db 67h ;address width override for esi/edi
|
pascal@19515
|
194 rep movsb
|
pascal@19883
|
195 ;cld
|
pascal@19515
|
196
|
pascal@19515
|
197 ;****** Return to rm *******************************************
|
pascal@19515
|
198 dec ax ;CR0_PE off
|
pascal@19515
|
199 mov cr0,eax ;ds/es limits are *not* reset to 64kb
|
pascal@19515
|
200 ; but who cares :-)
|
pascal@19515
|
201 jmp short $+2
|
pascal@19515
|
202
|
pascal@19515
|
203 ;****** Return *************************************************
|
pascal@19515
|
204 lgdt [oldGDTR]
|
pascal@19571
|
205 @@done:
|
pascal@19538
|
206 popad
|
pascal@19636
|
207 p8086
|
pascal@19571
|
208 @@done16:
|
pascal@19538
|
209 pop es ds
|
pascal@20534
|
210 popf ; restore I & D
|
pascal@19634
|
211 ifndef NO386
|
pascal@19636
|
212 p386
|
pascal@19634
|
213 leave
|
pascal@19634
|
214 else
|
pascal@19538
|
215 mov sp,bp
|
pascal@19538
|
216 pop bp
|
pascal@19634
|
217 endif
|
pascal@20528
|
218 ret 14
|
pascal@19515
|
219
|
pascal@19515
|
220 ;****** Const data *********************************************
|
pascal@19515
|
221 org $-8 ;save 8 bytes - they are unused anyway
|
pascal@19515
|
222 ;0000: unused
|
pascal@19515
|
223 GDT dd ?,?
|
pascal@19515
|
224 ;0008: Data seg [0,FFFFFFFF]
|
pascal@19515
|
225 ; lim_lo base_lo
|
pascal@19515
|
226 dw 1111111111111111b, 0000000000000000b
|
pascal@19515
|
227 db 00000000b,10010010b,10001111b,00000000b
|
pascal@19515
|
228 ; base_med P S D A G ??l_hi base_hi
|
pascal@19515
|
229 ; Pl E W D
|
pascal@19515
|
230
|
pascal@20528
|
231 endp memcpy32
|
pascal@19515
|
232
|
pascal@19515
|
233 ends _TEXT
|
pascal@19515
|
234
|
pascal@19515
|
235 end
|
pascal@19515
|
236
|
pascal@19515
|
237 ;###### END OF FILE ############################################
|