58 lines
1.3 KiB
C++
58 lines
1.3 KiB
C++
|
|
#include "binary.hpp"
|
|
#include "device.hpp"
|
|
#include <iostream>
|
|
#include <ostream>
|
|
#include <string>
|
|
|
|
int main(int argc, char** argv) {
|
|
std::string data;
|
|
|
|
if(!binary::process_all(data, argc, argv)) {
|
|
std::cerr << "Usage: " << argv[0] << " device [midifile ...]?\n\n";
|
|
return 1;
|
|
}
|
|
|
|
unsigned at = 0;
|
|
Device device(argv[1]);
|
|
device.put(Device::Mode::e_serial);
|
|
|
|
for(;;) {
|
|
Device::Mode mode = (Device::Mode)device.get();
|
|
switch(mode) {
|
|
default: {
|
|
std::cout << "device: unknown (" << mode << ")" << std::endl;
|
|
break;
|
|
}
|
|
case Device::Mode::e_ready: {
|
|
device.put(Device::Mode::e_serial);
|
|
std::cout << "device: ready" << std::endl;
|
|
break;
|
|
}
|
|
case Device::Mode::e_jump: {
|
|
at = (device.get() & 0xff);
|
|
at = (at << 8) | (device.get() & 0xff);
|
|
at = (at << 8) | (device.get() & 0xff);
|
|
at = (at << 8) | (device.get() & 0xff);
|
|
std::cout << "device: jump (" << at << ")" << std::endl;
|
|
break;
|
|
}
|
|
case Device::Mode::e_read: {
|
|
unsigned len = (device.get() & 0xff);
|
|
if(len + at > data.length()) {
|
|
unsigned l = data.length() - at;
|
|
device.write(data.c_str() + at, l);
|
|
for(int i = 0; i < len - l; i++) {
|
|
device.put(0);
|
|
}
|
|
at += l;
|
|
} else {
|
|
device.write(data.c_str() + at, len);
|
|
at += len;
|
|
}
|
|
break;
|
|
}}
|
|
}
|
|
}
|
|
|