586 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			586 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
		THIS SOFTWARE IS NOT COPYRIGHTED
 | 
						|
 | 
						|
   HP offers the following for use in the public domain.  HP makes no
 | 
						|
   warranty with regard to the software or it's performance and the
 | 
						|
   user accepts the software "AS IS" with all faults.
 | 
						|
 | 
						|
   HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
 | 
						|
   TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 | 
						|
   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
 | 
						|
****************************************************************************/
 | 
						|
	.space	$TEXT$
 | 
						|
	.subspa	$CODE$,access=0x2c
 | 
						|
 | 
						|
#if 1
 | 
						|
#include	"diagnose.h"
 | 
						|
#endif
 | 
						|
 | 
						|
i13BREAK	.equ    0xa5a			; im13 field for specified functions
 | 
						|
i5REG		.equ	0x06			; Init registers
 | 
						|
i5BP		.equ	0x09			; GDB breakpoin
 | 
						|
i5PSW		.equ	0x0b			; Get PSW
 | 
						|
i5INLINE	.equ	0x0e			; Get INLINE
 | 
						|
R_gr0		.equ	 0
 | 
						|
R_gr1		.equ	 4
 | 
						|
R_gr2		.equ	 8
 | 
						|
R_gr3		.equ	12
 | 
						|
R_gr4		.equ	16
 | 
						|
R_gr5		.equ	20
 | 
						|
R_gr6		.equ	24
 | 
						|
R_gr7		.equ	28
 | 
						|
R_gr8		.equ	32
 | 
						|
R_gr9		.equ	36
 | 
						|
R_gr10		.equ	40
 | 
						|
R_gr11		.equ	44
 | 
						|
R_gr12		.equ	48
 | 
						|
R_gr13		.equ	52
 | 
						|
R_gr14		.equ	56
 | 
						|
R_gr15		.equ	60
 | 
						|
R_gr16		.equ	64
 | 
						|
R_gr17		.equ	68
 | 
						|
R_gr18		.equ	72
 | 
						|
R_gr19		.equ	76
 | 
						|
R_gr20		.equ	80
 | 
						|
R_gr21		.equ	84
 | 
						|
R_gr22		.equ	88
 | 
						|
R_gr23		.equ	92
 | 
						|
R_gr24		.equ	96
 | 
						|
R_gr25		.equ	100
 | 
						|
R_gr26		.equ	104
 | 
						|
R_gr27		.equ	108
 | 
						|
R_gr28		.equ	112
 | 
						|
R_gr29		.equ	116
 | 
						|
R_gr30		.equ	120
 | 
						|
R_gr31		.equ	124
 | 
						|
 | 
						|
R_sr0		.equ	128
 | 
						|
R_sr1		.equ	132
 | 
						|
R_sr2		.equ	136
 | 
						|
R_sr3		.equ	140
 | 
						|
R_sr4		.equ	144
 | 
						|
R_sr5		.equ	148
 | 
						|
R_sr6		.equ	152
 | 
						|
R_sr7		.equ	156
 | 
						|
 | 
						|
R_cr0		.equ	160
 | 
						|
R_cr1		.equ	164
 | 
						|
R_cr2		.equ	168
 | 
						|
R_cr3		.equ	172
 | 
						|
R_cr4		.equ	176
 | 
						|
R_cr5		.equ	180
 | 
						|
R_cr6		.equ	184
 | 
						|
R_cr7		.equ	188
 | 
						|
R_cr8		.equ	192
 | 
						|
R_cr9		.equ	196
 | 
						|
R_cr10		.equ	200
 | 
						|
R_cr11		.equ	204
 | 
						|
R_cr12		.equ	208
 | 
						|
R_cr13		.equ	212
 | 
						|
R_cr14		.equ	216
 | 
						|
R_cr15		.equ	220
 | 
						|
R_cr16		.equ	224
 | 
						|
R_cr17H		.equ	228
 | 
						|
R_cr18H		.equ	232
 | 
						|
R_cr19		.equ	236
 | 
						|
R_cr20		.equ	240
 | 
						|
R_cr21		.equ	244
 | 
						|
R_cr22		.equ	248
 | 
						|
