/[gxemul]/upstream/0.3.1/devices/dev_ps2_spd.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /upstream/0.3.1/devices/dev_ps2_spd.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (hide annotations)
Mon Oct 8 16:17:52 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 3630 byte(s)
0.3.1
1 dpavlin 2 /*
2     * Copyright (C) 2004-2005 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     * $Id: dev_ps2_spd.c,v 1.8 2005/02/21 09:37:43 debug Exp $
29     *
30     * Playstation 2 "SPD" harddisk controller.
31     *
32     * TODO
33     0x40: 0
34     0x42: 1
35     0x44: 2
36     0x46: 3
37     0x48: 4
38     0x4a: 5
39     0x4c: sdh 6
40     0x4e: status 7
41     */
42    
43     #include <stdio.h>
44     #include <stdlib.h>
45     #include <string.h>
46    
47     #include "cpu.h"
48     #include "memory.h"
49     #include "misc.h"
50     #include "devices.h"
51    
52    
53     struct ps2_spd_data {
54     uint64_t wdcaddr;
55     };
56    
57    
58     /*
59     * dev_ps2_spd_access():
60     */
61     int dev_ps2_spd_access(struct cpu *cpu, struct memory *mem,
62     uint64_t relative_addr, unsigned char *data, size_t len,
63     int writeflag, void *extra)
64     {
65     struct ps2_spd_data *d = extra;
66     uint64_t idata = 0, odata = 0;
67    
68     idata = memory_readmax64(cpu, data, len);
69    
70     switch (relative_addr) {
71     case 0x40:
72     case 0x42:
73     case 0x44:
74     case 0x46:
75     case 0x48:
76     case 0x4a:
77     case 0x4c:
78     case 0x4e:
79     debug("[ ps2_spd: wdc access ]\n");
80     cpu->memory_rw(cpu, mem, (relative_addr - 0x40) / 2 +
81     d->wdcaddr, data, len, writeflag, PHYSICAL);
82     return 1;
83     case 0x5c: /* aux control */
84     debug("[ ps2_spd: wdc access (2) ]\n");
85     cpu->memory_rw(cpu, mem, d->wdcaddr + 0x206, data, len,
86     writeflag, PHYSICAL);
87     return 1;
88     default:
89     if (writeflag==MEM_READ) {
90     debug("[ ps2_spd: read from addr 0x%x: 0x%llx ]\n",
91     (int)relative_addr, (long long)odata);
92     } else {
93     debug("[ ps2_spd: write to addr 0x%x: 0x%llx ]\n",
94     (int)relative_addr, (long long)idata);
95     }
96     }
97    
98     if (writeflag == MEM_READ)
99     memory_writemax64(cpu, data, len, odata);
100    
101     return 1;
102     }
103    
104    
105     /*
106     * dev_ps2_spd_init():
107     */
108     void dev_ps2_spd_init(struct machine *machine, struct memory *mem,
109     uint64_t baseaddr)
110     {
111     struct ps2_spd_data *d;
112    
113     d = malloc(sizeof(struct ps2_spd_data));
114     if (d == NULL) {
115     fprintf(stderr, "out of memory\n");
116     exit(1);
117     }
118     memset(d, 0, sizeof(struct ps2_spd_data));
119     d->wdcaddr = baseaddr + DEV_PS2_SPD_LENGTH;
120    
121     memory_device_register(mem, "ps2_spd", baseaddr, DEV_PS2_SPD_LENGTH,
122     dev_ps2_spd_access, d, MEM_DEFAULT, NULL);
123    
124     /* Register a generic wdc device at a bogus address: */
125     dev_wdc_init(machine, mem, d->wdcaddr, 0 /* TODO: irq */ , 0);
126     }
127    

  ViewVC Help
Powered by ViewVC 1.1.26