void convertSave2n64(int savetype,const BYTE*data_in,membuf&data_out,int&size) { if(savetype==st_n64eep4k) { data_out.resize(st_n64eep4k); memset(data_out,0,st_n64eep4k); size=Min(size,st_n64eep4k*16); neo2n64(data_in,data_out,size); size=st_n64eep4k; } if(savetype==st_n64eep16k) { data_out.resize(st_n64eep16k); memset(data_out,0,st_n64eep16k); size=Min(size,st_n64eep16k*16); neo2n64(data_in,data_out,size); size=st_n64eep16k; } if(savetype==st_n64sram) { data_out.resize(st_n64sram); memset(data_out,0,st_n64sram); size=Min(size,st_n64sram); memcpy(data_out,data_in,size); wswap((BYTE*)(char*)data_out,size); size=st_n64sram; } if(savetype==st_n64flash) { data_out.resize(st_n64flash); memset(data_out,0,st_n64flash); size=Min(size,st_n64flash); memcpy(data_out,data_in,size); wswap((BYTE*)(char*)data_out,size); size=st_n64flash; } }
/* create .bmp file from framebuffer data*/ int GdCaptureScreen(char *path) { #if defined(HAVE_FILEIO) int ifd, i, j; FILE * ofp; int cx, cy, extra, bpp, bytespp, ncolors, sizecolortable; unsigned long rmask, gmask, bmask; unsigned char *cptr; unsigned short *sptr; unsigned long *lptr; BMPHEAD bmp; unsigned char buf[2048*4]; ofp = fopen(path, "wb"); if (!ofp) return 1; ifd = open("/dev/fb0", 0); cx = scrdev.xvirtres; cy = scrdev.yvirtres; bpp = scrdev.bpp; bytespp = (bpp+7)/8; /* dword right padded*/ extra = (cx*bytespp) & 3; if (extra) extra = 4 - extra; ncolors = (bpp <= 8)? (1<<bpp): 0; /* color table is either palette or 3 longword r/g/b masks*/ sizecolortable = ncolors? ncolors*4: 3*4; if (bpp == 24) sizecolortable = 0; /* special case 24bpp has no table*/ /* fill out bmp header*/ memset(&bmp, 0, sizeof(bmp)); bmp.bfType[0] = 'B'; bmp.bfType[1] = 'M'; bmp.bfSize = dwswap(sizeof(bmp) + sizecolortable + (long)(cx+extra)*cy*bytespp); bmp.bfOffBits = dwswap(sizeof(bmp) + sizecolortable); bmp.BiSize = dwswap(40); bmp.BiWidth = dwswap(cx); bmp.BiHeight = dwswap(cy); bmp.BiPlanes = wswap(1); bmp.BiBitCount = wswap(bpp); bmp.BiCompression = dwswap((bpp==16 || bpp==32)? BI_BITFIELDS: BI_RGB); bmp.BiSizeImage = dwswap((long)(cx+extra)*cy*bytespp); bmp.BiClrUsed = dwswap((bpp <= 8)? ncolors: 0); /*bmp.BiClrImportant = 0;*/ /* write header*/ fwrite(&bmp, sizeof(bmp), 1, ofp); /* write colortable*/ if (sizecolortable) { if(bpp <= 8) { /* write palette*/ for(i=0; i<ncolors; i++) { putc(gr_palette[i].b, ofp); putc(gr_palette[i].g, ofp); putc(gr_palette[i].r, ofp); putc(0, ofp); } } else { /* write 3 r/g/b masks*/ switch (gr_pixtype) { case MWPF_TRUECOLOR0888: default: rmask = RMASK888; gmask = GMASK888; bmask = BMASK888; break; case MWPF_TRUECOLOR565: rmask = RMASK565; gmask = GMASK565; bmask = BMASK565; break; case MWPF_TRUECOLOR555: rmask = RMASK555; gmask = GMASK555; bmask = BMASK555; break; case MWPF_TRUECOLOR332: rmask = RMASK332; gmask = GMASK332; bmask = BMASK332; break; } putdw(rmask, ofp); putdw(gmask, ofp); putdw(bmask, ofp); } } /* write image data, upside down ;)*/ for(i=cy-1; i>=0; --i) { long base = sizeof(bmp) + sizecolortable + (long)i*cx*bytespp; fseek(ofp, base, SEEK_SET); read(ifd, buf, cx*bytespp); switch (bpp) { case 32: lptr = (unsigned long *)buf; for(j=0; j<cx; ++j) putdw(*lptr++, ofp); break; case 24: cptr = (unsigned char *)buf; for(j=0; j<cx; ++j) { putc(*cptr++, ofp); putc(*cptr++, ofp); putc(*cptr++, ofp); } break; case 16: sptr = (unsigned short *)buf; for(j=0; j<cx; ++j) putsw(*sptr++, ofp); break; default: cptr = (unsigned char *)buf; for(j=0; j<cx; ++j) putc(*cptr++, ofp); break; } for(j=0; j<extra; ++j) putc(0, ofp); /* DWORD pad each line*/ } fclose(ofp); close(ifd); #endif /* HAVE_FILEIO*/ return 0; }
void emac3_write(u32 addr) { u32 value=wswap(dev9Ru32(addr)); switch(addr) { case SMAP_R_EMAC3_MODE0_L: DEV9_LOG("SMAP: SMAP_R_EMAC3_MODE0 write %x\n", value); value = (value & (~SMAP_E3_SOFT_RESET)) | SMAP_E3_TXMAC_IDLE | SMAP_E3_RXMAC_IDLE; dev9Ru16(SMAP_R_EMAC3_STA_CTRL_H)|= SMAP_E3_PHY_OP_COMP; break; case SMAP_R_EMAC3_TxMODE0_L: DEV9_LOG("SMAP: SMAP_R_EMAC3_TxMODE0_L write %x\n", value); //spams// emu_printf("SMAP: SMAP_R_EMAC3_TxMODE0_L write %x\n", value); //Process TX here ? if (!value&SMAP_E3_TX_GNP_0) emu_printf("SMAP_R_EMAC3_TxMODE0_L: SMAP_E3_TX_GNP_0 not set\n"); tx_process(); value = value& ~SMAP_E3_TX_GNP_0; if (value) emu_printf("SMAP_R_EMAC3_TxMODE0_L: extra bits set !\n"); break; case SMAP_R_EMAC3_TxMODE1_L: emu_printf("SMAP_R_EMAC3_TxMODE1_L 32bit write %x\n", value); break; case SMAP_R_EMAC3_STA_CTRL_L: DEV9_LOG("SMAP: SMAP_R_EMAC3_STA_CTRL write %x\n", value); { if (value & (SMAP_E3_PHY_READ)) { value|= SMAP_E3_PHY_OP_COMP; int reg = value & (SMAP_E3_PHY_REG_ADDR_MSK); u16 val = dev9.phyregs[reg]; switch (reg) { case SMAP_DsPHYTER_BMSR: if (has_link) val|= SMAP_PHY_BMSR_LINK | SMAP_PHY_BMSR_ANCP; break; case SMAP_DsPHYTER_PHYSTS: if (has_link) val|= SMAP_PHY_STS_LINK |SMAP_PHY_STS_100M | SMAP_PHY_STS_FDX | SMAP_PHY_STS_ANCP; break; } DEV9_LOG("phy_read %d: %x\n", reg, val); value=(value&0xFFFF)|(val<<16); } if (value & (SMAP_E3_PHY_WRITE)) { value|= SMAP_E3_PHY_OP_COMP; int reg = value & (SMAP_E3_PHY_REG_ADDR_MSK); u16 val = value>>16; switch (reg) { case SMAP_DsPHYTER_BMCR: val&= ~SMAP_PHY_BMCR_RST; val|= 0x1; break; } DEV9_LOG("phy_write %d: %x\n", reg, val); dev9.phyregs[reg] = val; } } break; default: DEV9_LOG("SMAP: emac3 write %x=%x\n",addr, value); }
switch (reg) { case SMAP_DsPHYTER_BMCR: val&= ~SMAP_PHY_BMCR_RST; val|= 0x1; break; } DEV9_LOG("phy_write %d: %x\n", reg, val); dev9.phyregs[reg] = val; } } break; default: DEV9_LOG("SMAP: emac3 write %x=%x\n",addr, value); } dev9Ru32(addr)=wswap(value); } u8 CALLBACK smap_read8(u32 addr) { switch(addr) { case SMAP_R_TXFIFO_FRAME_CNT: printf("SMAP_R_TXFIFO_FRAME_CNT read 8\n"); break; case SMAP_R_RXFIFO_FRAME_CNT: printf("SMAP_R_RXFIFO_FRAME_CNT read 8\n"); break; case SMAP_R_BD_MODE: return dev9.bd_swap;