/* d8274.c
Stewart, September 27, 1982 3:12 PM
Stewart, December 20, 1982 4:57 PM, update
*/
#include "Lark.h"
extern OutByte();
extern InByte();
extern Block();
Init8274()
{
};
/* no blocking, for interrupt handlers to call */
nbPutChar(c)
char c;
{
while (!SIOFree(0));
SIOPutC(0, c);
};
PutChar(c)
char c;
{
PutC(0, c);
};
PutCRChar(c)
char c;
{
PutChar(c);
if (c=='\r') PutChar('\n');
};
PutC(ch, c)
int ch;
char c;
{
while (!SIOFree(ch)) Block();
SIOPutC(ch, c);
};
int GetChar()
{
return(GetC(0));
};
int GetC(ch)
int ch;
{
while (!AvC(ch)) Block();
return(SIOGetC(ch) & 0177);
};
int Chav()
{
return(AvC(0));
};
int AvC(ch)
int ch;
{
ch = SIOCmdP(ch);
return(InByte(ch)&01);
};
Baud(mbr, ch)
int mbr, ch;
{
int dr, load, hold;
if (ch == 0) { /* use 9513 channel 0 (FOUT) */
if (mbr == 300) { MM(0x0ac0); WR4(ch, 0x008c); };
else WR4(ch, 0x4c);
if (mbr==600) MM(0x0ac0);
if (mbr==1200) MM(0x088c0);
if (mbr==2400) MM(0x084c0);
if (mbr==4800) MM(0x082c0);
if (mbr==9600) MM(0x08a00);
if (mbr==19200) MM(0x08500);
};
if (ch==1) { /* use 9513 channel 4 */
WR4(ch, 0x4c); /* always use /16 mode */
mbr = mbr/100;
dr = 960/mbr; /* 960 = 15360/16 (16 for 8274 division ratio) */
hold = dr/2;
load = dr-hold;
OutByte(TimCtl, 0xc8); /* disarm ch 4 */
OutByte(TimCtl, 0x04); /* set data pointer for ch 4 */
OutWord(TimData, 0x1b62); /* Mode J, src F1, toggle, count up, binary */
OutWord(TimData, load);
OutWord(TimData, hold);
OutByte(TimCtl, 0x48); /* load ch 4 */
OutByte(TimCtl, 0x28); /* arm ch 4 */
};
};
static SIOFree(ch)
int ch;
{
ch = SIOCmdP(ch);
return(InByte(ch)&04);
};
static SIOGetC(ch)
int ch;
{
ch = SIODataP(ch);
return(InByte(ch)&0177);
};
static SIOPutC(ch, v)
int ch;
char v;
{
ch = SIODataP(ch);
OutByte(ch, v);
};
static SIOCmdP(ch)
int ch;
{
if (ch==0) ch = sioctla;
else ch = sioctlb;
return(ch);
};
static SIODataP(ch)
int ch;
{
if (ch==0) ch = siodata;
else ch = siodatb;
return(ch);
};
static MM(rv)
int rv;
{
OutByte(TimCtl, 0x17);
OutWord(TimData, rv);
};
static WR4(ch, rv)
int ch, rv;
{
ch = SIOCmdP(ch);
OutByte(ch, 0x04);
OutByte(ch, rv&0xff);
};
static OutWord(port, val)
int port, val;
{
OutByte(port, val&0xff);
OutByte(port, (val >> 8)&0xff);
};