Firmware: save 648 bytes by reducing use of log0 (varargs)

Change-Id: I7d2fd749e090bdd2ece571bb4488fb1d08040512
This commit is contained in:
David Banks 2019-11-08 18:04:35 +00:00
parent b8e482389f
commit 87d77c1108

View File

@ -407,6 +407,23 @@ addr_t nextAddr = 0;
// Setting this to 0 will disable logging // Setting this to 0 will disable logging
long trace; long trace;
/********************************************************
* Simple string logger, as log0 is expensive
********************************************************/
void logc(char c) {
Serial_TxByte0(c);
if (c == '\n') {
Serial_TxByte0('\r');
}
}
void logstr(char *s) {
while (*s) {
logc(*s++);
}
}
/******************************************************** /********************************************************
* User Command Processor * User Command Processor
********************************************************/ ********************************************************/
@ -427,7 +444,7 @@ void readCmd(char *cmd) {
} }
Serial_TxByte0(13); Serial_TxByte0(13);
#endif #endif
log0(">> "); logstr(">> ");
#if defined(COMMAND_HISTORY) #if defined(COMMAND_HISTORY)
i = 0; i = 0;
if (reuse) { if (reuse) {
@ -555,7 +572,7 @@ void log_char(uint8_t c) {
if (c < 32 || c > 126) { if (c < 32 || c > 126) {
c = '.'; c = '.';
} }
log0("%c", c); logc(c);
} }
void log_addr_data(addr_t a, data_t d) { void log_addr_data(addr_t a, data_t d) {
@ -634,12 +651,12 @@ void genericDump(char *params, data_t (*readFunc)()) {
for (j = 0; j < 16; j++) { for (j = 0; j < 16; j++) {
log0("%02X ", row[j]); log0("%02X ", row[j]);
} }
log0(" "); logc(' ');
for (j = 0; j < 16; j++) { for (j = 0; j < 16; j++) {
data_t c = row[j]; data_t c = row[j];
log_char(c); log_char(c);
} }
log0("\n"); logc('\n');
} }
memAddr += 0x100; memAddr += 0x100;
} }
@ -648,9 +665,9 @@ void genericWrite(char *params, void (*writeFunc)()) {
data_t data; data_t data;
long count = 1; long count = 1;
sscanf(params, "%x %hhx %ld", &memAddr, &data, &count); sscanf(params, "%x %hhx %ld", &memAddr, &data, &count);
log0("Wr: "); logstr("Wr: ");
log_addr_data(memAddr, data); log_addr_data(memAddr, data);
log0("\n"); logc('\n');
loadData(data); loadData(data);
loadAddr(memAddr); loadAddr(memAddr);
while (count-- > 0) { while (count-- > 0) {
@ -667,9 +684,9 @@ void genericRead(char *params, data_t (*readFunc)()) {
sscanf(params, "%x %ld", &memAddr, &count); sscanf(params, "%x %ld", &memAddr, &count);
loadAddr(memAddr); loadAddr(memAddr);
data = (*readFunc)(); data = (*readFunc)();
log0("Rd: "); logstr("Rd: ");
log_addr_data(memAddr, data); log_addr_data(memAddr, data);
log0("\n"); logc('\n');
while (count-- > 1) { while (count-- > 1) {
data2 = (*readFunc)(); data2 = (*readFunc)();
if (data2 != data) { if (data2 != data) {
@ -698,9 +715,9 @@ void logMode(modes_t mode) {
for (i = 0; i < NUM_MODES; i++) { for (i = 0; i < NUM_MODES; i++) {
if (mode & 1) { if (mode & 1) {
if (!first) { if (!first) {
log0(", "); logstr(", ");
} }
log0("%s", modeStrings[i]); logstr(modeStrings[i]);
first = 0; first = 0;
} }
mode >>= 1; mode >>= 1;
@ -709,9 +726,10 @@ void logMode(modes_t mode) {
void logTrigger(trigger_t trigger) { void logTrigger(trigger_t trigger) {
if (trigger < NUM_TRIGGERS) { if (trigger < NUM_TRIGGERS) {
log0("trigger: %s", triggerStrings[trigger]); logstr("trigger: ");
logstr(triggerStrings[trigger]);
} else { } else {
log0("trigger: ILLEGAL"); logstr("trigger: ILLEGAL");
} }
} }
@ -733,13 +751,13 @@ uint8_t logDetails() {
log0(" hit at %04X", i_addr); log0(" hit at %04X", i_addr);
if (mode & BW_RDWR_MASK) { if (mode & BW_RDWR_MASK) {
if (mode & BW_WR_MASK) { if (mode & BW_WR_MASK) {
log0(" writing"); logstr(" writing");
} else { } else {
log0(" reading"); logstr(" reading");
} }
log_addr_data(b_addr, b_data); log_addr_data(b_addr, b_data);
} }
log0("\n"); logc('\n');
if (mode & B_RDWR_MASK) { if (mode & B_RDWR_MASK) {
// It's only safe to do this for brkpts, as it makes memory accesses // It's only safe to do this for brkpts, as it makes memory accesses
logCycleCount(OFFSET_BW_CNTL, OFFSET_BW_CNTH); logCycleCount(OFFSET_BW_CNTL, OFFSET_BW_CNTH);
@ -758,9 +776,12 @@ void logAddr() {
} }
void version() { void version() {
log0("%s In-Circuit Emulator version %s\n", NAME, VERSION); log0("%s In-Circuit Emulator version %s\nCompiled at %s on %s\n%d watches/breakpoints implemented\n",
log0("Compiled at %s on %s\n",__TIME__,__DATE__); NAME,
log0("%d watches/breakpoints implemented\n",MAXBKPTS); VERSION,
__TIME__,
__DATE__,
MAXBKPTS);
} }
/******************************************************** /********************************************************
@ -806,7 +827,7 @@ void setTrace(long i) {
if (trace) { if (trace) {
log0("Tracing every %ld instructions while single stepping\n", trace); log0("Tracing every %ld instructions while single stepping\n", trace);
} else { } else {
log0("Tracing disabled\n"); logstr("Tracing disabled\n");
} }
} }
@ -976,14 +997,15 @@ void test(addr_t start, addr_t end, int data) {
if (name > 5) { if (name > 5) {
name = 5; name = 5;
} }
log0("Memory test: %s", testNames[name]); logstr("Memory test: ");
logstr(testNames[name]);
if (data >= 0) { if (data >= 0) {
log0(" %02X", data); log0(" %02X", data);
} }
if (fail) { if (fail) {
log0(": failed: %d errors\n", fail); log0(": failed: %d errors\n", fail);
} else { } else {
log0(": passed\n"); logstr(": passed\n");
} }
} }
@ -1005,7 +1027,7 @@ uint8_t pollForEvents() {
// Applies a fixed 1ms long reset pulse to the CPU // Applies a fixed 1ms long reset pulse to the CPU
// This should be good for clock rates down to ~10KHz // This should be good for clock rates down to ~10KHz
void resetCpu() { void resetCpu() {
log0("Resetting CPU\n"); logstr("Resetting CPU\n");
hwCmd(CMD_RESET, 1); hwCmd(CMD_RESET, 1);
Delay_us(1000); Delay_us(1000);
hwCmd(CMD_RESET, 0); hwCmd(CMD_RESET, 0);
@ -1018,9 +1040,11 @@ void resetCpu() {
void doCmdHelp(char *params) { void doCmdHelp(char *params) {
uint8_t i; uint8_t i;
version(); version();
log0("Commands:\n"); logstr("Commands:\n");
for (i = 0; i < NUM_CMDS; i++) { for (i = 0; i < NUM_CMDS; i++) {
log0(" %s\n", cmdStrings[i]); logstr(" ");
logstr(cmdStrings[i]);
logc('\n');
} }
} }
@ -1030,7 +1054,7 @@ void doCmdStep(char *params) {
long j; long j;
sscanf(params, "%ld", &instructions); sscanf(params, "%ld", &instructions);
if (instructions <= 0) { if (instructions <= 0) {
log0("Number of instuctions must be positive\n"); logstr("Number of instuctions must be positive\n");
return; return;
} }
@ -1185,7 +1209,7 @@ void doCmdSRec(char *params) {
addr_t addrhi = 0x0000; addr_t addrhi = 0x0000;
log0("Send file now...\n"); logstr("Send file now...\n");
// Special case reading the first record, with no timeout // Special case reading the first record, with no timeout
c = Serial_RxByte0(); c = Serial_RxByte0();
@ -1252,11 +1276,11 @@ void doCmdSRec(char *params) {
} }
void logSpecial(char *function, uint8_t value) { void logSpecial(char *function, uint8_t value) {
log0("%s", function); logstr(function);
if (value) { if (value) {
log0(" inhibited\n"); logstr(" inhibited\n");
} else { } else {
log0(" enabled\n"); logstr(" enabled\n");
} }
} }
@ -1283,12 +1307,12 @@ void doCmdList(char *params) {
for (i = 0; i < numbkpts; i++) { for (i = 0; i < numbkpts; i++) {
log0("%d: %04X mask %04X: ", i, breakpoints[i], masks[i]); log0("%d: %04X mask %04X: ", i, breakpoints[i], masks[i]);
logMode(modes[i]); logMode(modes[i]);
log0(" ("); logc(' ');
logTrigger(triggers[i]); logTrigger(triggers[i]);
log0(")\n"); logstr(")\n");
} }
} else { } else {
log0("No breakpoints set\n"); logstr("No breakpoints set\n");
} }
} }
@ -1341,7 +1365,7 @@ void doCmdClear(char *params) {
if (n < 0) { if (n < 0) {
return; return;
} }
log0("Removing "); logstr("Removing ");
logMode(modes[n]); logMode(modes[n]);
log0(" at %04X\n", breakpoints[n]); log0(" at %04X\n", breakpoints[n]);
clearBreakpoint(n); clearBreakpoint(n);
@ -1351,7 +1375,7 @@ void doCmdTrigger(char *params) {
trigger_t trigger = TRIGGER_UNDEFINED; trigger_t trigger = TRIGGER_UNDEFINED;
sscanf(params, "%*x %hhx", &trigger); sscanf(params, "%*x %hhx", &trigger);
if (trigger >= NUM_TRIGGERS) { if (trigger >= NUM_TRIGGERS) {
log0("Trigger Codes:\n"); logstr("Trigger Codes:\n");
for (trigger = 0; trigger < NUM_TRIGGERS; trigger++) { for (trigger = 0; trigger < NUM_TRIGGERS; trigger++) {
log0(" %X = %s\n", trigger, triggerStrings[trigger]); log0(" %X = %s\n", trigger, triggerStrings[trigger]);
} }
@ -1396,9 +1420,9 @@ void doCmdContinue(char *params) {
} }
// Wait for breakpoint to become active // Wait for breakpoint to become active
log0("CPU free running...\n"); logstr("CPU free running...\n");
while (pollForEvents()); while (pollForEvents());
log0("Interrupted\n"); logstr("Interrupted\n");
// Enable single stepping // Enable single stepping
setSingle(1); setSingle(1);