R_cr23		.equ	252
 | 
						|
R_cr24		.equ	256
 | 
						|
R_cr25		.equ	260
 | 
						|
R_cr26		.equ	264
 | 
						|
R_cr27		.equ	268
 | 
						|
R_cr28		.equ	272
 | 
						|
R_cr29		.equ	276
 | 
						|
R_cr30		.equ	280
 | 
						|
R_cr31		.equ	284
 | 
						|
 | 
						|
R_cr17T		.equ	288
 | 
						|
R_cr18T		.equ	292
 | 
						|
 | 
						|
R_cpu0		.equ	296
 | 
						|
 | 
						|
R_SIZE          .equ	300
 | 
						|
 | 
						|
min_stack	.equ     64
 | 
						|
 | 
						|
	.import	handle_exception
 | 
						|
	.import $global$, data
 | 
						|
	.IMPORT putnum, code
 | 
						|
	.IMPORT led_putnum, code
 | 
						|
	.IMPORT delay, code
 | 
						|
 | 
						|
        .export FICE
 | 
						|
	.export	DEBUG_GO
 | 
						|
	.export	DEBUG_SS
 | 
						|
	.export	STUB_RESTORE
 | 
						|
 | 
						|
	.export	save_regs
 | 
						|
	.export	RegBlk
 | 
						|
	.export Exception_index
 | 
						|
 | 
						|
;-------------------------------------------------------------------------------
 | 
						|
        .EXPORT breakpoint,ENTRY,ARGW0=GR,RTNVAL=GR
 | 
						|
breakpoint
 | 
						|
	.PROC
 | 
						|
	.CALLINFO CALLER,FRAME=128,SAVE_RP
 | 
						|
	.ENTRY
 | 
						|
 | 
						|
	stw     %r2,-20(0,%r30)			; stash the return pointer
 | 
						|
	ldo	128(%r30),%r30			; push up the stack pointer
 | 
						|
 | 
						|
;;; debug
 | 
						|
	ldi	6, %r26
 | 
						|
	bl,n	led_putnum,%r2
 | 
						|
	nop
 | 
						|
        ldil 	L'900000,%r26
 | 
						|
        ldo 	R'900000(%r26),%r26
 | 
						|
	bl,n	delay,%r2
 | 
						|
	nop
 | 
						|
;;; 
 | 
						|
	break   i5INLINE,i13BREAK
 | 
						|
;;; more debug
 | 
						|
	ldi	7, %r26
 | 
						|
	bl,n	led_putnum,%r2
 | 
						|
	nop
 | 
						|
        ldil 	L'900000,%r26
 | 
						|
        ldo 	R'900000(%r26),%r26
 | 
						|
	bl,n	delay,%r2
 | 
						|
	nop
 | 
						|
;;; 
 | 
						|
	
 | 
						|
FICE	fice	0(0,%r26)			; Flush the i cache entry
 | 
						|
	sync
 | 
						|
 | 
						|
	ldw 	-148(0,%r30),%r2		; retrieve the return pointer
 | 
						|
	ldo 	-128(%r30),%r30			; reset the stack pointer
 | 
						|
	bv,n    0(%r2)				; return to caller
 | 
						|
	nop
 | 
						|
 | 
						|
	.EXIT
 | 
						|
	.PROCEND
 | 
						|
 | 
						|
;-------------------------------------------------------------------------------
 | 
						|
DEBUG_GO
 | 
						|
	or,tr	%r0,%r0,%r10	; if go, do not set R-bit to 1
 | 
						|
 | 
						|
DEBUG_SS
 | 
						|
	ldi	1,%r10		; else set R-bit to 1
 | 
						|
 | 
						|
DEBUG_EXEC
 | 
						|
 | 
						|
	bl	DGO_0,%r8			; r8 points to register block
 | 
						|
	addil	L%RegBlk-DGO_0,%r8
 | 
						|
DGO_0
 | 
						|
	ldo	R%RegBlk-DGO_0(%r1),%r8
 | 
						|
 | 
						|
