experimental/transfers_reset.s

Download file

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