;
; dyn_apcs.s
;
; APCS interface to Dynamite SWIs
;
;  1994-1998 Straylight
;

;----- Licensing note -------------------------------------------------------
;
; This file is part of Straylight's Dynamite
;
; Dynamite is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2, or (at your option)
; any later version.
;
; Dynamite is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with Dynamite.  If not, write to the Free Software Foundation,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

;----- Standard header ------------------------------------------------------

		GET	libs:header
		GET	libs:swis

		GET	libs:stream

;----- Main code ------------------------------------------------------------

		AREA	|C$$Code|,CODE,READONLY

; --- dynamite_alloc ---
;
; On entry:	a1 == address of anchor
;		a2 == size of block, in bytes
;		a3 == block ID
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_alloc
dynamite_alloc
		MOV	ip,lr
		SWI	XDynamite_Alloc
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_free ---
;
; On entry:	a1 == address of anchor
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_free
dynamite_free
		MOV	ip,lr
		SWI	XDynamite_Free
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_freeWithID ---
;
; On entry:	a1 == block ID (must be non-zero)
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_freeWithID
dynamite_freeWithID
		MOV	ip,lr
		SWI	XDynamite_FreeWithID
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_blockInfo ---
;
; On entry:	a1 == address of block anchor
;		a2 == address of structure to fill in
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_blockInfo
dynamite_blockInfo
		STMFD	sp!,{lr}
		MOV	ip,a2
		SWI	XDynamite_BlockInfo
		STMVCIA	ip,{a3,a4}
		MOVVC	a1,#0
		LDMFD	sp!,{pc}^

; --- dynamite_changeID ---
;
; On entry:	a1 == address of anchor, or 0
;		a2 == new ID
;		a3 == (optional) old ID
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_changeID
dynamite_changeID
		MOV	ip,lr
		SWI	XDynamite_ChangeID
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_resize ---
;
; On entry:	a1 == address of anchor
;		a2 == new size, in bytes
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_resize
dynamite_resize
		MOV	ip,lr
		SWI	XDynamite_Resize
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_midExtend ---
;
; On entry:	a1 == address of anchor
;		a2 == offset at which to extend
;		a3 == number of bytes to add
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_midExtend
dynamite_midExtend
		MOV	ip,lr
		SWI	XDynamite_MidExtend
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_save ---
;
; On entry:	a1 == value to save
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_save
dynamite_save
		MOV	ip,lr
		MOV	a2,a1
		MOV	a1,#2
		SWI	XDynamite_Save
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_load ---
;
; On entry:	--
;
; On exit:	a1 == value loaded from relocation stack

		EXPORT	dynamite_load
dynamite_load
		MOV	ip,lr
		MOV	a1,#1
		SWI	XDynamite_Load
		MOVS	pc,ip

; --- dynamite_reduce ---
;
; On entry:	--
;
; On exit:	a1 == 0 if compaction not performed, nonzero otherwise

		EXPORT	dynamite_reduce
dynamite_reduce
		MOV	ip,lr
		SWI	XDynamite_Reduce
		MOVCC	a1,#1
		MOVCS	a1,#0
		MOVS	pc,ip

; --- dynamite_compact ---
;
; On entry:	--
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_compact
dynamite_compact
		MOV	ip,lr
		SWI	XDynamite_Compact
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_lock ---
;
; On entry:	--
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_lock
dynamite_lock
		MOV	ip,lr
		SWI	XDynamite_Lock
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_unlock ---
;
; On entry:	--
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_unlock
dynamite_unlock
		MOV	ip,lr
		SWI	XDynamite_Unlock
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_claimAnchor ---
;
; On entry:	a1 == address of where to store anchor
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_claimAnchor
dynamite_claimAnchor
		MOV	ip,lr
		MOV	a2,a1
		SWI	XDynamite_ClaimAnchor
		STRVC	a1,[a2,#0]
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_releaseAnchor ---
;
; On entry:	a1 == address of anchor
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_releaseAnchor
dynamite_releaseAnchor
		MOV	ip,lr
		SWI	XDynamite_ReleaseAnchor
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_readSpriteSize ---
;
; On entry:	a1 == where to store the sprite size
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_readSpriteSize
dynamite_readSpriteSize
		MOV	ip,lr
		MOV	a2,a1
		SWI	XDynamite_ReadSpriteSize
		STRVC	a1,[a2,#0]
		MOVVC	a1,#0
		MOVS	pc,ip

; --- dynamite_describe ---
;
; On entry:	a1 == address of a structure to fill in
;
; On exit:	a1 == 0 or pointer to error

		EXPORT	dynamite_describe
dynamite_describe
		MOV	ip,lr
		MOV	a4,a1
		SWI	XDynamite_Describe
		MOVVS	pc,ip
		CMP	a4,#0
		STMNEIA	a4,{a1-a3}
		MOV	a1,#0
		MOVS	pc,ip

;----- That's all, folks ----------------------------------------------------

		END
