Issue #13 - fix HWverify CLI parsing and update documentation.

This commit is contained in:
Tom Nisbet 2020-08-24 14:35:26 -04:00
parent a45f6b4ce0
commit f17bc110aa
2 changed files with 69 additions and 60 deletions

View File

@ -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"));
}
}

View File

@ -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 D<sub>5</sub> 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 D<sub>0</sub> and D<sub>2</sub> 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 "D<sub>0</sub> HIGH", verify not only
that D<sub>0</sub> 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 |D<sub>0</sub> HIGH|
|D2 |D<sub>1</sub> HIGH|
|D4 |D<sub>2</sub> HIGH|
|D8 |D<sub>3</sub> HIGH|
|D10 |D<sub>4</sub> HIGH|
|D20 |D<sub>5</sub> HIGH|
|D40 |D<sub>6</sub> HIGH|
|D80 |D<sub>7</sub> 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 |A<sub>0</sub> HIGH|
|A2 |A<sub>1</sub> HIGH|
|A4 |A<sub>2</sub> HIGH|
|A8 |A<sub>3</sub> HIGH|
|A10 |A<sub>4</sub> HIGH|
|A20 |A<sub>5</sub> HIGH|
|A40 |A<sub>6</sub> HIGH|
|A80 |A<sub>7</sub> HIGH|
|A100 |A<sub>8</sub> HIGH|
|A200 |A<sub>9</sub> HIGH|
|A400 |A<sub>10</sub> HIGH|
|A800 |A<sub>11</sub> HIGH|
|A1000 |A<sub>12</sub> HIGH|
|A2000 |A<sub>13</sub> HIGH|
|A4000 |A<sub>14</sub> 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|