/* Original physical input-expander reader: mode-0 SPI, flag2 PISO capture.
 * GPIO4 pulses LD; GPIO5 means three RX DATA reads completed, not correct data.
 * RAM[0,4,8,12] = captured byte, zero-fill byte, recaptured byte, completion.
 * No memory peripheral, internal loopback, constant reply or hidden PISO write.
 */
.option norvc
.option norelax
.section .text.start,"ax",@progbits
.globl _start
.type _start,@function
_start:
    lui x5, 0x40000
    lui x22, 0x20000
    sw zero, 4(x5)
    addi x6, zero, 48
    sw x6, 8(x5)
    addi x6, zero, 4
    sw x6, 76(x5)
    addi x6, zero, 113
    sw x6, 72(x5)             /* enabled 8-bit MSB-first mode0, external MISO */
    addi x6, zero, 16
    sw x6, 4(x5)              /* LD HIGH while physical SCK idles LOW */
    addi zero, zero, 0
    addi zero, zero, 0
    sw zero, 4(x5)
    addi zero, zero, 0
    addi zero, zero, 0
.globl before_first_data
before_first_data:            /* exact PC0x40: capture has already occurred */
    sw zero, 64(x5)           /* dummy MOSI; receive the captured physical byte */
wait_first:
    lw x7, 68(x5)
    andi x7, x7, 4
    beq x7, zero, wait_first
    lw x10, 64(x5)
    sw x10, 0(x22)
    sw zero, 64(x5)           /* no LD: read eight zero serial-fill bits */
wait_fill:
    lw x7, 68(x5)
    andi x7, x7, 4
    beq x7, zero, wait_fill
    lw x11, 64(x5)
    sw x11, 4(x22)
.globl before_recapture
before_recapture:            /* exact PC0x70: physical D may now differ */
    addi x6, zero, 16
    sw x6, 4(x5)
    addi zero, zero, 0
    addi zero, zero, 0
    sw zero, 4(x5)
    addi zero, zero, 0
    addi zero, zero, 0
    sw zero, 64(x5)
wait_recaptured:
    lw x7, 68(x5)
    andi x7, x7, 4
    beq x7, zero, wait_recaptured
    lw x12, 64(x5)
    sw x12, 8(x22)
    addi x13, zero, 1
    sw x13, 12(x22)
    addi x6, zero, 32
    sw x6, 4(x5)              /* completion HIGH; LD stays LOW */
idle:
    jal zero, idle
.size _start, .-_start
.section .note.GNU-stack,"",@progbits