; load space registers
 | 
						|
 | 
						|
	ldw	R_sr0(%r8),%r1
 | 
						|
	mtsp	%r1,%sr0
 | 
						|
	ldw	R_sr1(%r8),%r1
 | 
						|
	mtsp	%r1,%sr1
 | 
						|
	ldw	R_sr2(%r8),%r1
 | 
						|
	mtsp	%r1,%sr2
 | 
						|
	ldw	R_sr3(%r8),%r1
 | 
						|
	mtsp	%r1,%sr3
 | 
						|
	ldw	R_sr4(%r8),%r1
 | 
						|
	mtsp	%r1,%sr4
 | 
						|
	ldw	R_sr5(%r8),%r1
 | 
						|
	mtsp	%r1,%sr5
 | 
						|
	ldw	R_sr6(%r8),%r1
 | 
						|
	mtsp	%r1,%sr6
 | 
						|
	ldw	R_sr7(%r8),%r1
 | 
						|
	mtsp	%r1,%sr7
 | 
						|
 | 
						|
; clear Q-bit for rfi
 | 
						|
 | 
						|
	rsm	0x08,%r0
 | 
						|
 | 
						|
; load control registers
 | 
						|
 | 
						|
	ldw	R_cr0(%r8),%r1
 | 
						|
	or,=	%r10,%r0,%r0		; if single step
 | 
						|
	copy	%r0,%r1			;   set %cr0 to 0
 | 
						|
	mtctl	%r1,%cr0
 | 
						|
	ldw	R_cr8(%r8),%r1
 | 
						|
	mtctl	%r1,%cr8
 | 
						|
	ldw	R_cr9(%r8),%r1
 | 
						|
	mtctl	%r1,%cr9
 | 
						|
	ldw	R_cr10(%r8),%r1
 | 
						|
	mtctl	%r1,%cr10
 | 
						|
	ldw	R_cr11(%r8),%r1
 | 
						|
	mtctl	%r1,%cr11
 | 
						|
	ldw	R_cr12(%r8),%r1
 | 
						|
	mtctl	%r1,%cr12
 | 
						|
	ldw	R_cr13(%r8),%r1
 | 
						|
	mtctl	%r1,%cr13
 | 
						|
	ldw	R_cr14(%r8),%r1
 | 
						|
	mtctl	%r1,%cr14
 | 
						|
	ldw	R_cr15(%r8),%r1
 | 
						|
	mtctl	%r1,%cr15
 | 
						|
	ldw	R_cr16(%r8),%r1
 | 
						|
	mtctl	%r1,%cr16
 | 
						|
	ldw	R_cr17H(%r8),%r1	; load iiasq.head
 | 
						|
	mtctl	%r1,%cr17
 | 
						|
	ldw	R_cr18H(%r8),%r1	; load iiaoq.head
 | 
						|
	mtctl	%r1,%cr18
 | 
						|
	ldw	R_cr17T(%r8),%r1	; load iiasq.tail
 | 
						|
	mtctl	%r1,%cr17
 | 
						|
	ldw	R_cr18T(%r8),%r1	; load iiaoq.tail
 | 
						|
	mtctl	%r1,%cr18
 | 
						|
	ldw	R_cr19(%r8),%r1
 | 
						|
	mtctl	%r1,%cr19
 | 
						|
	ldw	R_cr20(%r8),%r1
 | 
						|
	mtctl	%r1,%cr20
 | 
						|
	ldw	R_cr21(%r8),%r1
 | 
						|
	mtctl	%r1,%cr21
 | 
						|
	ldw	R_cr22(%r8),%r1
 | 
						|
	dep	%r10,27,1,%r1		; set R-bit if applicable
 | 
						|
	mtctl	%r1,%cr22
 | 
						|
	ldw	R_cr23(%r8),%r1
 | 
						|
	mtctl	%r1,%cr23
 | 
						|
	ldw	R_cr24(%r8),%r1
 | 
						|
	mtctl	%r1,%cr24
 | 
						|
	ldw	R_cr25(%r8),%r1
 | 
						|
	mtctl	%r1,%cr25
 | 
						|
	ldw	R_cr26(%r8),%r1
 | 
						|
	mtctl	%r1,%cr26
 | 
						|
	ldw	R_cr27(%r8),%r1
 | 
						|
	mtctl	%r1,%cr27
 | 
						|
	ldw	R_cr28(%r8),%r1
 | 
						|
	mtctl	%r1,%cr28
 | 
						|
	ldw	R_cr29(%r8),%r1
 | 
						|
	mtctl	%r1,%cr29
 | 
						|
	ldw	R_cr30(%r8),%r1
 | 
						|
	mtctl	%r1,%cr30
 | 
						|
	ldw	R_cr31(%r8),%r1
 | 
						|
	mtctl	%r1,%cr31
 | 
						|
 | 
						|
