diff --git a/firmware/AtomBusMon.h b/firmware/AtomBusMon.h index cfcd111..1e4c830 100644 --- a/firmware/AtomBusMon.h +++ b/firmware/AtomBusMon.h @@ -1,6 +1,17 @@ #ifndef __ATOMBUSMON_DEFINES__ #define __ATOMBUSMON_DEFINES__ +#include + +typedef uint8_t data_t; +typedef uint16_t addr_t; +typedef uint8_t offset_t; +typedef uint16_t modes_t; +typedef uint8_t trigger_t; +typedef uint16_t cmd_t; +typedef uint16_t param_t; +typedef int16_t bknum_t; + #include "status.h" #include "dis.h" @@ -18,15 +29,6 @@ else __builtin_avr_delay_cycles((unsigned long) ( F_CPU/1000.0 * __ms)) -typedef uint8_t data_t; -typedef uint16_t addr_t; -typedef uint8_t offset_t; -typedef uint16_t modes_t; -typedef uint8_t trigger_t; -typedef uint16_t cmd_t; -typedef uint16_t param_t; -typedef int16_t bknum_t; - uint8_t hwRead8(offset_t offset); uint16_t hwRead16(offset_t offset); diff --git a/firmware/dis.h b/firmware/dis.h index c8c564c..33e42f7 100644 --- a/firmware/dis.h +++ b/firmware/dis.h @@ -6,6 +6,6 @@ #define PDC_DDR DDRA #define PDC_DIN PINA -unsigned int disassemble(unsigned int addr); +addr_t disassemble(addr_t addr); #endif diff --git a/firmware/dis6502.c b/firmware/dis6502.c index 59ade25..1979479 100644 --- a/firmware/dis6502.c +++ b/firmware/dis6502.c @@ -3,7 +3,7 @@ enum { - IMP, IMPA, MARK2, BRA, IMM, ZP, ZPX, ZPY, INDX, INDY, IND, MARK3, ABS, ABSX, ABSY, IND16 + IMP, IMPA, MARK2, BRA, IMM, ZP, ZPX, ZPY, INDX, INDY, MARK3, ABS, ABSX, ABSY, IND16 }; enum @@ -167,77 +167,116 @@ static const unsigned char dopaddr[256] PROGMEM = /*F0*/ BRA, INDY, IMP, IMP, ZP, ZPX, ZPX, IMP, IMP, ABSY, IMP, IMP, ABS, ABSX, ABSX, IMP }; -unsigned int disassemble(unsigned int addr) +addr_t disassemble(addr_t addr) { - unsigned int temp; - unsigned int op = readMemByteInc(); - int mode = pgm_read_byte(dopaddr + op); - unsigned int p1 = (mode > MARK2) ? readMemByteInc() : 0; - unsigned int p2 = (mode > MARK3) ? readMemByteInc() : 0; + char buffer[32]; + uint8_t temp; + data_t op = readMemByteInc(); + data_t p1 = 0; + data_t p2 = 0; + uint8_t mode = pgm_read_byte(dopaddr + op); + char *ptr; - int opIndex = pgm_read_byte(dopname + op) * 3; - log0("%04X : ", addr); - for (temp = 0; temp < 3; temp++) { - log0("%c", pgm_read_byte(opString + opIndex + temp)); + // 012345678901234567890123456789 + // AAAA : 11 22 33 : III MMMMMMMM + + // Template + strfill(buffer, ' ', sizeof(buffer)); + buffer[5] = ':'; + buffer[16] = ':'; + + // Address + strhex4(buffer, addr++); + + // Hex + strhex2(buffer + 7, op); + + if (mode > MARK2) { + p1 = readMemByteInc(); + strhex2(buffer + 10, p1); + addr++; } - log0(" "); + + if (mode > MARK3) { + p2 = readMemByteInc(); + strhex2(buffer + 13, p2); + addr++; + } + + uint16_t opIndex = pgm_read_byte(dopname + op) * 3; + + ptr = buffer + 18; + for (temp = 0; temp < 3; temp++) { + *ptr++ = pgm_read_byte(opString + opIndex + temp); + } + ptr++; switch (mode) { case IMP: - log0(" "); break; case IMPA: - log0("A "); + *ptr++ = 'A'; break; case BRA: - temp = addr + 2 + (signed char)p1; - log0("%04X ", temp); - addr++; + ptr = strhex4(ptr, addr + (int8_t)p1); break; case IMM: - log0("#%02X ", p1); - addr++; - break; + *ptr++ = '#'; + // Fall through to case ZP: - log0("%02X ", p1); - addr++; + ptr = strhex2(ptr, p1); break; case ZPX: - log0("%02X,X ", p1); - addr++; + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'X'; break; case ZPY: - log0("%02X,Y ", p1); - addr++; + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'Y'; break; case INDX: - log0("(%02X,X) ", p1); - addr++; + *ptr++ = '('; + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'X'; + *ptr++ = ')'; break; case INDY: - log0("(%02X),Y ", p1); - addr++; + *ptr++ = '('; + ptr = strhex2(ptr, p1); + *ptr++ = ')'; + *ptr++ = ','; + *ptr++ = 'Y'; break; case ABS: - log0("%02X%02X ", p2, p1); - addr += 2; + ptr = strhex2(ptr, p2); + ptr = strhex2(ptr, p1); break; case ABSX: - log0("%02X%02X,X ", p2, p1); - addr += 2; + ptr = strhex2(ptr, p2); + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'X'; break; case ABSY: - log0("%02X%02X,Y ", p2, p1); - addr += 2; + ptr = strhex2(ptr, p2); + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'Y'; break; case IND16: - log0("(%02X%02X) ", p2, p1); - addr += 2; + *ptr++ = '('; + ptr = strhex2(ptr, p2); + ptr = strhex2(ptr, p1); + *ptr++ = ')'; break; } - log0("\n"); - addr++; + *ptr++ = '\n'; + *ptr++ = '\0'; + logs(buffer); return addr; } diff --git a/firmware/dis65c02.c b/firmware/dis65c02.c index 155c906..531ef39 100644 --- a/firmware/dis65c02.c +++ b/firmware/dis65c02.c @@ -187,85 +187,129 @@ static const unsigned char dopaddr[256] PROGMEM = /*F0*/ BRA, INDY, IND, IMP, ZP, ZPX, ZPX, IMP, IMP, ABSY, IMP, IMP, ABS, ABSX, ABSX, IMP }; -unsigned int disassemble(unsigned int addr) +addr_t disassemble(addr_t addr) { - unsigned int temp; - unsigned int op = readMemByteInc(); - int mode = pgm_read_byte(dopaddr + op); - unsigned int p1 = (mode > MARK2) ? readMemByteInc() : 0; - unsigned int p2 = (mode > MARK3) ? readMemByteInc() : 0; + char buffer[32]; + uint8_t temp; + data_t op = readMemByteInc(); + data_t p1 = 0; + data_t p2 = 0; + uint8_t mode = pgm_read_byte(dopaddr + op); + char *ptr; - int opIndex = pgm_read_byte(dopname + op) * 3; - log0("%04X : ", addr); - for (temp = 0; temp < 3; temp++) { - log0("%c", pgm_read_byte(opString + opIndex + temp)); + // 012345678901234567890123456789 + // AAAA : 11 22 33 : III MMMMMMMM + + // Template + strfill(buffer, ' ', sizeof(buffer)); + buffer[5] = ':'; + buffer[16] = ':'; + + // Address + strhex4(buffer, addr++); + + // Hex + strhex2(buffer + 7, op); + + if (mode > MARK2) { + p1 = readMemByteInc(); + strhex2(buffer + 10, p1); + addr++; } - log0(" "); + + if (mode > MARK3) { + p2 = readMemByteInc(); + strhex2(buffer + 13, p2); + addr++; + } + + uint16_t opIndex = pgm_read_byte(dopname + op) * 3; + + ptr = buffer + 18; + for (temp = 0; temp < 3; temp++) { + *ptr++ = pgm_read_byte(opString + opIndex + temp); + } + ptr++; switch (mode) { case IMP: - log0(" "); break; case IMPA: - log0("A "); + *ptr++ = 'A'; break; case BRA: - temp = addr + 2 + (signed char)p1; - log0("%04X ", temp); - addr++; + ptr = strhex4(ptr, addr + (int8_t)p1); break; case IMM: - log0("#%02X ", p1); - addr++; - break; + *ptr++ = '#'; + // Fall through to case ZP: - log0("%02X ", p1); - addr++; + ptr = strhex2(ptr, p1); break; case ZPX: - log0("%02X,X ", p1); - addr++; + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'X'; break; case ZPY: - log0("%02X,Y ", p1); - addr++; + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'Y'; break; case IND: - log0("(%02X) ", p1); - addr++; + *ptr++ = '('; + ptr = strhex2(ptr, p1); + *ptr++ = ')'; break; case INDX: - log0("(%02X,X) ", p1); - addr++; + *ptr++ = '('; + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'X'; + *ptr++ = ')'; break; case INDY: - log0("(%02X),Y ", p1); - addr++; + *ptr++ = '('; + ptr = strhex2(ptr, p1); + *ptr++ = ')'; + *ptr++ = ','; + *ptr++ = 'Y'; break; case ABS: - log0("%02X%02X ", p2, p1); - addr += 2; + ptr = strhex2(ptr, p2); + ptr = strhex2(ptr, p1); break; case ABSX: - log0("%02X%02X,X ", p2, p1); - addr += 2; + ptr = strhex2(ptr, p2); + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'X'; break; case ABSY: - log0("%02X%02X,Y ", p2, p1); - addr += 2; + ptr = strhex2(ptr, p2); + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'Y'; break; case IND16: - log0("(%02X%02X) ", p2, p1); - addr += 2; + *ptr++ = '('; + ptr = strhex2(ptr, p2); + ptr = strhex2(ptr, p1); + *ptr++ = ')'; break; case IND1X: - log0("(%02X%02X,X)", p2, p1); - addr += 2; + *ptr++ = '('; + ptr = strhex2(ptr, p2); + ptr = strhex2(ptr, p1); + *ptr++ = ','; + *ptr++ = 'X'; + *ptr++ = ')'; break; } - log0("\n"); - addr++; + *ptr++ = '\n'; + *ptr++ = '\0'; + logs(buffer); return addr; } diff --git a/firmware/status.c b/firmware/status.c index a5db60f..909c87f 100644 --- a/firmware/status.c +++ b/firmware/status.c @@ -42,14 +42,18 @@ void logpgmstr(const char *s) { } while (c); } -void loghex1(uint8_t i) { +char hex1(uint8_t i) { i &= 0x0f; if (i < 10) { i += '0'; } else { i += ('A' - 10); } - logc(i); + return i; +} + +void loghex1(uint8_t i) { + logc(hex1(i)); } void loghex2(uint8_t i) { @@ -62,6 +66,30 @@ void loghex4(uint16_t i) { loghex2(i); } +char *strfill(char *buffer, char c, uint8_t i) { + while (i-- > 0) { + *buffer++ = c; + } + return buffer; +} + +char *strhex1(char *buffer, uint8_t i) { + *buffer++ = hex1(i); + return buffer; +} + +char *strhex2(char *buffer, uint8_t i) { + buffer = strhex1(buffer, i >> 4); + buffer = strhex1(buffer, i); + return buffer; +} + +char *strhex4(char *buffer, uint16_t i) { + buffer = strhex2(buffer, i >> 8); + buffer = strhex2(buffer, i); + return buffer; +} + //void loglong(long i) { // char buffer[16]; // // ltoa adds 176 bytes diff --git a/firmware/status.h b/firmware/status.h index caef563..03e82b0 100644 --- a/firmware/status.h +++ b/firmware/status.h @@ -34,6 +34,11 @@ void logpgmstr(const char *s); void loghex1(uint8_t i); void loghex2(uint8_t i); void loghex4(uint16_t i); +char *strfill(char *buffer, char c, uint8_t i); +char *strhex1(char *buffer, uint8_t i); +char *strhex2(char *buffer, uint8_t i); +char *strhex4(char *buffer, uint16_t i); + //void loglong(long i); //void logint(int i);