dev_sgi_gbe.cc Source File
Back to the index.
Go to the documentation of this file.
61 #define FAKE_GBE_FB_ADDRESS 0x380000000
67 #define GBE_DEFAULT_XRES 1280
68 #define GBE_DEFAULT_YRES 1024
69 #define GBE_DEFAULT_BITDEPTH 8
124 *r = 255 * ((color >> 5) & 7) / 7;
125 *g = 255 * ((color >> 2) & 7) / 7;
126 *b = (color & 3) * 85;
133 default:
fatal(
"sgi gbe get_rgb(): unimplemented mode %i\n", d->
color_mode);
143 256 *
sizeof(uint32_t));
167 unsigned char buf[16384];
168 int bytes_per_pixel = d->
bitdepth / 8;
175 if (!(d->
freeze & 0x80000000)) {
181 fatal(
"[ sgi_gbe: WARNING: Y interrupts not yet implemented. ]\n");
208 fatal(
"[ sgi_gbe: dev_sgi_gbe_tick(): tiletable = 0x%llx, bytes_per_pixel = %i ]\n", (
long long)tiletable,
222 const int max_nr_of_tiles = 256;
224 uint32_t tile[max_nr_of_tiles];
225 uint8_t alltileptrs[max_nr_of_tiles *
sizeof(uint16_t)];
228 alltileptrs,
sizeof(alltileptrs),
MEM_READ,
231 for (
int i = 0; i < 256; ++i) {
232 tile[i] = (256 * alltileptrs[i*2] + alltileptrs[i*2+1]) << 16;
235 printf(
"tile[%i] = 0x%08x\n", i, tile[i]);
239 int screensize = d->
xres * d->
yres * 3;
242 for (
int tiley = 0; tiley < max_nr_of_tiles; ++tiley) {
243 for (
int line = 0; line < 128; ++line) {
244 for (
int tilex = 0; tilex < w; ++tilex) {
245 int tilenr = tilex + tiley * w;
247 if (tilenr >= max_nr_of_tiles)
250 uint32_t base = tile[tilenr];
261 int fb_offset = (x + y * d->
xres) * 3;
262 int fb_len = (len / bytes_per_pixel) * 3;
264 if (fb_offset + fb_len > screensize) {
265 fb_len = screensize - fb_offset;
269 tiley = max_nr_of_tiles;
274 uint8_t fb_buf[512 * 3];
276 for (
int i = 0; i < 512; i+=bytes_per_pixel) {
278 if (bytes_per_pixel == 1)
280 else if (bytes_per_pixel == 2)
281 color = (buf[i]<<8) + buf[i+1];
283 color = (buf[i]<<24) + (buf[i+1]<<16)
284 + (buf[i+2]<<8)+buf[i+3];
295 x += len / bytes_per_pixel;
300 tiley = max_nr_of_tiles;
319 if (cx >= 0 && cx < d->
xres) {
320 for (y = 0; y < d->
yres; ++y)
326 if (cy >= 0 && cy < d->
yres) {
327 for (x = 0; x < d->
xres; ++x)
335 for (
int dy = 0; dy < 32; ++dy) {
336 for (
int dx = 0; dx < 32; ++dx) {
340 if (sx < 0 || sx >= d->
xres ||
341 sy < 0 || sy >= d->
yres)
344 int wordindex = dy*2 + (dx>>4);
347 int color = (word >> ((15 - (dx&15))*2)) & 3;
356 }
else if (color == 2) {
378 uint64_t idata = 0, odata = 0;
384 fatal(
"[ sgi_gbe: DEBUG: write to address 0x%llx, data"
385 "=0x%llx ]\n", (
long long)relative_addr, (
long long)idata);
389 switch (relative_addr) {
393 debug(
"[ sgi_gbe: write to ctrlstat: 0x%08x ]\n", (
int)idata);
449 d->
freeze = idata & 0x80000000;
467 odata = d->
freeze | (random() & 1 ? 0x3ff : 0x501);
472 odata = ((d->
yres-1) << 12) + d->
xres-1;
508 odata = (0 << 12) + d->
xres-1;
513 odata = (0 << 12) + d->
yres-1;
548 debug(
"[ sgi_gbe: OVR setting width in tiles = %i, partial pixels = %i ]\n",
573 debug(
"[ sgi_gbe: setting color depth to %i bits, width in tiles = %i, partial pixels = %i ]\n",
581 debug(
"[ sgi_gbe: setting PIXSIZE to 0x%08x ]\n", (
int)idata);
683 int color_index = (relative_addr -
CRMFB_CMAP) >> 2;
685 int cmap = color_index >> 8;
686 d->
palette[color_index] = idata;
690 odata = d->
palette[color_index];
704 printf(
"unimplemented CRMFB_CURSOR_BITMAP len %i\n", (
int)len);
707 int index = (relative_addr & 0xff) / 4;
716 fatal(
"[ sgi_gbe: unimplemented write to address "
717 "0x%llx, data=0x%llx ]\n",
718 (
long long)relative_addr, (
long long)idata);
720 fatal(
"[ sgi_gbe: unimplemented read from address "
721 "0x%llx ]\n", (
long long)relative_addr);
726 debug(
"[ sgi_gbe: DEBUG: read from address 0x%llx: 0x%llx ]\n",
727 (
long long)relative_addr, (
long long)odata);
757 d->
y_intr01 = (0xfff << 12) | 0xfff;
758 d->
y_intr23 = (0xfff << 12) | 0xfff;
762 for (
int i = 0; i < 256; ++i)
763 d->
palette[i] = i * 0x01010100;
#define CRMFB_MODE_TYP_RGB8
#define CRMFB_INTR_0_MASK
#define CRMFB_FRM_PIXSIZE
#define CRMFB_CURSOR_CMAP1
#define CRMFB_VT_VC_STARTXY
#define CRMFB_FRM_TILESIZE_DEPTH_SHIFT
#define CRMFB_VCMAP_ON_MASK
#define CRMFB_OVR_TILE_PTR
int dev_sgi_gbe_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
void select_palette(struct sgi_gbe_data *d, int palette_nr)
#define CRMFB_CURSOR_BITMAP
addr & if(addr >=0x24 &&page !=NULL)
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)
#define CRMFB_FRM_CONTROL
#define CRMFB_VT_FRAMELOCK
#define CRMFB_CTRLSTAT_GPIO3_INPUT
#define CRMFB_DID_CONTROL
#define CRMFB_INTR_3_MASK
#define CRMFB_OVR_CONTROL
#define CRMFB_DEVICE_ID_DEF
void machine_add_tickfunction(struct machine *machine, void(*func)(struct cpu *, void *), void *extra, int clockshift)
#define CRMFB_CTRLSTAT_CHIPID_MASK
#define CRMFB_VT_VCMAP_ON_SHIFT
#define CRMFB_FRM_TILESIZE
#define FAKE_GBE_FB_ADDRESS
void fatal(const char *fmt,...)
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
#define GBE_DEFAULT_BITDEPTH
#define CRMFB_CURSOR_CROSSHAIR
#define CRMFB_CTRLSTAT_GPIO4_INPUT
void dev_fb_resize(struct vfb_data *d, int new_xsize, int new_ysize)
int dev_fb_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
uint32_t palette[32 *256]
#define CRMFB_CTRLSTAT_GPIO5_INPUT
#define CRMFB_CTRLSTAT_INTERNAL_PCLK
#define CRMFB_MODE_TYP_RG3B2
void dev_sgi_gbe_init(struct machine *machine, struct memory *mem, uint64_t baseaddr)
#define CRMFB_MODE_TYP_I8
#define CRMFB_CURSOR_CMAP0
#define CRMFB_OVR_WIDTH_TILE
#define CRMFB_CTRLSTAT_GPIO4_SENSE
#define DEV_SGI_GBE_LENGTH
#define CRMFB_VT_DID_STARTXY
#define CRMFB_MODE_CMAP_SELECT_SHIFT
#define CRMFB_FRM_TILESIZE_RHS_SHIFT
#define CRMFB_CURSOR_CMAP2
#define CRMFB_HCMAP_ON_MASK
struct vfb_data * fb_data
#define CRMFB_FRM_TILESIZE_WIDTH_SHIFT
#define CRMFB_INTR_2_MASK
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
#define CRMFB_CTRLSTAT_GPIO6_INPUT
uint32_t selected_palette[256]
void get_rgb(struct sgi_gbe_data *d, uint32_t color, uint8_t *r, uint8_t *g, uint8_t *b)
int(* memory_rw)(struct cpu *cpu, struct memory *mem, uint64_t vaddr, unsigned char *data, size_t len, int writeflag, int cache_flags)
#define CRMFB_INTR_1_MASK
#define CRMFB_VT_HCMAP_ON_SHIFT
#define CRMFB_MODE_TYP_SHIFT
#define CRMFB_CURSOR_CONTROL
struct vfb_data * dev_fb_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, int vfb_type, int visible_xsize, int visible_ysize, int xsize, int ysize, int bit_depth, const char *name)
#define CRMFB_VT_CRS_STARTXY
uint32_t cursor_bitmap[64]
#define CHECK_ALLOCATION(ptr)
Generated on Tue Mar 24 2020 14:04:48 for GXemul by
1.8.17