dev_dreamcast_rtc.cc Source File
Back to the index.
src
devices
dev_dreamcast_rtc.cc
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2006-2014 Anders Gavare. All rights reserved.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are met:
6
*
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
12
* 3. The name of the author may not be used to endorse or promote products
13
* derived from this software without specific prior written permission.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25
* SUCH DAMAGE.
26
*
27
*
28
* COMMENT: Dreamcast Real-Time Clock
29
*
30
* Pretty basic; two 32-bit words at physical addresses 0x00710000 and
31
* 0x00710004 hold the high and low 16-bit parts, respectively, of the
32
* system's 32-bit tv_sec value.
33
*
34
* The only difference from the raw Unix concept is that the Dreamcast's
35
* clock is based at 1950 instead of 1970.
36
*/
37
38
#include <stdio.h>
39
#include <stdlib.h>
40
#include <string.h>
41
#include <sys/time.h>
42
43
#include "
cpu.h
"
44
#include "
device.h
"
45
#include "
machine.h
"
46
#include "
memory.h
"
47
#include "
misc.h
"
48
49
50
#define debug fatal
51
52
struct
dreamcast_rtc_data
{
53
int
dummy
;
54
};
55
56
57
DEVICE_ACCESS
(dreamcast_rtc)
58
{
59
/* struct dreamcast_rtc_data *d = extra; */
60
uint64_t idata = 0, odata = 0;
61
struct
timeval tv;
62
63
if
(writeflag ==
MEM_WRITE
)
64
idata =
memory_readmax64
(
cpu
,
data
, len);
65
66
switch
(relative_addr) {
67
68
case
0:
69
case
4:
70
/*
71
* While writing to the RTC could set the date/time of the
72
* host, that would probably be very annoying. For now,
73
* simply ignore writes.
74
*/
75
if
(writeflag ==
MEM_WRITE
)
76
break
;
77
78
gettimeofday(&tv, NULL);
79
80
/* Offset by 20 years: */
81
odata = tv.tv_sec + 631152000;
82
83
if
(relative_addr == 0)
84
odata = (odata >> 16) & 0xffff;
85
else
86
odata &= 0xffff;
87
break
;
88
89
case
8:
90
/*
91
* The Dreamcast PROM writes a 1 here when setting the
92
* date/time. Let's ignore it for now.
93
*/
94
break
;
95
96
default
:
97
if
(writeflag ==
MEM_READ
) {
98
fatal
(
"[ dreamcast_rtc: read from addr 0x%x ]\n"
,
99
(
int
)relative_addr);
100
}
else
{
101
fatal
(
"[ dreamcast_rtc: write to addr 0x%x: 0x%x ]\n"
,
102
(
int
)relative_addr, (
int
)idata);
103
}
104
}
105
106
if
(writeflag ==
MEM_READ
)
107
memory_writemax64
(
cpu
,
data
, len, odata);
108
109
return
1;
110
}
111
112
113
DEVINIT
(dreamcast_rtc)
114
{
115
struct
dreamcast_rtc_data
*d;
116
117
CHECK_ALLOCATION
(d = (
struct
dreamcast_rtc_data
*) malloc(
sizeof
(
struct
dreamcast_rtc_data
)));
118
memset(d, 0,
sizeof
(
struct
dreamcast_rtc_data
));
119
120
memory_device_register
(
devinit
->
machine
->
memory
,
devinit
->
name
,
121
0x00710000, 0x100, dev_dreamcast_rtc_access, d,
DM_DEFAULT
, NULL);
122
123
return
1;
124
}
125
data
u_short data
Definition:
siireg.h:79
memory_device_register
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)
Definition:
memory.cc:339
MEM_READ
#define MEM_READ
Definition:
memory.h:116
DM_DEFAULT
#define DM_DEFAULT
Definition:
memory.h:130
devinit::machine
struct machine * machine
Definition:
device.h:41
device.h
MEM_WRITE
#define MEM_WRITE
Definition:
memory.h:117
fatal
void fatal(const char *fmt,...)
Definition:
main.cc:152
misc.h
memory_readmax64
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
Definition:
memory.cc:55
machine.h
devinit::name
char * name
Definition:
device.h:43
devinit
Definition:
device.h:40
cpu.h
machine::memory
struct memory * memory
Definition:
machine.h:126
dreamcast_rtc_data
Definition:
dev_dreamcast_rtc.cc:52
memory_writemax64
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
Definition:
memory.cc:89
DEVINIT
DEVINIT(dreamcast_rtc)
Definition:
dev_dreamcast_rtc.cc:113
cpu
Definition:
cpu.h:326
DEVICE_ACCESS
DEVICE_ACCESS(dreamcast_rtc)
Definition:
dev_dreamcast_rtc.cc:57
dreamcast_rtc_data::dummy
int dummy
Definition:
dev_dreamcast_rtc.cc:53
memory.h
CHECK_ALLOCATION
#define CHECK_ALLOCATION(ptr)
Definition:
misc.h:239
Generated on Tue Mar 24 2020 14:04:48 for GXemul by
1.8.17