bool DeviceHandler::PartitionUsableForNandEmu(int Partition) { if(IsInserted(Partition) && GetFSType(Partition) == PART_FS_FAT) return true; return false; }
bool DeviceHandler::UsablePartitionMounted() { for(u8 i = SD; i < MAXDEVICES; i++) { if(IsInserted(i) && !GetWbfsHandle(i)) //Everything besides WBFS for configuration return true; } return false; }
s32 DeviceHandler::OpenWBFS(int dev) { u32 part_lba, part_idx = 1; u32 part_fs = GetFSType(dev); const char *partition = DeviceName[dev]; if(dev == SD && IsInserted(dev)) part_lba = sd.GetLBAStart(dev); else if(dev >= USB1 && dev <= USB8 && IsInserted(dev)) { part_idx = dev; part_lba = usb.GetLBAStart(dev - USB1); } else return -1; return WBFS_Init(GetWbfsHandle(dev), part_fs, part_idx, part_lba, partition); }
void Tape::Play () { if (IsInserted() && !IsPlaying()) { g_fPlaying = true; // Schedule next edge Tape::NextEdge(g_dwCycleCounter); // Trigger turbo mode if fast loading is enabled if (IsPlaying() && GetOption(turbotape)) g_nTurbo |= TURBO_TAPE; } }
bool Tape::LoadTrap () { if (!IsInserted()) return false; // If traps are disabled, try normal loading if (!GetOption(tapetraps)) { Play(); return false; } // Skip over any metadata blocks libspectrum_tape_block *block = libspectrum_tape_current_block(pTape); while (block && libspectrum_tape_block_metadata(block)) block = libspectrum_tape_select_next_block(pTape); // Nothing else to process? if (!block) return false; libspectrum_tape_type type = libspectrum_tape_block_type(block); libspectrum_tape_state_type state = libspectrum_tape_state(pTape); // Consider both ROM blocks (normal speed) and turbo blocks, as used by custom SAM tape speeds (DEVICE tX) if ((type != LIBSPECTRUM_TAPE_BLOCK_ROM && type != LIBSPECTRUM_TAPE_BLOCK_TURBO) || state != LIBSPECTRUM_TAPE_STATE_PILOT) { // Fall back on non-trap loading for anything else Play(); return false; } libspectrum_byte *pbData = libspectrum_tape_block_data(block); size_t nData = libspectrum_tape_block_data_length(block); // Base load address and load request size WORD wDest = HL; int nWanted = (read_byte(0x5ac8) << 16) | DE; // Fetch block type H = *pbData++; nData--; // Spectrum header? if (H == 0) { // Override request length nWanted = (nWanted & ~0xff) | 17; } // Otherwise the type byte must match the request else if (H != A_) { // Advance to next block libspectrum_tape_select_next_block(pTape); // Failed, exit via: RET NZ F &= ~(FLAG_C|FLAG_Z); PC = 0xe6f6; return true; } // Parity byte initialised to type byte L = H; // More still to load? while (nWanted >= 0) { // Are we out of source data? (ToDo: support continuation blocks?) if (!nData) { // Advance to next block libspectrum_tape_select_next_block(pTape); // Failed, exit via: RET NZ F &= ~(FLAG_C|FLAG_Z); PC = 0xe6f6; return true; } // Read next byte and update parity L ^= (H = *pbData++); nData--; // Request complete? if (!nWanted) break; // Write new byte write_byte(wDest, H); wDest++; nWanted--; // Destination now in the top 16K? if (wDest >= 0xc000) { // Slide paging up and move pointer back IO::OutHmpr(hmpr+1); wDest -= 0x4000; } } // Advance to next block libspectrum_tape_select_next_block(pTape); // Exit via: LD A,L ; CP 1 ; RET PC = 0xe739; return true; }