mc.s (1410B)
1 .global mcfork // int mcfork(void) 2 mcfork: 3 push {r4, lr} 4 ldr r0, =0x20000800 5 mov r1, lr 6 str r1, [r0, #0] 7 mcfork_retry: 8 bl mc_fifo_drain 9 mov r0, #0 10 bl mc_fifo_send 11 bl mc_fifo_recv 12 cmp r0, #0 13 bne mcfork_retry 14 15 bl mc_fifo_drain 16 mov r0, #0 17 bl mc_fifo_send 18 bl mc_fifo_recv 19 cmp r0, #0 20 bne mcfork_retry 21 22 mov r0, #1 23 bl mc_fifo_send 24 bl mc_fifo_recv 25 cmp r0, #1 26 bne mcfork_retry 27 28 ldr r0, =0x10000100 // __vectors 29 mov r4, r0 30 bl mc_fifo_send 31 bl mc_fifo_recv 32 cmp r0, r4 33 bne mcfork_retry 34 35 ldr r0, =0x200007fc // initial sp 36 mov r4, r0 37 bl mc_fifo_send 38 bl mc_fifo_recv 39 cmp r0, r4 40 bne mcfork_retry 41 42 adr r0, mcfork_ent 43 add r0, r0, #1 // thumb mode 44 mov r4, r0 45 bl mc_fifo_send 46 bl mc_fifo_recv 47 cmp r0, r4 48 bne mcfork_retry 49 .align 2 50 mcfork_ent: // this part doesn't work for cpu1 51 ldr r0, sio_base 52 ldr r0, [r0, #0] 53 pop {r4, pc} 54 55 mc_fifo_drain: 56 ldr r0, sio_base 57 mc_fifo_not_empty: 58 ldr r1, [r0, #0x50] // SIO_FIFO_ST 59 mov r2, #1 60 and r1, r2 61 beq mc_fifo_empty 62 ldr r3, [r0, #0x58] // SIO_FIFO_RD 63 b mc_fifo_not_empty 64 mc_fifo_empty: 65 sev 66 bx lr 67 68 mc_fifo_send: 69 ldr r1, sio_base 70 mc_fifo_full: 71 ldr r2, [r1, #0x50] // SIO_FIFO_ST 72 mov r3, #2 73 and r2, r3 74 beq mc_fifo_full 75 str r0, [r1, #0x54] // SIO_FIFO_WR 76 sev 77 bx lr 78 79 mc_fifo_recv: 80 ldr r1, sio_base 81 ldr r2, [r1, #0x50] // SIO_FIFO_ST 82 mov r3, #1 83 and r2, r3 84 bne mc_fifo_redy 85 wfe 86 mc_fifo_redy: 87 ldr r0, [r1, #0x58] // SIO_FIFO_RD 88 bx lr 89