f103-floppotron/Core/Src/floppy-interface.cpp

62 lines
1.8 KiB
C++

#include <cstring>
#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++);
}
}