From 885869e7fa8752f9fe7f8c685be50a5eca8adf8d Mon Sep 17 00:00:00 2001 From: Tom Nisbet Date: Sat, 15 Aug 2020 13:56:43 -0400 Subject: [PATCH] Fix #12 - add aemiller51's Poke command --- TommyPROM/TommyPROM.ino | 88 ++++++++++++++++++++++-------- docs/extending.md | 4 +- docs/images/tommyprom-console.png | Bin 0 -> 24634 bytes docs/index.md | 2 +- 4 files changed, 68 insertions(+), 26 deletions(-) create mode 100755 docs/images/tommyprom-console.png mode change 100644 => 100755 docs/index.md diff --git a/TommyPROM/TommyPROM.ino b/TommyPROM/TommyPROM.ino index 243e25f..4f52dbc 100644 --- a/TommyPROM/TommyPROM.ino +++ b/TommyPROM/TommyPROM.ino @@ -19,7 +19,7 @@ #include "XModem.h" -static const char * MY_VERSION = "2.0"; +static const char * MY_VERSION = "2.1"; // Global status @@ -79,6 +79,7 @@ enum { CMD_ERASED, CMD_FILL, CMD_LOCK, + CMD_POKE, CMD_READ, CMD_UNLOCK, CMD_WRITE, @@ -136,6 +137,7 @@ byte parseCommand(char c) case 'e': cmd = CMD_ERASED; break; case 'f': cmd = CMD_FILL; break; case 'l': cmd = CMD_LOCK; break; + case 'p': cmd = CMD_POKE; break; case 'r': cmd = CMD_READ; break; case 'u': cmd = CMD_UNLOCK; break; case 'w': cmd = CMD_WRITE; break; @@ -184,7 +186,7 @@ byte hexDigit(char c) * character. Leading zeroes are not required. * * No error checking is performed - if no hex is found then -* zero is returned. Similarly, a hex string of more than +* defaultValue is returned. Similarly, a hex string of more than * 8 digits will return the value of the last 8 digits. * @param pointer to string with the hex value of the word (modified) * @return unsigned int represented by the digits @@ -428,6 +430,60 @@ void erasedBlockCheck(uint32_t start, uint32_t end) } +/** + * Write a series of bytes from the command line to the PROM. + * + * @param cursor - pointer to command line text + */ +void pokeBytes(char * pCursor) +{ + uint32_t val; + uint32_t start; + unsigned byteCtr = 0; + + enum { BLOCK_SIZE = 32 }; + byte data[BLOCK_SIZE]; + + //first value returned is the starting address + start = getHex32(pCursor, 0); + + while (((val = getHex32(pCursor, 0xffff)) != 0xffff) && (byteCtr < BLOCK_SIZE)) + { + data[byteCtr++] = byte(val); + } + + if (byteCtr > 0) + { + if (!prom.writeData(data, byteCtr, start)) + { + cmdStatus.error("Write failed"); + return; + } + } + else + { + cmdStatus.error("Missing address or data"); + return; + } + delay(100); + + for (unsigned ix = 0; ix < byteCtr ; ix++) + { + byte val = prom.readData(start + ix); + if (val != data[ix]) + { + cmdStatus.error("Verify failed"); + cmdStatus.setValueHex(0, "addr", start + ix); + cmdStatus.setValueHex(1, "read", val); + cmdStatus.setValueHex(2, "expected", data[ix]); + return; + } + } + cmdStatus.info("Poke successful"); +} + + + #ifdef ENABLE_DEBUG_COMMANDS /** * Runs through a range of addresses, reading a single address @@ -535,7 +591,7 @@ void zapTest(uint32_t start) } delay(100); - for (int ix = 0; ix < sizeof(testData); ix++) + for (unsigned ix = 0; ix < sizeof(testData); ix++) { byte val = prom.readData(start + ix); if (val != testData[ix]) @@ -573,25 +629,7 @@ void setup() * executing read or write requestes. **/ -/* 8085 Test programs -byte ledTest[] = -{ - 0xc3, 0x03, 0x80, 0x3e, 0xc0, 0x30, 0x3e, 0xff, - 0x47, 0x3d, 0x05, 0xc2, 0x0a, 0x80, 0xfe, 0x00, - 0xc2, 0x09, 0x80, 0x3e, 0x40, 0x30, 0x3e, 0xff, - 0x47, 0x3d, 0x05, 0xc2, 0x1a, 0x80, 0xfe, 0x00, - 0xc2, 0x19, 0x80, 0xc3, 0x03, 0x80 -}; -byte charTest[] = -{ - 0xc3, 0x03, 0x80, 0x0e, 0x55, 0xf3, 0x06, 0x0b, 0xaf, 0x3e, 0x80, 0x1f, - 0x3f, 0x30, 0x21, 0x19, 0x00, 0x2d, 0xc2, 0x11, 0x80, 0x25, 0xc2, 0x11, - 0x80, 0x37, 0x79, 0x1f, 0x4f, 0x05, 0xc2, 0x09, 0x80, 0x3e, 0xc0, 0x30, - 0x3e, 0x40, 0x30, 0x3e, 0xc0, 0x30, 0x3e, 0x40, 0x30, 0x21, 0xff, 0xff, - 0x2d, 0xc2, 0x30, 0x80, 0x25, 0xc2, 0x30, 0x80, 0xc3, 0x03, 0x80 -}; -*/ - +char line[120]; uint32_t start = 0; uint32_t end = 0xff; byte val = 0xff; @@ -599,7 +637,6 @@ byte val = 0xff; void loop() { uint32_t w; - char line[20]; uint32_t numBytes; Serial.print("\n>"); @@ -647,6 +684,10 @@ void loop() prom.enableSoftwareWriteProtect(); break; + case CMD_POKE: + pokeBytes(line+1); + break; + case CMD_READ: Serial.println(F("Set the terminal to receive XMODEM CRC")); if (xmodem.SendFile(start, uint32_t(end) - start + 1)) @@ -705,6 +746,7 @@ void loop() Serial.println(F(" Esssss eeeee - Check to see if device range is Erased (all FF)")); Serial.println(F(" Fsssss eeeee dd - Fill block on device with fixed value")); Serial.println(F(" L - Lock (enable) device Software Data Protection")); + Serial.println(F(" Psssss dd dd... - Poke (write) values to device (up to 32 values)")); Serial.println(F(" Rsssss eeeee - Read from device and save to XMODEM CRC file")); Serial.println(F(" U - Unlock (disable) device Software Data Protection")); Serial.println(F(" Wsssss - Write to device from XMODEM CRC file")); diff --git a/docs/extending.md b/docs/extending.md index 295dc4f..ee03d35 100644 --- a/docs/extending.md +++ b/docs/extending.md @@ -18,8 +18,8 @@ by the Arduino. Most other chips will not use this addressing method. The 8755A also includes a circuit to switch the programming voltage under software control. This may be useful for other chips that use non-5V programming voltages, although many of these chips, like the 27 series EPROMS, have a programming voltage that remains on for the -entire write and verify cycle. For those chips, it may be easier to simply switch the -programming voltage manually for these chips. +entire write and verify cycle. It may be easier to simply switch the programming voltage +manually for these chips. The basic hardware design, used for the 28C EEPROMs, is much more adaptable to additional chip families. This design uses two shift registers to create 16 dedicated address lines diff --git a/docs/images/tommyprom-console.png b/docs/images/tommyprom-console.png new file mode 100755 index 0000000000000000000000000000000000000000..832568845d8a83a0cb19381f28e8dd5489d79a7c GIT binary patch literal 24634 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