287 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			287 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|   | .equ SYS_REGMSC0CFG_B3  , 0x1001b | ||
|  | .equ SYS_REGIRQCTL_B3   , 0x100e3 | ||
|  | .equ MAILBOX_MEMORY     , 0x13000 | ||
|  | 
 | ||
|  | .equ	IS_IMG_SDBL_PRESENT, 0 | ||
|  | .equ	IS_IMG_D2XX_PRESENT, 0 | ||
|  | .equ	IS_IMG_DLOG_PRESENT, 0 | ||
|  | 
 | ||
|  | .section .crt0 | ||
|  | .global _start
 | ||
|  | 
 | ||
|  | _start: | ||
|  | # START Interrupt Vector Table [[ | ||
|  |         jmp     __PMSIZE-4         # RESET Vector | ||
|  |         jmp     interrupt_33	   # Watchdog reset vector | ||
|  |         jmp     interrupt_0 | ||
|  |         jmp     interrupt_1 | ||
|  |         jmp     interrupt_2 | ||
|  |         jmp     interrupt_3 | ||
|  |         jmp     interrupt_4 | ||
|  |         jmp     interrupt_5 | ||
|  |         jmp     interrupt_6 | ||
|  |         jmp     interrupt_7 | ||
|  |         jmp     interrupt_8 | ||
|  |         jmp     interrupt_9 | ||
|  |         jmp     interrupt_10 | ||
|  |         jmp     interrupt_11 | ||
|  |         jmp     interrupt_12 | ||
|  |         jmp     interrupt_13 | ||
|  |         jmp     interrupt_14 | ||
|  |         jmp     interrupt_15 | ||
|  |         jmp     interrupt_16 | ||
|  |         jmp     interrupt_17 | ||
|  |         jmp     interrupt_18 | ||
|  |         jmp     interrupt_19 | ||
|  |         jmp     interrupt_20 | ||
|  |         jmp     interrupt_21 | ||
|  |         jmp     interrupt_22 | ||
|  |         jmp     interrupt_23 | ||
|  |         jmp     interrupt_24 | ||
|  |         jmp     interrupt_25 | ||
|  |         jmp     interrupt_26 | ||
|  |         jmp     interrupt_27 | ||
|  |         jmp     interrupt_28 | ||
|  |         jmp     interrupt_29 | ||
|  |         jmp     interrupt_30 | ||
|  |         jmp     interrupt_31 | ||
|  |         jmp     __PMSIZE-8				#Interrupt vector 32 (NMI) | ||
|  | # ]] END Interrupt Vector Table | ||
|  | 
 | ||
|  | codestart: | ||
|  |         jmp    init | ||
|  |          | ||
|  | .global _exithook
 | ||
|  | _exithook:               # Debugger uses '_exithook' at 0x90 to catch program exit | ||
|  |         return | ||
|  |          | ||
|  | init: | ||
|  |         # Disable all interrupts | ||
|  |         ldk     $r0,0x80 | ||
|  | .ifdef __FT930__
 | ||
|  |         sta.b   0x10123, $r0 | ||
|  | .else | ||
|  |         sta.b   0x100e3,$r0 | ||
|  | .endif | ||
|  |          | ||
|  |         # Reset all peripherals | ||
|  |         # lda.l   $r0, 0x10018 | ||
|  |         # bins.l  $r0, $r0, 0x23F  # Set bit 31 | ||
|  |         # sta.l   0x10018, $r0 | ||
|  |          | ||
|  |         # Initialize DATA by copying from program memory | ||
|  |         ldk.l   $r0,__data_load_start | ||
|  |         ldk.l   $r1,__data_load_end | ||
|  |         ldk.l   $r2,0   # Will use __data after binutils patch | ||
|  | 
 | ||
|  |         jmp     .dscopy | ||
|  | .dsloop: | ||
|  |         # Copy PM[$r0] to RAM $r2 | ||
|  |         lpmi.l  $r3,$r0,0 | ||
|  |         sti.l   $r2,0,$r3 | ||
|  |         add.l   $r0,$r0,4 | ||
|  |         add.l   $r2,$r2,4 | ||
|  | .dscopy: | ||
|  |         cmp.l   $r0,$r1 | ||
|  |         jmpc    lt,.dsloop | ||
|  | 
 | ||
