Release 2026-11-04-r2 · SHA256 b1e210b9a91ac6704e092ae6461a59a71bd2d52a1a7adce3723eec388184e6b1 · Click a line number for a direct link.
1| Replayable accepted season reset. All helpers run with SRAM already mapped.2| Even5000..6FFF stores full old active odd8KB, header7000..700F commit LAST.3| Recover original valid active image BEFORE native boot checksum; init then4| redoes the accepted reset and finalizes directory/checksum before discarding.5 .equ PAYLOAD,0x20A0006 .equ HEADER,0x20E0007 .equ MODE,0xFFFFF06A8 .text9 .globl _start10_start:11 bra.w boot12 bra.w recover13 bra.w begin14 bra.w finish15 bra.w query16 bra.w clear_records17boot:18 bsr.w recover19 moveq #0,%d020 move.l #8192,%d121 rts22recover:23 move.w %sr,-(%sp)24 movem.l %d0-%d7/%a0-%a6,-(%sp)25 move.w #0x2700,%sr26 bsr.w wait_dma27 bsr.w validate28 tst.l %d029 beq.s recovered30 lea PAYLOAD,%a031 lea 0x200001,%a132 move.w #8191,%d233recover_byte:34 move.b (%a0),(%a1)35 addq.l #2,%a036 addq.l #2,%a137 dbra %d2,recover_byte38recovered:39 movem.l (%sp)+,%d0-%d7/%a0-%a640 move.w (%sp)+,%sr41 rts42begin:43 move.w %sr,-(%sp)44 movem.l %d0-%d7/%a0-%a6,-(%sp)45 move.w #0x2700,%sr46 bsr.w wait_dma47 bsr.w validate48 tst.l %d049 bne.w begun | Replaying the committed same accepted reset.50 move.w MODE,%d751 subq.w #1,%d752 cmpi.w #2,%d753 bhi.w begun54 addq.w #1,%d755 lea HEADER,%a456 clr.b (%a4) | Invalidate FIRST; odd active data is untouched.57 lea 0x200001,%a058 lea PAYLOAD,%a159 move.w #8191,%d260snapshot_byte:61 move.b (%a0),(%a1)62 addq.l #2,%a063 addq.l #2,%a164 dbra %d2,snapshot_byte65 move.b #0x4A,2(%a4)66 move.b #0x4E,4(%a4)67 move.b #0x4C,6(%a4)68 move.b #1,8(%a4)69 move.b %d7,10(%a4)70 not.b %d771 move.b %d7,12(%a4)72 clr.b 14(%a4)73 bsr.w payload_crc74 move.w %d1,%d075 lsr.w #8,%d076 move.b %d0,16(%a4)77 move.b %d1,18(%a4)78 not.w %d179 move.w %d1,%d080 lsr.w #8,%d081 move.b %d0,20(%a4)82 move.b %d1,22(%a4)83 move.b #0x43,24(%a4)84 move.b #0x4C,26(%a4)85 move.b #0x52,28(%a4)86 move.b #0x31,30(%a4)87 move.b #0x52,(%a4) | Commit LAST; any valid journal authorizes redo.88begun:89 movem.l (%sp)+,%d0-%d7/%a0-%a690 move.w (%sp)+,%sr91 rts92finish:93 move.w %sr,-(%sp)94 move.w #0x2700,%sr95 bsr.w wait_dma96 clr.b HEADER | Only after full actual reset + directory + checksum.97 move.w (%sp)+,%sr98 rts99query:100 move.w %sr,-(%sp)101 movem.l %d1-%d7/%a0-%a6,-(%sp)102 move.w #0x2700,%sr103 bsr.w wait_dma104 bsr.w validate105 movem.l (%sp)+,%d1-%d7/%a0-%a6106 move.w (%sp)+,%sr107 tst.l %d0108 rts109clear_records:110 move.w %sr,-(%sp)111 movem.l %d0-%d1/%a0,-(%sp)112 move.w #0x2700,%sr113 bsr.w wait_dma114 moveq #0,%d0115 move.w MODE,%d0116 subq.w #1,%d0117 cmpi.w #2,%d0118 bhi.s cleared119 move.l %d0,%d1120 lsl.l #8,%d0121 lsl.l #5,%d0122 lea 0x204000,%a0123 adda.l %d0,%a0124 clr.b (%a0)125 clr.b 0x1000(%a0)126 lsl.w #3,%d1127 lea 0x20FA00,%a0128 adda.w %d1,%a0129 clr.b (%a0)130 move.b #0x46,2(%a0)131 clr.b 4(%a0)132 move.b #0xFF,6(%a0)133 move.b #0x54,(%a0)134 clr.w 0xFFFFF85C135 clr.w 0xFFFFF860136cleared:137 movem.l (%sp)+,%d0-%d1/%a0138 move.w (%sp)+,%sr139 rts140validate:141 moveq #0,%d0142 lea HEADER,%a4143 cmpi.b #0x52,(%a4)144 bne.w invalid145 cmpi.b #0x4A,2(%a4)146 bne.w invalid147 cmpi.b #0x4E,4(%a4)148 bne.w invalid149 cmpi.b #0x4C,6(%a4)150 bne.w invalid151 cmpi.b #1,8(%a4)152 bne.w invalid153 moveq #0,%d7154 move.b 10(%a4),%d7155 subq.w #1,%d7156 cmpi.w #2,%d7157 bhi.w invalid158 addq.w #1,%d7159 move.b 12(%a4),%d1160 not.b %d1161 cmp.b %d7,%d1162 bne.w invalid163 tst.b 14(%a4)164 bne.w invalid165 cmpi.b #0x43,24(%a4)166 bne.w invalid167 cmpi.b #0x4C,26(%a4)168 bne.w invalid169 cmpi.b #0x52,28(%a4)170 bne.w invalid171 cmpi.b #0x31,30(%a4)172 bne.s invalid173 bsr.w payload_crc174 moveq #0,%d0175 move.b 16(%a4),%d0176 lsl.w #8,%d0177 move.b 18(%a4),%d0178 cmp.w %d0,%d1179 bne.s invalid180 not.w %d1181 move.b 20(%a4),%d0182 lsl.w #8,%d0183 move.b 22(%a4),%d0184 cmp.w %d0,%d1185 bne.s invalid186 move.l %d7,%d0187 rts188invalid:189 moveq #0,%d0190 rts191payload_crc:192 lea PAYLOAD,%a0193 move.w #0xFFFF,%d1194 move.w #8191,%d3195crc_byte:196 moveq #0,%d0197 move.b (%a0),%d0198 lsl.w #8,%d0199 eor.w %d0,%d1200 moveq #7,%d2201crc_bit:202 add.w %d1,%d1203 bcc.s crc_next204 eori.w #0x1021,%d1205crc_next:206 dbra %d2,crc_bit207 addq.l #2,%a0208 dbra %d3,crc_byte209 moveq #0,%d0210 move.b HEADER+10,%d0 | Bind the authorized target slot to the payload.211 lsl.w #8,%d0212 eor.w %d0,%d1213 moveq #7,%d2214crc_slot_bit:215 add.w %d1,%d1216 bcc.s crc_slot_next217 eori.w #0x1021,%d1218crc_slot_next:219 dbra %d2,crc_slot_bit220 rts221wait_dma:222 btst #1,0xC00005223 bne.s wait_dma224 rts225