#include "motors.h"
#include "sci.h"
#include "vend.h"
+#include "xmodem.h"
u8 last_standalone;
u8 last_switch_input;
char nibble2hexchar(u8 b) {
if (b <= 9) return b+'0';
- if (b >= 10 && b <= 15) return b+'A';
+ if (b >= 10 && b <= 15) return b+'A'-10;
return 'X';
}
if (sci_rx_buf[1] == '\0')
chime_start();
else if (sci_rx_buf[2] != '\0' && sci_rx_buf[3] == '\0')
- chime_start(hex2u8(sci_rx_buf[1], sci_rx_buf[2]));
+ chime_for(hex2u8(sci_rx_buf[1], sci_rx_buf[2]));
else {
send_string("510 Unknown chime duration." CRLF);
return;
" -------------| " CRLF
" | | | | " CRLF
" <__/ \\__>" CRLF
+"" CRLF
+" ... Where's the cheese?" CRLF
);
}
" B[nn] beep for a duration nn (optional)" CRLF
" S[...] query all internal switch states" CRLF
" H[...] this help screen" CRLF
+ " GETROM download the ROM source code using xmodem" CRLF
"Comments start with a #" CRLF
);
}
+extern const char _rom_src_data[];
+extern const u16 _rom_src_len;
+void getrom() {
+ if (!my_strncmp("ETROM", (char*)sci_rx_buf+1, 5)) {
+ unknown_command();
+ return;
+ }
+ char s[4];
+ send_string("Writing to serial port (maybe). Size is 0x");
+ send_string(u82hex(_rom_src_len >> 8));
+ send_string(u82hex(_rom_src_len & 0xff));
+ send_string(" with signature ");
+ s[0] = _rom_src_data[0];
+ s[1] = _rom_src_data[1];
+ s[2] = _rom_src_data[2];
+ s[3] = '\0';
+ send_string(s);
+ send_string(CRLF " Type YES to download via XMODEM: ");
+ msg_clr();
+ while (!sci_have_packet); /* spin */
+ if (!my_strncmp("YES", (char*)sci_rx_buf, 3)) return;
+
+ sci_init();
+ sci_doing_xmodem = 1;
+ if (!xmodem_init_xfer()) {
+ sci_doing_xmodem = 0;
+ send_string("XMODEM init failed. Nobody's listening :(" CRLF);
+ return;
+ }
+ char *p = (char*)_rom_src_data;
+ char *end = (char*)_rom_src_data+_rom_src_len;
+ bool aborted = 0;
+ while (1) {
+ if (!xmodem_send_packet((char*)p, 128)) {
+ aborted = 1;
+ break;
+ }
+ p += 128;
+ if (p + 128 > end) {
+ /* send partial packet */
+ if (!xmodem_send_packet((char*)p, end-p)) aborted = 1;
+ break;
+ }
+ }
+
+ xmodem_finish_xfer();
+ sci_doing_xmodem = 0;
+ if (aborted)
+ send_string(CRLF "Transfer aborted." CRLF);
+ else
+ send_string(CRLF "Transfer complete." CRLF);
+}
+
void quit() {
if (my_strncmp("UIT", (char*)sci_rx_buf+1, 3))
send_string("013 You can't quit you doofus." CRLF);
case 'Q':
quit();
break;
+ case 'G':
+ getrom();
+ break;
default:
// shurg
unknown_command();