сделал запись трека через юсб
This commit is contained in:
parent
b3b04f5714
commit
4622e29d02
27
Core/Inc/floppy-interface.h
Normal file
27
Core/Inc/floppy-interface.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef FLOPPOTRON_FLOPPY_INTERFACE_H
|
||||||
|
#define FLOPPOTRON_FLOPPY_INTERFACE_H
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#define FLOPPY_MAX_TRACK_SIZE 4096
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// статус Floppy-проигрывателя
|
||||||
|
enum FloppyStatus_t {
|
||||||
|
FP_READY = 0,
|
||||||
|
FP_PLAY,
|
||||||
|
FP_PAUSE,
|
||||||
|
};
|
||||||
|
extern enum FloppyStatus_t FloppyStatus;
|
||||||
|
extern uint16_t FloppyTrack[FLOPPY_MAX_TRACK_SIZE];
|
||||||
|
|
||||||
|
void FloppyPutData(const uint8_t* data, size_t len);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //FLOPPOTRON_FLOPPY_INTERFACE_H
|
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++);
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
#include "floppy.h"
|
#include "floppy.h"
|
||||||
|
#include "floppy-interface.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
#define FLOPPOTRON_TICK_SPEED (uint16_t)(72000000 / 3600)
|
#define FLOPPOTRON_TICK_SPEED (uint16_t)(72000000 / 3600)
|
||||||
@ -121,231 +122,60 @@ void FloppyDriveInitialize() {
|
|||||||
|
|
||||||
// хандлер для проигрывания нот
|
// хандлер для проигрывания нот
|
||||||
void FloppyTrackTick() {
|
void FloppyTrackTick() {
|
||||||
// байткод для 100bpm, тестовая мелодия
|
static const uint16_t* pc = FloppyTrack;
|
||||||
const static uint16_t bytecode[] = {
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 262, FT_CMD_WAIT | 50, // '1''
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 262, FT_CMD_WAIT | 50, // '1''
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4'
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' '
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6'
|
|
||||||
// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5'
|
|
||||||
//
|
|
||||||
// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 500,
|
|
||||||
|
|
||||||
// недо-имперский марш
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 10, // '3'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 10, // '3'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 10, // '3'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 196, FT_CMD_SET_FRQ2 | 196, FT_CMD_WAIT | 10, // '5'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 10, // '3'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 10, // '1'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 196, FT_CMD_SET_FRQ2 | 196, FT_CMD_WAIT | 10, // '5'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 10, // '3'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_WAIT | 10, // '_'
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 10, // ' '
|
|
||||||
|
|
||||||
FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 500,
|
|
||||||
FT_CMD_STOP
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint16_t* pc = bytecode;
|
|
||||||
static uint16_t wait = 0;
|
static uint16_t wait = 0;
|
||||||
|
|
||||||
if (wait == 0) {
|
if (FloppyStatus == FP_READY) {
|
||||||
while (wait == 0) {
|
pc = FloppyTrack;
|
||||||
uint16_t cmd = *(pc++);
|
wait = 0;
|
||||||
uint16_t value = cmd & (~FT_CMD_MASK);
|
} else if (FloppyStatus == FP_PLAY) {
|
||||||
switch (cmd & FT_CMD_MASK) {
|
// байткод для 100bpm, тестовая мелодия
|
||||||
case FT_CMD_STOP:
|
|
||||||
pc = bytecode; // просто все начнем сначала
|
|
||||||
drives[0].setEnable(false);
|
|
||||||
drives[1].setEnable(false);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FT_CMD_NOTES_ON:
|
if (wait == 0) {
|
||||||
if (value & 1) {
|
while (wait == 0 && FloppyStatus == FP_PLAY) {
|
||||||
drives[0].setEnable(true);
|
uint16_t cmd = *(pc++);
|
||||||
}
|
uint16_t value = cmd & (~FT_CMD_MASK);
|
||||||
if (value & 2) {
|
switch (cmd & FT_CMD_MASK) {
|
||||||
drives[1].setEnable(true);
|
case FT_CMD_STOP:
|
||||||
}
|
pc = FloppyTrack;
|
||||||
break;
|
|
||||||
|
|
||||||
case FT_CMD_NOTES_OFF:
|
|
||||||
if (value & 1) {
|
|
||||||
drives[0].setEnable(false);
|
drives[0].setEnable(false);
|
||||||
}
|
|
||||||
if (value & 2) {
|
|
||||||
drives[1].setEnable(false);
|
drives[1].setEnable(false);
|
||||||
}
|
FloppyStatus = FP_READY;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FT_CMD_WAIT:
|
case FT_CMD_NOTES_ON:
|
||||||
wait = value;
|
if (value & 1) {
|
||||||
break;
|
drives[0].setEnable(true);
|
||||||
|
}
|
||||||
|
if (value & 2) {
|
||||||
|
drives[1].setEnable(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case FT_CMD_SET_FRQ1:
|
case FT_CMD_NOTES_OFF:
|
||||||
drives[0].setFreq(value);
|
if (value & 1) {
|
||||||
break;
|
drives[0].setEnable(false);
|
||||||
|
}
|
||||||
|
if (value & 2) {
|
||||||
|
drives[1].setEnable(false);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case FT_CMD_SET_FRQ2:
|
case FT_CMD_WAIT:
|
||||||
drives[1].setFreq(value);
|
wait = value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FT_CMD_SET_FRQ1:
|
||||||
|
drives[0].setFreq(value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FT_CMD_SET_FRQ2:
|
||||||
|
drives[1].setFreq(value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
wait--;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
wait--;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -22,7 +22,7 @@
|
|||||||
#include "usbd_cdc_if.h"
|
#include "usbd_cdc_if.h"
|
||||||
|
|
||||||
/* USER CODE BEGIN INCLUDE */
|
/* USER CODE BEGIN INCLUDE */
|
||||||
|
#include "floppy-interface.h"
|
||||||
/* USER CODE END INCLUDE */
|
/* USER CODE END INCLUDE */
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
@ -259,6 +259,7 @@ static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
|
|||||||
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
|
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN 6 */
|
/* USER CODE BEGIN 6 */
|
||||||
|
FloppyPutData(Buf, *Len);
|
||||||
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
|
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
|
||||||
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
|
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
|
||||||
return (USBD_OK);
|
return (USBD_OK);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user