FDD Dection Is Fixed!
This commit is contained in:
parent
3dadaf1582
commit
486c92954a
@ -5,8 +5,72 @@
|
|||||||
\*----------------*/
|
\*----------------*/
|
||||||
#include "cmos.h"
|
#include "cmos.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <arch/i686/io.h>
|
||||||
|
#include <arch/i686/irq.h>
|
||||||
|
#include <util/binary.h>
|
||||||
|
|
||||||
|
#define CMOS_ADDPORT 0x70
|
||||||
|
#define CMOS_DATAPORT 0x71
|
||||||
|
|
||||||
void CMOS_RTC_Handler()
|
void CMOS_RTC_Handler()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t Read_CMOS(uint8_t Register)
|
||||||
|
{
|
||||||
|
uint8_t data;
|
||||||
|
i686_outb(0x70, Register);
|
||||||
|
data = i686_inb(CMOS_DATAPORT);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Master_FDD_Detect()
|
||||||
|
{
|
||||||
|
int Buffer;
|
||||||
|
int FDDType;
|
||||||
|
/* FDD Drive Values
|
||||||
|
Value: Drive Type:
|
||||||
|
00h no drive
|
||||||
|
01h 360 KB 5.25 Drive
|
||||||
|
02h 1.2 MB 5.25 Drive
|
||||||
|
03h 720 KB 3.5 Drive
|
||||||
|
04h 1.44 MB 3.5 Drive
|
||||||
|
05h 2.88 MB 3.5 drive*/
|
||||||
|
Buffer = BCD2BIN(Read_CMOS(CMOS_Floppy_Register));
|
||||||
|
|
||||||
|
int bit = Get_Bit(Buffer, 1);
|
||||||
|
int i = 2;
|
||||||
|
while(i < 5) {
|
||||||
|
FDDType = bit & bit;
|
||||||
|
bit = Get_Bit(Buffer, i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return FDDType;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Slave_FDD_Detect()
|
||||||
|
{
|
||||||
|
int Buffer;
|
||||||
|
int FDDType;
|
||||||
|
/* FDD Drive Values
|
||||||
|
Value: Drive Type:
|
||||||
|
00h no drive
|
||||||
|
01h 360 KB 5.25 Drive
|
||||||
|
02h 1.2 MB 5.25 Drive
|
||||||
|
03h 720 KB 3.5 Drive
|
||||||
|
04h 1.44 MB 3.5 Drive
|
||||||
|
05h 2.88 MB 3.5 drive*/
|
||||||
|
Buffer = BCD2BIN(Read_CMOS(CMOS_Floppy_Register));
|
||||||
|
|
||||||
|
int bit = Get_Bit(Buffer, 4);
|
||||||
|
int i = 5;
|
||||||
|
while(i < 9) {
|
||||||
|
FDDType = bit & bit;
|
||||||
|
bit = Get_Bit(Buffer, i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return FDDType;
|
||||||
|
}
|
||||||
@ -5,4 +5,32 @@
|
|||||||
\*----------------*/
|
\*----------------*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define BCD2BIN(bcd) ((((bcd)&15) + ((bcd)>>4)*10))
|
||||||
|
|
||||||
void CMOS_RTC_Handler();
|
void CMOS_RTC_Handler();
|
||||||
|
int Master_FDD_Detect();
|
||||||
|
int Slave_FDD_Detect();
|
||||||
|
uint8_t Read_CMOS(uint8_t Register);
|
||||||
|
|
||||||
|
enum CMOSRegisters
|
||||||
|
{
|
||||||
|
CMOS_Floppy_Register = 0x10
|
||||||
|
};
|
||||||
|
|
||||||
|
/* RTC Registers
|
||||||
|
Register Contents Range
|
||||||
|
0x00 Seconds 0–59
|
||||||
|
0x02 Minutes 0–59
|
||||||
|
0x04 Hours 0–23 in 24-hour mode,
|
||||||
|
1–12 in 12-hour mode, highest bit set if pm
|
||||||
|
0x06 Weekday 1–7, Sunday = 1
|
||||||
|
0x07 Day of Month 1–31
|
||||||
|
0x08 Month 1–12
|
||||||
|
0x09 Year 0–99
|
||||||
|
0x32 Century (maybe) 19–20?
|
||||||
|
0x0A Status Register A
|
||||||
|
0x0B Status Register B
|
||||||
|
|
||||||
|
*/
|
||||||
@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <util/binary.h>
|
|
||||||
#include <arch/i686/io.h>
|
#include <arch/i686/io.h>
|
||||||
#include <arch/i686/irq.h>
|
#include <arch/i686/irq.h>
|
||||||
|
|
||||||
@ -15,7 +14,7 @@
|
|||||||
|
|
||||||
void Floppy_Handler()
|
void Floppy_Handler()
|
||||||
{
|
{
|
||||||
|
printf("IRQ 6 Called");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -28,60 +27,6 @@ void Floppy_Handler()
|
|||||||
// Basically Gonna hard-code the driver for 1.44MB Drives
|
// Basically Gonna hard-code the driver for 1.44MB Drives
|
||||||
// Since Nanite is only capable of running off one without modifications to the bootloader,
|
// Since Nanite is only capable of running off one without modifications to the bootloader,
|
||||||
// this is not an issue... but its sure as shit annoying
|
// this is not an issue... but its sure as shit annoying
|
||||||
int Master_FDD_Detect()
|
// Correction im stupid...
|
||||||
{
|
|
||||||
uint8_t Buffer;
|
|
||||||
int FDDType;
|
|
||||||
int bit1, bit2, bit3, bit4;
|
|
||||||
/* FDD Drive Values
|
|
||||||
Value: Drive Type:
|
|
||||||
00h no drive
|
|
||||||
01h 360 KB 5.25 Drive
|
|
||||||
02h 1.2 MB 5.25 Drive
|
|
||||||
03h 720 KB 3.5 Drive
|
|
||||||
04h 1.44 MB 3.5 Drive
|
|
||||||
05h 2.88 MB 3.5 drive*/
|
|
||||||
Buffer = i686_inb(PORT_FLOPPY_TYPE);
|
|
||||||
|
|
||||||
// bit1 = Byte_Parse(Buffer, 0);
|
// Moved to CMOS Driver.
|
||||||
// bit2 = Byte_Parse(Buffer, 1);
|
|
||||||
// bit3 = Byte_Parse(Buffer, 2);
|
|
||||||
// bit4 = Byte_Parse(Buffer, 3);
|
|
||||||
// printf("Bits: %d, %d, %d, %d\n", bit1, bit2, bit3, bit4);
|
|
||||||
printf("Buffer: %s", Buffer);
|
|
||||||
// int bit = Byte_Parse(Buffer, 0);
|
|
||||||
// int i = 1;
|
|
||||||
// while(i < 4) {
|
|
||||||
// FDDType = bit & bit;
|
|
||||||
// bit = Byte_Parse(Buffer, i);
|
|
||||||
// i++;
|
|
||||||
// printf("MFDD Bit %d: %d\n", i, bit);
|
|
||||||
// }
|
|
||||||
FDDType = bit1 & bit2 & bit3 & bit4;
|
|
||||||
return FDDType;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Slave_FDD_Detect()
|
|
||||||
{
|
|
||||||
int Buffer;
|
|
||||||
int FDDType;
|
|
||||||
/* FDD Drive Values
|
|
||||||
Value: Drive Type:
|
|
||||||
00h no drive
|
|
||||||
01h 360 KB 5.25 Drive
|
|
||||||
02h 1.2 MB 5.25 Drive
|
|
||||||
03h 720 KB 3.5 Drive
|
|
||||||
04h 1.44 MB 3.5 Drive
|
|
||||||
05h 2.88 MB 3.5 drive*/
|
|
||||||
Buffer = i686_inb(PORT_FLOPPY_TYPE);
|
|
||||||
|
|
||||||
int bit = Byte_Parse(Buffer, 3);
|
|
||||||
int i = 4;
|
|
||||||
while(i < 8) {
|
|
||||||
FDDType = bit & bit;
|
|
||||||
bit = Byte_Parse(Buffer, i);
|
|
||||||
i++;
|
|
||||||
printf("SFDD Bit %d: %d\n", i, bit);
|
|
||||||
}
|
|
||||||
return FDDType;
|
|
||||||
}
|
|
||||||
@ -7,6 +7,65 @@
|
|||||||
|
|
||||||
void Floppy_Handler();
|
void Floppy_Handler();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* DOR Command Table
|
||||||
|
Mnemonic bit number value meaning/usage
|
||||||
|
MOTD 7 0x80 Set to turn drive 3's motor ON
|
||||||
|
MOTC 6 0x40 Set to turn drive 2's motor ON
|
||||||
|
MOTB 5 0x20 Set to turn drive 1's motor ON
|
||||||
|
MOTA 4 0x10 Set to turn drive 0's motor ON
|
||||||
|
IRQ 3 8 Set to enable IRQs and DMA
|
||||||
|
RESET 2 4 Clear = enter reset mode, Set = normal operation
|
||||||
|
DSEL1 and 0 0, 1 3 "Select" drive number for next access
|
||||||
|
*/
|
||||||
|
enum FloppyDORBitflags
|
||||||
|
{
|
||||||
|
DOR_MOTD = 0x80,
|
||||||
|
DOR_MOTC = 0x40,
|
||||||
|
DOR_MOTB = 0x20,
|
||||||
|
DOR_MOTA = 0x10,
|
||||||
|
DOR_IRQ = 0x08,
|
||||||
|
DOR_RESET = 0x04,
|
||||||
|
DOR_DSEL1 = 0x01
|
||||||
|
};
|
||||||
|
/* MSR Commands
|
||||||
|
Mnemonic Bit Value
|
||||||
|
RQM 7 0x80
|
||||||
|
DIO 6 0x40
|
||||||
|
NDMA 5 0x20
|
||||||
|
CB 4 0x10
|
||||||
|
ACTD 3 8
|
||||||
|
ACTC 2 4
|
||||||
|
ACTB 1 2
|
||||||
|
ACTA 0 1
|
||||||
|
*/
|
||||||
|
enum FloppyMSRBitflags
|
||||||
|
{
|
||||||
|
MSR_RQM = 0x80, // Set if it's OK (or mandatory) to exchange bytes with the FIFO IO port
|
||||||
|
MSR_DIO = 0x40, // Set if FIFO IO port expects an IN opcode
|
||||||
|
MSR_NDMA = 0x20, // Set in Execution phase of PIO mode read/write commands only.
|
||||||
|
MSR_CB = 0x10, // Command Busy: set when command byte received, cleared at end of Result phase
|
||||||
|
MSR_ACTD = 0x08, // Drive 3 is seeking
|
||||||
|
MSR_ACTC = 0x04, // Drive 2 is seeking
|
||||||
|
MSR_ACTB = 0x02, // Drive 1 is seeking
|
||||||
|
MSR_ACTA = 0x01, // Drive 0 is seeking
|
||||||
|
};
|
||||||
|
|
||||||
|
// Bottom 2 Bits of DSR match CCR
|
||||||
|
enum FloppyRegisters
|
||||||
|
{
|
||||||
|
STATUS_REGISTER_A = 0x3F0, // read-only
|
||||||
|
STATUS_REGISTER_B = 0x3F1, // read-only
|
||||||
|
DIGITAL_OUTPUT_REGISTER = 0x3F2,
|
||||||
|
TAPE_DRIVE_REGISTER = 0x3F3, // Basically Useless, unless for some reason you have a tape drive
|
||||||
|
MAIN_STATUS_REGISTER = 0x3F4, // read-only
|
||||||
|
DATARATE_SELECT_REGISTER = 0x3F4, // write-only
|
||||||
|
DATA_FIFO = 0x3F5,
|
||||||
|
DIGITAL_INPUT_REGISTER = 0x3F7, // read-only
|
||||||
|
CONFIGURATION_CONTROL_REGISTER = 0x3F7 // write-only
|
||||||
|
};
|
||||||
|
|
||||||
enum FloppyCommands
|
enum FloppyCommands
|
||||||
{
|
{
|
||||||
READ_TRACK = 2, // generates IRQ6
|
READ_TRACK = 2, // generates IRQ6
|
||||||
|
|||||||
@ -68,6 +68,9 @@ void __attribute__((section(".entry"))) start(BootParams* bootParams) {
|
|||||||
printf("Load Basic Storage Drivers...");
|
printf("Load Basic Storage Drivers...");
|
||||||
i686_IRQ_RegisterHandler(6, Floppy_Handler);
|
i686_IRQ_RegisterHandler(6, Floppy_Handler);
|
||||||
printf("Done!\n");
|
printf("Done!\n");
|
||||||
|
masterFDDType = Master_FDD_Detect();
|
||||||
|
slaveFDDType = Slave_FDD_Detect();
|
||||||
|
Print_Storage_Types(masterFDDType, slaveFDDType);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,10 +6,15 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
int Byte_Parse(int8_t byteFlag, int whichBit)
|
uint8_t Get_Bit(uint8_t bits, uint8_t pos)
|
||||||
{
|
{
|
||||||
if (whichBit > 0 && whichBit <= 8)
|
return (bits >> pos) & 0x01;
|
||||||
return (byteFlag & (1<<(whichBit-1)));
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// int Byte_Parse(int8_t byteFlag, int whichBit)
|
||||||
|
// {
|
||||||
|
// if (whichBit > 0 && whichBit <= 8)
|
||||||
|
// return (byteFlag & (1<<(whichBit-1)));
|
||||||
|
// else
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
@ -8,4 +8,6 @@
|
|||||||
#define FLAG_SET(x, flag) x |= (flag)
|
#define FLAG_SET(x, flag) x |= (flag)
|
||||||
#define FLAG_UNSET(x, flag) x &= ~(flag)
|
#define FLAG_UNSET(x, flag) x &= ~(flag)
|
||||||
|
|
||||||
int Byte_Parse(int8_t byteFlag, int whichBit);
|
uint8_t Get_Bit(uint8_t bits, uint8_t pos);
|
||||||
|
|
||||||
|
//int Byte_Parse(int8_t byteFlag, int whichBit);
|
||||||
@ -6,5 +6,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define LOGO " _ _____ _ __________________\n / | / / | / | / / _/_ __/ ____/\n / |/ / /| | / |/ // / / / / __/ \n / /| / ___ |/ /| // / / / / /___ \n/_/ |_/_/ |_/_/ |_/___/ /_/ /_____/ \n"
|
#define LOGO " _ _____ _ __________________\n / | / / | / | / / _/_ __/ ____/\n / |/ / /| | / |/ // / / / / __/ \n / /| / ___ |/ /| // / / / / /___ \n/_/ |_/_/ |_/_/ |_/___/ /_/ /_____/ \n"
|
||||||
#define VERSION "RD-00012"
|
#define VERSION "RD-00014"
|
||||||
#define BOOTLOGO " _ ______ ____ ____ ______\n / | / / __ )/ __ \\/ __ /_ __/\n / |/ / __ / / / / / / // / \n / /| / /_/ / /_/ / /_/ // / \n/_/ |_/_____/\\____/\\____//_/ \n"
|
#define BOOTLOGO " _ ______ ____ ____ ______\n / | / / __ )/ __ \\/ __ /_ __/\n / |/ / __ / / / / / / // / \n / /| / /_/ / /_/ / /_/ // / \n/_/ |_/_____/\\____/\\____//_/ \n"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user