# HG changeset patch # User Mychaela Falconia # Date 1673689666 0 # Node ID 5377f91aea97a105fa875e9ead14bb5071fd5bfa # Parent 81cda18b04877fe5a04d8af9a7b2ffd27fa178ba compal/boot/c123-boot.disasm: annotate with symbols diff -r 81cda18b0487 -r 5377f91aea97 compal/boot/c123-boot.disasm --- a/compal/boot/c123-boot.disasm Sat Jan 14 06:17:56 2023 +0000 +++ b/compal/boot/c123-boot.disasm Sat Jan 14 09:47:46 2023 +0000 @@ -1,3 +1,12 @@ +; The bootloader version analyzed here is almost exactly the same as the one +; contained in the special R87.2.1.03.{m0,map} firmware version; the only diffs +; are the 4 magic words at 0x20 (not present in the symbolic reference version) +; and the different stack address in the 0x964 word. +; +; The present disassembly analysis has been annotated with symbolic information +; from R87.2.1.03.map, making it our best available analysis of Compal's flash +; bootloader. + RESET entry and exception vectors: 0: ea000225 b 0x89c 4: ea000825 b 0x20a0 @@ -15,11 +24,20 @@ <30-7FF: all FFs> +; .boot_id output section, comes from ver_boot.obj .const section, +; 0x18 bytes, has these data symbols: + +_ver_boot = 0x800 +_loader_ver = 0x810 +_SWVCM = 0x814 + 00000800: 42 4F 4F 54 2E 39 30 2E 30 34 00 00 00 00 00 00 BOOT.90.04...... 00000810: 31 30 30 33 01 01 00 00 FF FF FF FF FF FF FF FF 1003............ 00000820: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................ ; everything up to 0x958 is the same as in the C139 version + +; serial.obj .const section 830: 00000006 834: 00000000 838: 00000000 @@ -35,6 +53,8 @@ 860: 000000fa 864: ffff5800 868: ffff5000 + +; bootloader.obj .text section 86c: fffffb00 870: 02a102a1 874: 028302a1 @@ -49,6 +69,7 @@ 898: 00000800 ; RESET entry point +_INT_Bootloader_Start: 89c: e51f1020 ldr r1, =0xfffffd00 ; via 0x884 8a0: e1d120b2 ldrh r2, [r1, #2] 8a4: e51f002c ldr r0, =0x40 ; via 0x880 @@ -97,13 +118,14 @@ 950: e1a0d002 mov sp, r2 ; business logic 954: e92d100f stmdb sp!, {r0, r1, r2, r3, r12} - 958: eb00051e bl 0x1dd8 + 958: eb00051e bl 0x1dd8 ; _sta_select_application 95c: e8bd100f ldmia sp!, {r0, r1, r2, r3, r12} - 960: ea0005e4 b 0x20f8 + 960: ea0005e4 b 0x20f8 ; _INT_Initialize ; stack address, varies by version 964: 0083e424 +; start.obj .text section ; 0x968 routine same as in the C139 version 968: 4961 ldr r1, =0xfffffa08 ; via 0xaf0 96a: 4862 ldr r0, =0xffff ; via 0xaf4 @@ -274,13 +296,14 @@ ad0: bd00 pop {pc} ; Main entry routine at the same location as in the C139 version +$sta_select_application: ad2: b500 push {lr} ad4: b082 sub sp, #8 ad6: f7ff ff47 bl 0x968 - ada: f001 f881 bl 0x1be0 - ade: f000 fd47 bl 0x1570 - ae2: f000 f81f bl 0xb24 - ae6: f000 f940 bl 0xd6a + ada: f001 f881 bl 0x1be0 ; $ser_initialize_serial_link + ade: f000 fd47 bl 0x1570 ; $con_initialize_conversion + ae2: f000 f81f bl 0xb24 ; $fluid_bootloader + ae6: f000 f940 bl 0xd6a ; $FTM_Tool_check aea: b002 add sp, #8 aec: bd00 pop {pc} aee: 46c0 nop (mov r8, r8) @@ -294,6 +317,7 @@ b08: fffffd00 b0c: 00001001 +; boot.obj .text section b10: e3a0d502 mov sp, #8388608 ; 0x800000 b14: e28dd802 add sp, sp, #131072 ; 0x20000 b18: e28fe005 add lr, pc, #5 @@ -302,6 +326,7 @@ ; 0xb24 function appears to be the same as in the C139 version, ; but calls 0xed4 instead of 0xf2c. +$fluid_bootloader: b24: b500 push {lr} b26: b082 sub sp, #8 b28: 49e8 ldr r1, =0x83ff00 ; via 0xecc @@ -309,7 +334,7 @@ b2c: 6008 str r0, [r1, #0] b2e: 2000 mov r0, #0 b30: 2102 mov r1, #2 - b32: f000 f9cf bl 0xed4 + b32: f000 f9cf bl 0xed4 ; $uart_init b36: 2000 mov r0, #0 b38: 9000 str r0, [sp, #0] b3a: 9900 ldr r1, [sp, #0] @@ -325,10 +350,10 @@ b4e: 0300 lsl r0, r0, #12 b50: 4281 cmp r1, r0 b52: d3f7 bcc 0xb44 - b54: f000 f82a bl 0xbac + b54: f000 f82a bl 0xbac ; $SeekMsg b58: 2000 mov r0, #0 b5a: 2107 mov r1, #7 - b5c: f000 f9ba bl 0xed4 + b5c: f000 f9ba bl 0xed4 ; $uart_init b60: 2000 mov r0, #0 b62: 9000 str r0, [sp, #0] b64: 9900 ldr r1, [sp, #0] @@ -344,7 +369,7 @@ b78: 0300 lsl r0, r0, #12 b7a: 4281 cmp r1, r0 b7c: d3f7 bcc 0xb6e - b7e: f000 f815 bl 0xbac + b7e: f000 f815 bl 0xbac ; $SeekMsg b82: 2000 mov r0, #0 b84: 9001 str r0, [sp, #4] b86: 9000 str r0, [sp, #0] @@ -368,6 +393,7 @@ baa: bd00 pop {pc} ; serial download protocol +$SeekMsg: bac: b500 push {lr} bae: b086 sub sp, #24 ; 0x18 bb0: 48f3 ldr r0, =0x800100 ; via 0xf80 @@ -552,6 +578,7 @@ d66: b006 add sp, #24 ; 0x18 d68: bd00 pop {pc} +$FTM_Tool_check: d6a: b500 push {lr} d6c: b081 sub sp, #4 d6e: 2066 mov r0, #102 ; 0x66 @@ -626,6 +653,7 @@ e20: bd00 pop {pc} ; corresponds to 0xe76 in the C139 version +$jump: e22: 4708 bx r1 ; UART character output routine, corresponds to 0xe78 in the C139 version @@ -645,6 +673,7 @@ e3e: b001 add sp, #4 e40: 46f7 mov pc, lr +$getchar: e42: 4822 ldr r0, =0x83ff00 ; via 0xecc e44: 6800 ldr r0, [r0, #0] e46: 7940 ldrb r0, [r0, #5] @@ -656,6 +685,7 @@ e52: 4770 bx lr ; should correspond to 0xea8 in the C139 version +$getchar_timeout: e54: b083 sub sp, #12 ; 0xc e56: 9000 str r0, [sp, #0] e58: 9800 ldr r0, [sp, #0] @@ -684,6 +714,7 @@ e86: b003 add sp, #12 ; 0xc e88: 4770 bx lr +$UartTimeout: e8a: b081 sub sp, #4 e8c: e001 b 0xe92 e8e: 9800 ldr r0, [sp, #0] @@ -705,6 +736,8 @@ eae: 2001 mov r0, #1 eb0: b001 add sp, #4 eb2: 4770 bx lr + +$hardware_init: eb4: b082 sub sp, #8 eb6: 9000 str r0, [sp, #0] eb8: 4669 mov r1, sp @@ -722,6 +755,7 @@ ed0: ffff5800 ; should be the same as 0xf2c in the C139 version +$uart_init: ed4: b081 sub sp, #4 ed6: 466a mov r2, sp ed8: 7051 strb r1, [r2, #1] @@ -805,6 +839,7 @@ f74: b001 add sp, #4 f76: 4770 bx lr +$CheckFTMtoolMode: f78: 480a ldr r0, =0x83ff80 ; via 0xfa4 f7a: 7800 ldrb r0, [r0, #0] f7c: 4770 bx lr @@ -812,6 +847,7 @@ f80: 00800100 +$putchar__: f84: b500 push {lr} f86: b081 sub sp, #4 f88: 4669 mov r1, sp @@ -821,20 +857,25 @@ f90: f7ff ff48 bl 0xe24 f94: b001 add sp, #4 f96: bd00 pop {pc} + +$getchar__: f98: b500 push {lr} f9a: f7ff ff52 bl 0xe42 f9e: bd00 pop {pc} - fa0: 0100 lsl r0, r0, #4 - fa2: 0080 lsl r0, r0, #2 - fa4: ff80 - fa6: 0083 lsl r3, r0, #2 - fa8: f000 fffe bl 0x1fa8 - fac: 6000 str r0, [r0, #0] - fae: ffff - fb0: ff00 - fb2: 0083 lsl r3, r0, #2 + + fa0: 00800100 + fa4: 0083ff80 + fa8: fffef000 + fac: ffff6000 + fb0: 0083ff00 + +; branch_in_RAM.obj .text section +$Branch_in_RAM: fb4: 4700 bx r0 - fb6: 0000 lsl r0, r0, #0 + fb6: 0000 + +; command.obj .text section +$com_analyze_request: fb8: b08c sub sp, #48 ; 0x30 fba: 9101 str r1, [sp, #4] fbc: 9000 str r0, [sp, #0] @@ -1031,28 +1072,19 @@ 113a: 0089 lsl r1, r1, #2 113c: 5840 ldr r0, [r0, r1] 113e: 4687 mov pc, r0 - 1140: 116c asr r4, r5, #5 - 1142: 0000 lsl r0, r0, #0 - 1144: 116c asr r4, r5, #5 - 1146: 0000 lsl r0, r0, #0 - 1148: 116c asr r4, r5, #5 - 114a: 0000 lsl r0, r0, #0 - 114c: 116c asr r4, r5, #5 - 114e: 0000 lsl r0, r0, #0 - 1150: 116c asr r4, r5, #5 - 1152: 0000 lsl r0, r0, #0 - 1154: 116c asr r4, r5, #5 - 1156: 0000 lsl r0, r0, #0 - 1158: 116c asr r4, r5, #5 - 115a: 0000 lsl r0, r0, #0 - 115c: 0fde lsr r6, r3, #31 - 115e: 0000 lsl r0, r0, #0 - 1160: 1032 asr r2, r6, #32 - 1162: 0000 lsl r0, r0, #0 - 1164: 116c asr r4, r5, #5 - 1166: 0000 lsl r0, r0, #0 - 1168: 10d6 asr r6, r2, #3 - 116a: 0000 lsl r0, r0, #0 + + 1140: 0000116c + 1144: 0000116c + 1148: 0000116c + 114c: 0000116c + 1150: 0000116c + 1154: 0000116c + 1158: 0000116c + 115c: 00000fde + 1160: 00001032 + 1164: 0000116c + 1168: 000010d6 + 116c: 9905 ldr r1, [sp, #20] ; 0x14 116e: 9804 ldr r0, [sp, #16] ; 0x10 1170: 4281 cmp r1, r0 @@ -1062,6 +1094,8 @@ 1178: 9803 ldr r0, [sp, #12] ; 0xc 117a: b00c add sp, #48 ; 0x30 117c: 4770 bx lr + +$com_build_confirmation: 117e: b089 sub sp, #36 ; 0x24 1180: 9101 str r1, [sp, #4] 1182: 9000 str r0, [sp, #0] @@ -1329,28 +1363,19 @@ 138e: 0080 lsl r0, r0, #2 1390: 5808 ldr r0, [r1, r0] 1392: 4687 mov pc, r0 - 1394: 11ba asr r2, r7, #6 - 1396: 0000 lsl r0, r0, #0 - 1398: 11f4 asr r4, r6, #7 - 139a: 0000 lsl r0, r0, #0 - 139c: 1212 asr r2, r2, #8 - 139e: 0000 lsl r0, r0, #0 - 13a0: 121e asr r6, r3, #8 - 13a2: 0000 lsl r0, r0, #0 - 13a4: 13c0 asr r0, r0, #15 - 13a6: 0000 lsl r0, r0, #0 - 13a8: 122a asr r2, r5, #8 - 13aa: 0000 lsl r0, r0, #0 - 13ac: 1294 asr r4, r2, #10 - 13ae: 0000 lsl r0, r0, #0 - 13b0: 12a0 asr r0, r4, #10 - 13b2: 0000 lsl r0, r0, #0 - 13b4: 13c0 asr r0, r0, #15 - 13b6: 0000 lsl r0, r0, #0 - 13b8: 132c asr r4, r5, #12 - 13ba: 0000 lsl r0, r0, #0 - 13bc: 13c0 asr r0, r0, #15 - 13be: 0000 lsl r0, r0, #0 + + 1394: 000011ba + 1398: 000011f4 + 139c: 00001212 + 13a0: 0000121e + 13a4: 000013c0 + 13a8: 0000122a + 13ac: 00001294 + 13b0: 000012a0 + 13b4: 000013c0 + 13b8: 0000132c + 13bc: 000013c0 + 13c0: 9805 ldr r0, [sp, #20] ; 0x14 13c2: 4669 mov r1, sp 13c4: 7c09 ldrb r1, [r1, #16] ; 0x10 @@ -1358,7 +1383,10 @@ 13c8: 9803 ldr r0, [sp, #12] ; 0xc 13ca: b009 add sp, #36 ; 0x24 13cc: 4770 bx lr - 13ce: 0000 lsl r0, r0, #0 + 13ce: 0000 + +; convert.obj .text section +$con_get_command_from_string: 13d0: b500 push {lr} 13d2: b083 sub sp, #12 ; 0xc 13d4: 9101 str r1, [sp, #4] @@ -1492,6 +1520,8 @@ 14d6: 9802 ldr r0, [sp, #8] 14d8: b003 add sp, #12 ; 0xc 14da: bd00 pop {pc} + +$con_build_string_from_command: 14dc: b086 sub sp, #24 ; 0x18 14de: 9202 str r2, [sp, #8] 14e0: 9101 str r1, [sp, #4] @@ -1568,6 +1598,7 @@ 156e: 4770 bx lr ; same as 0x15c8 in the C139 version +$con_initialize_conversion: 1570: 4907 ldr r1, =0x83ff08 ; via 0x1590 1572: 2000 mov r0, #0 1574: 6008 str r0, [r1, #0] @@ -1583,6 +1614,8 @@ 158c: 0083ff0c 1590: 0083ff08 +; optboot.obj .text section +$opt_get_monitor_id: 1594: b082 sub sp, #8 1596: 9101 str r1, [sp, #4] 1598: 9000 str r0, [sp, #0] @@ -1603,6 +1636,8 @@ 15b6: 7181 strb r1, [r0, #6] 15b8: b002 add sp, #8 15ba: 4770 bx lr + +$opt_load_application: 15bc: b500 push {lr} 15be: b084 sub sp, #16 ; 0x10 15c0: 466b mov r3, sp @@ -1657,6 +1692,8 @@ 1624: d0e6 beq 0x15f4 1626: b004 add sp, #16 ; 0x10 1628: bd00 pop {pc} + +$opt_get_running_address: 162a: b084 sub sp, #16 ; 0x10 162c: 9101 str r1, [sp, #4] 162e: 9000 str r0, [sp, #0] @@ -1682,6 +1719,8 @@ 1656: 9803 ldr r0, [sp, #12] ; 0xc 1658: b004 add sp, #16 ; 0x10 165a: 4770 bx lr + +; serial.obj .text section 165c: b085 sub sp, #20 ; 0x14 165e: 9303 str r3, [sp, #12] ; 0xc 1660: 9202 str r2, [sp, #8] @@ -1743,6 +1782,7 @@ 16d0: 9804 ldr r0, [sp, #16] ; 0x10 16d2: b005 add sp, #20 ; 0x14 16d4: 46f7 mov pc, lr + 16d6: b083 sub sp, #12 ; 0xc 16d8: 9101 str r1, [sp, #4] 16da: 4669 mov r1, sp @@ -1829,6 +1869,7 @@ 177c: 9802 ldr r0, [sp, #8] 177e: b003 add sp, #12 ; 0xc 1780: 46f7 mov pc, lr + 1782: b083 sub sp, #12 ; 0xc 1784: 9101 str r1, [sp, #4] 1786: 4669 mov r1, sp @@ -1869,6 +1910,7 @@ 17cc: 9802 ldr r0, [sp, #8] 17ce: b003 add sp, #12 ; 0xc 17d0: 46f7 mov pc, lr + 17d2: b083 sub sp, #12 ; 0xc 17d4: 9101 str r1, [sp, #4] 17d6: 4669 mov r1, sp @@ -1916,6 +1958,7 @@ 182a: 9802 ldr r0, [sp, #8] 182c: b003 add sp, #12 ; 0xc 182e: 46f7 mov pc, lr + 1830: b081 sub sp, #4 1832: 4669 mov r1, sp 1834: 7008 strb r0, [r1, #0] @@ -1938,6 +1981,7 @@ 1856: 6001 str r1, [r0, #0] 1858: b001 add sp, #4 185a: 46f7 mov pc, lr + 185c: b084 sub sp, #16 ; 0x10 185e: 9202 str r2, [sp, #8] 1860: 9101 str r1, [sp, #4] @@ -2006,6 +2050,7 @@ 18de: 9803 ldr r0, [sp, #12] ; 0xc 18e0: b004 add sp, #16 ; 0x10 18e2: 46f7 mov pc, lr + 18e4: b083 sub sp, #12 ; 0xc 18e6: 9101 str r1, [sp, #4] 18e8: 4669 mov r1, sp @@ -2033,6 +2078,7 @@ 1914: 9802 ldr r0, [sp, #8] 1916: b003 add sp, #12 ; 0xc 1918: 46f7 mov pc, lr + 191a: b085 sub sp, #20 ; 0x14 191c: 466b mov r3, sp 191e: 719a strb r2, [r3, #6] @@ -2082,6 +2128,8 @@ 1976: d1e0 bne 0x193a 1978: b005 add sp, #20 ; 0x14 197a: 46f7 mov pc, lr + +$ser_wait_no_activity: 197c: b082 sub sp, #8 197e: 4669 mov r1, sp 1980: 7008 strb r0, [r1, #0] @@ -2129,6 +2177,8 @@ 19d4: dbdd blt 0x1992 19d6: b002 add sp, #8 19d8: 4770 bx lr + +$ser_send_command: 19da: b500 push {lr} 19dc: b08c sub sp, #48 ; 0x30 19de: 466a mov r2, sp @@ -2156,20 +2206,16 @@ 1a0e: 9802 ldr r0, [sp, #8] 1a10: b00c add sp, #48 ; 0x30 1a12: bd00 pop {pc} - 1a14: ff19 - 1a16: 0083 lsl r3, r0, #2 - 1a18: ff1a - 1a1a: 0083 lsl r3, r0, #2 - 1a1c: ff26 - 1a1e: 0083 lsl r3, r0, #2 - 1a20: ff24 - 1a22: 0083 lsl r3, r0, #2 - 1a24: ff20 - 1a26: 0083 lsl r3, r0, #2 - 1a28: ff1b - 1a2a: 0083 lsl r3, r0, #2 - 1a2c: ff18 - 1a2e: 0083 lsl r3, r0, #2 + + 1a14: 0083ff19 + 1a18: 0083ff1a + 1a1c: 0083ff26 + 1a20: 0083ff24 + 1a24: 0083ff20 + 1a28: 0083ff1b + 1a2c: 0083ff18 + +$ser_receive_command: 1a30: b500 push {lr} 1a32: b084 sub sp, #16 ; 0x10 1a34: 9101 str r1, [sp, #4] @@ -2260,12 +2306,12 @@ 1ae2: 7b00 ldrb r0, [r0, #12] ; 0xc 1ae4: b004 add sp, #16 ; 0x10 1ae6: bd00 pop {pc} - 1ae8: ff1c - 1aea: 0083 lsl r3, r0, #2 - 1aec: 0830 lsr r0, r6, #32 - 1aee: 0000 lsl r0, r0, #0 - 1af0: 084c lsr r4, r1, #1 - 1af2: 0000 lsl r0, r0, #0 + + 1ae8: 0083ff1c + 1aec: 00000830 + 1af0: 0000084c + +$ser_receive_data_for_flash: 1af4: b500 push {lr} 1af6: b086 sub sp, #24 ; 0x18 1af8: 466b mov r3, sp @@ -2365,6 +2411,8 @@ 1bc2: 9805 ldr r0, [sp, #20] ; 0x14 1bc4: b006 add sp, #24 ; 0x18 1bc6: bd00 pop {pc} + +$ser_initialize_flash_data_detection: 1bc8: 4942 ldr r1, =0x83ff20 ; via 0x1cd4 1bca: 2001 mov r0, #1 1bcc: 6008 str r0, [r1, #0] @@ -2380,6 +2428,7 @@ ; hoping this routine will be the same as 0x1c38 in the C139 version ; same length, looks the same on inspection +$ser_initialize_serial_link: 1be0: b081 sub sp, #4 1be2: 483f ldr r0, =0xffff5800 ; via 0x1ce0 1be4: 9000 str r0, [sp, #0] @@ -2469,6 +2518,7 @@ 1c8c: b001 add sp, #4 1c8e: 4770 bx lr +$ser_wait_last_character_sent: 1c90: b081 sub sp, #4 1c92: 4669 mov r1, sp 1c94: 7008 strb r0, [r1, #0] @@ -2497,24 +2547,19 @@ 1cc2: d3f3 bcc 0x1cac 1cc4: b001 add sp, #4 1cc6: 4770 bx lr - 1cc8: 0864 lsr r4, r4, #1 - 1cca: 0000 lsl r0, r0, #0 - 1ccc: 5805 ldr r5, [r0, r0] - 1cce: ffff - 1cd0: 5005 str r5, [r0, r0] - 1cd2: ffff - 1cd4: ff20 - 1cd6: 0083 lsl r3, r0, #2 - 1cd8: ff1b - 1cda: 0083 lsl r3, r0, #2 - 1cdc: ff18 - 1cde: 0083 lsl r3, r0, #2 - 1ce0: 5800 ldr r0, [r0, r0] - 1ce2: ffff - 1ce4: 6000 str r0, [r0, #0] - 1ce6: ffff - 1ce8: 5000 str r0, [r0, r0] - 1cea: ffff + + 1cc8: 00000864 + 1ccc: ffff5805 + 1cd0: ffff5005 + 1cd4: 0083ff20 + 1cd8: 0083ff1b + 1cdc: 0083ff18 + 1ce0: ffff5800 + 1ce4: ffff6000 + 1ce8: ffff5000 + +; cmdboot.obj .text section +$cmd_load_application: 1cec: b500 push {lr} 1cee: b087 sub sp, #28 ; 0x1c 1cf0: 466b mov r3, sp @@ -2578,6 +2623,8 @@ 1d6a: 9803 ldr r0, [sp, #12] ; 0xc 1d6c: b007 add sp, #28 ; 0x1c 1d6e: bd00 pop {pc} + +$cmd_check_application_in_flash: 1d70: b089 sub sp, #36 ; 0x24 1d72: 201a mov r0, #26 ; 0x1a 1d74: 9005 str r0, [sp, #20] ; 0x14 @@ -2631,7 +2678,9 @@ 1dd4: 0000ffff +; start.obj .text:v$3 section ; ARM->Thumb call veneer around 0xad2 routine +_sta_select_application: 1dd8: e92d4000 stmdb sp!, {lr} 1ddc: e28fe001 add lr, pc, #1 1de0: e12fff1e bx lr