mirror of
https://github.com/hoglet67/AtomBusMon.git
synced 2024-12-22 16:30:06 +00:00
Added crc and memory test commands, incremented version to 0.34
Change-Id: Ib259fcfce3f10b109d6b9606da3c28cb47230196
This commit is contained in:
parent
14e4adda94
commit
68f6dccf89
BIN
AtomCpuMon.bit
BIN
AtomCpuMon.bit
Binary file not shown.
@ -1,4 +1,5 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
@ -12,7 +13,8 @@ enum
|
|||||||
IMP, IMPA, MARK2, BRA, IMM, ZP, ZPX, ZPY, INDX, INDY, IND, MARK3, ABS, ABSX, ABSY, IND16, IND1X
|
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", "---",
|
/*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", "---",
|
/*10*/ "BPL", "ORA", "ORA", "---", "TRB", "ORA", "ASL", "---", "CLC", "ORA", "INC", "---", "TRB", "ORA", "ASL", "---",
|
||||||
@ -53,6 +55,8 @@ unsigned char dopaddr[256] =
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define CRC_POLY 0x002d
|
||||||
|
|
||||||
#define CTRL_PORT PORTB
|
#define CTRL_PORT PORTB
|
||||||
#define CTRL_DDR DDRB
|
#define CTRL_DDR DDRB
|
||||||
#define CTRL_DIN PINB
|
#define CTRL_DIN PINB
|
||||||
@ -139,6 +143,15 @@ unsigned char dopaddr[256] =
|
|||||||
#define W_MEM_MASK ((1<<BRKPT_WRITE) | (1<<WATCH_WRITE))
|
#define W_MEM_MASK ((1<<BRKPT_WRITE) | (1<<WATCH_WRITE))
|
||||||
#define BW_MEM_MASK ((1<<BRKPT_READ) | (1<<BRKPT_WRITE) | (1<<WATCH_READ) | (1<<WATCH_WRITE))
|
#define BW_MEM_MASK ((1<<BRKPT_READ) | (1<<BRKPT_WRITE) | (1<<WATCH_READ) | (1<<WATCH_WRITE))
|
||||||
|
|
||||||
|
char *testNames[6] = {
|
||||||
|
"Fixed",
|
||||||
|
"Checkerboard",
|
||||||
|
"Inverse checkerboard",
|
||||||
|
"Address pattern",
|
||||||
|
"Inverse address pattern",
|
||||||
|
"Random"
|
||||||
|
};
|
||||||
|
|
||||||
char *modeStrings[7] = {
|
char *modeStrings[7] = {
|
||||||
"Ex Breakpoint",
|
"Ex Breakpoint",
|
||||||
"Rn Breakpoint",
|
"Rn Breakpoint",
|
||||||
@ -172,10 +185,10 @@ char *triggerStrings[NUM_TRIGGERS] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define VERSION "0.32"
|
#define VERSION "0.34"
|
||||||
|
|
||||||
#ifdef EMBEDDED_6502
|
#ifdef EMBEDDED_6502
|
||||||
#define NUM_CMDS 25
|
#define NUM_CMDS 27
|
||||||
#else
|
#else
|
||||||
#define NUM_CMDS 19
|
#define NUM_CMDS 19
|
||||||
#endif
|
#endif
|
||||||
@ -184,7 +197,6 @@ char *triggerStrings[NUM_TRIGGERS] = {
|
|||||||
|
|
||||||
int numbkpts = 0;
|
int numbkpts = 0;
|
||||||
|
|
||||||
int single;
|
|
||||||
long trace;
|
long trace;
|
||||||
long instructions = 1;
|
long instructions = 1;
|
||||||
|
|
||||||
@ -239,6 +251,7 @@ int triggers[MAXBKPTS] = {
|
|||||||
|
|
||||||
char *cmdStrings[NUM_CMDS] = {
|
char *cmdStrings[NUM_CMDS] = {
|
||||||
"help",
|
"help",
|
||||||
|
"continue",
|
||||||
#ifdef EMBEDDED_6502
|
#ifdef EMBEDDED_6502
|
||||||
"regs",
|
"regs",
|
||||||
"mem",
|
"mem",
|
||||||
@ -246,6 +259,8 @@ char *cmdStrings[NUM_CMDS] = {
|
|||||||
"read",
|
"read",
|
||||||
"write",
|
"write",
|
||||||
"fill",
|
"fill",
|
||||||
|
"crc",
|
||||||
|
"test",
|
||||||
#endif
|
#endif
|
||||||
"reset",
|
"reset",
|
||||||
"step",
|
"step",
|
||||||
@ -263,8 +278,7 @@ char *cmdStrings[NUM_CMDS] = {
|
|||||||
"wcleari",
|
"wcleari",
|
||||||
"wclearr",
|
"wclearr",
|
||||||
"wclearw",
|
"wclearw",
|
||||||
"trigger",
|
"trigger"
|
||||||
"continue"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define Delay_us(__us) \
|
#define Delay_us(__us) \
|
||||||
@ -342,8 +356,7 @@ unsigned int hwRead16(unsigned int offset) {
|
|||||||
return (MUX_DIN << 8) | lsb;
|
return (MUX_DIN << 8) | lsb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setSingle(int i) {
|
void setSingle(int single) {
|
||||||
single = i;
|
|
||||||
hwCmd(CMD_SINGLE_ENABLE, single ? 1 : 0);
|
hwCmd(CMD_SINGLE_ENABLE, single ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,8 +393,6 @@ void lcdAddr(unsigned int addr) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int lookupBreakpoint(char *params) {
|
int lookupBreakpoint(char *params) {
|
||||||
int i;
|
int i;
|
||||||
int n = -1;
|
int n = -1;
|
||||||
@ -627,11 +638,6 @@ void doCmdStep(char *params) {
|
|||||||
long i;
|
long i;
|
||||||
long j;
|
long j;
|
||||||
|
|
||||||
if (!single) {
|
|
||||||
log0("Use the break command to stop the 6502\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sscanf(params, "%ld", &instructions);
|
sscanf(params, "%ld", &instructions);
|
||||||
if (instructions <= 0) {
|
if (instructions <= 0) {
|
||||||
log0("Number of instuctions must be positive\n");
|
log0("Number of instuctions must be positive\n");
|
||||||
@ -655,7 +661,9 @@ void doCmdStep(char *params) {
|
|||||||
void doCmdReset(char *params) {
|
void doCmdReset(char *params) {
|
||||||
log0("Resetting 6502\n");
|
log0("Resetting 6502\n");
|
||||||
hwCmd(CMD_RESET, 1);
|
hwCmd(CMD_RESET, 1);
|
||||||
Delay_us(100);
|
Delay_us(50);
|
||||||
|
hwCmd(CMD_STEP, 0);
|
||||||
|
Delay_us(50);
|
||||||
hwCmd(CMD_RESET, 0);
|
hwCmd(CMD_RESET, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -729,11 +737,10 @@ void doCmdRead(char *params) {
|
|||||||
unsigned int data;
|
unsigned int data;
|
||||||
data = readMem(addr);
|
data = readMem(addr);
|
||||||
log0("Rd: %04X = %X\n", addr, data);
|
log0("Rd: %04X = %X\n", addr, data);
|
||||||
writeMem(addr, data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void doCmdFill(char *params) {
|
void doCmdFill(char *params) {
|
||||||
unsigned int i;
|
long i;
|
||||||
unsigned int start;
|
unsigned int start;
|
||||||
unsigned int end;
|
unsigned int end;
|
||||||
unsigned int data;
|
unsigned int data;
|
||||||
@ -741,11 +748,113 @@ void doCmdFill(char *params) {
|
|||||||
log0("Wr: %04X to %04X = %X\n", start, end, data);
|
log0("Wr: %04X to %04X = %X\n", start, end, data);
|
||||||
loadData(data);
|
loadData(data);
|
||||||
loadAddr(start);
|
loadAddr(start);
|
||||||
for (i = start; i < end; i++) {
|
for (i = start; i <= end; i++) {
|
||||||
hwCmd(CMD_WR_MEM, 0);
|
hwCmd(CMD_WR_MEM, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void doCmdCrc(char *params) {
|
||||||
|
long i;
|
||||||
|
int j;
|
||||||
|
unsigned int start;
|
||||||
|
unsigned int end;
|
||||||
|
unsigned int data;
|
||||||
|
unsigned long crc = 0;
|
||||||
|
sscanf(params, "%x %x", &start, &end);
|
||||||
|
loadAddr(start);
|
||||||
|
for (i = start; i <= end; i++) {
|
||||||
|
data = readByte();
|
||||||
|
for (j = 0; j < 8; j++) {
|
||||||
|
crc = crc << 1;
|
||||||
|
crc = crc | (data & 1);
|
||||||
|
data >>= 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
|
#endif
|
||||||
|
|
||||||
void doCmdTrace(char *params) {
|
void doCmdTrace(char *params) {
|
||||||
@ -1017,6 +1126,7 @@ void initialize() {
|
|||||||
|
|
||||||
void (*cmdFuncs[NUM_CMDS])(char *params) = {
|
void (*cmdFuncs[NUM_CMDS])(char *params) = {
|
||||||
doCmdHelp,
|
doCmdHelp,
|
||||||
|
doCmdContinue,
|
||||||
#ifdef EMBEDDED_6502
|
#ifdef EMBEDDED_6502
|
||||||
doCmdRegs,
|
doCmdRegs,
|
||||||
doCmdMem,
|
doCmdMem,
|
||||||
@ -1024,6 +1134,8 @@ void (*cmdFuncs[NUM_CMDS])(char *params) = {
|
|||||||
doCmdRead,
|
doCmdRead,
|
||||||
doCmdWrite,
|
doCmdWrite,
|
||||||
doCmdFill,
|
doCmdFill,
|
||||||
|
doCmdCrc,
|
||||||
|
doCmdTest,
|
||||||
#endif
|
#endif
|
||||||
doCmdReset,
|
doCmdReset,
|
||||||
doCmdStep,
|
doCmdStep,
|
||||||
@ -1041,8 +1153,7 @@ void (*cmdFuncs[NUM_CMDS])(char *params) = {
|
|||||||
doCmdWClearI,
|
doCmdWClearI,
|
||||||
doCmdWClearR,
|
doCmdWClearR,
|
||||||
doCmdWClearW,
|
doCmdWClearW,
|
||||||
doCmdTrigger,
|
doCmdTrigger
|
||||||
doCmdContinue
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void dispatchCmd(char *cmd) {
|
void dispatchCmd(char *cmd) {
|
||||||
|
Loading…
Reference in New Issue
Block a user