; load diagnose registers
 | 
						|
 | 
						|
	ldw	R_cpu0(%r8),%r1
 | 
						|
	ldil	L%CPU0_MASK,%r2
 | 
						|
	ldo	R%CPU0_MASK(%r2),%r2
 | 
						|
	xor	%r1,%r2,%r1		; xor the read/clear bits
 | 
						|
	nop
 | 
						|
	mtcpu	%r1,0
 | 
						|
	mtcpu	%r1,0
 | 
						|
 | 
						|
; load general registers
 | 
						|
 | 
						|
	ldw	R_gr1(%r8),%r1
 | 
						|
	ldw	R_gr2(%r8),%r2
 | 
						|
	ldw	R_gr3(%r8),%r3
 | 
						|
	ldw	R_gr4(%r8),%r4
 | 
						|
	ldw	R_gr5(%r8),%r5
 | 
						|
	ldw	R_gr6(%r8),%r6
 | 
						|
	ldw	R_gr7(%r8),%r7
 | 
						|
	ldw	R_gr9(%r8),%r9
 | 
						|
	ldw	R_gr10(%r8),%r10
 | 
						|
	ldw	R_gr11(%r8),%r11
 | 
						|
	ldw	R_gr12(%r8),%r12
 | 
						|
	ldw	R_gr13(%r8),%r13
 | 
						|
	ldw	R_gr14(%r8),%r14
 | 
						|
	ldw	R_gr15(%r8),%r15
 | 
						|
	ldw	R_gr16(%r8),%r16
 | 
						|
	ldw	R_gr17(%r8),%r17
 | 
						|
	ldw	R_gr18(%r8),%r18
 | 
						|
	ldw	R_gr19(%r8),%r19
 | 
						|
	ldw	R_gr20(%r8),%r20
 | 
						|
	ldw	R_gr21(%r8),%r21
 | 
						|
	ldw	R_gr22(%r8),%r22
 | 
						|
	ldw	R_gr23(%r8),%r23
 | 
						|
	ldw	R_gr24(%r8),%r24
 | 
						|
	ldw	R_gr25(%r8),%r25
 | 
						|
	ldw	R_gr26(%r8),%r26
 | 
						|
	ldw	R_gr27(%r8),%r27
 | 
						|
	ldw	R_gr28(%r8),%r28
 | 
						|
	ldw	R_gr29(%r8),%r29
 | 
						|
	ldw	R_gr30(%r8),%r30
 | 
						|
	ldw	R_gr31(%r8),%r31
 | 
						|
	ldw	R_gr8(%r8),%r8
 | 
						|
 | 
						|
; execute user program
 | 
						|
 | 
						|
	nop
 | 
						|
	rfi		; switch to user code
 | 
						|
	nop
 | 
						|
 | 
						|
;-------------------------------------------------------------------------------
 | 
						|
 | 
						|
STUB_RESTORE
 | 
						|
	copy	%r1,%r9	; save exception index
 | 
						|
	bl	SR_00,%r8
 | 
						|
	addil	L%Exception_index-SR_00,%r8
 | 
						|
SR_00
 | 
						|
	ldo	R%Exception_index-SR_00(%r1),%r8
 | 
						|
	stw	%r9,(%r8)
 | 
						|
 | 
						|
	bl	save_regs,%r25
 | 
						|
	nop
 | 
						|
	
 | 
						|
