-
Вложений: 1
VZX - исходники.
Здравствуйте!
Решил выложить здесь исходники своего старого эмулятора ZX Spectrum, потому как плохо себе представляю, где это еще может быть уместно. Прошу не судить строго - местами исходникам до 10 лет, я тогда писал как умел. Собственно, выкладываю исходники не для суждения, а для того, чтобы они принесли кому-нибудь хоть какую-то пользу.
Написано все на асме, под tasm 5.0. Вообще всего имеется 3 версии эмуля:
1) для работы в реальном/виртуальном режиме 80x86 (исходники утеряны);
2) для работы в ручном защищенном режиме (требуется чистый DOS реального режима);
3) для работы в защищенном режиме через DPMI (нерабочая версия).
В прилагаемом архиве имеется только две последних версии, причем версия 2 запустится из-под DOS при условии отсутствия EMM/QEMM и подобных менеджеров памяти, переводящих процессор в виртуальный режим. Более того, насколько я помню, работа версии 2 НЕ эмулируется ни DOSBox'ом (последний DOSBox 0.70 я еще не пробовал), ни VMWare, ни Virtual PC. Тем не менее, стоит попробовать запустить под виртуалкой последней версии, вдруг заработает.
Для того, чтобы откомпилить эмулятор, необходимы исполняемые файлы tasm.exe и tlink.exe. Батник az.bat проделает всю необходимую работу вплоть до получения exe-файла.
Далее. Для того, чтобы полученный exe-шник не ругался при запуске, необходимо положить в ту же папку файлы 48basic.rom, 128basic.rom и trdos.rom с соответствующим содержанием. Можно добавить туда же пару-тройку образов (по одному на дисковод) trd с названиями disk1.trd, disk2.trd и т.д.. Все это я не стал здесь выкладывать для минимизации размеров архива.
Теперь немного о самом эмуляторе. Называется Virtual ZX. По старту переключается в защищенный режим, проверяет командную строку (где можно указать загружаемый *.sna или *.z80), считывает файл vzx.cfg, читает и разбирает файл vzx.ini, настраивает аппаратуру (проверяет/определяет наличие SB-совместимого аудио, настраивает видеорежим) и вываливается в нормальную работу. Если был указан снэпшот, то загружает его.
В файле readme.etm указаны некоторые горячие клавиши, а также некоторые ключи для файла vzx.ini.
Что еще можно сказать. Версия 3 постепенно дорабатывается (но очень и очень медленно) до рабочего состояния. Если кто хочет помочь мне в этом нелегком деле, милости прошу. Одному осилить сложно - нет уже того задора и нет времени, тем не менее, версия 3 в архиве успела немного устареть. Возможно, буду здесь иногда выкладывать для нее обновления. Но это только тогда, когда заработает :).
Много чего понаписал, постарался предоставить полную информацию, но осталось ощущение чего-то забытого. Извиняйте за сумбур :)
P.S. Latest version here
-
Вложений: 1
Как и говорил ранее, выкладываю обновление, не прошло и полгода ;).
Полностью перешел под DOS-extender (dos32/a либо совместимый), по-быстрому слабал пока единственный работающий видеорежим (VideoModeSecondary = 2), хотя если имеется VGA-совместимая видеокарта, то старые псевдографические режимы тоже должны работать (0 и 1). Синхронизация с вертикальным обратным ходом луча временно отсутствует...
По ходу сломал мультиколор, точнее, сбил его позицию для Pentagon'а, но это легко исправить...
Также сначала сломал работу со снэпшотапми, сейчас восстановлено только чтение *.sna (как оказалось, не полностью, некоторые файлы обрабатываются неправильно).
Аудио (вход/выход) сломано, верну взад попозже, сейчас есть проблемы поважнее :).
Пока работает под виртуалками либо под DOS; в DOS-окне под Win2k/xp/2k3 не работает, почему-то пропадают прерывания при попытке переключения в графический режим, либо при попытке получить информацию о VBE/VESA.
Забыл сказать - изменился формат *.cfg, старый файл конфигурации можно просто удалить перед запуском vzx.exe-шника.
Вследствие перехода под DOS-extender компиляция производится теперь посредством tasm/wlink.
На сегодня все, спасибо за внимание, исходники прилагаются :), tasm/wlink можно найти в инете или я могу прислать по запросу.
-
Вложений: 1
Всем привет!
Снова выкладюываю обновление. Что сделано и нет, по пунктам:
1) Видеорежимов теперь два: VideoModeSecondary=0 (псевдографический) и VideoModeSecondary=2 (графический, более совместимый). Добавлен ключ ForceVGA=ON или OFF - если понадобится изменять размеры видимой области (а вместе с ними и частоту кадров), а видяха при этом "врет", будто она не совместима с VGA. Размеры изменяются при помощи ключей VideoXVisible и VideoYVisible. Всё отлично прокатывает в эмуляторе DOSBox (текущая версия 0.72), а также на некоторых реальных машинах под DOS/Windows.
2) С мультиколором дела обстоят получше, но не до конца. Пришлось подобрать ориентировочные значения ключей HorizontalRetrace и VerticalRetrace, чтобы правильно отображались пентагоновские демки. Однако эти ориентировочные значения не соответствуют тем, что должны быть.
3) Работа со снапшотами не изменилась.
4) Сделал звук, пока что вывод только на Sound Blaster, 8-bit mono. В эмуляторе DOSBox звук работает, значение ключа SB Buffer Size при этом лучше выставить поменьше - от 400 до 1000, в зависимости от быстродействия машины. Чем меньше буфер, тем более плавная эмуляция и тем более быстродействующей должна быть машина. Под Windows буфер приходится делать от 4000, иначе звук прерывистый - пока не разобрался с этим.
5) Теперь про работу под Windows. Ранее я писал, что затыкаются прерывания и ничего не работает. Оказалось, что так происходит лишь в случае, когда в системе установлен драйвер GiveIO. Он устанавливается, например, с программой Speedfan. Если же этот драйвер в вашей системе отсутствует, то, скорее всего, VZX будет работать (других противопоказаний пока не обнаружено).
К еще большему сожалению, данная неприятность распространяется на все приложения DOS, работающие с графикой. Сюда можно отнести древние игрушки Wolf3D, DOOM, Blood и прочие.
6) Формат vzx.cfg опять изменился, так что старый лучше либо перезаписать новым, либо просто удалить.
7) Случайно обнаружил, что VZX не видит файлов disk2.trd, disk3.trd и disk4.trd, вследствие чего TR-DOS видела только диск A. Исправлено.
Пока все. Если будут какие-нибудь вопросы - пишите, постараюсь ответить. Но и у меня также есть вопросы, так что возможно буду задавать их прямо здесь.
P.S. Только что заметил, что "соптимизировав" свой же собственный блок генерации AY, я его немного сломал. Убрал две строчки - и половина огибающих плюс кое-какие спецэффекты не работали :-D... Исправленные исходники выложу позже, пока же просто опишу, что и где. В файле monitor.asm найти данные строки:
Код:
; Envelope Generator
test ch, 010h
jz gas2
mov ebx, AYEnvelopePoint
movsx eax, byte ptr [ebx + 1]
add ebx, eax
mov eax, AYEnvelopeConst
add AYEnvelopeCount, eax
gas1:
movzx eax, byte ptr [ebx]
mov eax, [eax*4 + AYVolumeTable]
mov AYEnvelopePoint, ebx
mov AYEnvelopeVolum, eax
gas2:
перед меткой gas1: добавить 2 строки, чтобы получилось так:
Код:
jc gas1
mov AYEnvelopeCount, eax
gas1:
-
Вложений: 1
Продолжаю выкладывать результаты своих потуг. Вкратце опишу изменения, о каких помню:
1) Произведен переход на 8ми-килобайтные банки, это на будущее для эмуляции Timex, а также Interface/Multiface.
2) Добавлена эмуляция MEMPTR, спасибо за труд и информацию здешним форумчанам, приложившим немалые усилия к рассекречиванию этого тайного знания.
3) Сделана подготовка к эмуляции памяти с waitstate'ами, теперь в этом направлении осталось доделать совсем немного, другая проблема (моя глобальная), что нет желания наворачивать все в кучу, поэтому еще много предстоит сделать для прозрачности и структурирования.
4) Основной цикл эмуляции выделен в отдельный файл zxcore.asm. Т.к. раньше производилась сборка этого цикла на этапе инициализации, было легко совмещать гибкую настройку и скорость эмуляции. Теперь же все эти штучки а-ля DEP и прочие могут помешать данному процессу, пришлось полностью отказаться от сборки в реальном времени, что ж, будем лепить кучу заранее собранных "ядер"...
5) Работа со снапшотами расширена, но пока до конца не восстановлена работа с *.z80. А так - поддерживаются *.sna, *.sp, *.ach.
6) Мультиколор восстановлен, позиция теперь настраивается правильно; но сломан поточечный бордюрный мультиколор, т.е. в пределах 8-ми точек эмулируется нормально, а меньше - нет.
7) Введен ключ Minimum Tacts as One Instruction. По сути, пока выполнение команд не наберет минимум соотв. количество тактов, не будут отрабатываться другие события - например, прорисовка экрана. Но при этом буферизируются изменения бордюра, а также ближе к наступлению прерывания команды все равно выполняются по одной, и далее, после наступления прерывания, пока длится сигнал, также выполняются по одной. В результате наблюдается ощутимое ускорение работы ядра эмуляции, хотя при этом может страдать мультиколор экранной области.
8) Ключ Quality Level заменен на более понятный - Synchronization Frequency.
9) В данной версии имеется проблема синхронизации вывода звука при запуске из-под Windows (в эмуляторе DOSBox все в порядке), так что со включенным Sound Blaster эмулятор скорее всего не запустится из-под Windows. Постараюсь вскоре исправить, а то задалбывает постоянно запускать по схеме "эмулятор в эмуляторе".
10) Инициализация видео немного дополнена, теперь текстовый режим (который псевдографичевский) работает в большем количестве случаев.
11) Ключ General Sound в файле инициализации - пока что только ключ и ничего больше. В будущем наверну дополнительное облегченное ядро для эмуляции General Sound, но пока не до этого.
-
Вложений: 1
С момента, как я первый раз выложил здесь исходники, прошел ровно год. Не буду же упускать такой случай, посему выкладываю обновление.
На этот раз я очень долго долбался с видео - очень уж хотелось увидеть снова реальные ~50 Гц и насладиться плавной сменой картинок. Как ни странно, но большинство систем с ЭЛТ-мониторами позволяет получить нужный видеорежим - как разрешение, так и частоту кадров. Что же касается LCD-мониторов - тут я пока бессилен, большинство систем с этими мониторами зациклены на 60 Гц, в т.ч. это касается и ноутов.
С аудио тоже пришлось помучиться, пока не все ладно с синхронизацией, но по крайней мере в системе без GiveIO (и подобных, см. выше) звук должен быть.
Кстати, на днях я вдруг вспомнил, зачем вообще начал делать этот эмулятор в те давние времена. Я хотел эмулятор с возможностью запуска нескольких виртуальных Spectrum-машин одновременно, переключаться между ними и даже в DOS-shell без прерывания звукового потока ;). Но видимо тогда мозгов у меня не хватило, и об этой идее я быстро забыл :).
Далее по пунктам.
1) Чтение *.z80 восстановлено.
2) Блок AY позволяет теперь эмулировать сколько угодно микросхем AY одновременно, лишь бы хватило быстродействия. Turbo-AY и подобные будут сделаны только после реализации гибкой дешифрации портов.
3) Эмуляция команд подправлена, теперь результаты в zexall как у реала.
4) Сделан шаг к синхронизации с обратным ходом видеолуча. После инициализации видеорежима определяется частота вертикальной синхронизации. Если определить ее не удалось, тогда она принимается равной 50 Гц. Если указано Synchronization Frequency = Vertical Retrace, тогда частота синхронизации будет равна определенной ранее частоте вертикальной синхронизации. Если указано Z80 Speed = Auto, тогда скорость Z80/ULA будет подстроена так, чтобы необходимое количество тактов получалось за одну вертикальную синхронизацию экрана PC.
Но довольно технической белиберды - попробуйте сами, может вам удастся насладиться исконными 50 Гц ;)))
-
Вложений: 1
Хочу добавить, что в результате этой возни экспериментальным путем я дошел до следующих моментов:
1) Все системы из опробованных мной исправно позволяют читать значение системного таймера - PIT, канал 0. При этом вначале нужно проинициализировать этот канал каким-нибудь стандартным режимом с периодом 65536 (т.е. в 16-разрядную защелку записать нули).
2) Чтобы обойти ограничения GiveIO и подобных, лучше по возможности забыть про прерывания. Синхронизироваться придется по значению текущего счетчика системного таймера, а информацию о клавишах - получать по изменению порта данных клавиатуры (прежде в регистре состояния необходимо проверить, что данные не от мыши, и только тогда можно забирать данные).
3) На показания секунд из CMOS положиться нельзя, гораздо точнее оказалось получать секунды из того же системного таймера (1193181 тиков - 1 секунда). Как же я сильно ошибался по этому поводу! Это заблуждение владело моими мозгами вплоть до дня, когда я уже выложил годовое обновление. Но теперь я знаю, что показания CMOS - фуфло ;).
4) Частота системного таймера на разных системах может немного варьироваться, но это сложно оценить даже приблизительно, ибо других легкодоступных таймеров нет, а CMOS секундомер оказался какашкой. Итого приходится брать за правило, что частота системного таймера как по документации ~1193181 Гц.
5) Многие системы дают также установить нужный видеорежим и получать информацию об обратном ходе луча. Однако определение его частоты, с учетом нестабильности, вносимой многозадачностью, - задача нетривиальная. Тем не менее, системный таймер позволяет приблизительно оценить, происходили ли значительные потери времени или нет, благодаря чему можно более или менее отследить непрерывность выполнения своей задачи.
Вскоре доделаю синхронизацию с экраном и результат выложу сюда. Уже сегодня после исправления недоразумения с CMOS секундами все выглядит получше, но все же не так, как хочется.
-
Вложений: 1
Всем привет. Давно не было обновлений - сменил работу и свободного времени стало заметно меньше. Работа над эмулятором замедлилась, порой напоминая собой мышиную возню. Сейчас вроде стало легче, хотя выкладываю обновление в первую очередь для того, чтобы не затухать и не тухнуть, а вовсе не потому, что что-то кардинально улучшено или изменено.
1) Сделан чересстрочный режим - см. ключ Main Video Mode. Однако для всех псевдографических видеорежимов есть одна проблемка: вместо желтого цвета выводится зеленый...
Синхронизация с обратным ходом луча местами работает "почти хорошо" - особенно если в системе не запущено каких-либо задач вроде оперы с 30-40 открытыми страницами или p2p-клиентов ;).
2) В результате небольшой переработки синхронизации стало возможным использовать другие источники отслеживания времени - на данный момент это пока инструкция процессора RDTSC. Но можно и по-старому - через PIT (например, DOSBox пока что не эмулирует RDTSC и генерирует исключение 6 при ее использовании, как и положено при эмуляции древних процессоров). См. ключ Timer Read Method (на машинах, которых я проверял, оптимальный режим 5).
Синхронизация по RDTSC по идее должна давать более точное отслеживание обратного хода луча. Иногда это заметно.
3) Эмуляция AY немного подпорчена - почему-то иногда затыкается и молчит канал или даже два. Думаю, ошибка лежит на поверхности - как разгружусь по работе, наверное увижу и исправлю. Если кто заметит раньше (в случае, если вообще кто-то будет смотреть :) ) - просьба сообщить мне :). При этом убраны некоторые лишние телодвижения, в результате чего эмуляция AY немного полегчала. Вообще однажды мне как вожжа под хвост попала - стали рождаться идеи, как ускорить эмуляцию AY таким образом, чтобы вообще забыть про ключ AY Generator Clock Divider без ухудшения качества звука. Маялся фигней я долго, но намного быстрее не получилось...
4) VZX теперь понимает LFN. Вроде.
5) FDC выделен в автономный объект, как это было ранее уже проделано с AY. Также выделено в автономный объект само ядро, но оно пока одно и консоли для выбора/порождения новых ядер нет.
6) Со звуком какая-то байда. Не хватает информации по программированию SBPro и 16-битного режима SB16.
7) В *.ini файле много мусора в каментах - типа новые ключи и все такое. Да, собираюсь разродиться гибкой настройкой неполной дешифрации портов, а также waitstates'ами.
8) Перед запуском необходимо удалить старый vzx.cfg. Планирую вскоре "устаканить" формат, чтобы не кантовать каждый раз при смене версии.
-
под dosbox так и не запустил :(
-
Понятно. Ключ Timer Read Method = 5, а DOSBox не дает работать с RDTSC, поэтому попробуйте поставить Timer Read Method = 1
-
Скажите,а на какую минимальную конфигурацию ПЦ настроен эмуль ваш?