#ifndef DRIVE_H #define DRIVE_H #include #include #define DRIVE_LOOKAHEAD 8 extern const uint8_t SECTORS_PER_TRACK[40]; extern const uint8_t BITRATE_PER_TRACK[40]; extern const uint8_t GCR_CONV[16]; typedef struct drive_s { volatile bool spinning; uint8_t timer; uint8_t *image; volatile uint8_t track; volatile uint8_t halftrack; volatile uint32_t image_ptr; volatile uint8_t sector; uint8_t byte; uint16_t gcr_word; uint8_t gcr_bits; uint8_t bit_counter; uint8_t gap_remain; uint8_t sync_remain; uint8_t header_remain; uint16_t data_remain; uint8_t data_checksum; uint8_t current_idx; uint8_t lookahead_idx; volatile uint16_t unlatched[DRIVE_LOOKAHEAD]; volatile uint16_t latched[DRIVE_LOOKAHEAD]; volatile bool sync[DRIVE_LOOKAHEAD]; volatile bool byte_ready[DRIVE_LOOKAHEAD]; } drive_t; void drive_init(drive_t *drive); void drive_step_up(drive_t *drive); void drive_step_down(drive_t *drive); bool drive_cycle(drive_t *drive, uint8_t cycles, bool advance); #endif