diff --git a/HardwareVerify/HardwareVerify.ino b/HardwareVerify/HardwareVerify.ino index bc19cc6..59ce521 100644 --- a/HardwareVerify/HardwareVerify.ino +++ b/HardwareVerify/HardwareVerify.ino @@ -80,29 +80,38 @@ byte hexDigit(char c) /************************************************************ -* convert a hex byte (00 - ff) to byte -* @param c-string with the hex value of the byte -* @return byte represented by the digits -************************************************************/ -byte hexByte(char * a) -{ - return (hexDigit(a[0]) << 4) | hexDigit(a[1]); -} - - -/************************************************************ -* convert a hex word (0000 - ffff) to unsigned int -* @param c-string with the hex value of the word +* Convert a hex string to a uint32_t value. +* Skips leading spaces and terminates on the first non-hex +* character. Leading zeroes are not required. +* +* No error checking is performed - if no hex is found then +* 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 ************************************************************/ -unsigned int hexWord(char * data) +uint32_t getHex32(char *& pData, uint32_t defaultValue=0) { - return (hexDigit(data[0]) << 12) | - (hexDigit(data[1]) << 8) | - (hexDigit(data[2]) << 4) | - (hexDigit(data[3])); -} + uint32_t u32 = 0; + while (isspace(*pData)) + { + ++pData; + } + + if (isxdigit(*pData)) + { + while (isxdigit(*pData)) { + u32 = (u32 << 4) | hexDigit(*pData++); + } + } + else + { + u32 = defaultValue; + } + + return u32; +} void printByte(byte b) { @@ -153,9 +162,10 @@ void loop() static void commandLoop() { byte b; - word w; + uint32_t arg; + const uint32_t noValue = uint32_t(-1); char line[20]; - uint32_t numBytes; + char * cursor = line + 1; unsigned long timeStart; unsigned long timeEnd; bool cmdError = false; @@ -171,22 +181,20 @@ static void commandLoop() switch (c) { case 'a': - if (hexDigit(line[1]) <= 15) + if ((arg = getHex32(cursor, noValue)) != noValue) { - w = hexWord(line + 1); - prom.setAddress(w); + prom.setAddress(word(arg)); } else cmdError = true; break; case 'd': - if (hexDigit(line[1]) <= 15) + if ((arg = getHex32(cursor, noValue)) != noValue) { prom.disableOutput(); prom.setDataBusMode(OUTPUT); - b = hexByte(line + 1); - prom.writeDataBus(b); + prom.writeDataBus(byte(arg)); } else cmdError = true; @@ -202,18 +210,18 @@ static void commandLoop() else { bool enable = line[1] == 'e'; - if (c == 'c') + if (c == 'c') { if (enable) prom.enableChip(); else prom.disableChip(); - else if (c == 'w') + } else if (c == 'w') { if (enable) prom.enableWrite(); else prom.disableWrite(); - else { // c == 'o' - if (enable) - { + } else { // c == 'o' + if (enable) { // Don't allow the prom and the data bus to output at the same time prom.setDataBusMode(INPUT); prom.enableOutput(); + } else { + prom.disableOutput(); } - else prom.disableOutput(); } } break; @@ -261,4 +269,3 @@ static void commandLoop() Serial.println(F(" U - Send Unlock sequence to disable device Software Data Protection")); } } - diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 74b5a02..9f2e427 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -99,25 +99,27 @@ lines from the Arduino. The result should be measured at the target PROM footpr at the Arduino. To fully test, use a multimeter to verify that the lines that should be active are active and that any other lines are not. +Note that the Dx and Ax commands can be a bit confusing. The command _D5_ means "set the value 05 HEX on the eight data lines". It does not specifically refer to the D5 data pin on the ROM or the D5 pin on the Arduino. In the example above, 05 HEX is the same as 00000101 BINARY. This would set the ROM D0 and D2 pins HIGH and the other six pins would be LOW. + ### Testing the data bus Issue a set of Data commands from the Hardware Verify sketch and measure EACH data line at -the PROM footprint. **If the expected result is "D0 HIGH", verify not only that D0 reads -HIGH, but that all of the other lines read LOW.** +the PROM footprint. **If the expected result is "D0 HIGH", verify not only +that D0 reads HIGH, but that all of the other lines read LOW.** Data test commands |Command|Result| |:--- |:--- | |D0 |All data lines LOW| -|D1 |D0 HIGH| -|D2 |D1 HIGH| -|D4 |D2 HIGH| -|D8 |D3 HIGH| -|D10 |D4 HIGH| -|D20 |D5 HIGH| -|D40 |D6 HIGH| -|D80 |D7 HIGH| +|D1 |D0 HIGH| +|D2 |D1 HIGH| +|D4 |D2 HIGH| +|D8 |D3 HIGH| +|D10 |D4 HIGH| +|D20 |D5 HIGH| +|D40 |D6 HIGH| +|D80 |D7 HIGH| |Dff |all data lines HIGH| ### Testing the address lines @@ -128,21 +130,21 @@ other address lines as well. |Command|Result| |:--- |:--- | |A0 |All address lines LOW| -|A1 |A0 HIGH| -|A2 |A1 HIGH| -|A4 |A2 HIGH| -|A8 |A3 HIGH| -|A10 |A4 HIGH| -|A20 |A5 HIGH| -|A40 |A6 HIGH| -|A80 |A7 HIGH| -|A100 |A8 HIGH| -|A200 |A9 HIGH| -|A400 |A10 HIGH| -|A800 |A11 HIGH| -|A1000 |A12 HIGH| -|A2000 |A13 HIGH| -|A4000 |A14 HIGH| +|A1 |A0 HIGH| +|A2 |A1 HIGH| +|A4 |A2 HIGH| +|A8 |A3 HIGH| +|A10 |A4 HIGH| +|A20 |A5 HIGH| +|A40 |A6 HIGH| +|A80 |A7 HIGH| +|A100 |A8 HIGH| +|A200 |A9 HIGH| +|A400 |A10 HIGH| +|A800 |A11 HIGH| +|A1000 |A12 HIGH| +|A2000 |A13 HIGH| +|A4000 |A14 HIGH| |A7fff |all address lines HIGH| ### Testing the control lines @@ -161,6 +163,6 @@ commands are complete. |Ce | Chip Enable (CE) LOW, others HIGH| |Cd | CE, OE, WE all HIGH| |Oe | Output Enable (OE) LOW, others HIGH| -|Cd | CE, OE, WE all HIGH| +|Od | CE, OE, WE all HIGH| |We | Write Enable (WE) LOW, others HIGH| |Wd | CE, OE, WE all HIGH|