/[gxemul]/upstream/0.3.8/src/devices/dev_ps2_gs.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.8/src/devices/dev_ps2_gs.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (hide annotations)
Mon Oct 8 16:19:43 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 4665 byte(s)
0.3.8
1 dpavlin 4 /*
2 dpavlin 22 * Copyright (C) 2003-2006 Anders Gavare. All rights reserved.
3 dpavlin 4 *
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 dpavlin 22 * $Id: dev_ps2_gs.c,v 1.21 2006/02/09 20:02:59 debug Exp $
29 dpavlin 4 *
30     * Playstation 2 "graphics system".
31     */
32    
33     #include <stdio.h>
34     #include <stdlib.h>
35     #include <string.h>
36    
37     #include "device.h"
38     #include "machine.h"
39     #include "memory.h"
40     #include "misc.h"
41    
42    
43     #define DEV_PS2_GS_LENGTH 0x2000
44    
45     /* NOTE/TODO: This should be the same as in ps2_stuff: */
46     #define DEV_PS2_GIF_FAKE_BASE 0x50000000
47    
48     #define N_GS_REGS 0x108
49    
50     struct gs_data {
51     uint64_t reg[N_GS_REGS]; /* GS registers */
52     };
53    
54     #define GS_S_PMODE_REG 0x00
55     #define GS_S_SMODE1_REG 0x01
56     #define GS_S_SMODE2_REG 0x02
57     #define GS_S_SRFSH_REG 0x03
58     #define GS_S_SYNCH1_REG 0x04
59     #define GS_S_SYNCH2_REG 0x05
60     #define GS_S_SYNCV_REG 0x06
61     #define GS_S_DISPFB1_REG 0x07
62     #define GS_S_DISPLAY1_REG 0x08
63     #define GS_S_DISPFB2_REG 0x09
64     #define GS_S_DISPLAY2_REG 0x0a
65     #define GS_S_EXTBUF_REG0 0x0b
66     #define GS_S_EXTDATA_REG 0x0c
67     #define GS_S_EXTWRITE_REG 0x0d
68     #define GS_S_BGCOLOR_REG 0x0e
69    
70     char *gs_reg_names[15] = {
71     "PMODE", "SMODE1", "SMODE2", "SRFSH",
72     "SYNCH1", "SYNCH2", "SYNCV", "DISPFB1",
73     "DISPLAY1", "DISPFB2", "DISPLAY2", "EXTBUF",
74     "EXTDATA", "EXTWRITE", "BGCOLOR"
75     };
76    
77     #define GS_S_CSR_REG 0x100
78     #define GS_S_IMR_REG 0x101
79     #define GS_S_BUSDIR_REG 0x104
80     #define GS_S_SIGLBLID_REG 0x108
81    
82     char *gs_reg_high_names[4] = {
83     "CSR", "IMR", "BUSDIR", "SIGLBLID"
84     };
85    
86    
87     /*
88     * dev_ps2_gs_access():
89     */
90 dpavlin 22 DEVICE_ACCESS(ps2_gs)
91 dpavlin 4 {
92     uint64_t idata = 0, odata = 0;
93 dpavlin 22 size_t i;
94     int regnr;
95 dpavlin 4 struct gs_data *d = extra;
96    
97 dpavlin 18 if (writeflag == MEM_WRITE)
98     idata = memory_readmax64(cpu, data, len);
99    
100 dpavlin 4 regnr = relative_addr / 16;
101     if (relative_addr & 0xf) {
102     debug("[ gs unaligned access, addr 0x%x ]\n",
103     (int)relative_addr);
104     return 0;
105     }
106    
107     /* Empty the GS FIFO: */
108     d->reg[GS_S_CSR_REG] &= ~(3 << 14);
109     d->reg[GS_S_CSR_REG] |= (1 << 14);
110    
111     switch (relative_addr) {
112     default:
113     if (writeflag==MEM_READ) {
114     debug("[ gs read from addr 0x%x ]\n",
115     (int)relative_addr);
116     odata = d->reg[regnr];
117     } else {
118     debug("[ gs write to addr 0x%x:", (int)relative_addr);
119     for (i=0; i<len; i++)
120     debug(" %02x", data[i]);
121     debug(" ]\n");
122     d->reg[regnr] = idata;
123     return 1;
124     }
125     }
126    
127     if (writeflag == MEM_READ)
128     memory_writemax64(cpu, data, len, odata);
129    
130     return 1;
131     }
132    
133    
134     /*
135     * devinit_ps2_gs():
136     *
137     * Initialize the Playstation 2 graphics system. This is a bit tricky.
138     * 'gs' is the memory mapped device, as seen by the main processor.
139     * 'gif' is another thing which has its own memory. DMA is used to
140     * transfer stuff to the gif from the main memory.
141     * There is also a framebuffer, which is separated from the main
142     * memory.
143     *
144     * TODO: Make this clearer.
145     */
146 dpavlin 22 DEVINIT(ps2_gs)
147 dpavlin 4 {
148     struct gs_data *d;
149     char str[100];
150    
151     d = malloc(sizeof(struct gs_data));
152     if (d == NULL) {
153     fprintf(stderr, "out of memory\n");
154     exit(1);
155     }
156     memset(d, 0, sizeof(struct gs_data));
157    
158     snprintf(str, sizeof(str) - 1, "ps2_gif addr=0x%llx",
159     (long long)DEV_PS2_GIF_FAKE_BASE);
160     device_add(devinit->machine, str);
161    
162     memory_device_register(devinit->machine->memory, devinit->name,
163     devinit->addr, DEV_PS2_GS_LENGTH, dev_ps2_gs_access, d,
164 dpavlin 20 DM_DEFAULT, NULL);
165 dpavlin 4
166     return 1;
167     }
168    

  ViewVC Help
Powered by ViewVC 1.1.26