152 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
# XSTORMY16 startup code for GDB stub.
 | 
						|
 | 
						|
# CPU Data for Sanyo EVA debugger at 0x7F00
 | 
						|
        .section .cpudata,"ax"
 | 
						|
        .byte   0x00,0x02,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x44,0x35,0x39,0x52,0x30,0x30,0x30,0x30,0x2E,0x4F,0x50,0x54,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x4c,0x43,0x35,0x39,0x52,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x00,0x20,0x48,0x00,0x00,0x00
 | 
						|
        .byte   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x01,0x12,0x31,0x23,0x59
 | 
						|
 | 
						|
# Interrupt vectors at 0x8000.
 | 
						|
	.section .int_vec,"ax"
 | 
						|
	.global	_start
 | 
						|
	.align 1
 | 
						|
_start:
 | 
						|
	;; Reset, watchdog timer interrupt
 | 
						|
	jmpf _int_reset
 | 
						|
	;; base timer interrupt
 | 
						|
	jmpf _int_basetimer
 | 
						|
	;; timer 0
 | 
						|
	jmpf _int_timer0
 | 
						|
	;; timer 1
 | 
						|
	jmpf _int_timer1
 | 
						|
	;; SIO0 interrupt
 | 
						|
	jmpf _int_sio0
 | 
						|
	;; SIO1 interrupt
 | 
						|
	jmpf _int_sio1
 | 
						|
	;; port0 interrupt
 | 
						|
	jmpf _int_port0
 | 
						|
	;; port1 interrupt
 | 
						|
	jmpf _int_port1
 | 
						|
 | 
						|
	.org 0x80
 | 
						|
	;; sys interrupt (0x8080)
 | 
						|
	jmpf _int_sys
 | 
						|
 | 
						|
	;; Application void write(char *buf, int nbytes)
 | 
						|
	;; This jmps to a stub function to packetize the buf for GDB
 | 
						|
	jmpf gdb_write
 | 
						|
	;; Application int read(char *buf, int nbytes)
 | 
						|
	jmpf gdb_read
 | 
						|
 | 
						|
	.text
 | 
						|
# Reset code, set up memory and call main.
 | 
						|
_int_reset:
 | 
						|
	;; Set up the application stack pointer.
 | 
						|
	mov sp,#0x002
 | 
						|
 | 
						|
	;; Zero the data space
 | 
						|
	mov r0,#_edata
 | 
						|
	mov r1,#_end
 | 
						|
	mov r2,#0
 | 
						|
0:	mov.w (r0++),r2
 | 
						|
	blt r0,r1,0b
 | 
						|
 | 
						|
	;; Init the UART
 | 
						|
	callf uart_init
 | 
						|
 | 
						|
	;; Turn on illegal insn trap
 | 
						|
	mov   r0,r14
 | 
						|
	set1  r0,#11
 | 
						|
	mov   r14,r0
 | 
						|
	mov.b 0x7f08,#0x11
 | 
						|
	mov.b 0x7f09,#0x10
 | 
						|
 | 
						|
	;; "breakpoint" sends us into stub.
 | 
						|
0:
 | 
						|
	.hword 0x0006
 | 
						|
	br  0b
 | 
						|
 | 
						|
_int_sys:
 | 
						|
	push  r13
 | 
						|
	mov   r13,#registers
 | 
						|
	mov.w (r13++),r0
 | 
						|
	mov.w (r13++),r1
 | 
						|
	mov.w (r13++),r2
 | 
						|
	mov.w (r13++),r3
 | 
						|
	mov.w (r13++),r4
 | 
						|
	mov.w (r13++),r5
 | 
						|
	mov.w (r13++),r6
 | 
						|
	mov.w (r13++),r7
 | 
						|
	mov   r0,r8
 | 
						|
	mov.w (r13++),r0
 | 
						|
	mov   r0,r9
 | 
						|
	mov.w (r13++),r0
 | 
						|
	mov   r0,r10
 | 
						|
	mov.w (r13++),r0
 | 
						|
	mov   r0,r11
 | 
						|
	mov.w (r13++),r0
 | 
						|
	mov   r0,r12
 | 
						|
	mov.w (r13++),r0
 | 
						|
	pop   r0
 | 
						|
	mov.w (r13++),r0    ; R13
 | 
						|
	pop   r0
 | 
						|
	mov.w (r13++),r0    ; PSW
 | 
						|
	mov   r0,r15
 | 
						|
	sub   r0,#4
 | 
						|
	mov.w (r13++),r0    ; SP
 | 
						|
	pop   r0
 | 
						|
	pop   r1
 | 
						|
	mov.w (r13++),r1    ; PCL
 | 
						|
	mov.w (r13++),r0    ; PCH
 | 
						|
 | 
						|
	;; switch to stub stack and invoke stub
 | 
						|
	mov sp,#0x700
 | 
						|
	callf handle_exception
 | 
						|
 | 
						|
	mov   r0,#registers+34
 | 
						|
	mov.w r1,(r0)		; PCH
 | 
						|
	mov.w r2,(--r0)		; PCL
 | 
						|
	mov.w r3,(--r0)		; SP
 | 
						|
	mov   r15,r3
 | 
						|
	push  r2
 | 
						|
	push  r1
 | 
						|
	mov.w r1,(--r0)    ; PSW
 | 
						|
	push  r1
 | 
						|
	mov.w r1,(--r0)
 | 
						|
	mov   r13,r1
 | 
						|
	mov.w r1,(--r0)
 | 
						|
	mov   r12,r1
 | 
						|
	mov.w r1,(--r0)
 | 
						|
	mov   r11,r1
 | 
						|
	mov.w r1,(--r0)
 | 
						|
	mov   r10,r1
 | 
						|
	mov.w r1,(--r0)
 | 
						|
	mov   r9,r1
 | 
						|
	mov.w r1,(--r0)
 | 
						|
	mov   r8,r1
 | 
						|
	mov.w r7,(--r0)
 | 
						|
	mov.w r6,(--r0)
 | 
						|
	mov.w r5,(--r0)
 | 
						|
	mov.w r4,(--r0)
 | 
						|
	mov.w r3,(--r0)
 | 
						|
	mov.w r2,(--r0)
 | 
						|
	mov.w r1,(--r0)
 | 
						|
	mov.w r0,(--r0)
 | 
						|
	iret
 | 
						|
1:	.size _int_sys,1b-_int_sys
 | 
						|
 | 
						|
 |