# HG changeset patch # User Michael Spacefalcon # Date 1396292793 0 # Node ID e405929905165b61328f7d77b6987ff974e4ccda # Parent 85bb3534283403df9748a11228e642d6d45db6cb C156 boot code cracked diff -r 85bb35342834 -r e40592990516 compal/c156-boot.disasm --- a/compal/c156-boot.disasm Mon Mar 31 16:41:21 2014 +0000 +++ b/compal/c156-boot.disasm Mon Mar 31 19:06:33 2014 +0000 @@ -20,11 +20,16 @@ 44: 004000c0 48: 00000e85 +; RESET entry point +; same init as in the C139 version 4c: e51f1028 ldr r1, =0xfffffd00 ; via 0x2c 50: e1d120b2 ldrh r2, [r1, #2] 54: e51f0034 ldr r0, =0x40 ; via 0x28 58: e1800002 orr r0, r0, r2 5c: e1c100b2 strh r0, [r1, #2] +; disable PLL +; diff from C139 version: writing 2002 into FFFF:9800 instead of 2006 +; diff in the BYPASS_DIV field 60: e51f1038 ldr r1, =0xffff9800 ; via 0x30 64: e15f22be ldrh r2, =0x2002 ; via 0x3e 68: e1c120b0 strh r2, [r1] @@ -32,17 +37,21 @@ 70: e2022001 and r2, r2, #1 74: e3520001 cmp r2, #1 78: 0afffffb beq 0x6c +; FFFF:FD00 write same as C139 7c: e51f1058 ldr r1, =0xfffffd00 ; via 0x2c 80: e15f24bc ldrh r2, =0x1081 ; via 0x3c 84: e1c120b0 strh r2, [r1] +; disable DU like C139 88: e51f105c ldr r1, =0xfffffb10 ; via 0x34 8c: e15f25b4 ldrh r2, =0x800 ; via 0x40 90: e1d100b0 ldrh r0, [r1] 94: e1800002 orr r0, r0, r2 98: e1c100b0 strh r0, [r1] +; ditto for MPU 9c: e51f106c ldr r1, =0xffffff08 ; via 0x38 a0: e15f26b6 ldrh r2, =0x0 ; via 0x42 a4: e1c120b0 strh r2, [r1] +; Memory timings a8: e59f1640 ldr r1, =0xfffffb00 ; via 0x6f0 ac: e15f29b4 ldrh r2, =0x2a1 ; via 0x20 b0: e1c120b0 strh r2, [r1] @@ -58,14 +67,18 @@ d8: e1c120bc strh r2, [r1, #12] ; 0xc dc: e15f29be ldrh r2, =0x40 ; via 0x46 e0: e1c120b8 strh r2, [r1, #8] +; enable 8 MiB chip select regions e4: e59f3630 ldr r3, =0xfffef006 ; via 0x71c e8: e1d310b0 ldrh r1, [r3] ec: e3a02008 mov r2, #8 f0: e1811002 orr r1, r1, r2 f4: e1c310b0 strh r1, [r3] +; write 0x0110 into FFFE:F00A +; enable I/O(8) and I/O(12) f8: e59f3604 ldr r3, =0xfffef000 ; via 0x704 fc: e3a01e11 mov r1, #272 ; 0x110 100: e1c310ba strh r1, [r3, #10] ; 0xa +; FFFE:4804: set GPIOs 0-8 and 12 as outputs 104: e59f3604 ldr r3, =0xfffe4804 ; via 0x710 108: e5931000 ldr r1, [r3] 10c: e3a030ff mov r3, #255 ; 0xff @@ -74,6 +87,7 @@ 118: e0011002 and r1, r1, r2 11c: e59f35e4 ldr r3, =0xfffe4800 ; via 0x708 120: e1c310b4 strh r1, [r3, #4] +; ARMIO_LATCH_OUT: 0-8 set to 0 124: e59f35e0 ldr r3, =0xfffe4802 ; via 0x70c 128: e5931000 ldr r1, [r3] 12c: e3a030ff mov r3, #255 ; 0xff @@ -82,14 +96,17 @@ 138: e0011002 and r1, r1, r2 13c: e59f35c4 ldr r3, =0xfffe4800 ; via 0x708 140: e1c310b2 strh r1, [r3, #2] +; ... and then reset it to 0xF400 144: e3a01b3d mov r1, #62464 ; 0xf400 148: e59f35b8 ldr r3, =0xfffe4800 ; via 0x708 14c: e1c310b2 strh r1, [r3, #2] +; SVC mode, IRQ and FIQ disabled 150: e10f0000 mrs r0, CPSR 154: e3c0001f bic r0, r0, #31 ; 0x1f 158: e3800013 orr r0, r0, #19 ; 0x13 15c: e38000c0 orr r0, r0, #192 ; 0xc0 160: e129f000 msr CPSR_fc, r0 +; zero all 256 KiB IRAM except last 128 bytes 164: e3a00502 mov r0, #8388608 ; 0x800000 168: e3a02000 mov r2, #0 16c: e3a01721 mov r1, #8650752 ; 0x840000 @@ -97,6 +114,7 @@ 174: e4802004 str r2, [r0], #4 178: e1500001 cmp r0, r1 17c: 1afffffc bne 0x174 +; ditto for 2 MiB XRAM 180: e3a00401 mov r0, #16777216 ; 0x1000000 184: e3a02000 mov r2, #0 188: e3a01612 mov r1, #18874368 ; 0x1200000 @@ -104,15 +122,21 @@ 190: e4802004 str r2, [r0], #4 194: e1500001 cmp r0, r1 198: 1afffffc bne 0x190 +; MODEM UART 19c: e59f0550 ldr r0, =0xffff5800 ; via 0x6f4 +; 0 into LCR for IER access 1a0: e3a01000 mov r1, #0 1a4: e5c01003 strb r1, [r0, #3] +; clear IER 1a8: e3a01000 mov r1, #0 1ac: e5c01001 strb r1, [r0, #1] +; BF into LCR 1b0: e3a010bf mov r1, #191 ; 0xbf 1b4: e5c01003 strb r1, [r0, #3] +; 0x10 into EFR 1b8: e3a01010 mov r1, #16 ; 0x10 1bc: e5c01002 strb r1, [r0, #2] +; set 115200 baud 1c0: e59f3534 ldr r3, =0xffff5803 ; via 0x6fc 1c4: e5931000 ldr r1, [r3] 1c8: e3811080 orr r1, r1, #128 ; 0x80 @@ -121,6 +145,7 @@ 1d4: e5c01000 strb r1, [r0] 1d8: e3a01000 mov r1, #0 1dc: e5c01001 strb r1, [r0, #1] +; LCR will eventually get back to 03 1e0: e59f3514 ldr r3, =0xffff5803 ; via 0x6fc 1e4: e5931000 ldr r1, [r3] 1e8: e201107f and r1, r1, #127 ; 0x7f @@ -128,47 +153,64 @@ 1f0: e5931000 ldr r1, [r3] 1f4: e3811003 orr r1, r1, #3 1f8: e5c31000 strb r1, [r3] +; 0x40 into MCR: TCR/TLR access 1fc: e3a01040 mov r1, #64 ; 0x40 200: e5c01004 strb r1, [r0, #4] +; TCR=0x0F (same as default) 204: e3a0100f mov r1, #15 ; 0xf 208: e5c01006 strb r1, [r0, #6] +; BF into LCR again 20c: e3a010bf mov r1, #191 ; 0xbf 210: e5c01003 strb r1, [r0, #3] +; 0x10 into EFR again 214: e3a01010 mov r1, #16 ; 0x10 218: e5c01002 strb r1, [r0, #2] +; finally 03 into LCR 21c: e3a01003 mov r1, #3 220: e5c01003 strb r1, [r0, #3] +; clear SCR (default, all weird stuff disabled) 224: e3a01000 mov r1, #0 228: e5c01010 strb r1, [r0, #16] ; 0x10 +; FCR=06: FIFOs cleared and *disabled* 22c: e3a01006 mov r1, #6 230: e5c01002 strb r1, [r0, #2] +; MCR=0F 234: e3a0100f mov r1, #15 ; 0xf 238: e5c01004 strb r1, [r0, #4] +; FCR=F1: enable FIFOs with max trigger levels 23c: e3a010f1 mov r1, #241 ; 0xf1 240: e5c01002 strb r1, [r0, #2] +; MDR1: write 7 for reset, then 0 for UART mode 244: e3a01007 mov r1, #7 248: e5c01008 strb r1, [r0, #8] 24c: e3a01000 mov r1, #0 250: e5c01008 strb r1, [r0, #8] +; IER: enable Rx interrupt 254: e59f349c ldr r3, =0xffff5801 ; via 0x6f8 258: e5931000 ldr r1, [r3] 25c: e3811001 orr r1, r1, #1 260: e5c31000 strb r1, [r3] +; nCS0: WS=3, write enable, DC=1 264: e59f1484 ldr r1, =0xfffffb00 ; via 0x6f0 268: e59f247c ldr r2, =0x2a3 ; via 0x6ec 26c: e1c120b0 strh r2, [r1] +; FFFF:FB0E = 0x6A: adapt enabled for RHEA and API, +; all ARM7 cycles visible externally 270: e59f3488 ldr r3, =0xfffffb00 ; via 0x700 274: e3a0106a mov r1, #106 ; 0x6a 278: e1c310be strh r1, [r3, #14] ; 0xe +; dingle UART FIFOs again, same settings 27c: e59f0470 ldr r0, =0xffff5800 ; via 0x6f4 280: e3a010f7 mov r1, #247 ; 0xf7 284: e5c01002 strb r1, [r0, #2] 288: e3a010f1 mov r1, #241 ; 0xf1 28c: e5c01002 strb r1, [r0, #2] +; short delay loop 290: e3a01f4b mov r1, #300 ; 0x12c 294: e2411001 sub r1, r1, #1 298: e3510000 cmp r1, #0 29c: 1afffffc bne 0x294 +; check UART for unsolicited input? 2a0: e59f044c ldr r0, =0xffff5800 ; via 0x6f4 2a4: e3a02064 mov r2, #100 ; 0x64 2a8: e3a08801 mov r8, #65536 ; 0x10000 @@ -180,6 +222,8 @@ 2c0: e3510001 cmp r1, #1 2c4: 1afffff8 bne 0x2ac 2c8: e5d01000 ldrb r1, [r0] +; unsolicited input received +; repeats the whole UART init, but with /2 div for 406250 baud 2cc: e59f0420 ldr r0, =0xffff5800 ; via 0x6f4 2d0: e3a01000 mov r1, #0 2d4: e5c01003 strb r1, [r0, #3] @@ -240,6 +284,8 @@ 3b0: e3510000 cmp r1, #0 3b4: 1afffffc bne 0x3ac 3b8: e59f0334 ldr r0, =0xffff5800 ; via 0x6f4 +; normal path continues +; emit 1B F6 02 00 41 01 40 3bc: e3a0101b mov r1, #27 ; 0x1b 3c0: e5c01000 strb r1, [r0] 3c4: e3a010f6 mov r1, #246 ; 0xf6 @@ -254,6 +300,7 @@ 3e8: e5c01000 strb r1, [r0] 3ec: e3a01040 mov r1, #64 ; 0x40 3f0: e5c01000 strb r1, [r0] +; wait for UART input 3f4: e3a02064 mov r2, #100 ; 0x64 3f8: e3a08701 mov r8, #262144 ; 0x40000 3fc: e2488001 sub r8, r8, #1 @@ -272,6 +319,7 @@ 430: eafffff1 b 0x3fc 434: e351001b cmp r1, #27 ; 0x1b 438: 1affffef bne 0x3fc +; got 1B 43c: e3a08701 mov r8, #262144 ; 0x40000 440: e2488001 sub r8, r8, #1 444: e3580000 cmp r8, #0 @@ -283,6 +331,7 @@ 45c: e5d01000 ldrb r1, [r0] 460: e35100f6 cmp r1, #246 ; 0xf6 464: 1a000092 bne 0x6b4 +; got F6 468: e3a08801 mov r8, #65536 ; 0x10000 46c: e2488001 sub r8, r8, #1 470: e3580000 cmp r8, #0 @@ -294,6 +343,7 @@ 488: e5d01000 ldrb r1, [r0] 48c: e3510002 cmp r1, #2 490: 1a000087 bne 0x6b4 +; got 02 494: e3a08801 mov r8, #65536 ; 0x10000 498: e2488001 sub r8, r8, #1 49c: e3580000 cmp r8, #0 @@ -305,6 +355,7 @@ 4b4: e5d01000 ldrb r1, [r0] 4b8: e3510000 cmp r1, #0 4bc: 1a00007c bne 0x6b4 +; got 00 4c0: e3a08801 mov r8, #65536 ; 0x10000 4c4: e2488001 sub r8, r8, #1 4c8: e3580000 cmp r8, #0 @@ -316,6 +367,7 @@ 4e0: e5d01000 ldrb r1, [r0] 4e4: e3510052 cmp r1, #82 ; 0x52 4e8: 1a000071 bne 0x6b4 +; got 52 4ec: e3a08801 mov r8, #65536 ; 0x10000 4f0: e2488001 sub r8, r8, #1 4f4: e3580000 cmp r8, #0 @@ -327,6 +379,7 @@ 50c: e5d01000 ldrb r1, [r0] 510: e3510001 cmp r1, #1 514: 1a000066 bne 0x6b4 +; got 01 518: e3a08801 mov r8, #65536 ; 0x10000 51c: e2488001 sub r8, r8, #1 520: e3580000 cmp r8, #0 @@ -337,6 +390,7 @@ 534: 1afffff8 bne 0x51c 538: e59f01b4 ldr r0, =0xffff5800 ; via 0x6f4 53c: e5d01000 ldrb r1, [r0] +; emit 1B F6 02 00 41 02 43 before checking the last Rx char! 540: e3a0201b mov r2, #27 ; 0x1b 544: e5c02000 strb r2, [r0] 548: e3a020f6 mov r2, #246 ; 0xf6 @@ -351,18 +405,23 @@ 56c: e5c02000 strb r2, [r0] 570: e3a02043 mov r2, #67 ; 0x43 574: e5c02000 strb r2, [r0] +; now check for 53 +; if not 53, go back to wait for 01-53 578: e3510053 cmp r1, #83 ; 0x53 57c: 0a000000 beq 0x584 580: eaffffda b 0x4f0 +; got 53 584: e3a02000 mov r2, #0 588: e59f3190 ldr r3, =0x800100 ; via 0x720 58c: e3a04000 mov r4, #0 590: e3a05001 mov r5, #1 +; endless wait for Rx byte 594: e5d01005 ldrb r1, [r0, #5] 598: e2011001 and r1, r1, #1 59c: e3510001 cmp r1, #1 5a0: 1afffffb bne 0x594 5a4: e5d01000 ldrb r1, [r0] +; state machine dispatch 5a8: e3520000 cmp r2, #0 5ac: 0a000008 beq 0x5d4 5b0: e3520001 cmp r2, #1 @@ -374,19 +433,23 @@ 5c8: e3520004 cmp r2, #4 5cc: 0a000015 beq 0x628 5d0: ea000037 b 0x6b4 +; R2=0: must receive 02 first 5d4: e3510002 cmp r1, #2 5d8: 1affffed bne 0x594 5dc: e1a06001 mov r6, r1 5e0: e2822001 add r2, r2, #1 5e4: eaffffea b 0x594 +; R2=1: got MSB of length 5e8: e1a04401 mov r4, r1, lsl #8 5ec: e0266001 eor r6, r6, r1 5f0: e2822001 add r2, r2, #1 5f4: eaffffe6 b 0x594 +; R2=2: got LSB of length 5f8: e0844001 add r4, r4, r1 5fc: e0266001 eor r6, r6, r1 600: e2822001 add r2, r2, #1 604: eaffffe2 b 0x594 +; R2=3: payload 608: e5c31000 strb r1, [r3] 60c: e0266001 eor r6, r6, r1 610: e2833001 add r3, r3, #1 @@ -395,8 +458,11 @@ 61c: 1affffdc bne 0x594 620: e2822001 add r2, r2, #1 624: eaffffda b 0x594 +; R2=4: checksum expected 628: e1560001 cmp r6, r1 62c: 1a000012 bne 0x67c +; checksum good +; emit 1B F6 02 00 41 03 42 630: e3a0101b mov r1, #27 ; 0x1b 634: e5c01000 strb r1, [r0] 638: e3a010f6 mov r1, #246 ; 0xf6 @@ -411,11 +477,15 @@ 65c: e5c01000 strb r1, [r0] 660: e3a01042 mov r1, #66 ; 0x42 664: e5c01000 strb r1, [r0] +; SP=0x803FFC 668: e59f00b4 ldr r0, =0x803ffc ; via 0x724 66c: e1a0d000 mov sp, r0 +; jump to 0x800100 in Thumb state 670: e59f00a8 ldr r0, =0x800100 ; via 0x720 674: e280e001 add lr, r0, #1 678: e12fff1e bx lr +; checksum mismatch +; emit 1B F6 02 00 45 53 16 67c: e3a0101b mov r1, #27 ; 0x1b 680: e5c01000 strb r1, [r0] 684: e3a010f6 mov r1, #246 ; 0xf6 @@ -430,6 +500,8 @@ 6a8: e5c01000 strb r1, [r0] 6ac: e3a01016 mov r1, #22 ; 0x16 6b0: e5c01000 strb r1, [r0] +; bail out path +; ARMIO_LATCH_OUT: 0-7 and 11 set low 6b4: e59f3050 ldr r3, =0xfffe4802 ; via 0x70c 6b8: e5931000 ldr r1, [r3] 6bc: e3a030ff mov r3, #255 ; 0xff @@ -438,6 +510,7 @@ 6c8: e0011002 and r1, r1, r2 6cc: e59f3034 ldr r3, =0xfffe4800 ; via 0x708 6d0: e1c310b2 strh r1, [r3, #2] +; switch GPIO12 back to input 6d4: e59f3034 ldr r3, =0xfffe4804 ; via 0x710 6d8: e5931000 ldr r1, [r3] 6dc: e3811a01 orr r1, r1, #4096 ; 0x1000