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

bluez: add /usr/bin/bluepin
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Apr 03 17:30:48 2017 +0200 (2017-04-03)
parents a7fbb1c5c71a
children df6498976257
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@19884 180 extrn N_LXURSH@4:near
pascal@19538 181 call near N_LXURSH@4
pascal@19538 182 or bx,dx ; >=1mb flag
pascal@19538 183 push ax ; srcseg, dstseg
pascal@19538 184 xor si,-6
pascal@19538 185 jnz @@2flat
pascal@19538 186 pop dx ; dstseg
pascal@19538 187 pop ax ; srcseg
pascal@19571 188 test bx,bx ; <1mb ? (clear C)
pascal@19571 189 jnz @@pmcopy
pascal@19538 190 push di
pascal@19538 191 @@movlp:
pascal@19538 192 mov ds,ax
pascal@19538 193 mov es,dx
pascal@19538 194 inc ax
pascal@19538 195 inc dx
pascal@19538 196 mov cl,0Fh
pascal@19538 197 mov si,cx
pascal@19538 198 mov di,cx
pascal@19538 199 and si,[word srcofs]
pascal@19538 200 and di,[word dstofs]
pascal@19538 201 inc cx
pascal@19538 202 sub [word sz],cx
pascal@19538 203 rep movsb
pascal@19571 204 ja @@movlp
pascal@19538 205 dec [word sz+2]
pascal@19571 206 jns @@movlp ; mov 1-16 more bytes...
pascal@19571 207 pop di
pascal@19571 208 @@pmcopy:
pascal@19538 209 pop si
pascal@19571 210 js @@done16
pascal@19636 211 p386
pascal@19538 212 pushad
pascal@19538 213 mov esi,[srcofs]
pascal@19538 214 mov edi,[dstofs]
pascal@19538 215
pascal@19538 216 endif
pascal@19538 217
pascal@19515 218 mov ecx,[sz]
pascal@19571 219 jecxz @@done
pascal@19538 220
pascal@19538 221 smsw ax
pascal@19538 222 test al,1
pascal@19538 223 jz @@real_mode
pascal@19538 224 ; Note: bp points to std stack frame now. bp will be passed to
pascal@19538 225 ; pm routine. This allows params to be passed on stack
pascal@19538 226 extrn do_memcpy_vcpi:near
pascal@19538 227 push offset do_memcpy_vcpi
pascal@19538 228 extrn call_pm_routine:near
pascal@19538 229 call near call_pm_routine ; Call pm copy routine via vcpi pm
pascal@19538 230 pop ax
pascal@19571 231 jmp @@done
pascal@19538 232 @@real_mode:
pascal@19515 233 cmp esi,edi
pascal@19515 234 jae @@do_copy
pascal@19515 235 add esi,ecx ;src<dst: we must do
pascal@19515 236 dec esi ; copy backwards to avoid
pascal@19515 237 add edi,ecx ; overwrite bug
pascal@19515 238 dec edi ;
pascal@19515 239 std ;
pascal@19515 240 @@do_copy:
pascal@19515 241 cli
pascal@19515 242 sgdt [oldGDTR]
pascal@19515 243
pascal@19515 244 ;****** Load gdtr **********************************************
pascal@19515 245 mov eax,cs
pascal@19515 246 shl eax,4
pascal@19515 247 addzx_e ax,<offset GDT>
pascal@19634 248 or [word GDTR],-1 ;GDT limit = 0FFFFh
pascal@19515 249 mov [dword GDTR+2],eax ;GDT base
pascal@19515 250 lgdt [GDTR]
pascal@19515 251
pascal@19515 252 ;****** Go into pm *********************************************
pascal@19515 253 mov eax,cr0
pascal@19571 254 inc ax ;CR0_PE on
pascal@19515 255 mov cr0,eax
pascal@19515 256 jmp short $+2 ;*Required*!
pascal@19515 257 ;3+ NOPs also work fine (chkd on 386)
pascal@19515 258 ;****** Move data **********************************************
pascal@19515 259 push 0008h
pascal@19515 260 pop ds ;base=0, lim = 4gb
pascal@19515 261 push ds ;
pascal@19515 262 pop es ;
pascal@19634 263 ;db 66h ;operand width override for ecx
pascal@19515 264 db 67h ;address width override for esi/edi
pascal@19515 265 rep movsb
pascal@19883 266 ;cld
pascal@19515 267
pascal@19515 268 ;****** Return to rm *******************************************
pascal@19515 269 dec ax ;CR0_PE off
pascal@19515 270 mov cr0,eax ;ds/es limits are *not* reset to 64kb
pascal@19515 271 ; but who cares :-)
pascal@19515 272 jmp short $+2
pascal@19515 273
pascal@19515 274 ;****** Return *************************************************
pascal@19515 275 lgdt [oldGDTR]
pascal@19571 276 @@done:
pascal@19538 277 popad
pascal@19636 278 p8086
pascal@19571 279 @@done16:
pascal@19538 280 pop es ds
pascal@19515 281 popf
pascal@19634 282 ifndef NO386
pascal@19636 283 p386
pascal@19634 284 leave
pascal@19634 285 else
pascal@19538 286 mov sp,bp
pascal@19538 287 pop bp
pascal@19634 288 endif
pascal@19515 289 ret
pascal@19515 290
pascal@19515 291 ;****** Const data *********************************************
pascal@19515 292 org $-8 ;save 8 bytes - they are unused anyway
pascal@19515 293 ;0000: unused
pascal@19515 294 GDT dd ?,?
pascal@19515 295 ;0008: Data seg [0,FFFFFFFF]
pascal@19515 296 ; lim_lo base_lo
pascal@19515 297 dw 1111111111111111b, 0000000000000000b
pascal@19515 298 db 00000000b,10010010b,10001111b,00000000b
pascal@19515 299 ; base_med P S D A G ??l_hi base_hi
pascal@19515 300 ; Pl E W D
pascal@19515 301
pascal@19515 302 endp _memcpy32
pascal@19515 303
pascal@19515 304 ends _TEXT
pascal@19515 305
pascal@19515 306 end
pascal@19515 307
pascal@19515 308 ;###### END OF FILE ############################################