62 lines
1.8 KiB
C++
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++);
|
|
}
|
|
}
|