void CPropertySheetHelper::SaveCurrentConfig(void) { // NB. clone-type is encoded in g_Apple2Type m_ConfigOld.m_Apple2Type = g_Apple2Type; m_ConfigOld.m_Slot[4] = g_Slot4; m_ConfigOld.m_Slot[5] = g_Slot5; m_ConfigOld.m_bEnhanceDisk = enhancedisk; m_ConfigOld.m_bEnableHDD = HD_CardIsEnabled(); m_ConfigOld.m_bEnableTheFreezesF8Rom = sg_PropertySheet.GetTheFreezesF8Rom(); // Reset flags each time: m_ConfigOld.m_uSaveLoadStateMsg = 0; m_bDoBenchmark = false; // Setup ConfigNew m_ConfigNew = m_ConfigOld; }
void CPageDisk::DlgOK(HWND hWnd) { const bool bNewEnhanceDisk = SendDlgItemMessage(hWnd, IDC_DISKTYPE,CB_GETCURSEL, 0, 0) ? true : false; if (bNewEnhanceDisk != sg_Disk2Card.GetEnhanceDisk()) { sg_Disk2Card.SetEnhanceDisk(bNewEnhanceDisk); REGSAVE(TEXT(REGVALUE_ENHANCE_DISK_SPEED), (DWORD)bNewEnhanceDisk); } const bool bNewHDDIsEnabled = IsDlgButtonChecked(hWnd, IDC_HDD_ENABLE) ? true : false; if (bNewHDDIsEnabled != HD_CardIsEnabled()) { m_PropertySheetHelper.GetConfigNew().m_bEnableHDD = bNewHDDIsEnabled; } RegSaveString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_LAST_HARDDISK_1), 1, HD_GetFullPathName(HARDDISK_1)); RegSaveString(TEXT(REG_PREFS), TEXT(REGVALUE_PREF_LAST_HARDDISK_2), 1, HD_GetFullPathName(HARDDISK_2)); m_PropertySheetHelper.PostMsgAfterClose(hWnd, m_Page); }
static BYTE __stdcall HD_IO_EMUL (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft) { BYTE r = DEVICE_OK; addr &= 0xFF; if (!HD_CardIsEnabled()) return r; PHDD pHDD = &g_HardDrive[g_nHD_UnitNum >> 7]; // bit7 = drive select if (bWrite == 0) // read { switch (addr) { case 0xF0: { if (pHDD->hd_imageloaded) { // based on loaded data block request, load block into memory // returns status switch (g_nHD_Command) { default: case 0x00: //status if (GetFileSize(pHDD->hd_file,NULL) == 0) { pHDD->hd_error = 1; r = DEVICE_IO_ERROR; } break; case 0x01: //read { DWORD br = GetFileSize(pHDD->hd_file,NULL); if ((DWORD)(pHDD->hd_diskblock * 512) <= br) // seek to block { SetFilePointer(pHDD->hd_file,pHDD->hd_diskblock * 512,NULL,FILE_BEGIN); // seek to block if (ReadFile(pHDD->hd_file,pHDD->hd_buf,512,&br,NULL)) // read block into buffer { pHDD->hd_error = 0; r = 0; pHDD->hd_buf_ptr = 0; } else { pHDD->hd_error = 1; r = DEVICE_IO_ERROR; } } else { pHDD->hd_error = 1; r = DEVICE_IO_ERROR; } } break; case 0x02: //write { DWORD bw = GetFileSize(pHDD->hd_file,NULL); if ((DWORD)(pHDD->hd_diskblock * 512) <= bw) { MoveMemory(pHDD->hd_buf,mem+pHDD->hd_memblock,512); SetFilePointer(pHDD->hd_file,pHDD->hd_diskblock * 512,NULL,FILE_BEGIN); // seek to block if (WriteFile(pHDD->hd_file,pHDD->hd_buf,512,&bw,NULL)) // write buffer to file { pHDD->hd_error = 0; r = 0; } else { pHDD->hd_error = 1; r = DEVICE_IO_ERROR; } } else { DWORD fsize = SetFilePointer(pHDD->hd_file,0,NULL,FILE_END); DWORD addblocks = pHDD->hd_diskblock - (fsize / 512); FillMemory(pHDD->hd_buf,512,0); while (addblocks--) { DWORD bw; WriteFile(pHDD->hd_file,pHDD->hd_buf,512,&bw,NULL); } if (SetFilePointer(pHDD->hd_file,pHDD->hd_diskblock * 512,NULL,FILE_BEGIN) != 0xFFFFFFFF) { // seek to block MoveMemory(pHDD->hd_buf,mem+pHDD->hd_memblock,512); if (WriteFile(pHDD->hd_file,pHDD->hd_buf,512,&bw,NULL)) // write buffer to file { pHDD->hd_error = 0; r = 0; } else { pHDD->hd_error = 1; r = DEVICE_IO_ERROR; } } } } break; case 0x03: //format break; } } else { pHDD->hd_error = 1; r = DEVICE_UNKNOWN_ERROR; } } break; case 0xF1: // hd_error { r = pHDD->hd_error; } break; case 0xF2: { r = g_nHD_Command; } break; case 0xF3: { r = g_nHD_UnitNum; } break; case 0xF4: { r = (BYTE)(pHDD->hd_memblock & 0x00FF); } break; case 0xF5: { r = (BYTE)(pHDD->hd_memblock & 0xFF00 >> 8); } break; case 0xF6: { r = (BYTE)(pHDD->hd_diskblock & 0x00FF); } break; case 0xF7: { r = (BYTE)(pHDD->hd_diskblock & 0xFF00 >> 8); } break; case 0xF8: { r = pHDD->hd_buf[pHDD->hd_buf_ptr]; pHDD->hd_buf_ptr++; } break; default: return IO_Null(pc, addr, bWrite, d, nCyclesLeft); } } else // write { switch (addr)
static BYTE __stdcall HD_IO_EMUL(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft) { BYTE r = DEVICE_OK; addr &= 0xF; if (!HD_CardIsEnabled()) return r; HDD* pHDD = &g_HardDisk[g_nHD_UnitNum >> 7]; // bit7 = drive select if (bWrite == 0) // read { switch (addr) { case 0x0: { if (pHDD->hd_imageloaded) { // based on loaded data block request, load block into memory // returns status switch (g_nHD_Command) { default: case 0x00: //status if (pHDD->Info.uImageSize == 0) { pHDD->hd_error = 1; r = DEVICE_IO_ERROR; } break; case 0x01: //read { if ((pHDD->hd_diskblock * HD_BLOCK_SIZE) < pHDD->Info.uImageSize) { bool bRes = pHDD->Info.pImageType->Read(&pHDD->Info, pHDD->hd_diskblock, pHDD->hd_buf); if (bRes) { pHDD->hd_error = 0; r = 0; pHDD->hd_buf_ptr = 0; } else { pHDD->hd_error = 1; r = DEVICE_IO_ERROR; } } else { pHDD->hd_error = 1; r = DEVICE_IO_ERROR; } } break; case 0x02: //write { bool bRes = true; const bool bAppendBlocks = (pHDD->hd_diskblock * HD_BLOCK_SIZE) >= pHDD->Info.uImageSize; if (bAppendBlocks) { // TODO: Test this! ZeroMemory(pHDD->hd_buf, HD_BLOCK_SIZE); UINT uBlock = pHDD->Info.uImageSize / HD_BLOCK_SIZE; while (uBlock < pHDD->hd_diskblock) { bRes = pHDD->Info.pImageType->Write(&pHDD->Info, uBlock++, pHDD->hd_buf); _ASSERT(bRes); if (!bRes) break; pHDD->Info.uImageSize += HD_BLOCK_SIZE; } } MoveMemory(pHDD->hd_buf, mem+pHDD->hd_memblock, HD_BLOCK_SIZE); if (bRes) bRes = pHDD->Info.pImageType->Write(&pHDD->Info, pHDD->hd_diskblock, pHDD->hd_buf); if (bRes) { pHDD->hd_error = 0; r = 0; } else { pHDD->hd_error = 1; r = DEVICE_IO_ERROR; } if (bAppendBlocks && bRes) pHDD->Info.uImageSize += HD_BLOCK_SIZE; } break; case 0x03: //format break; } } else { pHDD->hd_error = 1; r = DEVICE_UNKNOWN_ERROR; } } break; case 0x1: // hd_error { r = pHDD->hd_error; } break; case 0x2: { r = g_nHD_Command; } break; case 0x3: { r = g_nHD_UnitNum; } break; case 0x4: { r = (BYTE)(pHDD->hd_memblock & 0x00FF); } break; case 0x5: { r = (BYTE)(pHDD->hd_memblock & 0xFF00 >> 8); } break; case 0x6: { r = (BYTE)(pHDD->hd_diskblock & 0x00FF); } break; case 0x7: { r = (BYTE)(pHDD->hd_diskblock & 0xFF00 >> 8); } break; case 0x8: // Read EEPROM Write Protect Status { r = g_eepromwp; } break; case 0x9: // Read C800 Bank register { r = g_c800bank; } break; case 0xA: { r = pHDD->hd_buf[pHDD->hd_buf_ptr]; pHDD->hd_buf_ptr++; } break; // FB to FF unimplemented default: return IO_Null(pc, addr, bWrite, d, nCyclesLeft); } } else // write { switch (addr)
BOOL CPageDisk::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM lparam) { switch (message) { case WM_NOTIFY: { // Property Sheet notifications switch (((LPPSHNOTIFY)lparam)->hdr.code) { case PSN_SETACTIVE: // About to become the active page m_PropertySheetHelper.SetLastPage(m_Page); InitOptions(hWnd); break; case PSN_KILLACTIVE: SetWindowLong(hWnd, DWL_MSGRESULT, FALSE); // Changes are valid break; case PSN_APPLY: DlgOK(hWnd); SetWindowLong(hWnd, DWL_MSGRESULT, PSNRET_NOERROR); // Changes are valid break; case PSN_QUERYCANCEL: // Can use this to ask user to confirm cancel break; case PSN_RESET: DlgCANCEL(hWnd); break; } } break; case WM_COMMAND: switch (LOWORD(wparam)) { case IDC_COMBO_DISK1: if (HIWORD(wparam) == CBN_SELCHANGE) { HandleDiskCombo(hWnd, DRIVE_1, LOWORD(wparam)); FrameRefreshStatus(DRAW_BUTTON_DRIVES); } break; case IDC_COMBO_DISK2: if (HIWORD(wparam) == CBN_SELCHANGE) { HandleDiskCombo(hWnd, DRIVE_2, LOWORD(wparam)); FrameRefreshStatus(DRAW_BUTTON_DRIVES); } break; case IDC_COMBO_HDD1: if (HIWORD(wparam) == CBN_SELCHANGE) { HandleHDDCombo(hWnd, HARDDISK_1, LOWORD(wparam)); } break; case IDC_COMBO_HDD2: if (HIWORD(wparam) == CBN_SELCHANGE) { HandleHDDCombo(hWnd, HARDDISK_2, LOWORD(wparam)); } break; case IDC_HDD_ENABLE: EnableHDD(hWnd, IsDlgButtonChecked(hWnd, IDC_HDD_ENABLE)); break; case IDC_HDD_SWAP: HandleHDDSwap(hWnd); break; case IDC_CIDERPRESS_BROWSE: { std::string CiderPressLoc = m_PropertySheetHelper.BrowseToFile(hWnd, TEXT("Select path to CiderPress"), REGVALUE_CIDERPRESSLOC, TEXT("Applications (*.exe)\0*.exe\0") TEXT("All Files\0*.*\0") ); RegSaveString(TEXT(REG_CONFIG), REGVALUE_CIDERPRESSLOC, 1, CiderPressLoc.c_str()); SendDlgItemMessage(hWnd, IDC_CIDERPRESS_FILENAME, WM_SETTEXT, 0, (LPARAM) CiderPressLoc.c_str()); } break; } break; case WM_INITDIALOG: { m_PropertySheetHelper.FillComboBox(hWnd, IDC_DISKTYPE, m_discchoices, sg_Disk2Card.GetEnhanceDisk() ? 1 : 0); m_PropertySheetHelper.FillComboBox(hWnd, IDC_COMBO_DISK1, m_defaultDiskOptions, -1); m_PropertySheetHelper.FillComboBox(hWnd, IDC_COMBO_DISK2, m_defaultDiskOptions, -1); if (strlen(sg_Disk2Card.GetFullName(DRIVE_1)) > 0) { SendDlgItemMessage(hWnd, IDC_COMBO_DISK1, CB_INSERTSTRING, 0, (LPARAM)sg_Disk2Card.GetFullName(DRIVE_1)); SendDlgItemMessage(hWnd, IDC_COMBO_DISK1, CB_SETCURSEL, 0, 0); } if (strlen(sg_Disk2Card.GetFullName(DRIVE_2)) > 0) { SendDlgItemMessage(hWnd, IDC_COMBO_DISK2, CB_INSERTSTRING, 0, (LPARAM)sg_Disk2Card.GetFullName(DRIVE_2)); SendDlgItemMessage(hWnd, IDC_COMBO_DISK2, CB_SETCURSEL, 0, 0); } InitComboHDD(hWnd); TCHAR PathToCiderPress[MAX_PATH] = ""; RegLoadString(TEXT(REG_CONFIG), REGVALUE_CIDERPRESSLOC, 1, PathToCiderPress,MAX_PATH); SendDlgItemMessage(hWnd, IDC_CIDERPRESS_FILENAME ,WM_SETTEXT, 0, (LPARAM)PathToCiderPress); CheckDlgButton(hWnd, IDC_HDD_ENABLE, HD_CardIsEnabled() ? BST_CHECKED : BST_UNCHECKED); EnableHDD(hWnd, IsDlgButtonChecked(hWnd, IDC_HDD_ENABLE)); InitOptions(hWnd); break; } } return FALSE; }