;
; dump
;
; Dump a register block
;
;  1994-1998 Straylight
;

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

; dump
;
; Standard routine - displays contents of a register save block.  May be
; used in SVC mode.
;
; Parameters:     R0 == pointer to block of 16 words, for value of R0-R15
;                 R1 == pointer to string to display
;
; On exit:        Most registers corrupted.
;
; Notes:          Use DUMP macro to set up the call.  This will preserve all
;                 registers and set up the save block etc.  This code will
;                 be inserted only if necessary.

		ROUT

		[	hdr_incDump

hdr_regDump	MOV	R8,R14			;Store link
		SWI	XOS_IntOn
		MOV	R9,R0			;Point to reg dump
		MOV	R10,#0			;Register number
		SWI	XOS_WriteS		;Display header
		DCB	6,26,4,12
		DCB	"------------------------------------------"
		DCB	13,10,10
		DCB	"Register dump follows...",0
		ALIGN
		MOV	R0,R1			;Show message from macro
		SWI	XOS_Write0		;Show it
		SWI	XOS_WriteS
		DCB	13,10,10
		DCB	"------------------------------------------"
		DCB	13,10,10,0
		ALIGN
00		ADRL	R0,%f89			;Point to reg name table
		ADD	R0,R0,R10,LSL #2	;Point to correct one
		SWI	XOS_Write0		;Print on the screen
		SWI	XOS_WriteS		;Display next bit
		DCB	" == ",0		;What to display
		ALIGN
		LDR	R0,[R9,R10,LSL #2]	;Get register contents
		CMP	R10,#15			;Is this the PC?
		BICEQ	R0,R0,#&FC000003	;Yes - clear out PSR
		ADRL	R1,%f88			;Buffer
		MOV	R2,#16			;Length of buffer
		SWI	XOS_ConvertHex8		;Convert
		SWI	XOS_Write0		;Show on screen
		SWI	XOS_NewLine		;Start a new line
		CMP	R10,#15			;Have we finished?
		ADDNE	R10,R10,#1		;No: move to next register
		BNE	%b00

		SWI	XOS_NewLine
		SWI	XOS_WriteS		;Display a message
		DCB	"Processor mode: ",0
		ALIGN
		LDR	R7,[R9,R10,LSL #2]	;Get the number again
		AND	R1,R7,#&3		;Get the processor mode
		ADR	R0,%f87			;Point to message table
		ADD	R0,R0,R1,LSL #2		;Get appropriate one
		SWI	XOS_Write0
		SWI	XOS_NewLine
		SWI	XOS_WriteS
		DCB	"FIQ ",0
		ALIGN
		TST	R7,#FIQ_disable
		ADREQ	R0,%f85
		ADRNE	R0,%f86
		SWI	XOS_Write0
		SWI	XOS_WriteS
		DCB	"IRQ ",0
		ALIGN
		TST	R7,#IRQ_disable
		ADREQ	R0,%f85
		ADRNE	R0,%f86
		SWI	XOS_Write0
		SWI	XOS_WriteS
		DCB	"Other flags: ",0
		ALIGN
		TST	R7,#N_flag
		MOVEQ	R0,#'n'
		MOVNE	R0,#'N'
		SWI	XOS_WriteC
		TST	R7,#Z_flag
		MOVEQ	R0,#'z'
		MOVNE	R0,#'Z'
		SWI	XOS_WriteC
		TST	R7,#C_flag
		MOVEQ	R0,#'c'
		MOVNE	R0,#'C'
		SWI	XOS_WriteC
		TST	R7,#V_flag
		MOVEQ	R0,#'v'
		MOVNE	R0,#'V'
		SWI	XOS_WriteC
		SWI	XOS_WriteS
		DCB	13,10,10
		DCB	"Press any key to continue execution...",0
		ALIGN
		SWI	XOS_ReadC
		CMP	R0,#17			;^Q
		SWIEQ	OS_BreakPt
		MOVS	PC,R8

85
		DCB	"enabled",13,10,0
86
		DCB	"disabled",13,10,0

87
		DCB	"USR",0
		DCB	"FIQ",0
		DCB	"IRQ",0
		DCB	"SVC",0

88
		%	16			;Block for translation

89
		DCB	" R0",0
		DCB	" R1",0
		DCB	" R2",0
		DCB	" R3",0
		DCB	" R4",0
		DCB	" R5",0
		DCB	" R6",0
		DCB	" R7",0
		DCB	" R8",0
		DCB	" R9",0
		DCB	"R10",0
		DCB	"R11",0
		DCB	"R12",0
		DCB	"R13",0
		DCB	"R14",0
		DCB	" PC",0
		ALIGN

		]

		END
