1loader-dec
By Archeologist: Patrik Sevallius
This is what the encrypted part looks after decryption:
sub_5A68: subq.l #6,(TRACE_VECTOR).l clr.l (ACCESS_FAULT).l clr.l (ILLEGAL_INSTRUCTION).l subq.w #7,a2 adda.w a4,a2 tst.w d3 negx.b d5 clr.l d1 exg a3,a2 move.l #$B386B186,$14(sp) bset #$6E,d5 adda.w d0,a4 tst.b d5 negx.l d1 clr.w d3 exg d5,d4 cmpa.l (TRACE_VECTOR).l,sp subq.w #2,d0 cmpi.l #$957C957C,d1 lsl.w #3,d0 and.l d0,d3 neg.b d2 ori.w #$96F2,d3 subx.w d3,d5 move.l #$42C6F,4(sp) nop lsr.b d4,d2 and.b d2,d5 bset d2,d1 tst.w d3 negx.l d4 roxl.b d1,d5 btst #$88,d1 addq.b #4,d1 bchg d3,d2 bset #$76,d5 adda.w d0,a4 lsl.l d1,d4 and.b d4,d1 addq.b #4,d1 bchg d4,d3 bset #$66,d5 adda.w d0,a5 lsl.b #1,d5 and.b d5,d1 neg.w d0 btst #$20,d3 addq.w #6,a3 moveq #$FFFFFFCA,d5 bset #$E,d1 add.l #$9D749D85,d1 lsl.w #2,d0 and.w d0,d2 addx.w d0,d2 bchg #$EA,d2 subx.b d2,d4 eor.w d5,d3 adda.w a4,a2 lsr.b d5,d2 and.w d2,d5 neg.l d4 btst #$81,d0 addq.l #8,a0 moveq #$1A,d3 bset #$5E,d5 adda.w d0,a4 tst.b d5 negx.l d1 clr.w d3 exg d5,d4 cmpa.l (TRACE_VECTOR).l,sp subq.w #2,d0 move.l #$D246D046,$10(sp) negx.b d2 roxr.b #5,d3 btst #$C0,d5 addq.w #3,d5 bchg d1,d0 bset #$AE,d3 adda.w a4,a2 lsr.b #5,d2 and.w #$A8F1,d5 addx.b d1,d4 sub.l $14(sp),d0 addx.b d1,d4 sub.l $14(sp),d0 subq.l #5,d4 cmpa.l (TRACE_VECTOR).l,sp negx.l d1 clr.w d3 addx.l d3,d0 cmpa.l (TRACE_VECTOR).l,sp move.l #$246A71F,$C(sp) adda.w d0,a4 lsr.l d1,d4 and.b #$91,d1 addx.l d3,d0 cmpa.l (TRACE_VECTOR).l,sp subq.l #2,a0 adda.l a1,a2 bclr #$E4,d4 tas d0 neg.b d2 btst #$B0,d5 addq.b #3,d1 subq.b #3,d2 sub.l $1C(sp),d0 negx.b d5 clr.w d1 exg a3,a2 sub.l $14(sp),d0 subq.l #5,d3 cmpa.l (TRACE_VECTOR).l,sp subq.l #5,a1 nop lsl.l #1,d4 and.b d4,d1 neg.b d5 ori.l #$AC32AC32,d1 subx.l d0,d2 eor.l d3,d1 move.b d0,d2 lsl.w d3,d0 neg.w d0 btst #0,d3 addq.w #6,a2 moveq #$FFFFFFAA,d5 bset #$EE,d1 add.l #$BD54BD54,d1 lsl.w #3,d0 and.l #$BE31BE42,d3 addx.b d5,d1 move.l #$D246D046,$10(sp) bset #$96,d3 adda.w a4,a2 lsr.b #5,d2 and.w d2,d5 addx.b d2,d4 bchg #$72,d5 subx.l d4,d0 eor.b d1,d5 adda.w d0,a4 lsr.l d1,d4 and.b #$81,d1 addx.l d3,d0 cmpa.l (TRACE_VECTOR).l,sp subq.l #2,a0 adda.l a1,a2 bclr #$E5,d4 tas d0 neg.b d2 btst #$A0,d5 addq.b #3,d1 subq.b #3,d1 sub.l $1C(sp),d0 negx.b d5 clr.w d0 exg a3,a2 move.l #$B386B186,$14(sp) bset #$36,d5 adda.w d0,a4 tst.b d5 negx.l d1 clr.w d3 exg d5,d4 sub.l $C(sp),d0 addx.l d3,d0 cmpa.l (TRACE_VECTOR).l,sp subq.w #6,a0 cmpi.l #$BD54BD54,d1 lsl.w #3,d0 and.l #$BE31BE31,d3 addx.w d5,d2 sub.l $14(sp),d0 bset d0,d5 cmpa.w d0,a4 tas d1 move.l #$B386B186,$14(sp) subx.w d2,d5 eor.w d5,d3 move.b d3,d5 lsr.b d5,d2 and.w d2,d5 neg.l d4 btst #$51,d0 addq.l #8,a0 moveq #$FFFFFFEA,d3 bset #$2E,d5 adda.w d0,a4 tst.b d5 negx.l d1 clr.w d3 exg d5,d4 cmpa.l (TRACE_VECTOR).l,sp subq.w #2,d0 move.l #$D446D246,$10(sp) negx.w d2 roxr.w d5,d3 btst #$90,d5 addq.w #3,d5 bchg d2,d0 bset #$7E,d3 adda.w a4,a2 lsr.b d5,d2 and.w #$D8C1,d5 addx.b d1,d4 sub.l $14(sp),d0 subq.l #5,d4 cmpa.l (TRACE_VECTOR).l,sp negx.l d1 clr.w d3 addx.w d3,d5 move.l #$B386B586,$14(sp) bset #$CE,d1 adda.w d0,a4 or.b #$AB,d1 cmpa.l (TRACE_VECTOR).l,sp tst.l d1 negx.b d3 roxr.w d5,d3 btst #$98,d5 move.l sp,(TRACE_VECTOR).l bset #$86,d3 move.w d0,d4 and.l #$DE11DE22,d3 addx.b d5,d1 move.l sp,(TRACE_VECTOR).l subq.b #7,d2 sub.l $1C(sp),d0 negx.b d5 clr.l d1 exg a3,a2 sub.l $14(sp),d0 subq.l #8,d3 cmpa.l (TRACE_VECTOR).l,sp move.l #$1014E73,-(sp) move.l #$4E924CDF,-(sp) move.l #$FFFC6602,-(sp) move.l #$C68CF47,-(sp) move.l #$B198B190,-(sp) move.l #8,-(sp) move.l #$FFFCD0B9,-(sp) move.l #$C2028,-(sp) move.l #$23C80000,-(sp) move.l #$206F000A,-(sp) move.l #$B198B190,-(sp) move.l #8,-(sp) move.l #$FFFCD0B9,-(sp) move.l #$C2028,-(sp) move.l #$20790000,-(sp) move.l #$27CFFFF,-(sp) move.l #$48E78080,-(sp) move.l #$4E714E71,-(sp) move.l #$44E71,-(sp) move.l #$BD96BDAE,-(sp) move.l #$10,(ADDRESS_ERROR).l move.l sp,(TRACE_VECTOR).l ; set new TRACE function addi.l #$C,(TRACE_VECTOR).l ; skip reencryption from now on move.w $B8(sp),d6 ori.w #$F8FF,d6 move.w d6,$12(sp) moveq #0,d0 moveq #1,d1 movem.l d2-a3,-(sp) moveq #0,d2 roxr.l #3,d0 roxr.l #1,d2 roxl.l #3,d0 move.b d0,d2 move.l d1,d3 moveq #3,d7 ; loop counter moveq #0,d6 loc_5DE4: bsr.w go_to_track_0 beq.s loc_5DF8 moveq #1,d0 bsr.w step_to_track bsr.w wait_up_to_3s_for_RDY bsr.w read_key loc_5DF8: bsr.w step_back_to_original_track tst.l d6 bne.s loc_5E0E tst.l d2 bpl.s loc_5E0E addq.b #1,d2 andi.b #3,d2 dbf d7,loc_5DE4 loc_5E0E: bsr.w erase_disk_buffer move.w d2,d1 move.l d6,d0 movem.l (sp)+,d2-a3 bra.w decrypt read_key: subq.w #4,sp loc_5E20: move.w #$8914,d0 move.w #$32,d1 ; disklen lea disk_buffer,a0 ; buffer bsr.w sub_5F4C bmi.s loc_5EA8 move.w #7,d1 loc_5E36: sub.l (a0)+,d0 dbf d1,loc_5E36 cmp.l #$A573632C,d0 bne.s loc_5E20 lea disk_buffer,a0 loc_5E48: move.w #$8911,d0 ; syncword bsr.w sub_5F86 beq.s loc_5EA8 cmpi.w #$2A91,(a0) bne.s loc_5E48 move.l d0,(sp) loc_5E5A: move.w #$8912,d0 ; syncword bsr.w sub_5F86 beq.s loc_5EA8 cmpi.w #$AA92,(a0) bne.s loc_5E5A move.l d0,d1 move.l (sp),d0 bsr.w sub_5EAC bmi.s loc_5EA8 loc_5E74: move.w #$8914,d0 ; syncword bsr.w sub_5F86 beq.s loc_5EA8 cmpi.w #$AA94,(a0) bne.s loc_5E74 move.l (sp),d1 bsr.s sub_5EAC bmi.s loc_5EA8 move.w #$8951,d0 ; syncword bsr.w sub_5FEA cmp.w #$3AC,d0 blt.s loc_5EA8 cmp.w #$53C,d0 bgt.s loc_5EA8 move.w #$B,d1 loc_5EA2: sub.l (a0)+,d6 dbf d1,loc_5EA2 loc_5EA8: addq.w #4,sp rts sub_5EAC: sub.l d1,d0 bmi.s loc_5EC0 mulu.w #$64,d0 divu.w d1,d0 cmp.b #2,d0 blt.s loc_5EC0 moveq #0,d0 rts loc_5EC0: moveq #$FFFFFFFF,d0 rts erase_disk_buffer: lea disk_buffer,a0 move.w #$19,d1 move.l #$E3B6,d0 loc_5ED2: mulu.w #$11,d0 addq.l #1,d0 move.w d0,(a0)+ dbf d1,loc_5ED2 rts go_to_track_0: bsr.w enable_df0 bsr.w find_track_0 move.w d0,d5 ; store number of tracks we stepped * 2 in d5 addq.w #1,d0 beq.s locret_5F06 btst #2,(CIA_A_PRA).l ; check CHNG bne.s locret_5F06 moveq #2,d0 bsr.w step_to_track btst #2,(CIA_A_PRA).l ; check CHNG locret_5F06: rts step_back_to_original_track: move.w d5,d0 bmi.s locret_5F18 bsr.w step_to_track tst.l d6 beq.s loc_5F2E tst.b d3 beq.s loc_5F2E locret_5F18: rts enable_df0: moveq #$FFFFFFFF,d0 move.b d0,(CIA_B_PRB).l bclr #7,d0 ; clear MOTOR bit bsr.s toggle_motor moveq #$1E,d0 ; delay 30 ms bra.w delay_ms loc_5F2E: moveq #$FFFFFFFF,d0 toggle_motor: move.b d0,(CIA_B_PRB).l ; write to motor bits addq.b #3,d2 bclr d2,d0 move.b d0,(CIA_B_PRB).l ; select DF0 bset d2,d0 move.b d0,(CIA_B_PRB).l ; unselect subq.b #3,d2 rts sub_5F4C: bsr.w sub_6046 lsr.w #1,d1 ori.w #$8000,d1 ; Disk DMA enable move.w d1,$24(a1) move.w d1,$24(a1) move.l #3000,d0 ; start a 3 second timer bsr.w setup_1_ms_timer loc_5F68: btst #1,$1F(a1) bne.s loc_5F7E bsr.w check_for_timeout bne.s loc_5F68 bsr.w sub_6074 moveq #$FFFFFFFF,d0 rts loc_5F7E: bsr.w sub_6074 moveq #0,d0 rts sub_5F86: movea.l a0,a3 bsr.w sub_6046 move.w #$8000,d1 move.l #$FFF64E75,-(sp) move.l #$6AF851C8,-(sp) move.l #$4A29001A,-(sp) move.l #$72005281,-(sp) move.l #$6AFA16C1,-(sp) move.l #$3229001A,-(sp) move.l #$6AFA16C1,-(sp) move.l #$3229001A,-(sp) move.l #$1A67F8,-(sp) move.l #$8290004,-(sp) move.l #$303C03FE,-(sp) move.w d1,$24(a1) move.w d1,$24(a1) movea.l sp,a2 exg d7,d7 lea $2C(sp),sp bsr.w sub_6074 move.l d1,d0 rts sub_5FEA: bsr.w sub_6046 move.w #$8000,d1 move.l #$4E714E75,-(sp) move.l #$DD0067EE,-(sp) move.l #$400BF,-(sp) move.l #$52410839,-(sp) move.l #$1A6A02,-(sp) move.l #$DD001029,-(sp) move.l #$400BF,-(sp) move.l #$72000839,-(sp) move.l #$1A67F8,-(sp) move.l #$8290004,-(sp) move.w d1,$24(a1) move.w d1,$24(a1) movea.l sp,a2 exg d7,d7 lea $28(sp),sp bsr.w sub_6074 move.l d1,d0 rts sub_6046: lea (DFF000).l,a1 move.w #$4000,unk_F024-DFF000(a1) move.l a0,$20(a1) move.w d0,$7E(a1) move.w #$8010,$96(a1) move.w #$6600,$9E(a1) move.w #$9500,$9E(a1) move.w #2,$9C(a1) rts sub_6074: move.w #2,$9C(a1) move.w #$4000,$24(a1) move.w #$400,$9E(a1) rts wait_up_to_3s_for_RDY: move.l #$BB8,d0 ; delay 3 seconds bsr.w setup_1_ms_timer loc_6092: btst #5,(CIA_A_PRA).l ; check RDY beq.s loc_60A6 bsr.w check_for_timeout bne.s loc_6092 ; check RDY moveq #$FFFFFFFF,d0 rts loc_60A6: moveq #0,d0 rts step_to_track: move.w d0,-(sp) lsr.w #1,d4 lsr.w #1,d0 moveq #0,d1 sub.w d4,d0 bpl.s loc_60BA moveq #$FFFFFFFF,d1 neg.w d0 loc_60BA: bsr.w step_track move.w (sp)+,d4 bra.s sub_6122 find_track_0: moveq #$55,d1 ; number of tracks to step loc_60C4: btst #4,(CIA_A_PRA).l beq.s loc_60E2 move.l d1,-(sp) moveq #1,d0 moveq #$FFFFFFFF,d1 bsr.w step_track move.l (sp)+,d1 dbf d1,loc_60C4 move.w d1,d0 rts loc_60E2: moveq #0,d4 bsr.w sub_6122 moveq #$55,d0 sub.w d1,d0 add.w d0,d0 ; double it rts step_track: tst.b d0 beq.s exit move.w d0,-(sp) bsr.w setup_prb_in_D0 tst.b d1 ; step in or out bne.s loc_6102 bclr #1,d0 ; clear DIR loc_6102: bclr #0,d0 ; clear STEP move.b d0,(CIA_B_PRB).l ; step drive bset #0,d0 ; set STEP move.b d0,(CIA_B_PRB).l ; stop STEP moveq #4,d0 ; delay 4 ms bsr.s delay_ms move.w (sp)+,d0 subq.b #1,d0 bne.s step_track exit: rts sub_6122: bsr.w setup_prb_in_D0 move.b d0,(CIA_B_PRB).l rts setup_prb_in_D0: move.b (CIA_B_PRB).l,d0 ; get PRB from CIAB ori.b #$7F,d0 ; keep all but motor addq.b #3,d2 bclr d2,d0 ; clear SEL0 subq.b #3,d2 btst #0,d4 beq.s locret_6148 bclr #2,d0 ; clear SIDE locret_6148: rts delay_ms: bsr.w setup_1_ms_timer loc_614E: btst #0,(CIA_B_CRA).l bne.s loc_614E subq.l #1,d0 ; decrement delay length bne.s delay_ms rts check_for_timeout: btst #0,(CIA_B_CRA).l bne.s locret_6184 subq.l #1,d0 beq.s locret_6184 setup_1_ms_timer: move.b #8,(CIA_B_CRA).l move.b #$CC,(CIA_B_TALO).l move.b #2,(CIA_B_TAHI).l locret_6184: rts disk_buffer: dc.b $27 dcb.b 2,$80 dc.b $D6, 6, $1E, $B9, $12, $5A, $32, $DF, $76, $FC, $A4 dc.b $E9, $E4, $48, $5F, $8E, $2E, $FB, $E, $26, $32, $DD dc.b $D2, $98, $E4, $AF, $76, $B7, $F2, $34, $52, $B1 dc.b $5E, $A4, $3E, $3B, $32, $4C, $52, $91, $56, $BF dc.b $F6, $3C, $72, $84, $D2, $53, $EE, $1E, $78, 5, $BE decrypt: moveq #0,d1 lea $61C0,a6 adda.l #(unk_62A8-$61C0),a6 move.l #$400,d6 loc_61D0: rol.l d0,d1 add.l d1,d2 ror.l d2,d3 add.l d3,d4 ror.l d4,d5 add.l d5,d0 add.l d0,(a6)+ subq.l #4,d6 bne.s loc_61D0 lea $61F4,a6 move.l loc_61F0-loc_61F4(a6),d6 add.l (ACCESS_FAULT).l,d6 loc_61F0: ori #$A71F,sr loc_61F4: addi.l #$44,(TRACE_VECTOR).l adda.l #$50,sp move.l #$7FFF4E73,-(sp) move.l #$584F0257,-(sp) move.l #$4CDF7FFF,-(sp) move.l #$4FEE007C,-(sp) move.l #$2D4C00BE,-(sp) move.l #$598066FA,-(sp) move.l #$67064299,-(sp) move.l #$66FA200B,-(sp) move.l #$22D85980,-(sp) move.l #$66FA6006,-(sp) move.l #$23205980,-(sp) move.l #$D1C0D3C0,-(sp) move.l #$B3C86F0C,-(sp) move.l #$200A6720,-(sp) move.l #$4E7B0002,-(sp) move.l #$202E00B8,-(sp) move.l #$4DFAFFEE,-(sp) move.l #$10,-(sp) move.l #$1423DF,-(sp) move.l #$4487A,-(sp) move.l #$BD96BDAE,-(sp) lea unk_62A8,a0 movea.l a0,a1 suba.l #$8C0,a1 movea.l #$400,a2 movea.l #$8C0,a3 movea.l a1,a4 adda.l #$C,a4 move.l sp,(TRACE_VECTOR).l