; Captain Planet disk image reader ; v1.0: works fine with my disk (RATT-DOS 2.0) ; by Kyzer/CSG FILEMODE=1 include diskreader.asm BUFFER TRACKBUFFER ; load and decode bootblock and ratt-dos DOSREAD #0 lea TRACKBUFFER+$80,a0 move.w #620/4-1,d0 .d1 sub.l #'BooT',(a0)+ dbra d0,.d1 lea TRACKBUFFER+$400,a0 lea rattdos,a1 move.w #$1000/4-1,d0 .d2 sub.l #'RaTt',(a0) move.l (a0)+,(a1)+ dbra d0,.d2 SAVEF bootnam(pc),TRACKBUFFER+$80,#620 SAVEF rattnam(pc),rattdos,#$1000 ; patch ratt-dos to use our own loading routines lea rattdos,a6 ; RTS patches lea .rlist(pc),a0 moveq #13-1,d0 1$ move.w (a0)+,d1 move.w #$4e75,(a6,d1.w) dbra d0,1$ ; other patches lea fakehw,a0 move.l a0,$278+2(a6) ;278 lea fakehw,a5 move.l a0,$286+2(a6) ;286 lea fakehw,a3 lea .track(pc),a0 move.l a0,$59e+2(a6) ;59e move.l d2,track lea .loader(pc),a0 move.l a0,$6ba+2(a6) ;6ba jmp loader lea .plist(pc),a0 2$ move.w (a0)+,d0 ; get patch move.w (a0)+,d1 ; get offset beq .flush ; skip to rest of loader program move.w d0,(a6,d1.w) bra.s 2$ .rlist dc.w $260,$33c,$3ec,$462,$5a4,$610,$62e,$652 dc.w $666,$676,$6ae,$70e,$9f4 .plist dc.w $0042,$460 dc.w $004a,$33a dc.w $202c,$338 dc.w $23c2,$59e dc.w $4cdf,$45e dc.w $4ef9,$6ba dc.w $6002,$290 dc.w $6004,$2c8 dc.w $6004,$2d2 dc.w $6004,$4c2 dc.w $6004,$506 dc.w $600c,$266 dc.w $600e,$4a0 dc.w $7000,$62c dc.w $b040,$60e dc.w 0,0 .loader movem.l d0-d1/a0-a1/a5-a6,-(sp) move.l .a5save(pc),a5 moveq #0,d0 move.b .track+3(pc),d0 move.l (a4),a0 bsr __rawrd move.l (a4),a0 move.w 30(sp),d0 bsr __sync movem.l (sp)+,d0-d1/a0-a1/a5-a6 jmp rattdos+$73a .track dc.l 0 .a5save dc.l 0 .flush move.l a6,-(sp) move.l execbase(a5),a6 call CacheClearU move.l (sp)+,a6 lea .a5save(pc),a0 move.l a5,(a0) MOVE.W #1,D1 JSR 4(A6) ; init drives lea dirbuf,a0 MOVE.L A0,D0 JSR 8(A6) ; change directory-buffer lea TRACKBUFFER,a0 MOVE.L A0,D0 JSR 12(A6) ; change data-buffer (mfm/decode) moveq #0,d0 jsr $38(a6) ; read directory ; save directory file SAVEF dirname(pc),dirbuf,#1628 ; save every file in the directory lea dirbuf+$BC,a0 .next tst.b (a0) beq.s .done move.l a0,-(sp) bsr.s .save move.l (sp)+,a0 lea $18(a0),a0 bra.s .next .done rts .save lea filebuf,a1 movem.l a0-a1/a5-a6,-(sp) exg.l a0,a1 ; a1 = filename, a0 = buffer move.w #-1,d1 jsr $1c(a6) movem.l (sp)+,a0-a1/a5-a6 bra __savef ; a0 = filename, a1 = buffer, d0 = length rattnam dc.b 'rattdos',0 bootnam dc.b 'bootcode',0 dirname dc.b 'cp.dir',0 cnop 0,4 section mem,bss rattdos ds.b 4096 dirbuf ds.b 4096 fakehw ds.b $200 filebuf ds.b 80*1024