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

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