fix $ bug, use byte data type

This commit is contained in:
nino-porcino 2022-03-25 18:15:24 +01:00
parent b3abf7f2cd
commit 1ae7ed5ac5
1 changed files with 53 additions and 48 deletions

View File

@ -56,7 +56,6 @@ SdFat SD;
#define SD_CS_PIN SS #define SD_CS_PIN SS
// pin definitions // pin definitions
#define BIT0 2 #define BIT0 2
@ -74,9 +73,9 @@ SdFat SD;
#define CPU_STROBE 15 #define CPU_STROBE 15
// indicates that a timeout occurred during wait_cpu_strobe() // indicates that a timeout occurred during wait_cpu_strobe()
int TIMEOUT = 0; byte TIMEOUT = 0;
void wait_cpu_strobe(int value) { void wait_cpu_strobe(byte value) {
unsigned long start_time = millis(); unsigned long start_time = millis();
unsigned long elapsed; unsigned long elapsed;
@ -92,12 +91,12 @@ void wait_cpu_strobe(int value) {
} }
} }
const int DIR_INPUT = 0; const byte DIR_INPUT = 0;
const int DIR_OUTPUT = 1; const byte DIR_OUTPUT = 1;
int last_dir; // remember last data port pins direction byte last_dir; // remember last data port pins direction
void set_data_port_direction(int dir) { void set_data_port_direction(byte dir) {
// check if no need to set pins // check if no need to set pins
if(dir == last_dir) return; if(dir == last_dir) return;
@ -127,7 +126,7 @@ void set_data_port_direction(int dir) {
last_dir = dir; last_dir = dir;
} }
int receive_byte_from_cpu() { byte receive_byte_from_cpu() {
// set data port pins as INPUT pins // set data port pins as INPUT pins
set_data_port_direction(DIR_INPUT); set_data_port_direction(DIR_INPUT);
@ -139,9 +138,9 @@ int receive_byte_from_cpu() {
// read the data byte // read the data byte
#ifdef FASTWRITE #ifdef FASTWRITE
int data = ((PORTB & 0x03)<<6) | (PORTD >> 2); // data = { PORTB[1:0], PORTD[7:2] } byte data = ((PORTB & 0x03)<<6) | (PORTD >> 2); // data = { PORTB[1:0], PORTD[7:2] }
#else #else
int data = byte data =
(digitalRead(BIT0) << 0) | (digitalRead(BIT0) << 0) |
(digitalRead(BIT1) << 1) | (digitalRead(BIT1) << 1) |
(digitalRead(BIT2) << 2) | (digitalRead(BIT2) << 2) |
@ -164,7 +163,7 @@ int receive_byte_from_cpu() {
return data; return data;
} }
void send_byte_to_cpu(int data) { void send_byte_to_cpu(byte data) {
// set data port pins as OUTPUT pins // set data port pins as OUTPUT pins
set_data_port_direction(DIR_OUTPUT); set_data_port_direction(DIR_OUTPUT);
@ -208,24 +207,25 @@ void send_byte_to_cpu(int data) {
// ********************************************************************************************* // *********************************************************************************************
// ********************************************************************************************* // *********************************************************************************************
const int CMD_READ = 0; const byte CMD_READ = 0;
const int CMD_WRITE = 1; const byte CMD_WRITE = 1;
const int CMD_DIR = 2; const byte CMD_DIR = 2;
const int CMD_LOAD = 4; const byte CMD_LOAD = 4;
const int CMD_DEL = 11; const byte CMD_DEL = 11;
const int CMD_LS = 12; const byte CMD_LS = 12;
const int CMD_CD = 13; const byte CMD_CD = 13;
const int CMD_MKDIR = 14; const byte CMD_MKDIR = 14;
const int CMD_PWD = 19; const byte CMD_PWD = 19;
const int CMD_RMDIR = 15; const byte CMD_RMDIR = 15;
const int CMD_TEST = 20; const byte CMD_TEST = 20;
const int ERR_RESPONSE = 255; const byte ERR_RESPONSE = 255;
const int WAIT_RESPONSE = 1; const byte WAIT_RESPONSE = 1;
const int OK_RESPONSE = 0; const byte OK_RESPONSE = 0;
// @buffer
char filename[64]; char filename[64];
char tmp[64]; char tmp[32];
char cd_path[64]; char cd_path[64];
// fixed messages // fixed messages
@ -289,8 +289,8 @@ void setup() {
// ************************************************************************************** // **************************************************************************************
// ************************************************************************************** // **************************************************************************************
int list_files; byte list_files;
void comando_dir(int command) { void comando_dir(byte command) {
Serial.println(F("command DIR received from CPU")); Serial.println(F("command DIR received from CPU"));
// reads filename as 0 terminated string // reads filename as 0 terminated string
@ -319,7 +319,7 @@ void comando_dir(int command) {
list_files = 0; // starts listing dirs (0) then files (1) list_files = 0; // starts listing dirs (0) then files (1)
while(true) { while(true) {
int c = receive_byte_from_cpu(); byte c = receive_byte_from_cpu();
if(TIMEOUT) { if(TIMEOUT) {
Serial.println(F("timeout while receiving 'next line' byte")); Serial.println(F("timeout while receiving 'next line' byte"));
break; break;
@ -340,7 +340,7 @@ void comando_dir(int command) {
myDir.close(); myDir.close();
} }
int send_next_dir_line(int command) { byte send_next_dir_line(byte command) {
// user wants a new line of dir listing // user wants a new line of dir listing
while(1) { while(1) {
@ -371,7 +371,7 @@ int send_next_dir_line(int command) {
return 1; // more lines to send return 1; // more lines to send
} }
void send_directory_entry(int command) { void send_directory_entry(byte command) {
myFile.getName(filename, 64); myFile.getName(filename, 64);
strtoupper(filename); strtoupper(filename);
@ -412,11 +412,11 @@ void send_directory_entry(int command) {
if(x != NULL) { if(x != NULL) {
*x++ = 0; *x++ = 0;
if(x[0]=='0' && x[1]=='6') { if(x[0]=='0' && x[1]=='6') {
strcpy(type,"BIN $"); strcpy(type,"BIN ");
strcpy(address,x+2); strcpy(address,x+2);
} }
else if(x[0]=='F' && x[1]=='1') { else if(x[0]=='F' && x[1]=='1') {
strcpy(type,"BAS $"); strcpy(type,"BAS ");
strcpy(address,x+2); strcpy(address,x+2);
} }
else { else {
@ -434,8 +434,12 @@ void send_directory_entry(int command) {
print_string_to_cpu(type); print_string_to_cpu(type);
Serial.print(type); Serial.print(type);
print_string_to_cpu(address); if(type[0]!=0) {
send_byte_to_cpu('$');
Serial.print("$");
}
print_string_to_cpu(address);
Serial.println(address); Serial.println(address);
send_byte_to_cpu('\r'); send_byte_to_cpu('\r');
@ -505,7 +509,7 @@ void comando_read() {
void send_string_to_cpu(char *msg) { void send_string_to_cpu(char *msg) {
while(1) { while(1) {
int c = *msg++; byte c = *msg++;
send_byte_to_cpu(c); send_byte_to_cpu(c);
if(TIMEOUT) break; if(TIMEOUT) break;
if(c==0) break; if(c==0) break;
@ -515,7 +519,7 @@ void send_string_to_cpu(char *msg) {
// come send_string_to_cpu ma senza lo zero finale // come send_string_to_cpu ma senza lo zero finale
void print_string_to_cpu(char *msg) { void print_string_to_cpu(char *msg) {
while(1) { while(1) {
int c = *msg++; byte c = *msg++;
if(c==0) break; if(c==0) break;
send_byte_to_cpu(c); send_byte_to_cpu(c);
if(TIMEOUT) break; if(TIMEOUT) break;
@ -525,7 +529,7 @@ void print_string_to_cpu(char *msg) {
void receive_string_from_cpu(char *msg) { void receive_string_from_cpu(char *msg) {
while(1) { while(1) {
int c = receive_byte_from_cpu(); byte c = receive_byte_from_cpu();
if(TIMEOUT) break; if(TIMEOUT) break;
*msg++ = c; *msg++ = c;
if(c==0) break; if(c==0) break;
@ -539,8 +543,8 @@ void receive_string_from_cpu(char *msg) {
// ************************************************************************************** // **************************************************************************************
int receive_word_from_cpu() { int receive_word_from_cpu() {
int lo = receive_byte_from_cpu(); byte lo = receive_byte_from_cpu();
int hi = receive_byte_from_cpu(); byte hi = receive_byte_from_cpu();
int data = lo | (hi << 8); int data = lo | (hi << 8);
return data; return data;
} }
@ -582,9 +586,9 @@ void comando_write() {
Serial.print(F("received file size: ")); Serial.print(F("received file size: "));
Serial.println(size); Serial.println(size);
int error = 0; byte error = 0;
for(int t=0;t<size;t++) { for(int t=0;t<size;t++) {
int data = receive_byte_from_cpu(); byte data = receive_byte_from_cpu();
if(TIMEOUT) break; if(TIMEOUT) break;
int n = myFile.write((unsigned char)data); int n = myFile.write((unsigned char)data);
if(n!=1) error = 1; if(n!=1) error = 1;
@ -692,8 +696,9 @@ void strtoupper(char *str){
// "pluto" => "", "pluto" // "pluto" => "", "pluto"
// "/pluto" => "/", "pluto" // "/pluto" => "/", "pluto"
// @buffer
char file_path[64]; char file_path[64];
char file_name[64]; char file_name[32];
void split_path(char *filename) { void split_path(char *filename) {
strcpy(file_path, filename); strcpy(file_path, filename);
@ -715,7 +720,7 @@ void split_path(char *filename) {
// returns 1 if matching file is found // returns 1 if matching file is found
// returns 0 if no matching file is found // returns 0 if no matching file is found
// //
int matchname(char *filename, char *dest) { byte matchname(char *filename, char *dest) {
// split filename into file_path and file_name // split filename into file_path and file_name
split_path(filename); split_path(filename);
@ -735,7 +740,7 @@ int matchname(char *filename, char *dest) {
Serial.println(F("dir opened")); Serial.println(F("dir opened"));
// scans twice: scanmode=0 for exact match, scanmode=1 for partial match // scans twice: scanmode=0 for exact match, scanmode=1 for partial match
for(int scanmode=0;scanmode<=1;scanmode++) { for(byte scanmode=0;scanmode<=1;scanmode++) {
if(scanmode==0) Serial.println(F("scanning for exact match...")); if(scanmode==0) Serial.println(F("scanning for exact match..."));
if(scanmode==1) Serial.println(F("scanning for partial match...")); if(scanmode==1) Serial.println(F("scanning for partial match..."));
@ -949,7 +954,7 @@ void comando_cd() {
if(filename[0] == '.' && filename[1] == '.' && filename[2] == 0) { if(filename[0] == '.' && filename[1] == '.' && filename[2] == 0) {
strcpy(filename, cd_path); strcpy(filename, cd_path);
for(int t=strlen(filename)-1;t>=1;t--) { for(int t=strlen(filename)-1;t>=1;t--) {
int c = filename[t]; byte c = filename[t];
filename[t] = 0; filename[t] = 0;
if(c == '/') break; if(c == '/') break;
} }
@ -1041,7 +1046,7 @@ void comando_pwd() {
void loop() { void loop() {
TIMEOUT = 0; TIMEOUT = 0;
int data = receive_byte_from_cpu(); byte data = receive_byte_from_cpu();
if(TIMEOUT) return; if(TIMEOUT) return;
unsigned long start_time = millis(); unsigned long start_time = millis();
@ -1058,7 +1063,7 @@ void loop() {
else if(data == CMD_LS) comando_dir(data); else if(data == CMD_LS) comando_dir(data);
else if(data == CMD_TEST) { else if(data == CMD_TEST) {
while(!TIMEOUT) { while(!TIMEOUT) {
int data = receive_byte_from_cpu(); byte data = receive_byte_from_cpu();
send_byte_to_cpu(data ^ 0xFF); send_byte_to_cpu(data ^ 0xFF);
} }
} }