Skip to content

Commit

Permalink
Merge pull request #70 from jscrane/master
Browse files Browse the repository at this point in the history
Use chip size for selected commands where it makes sense
  • Loading branch information
TomNisbet authored Apr 12, 2024
2 parents 4553fe1 + e59459f commit 90e29d2
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 21 deletions.
1 change: 1 addition & 0 deletions TommyPROM/PromDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class PromDevice
byte readData(uint32_t address) { return readByte(address); }
void resetDebugStats();
void printDebugStats();
uint32_t end() const { return mSize-1; }

virtual void begin() = 0;
virtual const char * getName() = 0;
Expand Down
64 changes: 43 additions & 21 deletions TommyPROM/TommyPROM.ino
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include "XModem.h"


static const char * MY_VERSION = "3.4";
static const char * MY_VERSION = "3.5";


// Global status
Expand Down Expand Up @@ -95,6 +95,8 @@ XModem xmodem(prom, cmdStatus);
* CLI parse functions
*/
const char hex[] = "0123456789abcdef";
const uint32_t unspec = ~0;
inline uint32_t if_unspec(uint32_t val, uint32_t repl) { return val == unspec? repl: val; }

enum {
// CLI Commands
Expand Down Expand Up @@ -220,7 +222,7 @@ byte hexDigit(char c)
* @param pointer to string with the hex value of the word (modified)
* @return unsigned int represented by the digits
************************************************************/
uint32_t getHex32(char *& pData, uint32_t defaultValue=0)
uint32_t getHex32(char *& pData, uint32_t defaultValue=unspec)
{
uint32_t u32 = 0;

Expand Down Expand Up @@ -346,7 +348,7 @@ word checksumBlock(uint32_t start, uint32_t end)
/**
* Read data from the device and dump it in hex and ascii.
**/
void dumpBlock(uint32_t start, uint32_t end)
uint32_t dumpBlock(uint32_t start, uint32_t end)
{
char line[81];
// 01234567891 234567892 234567893 234567894 234567895 234567896 234567897 23456789
Expand Down Expand Up @@ -393,7 +395,7 @@ void dumpBlock(uint32_t start, uint32_t end)
Serial.println(line);
if (checkForBreak())
{
return;
return addr;
}
memset(line, ' ', sizeof(line));
count = 0;
Expand All @@ -404,6 +406,8 @@ void dumpBlock(uint32_t start, uint32_t end)
{
Serial.println();
}

return end+1;
}


Expand Down Expand Up @@ -476,7 +480,7 @@ void pokeBytes(char * pCursor)
//first value returned is the starting address
start = getHex32(pCursor, 0);

while (((val = getHex32(pCursor, 0xffff)) != 0xffff) && (byteCtr < BLOCK_SIZE))
while (((val = getHex32(pCursor)) != unspec) && (byteCtr < BLOCK_SIZE))
{
data[byteCtr++] = byte(val);
}
Expand Down Expand Up @@ -680,9 +684,6 @@ void setup()
**/

char line[120];
uint32_t start = 0;
uint32_t end = 0xff;
byte val = 0xff;

void loop()
{
Expand All @@ -695,9 +696,10 @@ void loop()
Serial.println();
byte cmd = parseCommand(line[0]);
char * pCursor = line+1;
start = getHex32(pCursor, 0);
end = getHex32(pCursor, 0xff);
val = (byte) getHex32(pCursor, 0);
uint32_t start = getHex32(pCursor);
uint32_t end = getHex32(pCursor);
uint32_t val = getHex32(pCursor);
static uint32_t dump_next = 0;

if ((cmd != CMD_LAST_STATUS) && (cmd != CMD_INVALID))
{
Expand All @@ -707,10 +709,12 @@ void loop()
switch (cmd)
{
case CMD_BLANK:
erasedBlockCheck(start, end);
erasedBlockCheck(if_unspec(start, 0), if_unspec(end, prom.end()));
break;

case CMD_CHECKSUM:
start = if_unspec(start, 0);
end = if_unspec(end, prom.end());
w = checksumBlock(start, end);
Serial.print(F("Checksum "));
printWord(start);
Expand All @@ -722,16 +726,31 @@ void loop()
break;

case CMD_DUMP:
dumpBlock(start, end);
start = if_unspec(start, dump_next);
dump_next = dumpBlock(start, if_unspec(end, start + 0xff));
break;

case CMD_ERASE:
printRetStatus(prom.erase(start, end));
if (start == unspec || end == unspec)
{
Serial.println(F("Erase requires explicit start, end"));
}
else
{
printRetStatus(prom.erase(start, end));
}
break;

case CMD_FILL:
prom.resetDebugStats();
fillBlock(start, end, val);
if (start == unspec || end == unspec || val == unspec)
{
Serial.println(F("Fill requires explicit start, end and value"));
}
else
{
prom.resetDebugStats();
fillBlock(start, end, (byte)val);
}
break;

case CMD_LOCK:
Expand All @@ -745,10 +764,12 @@ void loop()
break;

case CMD_READ:
if (xmodem.SendFile(start, uint32_t(end) - start + 1))
start = if_unspec(start, 0);
end = if_unspec(end, prom.end());
if (xmodem.SendFile(start, end - start + 1))
{
cmdStatus.info("Send complete.");
cmdStatus.setValueDec(0, "NumBytes", uint32_t(end) - start + 1);
cmdStatus.setValueDec(0, "NumBytes", end - start + 1);
}
break;

Expand All @@ -759,6 +780,7 @@ void loop()

case CMD_WRITE:
prom.resetDebugStats();
start = if_unspec(start, 0);
numBytes = xmodem.ReceiveFile(start);
if (numBytes)
{
Expand All @@ -777,16 +799,16 @@ void loop()
break;

case CMD_SCAN:
scanBlock(start, end);
scanBlock(if_unspec(start, 0), if_unspec(end, prom.end()));
break;

case CMD_TEST:
testAddr(start);
testAddr(if_unspec(start, 0));
break;

case CMD_ZAP:
prom.resetDebugStats();
zapTest(start);
zapTest(if_unspec(start, 0));
break;
#endif /* ENABLE_DEBUG_COMMANDS */

Expand Down

0 comments on commit 90e29d2

Please sign in to comment.