#ifdef	DEBUG_DEBUGGER1
 | 
						|
	stwm	%r1,8(%sp)
 | 
						|
	bl	putc,%rp
 | 
						|
	ldi	CR,%arg0
 | 
						|
	bl	putc,%rp
 | 
						|
	ldi	LF,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	mfctl	%pcoq,%arg0
 | 
						|
 | 
						|
	mfctl	%pcoq,%r1
 | 
						|
	mtctl	%r1,%pcoq
 | 
						|
	mfctl	%pcoq,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	mtctl	%arg0,%pcoq
 | 
						|
 | 
						|
	bl	printit,%mrp
 | 
						|
	ldw	-8(%sp),%arg0
 | 
						|
 | 
						|
	ldwm	-8(%sp),%r1
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	DEBUG_DEBUGGER2
 | 
						|
	stwm	%r1,8(%sp)
 | 
						|
	bl	putc,%rp
 | 
						|
	ldi	LF,%arg0
 | 
						|
	ldwm	-8(%sp),%r1
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef	DEBUG_DEBUGGER3
 | 
						|
	bl	printit,%mrp
 | 
						|
	copy	iptr,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	copy	rstack,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	copy	gspace,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	copy	dstack,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	copy	nextptr,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	copy	%dp,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	copy	%sp,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	mfctl	%rctr,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	mfctl	%iva,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	mfctl	%eiem,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	mfctl	%ipsw,%arg0
 | 
						|
	bl	printit,%mrp
 | 
						|
	copy	%r0,%arg0
 | 
						|
#endif
 | 
						|
	bl	SR_1,%sp
 | 
						|
	addil	L%Stub_stack-SR_1,%sp
 | 
						|
SR_1
 | 
						|
	ldo	R%Stub_stack-SR_1(%r1),%sp	; set the stack pointer
 | 
						|
 | 
						|
	bl	SR_2,%arg0
 | 
						|
	addil	L%RegBlk-SR_2,%arg0
 | 
						|
SR_2
 | 
						|
	ldo	R%RegBlk-SR_2(%r1),%arg0	; set arg0 (save register area)
 | 
						|
 | 
						|
	bl	SR_3,%arg1
 | 
						|
	addil	L%Exception_index-SR_3,%arg1	; set arg1 address
 | 
						|
SR_3
 | 
						|
	ldo	R%Exception_index-SR_3(%r1),%arg1	; set arg1 address
 | 
						|
 | 
						|
	addi	min_stack,%sp,%sp		; allocate min stack frame
 | 
						|
 | 
						|
	bl	handle_exception,%r2
 | 
						|
	ldw	0(%arg1),%arg1			; load arg1
 | 
						|
        addi	-min_stack,%sp,%sp		; de allocate min stack frame
 | 
						|
 | 
						|
	b	DEBUG_EXEC			; 
 | 
						|
	copy	%r28,%r10	
 | 
						|
;-------------------------------------------------------------------------------
 | 
						|
 | 
						|
save_regs	; return address is in %r25
 | 
						|
 | 
						|
	bl	SR_0,%r1			; r1 points to Register block
 | 
						|
	addil   L%RegBlk-SR_0,%r1
 | 
						|
SR_0
 | 
						|
	ldo     R%RegBlk-SR_0(%r1),%r1
 | 
						|
 | 
						|
; save general registers
 | 
						|
 | 
						|
	stw	%r0,R_gr0(%r1)
 | 
						|
	; don't store %r1 yet
 | 
						|
	stw	%r2,R_gr2(%r1)
 | 
						|
	stw	%r3,R_gr3(%r1)
 | 
						|
	stw	%r4,R_gr4(%r1)
 | 
						|
	stw	%r5,R_gr5(%r1)
 | 
						|
	stw	%r6,R_gr6(%r1)
 | 
						|
	stw	%r7,R_gr7(%r1)
 | 
						|
	; don't store %r8 yet
 | 
						|
	; don't store %r9 yet
 | 
						|
	stw	%r10,R_gr10(%r1)
 | 
						|
	stw	%r11,R_gr11(%r1)
 | 
						|
	stw	%r12,R_gr12(%r1)
 | 
						|
	stw	%r13,R_gr13(%r1)
 | 
						|
	stw	%r14,R_gr14(%r1)
 | 
						|
	stw	%r15,R_gr15(%r1)
 | 
						|
	; don't store %r16 yet
 | 
						|
	; don't store %r17 yet
 | 
						|
	stw	%r18,R_gr18(%r1)
 | 
						|
	stw	%r19,R_gr19(%r1)
 | 
						|
	stw	%r20,R_gr20(%r1)
 | 
						|
	stw	%r21,R_gr21(%r1)
 | 
						|
	stw	%r22,R_gr22(%r1)
 | 
						|
	stw	%r23,R_gr23(%r1)
 | 
						|
	; don't store %r24 yet
 | 
						|
	; don't store %r25 yet
 | 
						|
	stw	%r26,R_gr26(%r1)
 | 
						|
	stw	%r27,R_gr27(%r1)
 | 
						|
	stw	%r28,R_gr28(%r1)
 | 
						|
	stw	%r29,R_gr29(%r1)
 | 
						|
	stw	%r30,R_gr30(%r1)
 | 
						|
	stw	%r31,R_gr31(%r1)
 | 
						|
 | 
						|
