221 lines
3.9 KiB
NASM
221 lines
3.9 KiB
NASM
|
;; Copyright (c) 1992,1993-1995 Argonaut Technologies Limited. All rights reserved.
|
||
|
;;
|
||
|
;; $Id: realmem.asm 2.1 1995/11/29 14:13:41 sam Exp $
|
||
|
;; $Locker: $
|
||
|
;;
|
||
|
;; Support routines for accessing real memory
|
||
|
;;
|
||
|
.386p
|
||
|
.model flat,c
|
||
|
|
||
|
.data
|
||
|
extern _RealSelector:word
|
||
|
|
||
|
.code
|
||
|
|
||
|
; void BR_RESIDENT_ENTRY HostRealBlockWrite(short offset, short seg, char *block, int count);
|
||
|
;
|
||
|
HostRealBlockWrite proc uses es esi edi, p_off:dword, p_seg:dword, block:dword, count:dword
|
||
|
|
||
|
mov es,_RealSelector
|
||
|
mov edi,p_seg
|
||
|
shl edi,4
|
||
|
add edi,p_off
|
||
|
|
||
|
mov esi,block
|
||
|
mov ecx,count
|
||
|
shr ecx,1
|
||
|
rep movsw
|
||
|
adc ecx,ecx
|
||
|
rep movsb
|
||
|
ret
|
||
|
HostRealBlockWrite endp
|
||
|
|
||
|
; void BR_RESIDENT_ENTRY HostRealBlockFill(short offset, short seg, unsigned byte value, int count);
|
||
|
;
|
||
|
HostRealBlockFill proc uses es esi edi, p_off:dword, p_seg:dword, value:dword, count:dword
|
||
|
|
||
|
mov es,_RealSelector
|
||
|
mov edi,p_seg
|
||
|
shl edi,4
|
||
|
add edi,p_off
|
||
|
|
||
|
mov al,byte ptr value
|
||
|
mov ecx,count
|
||
|
mov ah,al
|
||
|
shr ecx,1
|
||
|
rep stosw
|
||
|
adc ecx,ecx
|
||
|
rep stosb
|
||
|
ret
|
||
|
HostRealBlockFill endp
|
||
|
|
||
|
; void BR_RESIDENT_ENTRY HostRealBlockRead(short offset, short seg, char *block, int count);
|
||
|
;
|
||
|
HostRealBlockRead proc uses ds esi edi, p_off:dword, p_seg:dword, block:dword, count:dword
|
||
|
|
||
|
mov ds,_RealSelector
|
||
|
mov esi,p_seg
|
||
|
shl esi,4
|
||
|
add esi,p_off
|
||
|
|
||
|
mov edi,block
|
||
|
mov ecx,count
|
||
|
shr ecx,1
|
||
|
rep movsw
|
||
|
adc ecx,ecx
|
||
|
rep movsb
|
||
|
ret
|
||
|
HostRealBlockRead endp
|
||
|
|
||
|
; int BR_RESIDENT_ENTRY HostRealStringWrite(short offset, short seg, char *block, int max);
|
||
|
;
|
||
|
HostRealStringWrite proc uses es esi edi, p_off:dword, p_seg:dword, block:dword, count:dword
|
||
|
|
||
|
mov es,_RealSelector
|
||
|
mov edi,p_seg
|
||
|
shl edi,4
|
||
|
add edi,p_off
|
||
|
|
||
|
mov esi,block
|
||
|
mov ecx,count
|
||
|
xor eax,eax
|
||
|
and ecx,ecx
|
||
|
je exit
|
||
|
|
||
|
lp: mov dl,[esi]
|
||
|
mov es:[edi],dl
|
||
|
inc eax
|
||
|
and dl,dl
|
||
|
je exit
|
||
|
inc esi
|
||
|
inc edi
|
||
|
dec ecx
|
||
|
jne lp
|
||
|
|
||
|
mov byte ptr es:[edi-1],0
|
||
|
exit:
|
||
|
ret
|
||
|
|
||
|
HostRealStringWrite endp
|
||
|
|
||
|
; int BR_RESIDENT_ENTRY HostRealStringRead(short offset, short seg, char *block, int max);
|
||
|
;
|
||
|
HostRealStringRead proc uses es esi edi, p_off:dword, p_seg:dword, block:dword, count:dword
|
||
|
|
||
|
mov es,_RealSelector
|
||
|
mov edi,p_seg
|
||
|
shl edi,4
|
||
|
add edi,p_off
|
||
|
|
||
|
mov esi,block
|
||
|
mov ecx,count
|
||
|
xor eax,eax
|
||
|
and ecx,ecx
|
||
|
je exit
|
||
|
|
||
|
lp:
|
||
|
mov dl,es:[edi]
|
||
|
mov [esi],dl
|
||
|
inc eax
|
||
|
and dl,dl
|
||
|
je exit
|
||
|
inc esi
|
||
|
inc edi
|
||
|
dec ecx
|
||
|
jne lp
|
||
|
|
||
|
mov byte ptr [esi-1],0
|
||
|
exit:
|
||
|
ret
|
||
|
HostRealStringRead endp
|
||
|
|
||
|
|
||
|
; void BR_RESIDENT_ENTRY HostRealByteWrite(short offset, short seg, char value);
|
||
|
;
|
||
|
HostRealByteWrite proc uses ds, p_off:dword, p_seg:dword, value:dword
|
||
|
|
||
|
mov ds,_RealSelector
|
||
|
mov edx,p_seg
|
||
|
shl edx,4
|
||
|
add edx,p_off
|
||
|
|
||
|
mov al,byte ptr value
|
||
|
mov [edx],al
|
||
|
ret
|
||
|
HostRealByteWrite endp
|
||
|
|
||
|
; unsigned char BR_RESIDENT_ENTRY HostRealByteRead(short offset, short seg);
|
||
|
;
|
||
|
HostRealByteRead proc uses ds, p_off:dword, p_seg:dword
|
||
|
|
||
|
mov ds,_RealSelector
|
||
|
mov eax,p_seg
|
||
|
shl eax,4
|
||
|
add eax,p_off
|
||
|
|
||
|
mov al,[eax]
|
||
|
ret
|
||
|
HostRealByteRead endp
|
||
|
|
||
|
; void BR_RESIDENT_ENTRY HostRealWordWrite(short offset, short seg, unsigned short value);
|
||
|
;
|
||
|
HostRealWordWrite proc uses ds, p_off:dword, p_seg:dword, value:dword
|
||
|
|
||
|
mov ds,_RealSelector
|
||
|
mov edx,p_seg
|
||
|
shl edx,4
|
||
|
add edx,p_off
|
||
|
|
||
|
mov ax,word ptr value
|
||
|
mov [edx],ax
|
||
|
ret
|
||
|
HostRealWordWrite endp
|
||
|
|
||
|
; unsigned short BR_RESIDENT_ENTRY HostRealWordRead(short offset, short seg);
|
||
|
;
|
||
|
HostRealWordRead proc uses ds, p_off:dword, p_seg:dword
|
||
|
|
||
|
mov ds,_RealSelector
|
||
|
mov eax,p_seg
|
||
|
shl eax,4
|
||
|
add eax,p_off
|
||
|
|
||
|
mov ax,[eax]
|
||
|
ret
|
||
|
HostRealWordRead endp
|
||
|
|
||
|
; void BR_RESIDENT_ENTRY HostRealDWordWrite(short offset, short seg, unsigned long value);
|
||
|
;
|
||
|
HostRealDWordWrite proc uses ds, p_off:dword, p_seg:dword, value:dword
|
||
|
|
||
|
mov ds,_RealSelector
|
||
|
mov edx,p_seg
|
||
|
shl edx,4
|
||
|
add edx,p_off
|
||
|
|
||
|
mov eax,value
|
||
|
mov [edx],eax
|
||
|
ret
|
||
|
HostRealDWordWrite endp
|
||
|
|
||
|
; unsigned long BR_RESIDENT_ENTRY HostRealDWordRead(short offset, short seg);
|
||
|
;
|
||
|
HostRealDWordRead proc uses ds, p_off:dword, p_seg:dword
|
||
|
|
||
|
mov ds,_RealSelector
|
||
|
mov edx,p_seg
|
||
|
shl edx,4
|
||
|
add edx,p_off
|
||
|
|
||
|
mov eax,p_seg
|
||
|
shl eax,4
|
||
|
add eax,p_off
|
||
|
|
||
|
mov eax,[eax]
|
||
|
ret
|
||
|
HostRealDWordRead endp
|
||
|
|
||
|
end
|
||
|
|