See: loader_analysis
Disable exceptions
006100:( 078) 9E80 : CLRSR FE 006102:( 078) 9E81 : CLRSR IE 006104:( 078) 9E82 : CLRSR TE
R2 is a parameter: pointer to flasher function.
R1 = R2 > 100; if (R1) {overwrite R2 with value from memory;}
006106:( 002) 1501 : LD R5, #1H 006108:( 059) 89F2 0100: CMPGT R2, #100H 00610C:( 160) D804 : BRT rel_006116 00610E:( 137) A9A0 7FA0: LD A9, #data_207FA0 006112:( 005) 4210 : LDW R2, @[A9 + 0H] 006114:( 002) 1500 : LD R5, #0H
rel_006116: 0x00610C(R) 006116:( 002) 1300 : LD R3, #0H 006118:( 137) ADBF 00B1: LD A13, #UCON ; UCON: UART control register Reset=00H RW=R/W 00611C:( 013) 7350 : LDB @[A13 + 0H], R3 00611E:( 137) ADBF 00B2: LD A13, #USSR ; USSR: UART status register Reset=C0H RW=R 006122:( 013) 7350 : LDB @[A13 + 0H], R3 006124:( 137) ADBF 0000: LD A13, #IO_BASE ; Memory mapped IO base address 006128:( 129) A335 0140: LDB R3, @[A13 + 140H] 00612C:( 055) 85F3 002F: OR R3, #002FH 006130:( 130) A33D 0140: LDB @[A13 + 140H], R3 006134:( 081) 9E98 : NOP 006136:( 081) 9E98 : NOP 006138:( 081) 9E98 : NOP
rel_00613A: 0x006146(R) 00613A:( 137) ADBF 0140: LD A13, #CACHECON ; CACHECON: CACHE Control register Reset=00H RW=R/W 00613E:( 009) 6350 : LDB R3, @[A13 + 0H] 006140:( 054) 84F3 0040: AND R3, #0040H 006144:( 065) 9300 : CMPEQ R3, #0H 006146:( 158) D3F9 : BRF rel_00613A 006148:( 081) 9E98 : NOP 00614A:( 081) 9E98 : NOP
Clear TCC730 internal memory.
00614C:( 137) ACA0 6000: LD A12, #TCC730_INTERNAL 006150:( 063) 8DF6 0FFF: LD R6, #fffH 006154:( 002) 1900 : LD R9, #0H rel_006156: 0x00615A(R) 006156:( 007) 5940 : LDW @[A12 + 0], R9 006158:( 134) AC42 : ADD A12, #2H 00615A:( 154) C67D : BNZD R6, rel_006156 00615C:( 081) 9E98 : NOP
Fix 207FA0, that we’ve just cleared.
00615E:( 137) A9A0 7FA0: LD A9, #data_207FA0 006162:( 007) 5210 : LDW @[A9 + 0], R2
NOP
Init memory at 002000.
memcpy(to=002000, from=code(069BE2), len=0012FE);
006164:( 137) A980 12FE: LD A9, #data_0012FE 006168:( 136) A180 0000: CMPEQ A9, #ZERO 00616C:( 160) D812 : BRT rel_006192 00616E:( 123) A611 : LD R6, E9 006170:( 137) AB86 9BE2: LD A11, #data_069BE2 006174:( 137) A880 2000: LD A8, #data_002000 rel_006178: 0x00618A(R), 0x006190(R) 006178:( 121) A203 : LDC R2, @A11 00617A:( 007) 5200 : LDW @[A8 + 0], R2 00617C:( 134) AB42 : ADD A11, #2H 00617E:( 134) A842 : ADD A8, #2H 006180:( 001) 0982 : SUB R9, #2H 006182:( 053) 83F6 0000: SBC R6, #0H 006186:( 061) 8BF6 0000: CMPUGT R6, #0H 00618A:( 160) DBF6 : BRT rel_006178 00618C:( 061) 8BF9 0000: CMPUGT R9, #0H 006190:( 160) DBF3 : BRT rel_006178
Init memory at 002000.
memset(to=0032FE, what=0, len=06A120);
rel_006192: 0x00616C(R) 006192:( 137) A986 A120: LD A9, #data_06A120 006196:( 136) A180 0000: CMPEQ A9, #ZERO 00619A:( 160) D80F : BRT rel_0061BA 00619C:( 123) A611 : LD R6, E9 00619E:( 002) 1400 : LD R4, #0H 0061A0:( 137) A880 32FE: LD A8, #data_0032FE rel_0061A4: 0x0061B2(R), 0x0061B8(R) 0061A4:( 007) 5400 : LDW @[A8 + 0], R4 0061A6:( 134) A842 : ADD A8, #2H 0061A8:( 001) 0982 : SUB R9, #2H 0061AA:( 053) 83F6 0000: SBC R6, #0H 0061AE:( 061) 8BF6 0000: CMPUGT R6, #0H 0061B2:( 160) DBF8 : BRT rel_0061A4 0061B4:( 061) 8BF9 0000: CMPUGT R9, #0H 0061B8:( 160) DBF5 : BRT rel_0061A4
Set stack pointer. Will grow to lower addresses.
rel_0061BA: 0x00619A(R) 0061BA:( 137) AF87 FFFE: LD A15, #data_07FFFE
*(u32*)002614 = *(u32*)06D41E
0061BE:( 137) A986 D41E: LD A9, #data_06D41E 0061C2:( 137) A880 2614: LD A8, #data_002614 0061C6:( 007) 5901 : LDW @[A8 + 2], R9 0061C8:( 123) A411 : LD R4, E9 0061CA:( 007) 5400 : LDW @[A8 + 0], R4
0061CC:( 063) 8DF4 F800: LD R4, #f800H 0061D0:( 050) 81F1 0800: ADD A9, #0800H 0061D4:( 021) 8944 : AND R9, R4 0061D6:( 137) A880 2624: LD A8, #data_002624 0061DA:( 007) 5901 : LDW @[A8 + 2], R9 0061DC:( 123) A411 : LD R4, E9 0061DE:( 007) 5400 : LDW @[A8 + 0], R4 0061E0:( 137) A880 2618: LD A8, #data_002618 0061E4:( 005) 4902 : LDW R9, @[A8 + 4H] 0061E6:( 005) 4400 : LDW R4, @[A8 + 0H] 0061E8:( 124) A419 : LD E9, R4 0061EA:( 135) A962 : SUB A9, #2H 0061EC:( 137) A880 2618: LD A8, #data_002618 0061F0:( 007) 5901 : LDW @[A8 + 2], R9 0061F2:( 123) A411 : LD R4, E9 0061F4:( 007) 5400 : LDW @[A8 + 0], R4 0061F6:( 126) AF19 : LD A15, A9 0061F8:( 063) 8DF4 CAFE: LD R4, #cafeH 0061FC:( 137) A880 2620: LD A8, #data_002620 006200:( 005) 4600 : LDW R6, @[A8 + 0H] 006202:( 035) 84E6 : SR R6 rel_006204: 0x00620E(R) 006204:( 007) 5410 : LDW @[A9 + 0], R4 006206:( 135) A962 : SUB A9, #2H 006208:( 001) 0681 : SUB R6, #1H 00620A:( 061) 8BF6 0000: CMPUGT R6, #0H 00620E:( 160) DBFA : BRT rel_006204
006210:( 134) A942 : ADD A9, #2H 006212:( 137) A880 261C: LD A8, #data_00261C 006216:( 007) 5901 : LDW @[A8 + 2], R9 006218:( 123) A411 : LD R4, E9 00621A:( 007) 5400 : LDW @[A8 + 0], R4 00621C:( 137) A880 2624: LD A8, #data_002624 006220:( 005) 4B01 : LDW R11, @[A8 + 2H] 006222:( 005) 4400 : LDW R4, @[A8 + 0H] 006224:( 123) A611 : LD R6, E9 006226:( 018) 891B : SUB R9, R11 006228:( 020) 8634 : SBC R6, R4 00622A:( 135) A974 : SUB A9, #14H 00622C:( 053) 83F6 0000: SBC R6, #0H 006230:( 124) A619 : LD E9, R6 006232:( 063) 8DF4 F800: LD R4, #f800H 006236:( 021) 8944 : AND R9, R4 006238:( 137) A880 2628: LD A8, #data_002628 00623C:( 007) 5901 : LDW @[A8 + 2], R9 00623E:( 123) A411 : LD R4, E9 006240:( 007) 5400 : LDW @[A8 + 0], R4 006242:( 137) A980 2000: LD A9, #data_002000 006246:( 002) 1900 : LD R9, #0H 006248:( 137) A8BF 0000: LD A8, #IO_BASE ; Memory mapped IO base address
Load interrupt handlers.
00624C:( 120) 9FC4 B570: JSR loadInterruptHandlers 006250:( 081) 9E98 : NOP 006252:( 081) 9E98 : NOP
Copy R5 to 00262C. So,
*00262C == 0 iff we didn’t recieve flasher function in R2.
006254:( 137) AC80 262C: LD A12, #data_00262C 006258:( 007) 5540 : LDW @[A12 + 0], R5
Proceed.
00625A:( 120) 9FC3 B444: JSR powerON 00625E:( 081) 9E98 : NOP 006260:( 039) 87E6 : JMP A14 (Return)