wok annotate linld/stuff/src/MEMCPY32.ASM @ rev 24924

Add as & asxxxx
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Apr 13 10:27:34 2022 +0000 (2022-04-13)
parents 217c02cbbe8d
children
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 ############################################