Files
fdskey/FdsKey/Core/Inc/fdsemu.h
2023-08-06 15:38:48 +04:00

90 lines
3.4 KiB
C

#ifndef INC_FDSEMU_H_
#define INC_FDSEMU_H_
#include "main.h"
#include "ff.h"
#define FDS_USE_DYNAMIC_MEMORY
// hardware settings
#define FDS_READ_PWM_TIMER htim3
#define FDS_READ_PWM_TIMER_CHANNEL 1
#define FDS_READ_DMA hdma_tim3_up
#define FDS_READ_IMPULSE_LENGTH 32
#define FDS_WRITE_CAPTURE_TIMER htim17
#define FDS_WRITE_CAPTURE_TIMER_CHANNEL 1
#define FDS_WRITE_DMA hdma_tim17_ch1
#define FDS_THRESHOLD_1 960
#define FDS_THRESHOLD_2 1120
// FDS emulation settings
#define FDS_MAX_SIDE_SIZE (65 * 1024) // 65000 + some space for gaps and crcs, largest ROM is 66080 bytes including gaps and crcs
#define FDS_MAX_FILE_PATH_LENGTH 4096
#define FDS_MAX_BLOCKS 256
#define FDS_MAX_BLOCK_SIZE FDS_MAX_SIDE_SIZE
#define FDS_READ_BUFFER_SIZE 128 // bits
#define FDS_WRITE_BUFFER_SIZE 32 // impulses
#define FDS_FIRST_GAP_READ_BITS 28300 // first gap size, bits
#define FDS_NEXT_GAPS_READ_BITS 976 // next gap size, bits
#define FDS_WRITE_GAP_SKIP_BITS 32 // dispose bits before writing
#define FDS_NOT_READY_TIME 1000 // disk rewind time, milliseconds
#define FDS_NOT_READY_TIME_ORIGINAL 5000 // disk rewind time for original speed mode
#define FDS_NOT_READY_BYTES 1024 // fast rewind after this amount of bytes of used data
#define FDS_MULTI_WRITE_UNLICENSED_BITS 32 // some unlicensed software can write multiple blocks at once
#define FDS_AUTOSAVE_DELAY 1000
// do not touch it
#define FDS_ROM_HEADER_SIZE 16 // header in ROM
#define FDS_ROM_SIDE_SIZE 65500 // disk side size in ROM
// special subdefines
#define FDS_GLUE(a, b) a##b
#define FDS_TIMER_CHANNEL_REG(v) FDS_GLUE(CCR, v)
#define FDS_TIMER_CHANNEL_CONST(v) FDS_GLUE(TIM_CHANNEL_, v)
#define FDS_TIMER_DMA_TRIGGER_CONST(v) FDS_GLUE(TIM_DMA_CC, v)
#define FDS_READ_PWM_TIMER_CHANNEL_REG FDS_TIMER_CHANNEL_REG(FDS_READ_PWM_TIMER_CHANNEL)
#define FDS_READ_PWM_TIMER_CHANNEL_CONST FDS_TIMER_CHANNEL_CONST(FDS_READ_PWM_TIMER_CHANNEL)
#define FDS_WRITE_CAPTURE_TIMER_CHANNEL_REG FDS_TIMER_CHANNEL_REG(FDS_WRITE_CAPTURE_TIMER_CHANNEL)
#define FDS_WRITE_CAPTURE_TIMER_CHANNEL_CONST FDS_TIMER_CHANNEL_CONST(FDS_WRITE_CAPTURE_TIMER_CHANNEL)
#define FDS_WRITE_CAPTURE_DMA_TRIGGER_CONST FDS_TIMER_DMA_TRIGGER_CONST(FDS_WRITE_CAPTURE_TIMER_CHANNEL)
typedef enum {
FDS_OFF, // disk image is not loaded
FDS_IDLE, // disk stopped
FDS_READ_WAIT_READY, // waiting for disk rewinding
FDS_READ_WAIT_READY_TIMER, // not-ready timer
FDS_READING, // reading data
FDS_WRITING_GAP, // waiting for gap terminator before writing
FDS_WRITING, // writing data
FDS_WRITING_STOPPING, // end of useful data, writing garbage
FDS_SAVE_PENDING // saving image
} FDS_STATE;
#define FDSR_WRONG_CRC 0x80
#define FDSR_INVALID_ROM 0x81
#define FDSR_OUT_OF_MEMORY 0x82
#define FDSR_ROM_TOO_LARGE 0x83
#define FDSR_READ_ONLY 0x84
#define FDSR_CANCELLED 0x85
FRESULT fds_load_side(char *filename, uint8_t side, uint8_t ro);
FRESULT fds_close(uint8_t save);
FRESULT fds_save();
void fds_check_pins();
FDS_STATE fds_get_state();
uint8_t fds_is_changed();
int fds_get_block();
int fds_get_block_count();
int fds_get_head_position();
int fds_get_max_size();
int fds_get_used_space();
extern TIM_HandleTypeDef FDS_READ_PWM_TIMER;
extern DMA_HandleTypeDef FDS_READ_DMA;
extern TIM_HandleTypeDef FDS_WRITE_TIMER;
extern DMA_HandleTypeDef FDS_WRITE_DMA;
extern TIM_HandleTypeDef FDS_WRITE_CAPTURE_TIMER;
#endif /* INC_FDSEMU_H_ */