[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
My cc65 source to control SSC card.
- Subject: My cc65 source to control SSC card.
- From: bluebird <mildstorm@gmail.com>
- Date: Sat, 30 Apr 2011 20:14:25 -0700 (PDT)
- Complaints-to: groups-abuse@google.com
- Injection-info: f15g2000pro.googlegroups.com; posting-host=124.50.46.166; posting-account=59zgiAoAAAD1UBiNbwKTnEqZIAtVrM7Y
- Newsgroups: comp.sys.apple2
- Organization: http://groups.google.com
- User-agent: G2/1.0
- Xref: g2news1.google.com comp.sys.apple2:21573
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef unsigned char byte;
typedef unsigned word;
// SSC EQUATES
#define DIPSW1 0xC081 // +N0 DIPSWITCH BLOCK 1
#define DIPSW2 0xC082 // +N0 DIPSWITCH BLOCK 2
#define TDREG 0xC088 // +N0 6551 DATA REGISTER
#define RDREG 0xC088 // +N0 6551 DATA REGISTER
#define STATUS 0xC089 // +N0 6551 STATUS REGISTER
#define RESET 0xC089 // +N0 6551 SOFTWARE RESET
#define COMMAND 0xC08A // +N0 6551 COMMAND REG
#define CONTROL 0xC08B // +N0 6551 CONTROL REG
// the Apple II monitor character output hook
#define CSWL 0x36
#define CSWH 0x37
typedef enum
{
SSC_STATE_RECV_CHECK = 0,
SSC_STATE_RECV_START,
SSC_STATE_SEND_CHECK,
SSC_STATE_SEND_START,
SSC_STATE_SEND_RECV_CHECK,
SSC_STATE_SEND_END,
SSC_STATE_MAX,
} SSC_STATE;
// Memory Access
#define POKE(addr, val) (*(unsigned char*) (addr) = (val))
#define POKEW(addr, val) (*(unsigned*) (addr) = (val))
#define PEEK(addr) (*(unsigned char*) (addr))
#define PEEKW(addr) (*(unsigned*) (addr))
void __fastcall__ delayWait(void)
{
printf("\n delayWait");
__asm__ (" BIT $C082 \
LDA #$80 \
JSR $FCA8 \
BIT $C080");
}
byte sscCheckSendStatus(byte slotSSC)
{
byte status = 0;
status = PEEK((STATUS + slotSSC * 16));
status = status & 0x10;
printf("\n checkSendStatus Slot %d : %d\n", slotSSC, status);
return status;
}
byte sscCheckReceiveStatus(byte slotSSC)
{
byte status = 0;
status = PEEK((STATUS + slotSSC * 16));
status = status & 0x08;
return status;
}
byte sscSendPC(byte slotSSC, byte ch)
{
POKE((TDREG + slotSSC * 16), ch);
return ch;
}
byte sscReceivePC(byte slotSSC)
{
byte ch = PEEK((RDREG + slotSSC * 16));
return ch;
}
void __fastcall__ sscInitSSC(byte slotSSC, byte control, byte command)
{
// Save previous CSW
byte prevCSWL = PEEK(CSWL);
byte prevCSWH = PEEK(CSWH);
POKE((CONTROL + slotSSC * 16), control);
POKE((COMMAND + slotSSC * 16), command);
// Output Hook SSC
POKE(CSWL, 0x00);
POKE(CSWH, (0xC0 + slotSSC));
__asm__ (" BIT $C082 \
LDA #$00 \
JSR $FDED \
BIT $C080");
// Restore
POKE(CSWL, prevCSWL);
POKE(CSWH, prevCSWH);
}
int main (void)
{
byte control = 0;
byte command = 0;
byte statusReceive = 0;
byte statusSend = 0;
byte chRecv = 0;
byte chSend = 0;
char in;
SSC_STATE sscCurState;
control = 0x0E; // 00001010 => 1 Stop bit, 8bit, external, 9600 bps
command = 0x0A; // 00001001 => set RTS low and transmit no
interrupts, set DTR low
sscInitSSC(2, control, command);
sscCurState = SSC_STATE_RECV_CHECK;
chSend = 65;
for(;;)
{
switch (sscCurState)
{
case SSC_STATE_RECV_CHECK:
statusReceive = sscCheckReceiveStatus(2);
if (statusReceive != 0)
sscCurState = SSC_STATE_RECV_START;
break;
case SSC_STATE_RECV_START:
chRecv = sscReceivePC(2); // Throw away this input
sscCurState = SSC_STATE_SEND_CHECK;
break;
case SSC_STATE_SEND_CHECK:
statusSend = sscCheckSendStatus(2);
if (statusSend =! 0)
sscCurState = SSC_STATE_SEND_START;
break;
case SSC_STATE_SEND_START:
if (chSend == 91)
{
// New line
sscSendPC(2, 0x0D);
chSend++;
}
else
sscSendPC(2, chSend++);
//delayWait();
sscCurState = SSC_STATE_SEND_RECV_CHECK;
if (chSend == 92)
chSend = 65;
break;
case SSC_STATE_SEND_RECV_CHECK:
statusReceive = sscCheckReceiveStatus(2);
if (statusReceive != 0)
sscCurState = SSC_STATE_SEND_END;
else
sscCurState = SSC_STATE_SEND_CHECK;
break;
case SSC_STATE_SEND_END:
chRecv = sscReceivePC(2);
goto EXITLOOP;
break;
}
if (kbhit())
{
in = cgetc();
// ESC?
if (in == 27)
clrscr();
}
}
EXITLOOP:
return EXIT_SUCCESS;
}
----------------------------------------------------------------
I tried to communicate with PC. :-)
It's a very simple serial communication source.
How to compile :
cl65 -O -t apple2enh ssc.c
a2tools del cc65.dsk SSC
a2tools in -r b cc65.dsk SSC ssc
I received many helps from comp.sys.apple2
I really appreciate it for this news group.
Thanks.
BR.,