//Z80_monitor_menu09
//インクルド
#include <Arduino.h>
#include <EEPROM.h>
//定義
//メモリーエリアの確保
unsigned char RAM[256] = {0xff,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
char str1[256 + 1] = {
"01 02 0A\n"
"FF"
};
//定義 メニュー用
char menu1[] = {"\n"
"=================================\n"
"=================================\n"
"*[a]ddress input/outupt start address\n"
"[i]nput input dump (stop ctrl + z)\n"
"[l]ist output dump\n"
"[n]ew reset ram clear\n"
"*[r]eset run execution (no ram clear)\n"
"[s]ave save eeprom\n"
"[g]et load eeprom\n"
"[b]ye exit system\n"
"=>"
};
//char menu1[] = ">"; //debug
//0 1 2 3 4 5 6 7 8 9 A B C D E F
char t[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //00
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //10
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, //30
0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, //40
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //50
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //60
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //90
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //A0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //B0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //C0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //D0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //E0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 //F0
};
int dump_in(unsigned char *p, unsigned char *d) {
// Your code here!
int i = 0; //カウンター 入力文字
int l = 0; //カウンター 出力バイナリ
int a; //一時領域
int g; //一時領域
while (1) { //無限ループ
//読み飛ばし
//構造化プログラミング先読み
a = p[i]; //読み出し
while ((t[a] == 0) && (a != '0') && (a != 0)) {
i++;
a = p[i]; //読み出し
} //while
if (a == 0) break; //終端文字の時は、ループを抜ける
//-------------------------------------
//16進の間
//構造化プログラミング先読み
a = p[i]; //読み出し
g = 0;
while ( ((t[a] != 0) || (a == '0')) && (a != 0)) {
g = (g << 4) + t[a];
i++;
a = p[i]; //読み出し
} //while
d[l] = g;
l++;
if (a == 0) break; //終端文字の時は、ループを抜ける
} //while 0
return (l);
} //dump_in
void dump_out(unsigned char *dump1, int num) {
// Your code here!
char *b = "0123456789ABCDEF"; //16進の変換テーブル
int k = 0; //アドレスのカウンター
//ヘッターの表示
Serial.println("add +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F");
if (num == 0) return;
for (int i = 0; i < (((num - 1) / 16) + 1); i++) { //行のループ
//アドレスの表示
Serial.print(b[k >> 12 ]); //上位4ビットを表示
Serial.print(b[k >> 8 & 0x0f]); //12ビット目から4ビット
Serial.print(b[k >> 4 & 0x0f]); //8ビット目から4ビット
Serial.print(b[k & 0x0f]); //下位4ビットを表示
Serial.print(' ');
for (int j = 0; j < 16; j++) { //列のループ
//データの表示
int a = dump1[k++];
Serial.print(b[a >> 4 ]); //上位4ビットを表示
Serial.print(b[a & 0x0f]); //下位4ビットを表示
Serial.print(' ');
} //for j
Serial.println(); //改行
} //for i
} //dump_out
//初期化
void setup() {
//シリアルポートの初期化
Serial.begin(9600);
Serial.print(menu1); //メニューの表示
} //setup
//メインループ
void loop() {
if (Serial.available() > 0) { // 受信したデータが存在する
char ch1 = Serial.read(); // 受信データを読み込む
Serial.println(ch1); // 受信データを送りかえす
if (ch1 == 'a') { //add
Serial.println("!!add"); //debug
} else if (ch1 == 'i') { //input
Serial.println("!!input"); //debug
Serial.println();
Serial.println("input text"); //debug
int i = 0;
while (1) { //無限ループ
if (Serial.available() > 0) { // 受信したデータが存在する
char ch = Serial.read(); // 受信データを読み込む
if (ch == 26) { //STOP
str1[i] = 0;
break;
}
str1[i++] = ch;
Serial.print(ch); // 受信データを送りかえす
} //endif
} //while
//16進テキストをバイナリーに変換
//unsigned char p[]="01-02-0A";
Serial.println(); //debug
Serial.print('['); //debug
Serial.print(str1); //gebug
Serial.print(']'); //debug
Serial.println(); //debug
int num = dump_in(str1,RAM);
} else if (ch1 == 'l') { //list
Serial.println("!!list"); //debug
Serial.println();
Serial.println("input binary"); //debug
dump_out(RAM,256);
} else if (ch1 == 'n') { //new
Serial.println("!!new"); //debug
str1[0] = 0; //文字列の初期化(クリアー)
} else if (ch1 == 'r') { //run
Serial.println("!!run"); //debug
} else if (ch1 == 's') { //save
Serial.println("!!save"); //debug
int i = 0;
while (str1[i] != 0) {
EEPROM.write(i, str1[i]); //EEPROMへの書き込み
i++;
} //while
EEPROM.write(i, 0); //EEPROMへの書き込み
} else if (ch1 == 'g') { // get
Serial.println("!!load"); //debug
char ch;
int i = 0;
do {
ch = EEPROM.read(i); //EEPROMからの読み込み
//ch = 0; //debug
str1[i] = ch;
i++;
} while (ch != 0); //while
} else if (ch1 == 'b') { //bye
Serial.println("!!bye"); //debug
while (1) {}; //無限ループ
} //endif
Serial.print(menu1); //メニューの表示
} //endif
} //loop