|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 3710 (0xe7e)
Types: TextFile
Notes: UNIX file
Names: »ck.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦2d53db1df⟧ UNIX Filesystem
└─⟦this⟧ »frankh/src/oki/ck.c«
#include <stdio.h>
#define PBCS 0x93 /* Z8036 #2 port B cmd & stat reg */
#define PBDDR 0x57
#define PCDD 0x0D
#define PCDATA 0x1F
#define PBDATA 0x1D
#define CLRIPIUS 0x20 /* Mask to clear IP and IUS */
#define MCCR 0x03
#define MICR 0x01
#define PBCSR 0x13
#define SIOCRC 0x0F
/*
*
*
*
* The data lines are initialised, as follows in md.s:
* 8036 #1, port b, non-inverting: output data lines
* 8036 #1, port c, bit 0, non-inverting: input busy line
* 8036 #2, port b, bit 1, inverting: inpupt acknowledge
* 8036 #2, port c, bit 3, non-inverting: output strobe
*
*/
main()
{
register int fd;
int i, status;
unsigned int tmp;
char *day[15], *month[15];
for( i = 0; i < 16; ++i) {
day[i] = " ";
month[i] = " ";
}
day[0] = "Sun";
day[1] = "Mon";
day[2] = "Tue";
day[3] = "Wed";
day[4] = "Thu";
day[5] = "Fri";
day[6] = "Sat";
month[0] = "Jan";
month[1] = "Feb";
month[2] = "Mar";
month[3] = "Apr";
month[4] = "May";
month[5] = "Jun";
month[6] = "Jul";
month[7] = "Aug";
month[8] = "Sep";
month[9] = "Oct";
month[10] = "Nov";
month[11] = "Dec";
initio();
fd = open("/dev/port", 2);
printf("Begin . . .\n");
outb( fd, PCDATA, inb(fd, PCDATA) & 0x0F); /* enable 0-3 write */
outb( fd, PCDATA, (inb(fd, PCDATA) & 0x0F) | 0x02); /* set select = 1 */
outb( fd, PCDD, 0x05); /* set up CS line */
outb( fd, PCDATA, (inb(fd, PCDATA) & 0x0F) | 0x02); /* set select = 1 */
outb( fd, PBDATA, 0);
outb( fd, PCDATA, inb(fd, PCDATA) & 0x0D); /* set select = 0 */
printf("select on\n");
wrt( 0x0D, 0, fd);
printf(" loop . . .\n");
printf("\033[2J\n");
for( i = 0; i < 5000; ++i) {
/* printf("\033[0;0H"); */
printf("%s ", day[red(6,fd)]);
printf("%s ", month[(red(0xA,fd) * 10) + red(9,fd) - 1]);
printf("%d%d ", red(8,fd) & 0x03, red(7,fd));
printf("%d%d:%d%d:%d%d",red(5,fd) & 0x03,red(4,fd),red(3,fd),
red(2,fd),red(1,fd),red(0,fd));
printf(" 19%d%d\n", red(0xC, fd), red(0xB, fd));
outb( fd, PBDATA, inb(fd, PBDATA) & ~0x80); /* set stop = 0 */
}
/* for( i = 0; i < 13; ++i)
printf("i = %u data = %u\n", i, red(i, fd));
for( i = 0; i < 12 ; ++i)
wrt( i, 1, fd);
*/
/* outb( fd, PBDATA, inb(fd, PBDATA) & ~0x80); set stop = 0 */
outb( fd, PCDATA, (inb(fd, PCDATA) & 0x0F) | 0x02); /* set select =1 */
cloio();
}
red(reg, fd)
int fd;
unsigned int reg;
{
unsigned int tmp;
outb(fd, PBDATA, (inb(fd, PBDATA) & 0xF0) | reg);
/* outb(fd, PBDATA, reg); */
outb(fd, PBDATA, (inb(fd, PBDATA) | 0x40));
tmp = 5 * 5;
outb(fd, PBDATA, (inb(fd, PBDATA) & ~0x40));
/*
* make PB0-3 input lines
*/
outb(fd, PBDDR, (inb(fd, PBDDR) | 0x0F));
tmp = 5 * 3 * 4;
outb(fd, PBDATA, (inb(fd, PBDATA) | 0x10));
tmp = 9 * 8 * 9;
tmp = inb(fd, PBDATA) & 0x0F;
outb(fd, PBDATA, (inb(fd, PBDATA) & ~0x10));
/*
* make PB0-3 output lines
*/
outb(fd, PBDDR, (inb(fd, PBDDR) & 0xF0));
return(tmp);
}
wrt(reg, data, fd)
int fd;
unsigned int reg;
unsigned int data;
{
unsigned int tmp;
outb(fd, PBDATA, (inb(fd, PBDATA) & 0xF0) | reg);
/* outb(fd, PBDATA, reg); */
outb(fd, PBDATA, (inb(fd, PBDATA) | 0x40));
tmp = 5 * 5;
outb(fd, PBDATA, (inb(fd, PBDATA) & ~0x40));
tmp = 5 * 3;
outb(fd, PBDATA, ((inb(fd, PBDATA) & 0xF0) | data));
outb(fd, PBDATA, (inb(fd, PBDATA) | 0x20));
tmp = 3 * 4 * 7;
outb(fd, PBDATA, (inb(fd, PBDATA) & ~0x20));
}
dumpreg(fd)
int fd;
{
printf("\nPBDDR:\t%x\n", inb(fd, PBDDR));
printf("PCDDR:\t%x\n", inb(fd, PCDD));
printf("PBDATA:\t%x\n", inb(fd, PBDATA));
printf("PCDATA:\t%x\n", inb(fd, PCDATA));
printf("MICR:\t%x\n", inb(fd, MICR));
printf("MCCR:\t%x\n", inb(fd, MCCR));
printf("PBCSR:\t%x\n", inb(fd, PBCSR));
printf("SIOCRC:\t%x\n\n", inb(fd, SIOCRC));
}