#include "AppleVIA6522.h"
typedef struct VIARegisterAddress VIARegisterAddress;
struct VIARegisterAddress
{
volatile unsigned char* dataB;
volatile unsigned char* handshakeDataA;
volatile unsigned char* dataDirectionB;
volatile unsigned char* dataDirectionA;
volatile unsigned char* timer1CounterLow;
volatile unsigned char* timer1CounterHigh;
volatile unsigned char* timer1LatchLow;
volatile unsigned char* timer1LatchHigh;
volatile unsigned char* timer2CounterLow;
volatile unsigned char* timer2CounterHigh;
volatile unsigned char* shift;
volatile unsigned char* auxillaryControl;
volatile unsigned char* peripheralControl;
volatile unsigned char* interruptFlag;
volatile unsigned char* interruptEnable;
volatile unsigned char* dataA;
};
enum
{
kCudaTransferRequestMask = EVRB_XCVR, kCudaNegateTransferRequest = EVRB_XCVR, kCudaAssertTransferRequest = ~EVRB_XCVR,
kCudaByteAcknowledgeMask = EVRB_FULL, kCudaNegateByteAcknowledge = EVRB_FULL, kCudaAssertByteAcknowledge = ~EVRB_FULL,
kCudaTransferInProgressMask = EVRB_SYSES, kCudaNegateTransferInProgress = EVRB_SYSES, kCudaAssertTransferInProgress = ~EVRB_SYSES,
kCudaTransferMode = VAC_SRMD3,
kCudaDirectionMask = VAC_SRMD4, kCudaSystemSend = VAC_SRMD4, kCudaSystemRecieve = ~VAC_SRMD4,
kCudaInterruptMask = VIE_SR,
kCudaInterruptDisable = VIE_CLEAR | VIE_SR,
kCudaInterruptEnable = VIE_SET | VIE_SR
};
enum
{
kCudaInterruptStateMask = kCudaTransferInProgressMask |
kCudaTransferRequestMask
};
enum
{
kCudaReceiveByte = 0, kCudaReceiveLastByte = kCudaNegateTransferRequest, kCudaCollision = kCudaSystemSend, kCudaTransmitByte = kCudaSystemSend |
kCudaNegateTransferRequest, kCudaUnexpectedAttention = kCudaNegateTransferInProgress, kCudaIdleState = kCudaNegateTransferInProgress |
kCudaNegateTransferRequest, kCudaExpectedAttention = kCudaSystemSend |
kCudaNegateTransferInProgress, kCudaIllegalState = kCudaSystemSend |
kCudaNegateTransferInProgress |
kCudaNegateTransferRequest };
enum
{
kCudaSRQAssertMask = 0x01, kCudaTimeOutMask = 0x02, kCudaSRQErrorMask = 0x04, kCudaBusErrorMask = 0x08, kCudaAutoPollMask = 0x40, kCudaResponseMask = 0x80 };
#define cuda_write_data(self,theByte) {*self->cuda_via_regs.shift = theByte; eieio(); }
#define cuda_set_data_direction_to_input(self) {*self->cuda_via_regs.auxillaryControl &= kCudaSystemRecieve; eieio(); }
#define cuda_set_data_direction_to_output(self) {*self->cuda_via_regs.auxillaryControl |= kCudaSystemSend; eieio(); }
#define cuda_assert_transfer_in_progress(self) {*self->cuda_via_regs.dataB &= kCudaAssertTransferInProgress; eieio(); }
#define cuda_neg_transfer_in_progress(self) {*self->cuda_via_regs.dataB |= kCudaNegateTransferInProgress; eieio(); }
#define cuda_neg_tip_and_byteack(self) {*self->cuda_via_regs.dataB |= kCudaNegateByteAcknowledge | kCudaNegateTransferInProgress; eieio(); }
#define cuda_toggle_byte_ack(self) {*self->cuda_via_regs.dataB ^= kCudaByteAcknowledgeMask; eieio(); }
#define cuda_assert_byte_ack(self) {*self->cuda_via_regs.dataB &= kCudaAssertByteAcknowledge; eieio(); }
#define cuda_neg_byte_ack(self) {*self->cuda_via_regs.dataB |= kCudaNegateByteAcknowledge; eieio(); }
#define cuda_is_transfer_in_progress(self) ((*self->cuda_via_regs.dataB & kCudaTransferRequestMask) == 0 )
#define cuda_disable_interrupt(self) {*self->cuda_via_regs.interruptEnable = kCudaInterruptDisable; eieio(); }
#define cuda_enable_interrupt(self) {*self->cuda_via_regs.interruptEnable = kCudaInterruptEnable; eieio(); }
#define cuda_get_interrupt_state(self) (*self->cuda_via_regs.dataB & kCudaInterruptStateMask) | \
(*self->cuda_via_regs.auxillaryControl & kCudaDirectionMask)
#define cuda_wait_for_transfer_request_assert(self) while ( (*self->cuda_via_regs.dataB & kCudaTransferRequestMask) != 0 ) { eieio(); } ; eieio()
#define cuda_wait_for_transfer_request_neg(self) while ( (*self->cuda_via_regs.dataB & kCudaTransferRequestMask) == 0 ) { eieio(); } ; eieio()
#define cuda_wait_for_interrupt(self) while ( (*self->cuda_via_regs.interruptFlag & kCudaInterruptMask) == 0 ) { eieio(); } ; eieio()