Update TODO list
[trut64.git] / avr / dumptask.c
blobf0eb8b62555ba417ae9df86feff3ae8010600305
1 /*
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.
7 */
9 #include "dumptask.h"
10 #include "timer1.h"
11 #include "buffer.h"
12 #include "fcpu.h"
13 #include "c64tape.h"
14 #include "motor.h"
15 #include <avr/io.h>
16 #include "trutcomm.h"
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;
67 void dumptask_init()
69 dumptask_flags = 0;
70 dumptask_blocksxferd = 0;
71 dumptask_bufferextremeusage = 0;
74 void dumptask_setup(uint8_t mode)
76 buffer_clear();
78 // Set sense low, to stop motor.
79 c64sense_off();
81 dumptask_flags = 0;
82 dumptask_blocksxferd = 0;
83 dumptask_bufferextremeusage = 0;
84 dumptask_setmode(mode);
86 if(mode == DUMPTASK_MODE_DUMP) {
87 // Select TAPEREAD as ICP input
88 rsig(RSIG_TAPE);
89 timer1_setmode(TIMER1_MODE_DUMP);
90 } else {
91 // Select C64 as ICP input
92 rsig(RSIG_C64);
93 timer1_setmode(TIMER1_MODE_SAVE);
97 buf_t dumptask_bufferusage()
99 return dumptask_bufferextremeusage;
102 void dumptask()
104 if(dumptask_mode() == DUMPTASK_MODE_DUMP) {
105 if(!dumptask_isdumping() && tapesense_ison())
107 // Start dumping and tell C64 to turn motor on
108 c64sense_on();
109 timer1_start();
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
119 c64sense_off();
120 timer1_pause();
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
131 c64sense_on();
132 timer1_start();
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++;
158 else
159 trut_msg_commerror(TRUT_MSG_COMMERROR_WRITEDATA);
161 dumptask_clearsendpacket();