|
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: 4243 (0x1093) Types: TextFile Notes: UNIX file Names: »Date.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦2d53db1df⟧ UNIX Filesystem └─⟦this⟧ »frankh/src/Date.c« └─⟦this⟧ »frankh/src/oki/Date.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(argc, argv) int argc; char *argv[]; { register int fd; int i, status; unsigned int tmp; char *day[15], *month[15]; 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); 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); if( argc == 2) tset(argv[1], fd); outb( fd, PCDATA, inb(fd, PCDATA) & 0x0D); /* set select = 0 */ outb( fd, PBDATA, inb(fd, PBDATA) | 0x80); /* set stop = 1 */ 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 */ 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)); outb(fd, PBDATA, (inb(fd, PBDATA) & ~0x40)); /* * make PB0-3 input lines */ outb(fd, PBDDR, (inb(fd, PBDDR) | 0x0F)); outb(fd, PBDATA, (inb(fd, PBDATA) | 0x10)); 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)); outb(fd, PBDATA, (inb(fd, PBDATA) & ~0x40)); outb(fd, PBDATA, ((inb(fd, PBDATA) & 0xF0) | data)); outb(fd, PBDATA, (inb(fd, PBDATA) | 0x20)); 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)); } tset(time, fd) int fd; char *time; { long atol(), l, ten; int tmp, i, j; printf("%s\n", time); l = atol(time); printf(" l = %U\n", l); outb( fd, PCDATA, inb(fd, PCDATA) & 0x0D); /* set select = 0 */ outb( fd, PBDATA, inb(fd, PBDATA) | 0x80); /* set stop = 1 */ ten = 1000000000L; for( i = 12; i > 1; --i) { if( i == 6) i = 5; tmp = l / ten; l = l - ( ten * tmp ); ten = ten / 10; if( i == 5 ) tmp = tmp + 8; wrt( i, tmp, fd); } wrt( 1, 0, fd); wrt( 0, 0, fd); wrt( 0x0D, 0, fd); /* wrt(0x00, 0, fd); wrt(0x01, 3, fd); wrt(0x02, 9, fd); wrt(0x03, 5, fd); wrt(0x04, 3, fd); wrt(0x05, 8+2, fd); wrt(0x06, 6, fd); wrt(0x07, 1, fd); wrt(0x08, 3, fd); wrt(0x09, 2, fd); wrt(0x0a, 1, fd); wrt(0x0b, 5, fd); wrt(0x0c, 8, fd); wrt(0x0d, 0, fd); */ outb( fd, PBDATA, inb(fd, PBDATA) & ~0x80); /* set stop = 0 */ outb( fd, PCDATA, (inb(fd, PCDATA) & 0x0F) | 0x02); /* set select = 1 */ }