Передовица (меню разделов)
⇓
Эмуляторы/утилиты
⇓
Старый ДОСовский эмулятор
Самый ранний, но доведённый до вполне завершенного состояния, эмулятор. По сравнению с другими эмуляторами менее удобен и имеет меньше возможностей, однако это был тот постамент, без которого не появился бы эмулятор Agat Free.
Эти архивы опубликованы в 2010 году. Включают в себя некоторые дополнения, сделанные за последние шесть лет. Ничего существенного и принципиального со времени выхода эмулятора 9-альфа не произошло. Но количество мелких и средних дополнений превысило критический уровень, поэтому я решил обновить архивы сайта.
Эмуляторы. 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 - работает в мониторе виртуальной машины.
Используется для поиска пути, по которому забрел виртуальный проц
в очередной глюк.