Передовица » Эмуляторы/утилиты » Старый ДОСовский эмулятор

Старый ДОСовский эмулятор

Эти архивы опубликованы в 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). Архив включает в себя следующие программы:

  • dos33 - оболочка для управления образами дисков "Агата". Ныне признана устаревшей и заменена на Dos33 Core2. Информацию о ней см здесь.
  • fil2lfn - утилитка обработки длинных имен. Переименовывает FIL-файлы, стараясь сделать их имя наиболее похожим на имя агатовского файла, лежащего в этом контейнере. Работает под MS-DOS, но запускать её имеет смысл именно под Windows - тогда FIL-файлы получают полные длинные имена (длина имени в агатовской файловой системе составляла 30 знаков). Утилита была предназначена для восстановления имён, обрезанных MS-DOS, и в обычной жизни редко бывает нужна.
  • nibble - утилиты для конвертации образов дисков. Эти же утилиты включены в архив с эмулятором.
  • blend - утилита объединения образов. Нужна при реконструировании неуверенно читающихся дисков. Подробно описана здесь.
  • cs - подсчитывает контрольную сумму для всех, найденных в текущем каталоге, DSK-образов. Подсчёт ведётся по алгоритму, подобному имеющемуся в копировщике ИКП.
  • fontedit - корявый редактор шрифтов, используемых в эмуляторе.
  • nearfind - утилита исследует дерево каталогов в поисках FIL-контейнеров и сравнивает их содержимое. Используется для поиска в коллекции повторов.

Разные замечания по эмулятору, вместо документации

Дисплей:
  - В семерке эмулируются все режимы семерки.
  - В девятке эмулируются все режимы девятки.
  - Регистры управления палитрой девятки влияют только на режим 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 - работает в мониторе виртуальной машины.
    Используется для поиска пути, по которому забрел виртуальный проц
    в очередной глюк.

Использование материалов проекта agatcomp без получения предварительного письменного разрешения agatcomp запрещено.


Почта для обратной связи: mail@agatcomp.ru


Живое общение по теме Агата: Telegram группа Agatcomp.


Накопленные знания и проекты: тематический ФОРУМ.


© 2004-2024 agatcomp.su / agatcomp.ru

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *