#include #include "floppy-interface.h" FloppyStatus_t FloppyStatus = FP_READY; uint16_t FloppyTrack[FLOPPY_MAX_TRACK_SIZE]; void fpPutChar(uint8_t ch) { // состояния: 0 - ожидание байта длинны 1, 1 - ожидание байта длинны 2, 2 - ожидание команды, 3 - прием данных в случае команды записи трека static int state = 0; static uint16_t cmd_len; static size_t trackWriteIndex; switch (state) { case 0: // старший байт cmd_len = ch; state = 1; break; case 1: // младший байт cmd_len <<= 8; cmd_len |= ch; state = 2; break; case 2: if (ch == 10) { // запись трека, игнорируем размер посылки FloppyStatus = FP_READY; memset(FloppyTrack, 0, sizeof(FloppyTrack)); trackWriteIndex = 0; state = 3; } else if (ch == 1) { // установка FP_PLAY FloppyStatus = FP_PLAY; state = 0; } else if (ch == 2) { // установка FP_PAUSE FloppyStatus = FP_PAUSE; state = 0; } break; case 3: // длинна "заголовка" = 3 байта - 2 байта длинны *(((uint8_t*)FloppyTrack) + (trackWriteIndex++)) = ch; if (trackWriteIndex + 1 >= cmd_len) { state = 0; } break; default: state = 0; } } void FloppyPutData(const uint8_t* data, size_t len) { while (len--) { fpPutChar(*data++); } }