ReC98/libs/BorlandC/h_pada.asm

110 lines
3.2 KiB
NASM

; *Not* the original file, but an edit to turn it into an includable slice.
; Changes include:
; * removal of RULES.ASI to eliminate redundancy
; * removal of the 'CODE' segment declaration (for obvious reasons)
;[]-----------------------------------------------------------------[]
;| H_PADA.ASM -- long pointer routines |
;[]-----------------------------------------------------------------[]
;
; C/C++ Run Time Library - Version 5.0
;
; Copyright (c) 1987, 1992 by Borland International
; All Rights Reserved.
;
; calls to these routines are generated by the compiler to perform
; arithmetic operations on long pointers.
public PADA@
public F_PADA@
public N_PADA@
N_PADA@:
pop es ;fix up far return
push cs
push es
PADA@:
F_PADA@:
mov es,dx
xchg ax,bx
;
; Pointer to memory cell to increment is in es:bx
; Increment amount is ax:cx
;
mov dx, es:2[bx] ; DX <- Selector
push bx
mov bx, es:[bx] ; BX <- Offset
or cx,cx ; Is increment negative?
jge ada1 ; No, ...
not ax ; Yes, ...
not cx
add ax,1
adc cx,0
jmp sba1
ada1:
add bx,ax ; Add offsets
jnc adaok
add dx,1000h
adaok:
mov ah,cl
mov cl,4
shl ah,cl
xor al,al
add dx,ax
mov ch,bl
shr bx,cl
add dx,bx
mov al,ch
and ax,0fh
pop bx
mov es:[bx], ax
mov es:2[bx], dx
retf
public PSBA@
public F_PSBA@
public N_PSBA@
N_PSBA@:
pop es ;fix up far return
push cs
push es
PSBA@:
F_PSBA@:
mov es,dx
xchg ax,bx
;
; Pointer to memory cell to increment is in es:bx
; Increment amount is ax:cx
;
mov dx,es:2[bx]
push bx
mov bx,es:[bx]
or cx,cx
jge sba1
not ax
not cx
add ax,1
adc cx,0
jmp ada1
sba1:
sub bx,ax
jnc sbaok
sub dx,1000h
sbaok:
mov ah,cl
mov cl,4
shl ah,cl
xor al,al
sub dx,ax
mov ch,bl
shr bx,cl
add dx,bx
mov al,ch
and ax,0fh
pop bx
mov es:[bx],ax
mov es:2[bx],dx
retf