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

syslinux: fix build
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Feb 28 16:32:57 2021 +0000 (2021-02-28)
parents c1844f1c4954
children 217c02cbbe8d
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 ############################################