diff --git a/AtomCpuMon.bit b/AtomCpuMon.bit index 710fce9..fe1a349 100644 Binary files a/AtomCpuMon.bit and b/AtomCpuMon.bit differ diff --git a/firmware/AtomBusMon.c b/firmware/AtomBusMon.c index 0e1bf2e..d4dd164 100644 --- a/firmware/AtomBusMon.c +++ b/firmware/AtomBusMon.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -12,7 +13,8 @@ enum IMP, IMPA, MARK2, BRA, IMM, ZP, ZPX, ZPY, INDX, INDY, IND, MARK3, ABS, ABSX, ABSY, IND16, IND1X }; -char dopname[256][6] = + +char dopname[256][4] = { /*00*/ "BRK", "ORA", "---", "---", "TSB", "ORA", "ASL", "---", "PHP", "ORA", "ASL", "---", "TSB", "ORA", "ASL", "---", /*10*/ "BPL", "ORA", "ORA", "---", "TRB", "ORA", "ASL", "---", "CLC", "ORA", "INC", "---", "TRB", "ORA", "ASL", "---", @@ -53,6 +55,8 @@ unsigned char dopaddr[256] = }; #endif +#define CRC_POLY 0x002d + #define CTRL_PORT PORTB #define CTRL_DDR DDRB #define CTRL_DIN PINB @@ -139,6 +143,15 @@ unsigned char dopaddr[256] = #define W_MEM_MASK ((1<>= 1; + if (crc & 0x10000) + crc = (crc ^ CRC_POLY) & 0xFFFF; + } + } + log0("crc: %04X\n", crc); +} + +unsigned int getData(unsigned int addr, int data) { + if (data == -1) { + // checkerboard + return (addr & 1) ? 0x55 : 0xAA; + } else if (data == -2) { + // inverse checkerboard + return (addr & 1) ? 0xAA : 0x55; + } else if (data == -3) { + // address pattern + return (0xC3 ^ addr ^ (addr >> 8)) & 0xff; + } else if (data == -4) { + // address pattern + return (0x3C ^ addr ^ (addr >> 8)) & 0xff; + } else if (data < 0) { + // random data + return rand() & 0xff; + } else { + // fixed data + return data & 0xff; + } +} + +void test(unsigned int start, unsigned int end, int data) { + long i; + int name; + int actual; + int expected; + unsigned int fail = 0; + // Write + srand(data); + for (i = start; i <= end; i++) { + writeMem(i, getData(i, data)); + } + // Read + srand(data); + loadAddr(start); + for (i = start; i <= end; i++) { + actual = readByte(); + expected = getData(i, data); + if (expected != actual) { + log0("Fail at %04X (Wrote: %02X, Read back %02X)\n", i, expected, actual); + fail++; + } + } + name = -data; + if (name < 0) { + name = 0; + } + if (name > 5) { + name = 5; + } + log0("Memory test: %s", testNames[name]); + if (data >= 0) { + log0(" %02X", data); + } + if (fail) { + log0(": failed: %d errors\n", fail); + } else { + log0(": passed\n"); + } +} + +void doCmdTest(char *params) { + unsigned int start; + unsigned int end; + int data =-100; + int i; + sscanf(params, "%x %x %d", &start, &end, &data); + if (data == -100) { + test(start, end, 0x55); + test(start, end, 0xAA); + test(start, end, 0xFF); + for (i = 0; i >= -7; i--) { + test(start, end, i); + } + } else { + test(start, end, data); + } +} + #endif void doCmdTrace(char *params) { @@ -1017,6 +1126,7 @@ void initialize() { void (*cmdFuncs[NUM_CMDS])(char *params) = { doCmdHelp, + doCmdContinue, #ifdef EMBEDDED_6502 doCmdRegs, doCmdMem, @@ -1024,6 +1134,8 @@ void (*cmdFuncs[NUM_CMDS])(char *params) = { doCmdRead, doCmdWrite, doCmdFill, + doCmdCrc, + doCmdTest, #endif doCmdReset, doCmdStep, @@ -1041,8 +1153,7 @@ void (*cmdFuncs[NUM_CMDS])(char *params) = { doCmdWClearI, doCmdWClearR, doCmdWClearW, - doCmdTrigger, - doCmdContinue + doCmdTrigger }; void dispatchCmd(char *cmd) {