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

linld/tazboot: fix memcpy32
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Apr 09 12:22:58 2017 +0200 (2017-04-09)
parents df6498976257
children 46b511e941a7
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@19515 5 %crefref
pascal@19515 6 %noincl
pascal@19515 7 %nomacs
pascal@19636 8 ifdef NO386
pascal@19636 9 p8086
pascal@19636 10 else
pascal@19515 11 p386
pascal@19636 12 endif
pascal@19515 13
pascal@19515 14 group DGROUP _TEXT,_DATA
pascal@19515 15 assume cs:DGROUP,ds:DGROUP
pascal@19515 16
pascal@19515 17 segment _DATA byte public use16 'DATA'
pascal@19515 18 ends _DATA
pascal@19515 19
pascal@19515 20 segment _TEXT byte public use16 'CODE'
pascal@19515 21
pascal@19515 22 ;***************************************************************
pascal@19515 23 ;void dos_shutdown()
pascal@19515 24 ;***************************************************************
pascal@19515 25 global dos_shutdown:near
pascal@19515 26 proc dos_shutdown near
pascal@19515 27
pascal@19515 28 dos_shutdown:
pascal@19538 29 ifndef NO386
pascal@19538 30 ;pusha
pascal@19538 31 else
pascal@19538 32 ;push bp si di
pascal@19538 33 endif
pascal@19515 34 xor bx,bx
pascal@19515 35 mov ds,bx
pascal@19538 36 ifndef NO386
pascal@19515 37 push [dword bx+4] ; save step
pascal@19515 38 mov ax,sp
pascal@19515 39 push ss
pascal@19515 40 push ax
pascal@19515 41 pop [dword cs:sssp]
pascal@19900 42 mov [word bx+4],offset step19
pascal@19538 43 else
pascal@19900 44 mov ax,offset step19
pascal@19900 45 xchg ax,[word bx+4]
pascal@19538 46 push [word bx+6]
pascal@19900 47 push ax ; save step
pascal@19538 48 mov [word cs:sssp],sp
pascal@19538 49 mov [word cs:sssp+2],ss
pascal@19538 50 endif
pascal@19515 51 ;cmp [byte bx+7],0F0h
pascal@19515 52 ;jnc notdos
pascal@19515 53 mov [bx+6],cs
pascal@19515 54 pushf
pascal@19515 55 pop ax
pascal@19515 56 inc ah ; set TF
pascal@19515 57 push ax
pascal@19515 58 popf
pascal@19636 59 jmp [dword bx+4*19h]
pascal@19515 60 doiret:
pascal@19515 61 iret
pascal@19515 62 sssp:
pascal@19515 63 dd 0
pascal@19515 64 step19:
pascal@19515 65 push bx
pascal@19515 66 push ds
pascal@19515 67 mov bx,sp
pascal@19515 68 lds bx,[dword ss:bx+4] ; read cs:ip
pascal@19515 69 cmp [word bx],19CDh ; int 19h ?
pascal@19515 70 pop ds
pascal@19515 71 pop bx
pascal@19515 72 jne doiret
pascal@19515 73 notdos:
pascal@19538 74 ifndef NO386
pascal@19515 75 lss sp,[dword cs:sssp]
pascal@19538 76 else
pascal@19900 77 lds ax,[dword cs:sssp]
pascal@19538 78 push ds
pascal@19538 79 pop ss
pascal@19900 80 xchg ax,sp
pascal@19538 81 endif
pascal@19515 82 xor bx,bx
pascal@19515 83 mov ds,bx
pascal@19538 84 ifndef NO386
pascal@19515 85 pop [dword bx+4] ; restore step
pascal@19538 86 ;popa
pascal@19538 87 else
pascal@19538 88 pop [word bx+4] ; restore step
pascal@19538 89 pop [word bx+6]
pascal@19538 90 ;pop di si bp
pascal@19538 91 endif
pascal@19515 92 push cs
pascal@19515 93 pop ds
pascal@19515 94 ret
pascal@19515 95
pascal@19515 96 endp dos_shutdown
pascal@19515 97
pascal@19515 98
pascal@19515 99 ;***************************************************************
pascal@19538 100 ;void memcpy32(u32 dstofs,u16 srcseg,u32 srcofs,u32 size);
pascal@19515 101 ;***************************************************************
pascal@19515 102 ;****** Uses: Flags
pascal@19515 103 ;***************************************************************
pascal@19515 104 global _memcpy32:near
pascal@19515 105 proc _memcpy32 near
pascal@19515 106
pascal@19515 107 ; rm32,imm16 helper
pascal@19515 108 macro addzx_e rm,i
pascal@19515 109 db 66h
pascal@19515 110 add rm,i
pascal@19515 111 dw 0
pascal@19515 112 endm
pascal@19538 113 arg dstofs :dword, \
pascal@19515 114 srcseg :word, \
pascal@19515 115 srcofs :dword, \
pascal@19515 116 sz :dword = PARAM_SIZE
pascal@19515 117
pascal@19515 118 local GDTR :pword, \
pascal@19515 119 oldGDTR :pword = TEMP_SIZE
pascal@19515 120
pascal@19515 121 ;****** Init ***************************************************
pascal@19634 122
pascal@19903 123 ifndef NO386
pascal@19634 124
pascal@19634 125 enter TEMP_SIZE,0
pascal@19571 126 ;cld
pascal@19515 127 pushf
pascal@19538 128 push ds es
pascal@19538 129 pushad
pascal@19571 130 mov cl,4
pascal@19515 131 movzx esi,[srcseg]
pascal@19571 132 shl esi,cl
pascal@19571 133 add esi,[srcofs]
pascal@19571 134 mov [srcofs],esi ; for memcpy_vcpi
pascal@19538 135 mov edi,[dstofs]
pascal@19538 136
pascal@19515 137 ifndef pm_only
pascal@19538 138 mov eax,esi
pascal@19571 139 shr eax,cl
pascal@19515 140 mov edx,edi
pascal@19571 141 shr edx,cl
pascal@19571 142 mov ecx,esi
pascal@19571 143 or ecx,edi
pascal@19571 144 shr ecx,20 ; >1mb ?
pascal@19571 145 jnz @@pmcopy
pascal@19515 146 @@movlp:
pascal@19515 147 mov ds,ax
pascal@19515 148 mov es,dx
pascal@19515 149 inc ax
pascal@19515 150 inc dx
pascal@19538 151 mov cl,0Fh
pascal@19538 152 and si,cx
pascal@19538 153 and di,cx
pascal@19538 154 inc cx
pascal@19538 155 sub [sz],ecx
pascal@19538 156 rep movsb
pascal@19515 157 ja @@movlp
pascal@19571 158 jmp @@done
pascal@19515 159 endif
pascal@19571 160 @@pmcopy:
pascal@19538 161 else
pascal@19538 162
pascal@19634 163 push bp
pascal@19634 164 mov bp,sp
pascal@19634 165 sub sp,TEMP_SIZE
pascal@19634 166 ;cld
pascal@19634 167 pushf
pascal@19634 168 push ds es
pascal@19538 169 push si
pascal@19538 170 xor bx,bx
pascal@19538 171 xor dx,dx
pascal@19538 172 xor si,si
pascal@19903 173 mov ax,[srcseg]
pascal@19883 174 mov cl,4
pascal@19883 175 extrn N_LXLSH@:near
pascal@19883 176 call near N_LXLSH@
pascal@19903 177 add [word srcofs],ax
pascal@19903 178 adc [word srcofs+2],dx
pascal@19538 179 @@2flat:
pascal@19903 180 mov ax,[word si+srcofs] ; srcofs, dstofs lo
pascal@19903 181 mov dx,[word si+srcofs+2] ; srcofs, dstofs hi
pascal@19884 182 extrn N_LXURSH@4:near
pascal@19538 183 call near N_LXURSH@4
pascal@19538 184 or bx,dx ; >=1mb flag
pascal@19538 185 push ax ; srcseg, dstseg
pascal@19538 186 xor si,-6
pascal@19538 187 jnz @@2flat
pascal@19538 188 pop dx ; dstseg
pascal@19538 189 pop ax ; srcseg
pascal@19903 190 dec bx ; <1mb ?
pascal@19903 191 jns @@pmcopy
pascal@19538 192 push di
pascal@19538 193 @@movlp:
pascal@19538 194 mov ds,ax
pascal@19538 195 mov es,dx
pascal@19538 196 inc ax
pascal@19538 197 inc dx
pascal@19538 198 mov cl,0Fh
pascal@19538 199 mov si,cx
pascal@19538 200 mov di,cx
pascal@19538 201 and si,[word srcofs]
pascal@19538 202 and di,[word dstofs]
pascal@19538 203 inc cx
pascal@19538 204 sub [word sz],cx
pascal@19538 205 rep movsb
pascal@19571 206 ja @@movlp
pascal@19538 207 dec [word sz+2]
pascal@19571 208 jns @@movlp ; mov 1-16 more bytes...
pascal@19571 209 pop di
pascal@19571 210 @@pmcopy:
pascal@19538 211 pop si
pascal@19571 212 js @@done16
pascal@19636 213 p386
pascal@19538 214 pushad
pascal@19538 215 mov esi,[srcofs]
pascal@19538 216 mov edi,[dstofs]
pascal@19538 217
pascal@19538 218 endif
pascal@19538 219
pascal@19515 220 mov ecx,[sz]
pascal@19571 221 jecxz @@done
pascal@19538 222
pascal@19538 223 smsw ax
pascal@19538 224 test al,1
pascal@19538 225 jz @@real_mode
pascal@19538 226 ; Note: bp points to std stack frame now. bp will be passed to
pascal@19538 227 ; pm routine. This allows params to be passed on stack
pascal@19538 228 extrn do_memcpy_vcpi:near
pascal@19538 229 push offset do_memcpy_vcpi
pascal@19538 230 extrn call_pm_routine:near
pascal@19538 231 call near call_pm_routine ; Call pm copy routine via vcpi pm
pascal@19538 232 pop ax
pascal@19571 233 jmp @@done
pascal@19538 234 @@real_mode:
pascal@19515 235 cmp esi,edi
pascal@19515 236 jae @@do_copy
pascal@19515 237 add esi,ecx ;src<dst: we must do
pascal@19515 238 dec esi ; copy backwards to avoid
pascal@19515 239 add edi,ecx ; overwrite bug
pascal@19515 240 dec edi ;
pascal@19515 241 std ;
pascal@19515 242 @@do_copy:
pascal@19515 243 cli
pascal@19515 244 sgdt [oldGDTR]
pascal@19515 245
pascal@19515 246 ;****** Load gdtr **********************************************
pascal@19515 247 mov eax,cs
pascal@19515 248 shl eax,4
pascal@19515 249 addzx_e ax,<offset GDT>
pascal@19634 250 or [word GDTR],-1 ;GDT limit = 0FFFFh
pascal@19515 251 mov [dword GDTR+2],eax ;GDT base
pascal@19515 252 lgdt [GDTR]
pascal@19515 253
pascal@19515 254 ;****** Go into pm *********************************************
pascal@19515 255 mov eax,cr0
pascal@19571 256 inc ax ;CR0_PE on
pascal@19515 257 mov cr0,eax
pascal@19515 258 jmp short $+2 ;*Required*!
pascal@19515 259 ;3+ NOPs also work fine (chkd on 386)
pascal@19515 260 ;****** Move data **********************************************
pascal@19515 261 push 0008h
pascal@19515 262 pop ds ;base=0, lim = 4gb
pascal@19515 263 push ds ;
pascal@19515 264 pop es ;
pascal@19634 265 ;db 66h ;operand width override for ecx
pascal@19515 266 db 67h ;address width override for esi/edi
pascal@19515 267 rep movsb
pascal@19883 268 ;cld
pascal@19515 269
pascal@19515 270 ;****** Return to rm *******************************************
pascal@19515 271 dec ax ;CR0_PE off
pascal@19515 272 mov cr0,eax ;ds/es limits are *not* reset to 64kb
pascal@19515 273 ; but who cares :-)
pascal@19515 274 jmp short $+2
pascal@19515 275
pascal@19515 276 ;****** Return *************************************************
pascal@19515 277 lgdt [oldGDTR]
pascal@19571 278 @@done:
pascal@19538 279 popad
pascal@19636 280 p8086
pascal@19571 281 @@done16:
pascal@19538 282 pop es ds
pascal@19515 283 popf
pascal@19634 284 ifndef NO386
pascal@19636 285 p386
pascal@19634 286 leave
pascal@19634 287 else
pascal@19538 288 mov sp,bp
pascal@19538 289 pop bp
pascal@19634 290 endif
pascal@19515 291 ret
pascal@19515 292
pascal@19515 293 ;****** Const data *********************************************
pascal@19515 294 org $-8 ;save 8 bytes - they are unused anyway
pascal@19515 295 ;0000: unused
pascal@19515 296 GDT dd ?,?
pascal@19515 297 ;0008: Data seg [0,FFFFFFFF]
pascal@19515 298 ; lim_lo base_lo
pascal@19515 299 dw 1111111111111111b, 0000000000000000b
pascal@19515 300 db 00000000b,10010010b,10001111b,00000000b
pascal@19515 301 ; base_med P S D A G ??l_hi base_hi
pascal@19515 302 ; Pl E W D
pascal@19515 303
pascal@19515 304 endp _memcpy32
pascal@19515 305
pascal@19515 306 ends _TEXT
pascal@19515 307
pascal@19515 308 end
pascal@19515 309
pascal@19515 310 ;###### END OF FILE ############################################