rev |
line source |
pascal@19515
|
1 ;***************************************************************
|
pascal@19515
|
2 ;****** This file is distributed under GPL
|
pascal@19515
|
3 ;***************************************************************
|
pascal@19515
|
4 ideal
|
pascal@24034
|
5 %PAGESIZE 255
|
pascal@19515
|
6 %crefref
|
pascal@19515
|
7 %noincl
|
pascal@19515
|
8 %nomacs
|
pascal@24019
|
9
|
pascal@24019
|
10 include "common.inc"
|
pascal@24019
|
11
|
pascal@19636
|
12 ifdef NO386
|
pascal@19636
|
13 p8086
|
pascal@19636
|
14 else
|
pascal@19515
|
15 p386
|
pascal@19636
|
16 endif
|
pascal@19515
|
17
|
pascal@20477
|
18 group DGROUP _TEXT
|
pascal@19515
|
19 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
20
|
pascal@23996
|
21 macro lcr0 reg
|
pascal@23996
|
22 mov cr0,reg
|
pascal@23996
|
23 jmp short $+2 ;*Required*!
|
pascal@23996
|
24 ;3+ NOPs also work fine (chkd on 386)
|
pascal@23996
|
25 endm
|
pascal@23996
|
26
|
pascal@24034
|
27 macro addzx_e rm,i
|
pascal@24034
|
28 db 66h
|
pascal@24034
|
29 add rm,i
|
pascal@24034
|
30 dw 0
|
pascal@24034
|
31 endm
|
pascal@24034
|
32
|
pascal@19515
|
33 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
34
|
pascal@19515
|
35 ;***************************************************************
|
pascal@19538
|
36 ;void memcpy32(u32 dstofs,u16 srcseg,u32 srcofs,u32 size);
|
pascal@19515
|
37 ;***************************************************************
|
pascal@19515
|
38 ;****** Uses: Flags
|
pascal@19515
|
39 ;***************************************************************
|
pascal@20528
|
40 global memcpy32:near
|
pascal@20528
|
41 proc memcpy32 near
|
pascal@19515
|
42
|
pascal@19538
|
43 arg dstofs :dword, \
|
pascal@19515
|
44 srcseg :word, \
|
pascal@19515
|
45 srcofs :dword, \
|
pascal@19515
|
46 sz :dword = PARAM_SIZE
|
pascal@19515
|
47
|
pascal@19515
|
48 ;****** Init ***************************************************
|
pascal@19634
|
49
|
pascal@24034
|
50 push bp
|
pascal@24034
|
51 mov bp,sp
|
pascal@24034
|
52 ;cld
|
pascal@24034
|
53 pushf
|
pascal@24034
|
54 push ds
|
pascal@24034
|
55
|
pascal@19903
|
56 ifndef NO386
|
pascal@19634
|
57
|
pascal@20534
|
58 pushad ; struct declared in VCPI.ASM
|
pascal@19571
|
59 mov cl,4
|
pascal@19515
|
60 movzx esi,[srcseg]
|
pascal@19571
|
61 shl esi,cl
|
pascal@19571
|
62 add esi,[srcofs]
|
pascal@19538
|
63 mov edi,[dstofs]
|
pascal@19538
|
64
|
pascal@19515
|
65 ifndef pm_only
|
pascal@19538
|
66 mov eax,esi
|
pascal@19571
|
67 shr eax,cl
|
pascal@19515
|
68 mov edx,edi
|
pascal@19571
|
69 shr edx,cl
|
pascal@24034
|
70 lea ecx,[eax+edx]
|
pascal@24034
|
71 shr ecx,16 ; >1mb ?
|
pascal@19571
|
72 jnz @@pmcopy
|
pascal@19515
|
73 @@movlp:
|
pascal@19515
|
74 mov ds,ax
|
pascal@19515
|
75 mov es,dx
|
pascal@19515
|
76 inc ax
|
pascal@19515
|
77 inc dx
|
pascal@19538
|
78 mov cl,0Fh
|
pascal@19538
|
79 and si,cx
|
pascal@19538
|
80 and di,cx
|
pascal@19538
|
81 inc cx
|
pascal@19538
|
82 sub [sz],ecx
|
pascal@20534
|
83 jae @@movpara
|
pascal@20534
|
84 add ecx,[sz]
|
pascal@20534
|
85 @@movpara:
|
pascal@19538
|
86 rep movsb
|
pascal@19515
|
87 ja @@movlp
|
pascal@19571
|
88 jmp @@done
|
pascal@19515
|
89 endif
|
pascal@19571
|
90 @@pmcopy:
|
pascal@19538
|
91 else
|
pascal@19538
|
92
|
pascal@19538
|
93 push si
|
pascal@24034
|
94 push di
|
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@24034
|
102 les dx,[dword si+srcofs] ; srcofs, dstofs
|
pascal@24034
|
103 mov di,dx ; dstofs
|
pascal@24034
|
104 mov ax,es
|
pascal@21791
|
105 mov cl,4
|
pascal@21791
|
106 @@loop:
|
pascal@24034
|
107 shr ax,1 ; high
|
pascal@24034
|
108 rcr dx,1 ; low
|
pascal@21791
|
109 loop @@loop
|
pascal@24034
|
110 push dx ; srcseg, dstseg
|
pascal@24034
|
111 xchg ax,bx ; save/restore high srcreg
|
pascal@19538
|
112 xor si,-6
|
pascal@19538
|
113 jnz @@2flat
|
pascal@24034
|
114 or bx,ax ; srcseg & dstseg < 1mb ? clear C
|
pascal@19538
|
115 pop dx ; dstseg
|
pascal@19538
|
116 pop ax ; srcseg
|
pascal@24034
|
117 jnz @@pmcopy
|
pascal@24034
|
118 @@movlp: ; bx=cx=0
|
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@24034
|
125 and di,cx
|
pascal@19538
|
126 and si,[word srcofs]
|
pascal@19538
|
127 inc cx
|
pascal@19538
|
128 sub [word sz],cx
|
pascal@20520
|
129 ;jae @@movpara
|
pascal@23999
|
130 sbb [word sz+2],bx
|
pascal@20520
|
131 jae @@movpara
|
pascal@20520
|
132 add cx,[word sz]
|
pascal@20520
|
133 ;stc
|
pascal@20520
|
134 @@movpara:
|
pascal@19538
|
135 rep movsb
|
pascal@20485
|
136 jae @@movlp
|
pascal@24034
|
137 @@pmcopy:
|
pascal@19571
|
138 pop di
|
pascal@24034
|
139 pop si
|
pascal@24034
|
140 jc @@done16
|
pascal@19636
|
141 p386
|
pascal@20534
|
142 pushad ; struct declared in VCPI.ASM
|
pascal@19538
|
143 mov esi,[srcofs]
|
pascal@19538
|
144 mov edi,[dstofs]
|
pascal@19538
|
145
|
pascal@19538
|
146 endif
|
pascal@19538
|
147
|
pascal@19515
|
148 mov ecx,[sz]
|
pascal@19571
|
149 jecxz @@done
|
pascal@24034
|
150 cli
|
pascal@19538
|
151
|
pascal@24019
|
152 ifdef VCPI
|
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@24019
|
161 endif
|
pascal@19538
|
162 @@real_mode:
|
pascal@23996
|
163 oldGDTR = (pword srcseg) ; don't need src seg/ofs anymore
|
pascal@19515
|
164 sgdt [oldGDTR]
|
pascal@19515
|
165
|
pascal@19515
|
166 ;****** Load gdtr **********************************************
|
pascal@24034
|
167 ifdef LARGE_ZIMAGE
|
pascal@24034
|
168 local rflags: word, rds: word, \
|
pascal@24034
|
169 reax: dword, recx: dword, redx: dword, rebx: dword, \
|
pascal@24034
|
170 resp: dword, rebp: dword, resi: dword, redi: dword, \
|
pascal@24034
|
171 GDTR: pword = LOCAL_SIZE
|
pascal@24034
|
172 mov eax,cs
|
pascal@24034
|
173 shl eax,4
|
pascal@24034
|
174 addzx_e ax,<offset gdt_memcpy>
|
pascal@24034
|
175 push eax ; gdt_base_memcpy
|
pascal@24034
|
176 push -1 ; gdt_limit
|
pascal@24034
|
177 endif
|
pascal@24034
|
178
|
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@23996
|
184 lcr0 eax
|
pascal@19515
|
185 ;****** Move data **********************************************
|
pascal@19515
|
186 push 0008h
|
pascal@19515
|
187 pop ds ;base=0, lim = 4gb
|
pascal@19515
|
188 push ds ;
|
pascal@19515
|
189 pop es ;
|
pascal@24014
|
190 cmp esi,edi
|
pascal@24014
|
191 jae @@do_copy
|
pascal@24014
|
192 add esi,ecx ;src<dst: we must do
|
pascal@24014
|
193 add edi,ecx ; copy backwards to avoid
|
pascal@24014
|
194 std ; overwrite bug
|
pascal@24014
|
195 db 67h ;address width override for esi/edi
|
pascal@24014
|
196 cmpsb ; dec esi/edi
|
pascal@24014
|
197 @@do_copy:
|
pascal@19634
|
198 ;db 66h ;operand width override for ecx
|
pascal@19515
|
199 db 67h ;address width override for esi/edi
|
pascal@19515
|
200 rep movsb
|
pascal@19883
|
201 ;cld
|
pascal@19515
|
202
|
pascal@19515
|
203 ;****** Return to rm *******************************************
|
pascal@19515
|
204 dec ax ;CR0_PE off
|
pascal@23996
|
205 lcr0 eax
|
pascal@19515
|
206 ;****** Return *************************************************
|
pascal@19515
|
207 lgdt [oldGDTR]
|
pascal@24034
|
208 ifdef LARGE_ZIMAGE
|
pascal@24034
|
209 add sp,6
|
pascal@24034
|
210 endif
|
pascal@19571
|
211 @@done:
|
pascal@19538
|
212 popad
|
pascal@19636
|
213 p8086
|
pascal@19571
|
214 @@done16:
|
pascal@24034
|
215 pop ds
|
pascal@20534
|
216 popf ; restore I & D
|
pascal@19538
|
217 pop bp
|
pascal@20528
|
218 ret 14
|
pascal@19515
|
219
|
pascal@19515
|
220 ;****** Const data *********************************************
|
pascal@23996
|
221
|
pascal@24019
|
222 ifdef VCPI
|
pascal@23996
|
223 extrn gdt_memcpy
|
pascal@24019
|
224 else
|
pascal@24019
|
225 org $-8 ;save 8 bytes
|
pascal@24019
|
226 ;0000: unused
|
pascal@24019
|
227 gdt_memcpy dd ?,?
|
pascal@24019
|
228 ;0008: Data seg [0,FFFFFFFF]
|
pascal@24019
|
229 ; lim_lo base_lo
|
pascal@24019
|
230 dw 1111111111111111b, 0000000000000000b
|
pascal@24019
|
231 db 00000000b,10010010b,10001111b,00000000b
|
pascal@24019
|
232 ; base_med P S D A G ??l_hi base_hi
|
pascal@24019
|
233 ; Pl E W D
|
pascal@24019
|
234 endif
|
pascal@24034
|
235 ifndef LARGE_ZIMAGE
|
pascal@23996
|
236 label GDTR pword
|
pascal@23996
|
237 gdt_limit dw 0ffffh
|
pascal@23996
|
238 global gdt_base_memcpy:word
|
pascal@23996
|
239 gdt_base_memcpy dw offset gdt_memcpy,0
|
pascal@24034
|
240 endif
|
pascal@19515
|
241
|
pascal@20528
|
242 endp memcpy32
|
pascal@19515
|
243
|
pascal@19515
|
244 ends _TEXT
|
pascal@19515
|
245
|
pascal@19515
|
246 end
|
pascal@19515
|
247
|
pascal@19515
|
248 ;###### END OF FILE ############################################
|