2 * Copyright (C) 2007 Anton Blad
3 * Copyright (C) 2007 Fredrik Kuivinen
4 * Copyright (C) 2007 Jakob Rosén
6 * This file is licensed under GPL v2.
17 #include <util/delay.h>
19 #define DUMPTASK_MODE_MASK 0x01
20 #define DUMPTASK_FLAGS_DUMPING 0x02
21 #define DUMPTASK_FLAGS_SENDPACKET 0x04
23 static uint8_t dumptask_flags
;
24 static uint16_t dumptask_blocksxferd
;
25 static buf_t dumptask_bufferextremeusage
;
27 static inline uint8_t dumptask_isdumping()
29 return dumptask_flags
& DUMPTASK_FLAGS_DUMPING
;
32 static inline void dumptask_setdumping()
34 dumptask_flags
|= DUMPTASK_FLAGS_DUMPING
;
37 static inline void dumptask_cleardumping()
39 dumptask_flags
&= ~DUMPTASK_FLAGS_DUMPING
;
42 static inline uint8_t dumptask_sendpacket()
44 return dumptask_flags
& DUMPTASK_FLAGS_SENDPACKET
;
47 static inline void dumptask_setsendpacket()
49 dumptask_flags
|= DUMPTASK_FLAGS_SENDPACKET
;
52 static inline void dumptask_clearsendpacket()
54 dumptask_flags
&= ~DUMPTASK_FLAGS_SENDPACKET
;
57 static inline uint8_t dumptask_mode()
59 return dumptask_flags
& DUMPTASK_MODE_MASK
;
62 static inline void dumptask_setmode(uint8_t mode
)
64 dumptask_flags
|= mode
;
70 dumptask_blocksxferd
= 0;
71 dumptask_bufferextremeusage
= 0;
74 void dumptask_setup(uint8_t mode
)
78 // Set sense low, to stop motor.
82 dumptask_blocksxferd
= 0;
83 dumptask_bufferextremeusage
= 0;
84 dumptask_setmode(mode
);
86 if(mode
== DUMPTASK_MODE_DUMP
) {
87 // Select TAPEREAD as ICP input
89 timer1_setmode(TIMER1_MODE_DUMP
);
91 // Select C64 as ICP input
93 timer1_setmode(TIMER1_MODE_SAVE
);
97 buf_t
dumptask_bufferusage()
99 return dumptask_bufferextremeusage
;
104 if(dumptask_mode() == DUMPTASK_MODE_DUMP
) {
105 if(!dumptask_isdumping() && tapesense_ison())
107 // Start dumping and tell C64 to turn motor on
111 // Send status message to host
112 trut_msg_dumpstarted();
114 dumptask_setdumping();
116 else if(dumptask_isdumping() && !tapesense_ison())
118 // Stop dumping and tell C64 to turn motor off
122 trut_msg_dumpfinished();
123 dumptask_setsendpacket();
125 dumptask_cleardumping();
127 } else { /* dumptask_mode() == DUMPTASK_MODE_C64WRITE */
128 if(!dumptask_isdumping())
130 // Start dumping and tell C64 to turn motor on
134 // Send status message to host
135 trut_msg_dumpstarted();
137 dumptask_setdumping();
141 // If we are dumping, check if there is enough data in buffer.
142 if(dumptask_isdumping())
144 if(buffer_numused() >= (TRUT_EP_DATA_SIZE
>> 1) &&
145 trut_can_send_data())
147 dumptask_setsendpacket();
151 if(dumptask_sendpacket())
153 if(buffer_numused() > dumptask_bufferextremeusage
)
154 dumptask_bufferextremeusage
= buffer_numused();
156 if(trut_send_buffer_data() == 0)
157 dumptask_blocksxferd
++;
159 trut_msg_commerror(TRUT_MSG_COMMERROR_WRITEDATA
);
161 dumptask_clearsendpacket();