Ejemplo n.º 1
0
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;
	}
}
Ejemplo n.º 2
0
bool ATAController::init()
{
    selectDrive(0);
    
    return true;
}
Ejemplo n.º 3
0
void ATAController::update()
{
    selectDrive(driveSel);
}
Ejemplo n.º 4
0
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;
        }