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
 | 
