/* Original charge-count/physical-UART-loop/output capstone.
 * GPIO2 discharges the sensor, GPIO3 drives the output, GPIO4 senses charge.
 * UART roles TX6/RX7 use an actual external R/C path; internal loopback is off.
 * RAM +0 count,+4 event,+8 third sensor timer,+12 RX byte,+16 fault,
 * +20 requested TX byte (67),+24 success timer,+28 RX deadline,+32 RX status.
 * Output stays LOW unless three sensor detections and received ASCII C match.
 * Fault 1: timeout; 2: RX errors or wrong byte. This is not a safety system. */
    .option norvc
    .option norelax
    .section .text.start,"ax",@progbits
    .globl _start
    .type _start,@function
_start:
    lui x5, 0x40000
    addi x6, zero, 12
    sw x6, 8(x5)
    sw zero, 4(x5)
    lui x7, 0x20000
    addi x6, zero, 8
    sw x6, 44(x5)
    addi x6, zero, 7
    sw x6, 40(x5)             /* enabled 8N1, internal loopback OFF */
    addi x11, zero, 0
wait_high:
    lw x10, 0(x5)
    andi x10, x10, 16
    beq x10, zero, wait_high
    addi x11, x11, 1
    sw x11, 0(x7)
    addi x12, zero, 4
    sw x12, 4(x5)
    addi x14, zero, 3
    bge x11, x14, report
wait_low:
    lw x10, 0(x5)
    andi x10, x10, 16
    bne x10, zero, wait_low
    sw zero, 4(x5)
    jal zero, wait_high
report:
    lw x13, 256(x5)
    sw x13, 8(x7)
    lw x6, 20(x7)
    sw x6, 32(x5)
    lw x13, 256(x5)
    addi x13, x13, 200
    sw x13, 28(x7)
await_rx:
    lw x10, 36(x5)
    andi x12, x10, 4
    bne x12, zero, received
    lw x14, 256(x5)
    sub x14, x14, x13
    blt x14, zero, await_rx
    addi x6, zero, 1
    jal zero, fail
received:
    sw x10, 32(x7)
    lw x12, 32(x5)
    sw x12, 12(x7)
    andi x10, x10, 56
    bne x10, zero, bad_byte
    addi x6, zero, 67
    bne x12, x6, bad_byte
    addi x6, zero, 1
    sw x6, 4(x7)
    lw x13, 256(x5)
    sw x13, 24(x7)
    addi x12, zero, 12
    sw x12, 4(x5)
done:
    jal zero, done
bad_byte:
    addi x6, zero, 2
fail:
    sw x6, 16(x7)
    addi x12, zero, 4
    sw x12, 4(x5)
    jal zero, done
    .size _start, .-_start
    .section .data,"aw",@progbits
    .balign 4
    .word 0,0,0,0,0,67,0,0,0
    .section .note.GNU-stack,"",@progbits
