121 return dma_buf[ofs+0] + (dma_buf[ofs+1] << 8) +
122 (dma_buf[ofs+2] << 16) + (dma_buf[ofs+3] << 24);
124 return dma_buf[ofs+3] + (dma_buf[ofs+2] << 8) +
125 (dma_buf[ofs+1] << 16) + (dma_buf[ofs+0] << 24);
140 unsigned char dma_buf[32768];
141 size_t dma_len =
sizeof(dma_buf);
155 memmove(dma_buf, &d->
sram[sys_addr & 0x1ffff], dma_len);
159 cmdword = dma_buf[0] + (dma_buf[1] << 8) +
160 (dma_buf[2] << 16) + (dma_buf[3] << 24);
162 cmdword = dma_buf[3] + (dma_buf[2] << 8) +
163 (dma_buf[1] << 16) + (dma_buf[0] << 24);
166 debug(
"[ px: dma from 0x%08x: ", (
int)sys_addr);
169 switch (cmdword & 0xf) {
178 debug(
"0x%x (?)", cmdword & 0xf);
182 switch (cmdword & 0x30) {
188 debug(
"0x%x (?)", cmdword & 0x30);
192 switch (cmdword & 0xc0) {
198 debug(
"0x%x (?)", cmdword & 0xc0);
202 switch (cmdword & 0x300) {
207 debug(
"0x%x (?)", cmdword & 0x300);
211 switch (cmdword & 0xc00) {
216 debug(
"0x%x (?)", cmdword & 0xc00);
230 for (i=0; i<dma_len; i++)
231 debug(
" %02x", dma_buf[i]);
238 if (cmdword == 0x405) {
240 uint32_t spannr, ofs;
241 uint32_t span_len, span_src, span_dst;
245 nspans = dma_buf[4] + (dma_buf[5] << 8) +
246 (dma_buf[6] << 16) + (dma_buf[7] << 24);
248 nspans = dma_buf[7] + (dma_buf[6] << 8) +
249 (dma_buf[5] << 16) + (dma_buf[4] << 24);
252 lw = dma_buf[16] + (dma_buf[17] << 8) +
253 (dma_buf[18] << 16) + (dma_buf[19] << 24);
255 lw = dma_buf[19] + (dma_buf[18] << 8) +
256 (dma_buf[17] << 16) + (dma_buf[16] << 24);
262 debug(
"[ px: copyspans: nspans = %i, lw = %i ]\n", nspans, lw);
266 if (dma_len < 4*(5 + nspans*3)) {
267 dma_len = 4 * (5+nspans*3);
273 memmove(dma_buf, &d->
sram[sys_addr & 0x1ffff],
278 for (spannr=0; spannr<nspans; spannr++) {
280 span_len = dma_buf[ofs+0] + (dma_buf[ofs+1] <<
281 8) + (dma_buf[ofs+2] << 16) +
282 (dma_buf[ofs+3] << 24);
284 span_len = dma_buf[ofs+3] + (dma_buf[ofs+2] <<
285 8) + (dma_buf[ofs+1] << 16) +
286 (dma_buf[ofs+0] << 24);
290 span_src = dma_buf[ofs+0] + (dma_buf[ofs+1] <<
291 8) + (dma_buf[ofs+2] << 16) +
292 (dma_buf[ofs+3] << 24);
294 span_src = dma_buf[ofs+3] + (dma_buf[ofs+2] <<
295 8) + (dma_buf[ofs+1] << 16) +
296 (dma_buf[ofs+0] << 24);
300 span_dst = dma_buf[ofs+0] + (dma_buf[ofs+1] <<
301 8) + (dma_buf[ofs+2] << 16) +
302 (dma_buf[ofs+3] << 24);
304 span_dst = dma_buf[ofs+3] + (dma_buf[ofs+2] <<
305 8) + (dma_buf[ofs+1] << 16) +
306 (dma_buf[ofs+0] << 24);
321 + span_src *
PX_XSIZE * bytesperpixel, span_len *
338 if (cmdword == 0x411) {
339 uint32_t v1, v2, attr;
343 int bg_r, bg_g, bg_b;
352 lw = dma_buf[16] + (dma_buf[17] << 8) +
353 (dma_buf[18] << 16) + (dma_buf[19] << 24);
355 lw = dma_buf[19] + (dma_buf[18] << 8) +
356 (dma_buf[17] << 16) + (dma_buf[16] << 24);
359 v1 = dma_buf[24] + (dma_buf[25] << 8) +
360 (dma_buf[26] << 16) + (dma_buf[27] << 24);
362 v1 = dma_buf[27] + (dma_buf[26] << 8) +
363 (dma_buf[25] << 16) + (dma_buf[24] << 24);
366 v2 = dma_buf[28] + (dma_buf[29] << 8) +
367 (dma_buf[30] << 16) + (dma_buf[31] << 24);
369 v2 = dma_buf[31] + (dma_buf[30] << 8) +
370 (dma_buf[29] << 16) + (dma_buf[28] << 24);
372 bg_r = (attr >> 16) & 255;
373 bg_g = (attr >> 8) & 255;
376 bg_r = bg_g = bg_b = 0;
379 bg_r = bg_g = bg_b = 192;
381 bg_r = bg_g = bg_b = 255;
386 x = (v1 >> 19) & 2047;
387 y = (v1 >> 3) & 1023;
388 x2 = (v2 >> 19) & 2047;
389 y2 = (v2 >> 3) & 1023;
397 debug(
"[ px: clear/fill: v1 = 0x%08x v2 = 0x%08x " 398 "lw=%i x=%i y=%i x2=%i y2=%i ]\n", (
int)v1, (
int)v2,
401 if (bytesperpixel == 3) {
403 for (xi=0; xi<x2-x; xi++) {
405 pixels[xi*3 + 0] = bg_r;
406 pixels[xi*3 + 1] = bg_g;
407 pixels[xi*3 + 2] = bg_b;
410 memset(pixels, attr, (x2 - x) * bytesperpixel);
417 for (fb_y=y; fb_y < y2 + lw; fb_y ++) {
419 * bytesperpixel, pixels, (x2-x)*bytesperpixel);
429 if (cmdword == 0xa21) {
431 unsigned char pixels[16 * 3];
433 uint32_t v1, v2, fgcolor, bgcolor;
434 int x, y, x2,y2, i, maxi;
437 int fg_r, fg_g, fg_b;
438 int bg_r, bg_g, bg_b;
450 fg_r = (fgcolor >> 16) & 255;
451 fg_g = (fgcolor >> 8) & 255;
452 fg_b = fgcolor & 255;
454 fg_r = fg_g = fg_b = 0;
457 fg_r = fg_g = fg_b = 192;
459 fg_r = fg_g = fg_b = 255;
461 bg_r = (bgcolor >> 16) & 255;
462 bg_g = (bgcolor >> 8) & 255;
463 bg_b = bgcolor & 255;
465 bg_r = bg_g = bg_b = 0;
468 bg_r = bg_g = bg_b = 192;
470 bg_r = bg_g = bg_b = 255;
472 x = (v1 >> 19) & 2047;
473 y = ((v1 - 63) >> 3) & 1023;
474 x2 = (v2 >> 19) & 2047;
475 y2 = ((v2 - 63) >> 3) & 1023;
478 debug(
"[ px putchar: v1 = 0x%08x v2 = 0x%08x x=%i y=%i ]\n",
479 (
int)v1, (
int)v2, x,y, x2,y2);
492 for (i=4; i<maxi; i++) {
498 for (j=0; j<2; j++) {
499 for (xbit = 0; xbit < 8; xbit ++) {
500 if (bytesperpixel == 3) {
504 pixels[xbit * 3 + 0] =
505 (dma_buf[i*4 + j*2 + 0] &
506 (1 << xbit))? fg_r : bg_r;
507 pixels[xbit * 3 + 1] =
508 (dma_buf[i*4 + j*2 + 0] &
509 (1 << xbit))? fg_g : bg_g;
510 pixels[xbit * 3 + 2] =
511 (dma_buf[i*4 + j*2 + 0] &
512 (1 << xbit))? fg_b : bg_b;
513 pixels[(xbit + 8) * 3 + 0] =
514 (dma_buf[i*4 + j*2 + 1] &
515 (1 << xbit))? fg_r : bg_r;
516 pixels[(xbit + 8) * 3 + 1] =
517 (dma_buf[i*4 + j*2 + 1] &
518 (1 << xbit))? fg_g : bg_g;
519 pixels[(xbit + 8) * 3 + 2] =
520 (dma_buf[i*4 + j*2 + 1] &
521 (1 << xbit))? fg_b : bg_b;
524 pixels[xbit] = (dma_buf[i*4 +
525 j*2 + 0] & (1 << xbit))?
528 pixels[xbit + 8] = (dma_buf[i*4
529 + j*2 + 1] & (1 << xbit))?
537 pixels, pixels_len * bytesperpixel);
558 uint64_t idata = 0, odata = 0;
565 if (relative_addr < 0x0c0000) {
589 sys_addr = ((relative_addr << 9) & 0x7800) +
590 ((relative_addr << 6) & 0xffff8000);
605 if (relative_addr >= 0x200000 && relative_addr < 0x280000) {
607 fatal(
"WARNING: the vdac should be at this " 608 "address. overlap problems?\n");
611 for (i=0; i<len; i++)
612 d->
sram[relative_addr - 0x200000 + i] =
data[i];
629 switch (relative_addr) {
633 debug(
"[ px: read from hsync: 0x%08llx ]\n",
636 debug(
"[ px: write to hsync: 0x%08llx ]\n",
643 debug(
"[ px: read from hsync2: 0x%08llx ]\n",
646 debug(
"[ px: write to hsync2: 0x%08llx ]\n",
653 debug(
"[ px: read from hblank: 0x%08llx ]\n",
656 debug(
"[ px: write to hblank: 0x%08llx ]\n",
663 debug(
"[ px: read from vsync: 0x%08llx ]\n",
666 debug(
"[ px: write to vsync: 0x%08llx ]\n",
673 debug(
"[ px: read from vblank: 0x%08llx ]\n",
676 debug(
"[ px: write to vblank: 0x%08llx ]\n",
688 debug(
"[ px: read from ipdvint: 0x%08llx ]\n",
698 debug(
"[ px: write to ipdvint: 0x%08llx ]\n",
705 debug(
"[ px: read from sticsr: 0x%08llx ]\n",
708 debug(
"[ px: write to sticsr: 0x%08llx ]\n",
715 debug(
"[ px: read from buscsr: 0x%08llx ]\n",
718 debug(
"[ px: write to buscsr: 0x%08llx ]\n",
727 debug(
"[ px: read from modcl: 0x%llx ]\n",
730 debug(
"[ px: write to modcl: 0x%llx ]\n",
737 debug(
"[ px: read from addr 0x%x: 0x%llx ]\n",
738 (
int)relative_addr, (
long long)odata);
740 debug(
"[ px: write to addr 0x%x: 0x%llx ]\n",
741 (
int)relative_addr, (
long long)idata);
753 uint64_t baseaddr,
int px_type,
const char *irq_path)
758 memset(d, 0,
sizeof(
struct px_data));
786 fatal(
"dev_px_init(): unimplemented px_type\n");
792 fprintf(stderr,
"dev_px_init(): out of memory (1)\n");
799 fprintf(stderr,
"dev_px_init(): out of memory (2)\n");
815 fatal(
"dev_px_init(): unimplemented px_type\n");
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
#define STAMP_CMD_READSPANS
void fatal(const char *fmt,...)
#define STAMP_LW_PERPRIMATIVE
int dev_px_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
uint32_t px_readword(struct cpu *cpu, unsigned char *dma_buf, int ofs)
void dev_px_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, int px_type, const char *irq_path)
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 STAMP_XY_PERPACKET
void dev_px_dma(struct cpu *cpu, uint32_t sys_addr, struct px_data *d)
#define STAMP_LW_PERPACKET
struct vfb_data * vfb_data
#define STAMP_CMD_COPYSPANS
#define EMUL_LITTLE_ENDIAN
#define CHECK_ALLOCATION(ptr)
struct memory * memory_new(uint64_t physical_max, int arch)
int(* memory_rw)(struct cpu *cpu, struct memory *mem, uint64_t vaddr, unsigned char *data, size_t len, int writeflag, int cache_flags)
void dev_bt459_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, uint64_t baseaddr_irq, struct vfb_data *vfb_data, int planes, const char *irq_path, int type)
#define INTERRUPT_ASSERT(istruct)
#define DEV_PX_TYPE_PXGPLUS
unsigned char sram[128 *1024]
#define INTERRUPT_CONNECT(name, istruct)
#define STAMP_CMD_TRIANGLES
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
#define STAMP_CMD_WRITESPANS
unsigned char * framebuffer
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 STAMP_XY_PERPRIMATIVE
#define DEV_PX_TYPE_PXGPLUSTURBO
void machine_add_tickfunction(struct machine *machine, void(*func)(struct cpu *, void *), void *extra, int clockshift)