;
; dump.s
;
; DLLManager dump utility
;
;  1994-1998 Straylight
;

;----- Licensing note -------------------------------------------------------
;
; This file is part of Straylight's Dynamic Linking System (SDLS)
;
; SDLS 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.
;
; SDLS 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 SDLS.  If not, write to the Free Software Foundation,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

		GET	libs:header
		GET	libs:swis
		GET	sh.dllblock
		GET	sh.appblock
		GET	sh.linkblock
		GET	sh.wspace

		AREA	|!!!Foonly|,CODE,READONLY

start		STMFD	R13!,{R14}
		MOV	R0,#18
		ADR	R1,modname
		SWI	XOS_Module
		LDMVSFD	R13!,{PC}
		MOV	R11,R12
		MOV	R12,R4
		SWI	OS_WriteS
		DCB	"*** Dump of DLLManager workspace at &",0
		MOV	R0,R12
		BL	writeHex
		SWI	OS_WriteS
		DCB	13,10,10
		DCB	"[DLL list]",13,10
		DCB	13,10,0

		; --- Dump out DLL list ---

		LDR	R7,dll__list

dll_loop	CMP	R7,#0
		BEQ	dump_apps
		LDR	R0,[R7,#dl_name]
		SWI	XOS_Write0
		SWI	XOS_WriteI+' '
		LDR	R0,[R7,#dl_version]
		BL	writeDec
		SWI	XOS_WriteS
		DCB	13,10,"  Handle: ",0
		MOV	R0,R7
		BL	writeHex
		SWI	XOS_WriteS
		DCB	13,10,"  Links: ",0
		LDR	R0,[R7,#dl_next]
		BL	writeHex
		SWI	XOS_WriteI+','
		LDR	R0,[R7,#dl_prev]
		BL	writeHex
		SWI	XOS_WriteS
		DCB	13,10,"  Ref count: ",0
		LDR	R0,[R7,#dl_clients]
		AND	R1,R0,#&80000000
		BIC	R0,R0,#&80000000
		BL	writeDec
		CMP	R1,#0
		BEQ	notent
		SWI	XOS_WriteI+' '
		SWI	XOS_WriteI+'['
		SWI	XOS_WriteI+'T'
		SWI	XOS_WriteI+']'
notent		SWI	XOS_NewLine
		SWI	XOS_NewLine
		LDR	R7,[R7,#dl_next]
		B	dll_loop

modname		DCB	"DLLManager",0

		; --- Dump out application data ---

dump_apps	SWI	XOS_WriteS
		DCB	"[App data]",13,10
		DCB	13,10
		DCB	"Cached handle: ",0
		LDR	R0,app__cacheHnd
		BL	writeHex
		SWI	XOS_WriteS
		DCB	13,10
		DCB	"Cached pointer: ",0
		LDR	R0,app__cachePtr
		BL	writeHex
		SWI	XOS_WriteS
		DCB	13,10
		DCB	13,10
		DCB	"[App list]",13,10
		DCB	13,10,0

		; --- Dump out application list ---

		LDR	R7,app__list

app_loop	CMP	R7,#0
		BEQ	dump_sub
		ADD	R0,R7,#app_name
		SWI	XOS_Write0
		SWI	XOS_WriteS
		DCB	13,10
		DCB	"  External handle: ",0
		LDR	R0,[R7,#app_handle]
		BL	writeHex
		SWI	XOS_WriteS
		DCB	13,10
		DCB	"  Internal handle: ",0
		MOV	R0,R7
		BL	writeHex
		SWI	XOS_WriteS
		DCB	13,10
		DCB	"  Links: ",0
		LDR	R0,[R7,#app_next]
		BL	writeHex
		SWI	XOS_WriteI+','
		LDR	R0,[R7,#app_prev]
		BL	writeHex
		SWI	XOS_WriteS
		DCB	13,10
		DCB	"  Stack entries: ",0
		LDR	R0,[R7,#app_stackPtr]
		MOV	R0,R0,LSR #3		;Divide it by 8
		BL	writeDec
		SWI	XOS_WriteS
		DCB	13,10
		DCB	"  Cached DLL handle: ",0
		LDR	R0,[R7,#app_cachedll]
		BL	writeHex
		SWI	XOS_WriteS
		DCB	13,10
		DCB	"  Cached DLL link: ",0
		LDR	R0,[R7,#app_cacheptr]
		BL	writeHex
		SWI	XOS_WriteS
		DCB	13,10
		DCB	"  DLL list",13,10,0

		; --- Dump out DLL list quickly ---

		LDR	R8,[R7,#app_dlls]
used_list	CMP	R8,#0
		BEQ	app_end
		LDR	R9,[R8,#lk_dll]
		SWI	XOS_WriteI+' '
		SWI	XOS_WriteI+' '
		SWI	XOS_WriteI+' '
		SWI	XOS_WriteI+' '
		LDR	R0,[R9,#dl_name]
		SWI	XOS_Write0
		SWI	XOS_WriteI+' '
		LDR	R0,[R9,#dl_version]
		BL	writeDec
		SWI	XOS_WriteI+' '
		SWI	XOS_WriteI+'['
		LDR	R0,[R8,#lk_work]
		BL	writeHex
		SWI	XOS_WriteI+']'
		LDR	R0,[R8,#lk_flags]
		CMP	R0,#0
		BEQ	floop
		SWI	XOS_WriteI+' '
		SWI	XOS_WriteI+'['
		SWI	XOS_WriteI+'T'
		SWI	XOS_WriteI+']'
floop		SWI	XOS_NewLine
		LDR	R8,[R8,#lk_next]
		B	used_list

app_end		SWI	XOS_NewLine
		LDR	R7,[R7,#app_next]
		B	app_loop

		; --- Dump sub_alloc information ---

dump_sub	LDMFD	R13!,{PC}

writeHex	STMFD	R13!,{R1,R2,R14}
		MOV	R1,R11
		MOV	R2,#256
		SWI	XOS_ConvertHex8
		SWI	XOS_Write0
		LDMFD	R13!,{R1,R2,PC}^

writeDec	STMFD	R13!,{R1,R2,R14}
		MOV	R1,R11
		MOV	R2,#256
		SWI	XOS_ConvertInteger4
		SWI	XOS_Write0
		LDMFD	R13!,{R1,R2,PC}^

		END