; restore general registers from shadow registers and save them
 | 
						|
 | 
						|
	copy	%r1,%r10	; hold Register block pointer
 | 
						|
	copy	%r25,%rp	; hold return pointer
 | 
						|
	shdw_gr
 | 
						|
	shdw_gr
 | 
						|
	stw	%r1,R_gr1(%r10)
 | 
						|
	stw	%r8,R_gr8(%r10)
 | 
						|
	stw	%r9,R_gr9(%r10)
 | 
						|
	stw	%r16,R_gr16(%r10)
 | 
						|
	stw	%r17,R_gr17(%r10)
 | 
						|
	stw	%r24,R_gr24(%r10)
 | 
						|
	stw	%r25,R_gr25(%r10)
 | 
						|
 | 
						|
; save control registers
 | 
						|
 | 
						|
	mfctl	%cr0,%r1
 | 
						|
	stw	%r1,R_cr0(%r10)
 | 
						|
	stw	%r0,R_cr1(%r10)
 | 
						|
	stw	%r0,R_cr2(%r10)
 | 
						|
	stw	%r0,R_cr3(%r10)
 | 
						|
	stw	%r0,R_cr4(%r10)
 | 
						|
	stw	%r0,R_cr5(%r10)
 | 
						|
	stw	%r0,R_cr6(%r10)
 | 
						|
	stw	%r0,R_cr7(%r10)
 | 
						|
	mfctl	%cr8,%r1
 | 
						|
	stw	%r1,R_cr8(%r10)
 | 
						|
	mfctl	%cr9,%r1
 | 
						|
	stw	%r1,R_cr9(%r10)
 | 
						|
	mfctl	%cr10,%r1
 | 
						|
	stw	%r1,R_cr10(%r10)
 | 
						|
	mfctl	%cr11,%r1
 | 
						|
	stw	%r1,R_cr11(%r10)
 | 
						|
	mfctl	%cr12,%r1
 | 
						|
	stw	%r1,R_cr12(%r10)
 | 
						|
	mfctl	%cr13,%r1
 | 
						|
	stw	%r1,R_cr13(%r10)
 | 
						|
	mfctl	%cr14,%r1
 | 
						|
	stw	%r1,R_cr14(%r10)
 | 
						|
	mfctl	%cr15,%r1
 | 
						|
	stw	%r1,R_cr15(%r10)
 | 
						|
	mfctl	%cr16,%r1
 | 
						|
	stw	%r1,R_cr16(%r10)
 | 
						|
	mfctl	%cr17,%r1
 | 
						|
	stw	%r1,R_cr17H(%r10)
 | 
						|
	mtctl	%r1,%cr17
 | 
						|
	mfctl	%cr17,%r1
 | 
						|
	stw	%r1,R_cr17T(%r10)
 | 
						|
	mtctl	%r1,%cr17
 | 
						|
	mfctl	%cr18,%r1
 | 
						|
	stw	%r1,R_cr18H(%r10)
 | 
						|
	mtctl	%r1,%cr18
 | 
						|
	mfctl	%cr18,%r1
 | 
						|
	stw	%r1,R_cr18T(%r10)
 | 
						|
	mtctl	%r1,%cr18
 | 
						|
	mfctl	%cr19,%r1
 | 
						|
	stw	%r1,R_cr19(%r10)
 | 
						|
	mfctl	%cr20,%r1
 | 
						|
	stw	%r1,R_cr20(%r10)
 | 
						|
	mfctl	%cr21,%r1
 | 
						|
	stw	%r1,R_cr21(%r10)
 | 
						|
	mfctl	%cr22,%r1
 | 
						|
	stw	%r1,R_cr22(%r10)
 | 
						|
	mfctl	%cr23,%r1
 | 
						|
	stw	%r1,R_cr23(%r10)
 | 
						|
	mfctl	%cr24,%r1
 | 
						|
	stw	%r1,R_cr24(%r10)
 | 
						|
	mfctl	%cr25,%r1
 | 
						|
	stw	%r1,R_cr25(%r10)
 | 
						|
	mfctl	%cr26,%r1
 | 
						|
	stw	%r1,R_cr26(%r10)
 | 
						|
	mfctl	%cr27,%r1
 | 
						|
	stw	%r1,R_cr27(%r10)
 | 
						|
	mfctl	%cr28,%r1
 | 
						|
	stw	%r1,R_cr28(%r10)
 | 
						|
	mfctl	%cr29,%r1
 | 
						|
	stw	%r1,R_cr29(%r10)
 | 
						|
	mfctl	%cr30,%r1
 | 
						|
	stw	%r1,R_cr30(%r10)
 | 
						|
	mfctl	%cr31,%r1
 | 
						|
	stw	%r1,R_cr31(%r10)
 | 
						|
 | 
						|
