************************************************************************* * Original Tape Loader * (C) 1995,1997 Per Håkan Sundell * requires CCS adapter ************************************************************************* * incdir Devpac:include *=======================================================================* * * * CODE SECTION * * * *=======================================================================* section CODE,code Main BSR OpenLibraries bsr MakeTimeTable BSR PressPlay TST.L D0 BNE _mbreak BSR ReadFileData TST.L D0 BNE _merror BSR SaveFile TST.L D0 BNE _mserror RTS _merror LEA TXT_LOADERROR,A0 BSR Print RTS _mbreak LEA TXT_BREAK,A0 BSR Print RTS _mserror LEA TXT_SAVEERROR,A0 BSR Print RTS IrqOff MOVE.W #$4000,$DFF09A RTS IrqOn MOVE.W #$C000,$DFF09A RTS SaveFile LEA file_name,A0 MOVE.L A0,D1 MOVE.L #$3EE,D2 MOVE.L dos_lib,A6 JSR -$1E(A6) MOVE.L D0,D1 BEQ _sferror CMP.L #$FFFFFFFF,D0 BEQ _sferror MOVE.L D1,-(SP) lea file_header,a0 move.l a0,d2 move.l #$14,d3 move.l file_length,d0 move.b d0,$10(a0) lsr.l #8,d0 move.b d0,$11(a0) lsr.l #8,d0 move.b d0,$12(a0) lsr.l #8,d0 move.b d0,$13(a0) MOVE.L dos_lib,A6 jsr -$30(a6) MOVE.L (SP),D1 LEA file_data,A0 MOVE.L A0,D2 MOVE.L file_length,D3 MOVE.L dos_lib,A6 JSR -$30(A6) MOVE.L (SP)+,D1 MOVE.L dos_lib,A6 JSR -$24(A6) MOVEQ #0,D0 RTS _sferror MOVEQ #1,D0 RTS ReadFileData bsr MotorOn lea file_data,a0 move.l a0,a1 adda.l #$140000,a1 move.l #$140000,file_length bsr ReadSync _rfd1 bsr ReadByte1 move.b d0,(a0)+ btst #6,(a4) beq _rfd2 bsr ReadByte2 move.b d0,(a0)+ cmp.l a0,a1 bne _rfd1 _rfd2 move.l a0,d0 sub.l #file_data,d0 move.l d0,file_length bsr MotorOff moveq #0,d0 rts ReadSync MOVE.W #$7F80,D7 MOVE.W #$40,$DFF0A8 MOVE.W #$80,$DFF09C MOVE.W #$80,$DFF0A6 RTS ReadByte1 moveq #0,D0 _rb1 or.b $d00(a5),D0 btst #4,D0 beq _rb1 move.b #$00,$e00(a5) move.b #$19,$f00(a5) move.w #$80,$09c(a6) move.w d7,$0aa(a6) move.w $006(a6),$180(a6) and.b #$01,d0 beq _rb2 moveq #$00,d0 rts _rb2 move.w $500(a5),d0 move.b $400(a5),d0 subq.w #$2,d0 lea time_table,a2 move.b 0(a2,d0.w),d0 RTS ReadByte2 moveq #0,D0 _rb3 or.b $d00(a5),D0 btst #4,d0 beq _rb3 move.b #$00,$f00(a5) move.b #$19,$e00(a5) move.w #$80,$09c(a6) move.w d7,$0aa(a6) move.w $006(a6),$180(a6) and.b #$02,d0 beq _rb4 moveq #$00,d0 rts _rb4 move.w $700(a5),d0 move.b $600(a5),d0 subq.w #$2,d0 lea time_table,a2 move.b 0(a2,d0.w),d0 rts MakeTimeTable lea time_table,a0 move.w #$5c2,d2 _mtt1 move.w d2,d0 mulu #$07ff,d0 divu #$05c2,d0 lsr #3,d0 move.b d0,(a0)+ subq.w #1,d2 bne _mtt1 rts PressPlay BCLR #5,$BFD100 MOVE.B $BFE001,D0 BSET #5,$BFD100 BTST #5,D0 BEQ _pp2 LEA TXT_PLAY,A0 BSR Print _pp1 BTST #6,$BFE001 BEQ _pp3 BCLR #5,$BFD100 MOVE.B $BFE001,D0 BSET #5,$BFD100 BTST #5,D0 BNE _pp1 _pp2 MOVEQ #0,D0 RTS _pp3 MOVEQ #1,D0 RTS MotorOn bsr IrqOff lea $dff000,a6 lea $bfd000,a5 lea $bfe001,a4 bclr #7,$100(a5) bclr #5,$100(a5) move.b #$0,$e00(a5) move.b #$0,$f00(a5) move.b #$5,$500(a5) move.b #$c2,$400(a5) move.b #$5,$700(a5) move.b #$c2,$600(a5) move.b $d00(a5),d0 moveq #0,d0 _mo1 dbra d0,_mo1 rts MotorOff BSET #7,$BFD100 BSET #5,$BFD100 BCLR #5,$BFD100 BSET #5,$BFD100 BSR IrqOn RTS OpenLibraries LEA doslibrary.MSG,A1 MOVEQ #0,D0 MOVE.L 4,A6 JSR -$198(A6) MOVE.L D0,dos_lib MOVE.L dos_lib,A6 JSR -$3C(A6) MOVE.L D0,std_out RTS Print MOVEM.L D2/D3/A6,-(SP) MOVE.L A0,D2 MOVEQ #0,D3 _p1 TST.B (A0)+ BEQ _p2 ADDQ.L #1,D3 BRA _p1 _p2 TST.L D3 BEQ _p3 MOVE.L std_out,D1 MOVE.L dos_lib,A6 JSR -$30(A6) _p3 MOVEM.L (SP)+,D2/D3/A6 RTS *=======================================================================* * * * DATA SECTION * * * *=======================================================================* Section DATA,data TXT_PLAY dc.b 10,'PRESS PLAY ON TAPE',$A,0 TXT_FOUND dc.b 'FOUND ',0 TXT_LOADING dc.b 'LOADING',$A,0 TXT_BREAK dc.b 'BREAK ERROR',$A,0 TXT_LOADERROR dc.b 'LOAD ERROR',$A,0 TXT_SAVEERROR dc.b 'UNABLE TO CREATE AMIGA FILE ERROR',$A,0 TXT_LINEFEED dc.b 10,0 doslibrary.MSG dc.b 'dos.library',0,0 file_name dc.b 'RAWTAPE',0 file_header dc.b 'C64-TAPE-RAW',0,0,0,0 dc.b 0,0,0,0 Section Bss,BSS dos_lib ds.l 1 std_out ds.l 1 time_table ds.b $600 file_length ds.l 1 file_data ds.b $140000 END