Speccy Daemon

Это некоммерческая разработка!  Данная программа была написана от нечего делать, а также для того, чтобы изучить некоторые вопросы программирования и передачи данных посредством звуковой карты 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 =

Hosted by uCoz