[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

My cc65 source to control SSC card.



#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.,