home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Transactor
/
Transactor_26_1988_Transactor_Publishing.d64
/
dos.c
< prev
next >
Wrap
Text File
|
2023-02-26
|
5KB
|
309 lines
/* dos.c - operating system stuff:
disk support
serial i/o
kb i/o
timers */
/* W Mat Waites - Sept 1988 */
#include <stdio.h>
/* 5-9 may be used with "basic" open */
#define KB 5
#define RS 6
/* kludge for reliable 1200 baud */
#define KLUDGE 40
/* kernel routines */
#define CHKIN 0xffc6
#define GETIN 0xffe4
#define TKSA 0xff96
#define ACPTR 0xffa5
#define TALK 0xffb4
#define UNTLK 0xffab
/* input and output serial buffers */
static char inbuf[256], otbuf[256];
/* serial interface functions */
/* openserial() - open serial port */
openserial()
{SHIFT-+}
short *ribuf = 0x00f7;
short *robuf = 0x00f9;
/* open serial port */
open(RS, 2, 0, "");
/* move pointers to buffers */
*ribuf = inbuf;
*robuf = otbuf;
{SHIFT--}
/* closeserial() - close serial port */
closeserial()
{SHIFT-+}
close(RS);
{SHIFT--}
/* 300, 450, 1200 implemented */
static short hibyte[3] = {SHIFT-+} 6, 4, 1{SHIFT--};
static short lobyte[3] = {SHIFT-+}68, 12, 61{SHIFT--};
/* setserial() - set serial port */
setserial(bd, bpc, sb, par)
int bd, bpc, sb, par;
{SHIFT-+}
short *m51ajb = 0x0295;
short *baudof = 0x0299;
char *m51ctr = 0x0293;
char *m51cdr = 0x0294;
char *bitnum = 0x0298;
unsigned indx;
switch(bd)
{SHIFT-+}
case 300:
indx = 0;
break;
case 450:
indx = 1;
break;
case 1200:
indx = 2;
break;
default: /* default to 300 baud */
indx = 0;
break;
{SHIFT--}
/* set baud rate */
*m51ajb = 256 * hibyte[indx] +
lobyte[indx];
*baudof = (*m51ajb)*2 + 200;
/* stopbits */
if(sb < 1 {CBM-*}{CBM-*} sb > 2)
{SHIFT-+}
sb = 1;
{SHIFT--}
sb--;
/* bits per char */
if(bpc < 5 {CBM-*}{CBM-*} bpc > 8)
{SHIFT-+}
bpc = 8;
{SHIFT--}
*bitnum = (char)(bpc + 1);
bpc = 8 - bpc;
/* parity */
if(par < 0 {CBM-*}{CBM-*} par > 7)
{SHIFT-+}
par = 0;
{SHIFT--}
/* put bpc, sb, and par in regs */
*m51ctr = (char)((bpc << 5)
{CBM-*} (sb << 7));
*m51cdr = (char)(par << 5);
{SHIFT--}
/* getserial() - char from serial port */
getserial()
{SHIFT-+}
int ch;
char *rsstat = 0x0297;
ch = getonechar(RS);
/* check for empty buffer */
if((*rsstat & 0x08) == 0x08)
{SHIFT-+}
return -1;
{SHIFT--}
else
{SHIFT-+}
return ch;
{SHIFT--}
{SHIFT--}
/* putserial() - char to serial port */
putserial(ch)
char ch;
{SHIFT-+}
int i;
putc(ch, RS);
/* delay loop for 1200 baud kludge */
for(i=0; i<KLUDGE; i++)
{SHIFT-+}
{SHIFT--}
{SHIFT--}
/* keyboard interface functions */
/* openkb() - open keyboard */
openkb()
{SHIFT-+}
char *rptflg = 0x028a;
open(KB, 0, 0, "");
/* let the keyboard repeat */
*rptflg = 0x80;
{SHIFT--}
/* closekb() - close keyboard */
closekb()
{SHIFT-+}
close(KB);
{SHIFT--}
/* getkb() - get char from keyboard */
getkb()
{SHIFT-+}
return getonechar(KB);
{SHIFT--}
/* charsinq() - # available kb chars */
charsinq()
{SHIFT-+}
char *ndx = 0x00c6;
return (int)*ndx;
{SHIFT--}
/* chkstop() - check for <C=> key */
chkstop()
{SHIFT-+}
char *shflag = 0x028d;
return(*shflag == 0x02);
{SHIFT--}
/* getonechar() - get char from chan */
static getonechar(channel)
int channel;
{SHIFT-+}
char ac, xc, yc;
xc = (char)channel;
sys(CHKIN, &ac, &xc, &yc);
sys(GETIN, &ac, &xc, &yc);
return(int)ac;
{SHIFT--}
/* disk i/o functions */
#define SADDR 0x6f
/* diskerr() - read error channel */
char *diskerr(disk)
int disk;
{SHIFT-+}
int cc;
char ac, xc, yc;
static char msgbuf[41];
char *mp;
char *second = 0x00b9;
char *status = 0x0090;
/* tell drive to talk */
ac = (char)disk;
sys(TALK, &ac, &xc, &yc);
/* tell it what to talk about */
ac = (char)SADDR;
*second = SADDR;
sys(TKSA, &ac, &xc, &yc);
/* read in the response */
mp = msgbuf;
for(;;)
{SHIFT-+}
/* get byte from bus in acc */
sys(ACPTR, &ac, &xc, &yc);
if(ac == '\r')
{SHIFT-+}
break;
{SHIFT--}
*mp = ac;
mp++;
{SHIFT--}
*mp = '\0';
/* tell drive to shut up */
sys(UNTLK, &ac, &xc, &yc);
return(msgbuf);
{SHIFT--}
/* timer functions */
unsigned getclock();
/* sleep() - sleep for seconds */
sleep(usecs)
unsigned usecs;
{SHIFT-+}
setclock((unsigned)0);
while(getclock() < usecs)
{SHIFT-+}
{SHIFT--}
{SHIFT--}
struct clock /* struct matches CIA */
{SHIFT-+}
char tenths;
char seconds;
char minutes;
char hours;
{SHIFT--};
/* setclock() - set timer clock */
setclock(usecs)
unsigned usecs;
{SHIFT-+}
unsigned bsecs;
struct clock *clock1 = 0xdc08;
char *c1mode = 0xdc0f;
*c1mode &= 0x7f; /* mode is clock */
if(usecs > 59) usecs = 59;
/* convert secs to bcd */
bsecs = usecs%10 {CBM-*} ((usecs/10)<<4);
clock1->hours = 0;
clock1->minutes = 0;
clock1->seconds = (char)bsecs;
clock1->tenths = 0; /* free clock */
{SHIFT--}
/* getclock() - get current clock secs */
unsigned getclock()
{SHIFT-+}
unsigned usecs;
char junk;
struct clock *clock1 = 0xdc08;
junk = clock1->seconds;
usecs = (junk & 0x0f) +
10 * (junk >> 4);
junk = clock1->tenths; /* free clock */
return usecs;
{SHIFT--}
/* end of file */