#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 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}; 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(); // コマンド受信 oled.clear(); 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; } } } 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); // 入力に戻す } void loadCommand() { byte data; int p = 0; while(1) { WAIT_HIGH; data = ReadByte(); buff[p++] = data; if(data == 0) break; } oled.println(buff); } void saveCommand() { byte data, add[4]; int p = 0; while(1) { WAIT_HIGH; data = ReadByte(); buff[p++] = data; if(data == 0) break; } oled.println(buff); for(int i=0; i<4; i++) { WAIT_HIGH; add[i] = ReadByte(); } for(int i=0; i<4; i++) oled.print(add[i], HEX); } void renameCommand() { byte data; int p; for(int i=0; i<2; i++) { p = 0; while(1) { WAIT_HIGH; data = ReadByte(); buff[p++] = data; if(data == 0) break; } oled.println(buff); } } void killCommand() { byte data; int p = 0; while(1) { WAIT_HIGH; data = ReadByte(); buff[p++] = data; if(data == 0) break; } oled.println(buff); } byte ReadByte() { byte b, data = 0; digitalWrite(PIN1, LOW); // MSXへ送信許可 WAIT_LOW; // 2ビット×4回で1バイト受け取る for(int i=0; i<4; i++) { WAIT_HIGH; b = 0; if(digitalRead(PIN6) == HIGH) b = 1; if(digitalRead(PIN7) == HIGH) b += 2; data += (b << (i * 2)); WAIT_LOW; } digitalWrite(PIN1, HIGH); // 受信完了 return data; } void SendByte(byte data) { digitalWrite(PIN6, LOW); // 送信可能 WAIT_HIGH; // 上位4ビット出力 for(int i=0; i<4; i++) digitalWrite(port[i], bitRead(data, i + 4)); WAIT_LOW; WAIT_HIGH; // 下位4ビット出力 for(int i=0; i<4; i++) digitalWrite(port[i], bitRead(data, i)); WAIT_LOW; digitalWrite(PIN6, HIGH); } void SendString(byte* str) { byte* p; p = str; while(*p != 0) { SendByte(*(p++)); } }