|  |         # Zero BSS | ||
|  |         ldk.l   $r0,_bss_start | ||
|  |         ldk.l   $r2,_end | ||
|  |         sub.l   $r2,$r2,$r0 | ||
|  |         ldk.l   $r1,0 | ||
|  |         ldk    $r3,32764 | ||
|  | 1: | ||
|  |         cmp    $r2,$r3 | ||
|  |         jmpc   lt,2f | ||
|  |         memset $r0,$r1,$r3 | ||
|  |         add    $r0,$r0,$r3 | ||
|  |         sub    $r2,$r2,$r3 | ||
|  |         jmp    1b | ||
|  | 2: | ||
|  |         memset $r0,$r1,$r2 | ||
|  | .ifdef __FT930__
 | ||
|  | /*##############################################################*/ | ||
|  | 		# copy UserConfig DATA from flash to mailbox memory | ||
|  | /*##############################################################*/ | ||
|  |         ldk.l   $r0,D2XX_Struct_start  /*start of d2xx config in PM memory */ | ||
|  |         ldk.l   $r1,D2XX_Struct_end /*end of d2xx config in PM memory */ | ||
|  |         ldk.l   $r2,D2XXTEST_UserD2xxConfig /* RAM cache where the d2xx config from PM to be copied*/ | ||
|  |         jmp     .configcopy | ||
|  | 
 | ||
|  | .configloop: | ||
|  |         # Copy PM[$r0] to RAM[$r2] | ||
|  |         lpmi.l  $r3,$r0,0 | ||
|  |         sti.l   $r2,0,$r3 | ||
|  |         # Increment | ||
|  |         add.l   $r0,$r0,4 | ||
|  |         add.l   $r2,$r2,4 | ||
|  | .configcopy: | ||
|  |         cmp.l   $r0,$r1 | ||
|  |         jmpc    lt,.configloop | ||
|  | 
 | ||
|  |         ldk.l   $r1,D2XX_Struct_start | ||
|  |         ldk.l   $r2,D2XX_Struct_end | ||
|  |         #compute size | ||
|  |         sub.l   $r2,$r2,$r1 | ||
|  |         ldk.l   $r1,D2XXTEST_UserD2xxConfig | ||
|  |         ldk.l   $r0,MAILBOX_MEMORY		/* D2xx config from RAM cache to be copied to Mailbox memory */ | ||
|  |         # Copy RAM[$r1] to Mailbox $r0, for $r2 bytes | ||
|  |         streamouti.b   $r0,$r1,$r2 | ||
|  | /*############################################################*/ | ||
|  | .endif | ||
|  |         sub.l   $sp,$sp,24  # Space for the caller argument frame | ||
|  |         call    main | ||
|  | 
 | ||
|  | .equ EXITEXIT    , 0x1fffc | ||
|  | 
 | ||
|  | .global _exit
 | ||
|  | _exit: | ||
|  |         sta.l   EXITEXIT,$r0    # simulator end of test | ||
|  |         jmp     _exithook | ||
|  | 
 | ||
|  | #_watchdog_isr: | ||
|  | #        ldk     $sp,__RAMSIZE | ||
|  | #        jmp     __PMSIZE-4 | ||
|  | 
 | ||
|  | # Macro to construct the interrupt stub code. | ||
|  | # it just saves r0, loads r0 with the int vector | ||
|  | # and branches to interrupt_common. | ||
|  | 
 | ||
|  | .macro  inth i=0 | ||
|  | interrupt_\i: | ||
|  |         push    $r0     # { | ||
|  |         lda     $r0,(vector_table + 4 * \i) | ||
|  |         jmp     interrupt_common | ||
|  | .endm | ||
|  | 
 | ||
|  |         inth    0 | ||
|  |         inth    1 | ||
|  |         inth    2 | ||
|  |         inth    3 | ||
|  |         inth    4 | ||
|  |         inth    5 | ||
|  |         inth    6 | ||
|  |         inth    7 | ||
|  |         inth    8 | ||
|  |         inth    9 | ||
|  |         inth    10 | ||
|  |         inth    11 | ||
|  |         inth    12 | ||
|  |         inth    13 | ||
|  |         inth    14 | ||
|  |         inth    15 | ||
|  |         inth    16 | ||
|  |         inth    17 | ||
|  |         inth    18 | ||
|  |         inth    19 | ||
|  |         inth    20 | ||
|  |         inth    21 | ||
|  |         inth    22 | ||
|  |         inth    23 | ||
|  |         inth    24 | ||
|  |         inth    25 | ||
|  |         inth    26 | ||
|  |         inth    27 | ||
|  |         inth    28 | ||
|  |         inth    29 | ||
|  |         inth    30 | ||
|  |         inth    31 | ||
|  |         inth    32 | ||
|  |         inth    33 | ||
|  | 
 | ||
