2023-10-23 09:16:16 +03:00
|
|
|
|
#include <system.h>
|
|
|
|
|
|
|
|
|
|
static inline void outb(uint16_t port, uint8_t val) {
|
|
|
|
|
asm volatile("outb %0, %1" : : "a"(val), "Nd"(port));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline uint8_t inb(uint16_t port) {
|
|
|
|
|
uint8_t ret;
|
|
|
|
|
asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port));
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void usleep(uint64_t ticks) {
|
|
|
|
|
for (uint64_t i = 0; i < ticks * 100; i++) { asm volatile("pause"); }
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-25 00:07:32 +03:00
|
|
|
|
static inline void play_sound(unsigned int frequency) {
|
|
|
|
|
uint32_t div;
|
|
|
|
|
uint8_t tmp;
|
|
|
|
|
|
2023-10-29 16:12:00 +03:00
|
|
|
|
// Устанавливаем частоту таймера
|
2023-10-25 00:07:32 +03:00
|
|
|
|
div = 1193180 / frequency;
|
2023-10-29 16:12:00 +03:00
|
|
|
|
outb(0x43, 0xB6);
|
2023-10-25 00:07:32 +03:00
|
|
|
|
outb(0x42, (uint8_t)(div));
|
|
|
|
|
outb(0x42, (uint8_t)(div >> 8));
|
|
|
|
|
|
2023-10-29 16:12:00 +03:00
|
|
|
|
// Воспроизводим мелодию
|
2023-10-25 00:07:32 +03:00
|
|
|
|
tmp = inb(0x61);
|
|
|
|
|
if (tmp != (tmp | 3)) { outb(0x61, tmp | 3); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void nosound( ) {
|
|
|
|
|
uint8_t tmp = inb(0x61) & 0xFC;
|
|
|
|
|
|
|
|
|
|
outb(0x61, tmp);
|
|
|
|
|
}
|
2023-10-23 09:16:16 +03:00
|
|
|
|
|
2023-10-29 16:12:00 +03:00
|
|
|
|
module_info_t init(env_t *env) {
|
2023-10-24 23:39:00 +03:00
|
|
|
|
init_env(env);
|
2023-10-29 18:41:54 +03:00
|
|
|
|
fb_printf("Программа инициализирована!\n");
|
2023-11-07 22:34:26 +03:00
|
|
|
|
return (module_info_t){
|
|
|
|
|
.name = (char *)"Мелодия",
|
|
|
|
|
.message = (char *)"Надеюсь скоро тут будет тетрис!",
|
|
|
|
|
.err_code = 404,
|
|
|
|
|
};
|
2023-10-29 16:12:00 +03:00
|
|
|
|
|
2023-10-23 09:16:16 +03:00
|
|
|
|
// Массив с нотами
|
2023-10-23 17:20:15 +03:00
|
|
|
|
unsigned int tetris_notes[] = { 0 };
|
2023-10-23 09:16:16 +03:00
|
|
|
|
|
|
|
|
|
// Расчет количества нот в мелодии
|
2023-10-29 16:12:00 +03:00
|
|
|
|
uint64_t num_notes = sizeof(tetris_notes) / sizeof(tetris_notes[0]);
|
2023-10-23 09:16:16 +03:00
|
|
|
|
|
|
|
|
|
// Начальное значение для подсчета времени
|
|
|
|
|
int note_duration = 1000000; // 1 секунда
|
|
|
|
|
|
|
|
|
|
// Зацикленное воспроизведение мелодии в течение минуты
|
2023-10-29 16:12:00 +03:00
|
|
|
|
for (uint64_t i = 0; i < num_notes; i++) {
|
2023-10-23 09:16:16 +03:00
|
|
|
|
// Воспроизведение ноты с заданным временем
|
|
|
|
|
play_sound(tetris_notes[i]);
|
|
|
|
|
usleep(note_duration);
|
|
|
|
|
|
|
|
|
|
// Уменьшение времени для следующей ноты
|
|
|
|
|
note_duration -= note_duration / 24; // Уменьшение на 1/24 каждый раз
|
|
|
|
|
}
|
|
|
|
|
}
|