forked from Apple-2-HW/Apple_II_Keyboard
180 lines
3.8 KiB
C++
180 lines
3.8 KiB
C++
/*! \file II_Encoder.cpp
|
|
* \brief Output ASCII in parallel form to Apple II keyboard connector.
|
|
*
|
|
* Takes a ASCII character or string and sets the IO Pins accordingly for APPLE II keayboard Input.
|
|
*/
|
|
|
|
#include "Arduino.h"
|
|
#include "II_Encoder.h"
|
|
|
|
void II_Encoder::begin(void)
|
|
{
|
|
pinMode(IIKEYB_D0, OUTPUT);
|
|
pinMode(IIKEYB_D1, OUTPUT);
|
|
pinMode(IIKEYB_D2, OUTPUT);
|
|
pinMode(IIKEYB_D3, OUTPUT);
|
|
pinMode(IIKEYB_D4, OUTPUT);
|
|
pinMode(IIKEYB_D5, OUTPUT);
|
|
pinMode(IIKEYB_D6, OUTPUT);
|
|
|
|
pinMode(IIKEYB_RESET, INPUT_PULLUP);
|
|
pinMode(IIKEYB_STRB, OUTPUT);
|
|
|
|
digitalWrite(IIKEYB_D0, LOW);
|
|
digitalWrite(IIKEYB_D1, LOW);
|
|
digitalWrite(IIKEYB_D2, LOW);
|
|
digitalWrite(IIKEYB_D3, LOW);
|
|
digitalWrite(IIKEYB_D4, LOW);
|
|
digitalWrite(IIKEYB_D5, LOW);
|
|
digitalWrite(IIKEYB_D6, LOW);
|
|
|
|
digitalWrite(IIKEYB_RESET, HIGH);
|
|
digitalWrite(IIKEYB_STRB, HIGH);
|
|
|
|
}
|
|
|
|
void II_Encoder::Reset(void)
|
|
{
|
|
pinMode(IIKEYB_RESET, OUTPUT);
|
|
digitalWrite(IIKEYB_RESET, LOW);
|
|
delay(10);
|
|
pinMode(IIKEYB_RESET, INPUT_PULLUP);
|
|
digitalWrite(IIKEYB_RESET, HIGH);
|
|
|
|
}
|
|
|
|
int II_Encoder::IIputchar(int bOutput)
|
|
{
|
|
if (bOutput & 0b00000001)
|
|
digitalWrite(IIKEYB_D0, HIGH);
|
|
else
|
|
digitalWrite(IIKEYB_D0, LOW);
|
|
|
|
if (bOutput & 0b00000010)
|
|
digitalWrite(IIKEYB_D1, HIGH);
|
|
else
|
|
digitalWrite(IIKEYB_D1, LOW);
|
|
|
|
if (bOutput & 0b00000100)
|
|
digitalWrite(IIKEYB_D2, HIGH);
|
|
else
|
|
digitalWrite(IIKEYB_D2, LOW);
|
|
|
|
if (bOutput & 0b00001000)
|
|
digitalWrite(IIKEYB_D3, HIGH);
|
|
else
|
|
digitalWrite(IIKEYB_D3, LOW);
|
|
|
|
if (bOutput & 0b00010000)
|
|
digitalWrite(IIKEYB_D4, HIGH);
|
|
else
|
|
digitalWrite(IIKEYB_D4, LOW);
|
|
|
|
if (bOutput & 0b00100000)
|
|
digitalWrite(IIKEYB_D5, HIGH);
|
|
else
|
|
digitalWrite(IIKEYB_D5, LOW);
|
|
|
|
if (bOutput & 0b01000000)
|
|
digitalWrite(IIKEYB_D6, HIGH);
|
|
else
|
|
digitalWrite(IIKEYB_D6, LOW);
|
|
|
|
pinMode(IIKEYB_STRB, HIGH);
|
|
delay(1);
|
|
pinMode(IIKEYB_STRB, LOW);
|
|
|
|
delay(10);
|
|
return (bOutput);
|
|
}
|
|
|
|
int II_Encoder::IIputs(const char *string)
|
|
{
|
|
int i = 0;
|
|
while (string[i]) //standard c idiom for looping through a null-terminated string
|
|
{
|
|
if (IIputchar(string[i]) == EOF) //if we got the EOF value from writing the char
|
|
{
|
|
return EOF;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
if (IIputchar('\r') == EOF) //this will occur right after we quit due to the null terminated character.
|
|
{
|
|
return EOF;
|
|
}
|
|
return 1; //to meet spec.
|
|
}
|
|
|
|
char *II_Encoder::convert(unsigned int num, const int base, char *ptr)
|
|
{
|
|
static char Representation[] = "0123456789ABCDEF";
|
|
*ptr = '\0';
|
|
|
|
do
|
|
{
|
|
*--ptr = Representation[num % base];
|
|
num /= base;
|
|
} while (num != 0);
|
|
|
|
return (ptr);
|
|
}
|
|
|
|
void II_Encoder::IIprintf(char* format, ...)
|
|
{
|
|
char *traverse;
|
|
unsigned int i;
|
|
char *s;
|
|
char pBuffer[25];
|
|
|
|
//Module 1: Initializing Myprintf's arguments
|
|
va_list arg;
|
|
va_start(arg, format);
|
|
|
|
for (traverse = format; *traverse != '\0'; traverse++)
|
|
{
|
|
while ( *traverse != '%' )
|
|
{
|
|
IIputchar(*traverse);
|
|
traverse++;
|
|
}
|
|
|
|
traverse++;
|
|
|
|
//Module 2: Fetching and executing arguments
|
|
switch (*traverse)
|
|
{
|
|
case 'c' : i = va_arg(arg, int); //Fetch char argument
|
|
IIputchar(i);
|
|
break;
|
|
|
|
case 'd' : i = va_arg(arg, int); //Fetch Decimal/Integer argument
|
|
if (i < 0)
|
|
{
|
|
i = -i;
|
|
IIputchar('-');
|
|
}
|
|
IIputs(convert(i, 10, pBuffer));
|
|
break;
|
|
|
|
case 'o': i = va_arg(arg, unsigned int); //Fetch Octal representation
|
|
IIputs(convert(i, 8, pBuffer));
|
|
break;
|
|
|
|
case 's': s = va_arg(arg, char *); //Fetch string
|
|
IIputs(s);
|
|
break;
|
|
|
|
case 'x': i = va_arg(arg, unsigned int); //Fetch Hexadecimal representation
|
|
|
|
IIputs(convert(i, 16, pBuffer));
|
|
break;
|
|
}
|
|
}
|
|
|
|
//Module 3: Closing argument list to necessary clean-up
|
|
va_end(arg);
|
|
}
|
|
|