123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- .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:
- ldk $sp,__RAMSIZE
- # Disable all interrupts
- lda $r1,0x10000
- lshr $r1,$r1,20
- cmp $r1,0x90
- ldk $r1,0x100e3 # FT900 IRQ Control Register
- jmpc z,1f
- ldk $r1,0x10123 # FT930 IRQ Control Register
- 1:
- ldk $r4,0x80
- sti.b $r1,0,$r4
- # Initialize DATA by copying from program memory
- ldk.l $r4,__data_load_start
- ldk.l $r1,__data_load_end
- ldk.l $r2,0 # Will use __data after binutils patch
- jmp .dscopy
- .dsloop:
- # Copy PM[$r4] to RAM $r2
- lpmi.l $r3,$r4,0
- sti.l $r2,0,$r3
- add.l $r4,$r4,4
- add.l $r2,$r2,4
- .dscopy:
- cmp.l $r4,$r1
- jmpc lt,.dsloop
- # Zero BSS
- ldk.l $r4,_bss_start
- ldk.l $r2,_end
- sub.l $r2,$r2,$r4
- ldk.l $r1,0
- ldk $r3,32764
- 1:
- cmp $r2,$r3
- jmpc lt,2f
- memset $r4,$r1,$r3
- add $r4,$r4,$r3
- sub $r2,$r2,$r3
- jmp 1b
- 2:
- memset $r4,$r1,$r2
- 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
- # 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
- vector_table:
- .rept 34
- .long nullvector
- .endr
- .section .text
- .global __gxx_personality_sj0
- __gxx_personality_sj0:
|