≡ Передовица » Эмуляторы/утилиты » Старый ДОСовский эмулятор
Старый ДОСовский эмуляторЭти архивы опубликованы в 2010 году. Включают в себя некоторые дополнения, сделанные за последние шесть лет. Ничего существенного и принципиального со времени выхода эмулятора 9-альфа не произошло. Но количество мелких и средних дополнений превысило критический уровень, поэтому я решил обновить архивы сайта.
Создание эмулятора вообще задача не самая простая. Создать пакет: эмулятор + живой софт для него - еще сложнее. Но создать эмулятор нескольких версий Агата и подготовить живой софт для них - это вообще нереально :).
В первую очередь потому, что Агаты - это наиболее яркий известный мне пример жуткого количества наработок, совершенно лишенный не то, что какой-то стандартизации, но, хуже того: даже попыток хотя бы сделать какие-то предупреждения о том, что один компонент системы может быть неоднозначно понят другим компонентом. Я старался сделать эмуляторы наиболее соответствующим реальным машинам, и это было не очень сложно, особенно эмулятор семерки - эта машина у меня есть, когда-то я занимался их ремонтом, переделками и написанием различного софта. Однако, что касается прилагаемой коллекции агатовского софта: сделать ее удобной для использования вами (собственно, выражение не совсем верное - вряд ли вы действительно будете набирать тексты в "Агат-авторе" или делать что нибудь подобное) или, по крайней мере, приделать бирочки с комментариями к каждому экспонату - как положено в порядочном музее - просто физически сложная задача: коллекция содержит почти 4 тысячи файлов (Это было около 2008 года. В 2015 году запасники нашего музея включали в себя 46 тысяч файлов. Да, у нас есть утилиты поиска копий: как точных так и приблизительных и мы стараемся не плодить повторы)... Однако со значительной их частью я общался достаточно близко, поэтому если у вас возникнут вопросы или поправки к моим комментариям - пишите :) Пользуясь случаем, выражаю признательность тем, кто присылал агатовские диски: это сильно помогало отлаживать эмуляторы и сопутствующий им софт. За более чем 10 лет существования этого сайта мы получили десятки коллекций, некоторые из которых включали в себя сотни дискет (А вы знаете, как выглядит МЕШОК дискет весом 10 кг ? Жаль, я не сфотографировал...). Эмуляторы. 301 Кб. Здесь три версии эмулятора: Агат-7, Агат-9, Агат-9l. Все они - программы для MS-DOS-совместимой операционной системы (как и другие программы, представленные здесь), разрабатывались таким образом, чтобы быть минимально требовательными к периферийной аппаратуре. В частности, они не используют VESA-графику, ограничиваясь различными режимами VGA. Это делалось специально, чтобы максимально улучшить совместимость с различными версиями Windows и вместе с тем не потерять совместимость с MS-DOS-совместимыми ОС. Однако, в Windows Vista эмулятор всё таки работать, вероятно, не будет, так что знакомтесь с DosBox и прочими вирутальными машинами. Либо попробуйте Live-CD. Исходники эмулятора. 32 Кб. Исходники для всех версий общие, язык - ассемблер (tasm). Утилиты сопровождения. 332 Кб. Скомпилированные, MS-DOS-совместимые, EXE-файлы, а также исходные тексты (Turbo и Free Pascal). Архив включает в себя следующие программы:
Разные замечания по эмулятору, вместо документации Дисплей: - В семерке эмулируются все режимы семерки. - В девятке эмулируются все режимы девятки. - Регистры управления палитрой девятки влияют только на режим 256x256x4. - Text64x32 всегда выводится пользовательским образом, может быть изменен клавишей f11 и не зависит от программного переключателя. - Мерцание в тексте идет в парилку и несет флаг. - Знакогенератор девятки вроде правильный (хотя с документацией не совпадает, зато совпадает с программами). - Расширение знакогенератора семёрки (ниже 128-го символа) придумывал сам, поэтому совпадает только с моими программами. - Для работы достаточно VGA, поэтому не конфликтует с VESA-WINDOWS-BIOS и прочим. - Поддерживается бит яркости и опциональный файл палитр - agat.pal. Текстовый файл, 16 строк, три колонки разделённые одной tab - можно указать RGB яркости (0..255) для каждого агатовского цвета. Если файла нет - эмулируется обычный цветной монитор. Флоп 140к: - Подключен на $C3xx и $C0Bx в семёрке и девятке и на $C6xx и $C0Ex в 9-альфа. - Имя файла-образа первого привода по умолчанию "test140.img", второго - "test140_.img". Но в процессе работы можно выбирать другие имена. - ROM у семерки и девятки отличается ! Это связано, вероятно, с развитием PnP BIOS. - Вращение диска происходит только при обращении к портам ввода/вывода дисковода. - Флаг ReadOnly на файле-образе передается как сигнал write protect в виртуальный дисковод. - Не эмулируется огромная палитра вывертов, связанных со взаимодействием секвенсора и защелок контроллера. Но пока не попадалось и программ, которым бы это было важно. - Поскольку модель дисковода не очень точно соответствует реальному устройству, может не всегда работать форматирование образа. Но несколько форматтеров я проверил... Работают :) Флоп 840к: - Подключен на $C5xx и $C0Dx. - Работает и запись и чтение и форматирование. Не идеально эмулируется запись/чтение синхросбоя, но достаточно точно для 99 % известных прог. - Очень приблизительно эмулируется работа вв55-х (в штатном режиме всё нормально, но BTK, например, иногда балуется и нештатным режимом - эмулятор учитывает это, но очень приблизительно - т.е. лишь бы работало). - Имя файла-образа первого привода "test800.img", второго - "test800_.img", но в процессе работы можно выбирать другие имена. - Вращение происходит при обращении к портам ввода/вывода (на байт), при чтении состояния (на ~ два бита) и при выполнении любых других команд виртуальной машиной (порядка нескольких сотен команд на байт, и только при включенном шпинделе). - Флаг ReadOnly на файле-образе передается как сигнал write protect в виртуальный дисковод. Эмулятор при выключенном Num Lock эмулирует num pad Агата через num pad AT следующим образом: /--------------------\ | ф1 | ф2 | ф3 | - агатовская кнопка | 7 | 8 | 9 | - ибмовская кнопка | Home | ^ | PgUp | |--------------------| | ф4 | ф5 | ф6 | | 4 | 5 | 6 | | < | | > | |--------------------|-----\ | ф7 | ф8 | ф9 | | | 1 | 2 | 3 | E | | End | V | PgDn | n | |--------------------| t | | ф0 | ф. | ф= e | | Ins | Del | r | ==================== | ф0 | ф. | ф= | - Это та клавиатура, что над стрелками |Insert| Home |PageUp| |--------------------| | F1 | F2 | F3 | |Delete| End |PageDn| \--------------------/ Управление виртуальной машиной: F1 - help (справка по кнопкам) F2 - reset (Упр-Сбр) F3 - раскладка клавиатуры (qwerty/jcuken) Смена имени образа: Shift-F3 - s3d1 140к Shift-F4 - s3d2 140к Shift-F5 - s5d1 840к Shift-F6 - s5d2 840к F5 - монитор виртуальной машины F6 - сброс состояния (не реализовано) F7 - чтение состояния (не реализовано) F8 - sound on/off F9 - power (щелчок питанием: 7: $3f3,4 <- const, mem cfg <- 0, reset 9: $3f3,4 <- const, c085 <- const, reset ) F10 - exit (выход из эмулятора) F11 - смена цветового режима text64x32 F12 - вкл/выкл пультов/мыши. Некоторые проги (lode runner, например) неадекватно реагируют на наличие пультов, поэтому по умолчанию они выключены. Scrool lock - этот программный переключатель действует аналогично агатовскому РУС-РЕГ. Кто не помнит: клавише РЕД соответствует ESC ;) Вот клавиши ПВТ к огромному сожалению на ATшной клавиатуре нету :(( Ждать 0.25 секунды до автоповтора иногда долго. Да, IMHO, и 30 знаков в секунду - это тоже мало. Я свою агатовскую клаву разгонял знаков до 40-50). Оба эмулятора понимают в качестве дисков специальные nibble - файлы. Фактически, это последовательности байт, которые читаются/пишутся непосредственно в порт дисковода при работе RWTS. 140: - Формат используется в некоторых эмуляторах Apple][, откуда и взят мной без изменений. Проблемм с ним не обнаружено. - Прога для конверсии обычного образа в nibble называется nibble14 и может гонять как образ в nibble, так и назад. Но она не умеет создавать nibble, поэтому ей для прямой конверсии нужен любой nibble с правильными полями адреса и безразличным содержимым полей данных. Для конверсии просто укажите в командной строке имя исходного файла и файла назначения. По размеру исходного будет определено направление конверсии. 800 (nib/im): - Формат предложен мной. Ныне признан устаревшим. Поэтому есть утилита nib2aim для прямой конвертации в новый формат. - Прога для конверсии обычного образа в nibble называется nibble80. При этом nibble-болванка не требуется. В командной строке указывается имеющийся образ и желаемое имя nibble. 800 (aim): - Формат был предложен мной в связи с тем, что в NIB/AIM нет возможности создавать сильно нестандартные диски. А это требуют некоторые схемы защиты от копирования. - Обе утилиты (и для AIM и для NIB/IM) помимо DSK-образа могут понимать ещё некоторые файлы-спутники, содержащие дополнительную информацию о служебных полях (VOL, EXT, SEQ). Опять же - это необходимо для удовлетворения защит. Пульты: - Эмулируются через мышь. Но не совсем точно, поэтому движения могут быть слишком резкими. - Игрушка lode runner прикидывается зависшей, если ее запустить при включенных пультах. Вероятно, это ее собственная проблемма. Мышь "Марсианка": - Эмулируется через мышь обычную. - Может косить под Марсианку-через-параллельный-порт, либо Марсианку-через-NippelMouseCard (NMC). - И пульты и мыши переключаются клавишей F12. Загрузка: - По умолчанию семерка порывается грузится с 840к, а девятка - со 140к. Если не нравится - быстро нажмите f2 [если не успели - f9 и сразу f2], а затем вручную: C300G или C500G. Баги: - В работе семерки ошибок не обнаружено. - В работе девятки, вероятно, есть какие-то глюки, связанные с откликом устройств. Но выловить пока не могу. См также images\, особенно с ключевыми строками "!!!+++be94" - это оттуда. Конкретно эту ошибку удается нейтрализовать, если после процедуры анализа аппаратуры исправить ее результат в памяти VM, но это не есть rules. Есть мнение, что это какая-то ошибка конфигураторов p'n'p, потому что она перестала проявлятся после перехода на 9-альфа. Отличия для программ там только в том, что флопик 140 перенесён на 6 слот с третьего. Но может быть я исправил и что-то ещё, не обратив на это внимания. - Собственно, в настоящий момент мне известно три проявления глюкавости эмулятора девятки, которые повторяются на разных дисках и прогах из разных источников. Условно я пока называю их так: "!!!+++be94" - глюк в определении аппаратуры в kermit95, например. "СЧМ9" - передача управления на незадействованные адреса. Пока подробно не разбирался с ней. "РАПИРА" - странное управление памятью - когда не надо переключать банк памяти, рапира его переключает и имеет fault. Если переключение обойти (sta ) - все работает. Этот косяк тоже куда-то делся после перехода на 9-альфа. - Вроде нашел причину завесок эмулятора девятки. Вероятно, это результат выполнения фрагмета вроде sta c700,x\inx\jmp start. При этом эмулятор начинает постоянно обращаться к vga-bios, что приводит к растяжению виртуального времени и, как следствие, отсутствиям реакции на внешнее раздражение. В связи с этим введен анализ клавиши Alt - при ее удержании эмулятор перестает отрабатывать длительные опрерации с физический аппаратурой, а также выполняет все команды без задержки. Этим удобно пользоваться, чтобы быстро прокрутить какую нибудь заставку игры, например. - При работе Рапиры, которая была для семерки и шла вместе с ней еще в, кажется, 1988 году, вылетает недопустимый опкод. Но если его пропустить, все работает. Я предполагаю, что это ошибка в рапире, которая на реальном железе просто обрабатывается как недокументированная команда (у 6502 море недокументированных команд - у меня есть их описания. Эмулятор их не выполняет, т.к. в реальном софте я их практически не встречал). Прочее: - По сообщению Олега Воронова в реальной девятке отклик несуществующих устройств неопределен. В то же время могу заверить, что в семерке он был очень даже определен благодаря наличию 1к резюков, притягивающих ШД к единицам, если какое либо устройство не тянуло бит к нулю. Однако в эмуляторе девятки случайностей не предусмотрено... Хотя, в общем, можно это сделать, если надо. В общем, в результате, в эмуляторе семерки неиспользуемые адреса в районе cXYY отзываются $FF, а в девятке: $CX. - Прерывания от таймера есть, но они привязаны к виртуальному, а не реальному времени - определенное количество прерываний на определенное количество выполненных команд. Благодарности: - Сергей Морев: за присланную документацию на девятку - Олег Воронов и Игорь Бончан: за образы дисков и консультации - Стажер: за кривой, но все таки набранный эмулятор 6502 - Голов, Цикоза, Бадер,....: за исходные данные для железа и эмуляторов [У вас точно ничего больше не осталось ? ;)))] - И многих других за многое прочее ;) Системное ПЗУ Агат7 немного исправлено: по resetу при проверке $3f3-4 не выполняется передача управления на [$3f2], а только вываливается в system monitor. Ни на одной проге это пока не отразилось. Исправление было сделано еще на натуральном железе, а потом попало в файлы эмулятора. Если вам кажется, что VM висит - нажмите F1. Правильно работающий эмулятор, независимо от проделок программы, исполняющейся в VM, нарисует встроенный help по клавишам. Если не помогло - нажмите и удерживайте alt. В монитора виртуальной машины действуют следующие кнопки [регистр важен !]: s - выполнить одну команду ВМ g - GO !!! j - установить dr0 на следующую за текущей команду, после чего GO !!! (это для прохождения подпрограмм, например) b - break point по адресу команды a - скорость эмуляции A - break point по адресу аргумента v - установка начального адреса дампа виртуальной памяти из 8 байт, который выводится под регистрами зеленым цветом e - изменение байта, на который указывает 'v' Q - выход из эмулятора r - reset (PC=word[$fffc]) R - щелчок питанием u,d - сдвиг монитора по экрану (не надо задвигать его за границы экрана - получите General Protect Fault) m - записать некоторое значение по заданному адресу. Используется для воздействия во время отладки на программные переключатели ($Cxxx) h - справка по доступным кнопкам W - сброс всей памяти на диск в файл dump.bin. F - забивание всей памяти заданной 32-разрядной константой. p - вывод последних 16-и значений PC - работает в мониторе виртуальной машины. Используется для поиска пути, по которому забрел виртуальный проц в очередной глюк. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |