| 
									
										
										
										
											2021-10-05 13:54:47 +01:00
										 |  |  | .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 | 
					
						
							| 
									
										
										
										
											2023-03-17 16:12:49 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 13:54:47 +01:00
										 |  |  | .global _exithook
 | 
					
						
							|  |  |  | _exithook:               # Debugger uses '_exithook' at 0x90 to catch program exit | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2023-03-17 16:12:49 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 13:54:47 +01:00
										 |  |  | init: | 
					
						
							|  |  |  |         # Disable all interrupts | 
					
						
							|  |  |  |         ldk     $r0,0x80 | 
					
						
							|  |  |  | .ifdef __FT930__
 | 
					
						
							|  |  |  |         sta.b   0x10123, $r0 | 
					
						
							|  |  |  | .else | 
					
						
							|  |  |  |         sta.b   0x100e3,$r0 | 
					
						
							|  |  |  | .endif | 
					
						
							| 
									
										
										
										
											2023-03-17 16:12:49 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 13:54:47 +01:00
										 |  |  |         # Reset all peripherals | 
					
						
							|  |  |  |         # lda.l   $r0, 0x10018 | 
					
						
							|  |  |  |         # bins.l  $r0, $r0, 0x23F  # Set bit 31 | 
					
						
							|  |  |  |         # sta.l   0x10018, $r0 | 
					
						
							| 
									
										
										
										
											2023-03-17 16:12:49 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 13:54:47 +01:00
										 |  |  |         # 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 |