| Replayable accepted season reset. All helpers run with SRAM already mapped.
| Even5000..6FFF stores full old active odd8KB, header7000..700F commit LAST.
| Recover original valid active image BEFORE native boot checksum; init then
| redoes the accepted reset and finalizes directory/checksum before discarding.
    .equ PAYLOAD,0x20A000
    .equ HEADER,0x20E000
    .equ MODE,0xFFFFF06A
    .text
    .globl _start
_start:
    bra.w boot
    bra.w recover
    bra.w begin
    bra.w finish
    bra.w query
    bra.w clear_records
boot:
    bsr.w recover
    moveq #0,%d0
    move.l #8192,%d1
    rts
recover:
    move.w %sr,-(%sp)
    movem.l %d0-%d7/%a0-%a6,-(%sp)
    move.w #0x2700,%sr
    bsr.w wait_dma
    bsr.w validate
    tst.l %d0
    beq.s recovered
    lea PAYLOAD,%a0
    lea 0x200001,%a1
    move.w #8191,%d2
recover_byte:
    move.b (%a0),(%a1)
    addq.l #2,%a0
    addq.l #2,%a1
    dbra %d2,recover_byte
recovered:
    movem.l (%sp)+,%d0-%d7/%a0-%a6
    move.w (%sp)+,%sr
    rts
begin:
    move.w %sr,-(%sp)
    movem.l %d0-%d7/%a0-%a6,-(%sp)
    move.w #0x2700,%sr
    bsr.w wait_dma
    bsr.w validate
    tst.l %d0
    bne.w begun                  | Replaying the committed same accepted reset.
    move.w MODE,%d7
    subq.w #1,%d7
    cmpi.w #2,%d7
    bhi.w begun
    addq.w #1,%d7
    lea HEADER,%a4
    clr.b (%a4)                  | Invalidate FIRST; odd active data is untouched.
    lea 0x200001,%a0
    lea PAYLOAD,%a1
    move.w #8191,%d2
snapshot_byte:
    move.b (%a0),(%a1)
    addq.l #2,%a0
    addq.l #2,%a1
    dbra %d2,snapshot_byte
    move.b #0x4A,2(%a4)
    move.b #0x4E,4(%a4)
    move.b #0x4C,6(%a4)
    move.b #1,8(%a4)
    move.b %d7,10(%a4)
    not.b %d7
    move.b %d7,12(%a4)
    clr.b 14(%a4)
    bsr.w payload_crc
    move.w %d1,%d0
    lsr.w #8,%d0
    move.b %d0,16(%a4)
    move.b %d1,18(%a4)
    not.w %d1
    move.w %d1,%d0
    lsr.w #8,%d0
    move.b %d0,20(%a4)
    move.b %d1,22(%a4)
    move.b #0x43,24(%a4)
    move.b #0x4C,26(%a4)
    move.b #0x52,28(%a4)
    move.b #0x31,30(%a4)
    move.b #0x52,(%a4)            | Commit LAST; any valid journal authorizes redo.
begun:
    movem.l (%sp)+,%d0-%d7/%a0-%a6
    move.w (%sp)+,%sr
    rts
finish:
    move.w %sr,-(%sp)
    move.w #0x2700,%sr
    bsr.w wait_dma
    clr.b HEADER                 | Only after full actual reset + directory + checksum.
    move.w (%sp)+,%sr
    rts
query:
    move.w %sr,-(%sp)
    movem.l %d1-%d7/%a0-%a6,-(%sp)
    move.w #0x2700,%sr
    bsr.w wait_dma
    bsr.w validate
    movem.l (%sp)+,%d1-%d7/%a0-%a6
    move.w (%sp)+,%sr
    tst.l %d0
    rts
clear_records:
    move.w %sr,-(%sp)
    movem.l %d0-%d1/%a0,-(%sp)
    move.w #0x2700,%sr
    bsr.w wait_dma
    moveq #0,%d0
    move.w MODE,%d0
    subq.w #1,%d0
    cmpi.w #2,%d0
    bhi.s cleared
    move.l %d0,%d1
    lsl.l #8,%d0
    lsl.l #5,%d0
    lea 0x204000,%a0
    adda.l %d0,%a0
    clr.b (%a0)
    clr.b 0x1000(%a0)
    lsl.w #3,%d1
    lea 0x20FA00,%a0
    adda.w %d1,%a0
    clr.b (%a0)
    move.b #0x46,2(%a0)
    clr.b 4(%a0)
    move.b #0xFF,6(%a0)
    move.b #0x54,(%a0)
    clr.w 0xFFFFF85C
    clr.w 0xFFFFF860
cleared:
    movem.l (%sp)+,%d0-%d1/%a0
    move.w (%sp)+,%sr
    rts
validate:
    moveq #0,%d0
    lea HEADER,%a4
    cmpi.b #0x52,(%a4)
    bne.w invalid
    cmpi.b #0x4A,2(%a4)
    bne.w invalid
    cmpi.b #0x4E,4(%a4)
    bne.w invalid
    cmpi.b #0x4C,6(%a4)
    bne.w invalid
    cmpi.b #1,8(%a4)
    bne.w invalid
    moveq #0,%d7
    move.b 10(%a4),%d7
    subq.w #1,%d7
    cmpi.w #2,%d7
    bhi.w invalid
    addq.w #1,%d7
    move.b 12(%a4),%d1
    not.b %d1
    cmp.b %d7,%d1
    bne.w invalid
    tst.b 14(%a4)
    bne.w invalid
    cmpi.b #0x43,24(%a4)
    bne.w invalid
    cmpi.b #0x4C,26(%a4)
    bne.w invalid
    cmpi.b #0x52,28(%a4)
    bne.w invalid
    cmpi.b #0x31,30(%a4)
    bne.s invalid
    bsr.w payload_crc
    moveq #0,%d0
    move.b 16(%a4),%d0
    lsl.w #8,%d0
    move.b 18(%a4),%d0
    cmp.w %d0,%d1
    bne.s invalid
    not.w %d1
    move.b 20(%a4),%d0
    lsl.w #8,%d0
    move.b 22(%a4),%d0
    cmp.w %d0,%d1
    bne.s invalid
    move.l %d7,%d0
    rts
invalid:
    moveq #0,%d0
    rts
payload_crc:
    lea PAYLOAD,%a0
    move.w #0xFFFF,%d1
    move.w #8191,%d3
crc_byte:
    moveq #0,%d0
    move.b (%a0),%d0
    lsl.w #8,%d0
    eor.w %d0,%d1
    moveq #7,%d2
crc_bit:
    add.w %d1,%d1
    bcc.s crc_next
    eori.w #0x1021,%d1
crc_next:
    dbra %d2,crc_bit
    addq.l #2,%a0
    dbra %d3,crc_byte
    moveq #0,%d0
    move.b HEADER+10,%d0         | Bind the authorized target slot to the payload.
    lsl.w #8,%d0
    eor.w %d0,%d1
    moveq #7,%d2
crc_slot_bit:
    add.w %d1,%d1
    bcc.s crc_slot_next
    eori.w #0x1021,%d1
crc_slot_next:
    dbra %d2,crc_slot_bit
    rts
wait_dma:
    btst #1,0xC00005
    bne.s wait_dma
    rts
