сделал запись трека через юсб
This commit is contained in:
61
Core/Src/floppy-interface.cpp
Normal file
61
Core/Src/floppy-interface.cpp
Normal file
@@ -0,0 +1,61 @@
|
||||
#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++);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user