int PicoCdLoadStateGfx(void *file) { int ver, len, found = 0; char buff[8]; g_read_offs = 0; CHECKED_READ(8, buff); if (strncmp(buff, "PicoSMCD", 8)) R_ERROR_RETURN("bad header"); CHECKED_READ(4, &ver); while (!areaEof(file) && found < 4) { CHECKED_READ(1, buff); CHECKED_READ(4, &len); if (len < 0 || len > 1024*512) R_ERROR_RETURN("bad length"); if (buff[0] > CHUNK_FM && !(PicoMCD & 1)) R_ERROR_RETURN("cd chunk in non CD state?"); switch (buff[0]) { case CHUNK_VRAM: CHECKED_READ_BUFF(Pico.vram); found++; break; case CHUNK_CRAM: CHECKED_READ_BUFF(Pico.cram); found++; break; case CHUNK_VSRAM: CHECKED_READ_BUFF(Pico.vsram); found++; break; case CHUNK_VIDEO: CHECKED_READ_BUFF(Pico.video); found++; break; default: areaSeek(file, len, SEEK_CUR); break; } } return 0; }
static int read_security_type(tSDL_vnc *vnc) { if (vnc->versionMinor < 7) { // Read security type (simple) CHECKED_READ(vnc, vnc->buffer, 4, "security type"); vnc->security_type=vnc->buffer[3]; DBMESSAGE("Security type (read): %i\n", vnc->security_type); return 1; } // Addition for RFB 003 008 CHECKED_READ(vnc, vnc->buffer, 1, "security type"); // Security Type List! Receive number of supported Security Types int nSecTypes = vnc->buffer[0]; if (nSecTypes == 0) { DBERROR("Server offered an empty list of security types.\n"); return 0; } // Receive Security Type List (Buffer overflow possible!) int result = Recv(vnc->socket,vnc->buffer,nSecTypes,0); // Find supported one... vnc->security_type = 0; int i; for (i = 0; i < result; i++) { vnc->security_type = vnc->buffer[i]; // Break if supported type (currently 1 or 2) found if ((vnc->security_type == 1) || (vnc->security_type == 2)) break; } // Select it DBMESSAGE("Security type (select): %i\n", vnc->security_type); vnc->buffer[0] = vnc->security_type; result = send(vnc->socket,vnc->buffer,1,0); if (result != 1) { DBERROR("Write error on security type selection.\n"); return 0; } return 1; }
/* FIXME: Is this valid when we never request a non-truecolor display? */ static int HandleServerMessage_colormap(tSDL_vnc * vnc) { tSDL_vnc_serverColormap serverColormap; DBMESSAGE("Message: colormap\n"); // Read data, but ignore it CHECKED_READ(vnc, &serverColormap, 5, "server colormap"); serverColormap.first=swap_16(serverColormap.first); serverColormap.number=swap_16(serverColormap.number); DBMESSAGE("Server colormap first color: %u\n",serverColormap.first); DBMESSAGE("Server colormap number: %u\n",serverColormap.number); while (serverColormap.number>0) { CHECKED_READ(vnc, &vnc->buffer, 6, "server colormap color"); DBMESSAGE("Got color %u.\n",serverColormap.first); serverColormap.first++; serverColormap.number--; } return 1; }
int read_raw(tSDL_vnc * vnc, tSDL_vnc_rect rect) { SDL_Rect trec; vnc_to_sdl_rect(&rect, &trec); SDL_LockMutex(vnc->mutex); SDL_LockSurface(vnc->framebuffer); uint32_t pitch = vnc->framebuffer->pitch/4; uint32_t * dest = (uint32_t *)vnc->framebuffer->pixels + (rect.y * pitch) + rect.x; uint32_t len = rect.width * rect.height * 4; DBMESSAGE("Reading %ld bytes straight into buffer", len); CHECKED_READ(vnc, dest, len, "framebuffer"); GrowUpdateRegion(vnc,&trec); SDL_UnlockSurface(vnc->framebuffer); SDL_UnlockMutex(vnc->mutex); return 1; }
PICO_INTERNAL int PicoCdLoadState(void *file) { unsigned char buff[0x60]; int ver, len; g_read_offs = 0; CHECKED_READ(8, buff); if (strncmp((char *)buff, "PicoSMCD", 8)) R_ERROR_RETURN("bad header"); CHECKED_READ(4, &ver); while (!areaEof(file)) { CHECKED_READ(1, buff); CHECKED_READ(4, &len); if (len < 0 || len > 1024*512) R_ERROR_RETURN("bad length"); if (buff[0] > CHUNK_FM && !(PicoMCD & 1)) R_ERROR_RETURN("cd chunk in non CD state?"); switch (buff[0]) { case CHUNK_M68K: CHECKED_READ_BUFF(buff); PicoAreaUnpackCpu(buff, 0); break; case CHUNK_Z80: CHECKED_READ_BUFF(buff); /*z80_unpack(buff);*/ break; case CHUNK_RAM: CHECKED_READ_BUFF(Pico.ram); break; case CHUNK_VRAM: CHECKED_READ_BUFF(Pico.vram); break; case CHUNK_ZRAM: CHECKED_READ_BUFF(Pico.zram); break; case CHUNK_CRAM: CHECKED_READ_BUFF(Pico.cram); break; case CHUNK_VSRAM: CHECKED_READ_BUFF(Pico.vsram); break; case CHUNK_MISC: CHECKED_READ_BUFF(Pico.m); break; case CHUNK_VIDEO: CHECKED_READ_BUFF(Pico.video); break; // cd stuff case CHUNK_S68K: CHECKED_READ_BUFF(buff); PicoAreaUnpackCpu(buff, 1); break; case CHUNK_PRG_RAM: CHECKED_READ_BUFF(Pico_mcd->prg_ram); break; case CHUNK_WORD_RAM: CHECKED_READ_BUFF(Pico_mcd->word_ram2M); break; case CHUNK_PCM_RAM: CHECKED_READ_BUFF(Pico_mcd->pcm_ram); break; case CHUNK_BRAM: CHECKED_READ_BUFF(Pico_mcd->bram); break; case CHUNK_GA_REGS: CHECKED_READ_BUFF(Pico_mcd->s68k_regs); break; case CHUNK_PCM: CHECKED_READ_BUFF(Pico_mcd->pcm); break; case CHUNK_CDD: CHECKED_READ_BUFF(Pico_mcd->cdd); break; case CHUNK_CDC: CHECKED_READ_BUFF(Pico_mcd->cdc); break; case CHUNK_SCD: CHECKED_READ_BUFF(Pico_mcd->scd); break; case CHUNK_RC: CHECKED_READ_BUFF(Pico_mcd->rot_comp); break; case CHUNK_MISC_CD: CHECKED_READ_BUFF(Pico_mcd->m); break; default: elprintf(EL_STATUS, "PicoCdLoadState: skipping unknown chunk %i of size %i\n", buff[0], len); areaSeek(file, len, SEEK_CUR); break; } } /* after load events */ if (Pico_mcd->s68k_regs[3]&4) // 1M mode? wram_2M_to_1M(Pico_mcd->word_ram2M); PicoMemResetCD(Pico_mcd->s68k_regs[3]); #ifdef _ASM_CD_MEMORY_C if (Pico_mcd->s68k_regs[3]&4) PicoMemResetCDdecode(Pico_mcd->s68k_regs[3]); #endif /*if (Pico_mcd->m.audio_track > 0 && Pico_mcd->m.audio_track < Pico_mcd->TOC.Last_Track) mp3_start_play(Pico_mcd->TOC.Tracks[Pico_mcd->m.audio_track].F, Pico_mcd->m.audio_offset);*/ // restore hint vector *(unsigned short *)(Pico_mcd->bios + 0x72) = Pico_mcd->m.hint_vector; return 0; }
void BinaryFile::ReadRawData(void* const data, const unsigned length) { CHECKED_READ(libendian::read((char*)data, length, file)); }
unsigned char BinaryFile::ReadUnsignedChar() { unsigned char i; CHECKED_READ(libendian::read(&i, 1, file)); return i; }
unsigned short BinaryFile::ReadUnsignedShort() { uint16_t i; CHECKED_READ(libendian::le_read_us(&i, file)); return i; }
unsigned BinaryFile::ReadUnsignedInt() { uint32_t i; CHECKED_READ(libendian::le_read_ui(&i, file)); return i; }
int BinaryFile::ReadSignedInt() { int32_t i; CHECKED_READ(libendian::le_read_i(&i, file)); return i; }