wok diff linld/stuff/memcpy32.u @ rev 22491
updated apr and apr-dev (1.4.6 -> 1.7.0)
author | Hans-G?nter Theisgen |
---|---|
date | Tue Dec 31 14:21:42 2019 +0100 (2019-12-31) |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/linld/stuff/memcpy32.u Tue Dec 31 14:21:42 2019 +0100 1.3 @@ -0,0 +1,117 @@ 1.4 +--- LINLD097/MEMCPY32.ASM 1.5 ++++ LINLD097/MEMCPY32.ASM 1.6 +@@ -22,70 +22,34 @@ 1.7 + global _is_rm32:near 1.8 + proc _is_rm32 near 1.9 + 1.10 +- pushf 1.11 +- cli 1.12 ++ pushf 1.13 ++ push dx 1.14 + ; Check for oldies 1.15 +- push sp 1.16 +- pop ax 1.17 +- cmp ax,sp 1.18 +- jne @@bad ;it is a 86/186, not a 286+ 1.19 ++ mov ax, 0F000h 1.20 ++ push ax ; < 286 : flags[12..15] are forced 1 1.21 ++ popf ; = 286 : flags[12..15] are forced 0 1.22 ++ pushf ; > 286 : only flags[15] is forced 0 1.23 ++ pop dx 1.24 ++ add dh,ah ; NS=386+, NC=286 1.25 ++ stc 1.26 ++ js @@bad ;it is a 86/186/286, not a 386+ 1.27 + ; Check for vm 1.28 + smsw ax ;SMSW cannot be trapped! :-) 1.29 + test al,1 ;MSW_PE 1.30 +- 1.31 +-; We're in vm, this is 386+ (there is no vm in 286) 1.32 ++; We're in vm 1.33 + jnz check_vcpi 1.34 + 1.35 +-; We're in rm, chk for 386+ 1.36 +- push ds dx 1.37 +- push 0 1.38 +- pop ds 1.39 +- mov ax,offset excp6 1.40 +- mov dx,cs 1.41 +- xchg [06h*4 ],ax 1.42 +- xchg [06h*4+2],dx 1.43 +- ;cmp sp,sp ;sets ZF - already done 1.44 +- xchg eax,eax ;triggers excp6 on 286 - clears ZF 1.45 +- mov [06h*4 ],ax 1.46 +- mov [06h*4+2],dx 1.47 +- pop dx ds 1.48 +- jnz @@bad ;it's a 286 1.49 +- 1.50 + ; It's a 386 in real mode, chk for paging (crazy but possible) 1.51 +- push eax 1.52 + mov eax,cr0 1.53 + shl eax,1 ;CR0_PG to CF 1.54 +- pop eax 1.55 +- jc @@bad ;CR0_PG was set - real mode paging 1.56 +-@@386rm: 1.57 +- mov ax,1 1.58 +- popf 1.59 +- ret 1.60 +-@@bad: xor ax,ax 1.61 +- popf 1.62 +- ret 1.63 ++@@bad: sbb ax,ax ; ax=0h+!CF 1.64 ++ inc ax 1.65 ++ jmp @@end 1.66 + 1.67 + ;*************************************************************** 1.68 +-;****** Helper int 6 handler: clears ZF, moves IP by 2 bytes 1.69 +-;*************************************************************** 1.70 +-label excp6 near 1.71 +-@@oldFlags = (word bp+6) 1.72 +-@@oldCS = (word bp+4) 1.73 +-@@oldIP = (word bp+2) 1.74 +-@@oldBP = (word bp+0) 1.75 +-@@Flags_ZF = 0040h 1.76 +- push bp 1.77 +- mov bp,sp 1.78 +- add [@@oldIP],2 1.79 +- and [byte low @@oldFlags],not @@Flags_ZF 1.80 +- pop bp 1.81 +- iret 1.82 +- 1.83 +-;*************************************************************** 1.84 + ;****** Helper: checks for vcpi 1.85 + ;*************************************************************** 1.86 + label check_vcpi near 1.87 +- push dx 1.88 + push ds 1.89 + ; Check whether it is safe to call 67h (we trust only known EMM managers) 1.90 + push 0 1.91 +@@ -119,6 +83,7 @@ 1.92 + ;;push dx ;$ save handle 1.93 + mov ax,0DE00h ; check for vcpi present 1.94 + int 67h 1.95 ++ mov al,2 1.96 + test ah,ah 1.97 + jz @@386vcpi 1.98 + ;;pop dx ;$ handle 1.99 +@@ -126,11 +91,10 @@ 1.100 + ;;int 67h 1.101 + @@no_vcpi: 1.102 + xor ax,ax 1.103 +- jmp @@ret 1.104 + @@386vcpi: 1.105 +- mov ax,2 1.106 + @@ret: 1.107 + pop ds 1.108 ++@@end: 1.109 + pop dx 1.110 + popf 1.111 + ret 1.112 +@@ -214,7 +178,7 @@ 1.113 + jmp short $+2 1.114 + 1.115 + ;****** Return ************************************************* 1.116 +-@@ret: lgdt [oldGDTR] 1.117 ++ lgdt [oldGDTR] 1.118 + pop edi esi ecx eax ds es 1.119 + popf 1.120 + leave