Pre Tandy1000 overhaul

This commit is contained in:
Jacob Alexander 2011-11-28 22:20:04 -08:00
parent 969b8c8bee
commit ac5f6c015d
17 changed files with 198 additions and 110 deletions

View file

@ -23,6 +23,8 @@
// AVR Includes
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
// Project Includes
#include <led.h>
@ -53,17 +55,24 @@
// ----- Macros -----
#define READ_CLK CLK_READ & (1 << CLK_PIN) ? 1 : 0
#define READ_DATA DATA_READ & (1 << DATA_PIN) ? 0 : 1
#define UNSET_INTR() INTR_DDR &= ~(1 << INTR_PIN)
#define SET_INTR() INTR_DDR |= (1 << INTR_PIN)
#define bufferAdd(byte) \
if ( KeyIndex_BufferUsed < KEYBOARD_BUFFER ) \
KeyIndex_Buffer[KeyIndex_BufferUsed++] = byte
// ----- Variables -----
uint8_t KeyIndex_Array[KEYBOARD_SIZE + 1];
// Buffer used to inform the macro processing module which keys have been detected as pressed
volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER];
volatile uint8_t KeyIndex_BufferUsed;
// Scan Code Retrieval Variables
uint8_t inputData = 0xFF;
@ -76,6 +85,12 @@ uint8_t packet_index = 0;
// Setup
inline void scan_setup()
{
// Initially reset the keyboard (just in case we are in a wierd state)
scan_resetKeyboard();
// Setup SPI for data input using the clock and data inputs
// TODO
/*
// Setup inputs
CLK_DDR &= ~(1 << CLK_PIN);
DATA_DDR &= ~(1 << DATA_PIN);
@ -83,22 +98,14 @@ inline void scan_setup()
// Setup Pull-up's
CLK_PORT &= ~(1 << CLK_PIN); // (CLK)
DATA_PORT &= ~(1 << DATA_PIN); // (/DATA)
*/
// Setup Keyboard Interrupt
INTR_DDR &= ~(1 << INTR_PIN);
INTR_PORT &= ~(1 << INTR_PIN);
/* Interrupt Style (Not working fully)
cli();
// Setup interrupt on the CLK pin TODO Better defines
EICRA |= 0x03; // Rising Edge Interrupt
EIMSK |= (1 << INT0);
// Setup interrupt on the DATA pin TODO Better defines
EICRA |= 0x08; // Falling Edge Interrupt
EIMSK |= (1 << INT1);
sei();
*/
// Setup Keyboard Reset Line
// TODO
}
@ -212,28 +219,35 @@ inline uint8_t scan_loop()
return packet_index;
}
// Detection interrupt, signalled by a clock pulse from CLK_PIN
ISR(INT0_vect)
// Send data
// XXX Not used with the Tandy1000
uint8_t scan_sendData( uint8_t dataPayload )
{
//cli(); // Disable Interrupts
// Append 1 bit of data
//inputData &= ~(READ_DATA << packet_index);
packet_index++;
//sei(); // Re-enable Interrupts
return 0;
}
// Data Detected
ISR(INT1_vect)
// Signal KeyIndex_Buffer that it has been properly read
// TODO
void scan_finishedWithBuffer( void )
{
// Append 1 bit of data
inputData &= ~(1 << packet_index);
packet_index++;
// Disable Clk Signal (Not needed if there's a data signal)
EIFR |= (1 << INTF0);
}
// Reset/Hold keyboard
// Warning! This will cause the keyboard to not send any data, so you can't disable with a keypress
// The Tandy 1000 keyboard has a dedicated hold/processor interrupt line
void scan_lockKeyboard( void )
{
UNSET_INTR();
}
void scan_unlockKeyboard( void )
{
SET_INTR();
}
// Reset Keyboard
void scan_resetKeyboard( void )
{
// TODO Tandy1000 has a dedicated reset line
}