Это некоммерческая
разработка! Данная
программа была написана от нечего делать, а
также для того, чтобы изучить некоторые
вопросы программирования и передачи данных
посредством звуковой карты PC. Никаких претензий
не принимается!
Speccy Daemon
воплощает мою безумную студенческую
задумку - сделать из Спектрума терминал,
который мог бы работать на базе головного PC - компа. Только не спрашивайте, зачем это
нужно - тогда мне казалось, что это круто и
полезно. И я ничуть не жалею о потраченном
времени на этот проект - потому как получил
из этого большой практический опыт
программирования звука, многопоточных
приложений с синхронизацией, и разобрался с
сервисами. Буду рад, если кому-то ещё
пригодится то что я там понаписал.
Даемон слушает линейный вход звуковой
карты на предмет поступления сигнала,
аналогичного тому, посредством которого в
Спектруме ведётся запись на магнитофон, и
принимает блок данных со Спектрума. После
этого выполняет переданную команду, и
возвращает результат таким же образом,
понятным Спектруму - эмулируя
магнитофонный сигнал. Соответственно на
Спектруме также крутится оболочка
терминала, которая позволяет: ввести
команду с клавиатуры, отправить на
магнитофон блок данных, принять ответный
блок данных, вывести результат на экран - и
всё сначала.... К сожалению эта часть у меня
лежит на одном из нескольких десятков
спектрумских дисков там же где и сам
Спектрум, который сейчас находится в
нерабочем состоянии. Дисковод 5"25 также
уже успел спрыгнуть с 1м - высоты.
Вряд ли в ближайшее время я
доберусь и восстановлю это хозяйство.
Потому предлагаю пока то что есть.
Программуля задумывалась как сервис, но
данная версия сделана как оконное
приложение, чтобы можно было прослеживать и
управлять его работой. Сделать же сервис из exe-шника
не представляет проблемы - достаточно
прописать несколько строк в реестре. В
конце концов - не это главное! (На 9х Маздае
вообще нет сервисов
)
Здесь реализован только текстовый режим,
в котором cо
Спектрума можно запустить командный
интерпретатор ДОС "command.com" и
работать с его командами. Сеанс завершается
командой "exit".
После того как был проведён первый сеанс
связи, моё желание было удовлетворено и
проект благополучно направился в архив.
Хотя там есть места, над которыми стоит
поработать и вылизать. Но в целом это
рабочая Альфа-версия. По замеченные баги -
напишу дальше.
Окно программы выглядит так:

Текстовое окно служит для вывода вспомогательной информации, а также в нём можно писать.
Кнопки:
Start - запустить даемона, т.е. поток прослушивания и обработки Аудио-входа.
Stop - остановить даемона и освободить все буферы wave-интерфейса
Output - отправить на Спектрум последнюю строку в текстовом окне.
DOS - запустить вручную командный интерпретатор (на Win9x - это будет command.com, на WinNT - cmd.exe)
CON: out - отправить последнюю строку в окне как команду интерпретатору (для отладочных целей)
Результат, возвращённый интерпретатором выводится блоками не более 510 байт на звуковую карту (на Спектрум ), и сразу после этого Даемон переключается в режим приёма команды (прослушивание входа). Я не стал (не смог) сделать, чтобы чтение и запись звука работали одновременно, поэтому это происходит последовательно.
Если охота послать команду вручную (кнопки Output или CON: Out) - Перед этим нажмите кнопочку "Stop"
Формат данных блока, которыми происходит обмен данными:
2 байта - длина блока (N), затем собственно данные N байт
Спектрум посылает просто блоки без
заголовка. Длина такого блока неизвестна, а
передачу длины данных в первых 2х байтах
блока я не реализовал на Спектруме. Поэтому
в программе по умолчанию длина принимаемой
строки = 31. (в конце дополняется нулями) Хотя
предусмотрено считывание длины блока.
Для этого в файле speccyd.cpp
найти и закомментировать строку "datalen=31;",
а соответственно раскомментировать
предыдущую строку.
Чтобы запустить коммандный интерпретатор co Спектрума, надо послать строку "command.com"
PC отсылает блоки не более 512 байт, из которых 2 первых байта - длина данных. Спектрум смотрит, если длина данных максимальна (=510), то считается, что после этого должен следовать дополнительнй блок данных. Так же точно определяется конец данных при считывании из канала stdout командного интерпретатора. Это не хорошо, т.к. есть вероятность 1/510 что длина данных окажется ровно 510 байт, а мы будем ждать дальше. Но лучшего способа я тогда не нашёл. Сложность ещё в том, что чтение из stdout - синхронное.
Проект написан на старом добром BC5 - когда-то он был удобнее VC. Хотя сейчас конечно всё очевидно, BC - кончился, а VC стал стандартом. Впрочем, не вижу сложностей загнать всё это в VC-проект
В проект входят файлы
speccymf_m.cpp - Модуль
низкоуровневой работы со звуком (ввод-вывод
битов и байтов)
speccymf.h - H-файл модуля
speccymf_m.cpp
speccyd.cpp - основная
программа (здесь вся логика и потоки ввода-вывода)
speccyd.rc - ресурсы (вид окошка,
кнопочки)
speccyd.rh - H-файл ресурсов
Чтобы компилировать под NT - задайте в начале файла speccyd.cpp переменную WIN_NT (#define WIN_NT). Под Win9x наоборот - (#undef WIN_NT).
В архиве также лежит рабочий exe-шник, скомпиленный под Win2K
© 1998-2003 = S I M i X =