Nanite/src/kernel/dri/disk/floppy.h

125 lines
3.5 KiB
C

/*----------------*\
|Nanite OS |
|Copyright (C) 2025|
|Tyler McGurrin |
\*----------------*/
#pragma once
#include <stdint.h>
#include <stdbool.h>
#define FLOPPY_SECTORS_PER_TRACK 18 // Yes this makes it ONLY work with 3.5 inch drives, honestly i dont give a fuck
typedef struct {
uint8_t id;
uint16_t cylinders;
uint16_t sectors;
uint16_t heads;
} FLOPPY_DISK;
void Floppy_Handler();
void Floppy_Drive_Init(uint8_t drive);
void Floppy_IRQ_Wait();
void Floppy_Init_DMA();
void Floppy_DMA_Read();
void Floppy_DMA_Write();
void Floppy_Write_DOR(uint8_t value);
void Floppy_Write_CCR(uint8_t value);
void Floppy_Send_Command(uint8_t command);
void Floppy_LBA2CHS(int lba,int *head,int *track,int *sector);
void Floppy_Read_Sector_CHS(uint8_t head, uint8_t track, uint8_t sector);
void Floppy_Drive_Data(uint32_t stepr, uint32_t loadt, uint32_t unloadt, bool dma);
void Floppy_Check_INT(uint32_t* st0, uint32_t* cyl1);
void Floppy_Disable_Controller();
void Floppy_Enable_Controller();
void Floppy_Reset();
void Floppy_Init();
void Floppy_Motor_Control(bool enable);
uint8_t Floppy_Read_Status();
uint8_t Floppy_Read_Data();
uint8_t* Floppy_Read_Sector(int sectorLBA);
int Floppy_Check_Busy();
int Floppy_Calibrate(uint32_t drive);
int Floppy_Seek(uint32_t cyl, uint32_t head);
/* When i Said i was Rewriting this POS i meant it */
enum FLOPPY_IO {
FLOPPY_DOR = 0x3f2,
FLOPPY_MSR = 0x3f4,
FLOPPY_FIFO = 0x3f5, //data register
FLOPPY_CTRL = 0x3f7
};
enum FLOPPY_DOR_MASK {
FLOPPY_DOR_MASK_DRIVE0 = 0, //00000000
FLOPPY_DOR_MASK_DRIVE1 = 1, //00000001
FLOPPY_DOR_MASK_DRIVE2 = 2, //00000010
FLOPPY_DOR_MASK_DRIVE3 = 3, //00000011
FLOPPY_DOR_MASK_RESET = 4, //00000100
FLOPPY_DOR_MASK_DMA = 8, //00001000
FLOPPY_DOR_MASK_DRIVE0_MOTOR = 16, //00010000
FLOPPY_DOR_MASK_DRIVE1_MOTOR = 32, //00100000
FLOPPY_DOR_MASK_DRIVE2_MOTOR = 64, //01000000
FLOPPY_DOR_MASK_DRIVE3_MOTOR = 128 //10000000
};
enum FLOPPY_MSR_MASK {
FLOPPY_MSR_MASK_DRIVE1_POS_MODE = 1, //00000001
FLOPPY_MSR_MASK_DRIVE2_POS_MODE = 2, //00000010
FLOPPY_MSR_MASK_DRIVE3_POS_MODE = 4, //00000100
FLOPPY_MSR_MASK_DRIVE4_POS_MODE = 8, //00001000
FLOPPY_MSR_MASK_BUSY = 16, //00010000
FLOPPY_MSR_MASK_DMA = 32, //00100000
FLOPPY_MSR_MASK_DATAIO = 64, //01000000
FLOPPY_MSR_MASK_DATAREG = 128 //10000000
};
// Yes i know i know 0b numbers are nonstandard (fuck off)
enum FLOPPY_CCR_SPEEDS {
FLOPPY_CCR_SPEED_500K = 0b00,
FLOPPY_CCR_SPEED_250K = 0b10,
FLOPPY_CCR_SPEED_300K = 0b01,
FLOPPY_CCR_SPEED_1M = 0b11
};
enum FLOPPY_CMD {
FLOPPY_CMD_READ_TRACK = 2,
FLOPPY_CMD_SPECIFY = 3,
FLOPPY_CMD_CHECK_STAT = 4,
FLOPPY_CMD_WRITE_SECT = 5,
FLOPPY_CMD_READ_SECT = 6,
FLOPPY_CMD_CALIBRATE = 7,
FLOPPY_CMD_CHECK_INT = 8,
FLOPPY_CMD_WRITE_DEL_S = 9,
FLOPPY_CMD_READ_ID_S = 0xa,
FLOPPY_CMD_READ_DEL_S = 0xc,
FLOPPY_CMD_FORMAT_TRACK = 0xd,
FLOPPY_CMD_SEEK = 0xf
};
enum FLOPPY_CMD_EXT {
FLOPPY_CMD_EXT_SKIP = 0x20, //00100000
FLOPPY_CMD_EXT_DENSITY = 0x40, //01000000
FLOPPY_CMD_EXT_MULTITRACK = 0x80 //10000000
};
enum FLOPPY_GAP3_LENGTH {
FLOPPY_GAP3_LENGTH_STD = 42,
FLOPPY_GAP3_LENGTH_5_14 = 32,
FLOPPY_GAP3_LENGTH_3_5 = 27
};
enum FLOPPY_SECTOR_DTL {
FLOPPY_SECTOR_DTL_128 = 0,
FLOPPY_SECTOR_DTL_256 = 1,
FLOPPY_SECTOR_DTL_512 = 2,
FLOPPY_SECTOR_DTL_1024 = 4
};