96 lines
2.1 KiB
C++
96 lines
2.1 KiB
C++
#include "parallel.h"
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "Arduino.h"
|
|
|
|
namespace {
|
|
|
|
constexpr int kParallelDataPins[] = {
|
|
D9, D8, D7, D6, D5, D4, D3, D2,
|
|
};
|
|
|
|
constexpr int kParallelBusyPin = D14;
|
|
constexpr int kParallelAckPin = D15;
|
|
constexpr int kParallelPaperoutPin = D12;
|
|
constexpr int kParallelSelectPin = D11;
|
|
|
|
constexpr int kParallelNibblePins[] = {
|
|
kParallelSelectPin,
|
|
kParallelPaperoutPin,
|
|
kParallelAckPin,
|
|
kParallelBusyPin,
|
|
};
|
|
|
|
constexpr bool kParallelNibbleInverted[] = {
|
|
false,
|
|
false,
|
|
false,
|
|
true,
|
|
};
|
|
|
|
constexpr int kParallelStrobePin = D10;
|
|
|
|
volatile bool strobe_pending = false;
|
|
volatile uint8_t strobe_byte = 0;
|
|
|
|
void strobeIsr() {
|
|
strobe_pending = true;
|
|
strobe_byte = readParallel();
|
|
}
|
|
|
|
} // namespace
|
|
|
|
uint8_t readParallel() {
|
|
uint8_t out = 0;
|
|
for (int i = 0; i < 8; i++) {
|
|
if (digitalReadFast(digitalPinToPinName(kParallelDataPins[i])) ==
|
|
HIGH) {
|
|
out |= (1 << i);
|
|
}
|
|
}
|
|
if (digitalReadFast(digitalPinToPinName(kParallelStrobePin)) == HIGH) {
|
|
out |= (1 << 8);
|
|
}
|
|
return out;
|
|
}
|
|
|
|
#define BIT(x, n) ((x & (1 << n)) ? HIGH : LOW)
|
|
|
|
void writeParallel(uint8_t nibble) {
|
|
for (int i = 0; i < 4; i++) {
|
|
int lvl = BIT(nibble, i);
|
|
if (kParallelNibbleInverted[i]) {
|
|
lvl = lvl == HIGH ? LOW : HIGH;
|
|
}
|
|
digitalWriteFast(digitalPinToPinName(kParallelNibblePins[i]), lvl);
|
|
}
|
|
}
|
|
|
|
bool strobeOccurred(uint8_t &byte) {
|
|
bool pending;
|
|
{
|
|
noInterrupts();
|
|
pending = strobe_pending;
|
|
byte = strobe_byte;
|
|
strobe_pending = false;
|
|
interrupts();
|
|
}
|
|
|
|
return pending;
|
|
}
|
|
|
|
void setupParallel() {
|
|
for (int i = 0; i < sizeof(kParallelDataPins) / sizeof(int); i++) {
|
|
pinMode(kParallelDataPins[i], INPUT);
|
|
}
|
|
for (int i = 0; i < sizeof(kParallelNibblePins) / sizeof(int); i++) {
|
|
pinMode(kParallelNibblePins[i], OUTPUT);
|
|
digitalWrite(kParallelNibblePins[i], HIGH);
|
|
}
|
|
pinMode(kParallelStrobePin, INPUT);
|
|
|
|
attachInterrupt(digitalPinToInterrupt(kParallelStrobePin), strobeIsr,
|
|
FALLING);
|
|
}
|