Untitled

mail@pastecode.io avatar
unknown
c_cpp
2 years ago
2.2 kB
2
Indexable
Never
#pragma once

#include "../screen.h"
#include "../low_level.h"
#include <stdint.h>

#define SECTOR_SIZE 256

#define ATA_PORT 0x1F0


//registers
#define SECTOR_COUNT_REGISTER 2
#define SECTOR_NUMBER_REGISTER 3
#define SECTOR_NUMBER_LOW_REGISTER 4 
#define SECTOR_NUMBER_HIGH_REGISTER 5

#define STATUS_REGISTER 7

//statuses
#define BSY_RDY 0x80
#define DRQ_RDY 0x8


void read(uint32_t target_address, uint32_t address, uint8_t sector_count);
void write(uint32_t address, unsigned char sector_count, uint32_t* data);
void waitBSY();
void waitDRQ();


DISK.cpp:

#include "disk.h"

void read(uint32_t target_address, uint32_t address, uint8_t sector_count)
{
    waitBSY();
    port_byte_out(ATA_PORT+SECTOR_COUNT_REGISTER, sector_count);
    port_byte_out(ATA_PORT+SECTOR_NUMBER_REGISTER, address);
    port_byte_out(ATA_PORT+SECTOR_NUMBER_LOW_REGISTER, address >> 8);
    port_byte_out(ATA_PORT+SECTOR_NUMBER_HIGH_REGISTER, address >> 16);
    port_byte_out(STATUS_REGISTER, 0x20); //READ COMMAND

    uint16_t *target = (uint16_t*) target_address;
    for(int i = 0; i < sector_count; i++)
    {
        waitBSY();
        waitDRQ();
        for(int j = 0; j < SECTOR_SIZE; j++)
        {
            //target[i] = port_byte_in(ATA_PORT);
            //my_print("z", 0);
            print_int(1+port_byte_in(ATA_PORT), 0);
        }
        target+=256;
    }
    my_print("S", 0);
}

void write(uint32_t address, uint8_t sector_count, uint32_t* data)
{
    waitBSY();
    port_byte_out(ATA_PORT+SECTOR_COUNT_REGISTER, sector_count);
    port_byte_out(ATA_PORT+SECTOR_NUMBER_REGISTER, address);
    port_byte_out(ATA_PORT+SECTOR_NUMBER_LOW_REGISTER, address >> 8);
    port_byte_out(ATA_PORT+SECTOR_NUMBER_HIGH_REGISTER, address >> 16);
    port_byte_out(STATUS_REGISTER, 0x30); // WRITE COMMAND
    for(int i = 0; i < sector_count; i++)
    {
        waitBSY();
        waitDRQ();
        for(int j = 0; j < SECTOR_SIZE; j++)
        {
            port_long_out(ATA_PORT, 1);
        }
    }
}


void waitBSY()
{
    while(port_byte_in(ATA_PORT+STATUS_REGISTER) & BSY_RDY);
}

void waitDRQ()
{
    while(!port_byte_in(ATA_PORT+STATUS_REGISTER) & DRQ_RDY);
}