void readKeyboard(void) { struct dir_node *currentNode; unsigned char key; bool decision = false; key = toupper(cgetc()); switch((int)key) { case HK_FORMATTER: if(loadOverlay(7)) { formatDisk(selectedPanel); clrscr(); writeMenuBar(); reloadPanels(); } break; case HK_BASIC_VIEWER: if(loadOverlay(6)) { viewFileAsBASIC(selectedPanel); clrscr(); writeMenuBar(); reloadPanels(); } break; case HK_HEX_EDIT: if(loadOverlay(5)) { hexEditCurrentFile(selectedPanel); clrscr(); writeMenuBar(); reloadPanels(); } break; case CH_ENTER: currentNode = getSelectedNode(selectedPanel); if(isDirectory(selectedPanel)) { enterDirectory(selectedPanel); } else if(currentNode != NULL) { sprintf(filePath, "%s/%s", selectedPanel->path, currentNode->name); if(currentNode->type == 0x06 || currentNode->type == 0xFF) { saveScreen(); decision = writeYesNo("Confirm", quit_message, 1); retrieveScreen(); if(decision == true) { exec(filePath, NULL); } } else if(currentNode->type == 0xFC) { if(loadOverlay(6)) { viewFileAsBASIC(selectedPanel); clrscr(); writeMenuBar(); reloadPanels(); } } else { if(loadOverlay(1)) viewFile(filePath); } } break; case KEY_F4: rereadSelectedPanel(); break; case KEY_F3: selectDrive(selectedPanel); rereadSelectedPanel(); break; case HK_SELECT: selectCurrentFile(); break; #ifdef __APPLE2ENH__ case CH_CURS_UP: #else case CH_CURS_LEFT: #endif moveSelectorUp(selectedPanel); break; #ifdef __APPLE2ENH__ case CH_CURS_DOWN: #else case CH_CURS_RIGHT: #endif moveSelectorDown(selectedPanel); break; #ifdef __APPLE2ENH__ case CH_CURS_LEFT: if(selectedPanel == &rightPanelDrive && strlen(leftPanelDrive.path) > 0) { selectedPanel = &leftPanelDrive; writeSelectorPosition(&leftPanelDrive, '>'); writeSelectorPosition(&rightPanelDrive, ' '); writeCurrentFilename(selectedPanel); } break; case CH_CURS_RIGHT: if(selectedPanel == &leftPanelDrive && strlen(rightPanelDrive.path) > 0) { selectedPanel = &rightPanelDrive; writeSelectorPosition(&leftPanelDrive, ' '); writeSelectorPosition(&rightPanelDrive, '>'); writeCurrentFilename(selectedPanel); } break; #endif case HK_SWITCH_PANEL: if(selectedPanel == &leftPanelDrive && strlen(rightPanelDrive.path) > 0) { selectedPanel = &rightPanelDrive; writeSelectorPosition(&leftPanelDrive, ' '); writeSelectorPosition(&rightPanelDrive, '>'); writeCurrentFilename(selectedPanel); } else if(selectedPanel == &rightPanelDrive && strlen(leftPanelDrive.path) > 0) { selectedPanel = &leftPanelDrive; writeSelectorPosition(&leftPanelDrive, '>'); writeSelectorPosition(&rightPanelDrive, ' '); writeCurrentFilename(selectedPanel); } break; case KEY_SH_PLUS: enterDirectory(selectedPanel); break; case KEY_SH_MINUS: case CH_ESC: leaveDirectory(selectedPanel); break; //case 188: // C= C - Command Menu // writeMenu(command); // break; //case 182: // C= L - Left Menu // writeMenu(left); // break; //case 178: // C= R - Right Menu // writeMenu(right); // break; //case 187: // C= F - File Menu // writeMenu(file); // break; //case 185: // C= O - Options Menu // writeMenu(options); // break; case HK_REREAD_LEFT: rereadDrivePanel(left); break; case HK_REREAD_RIGHT: rereadDrivePanel(right); break; case HK_DRIVE_LEFT: writeDriveSelectionPanel(left); break; case HK_DRIVE_RIGHT: writeDriveSelectionPanel(right); break; case HK_SELECT_ALL: selectAllFiles(selectedPanel, true); break; case HK_DESELECT_ALL: selectAllFiles(selectedPanel, false); break; case KEY_F1: if(loadOverlay(1)) writeHelpPanel(); break; case KEY_F2: quit(); break; case KEY_F5: if(loadOverlay(4)) copyFiles(); break; case HK_RENAME: case KEY_F6: if(loadOverlay(4)) renameFile(); break; case HK_DELETE: case KEY_F8: if(loadOverlay(4)) deleteFiles(); break; //case KEY_AT: // inputCommand(); // break; case KEY_F7: if(loadOverlay(4)) makeDirectory(); break; case HK_TO_TOP: moveTop(selectedPanel); break; case HK_TO_BOTTOM: moveBottom(selectedPanel); break; case HK_PAGE_UP: movePageUp(selectedPanel); break; case HK_PAGE_DOWN: movePageDown(selectedPanel); break; case HK_WRITE_DISK_IMAGE: if(loadOverlay(3)) writeDiskImage(); break; case HK_CREATE_DISK_IMAGE: if(loadOverlay(3)) createDiskImage(); break; case HK_COPY_DISK: if(loadOverlay(2)) copyDisk(); break; default: //writeStatusBarf("%c", key); break; } }
bool ATAController::init() { selectDrive(0); return true; }
void ATAController::update() { selectDrive(driveSel); }
void ATAController::write16(OEAddress address, OEShort value) { if (address & 0x200) { // ATA device control if (OEGetBit(value, ATA_SRST)) { // Software reset OEClearBit(status, ATA_ERR); OEClearBit(status, ATA_DRQ); command = 0; bufferIndex = 0; } } else { switch (address & 0x7) { case 0: // ATA data if (command == ATA_WRITE) { buffer[bufferIndex++] = value; if (!pioByteMode) buffer[bufferIndex++] = (value >> 8); if (bufferIndex == ATA_BUFFER_SIZE) { if (!blockStorage->writeBlocks(lba.d.l, buffer, 1)) OEAssertBit(status, ATA_ERR); OEClearBit(status, ATA_DRQ); bufferIndex = 0; lba.d.l++; } } else OEAssertBit(status, ATA_ERR); break; case 1: // ATA feature feature = value; break; case 2: // ATA sector count sectorCount = value; break; case 3: // ATA sector number lba.b.l = value; break; case 4: // ATA cylinder low lba.b.h = value; break; case 5: // ATA cylinder high lba.b.h2 = value; break; case 6: // ATA drive/head lba.b.h3 = value & 0xf; selectDrive(OEGetBit(value, ATA_DRIVE)); addressMode = value & ATA_ADDRESSMODEMASK; if ((addressMode != ATA_CHS) && (addressMode != ATA_LBA28)) OEAssertBit(status, ATA_ERR); break; case 7: // ATA command command = value; OEClearBit(status, ATA_ERR); OEClearBit(status, ATA_DRQ); switch (command) { case ATA_READ: bufferIndex = 0; if (blockStorage->readBlocks(lba.d.l, buffer, 1)) OEAssertBit(status, ATA_DRQ); else OEAssertBit(status, ATA_ERR); break; case ATA_WRITE: bufferIndex = 0; if (blockStorage->isWriteEnabled()) OEAssertBit(status, ATA_DRQ); else OEAssertBit(status, ATA_ERR); break; case ATA_IDENTIFY: { // Identify bufferIndex = 0; if (blockStorage->isOpen()) { OEUnion lbaSize; lbaSize.q = blockStorage->getBlockNum(); memset(buffer, 0, ATA_BUFFER_SIZE); setATAString((char *) buffer + ATA_SERIAL, blockStorage->getSerial().c_str(), ATA_SERIAL_SIZE); setATAString((char *) buffer + ATA_FIRMWARE_VER, blockStorage->getFirmware().c_str(), ATA_FIRMWARE_VER_SIZE); setATAString((char *) buffer + ATA_MODEL, blockStorage->getModel().c_str(), ATA_MODEL_SIZE); buffer[ATA_SIZE + 0] = lbaSize.b.l; buffer[ATA_SIZE + 1] = lbaSize.b.h; buffer[ATA_SIZE + 2] = lbaSize.b.h2; buffer[ATA_SIZE + 3] = lbaSize.b.h3; buffer[ATA_SIZE2 + 0] = lbaSize.b.l; buffer[ATA_SIZE2 + 1] = lbaSize.b.h; buffer[ATA_SIZE2 + 2] = lbaSize.b.h2; buffer[ATA_SIZE2 + 3] = lbaSize.b.h3; OEAssertBit(status, ATA_DRQ); } else OEAssertBit(status, ATA_ERR); break; } case ATA_SET_FEATURE: { switch (feature) { case 0x01: // Enable 8-bit PIO transfer mode pioByteMode = true; break; case 0x81: // Disable 8-bit PIO transfer mode pioByteMode = false; break; default: logMessage("unknown ATA SET_FEATURE " + getHexString(feature)); OEAssertBit(status, ATA_ERR); break; } break; } default: logMessage("unknown ATA COMMAND " + getHexString(command)); OEAssertBit(status, ATA_ERR); break; } break; }