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@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@19515
|
27 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
28
|
pascal@19515
|
29 ;***************************************************************
|
pascal@19538
|
30 ;void memcpy32(u32 dstofs,u16 srcseg,u32 srcofs,u32 size);
|
pascal@19515
|
31 ;***************************************************************
|
pascal@19515
|
32 ;****** Uses: Flags
|
pascal@19515
|
33 ;***************************************************************
|
pascal@20528
|
34 global memcpy32:near
|
pascal@20528
|
35 proc memcpy32 near
|
pascal@19515
|
36
|
pascal@19538
|
37 arg dstofs :dword, \
|
pascal@19515
|
38 srcseg :word, \
|
pascal@19515
|
39 srcofs :dword, \
|
pascal@19515
|
40 sz :dword = PARAM_SIZE
|
pascal@19515
|
41
|
pascal@19515
|
42 ;****** Init ***************************************************
|
pascal@19634
|
43
|
pascal@19903
|
44 ifndef NO386
|
pascal@19634
|
45
|
pascal@23996
|
46 enter 0,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 ;cld
|
pascal@19634
|
90 pushf
|
pascal@19634
|
91 push ds es
|
pascal@19538
|
92 push si
|
pascal@19538
|
93 xor bx,bx
|
pascal@19538
|
94 xor si,si
|
pascal@19903
|
95 mov ax,[srcseg]
|
pascal@20528
|
96 extrn N_LXLSH@4:near
|
pascal@20528
|
97 call near ptr N_LXLSH@4
|
pascal@19903
|
98 add [word srcofs],ax
|
pascal@19903
|
99 adc [word srcofs+2],dx
|
pascal@19538
|
100 @@2flat:
|
pascal@21791
|
101 les ax,[dword si+srcofs] ; srcofs, dstofs
|
pascal@21791
|
102 mov dx,es
|
pascal@21791
|
103 mov cl,4
|
pascal@21791
|
104 @@loop:
|
pascal@21791
|
105 shr dx,1
|
pascal@21791
|
106 rcr ax,1
|
pascal@21791
|
107 loop @@loop
|
pascal@19538
|
108 or bx,dx ; >=1mb flag
|
pascal@19538
|
109 push ax ; srcseg, dstseg
|
pascal@19538
|
110 xor si,-6
|
pascal@19538
|
111 jnz @@2flat
|
pascal@19538
|
112 pop dx ; dstseg
|
pascal@19538
|
113 pop ax ; srcseg
|
pascal@23999
|
114 cmp bx,si ; <1mb ?
|
pascal@23999
|
115 jne @@pmcopy
|
pascal@19538
|
116 push di
|
pascal@19538
|
117 @@movlp:
|
pascal@19538
|
118 mov ds,ax
|
pascal@19538
|
119 mov es,dx
|
pascal@19538
|
120 inc ax
|
pascal@19538
|
121 inc dx
|
pascal@19538
|
122 mov cl,0Fh
|
pascal@19538
|
123 mov si,cx
|
pascal@19538
|
124 mov di,cx
|
pascal@19538
|
125 and si,[word srcofs]
|
pascal@19538
|
126 and di,[word dstofs]
|
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@19571
|
137 pop di
|
pascal@23999
|
138 jmp @@done16
|
pascal@19571
|
139 @@pmcopy:
|
pascal@19636
|
140 p386
|
pascal@20534
|
141 pushad ; struct declared in VCPI.ASM
|
pascal@19538
|
142 mov esi,[srcofs]
|
pascal@19538
|
143 mov edi,[dstofs]
|
pascal@19538
|
144
|
pascal@19538
|
145 endif
|
pascal@19538
|
146
|
pascal@19515
|
147 mov ecx,[sz]
|
pascal@19571
|
148 jecxz @@done
|
pascal@19538
|
149
|
pascal@24019
|
150 ifdef VCPI
|
pascal@19538
|
151 smsw ax
|
pascal@20453
|
152 and al,1 ;MSW_PE
|
pascal@19538
|
153 jz @@real_mode
|
pascal@19538
|
154 ; Note: bp points to std stack frame now. bp will be passed to
|
pascal@19538
|
155 ; pm routine. This allows params to be passed on stack
|
pascal@20534
|
156 extrn vcpi_pm_copy_routine:near
|
pascal@20534
|
157 call near vcpi_pm_copy_routine ; Call pm copy routine via vcpi pm
|
pascal@19571
|
158 jmp @@done
|
pascal@24019
|
159 endif
|
pascal@19538
|
160 @@real_mode:
|
pascal@19515
|
161 cli
|
pascal@23996
|
162 oldGDTR = (pword srcseg) ; don't need src seg/ofs anymore
|
pascal@19515
|
163 sgdt [oldGDTR]
|
pascal@19515
|
164
|
pascal@19515
|
165 ;****** Load gdtr **********************************************
|
pascal@19515
|
166 lgdt [GDTR]
|
pascal@19515
|
167
|
pascal@19515
|
168 ;****** Go into pm *********************************************
|
pascal@19515
|
169 mov eax,cr0
|
pascal@19571
|
170 inc ax ;CR0_PE on
|
pascal@23996
|
171 lcr0 eax
|
pascal@19515
|
172 ;****** Move data **********************************************
|
pascal@19515
|
173 push 0008h
|
pascal@19515
|
174 pop ds ;base=0, lim = 4gb
|
pascal@19515
|
175 push ds ;
|
pascal@19515
|
176 pop es ;
|
pascal@24014
|
177 cmp esi,edi
|
pascal@24014
|
178 jae @@do_copy
|
pascal@24014
|
179 add esi,ecx ;src<dst: we must do
|
pascal@24014
|
180 add edi,ecx ; copy backwards to avoid
|
pascal@24014
|
181 std ; overwrite bug
|
pascal@24014
|
182 db 67h ;address width override for esi/edi
|
pascal@24014
|
183 cmpsb ; dec esi/edi
|
pascal@24014
|
184 @@do_copy:
|
pascal@19634
|
185 ;db 66h ;operand width override for ecx
|
pascal@19515
|
186 db 67h ;address width override for esi/edi
|
pascal@19515
|
187 rep movsb
|
pascal@19883
|
188 ;cld
|
pascal@19515
|
189
|
pascal@19515
|
190 ;****** Return to rm *******************************************
|
pascal@19515
|
191 dec ax ;CR0_PE off
|
pascal@23996
|
192 lcr0 eax
|
pascal@19515
|
193 ;****** Return *************************************************
|
pascal@19515
|
194 lgdt [oldGDTR]
|
pascal@19571
|
195 @@done:
|
pascal@19538
|
196 popad
|
pascal@19636
|
197 p8086
|
pascal@19571
|
198 @@done16:
|
pascal@23999
|
199 ifdef NO386
|
pascal@23999
|
200 pop si
|
pascal@23999
|
201 endif
|
pascal@19538
|
202 pop es ds
|
pascal@20534
|
203 popf ; restore I & D
|
pascal@19634
|
204 ifndef NO386
|
pascal@19636
|
205 p386
|
pascal@19634
|
206 leave
|
pascal@19634
|
207 else
|
pascal@19538
|
208 pop bp
|
pascal@19634
|
209 endif
|
pascal@20528
|
210 ret 14
|
pascal@19515
|
211
|
pascal@19515
|
212 ;****** Const data *********************************************
|
pascal@23996
|
213
|
pascal@24019
|
214 ifdef VCPI
|
pascal@23996
|
215 extrn gdt_memcpy
|
pascal@24019
|
216 else
|
pascal@24019
|
217 org $-8 ;save 8 bytes
|
pascal@24019
|
218 ;0000: unused
|
pascal@24019
|
219 gdt_memcpy dd ?,?
|
pascal@24019
|
220 ;0008: Data seg [0,FFFFFFFF]
|
pascal@24019
|
221 ; lim_lo base_lo
|
pascal@24019
|
222 dw 1111111111111111b, 0000000000000000b
|
pascal@24019
|
223 db 00000000b,10010010b,10001111b,00000000b
|
pascal@24019
|
224 ; base_med P S D A G ??l_hi base_hi
|
pascal@24019
|
225 ; Pl E W D
|
pascal@24019
|
226 endif
|
pascal@23996
|
227 label GDTR pword
|
pascal@23996
|
228 gdt_limit dw 0ffffh
|
pascal@23996
|
229 global gdt_base_memcpy:word
|
pascal@23996
|
230 gdt_base_memcpy dw offset gdt_memcpy,0
|
pascal@19515
|
231
|
pascal@20528
|
232 endp memcpy32
|
pascal@19515
|
233
|
pascal@19515
|
234 ends _TEXT
|
pascal@19515
|
235
|
pascal@19515
|
236 end
|
pascal@19515
|
237
|
pascal@19515
|
238 ;###### END OF FILE ############################################
|