.286p
include cmacros.inc

?WIN=1      ; Use Windows prolog/epilog
?PLM=1      ; Use PASCAL calling convention

externW __ahincr

sBegin  CODE            ;INIT_TEXT
assumes cs,CODE ;INIT_TEXT
assumes ds,DATA

cProc HugeOffset,<NEAR, PUBLIC>
parmD   pSrc
parmD   cb
cBegin
        mov     ax, SEG_cb
        mov     dx, ax
        mov     ax, OFF_pSrc
        add     ax, OFF_cb      ;add src offset and bytecount
        adc     dx, 0           ;dx = # segments to increment
        mov     cx, ax          ;save new offset
        mov     ax, dx          ;#segs into ax
        lea     bx, __ahincr
        mul     bx  ;__ahincr   ;mul by windows magic #
        mov     dx, ax          ;restore to dx for output
        mov     ax, cx          ;restore for output
        add     dx, SEG_pSrc
cEnd


ifdef DEBUG
cProc StkTrace,<NEAR, PUBLIC>
        parmW   cFrames
        parmD   lpBuf
cBegin
        push    es
        mov     cx, cFrames
        mov     bx, bp
        les     di, lpBuf
        cld
x:
        mov     bx, ss:[bx]
        and     bx, 0FFFEh
        mov     ax, ss:[bx+2]
        stosw
        loopnz  x
        pop     es
cEnd
endif

?WIN=0          ; turn off windows prolog/epilog stuff

;
;       SwitchDS
;
;  Routine to switch the DS to word argument
;  Called from C but without C DS glue.
;
cProc SwitchDS,<NEAR, PUBLIC>
parmW   newDS
cBegin
        mov     ax,ds           ; old DS is return value
        mov     ds,newDS
cEnd


sEnd    CODE            ;INIT_TEXT
end