#include #include #include #include "SSD1306Ascii.h" #include "SSD1306AsciiWire.h" #define I2C_ADDRESS 0x3C #define WAIT_HIGH while(digitalRead(PIN8) == LOW) #define WAIT_LOW while(digitalRead(PIN8) == HIGH) #define PIN1 8 #define PIN2 7 #define PIN3 6 #define PIN4 5 #define PIN6 4 #define PIN7 3 #define PIN8 2 /* #define PIN8 2 #define PIN6 3 #define PIN7 4 #define PIN1 5 #define PIN2 6 #define PIN3 7 #define PIN4 8 */ SSD1306AsciiWire oled; int port[] = {PIN1, PIN2, PIN3, PIN4}; uint8_t head8[8] = {0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74}; char buff[15]; void setup() { pinMode(PIN6, INPUT); pinMode(PIN7, INPUT); pinMode(PIN8, INPUT); pinMode(PIN1, OUTPUT); pinMode(PIN2, OUTPUT); pinMode(PIN3, OUTPUT); pinMode(PIN4, OUTPUT); Wire.begin(); Wire.setClock(400000L); oled.begin(&Adafruit128x64, I2C_ADDRESS); oled.setFont(System5x7); oled.clear(); /*if (!SD.begin(10)) { oled.println("SD failed!"); while (1); } oled.println("SD Init done");*/ } void loop() { byte data; if(digitalRead(PIN8) == HIGH) // スタートビット待ち { data = ReadByte(); // コマンド受信 SD.begin(10); switch(data) { case 'F': filesCommand(); break; case 'L': loadCommand(); break; case 'S': saveCommand(); break; case 'R': renameCommand(); break; case 'K': killCommand(); break; default: oled.println("error"); break; } SD.end(); } } void filesCommand() { File root; int len; pinMode(PIN6, OUTPUT); // MSXへの制御信号出力 digitalWrite(PIN6, HIGH); // 送信不可 root = SD.open("/"); while (true) { File entry = root.openNextFile(); if (!entry) break; if (!entry.isDirectory()) // サブフォルダは扱わない { SendString(entry.name()); len = strlen(entry.name()); for(int i=0; i<(12-len); i++) SendByte(' '); sprintf(buff, "%6d", entry.size()); SendString(buff); SendByte(0x0d); SendByte(0x0a); } entry.close(); } SendByte(0); // 送信文字列の終端 pinMode(PIN6, INPUT); // 入力に戻す digitalWrite(PIN1, HIGH); // 受信不可 } void loadCommand() { uint8_t data; int p = 0; File loadfile; uint16_t fsize; uint8_t head[32]; bool error = false; while(1) { WAIT_HIGH; data = ReadByte(); buff[p++] = data; if(data == 0) break; } pinMode(PIN6, OUTPUT); // MSXへの制御信号出力 digitalWrite(PIN6, HIGH); // 送信不可 loadfile = SD.open(buff); if(loadfile) { //casファイルヘッダチェック for(int i=0; i<32; i++) head[i] = loadfile.read(); for(int i=0; i<8; i++) { if(head[i] != head8[i]) { error = true; break; } } if(!error) { for(int i=8; i<18; i++) if(head[i] != 0xd0) { error = true; break; } } if(!error) { for(int i=0; i<8; i++) if(head[i + 24] != head8[i]) { error = true; break; } } if(error) { SendByte(0); SendByte(0); loadfile.close(); pinMode(PIN6, INPUT); // 入力に戻す digitalWrite(PIN1, HIGH); // 受信不可 return; } // プログラムサイズ送信 for(int i=0; i<6; i++) head[i] = loadfile.read(); fsize = btow(head[3], head[2]); fsize -= btow(head[1], head[0]); ++fsize; data = (uint8_t)(fsize & 0xff); SendByte(data); // ファイルサイズの下位バイト data = (uint8_t)((fsize & 0xff00) >> 8); SendByte(data); // ファイルサイズの上位バイト SendByte(head[0]); // ロードアドレスの下位バイト SendByte(head[1]); // ロードアドレスの上位バイト SendByte(head[4]); // 実行アドレスの下位バイト SendByte(head[5]); // 実行アドレスの上位バイト // プログラム本体送信 while(loadfile.available()) SendByte(loadfile.read()); loadfile.close(); } else { SendByte(0); SendByte(0); } pinMode(PIN6, INPUT); // 入力に戻す digitalWrite(PIN1, HIGH); // 受信不可 } void saveCommand() { File saveFile; uint8_t data, add[6]; int p = 0; bool flag = false; uint16_t dsize; while(1) { WAIT_HIGH; data = ReadByte(); buff[p++] = data; if(data == 0) break; } pinMode(PIN6, OUTPUT); // MSXへの制御信号出力 digitalWrite(PIN6, HIGH); // 送信不可 // 同名ファイルがあれば削除する if(SD.exists(buff)) SD.remove(buff); saveFile = SD.open(buff, O_WRITE | O_CREAT); if(saveFile) { SendByte(1); pinMode(PIN6, INPUT); // 入力に戻す digitalWrite(PIN1, HIGH); // 受信不可 // casファイルヘッダ作成・SD書き込み saveFile.write(head8, 8); for(int i=0; i<10; i++) saveFile.write(0xd0); for(int i=0; i<6; i++) { if(buff[i] == 0) flag = true; if(flag) saveFile.write(' '); else saveFile.write(buff[i]); } saveFile.write(head8, 8); // アドレス受信 for(int i=0; i<6; i++) { WAIT_HIGH; add[i] = ReadByte(); } saveFile.write(add, 6); dsize = btow(add[3], add[2]) - btow(add[1], add[0]) + 1; for(int i=0; i