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

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