📄 reset.s
字号:
moveal #_etext,%a0 | find the end of .text moveal #_copy_start,%a1 | find the beginning of .data moveal #_edata,%a2 | find the end of .data copy_data_loop: movel %a0@+,%a1@+ | copy the data cmpal %a2,%a1 jlt copy_data_loop | loop until edata reached | | zero out uninitialized data area |zerobss: moveal #_clear_end,%a0 | find end of .bss moveal #_clear_start,%a1 | find beginning of .bss moveq #0,%d0 zerobss_loop: movel %d0,%a1@+ | to zero out uninitialized cmpal %a0,%a1 jlt zerobss_loop | loop until _end reached movel #stack_end,%d0 andl #0xfffffffc,%d0 | align it on 16 byte boundary movw #0x3700,%sr | SUPV MODE,INTERRUPTS OFF!!! movel %d0,%a7 | set master stack pointer movel %d0,%a6 | set base pointer jsr boot_phase_3|| Create an unhandled exception jump table. The table has an entry for| each vector in the vector table. The entry pushes the vector number onto| the stack and then calls a common exception handler using PIC.| | The macros are to create the labels and format vectors.| #define cat(x, y) x ## y#define FORMAT_ID(n) (n << 2)#define EXCEPTION_HANDLER(h, n) EH__##n: move.w cat(h, FORMAT_ID(n)),-(%sp) ; \ bra common_exception_handlerunhandled_exception: EXCEPTION_HANDLER(#, 0)EXCEPTION_HANDLER(#, 1)EXCEPTION_HANDLER(#, 2)EXCEPTION_HANDLER(#, 3)EXCEPTION_HANDLER(#, 4)EXCEPTION_HANDLER(#, 5)EXCEPTION_HANDLER(#, 6)EXCEPTION_HANDLER(#, 7)EXCEPTION_HANDLER(#, 8)EXCEPTION_HANDLER(#, 9) EXCEPTION_HANDLER(#, 10)EXCEPTION_HANDLER(#, 11)EXCEPTION_HANDLER(#, 12)EXCEPTION_HANDLER(#, 13)EXCEPTION_HANDLER(#, 14)EXCEPTION_HANDLER(#, 15)EXCEPTION_HANDLER(#, 16)EXCEPTION_HANDLER(#, 17)EXCEPTION_HANDLER(#, 18)EXCEPTION_HANDLER(#, 19)EXCEPTION_HANDLER(#, 20)EXCEPTION_HANDLER(#, 21)EXCEPTION_HANDLER(#, 22)EXCEPTION_HANDLER(#, 23)EXCEPTION_HANDLER(#, 24)EXCEPTION_HANDLER(#, 25)EXCEPTION_HANDLER(#, 26)EXCEPTION_HANDLER(#, 27)EXCEPTION_HANDLER(#, 28)EXCEPTION_HANDLER(#, 29) EXCEPTION_HANDLER(#, 30)EXCEPTION_HANDLER(#, 31)EXCEPTION_HANDLER(#, 32)EXCEPTION_HANDLER(#, 33)EXCEPTION_HANDLER(#, 34)EXCEPTION_HANDLER(#, 35)EXCEPTION_HANDLER(#, 36)EXCEPTION_HANDLER(#, 37)EXCEPTION_HANDLER(#, 38)EXCEPTION_HANDLER(#, 39) EXCEPTION_HANDLER(#, 40)EXCEPTION_HANDLER(#, 41)EXCEPTION_HANDLER(#, 42)EXCEPTION_HANDLER(#, 43)EXCEPTION_HANDLER(#, 44)EXCEPTION_HANDLER(#, 45)EXCEPTION_HANDLER(#, 46)EXCEPTION_HANDLER(#, 47)EXCEPTION_HANDLER(#, 48)EXCEPTION_HANDLER(#, 49) EXCEPTION_HANDLER(#, 50)EXCEPTION_HANDLER(#, 51)EXCEPTION_HANDLER(#, 52)EXCEPTION_HANDLER(#, 53)EXCEPTION_HANDLER(#, 54)EXCEPTION_HANDLER(#, 55)EXCEPTION_HANDLER(#, 56)EXCEPTION_HANDLER(#, 57)EXCEPTION_HANDLER(#, 58)EXCEPTION_HANDLER(#, 59) EXCEPTION_HANDLER(#, 60)EXCEPTION_HANDLER(#, 61)EXCEPTION_HANDLER(#, 62)EXCEPTION_HANDLER(#, 63)EXCEPTION_HANDLER(#, 64)EXCEPTION_HANDLER(#, 65)EXCEPTION_HANDLER(#, 66)EXCEPTION_HANDLER(#, 67)EXCEPTION_HANDLER(#, 68)EXCEPTION_HANDLER(#, 69) EXCEPTION_HANDLER(#, 70)EXCEPTION_HANDLER(#, 71)EXCEPTION_HANDLER(#, 72)EXCEPTION_HANDLER(#, 73)EXCEPTION_HANDLER(#, 74)EXCEPTION_HANDLER(#, 75)EXCEPTION_HANDLER(#, 76)EXCEPTION_HANDLER(#, 77)EXCEPTION_HANDLER(#, 78)EXCEPTION_HANDLER(#, 79) EXCEPTION_HANDLER(#, 80)EXCEPTION_HANDLER(#, 81)EXCEPTION_HANDLER(#, 82)EXCEPTION_HANDLER(#, 83)EXCEPTION_HANDLER(#, 84)EXCEPTION_HANDLER(#, 85)EXCEPTION_HANDLER(#, 86)EXCEPTION_HANDLER(#, 87)EXCEPTION_HANDLER(#, 88)EXCEPTION_HANDLER(#, 89) EXCEPTION_HANDLER(#, 90)EXCEPTION_HANDLER(#, 91)EXCEPTION_HANDLER(#, 92)EXCEPTION_HANDLER(#, 93)EXCEPTION_HANDLER(#, 94)EXCEPTION_HANDLER(#, 95)EXCEPTION_HANDLER(#, 96)EXCEPTION_HANDLER(#, 97)EXCEPTION_HANDLER(#, 98)EXCEPTION_HANDLER(#, 99) EXCEPTION_HANDLER(#, 100)EXCEPTION_HANDLER(#, 101)EXCEPTION_HANDLER(#, 102)EXCEPTION_HANDLER(#, 103)EXCEPTION_HANDLER(#, 104)EXCEPTION_HANDLER(#, 105)EXCEPTION_HANDLER(#, 106)EXCEPTION_HANDLER(#, 107)EXCEPTION_HANDLER(#, 108)EXCEPTION_HANDLER(#, 109) EXCEPTION_HANDLER(#, 110)EXCEPTION_HANDLER(#, 111)EXCEPTION_HANDLER(#, 112)EXCEPTION_HANDLER(#, 113)EXCEPTION_HANDLER(#, 114)EXCEPTION_HANDLER(#, 115)EXCEPTION_HANDLER(#, 116)EXCEPTION_HANDLER(#, 117)EXCEPTION_HANDLER(#, 118)EXCEPTION_HANDLER(#, 119)EXCEPTION_HANDLER(#, 120)EXCEPTION_HANDLER(#, 121)EXCEPTION_HANDLER(#, 122)EXCEPTION_HANDLER(#, 123)EXCEPTION_HANDLER(#, 124)EXCEPTION_HANDLER(#, 125)EXCEPTION_HANDLER(#, 126)EXCEPTION_HANDLER(#, 127)EXCEPTION_HANDLER(#, 128)EXCEPTION_HANDLER(#, 129) EXCEPTION_HANDLER(#, 130)EXCEPTION_HANDLER(#, 131)EXCEPTION_HANDLER(#, 132)EXCEPTION_HANDLER(#, 133)EXCEPTION_HANDLER(#, 134)EXCEPTION_HANDLER(#, 135)EXCEPTION_HANDLER(#, 136)EXCEPTION_HANDLER(#, 137)EXCEPTION_HANDLER(#, 138)EXCEPTION_HANDLER(#, 139) EXCEPTION_HANDLER(#, 140)EXCEPTION_HANDLER(#, 141)EXCEPTION_HANDLER(#, 142)EXCEPTION_HANDLER(#, 143)EXCEPTION_HANDLER(#, 144)EXCEPTION_HANDLER(#, 145)EXCEPTION_HANDLER(#, 146)EXCEPTION_HANDLER(#, 147)EXCEPTION_HANDLER(#, 148)EXCEPTION_HANDLER(#, 149) EXCEPTION_HANDLER(#, 150)EXCEPTION_HANDLER(#, 151)EXCEPTION_HANDLER(#, 152)EXCEPTION_HANDLER(#, 153)EXCEPTION_HANDLER(#, 154)EXCEPTION_HANDLER(#, 155)EXCEPTION_HANDLER(#, 156)EXCEPTION_HANDLER(#, 157)EXCEPTION_HANDLER(#, 158)EXCEPTION_HANDLER(#, 159) EXCEPTION_HANDLER(#, 160)EXCEPTION_HANDLER(#, 161)EXCEPTION_HANDLER(#, 162)EXCEPTION_HANDLER(#, 163)EXCEPTION_HANDLER(#, 164)EXCEPTION_HANDLER(#, 165)EXCEPTION_HANDLER(#, 166)EXCEPTION_HANDLER(#, 167)EXCEPTION_HANDLER(#, 168)EXCEPTION_HANDLER(#, 169) EXCEPTION_HANDLER(#, 170)EXCEPTION_HANDLER(#, 171)EXCEPTION_HANDLER(#, 172)EXCEPTION_HANDLER(#, 173)EXCEPTION_HANDLER(#, 174)EXCEPTION_HANDLER(#, 175)EXCEPTION_HANDLER(#, 176)EXCEPTION_HANDLER(#, 177)EXCEPTION_HANDLER(#, 178)EXCEPTION_HANDLER(#, 179) EXCEPTION_HANDLER(#, 180)EXCEPTION_HANDLER(#, 181)EXCEPTION_HANDLER(#, 182)EXCEPTION_HANDLER(#, 183)EXCEPTION_HANDLER(#, 184)EXCEPTION_HANDLER(#, 185)EXCEPTION_HANDLER(#, 186)EXCEPTION_HANDLER(#, 187)EXCEPTION_HANDLER(#, 188)EXCEPTION_HANDLER(#, 189) EXCEPTION_HANDLER(#, 190)EXCEPTION_HANDLER(#, 191)EXCEPTION_HANDLER(#, 192)EXCEPTION_HANDLER(#, 193)EXCEPTION_HANDLER(#, 194)EXCEPTION_HANDLER(#, 195)EXCEPTION_HANDLER(#, 196)EXCEPTION_HANDLER(#, 197)EXCEPTION_HANDLER(#, 198)EXCEPTION_HANDLER(#, 199) EXCEPTION_HANDLER(#, 200)EXCEPTION_HANDLER(#, 201)EXCEPTION_HANDLER(#, 202)EXCEPTION_HANDLER(#, 203)EXCEPTION_HANDLER(#, 204)EXCEPTION_HANDLER(#, 205)EXCEPTION_HANDLER(#, 206)EXCEPTION_HANDLER(#, 207)EXCEPTION_HANDLER(#, 208)EXCEPTION_HANDLER(#, 209) EXCEPTION_HANDLER(#, 210)EXCEPTION_HANDLER(#, 211)EXCEPTION_HANDLER(#, 212)EXCEPTION_HANDLER(#, 213)EXCEPTION_HANDLER(#, 214)EXCEPTION_HANDLER(#, 215)EXCEPTION_HANDLER(#, 216)EXCEPTION_HANDLER(#, 217)EXCEPTION_HANDLER(#, 218)EXCEPTION_HANDLER(#, 219) EXCEPTION_HANDLER(#, 220)EXCEPTION_HANDLER(#, 221)EXCEPTION_HANDLER(#, 222)EXCEPTION_HANDLER(#, 223)EXCEPTION_HANDLER(#, 224)EXCEPTION_HANDLER(#, 225)EXCEPTION_HANDLER(#, 226)EXCEPTION_HANDLER(#, 227)EXCEPTION_HANDLER(#, 228)EXCEPTION_HANDLER(#, 229) EXCEPTION_HANDLER(#, 230)EXCEPTION_HANDLER(#, 231)EXCEPTION_HANDLER(#, 232)EXCEPTION_HANDLER(#, 233)EXCEPTION_HANDLER(#, 234)EXCEPTION_HANDLER(#, 235)EXCEPTION_HANDLER(#, 236)EXCEPTION_HANDLER(#, 237)EXCEPTION_HANDLER(#, 238)EXCEPTION_HANDLER(#, 239) EXCEPTION_HANDLER(#, 240)EXCEPTION_HANDLER(#, 241)EXCEPTION_HANDLER(#, 242)EXCEPTION_HANDLER(#, 243)EXCEPTION_HANDLER(#, 244)EXCEPTION_HANDLER(#, 245)EXCEPTION_HANDLER(#, 246)EXCEPTION_HANDLER(#, 247)EXCEPTION_HANDLER(#, 248)EXCEPTION_HANDLER(#, 249) EXCEPTION_HANDLER(#, 250)EXCEPTION_HANDLER(#, 251)EXCEPTION_HANDLER(#, 252)EXCEPTION_HANDLER(#, 253)EXCEPTION_HANDLER(#, 254)EXCEPTION_HANDLER(#, 255) common_exception_handler: | | Need to put the format/vector above the PC and status register | move.l %d0,-(%sp) | free a register move.w 4(%sp),%d0 | get the format/vector id | | If a bus error or address error then trash the extra | data saved on the stack | cmp.w #0x0008,%d0 beq ceh_10 cmp.w #0x000C,%d0 beq ceh_10 bra ceh_20ceh_10: move.w %d0,12(%sp) | need to move the format/id move.l (%sp)+,%d0 | recover d0 addq #8,%sp | trash the stack move.l %d0,-(%sp) | free a register, again move.w 4(%sp),%d0 | get the format/vector id ceh_20: move.w 6(%sp),4(%sp) move.w 8(%sp),6(%sp) move.w 10(%sp),8(%sp) move.w %d0,10(%sp) | put the format/vector id move.l (%sp)+,%d0 | | Save all the registers, pass control to a dump trace routine | movem.l %d0-%d7/%a0-%a7,%sp@- | | check to see if ROM is mapped to zero | move.l #(ROM_SIZE - 1),%d1 not.l %d1 lea.l %pc@(0),%a0 | were are we currently move.l %a0,%d0 | need to use a data register and.l %d1,%d0 | keep the top part of the address move.l #trace_exception,%d1 | get the linked address and.l #(ROM_SIZE - 1),%d1 | obtain the offset into the ROM or.l %d1,%d0 | apply it to the trace exception offset move.l %d0,%a0 | need an address register for jumping jsr %a0@(0)ceh_30: jmp ceh_30|| The RAM based vector table| .sect .vtable .global vector_tablevector_table: .space (256 * 4),0| | Initialised data| .sect .data .global start_frame start_frame: .space 4,0|| Uninitialised data| .sect .bss .global environ .align 2 environ: .long 0 .global heap_size .set heap_size,0x2000 .global stack_size .set stack_size,0x1000 .global stack_start stack_start:stack_base: .space 0x2000, 0stack_end: .long 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -