Statistics
| Branch: | Revision:

root / hw / tcx.c @ 420557e8

History | View | Annotate | Download (4.9 kB)

1 420557e8 bellard
/*
2 420557e8 bellard
 * QEMU Sun4m System Emulator
3 420557e8 bellard
 * 
4 420557e8 bellard
 * Copyright (c) 2003-2004 Fabrice Bellard
5 420557e8 bellard
 * 
6 420557e8 bellard
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 420557e8 bellard
 * of this software and associated documentation files (the "Software"), to deal
8 420557e8 bellard
 * in the Software without restriction, including without limitation the rights
9 420557e8 bellard
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 420557e8 bellard
 * copies of the Software, and to permit persons to whom the Software is
11 420557e8 bellard
 * furnished to do so, subject to the following conditions:
12 420557e8 bellard
 *
13 420557e8 bellard
 * The above copyright notice and this permission notice shall be included in
14 420557e8 bellard
 * all copies or substantial portions of the Software.
15 420557e8 bellard
 *
16 420557e8 bellard
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 420557e8 bellard
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 420557e8 bellard
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 420557e8 bellard
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 420557e8 bellard
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 420557e8 bellard
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 420557e8 bellard
 * THE SOFTWARE.
23 420557e8 bellard
 */
24 420557e8 bellard
#include "vl.h"
25 420557e8 bellard
26 420557e8 bellard
#define PHYS_JJ_TCX_FB        0x50800000        /* Start address, frame buffer body */
27 420557e8 bellard
#define PHYS_JJ_TCX_0E        0x5E000000        /* Top address, one byte used. */
28 420557e8 bellard
29 420557e8 bellard
#define MAXX 1024
30 420557e8 bellard
#define MAXY 768
31 420557e8 bellard
#define XSZ (8*80)
32 420557e8 bellard
#define YSZ (24*11)
33 420557e8 bellard
#define XOFF (MAXX-XSZ)
34 420557e8 bellard
#define YOFF (MAXY-YSZ)
35 420557e8 bellard
36 420557e8 bellard
#define DEBUG_VGA_MEM
37 420557e8 bellard
38 420557e8 bellard
typedef struct TCXState {
39 420557e8 bellard
    uint8_t *vram_ptr;
40 420557e8 bellard
    unsigned long vram_offset;
41 420557e8 bellard
    unsigned int vram_size;
42 420557e8 bellard
    DisplayState *ds;
43 420557e8 bellard
} TCXState;
44 420557e8 bellard
45 420557e8 bellard
static TCXState *ts;
46 420557e8 bellard
47 420557e8 bellard
static int tcx_io_memory;
48 420557e8 bellard
49 420557e8 bellard
void vga_update_display()
50 420557e8 bellard
{
51 420557e8 bellard
    dpy_update(ts->ds, 0, 0, XSZ, YSZ);
52 420557e8 bellard
}
53 420557e8 bellard
54 420557e8 bellard
static uint32_t tcx_mem_readb(void *opaque, target_phys_addr_t addr)
55 420557e8 bellard
{
56 420557e8 bellard
    TCXState *s = opaque;
57 420557e8 bellard
    uint32_t saddr;
58 420557e8 bellard
    unsigned int x, y;
59 420557e8 bellard
    char *sptr;
60 420557e8 bellard
61 420557e8 bellard
    saddr = addr - PHYS_JJ_TCX_FB - YOFF*MAXX - XOFF;
62 420557e8 bellard
    y = saddr / MAXX;
63 420557e8 bellard
    x = saddr - y * MAXX;
64 420557e8 bellard
    if (x < MAXX && y < MAXY) {
65 420557e8 bellard
        sptr =         s->ds->data;
66 420557e8 bellard
        if (sptr)
67 420557e8 bellard
            return sptr[y * s->ds->linesize + x*4];
68 420557e8 bellard
    }
69 420557e8 bellard
    return 0;
70 420557e8 bellard
}
71 420557e8 bellard
72 420557e8 bellard
static uint32_t tcx_mem_readw(void *opaque, target_phys_addr_t addr)
73 420557e8 bellard
{
74 420557e8 bellard
    uint32_t v;
75 420557e8 bellard
#ifdef TARGET_WORDS_BIGENDIAN
76 420557e8 bellard
    v = tcx_mem_readb(opaque, addr) << 8;
77 420557e8 bellard
    v |= tcx_mem_readb(opaque, addr + 1);
78 420557e8 bellard
#else
79 420557e8 bellard
    v = tcx_mem_readb(opaque, addr);
80 420557e8 bellard
    v |= tcx_mem_readb(opaque, addr + 1) << 8;
81 420557e8 bellard
#endif
82 420557e8 bellard
    return v;
83 420557e8 bellard
}
84 420557e8 bellard
85 420557e8 bellard
static uint32_t tcx_mem_readl(void *opaque, target_phys_addr_t addr)
86 420557e8 bellard
{
87 420557e8 bellard
    uint32_t v;
88 420557e8 bellard
#ifdef TARGET_WORDS_BIGENDIAN
89 420557e8 bellard
    v = tcx_mem_readb(opaque, addr) << 24;
90 420557e8 bellard
    v |= tcx_mem_readb(opaque, addr + 1) << 16;
91 420557e8 bellard
    v |= tcx_mem_readb(opaque, addr + 2) << 8;
92 420557e8 bellard
    v |= tcx_mem_readb(opaque, addr + 3);
93 420557e8 bellard
#else
94 420557e8 bellard
    v = tcx_mem_readb(opaque, addr);
95 420557e8 bellard
    v |= tcx_mem_readb(opaque, addr + 1) << 8;
96 420557e8 bellard
    v |= tcx_mem_readb(opaque, addr + 2) << 16;
97 420557e8 bellard
    v |= tcx_mem_readb(opaque, addr + 3) << 24;
98 420557e8 bellard
#endif
99 420557e8 bellard
    return v;
100 420557e8 bellard
}
101 420557e8 bellard
102 420557e8 bellard
/* called for accesses between 0xa0000 and 0xc0000 */
103 420557e8 bellard
static void tcx_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
104 420557e8 bellard
{
105 420557e8 bellard
    TCXState *s = opaque;
106 420557e8 bellard
    uint32_t saddr;
107 420557e8 bellard
    unsigned int x, y;
108 420557e8 bellard
    char *sptr;
109 420557e8 bellard
110 420557e8 bellard
    saddr = addr - PHYS_JJ_TCX_FB - YOFF*MAXX - XOFF;
111 420557e8 bellard
    y = saddr / MAXX;
112 420557e8 bellard
    x = saddr - y * MAXX;
113 420557e8 bellard
    if (x < MAXX && y < MAXY) {
114 420557e8 bellard
        sptr =         s->ds->data;
115 420557e8 bellard
        if (sptr) {
116 420557e8 bellard
            sptr[y * s->ds->linesize + x*4] = val;
117 420557e8 bellard
            sptr[y * s->ds->linesize + x*4+1] = val;
118 420557e8 bellard
            sptr[y * s->ds->linesize + x*4+2] = val;
119 420557e8 bellard
            cpu_physical_memory_set_dirty(addr);
120 420557e8 bellard
        }
121 420557e8 bellard
    }
122 420557e8 bellard
}
123 420557e8 bellard
124 420557e8 bellard
static void tcx_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
125 420557e8 bellard
{
126 420557e8 bellard
#ifdef TARGET_WORDS_BIGENDIAN
127 420557e8 bellard
    tcx_mem_writeb(opaque, addr, (val >> 8) & 0xff);
128 420557e8 bellard
    tcx_mem_writeb(opaque, addr + 1, val & 0xff);
129 420557e8 bellard
#else
130 420557e8 bellard
    tcx_mem_writeb(opaque, addr, val & 0xff);
131 420557e8 bellard
    tcx_mem_writeb(opaque, addr + 1, (val >> 8) & 0xff);
132 420557e8 bellard
#endif
133 420557e8 bellard
}
134 420557e8 bellard
135 420557e8 bellard
static void tcx_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
136 420557e8 bellard
{
137 420557e8 bellard
#ifdef TARGET_WORDS_BIGENDIAN
138 420557e8 bellard
    tcx_mem_writeb(opaque, addr, (val >> 24) & 0xff);
139 420557e8 bellard
    tcx_mem_writeb(opaque, addr + 1, (val >> 16) & 0xff);
140 420557e8 bellard
    tcx_mem_writeb(opaque, addr + 2, (val >> 8) & 0xff);
141 420557e8 bellard
    tcx_mem_writeb(opaque, addr + 3, val & 0xff);
142 420557e8 bellard
#else
143 420557e8 bellard
    tcx_mem_writeb(opaque, addr, val & 0xff);
144 420557e8 bellard
    tcx_mem_writeb(opaque, addr + 1, (val >> 8) & 0xff);
145 420557e8 bellard
    tcx_mem_writeb(opaque, addr + 2, (val >> 16) & 0xff);
146 420557e8 bellard
    tcx_mem_writeb(opaque, addr + 3, (val >> 24) & 0xff);
147 420557e8 bellard
#endif
148 420557e8 bellard
}
149 420557e8 bellard
150 420557e8 bellard
static CPUReadMemoryFunc *tcx_mem_read[3] = {
151 420557e8 bellard
    tcx_mem_readb,
152 420557e8 bellard
    tcx_mem_readw,
153 420557e8 bellard
    tcx_mem_readl,
154 420557e8 bellard
};
155 420557e8 bellard
156 420557e8 bellard
static CPUWriteMemoryFunc *tcx_mem_write[3] = {
157 420557e8 bellard
    tcx_mem_writeb,
158 420557e8 bellard
    tcx_mem_writew,
159 420557e8 bellard
    tcx_mem_writel,
160 420557e8 bellard
};
161 420557e8 bellard
162 420557e8 bellard
void tcx_init(DisplayState *ds)
163 420557e8 bellard
{
164 420557e8 bellard
    TCXState *s;
165 420557e8 bellard
166 420557e8 bellard
    s = qemu_mallocz(sizeof(TCXState));
167 420557e8 bellard
    if (!s)
168 420557e8 bellard
        return;
169 420557e8 bellard
    s->ds = ds;
170 420557e8 bellard
    ts = s;
171 420557e8 bellard
    tcx_io_memory = cpu_register_io_memory(0, tcx_mem_read, tcx_mem_write, s);
172 420557e8 bellard
    cpu_register_physical_memory(PHYS_JJ_TCX_FB, 0x100000, 
173 420557e8 bellard
                                 tcx_io_memory);
174 420557e8 bellard
    dpy_resize(s->ds, XSZ, YSZ);
175 420557e8 bellard
}