|  |         # On entry: r0, already saved, holds the handler function | ||
|  | interrupt_common: | ||
|  |         push    $r1     # { | ||
|  |         push    $r2     # { | ||
|  |         push    $r3     # { | ||
|  |         push    $r4     # { | ||
|  |         push    $r5     # { | ||
|  |         push    $r6     # { | ||
|  |         push    $r7     # { | ||
|  |         push    $r8     # { | ||
|  |         push    $r9     # { | ||
|  |         push    $r10    # { | ||
|  |         push    $r11    # { | ||
|  |         push    $r12    # { | ||
|  |         push    $cc     # { | ||
|  | 
 | ||
|  |         calli   $r0 | ||
|  | 
 | ||
|  |         pop     $cc     # } | ||
|  |         pop     $r12    # } | ||
|  |         pop     $r11    # } | ||
|  |         pop     $r10    # } | ||
|  |         pop     $r9     # } | ||
|  |         pop     $r8     # } | ||
|  |         pop     $r7     # } | ||
|  |         pop     $r6     # } | ||
|  |         pop     $r5     # } | ||
|  |         pop     $r4     # } | ||
|  |         pop     $r3     # } | ||
|  |         pop     $r2     # } | ||
|  |         pop     $r1     # } | ||
|  |         pop     $r0     # } matching push in interrupt_0-31 above | ||
|  |         reti | ||
|  | 
 | ||
|  |         # Null function for unassigned interrupt to point at | ||
|  | .global     nullvector
 | ||
|  | nullvector: | ||
|  |         return | ||
|  | 
 | ||
|  | .section .data | ||
|  | .global vector_table
 | ||
|  | 	.align (4)			# assembler alignment is in the power of 2 (in this case 2^4) | ||
|  | vector_table: | ||
|  |         .rept 34
 | ||
|  |                 .long   nullvector
 | ||
|  |         .endr | ||
|  | 
 | ||
|  | 
 | ||
|  | .section .text | ||
|  | .global __gxx_personality_sj0
 | ||
|  | __gxx_personality_sj0: | ||
|  | 
 | ||
|  | 
 | ||
|  | 	.section ._flash_d2xx_config | ||
|  | .global __pD2XXDefaultConfiguration
 | ||
|  | 	.align (10) | ||
|  | 
 | ||
|  | D2XX_partition_start = . | ||
|  | 
 | ||
|  | .if IS_IMG_D2XX_PRESENT
 | ||
|  | .ifdef __FT930__
 | ||
|  | .include "ft930_d2xx_default_config.inc" | ||
|  | .else | ||
|  | .include "ft900_d2xx_default_config.inc" | ||
|  | .endif | ||
|  | .endif | ||
|  | 
 | ||
|  | D2XX_partition_end = . | ||
|  | 
 | ||
|  | 	.section ._flash_dlog_partition | ||
|  | 	.align (10) | ||
|  | .global __dlog_partition
 | ||
|  | __dlog_partition: | ||
|  | dlog_partition_start = . | ||
|  | .if IS_IMG_DLOG_PRESENT
 | ||
|  | 	.long	0xF7D1D106
 | ||
|  | 	.rept  (0x1000-4) | ||
|  | 	.byte	0xFF
 | ||
|  | 	.endr | ||
|  | .endif | ||
|  | dlog_partition_end = . | ||
|  | 
 | ||
|  | 	.section ._pm | ||
|  | .global	__sdbl_partition_sizeof
 | ||
|  | .global __D2XX_partition_sizeof
 | ||
|  | .global __dlog_partition_sizeof
 | ||
|  | 	.if IS_IMG_SDBL_PRESENT
 | ||
|  | __sdbl_partition_sizeof = 0x2000 | ||
|  | 	.else | ||
|  | __sdbl_partition_sizeof = 0 | ||
|  | 	.endif | ||
|  | 
 | ||
|  | __D2XX_partition_sizeof = D2XX_partition_end - D2XX_partition_start | ||
|  | __dlog_partition_sizeof = dlog_partition_end - dlog_partition_start |