DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦699644175⟧ TextFile

    Length: 3710 (0xe7e)
    Types: TextFile
    Notes: UNIX file
    Names: »ck.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦2d53db1df⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »frankh/src/oki/ck.c« 

TextFile

#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));

}