; save diagnose registers
 | 
						|
 | 
						|
	mfcpu_c	0,%r1
 | 
						|
	mfcpu_c	0,%r1
 | 
						|
	stw	%r1,R_cpu0(%r10)
 | 
						|
 | 
						|
; save space registers
 | 
						|
 | 
						|
	mfsp	%sr0,%r1
 | 
						|
	stw	%r1,R_sr0(%r10)
 | 
						|
	mfsp	%sr1,%r1
 | 
						|
	stw	%r1,R_sr1(%r10)
 | 
						|
	mfsp	%sr2,%r1
 | 
						|
	stw	%r1,R_sr2(%r10)
 | 
						|
	mfsp	%sr3,%r1
 | 
						|
	stw	%r1,R_sr3(%r10)
 | 
						|
	mfsp	%sr4,%r1
 | 
						|
	stw	%r1,R_sr4(%r10)
 | 
						|
	mfsp	%sr5,%r1
 | 
						|
	stw	%r1,R_sr5(%r10)
 | 
						|
	mfsp	%sr6,%r1
 | 
						|
	stw	%r1,R_sr6(%r10)
 | 
						|
	mfsp	%sr7,%r1
 | 
						|
	bv	(%rp)
 | 
						|
	stw	%r1,R_sr7(%r10)
 | 
						|
 | 
						|
#ifdef	DEBUG_DEBUGGER
 | 
						|
;-------------------------------------------------------------------------------
 | 
						|
printit
 | 
						|
	mtctl	%rp,%tr0
 | 
						|
	mtctl	%r1,%tr1
 | 
						|
	bl	putnum,%rp
 | 
						|
	copy	%rp,%arg0
 | 
						|
 | 
						|
	mtctl	%mrp,%tr2
 | 
						|
	bl	putc,%rp
 | 
						|
	ldi	CR,%arg0
 | 
						|
	bl	putc,%rp
 | 
						|
	ldi	LF,%arg0
 | 
						|
	mfctl	%tr2,%mrp
 | 
						|
	mfctl	%tr1,%r1
 | 
						|
	bv	(%mrp)
 | 
						|
	mfctl	%tr0,%rp
 | 
						|
#endif
 | 
						|
	.space	$PRIVATE$
 | 
						|
	.subspa	$DATA$,align=4,access=0x1f
 | 
						|
 | 
						|
Exception_index
 | 
						|
	.word	0
 | 
						|
	
 | 
						|
RegBlk
 | 
						|
	.block	R_SIZE		; register block
 | 
						|
 | 
						|
Stub_stack
 | 
						|
	.block	1024
 | 
						|
 | 
						|
	.end
 |