!  Amiga support routines
!
!  a True BASIC, inc. product
!
!     The library Amiga* is formed by compiling this file, then 
!     combining the result with compiled versions of:
!
!                     s_peekb.asm
!                     s_pokeb.asm
!                     s_peekw.asm
!                     s_pokew.asm
!                     s_peekl.asm
!                     s_pokel.asm
!                     s_call.asm
!                     s_addr.asm
!                     tostring.asm
!
!     This library must be included last in the library list to use almost
!     any of the other Amiga Developer's Toolkit libraries.  Though the
!     routines are intended primarily as support routines for the other 
!     libraries, they can be useful by themselves.
!
!  Copyright (c) 1986 by True BASIC, Inc.
!  All rights reserved.
!

EXTERNAL

DEF Nullt$(s$)
    LET Nullt$ = s$ & chr$(0)
END DEF

DEF UnNullt$(s$)
    LET x = pos(s$,chr$(0))
    IF x = 0 then
       LET UnNullt$ = s$
    ELSE
       LET UnNullt$ = s$[1:x-1]
    END IF
END DEF

SUB ZeroString(s$,size)
    LET s$ = ""
    CALL Packb(s$,1,8*size,0)
END SUB

DEF Addr(s$)
    CALL ZeroString(j$,4)
    CALL s_Addr(s$,j$)
    LET Addr = Unpackb(j$,1,-32)
END DEF

DEF CurrentWindow
    CALL ZeroString(j$,4)
    CALL ToString(0,"",j$)
    LET CurrentWindow = Unpackb(j$,1,-32)
END DEF

DEF CurrentRPort
    DECLARE DEF CurrentWindow, upeekl
    LET CurrentRPort = upeekl(CurrentWindow+50)
END DEF

SUB packl(data,s$)                ! packb number must be -2^31 < n < 2^31
    LET n = Round(data)
    IF n = -2147483648 or n = 2147483648 then
       CALL packb(s$,1,32,0)
       CALL packb(s$,1,8,128)
    ELSE
       IF n > 2147483648 then LET n = n-4294967296
       CALL packb(s$,1,32,n)
    END IF
END SUB

SUB pokeb(addr,data)
    CALL packl(addr,addr$)
    CALL packl(data,data$)
    CALL s_pokeb(addr$,data$)
END SUB

DEF peekb(addr)
    CALL packl(addr,addr$)
    CALL s_peekb(addr$,data)
    LET peekb = data
END DEF

DEF upeekb(addr)
    DECLARE DEF peekb
    LET data = peekb(addr)
    IF data < 0 then LET data = data + 256
    LET upeekb = data
END DEF

SUB pokew(addr,data)
    CALL packl(addr,addr$)
    CALL packl(data,data$)
    CALL s_pokew(addr$,data$)
END SUB

DEF peekw(addr)
    CALL packl(addr,addr$)
    CALL s_peekw(addr$,data)
    LET peekw = data
END DEF

DEF upeekw(addr)
    DECLARE DEF peekw
    LET data = peekw(addr)
    IF data < 0 then LET data = data + 65536
    LET upeekw = data
END DEF

SUB pokel(addr,data)
    CALL packl(addr,addr$)
    CALL packl(data,data$)
    CALL s_pokel(addr$,data$)
END SUB

DEF peekl(addr)
    CALL packl(addr,addr$)
    CALL packb(data$,1,32,0)
    CALL s_peekl(addr$,data$)
    LET peekl = unpackb(data$,1,-32)
END DEF

DEF upeekl(addr)
    DECLARE DEF peekl
    LET data = peekl(addr)
    IF data < 0 then LET data = data + 4294967296
    LET upeekl = data
END DEF
