55 #define to_bcd(x) ( ((x)/10) * 16 + ((x)%10) ) 56 #define from_bcd(x) ( ((x)>>4) * 10 + ((x)&15) ) 60 #define MC146818_TICK_SHIFT 14 64 #define N_REGISTERS 1024 95 #define NETBSD_HACK_INIT 0 96 #define NETBSD_HACK_FIRST_1 1 97 #define NETBSD_HACK_FIRST_2 2 98 #define NETBSD_HACK_SECOND_1 3 99 #define NETBSD_HACK_SECOND_2 4 100 #define NETBSD_HACK_DONE 5 156 #ifdef MC146818_DEBUG 159 fatal(
"[ mc146818_jazz: write to addr=0x%04x: ",
161 for (i=0; i<len; i++)
165 fatal(
"[ mc146818_jazz: read from addr=0x%04x ]\n",
185 static void mc146818_update_time(
struct mc_data *d)
191 tmp = gmtime(&timet);
242 d->
reg[72 * 4] = 19 + (tmp->tm_year / 100);
255 d->
reg[4 * 63] = tmp->tm_year - 100;
293 if ((relative_addr & 1) == 0x00) {
305 if (relative_addr == 0x01) {
313 }
else if (relative_addr == 0x00)
316 fatal(
"[ mc146818: not accessed as an " 317 "MC146818_ARC_NEC device! ]\n");
343 #ifdef MC146818_DEBUG 345 fatal(
"[ mc146818: write to addr=0x%04x (len %i): ",
346 (
int)relative_addr, (
int)len);
347 for (i=0; i<len; i++)
363 tmp = gmtime(&timet);
396 switch (relative_addr) {
440 debug(
"[ rtc changed to interrupt at %i Hz ]\n",
445 if (d->
timer == NULL)
467 debug(
"[ mc146818: write to MC_REGC, data[0] = " 468 "0x%02x ]\n",
data[0]);
471 d->
reg[relative_addr] =
data[0];
476 fatal(
"[ md146818: power off ]\n");
480 exit_without_entering_debugger = 1;
484 d->
reg[relative_addr] =
data[0];
486 debug(
"[ mc146818: unimplemented write to " 487 "relative_addr = %08lx: ", (
long)relative_addr);
488 for (i=0; i<len; i++)
494 switch (relative_addr) {
538 mc146818_update_time(d);
546 default:
debug(
"[ mc146818: read from relative_addr = " 547 "%04x ]\n", (
int)relative_addr);
550 data[0] = d->
reg[relative_addr];
552 if (relative_addr ==
MC_REGC*4) {
567 #ifdef MC146818_DEBUG 569 fatal(
"[ mc146818: read from addr=0x%04x (len %i): ",
570 (
int)relative_addr, (
int)len);
571 for (i=0; i<len; i++)
590 unsigned char ether_address[6];
595 memset(d, 0,
sizeof(
struct mc_data));
603 switch (access_style) {
619 ether_address[i] = 0x10 * (i+1);
621 d->
reg[0x01] = ether_address[0];
622 d->
reg[0x05] = ether_address[1];
623 d->
reg[0x09] = ether_address[2];
624 d->
reg[0x0d] = ether_address[3];
625 d->
reg[0x11] = ether_address[4];
626 d->
reg[0x15] = ether_address[5];
628 d->
reg[0x29] = ether_address[5];
629 d->
reg[0x2d] = ether_address[4];
630 d->
reg[0x31] = ether_address[3];
631 d->
reg[0x35] = ether_address[2];
632 d->
reg[0x39] = ether_address[1];
633 d->
reg[0x3d] = ether_address[1];
634 d->
reg[0x41] = ether_address[0];
635 d->
reg[0x45] = ether_address[1];
636 d->
reg[0x49] = ether_address[2];
637 d->
reg[0x4d] = ether_address[3];
638 d->
reg[0x51] = ether_address[4];
639 d->
reg[0x55] = ether_address[5];
667 1, dev_mc146818_jazz_access, d,
DM_DEFAULT, NULL);
670 switch (access_style) {
683 mc146818_update_time(d);
#define MC146818_ARC_JAZZ
#define NETBSD_HACK_SECOND_1
void dev_mc146818_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, char *irq_path, int access_style, int addrdiv)
void fatal(const char *fmt,...)
#define MC146818_TICK_SHIFT
volatile int pending_timer_interrupts
void dev_mc146818_tick(struct cpu *cpu, void *)
#define DEV_MC146818_LENGTH
DEVICE_ACCESS(mc146818_jazz)
void(* timer_tick)(struct timer *timer, void *extra)
#define NETBSD_HACK_FIRST_2
#define CHECK_ALLOCATION(ptr)
void timer_update_frequency(struct timer *t, double new_freq)
struct timer * timer_add(double freq, void(*timer_tick)(struct timer *timer, void *extra), void *extra)
#define INTERRUPT_ASSERT(istruct)
int ugly_netbsd_prep_hack_sec
int ugly_netbsd_prep_hack_done
#define NETBSD_HACK_SECOND_2
#define NETBSD_HACK_FIRST_1
#define INTERRUPT_CONNECT(name, istruct)
void memory_device_register(struct memory *mem, const char *, uint64_t baseaddr, uint64_t len, int(*f)(struct cpu *, struct memory *, uint64_t, unsigned char *, size_t, int, void *), void *extra, int flags, unsigned char *dyntrans_data)
int dev_mc146818_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
addr & if(addr >=0x24 &&page !=NULL)
void machine_add_tickfunction(struct machine *machine, void(*func)(struct cpu *, void *), void *extra, int clockshift)
#define INTERRUPT_DEASSERT(istruct)