Просмотр полной версии : 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 (http://zx.pk.ru/showpost.php?p=413673&postcount=60)
Как и говорил ранее, выкладываю обновление, не прошло и полгода ;).
Полностью перешел под 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) Видеорежимов теперь два: 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) Произведен переход на 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, но пока не до этого.
С момента, как я первый раз выложил здесь исходники, прошел ровно год. Не буду же упускать такой случай, посему выкладываю обновление.
На этот раз я очень долго долбался с видео - очень уж хотелось увидеть снова реальные ~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) Все системы из опробованных мной исправно позволяют читать значение системного таймера - PIT, канал 0. При этом вначале нужно проинициализировать этот канал каким-нибудь стандартным режимом с периодом 65536 (т.е. в 16-разрядную защелку записать нули).
2) Чтобы обойти ограничения GiveIO и подобных, лучше по возможности забыть про прерывания. Синхронизироваться придется по значению текущего счетчика системного таймера, а информацию о клавишах - получать по изменению порта данных клавиатуры (прежде в регистре состояния необходимо проверить, что данные не от мыши, и только тогда можно забирать данные).
3) На показания секунд из CMOS положиться нельзя, гораздо точнее оказалось получать секунды из того же системного таймера (1193181 тиков - 1 секунда). Как же я сильно ошибался по этому поводу! Это заблуждение владело моими мозгами вплоть до дня, когда я уже выложил годовое обновление. Но теперь я знаю, что показания CMOS - фуфло ;).
4) Частота системного таймера на разных системах может немного варьироваться, но это сложно оценить даже приблизительно, ибо других легкодоступных таймеров нет, а CMOS секундомер оказался какашкой. Итого приходится брать за правило, что частота системного таймера как по документации ~1193181 Гц.
5) Многие системы дают также установить нужный видеорежим и получать информацию об обратном ходе луча. Однако определение его частоты, с учетом нестабильности, вносимой многозадачностью, - задача нетривиальная. Тем не менее, системный таймер позволяет приблизительно оценить, происходили ли значительные потери времени или нет, благодаря чему можно более или менее отследить непрерывность выполнения своей задачи.
Вскоре доделаю синхронизацию с экраном и результат выложу сюда. Уже сегодня после исправления недоразумения с CMOS секундами все выглядит получше, но все же не так, как хочется.
Всем привет. Давно не было обновлений - сменил работу и свободного времени стало заметно меньше. Работа над эмулятором замедлилась, порой напоминая собой мышиную возню. Сейчас вроде стало легче, хотя выкладываю обновление в первую очередь для того, чтобы не затухать и не тухнуть, а вовсе не потому, что что-то кардинально улучшено или изменено.
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
Mad Killer/PG
24.10.2008, 15:51
Скажите,а на какую минимальную конфигурацию ПЦ настроен эмуль ваш?
Самый первый вариант из первого поста отлаживался на AMD K5-90 :-D
Нынешнее хозяйство рассчитано на
1) Запуск под DOSBox - надо указывать минимум 40000 тактов, я отлаживаюсь на 45000, но лучше - 50000 и выше, если позволяет машина.
2) Запуск под чистым DOS - должно хватить Pentium-200/233, памяти метров 16 (на вырост), VGA-совместимый видеоконтроллер и SB-совместимая звуковуха.
3) Запуск под Windows в DOS-окне - работало на PIII и даже на каком-то PII под Win2k. На современных машинах (какой-нибудь Pentium4-3GHz или Sempron-1.7GHz) эмуляцию Z80 можно ускорять до 16-20 раз, в зависимости от настроек.
В основном я многое делаю с оглядкой на DOSBox - ведь там работает и мышь, и звук, к тому же все это в окне и безопасно, а сам DOSBox не зависит от конфигурации машины, а зависит от ОС. Но кое-что другое - например, синхронизация с реальным (не эмулируемым, как в DOSBox) обратным ходом луча - работает только в Windows и DOS.
P.S. Атас! Вдруг кое-что прояснилось, исправил 3 ошибки, отчего теперь все цвета на месте (надо было дополнительно инициализировать регистры атрибутов); звук в AY не пропадает (некоторые неряшливые проигрыватели не очищают старшие 4 бита тона, а я при оптимизации подумал "а зачем это нужно" и удалил); 48k *.sna при записи (по F2) не вызывает глюков. Заодно установки vzx.ini подправил для DOSBox. Вылаживаю.
Mad Killer/PG
24.10.2008, 19:01
Я ведь почему спрашиваю,в моей голове витает мисль использовать ПЦ древние для использования в виде эмулятора спека прописаного в авторане желательно без виндовза.Экономически это наиболее выгодно,плюс ещё и восполняет реальную недостачу живого железа.Надеюсь к новому году прикуплю старенький ПЦ и буду эксперементировать, но нужна работа с дисководами из эмулятора,может сделаете?
Надо подумать. Раньше это уже было реализовано (через одно место, конечно же ;) ), когда я еще на 486-м сидел, но когда прикупил себе новую системную плату с K5-90 на борту, выяснилось, что FDC там работает немного по-другому, причем это "немного" спутало мне все карты и не позволяло сделать полноценный конечный автомат. Позднее я позапускал эмулятор на других машинах и понял, что теперь так и будет. И удалил работу с FDC, оставил только с образами.
Восстановить-то можно. Но наверное только на высоком уровне, на низком мне нервов может не хватить :).
Mad Killer/PG
24.10.2008, 19:50
В идеале представляю всё так.Имеем объём 1.2 мб ограничение по дискете,это наш установочный диск с утилитами и Виртуальным Спектрумом .Возможно сосуществование с линукс системой для интернета и медии.
доведи до "идеала"(насколько это возможно) работц с образами, а потом потихоньку приступай к реальным дискам...
Там до фига чего нужно "до идеала" доводить. Куда ни сунешься - везде какой-нибудь подводный камень :-D
эх... я уже лет более 10 незанимался писюковым асмом... :(
Mad Killer/PG
05.11.2008, 20:54
Хоть убейте,а последняя версия не запускается на виртуальной машине.
Mad Killer/PG
11.11.2008, 16:35
Идёт ошибка драйверов виртуальных устройств.
Что за виртуальная машина? Как проявляется ошибка, в какой момент? Успевает ли пройти инициализация, переход в спец. видеорежим? Подозреваю, виртуальаня машина (отличная от DOSBox) наверное полностью не (или вообще не) виртуализирует VGA-совместимые регистры. Для этого есть видеорежимы 2 и выше (в vzx.ini).
Mad Killer/PG
13.11.2008, 20:40
ARTi, извиняюсь всё напутал. Итак не запускается на моём ПЦ,идёт инициализация окна эмуляции мс-доса ,после этого система пишет про ошибку драйвера виртуальной машины SYSTEM\CurrentControlSet\Control\VirtualDeviceDriv ers.Неверный формат драйвера виртуального устройства в системном реестре.
Дальше всё вылетает с ошибкой ntvdm.exe
Это в Винде ХР СП2.
Далее на виртуальной машине -VirtualPC2007 как бы всё запускается из ms-dos,но на экране как бы по диагонали идут чередования чёрного поля с белым.Вот.
Что касается ошибки ntvdm.exe - у меня была схожая проблема, она вроде больше относится к расширителю dos32a. Проблема проявлялась когда я установил Syser 1.99 (с версией 1.97 все было в порядке) - не запускался ни сам расширитель, ни его утилиты, не говоря уже об эмуляторе, который работает под управлением данного расширителя, либо совместимого, например, dos4gw.
Посему вопрос - что установлено специфического в системе?
Теперь по поводу VirtualPC 2007 - целый вечер продолбался, но таки взгромоздил ее на свой домашний ПК. Потом еще немного - чтобы установить FreeDOS. Далее запуская VZX с дискетки обнаружил недочеты. Исправил. Пока не выкладываю, ибо там мало изменений, хочу еще кое-что добавить и проверить заодно работу с VMWare. Но могу выслать по запросу.
Хочу напомнить, что в основном разработка идет с оглядкой на DOSBox, NT-Virtual DOS Machine (ntvdm) и конечно же реальные PC под управлением DOS. Для linux вроде есть также dosemu - интересно было бы знать, как там это хозяйство работает.
Virtual PC, VMWare и подобные также могут быть учтены, но я не вижу смысла запускать VZX на них.
В программе используется DOS API (int 21h, если установлен драйвер мыши, то int 33h) и немного BIOS API (в т.ч. int 10h), причем работа с DOS API (конкретно - работа с файлами) централизована. Прочие телодвижения производятся посредством DPMI (int 31h).
Из аппаратных ресурсов в минимальной конфигурации используется PIT (адреса портов 40h-43h), клавиатурный контроллер (адреса 60h, 64h), PIC (адреса 20h-21h и A0h-A1h) и VGA (регистры атрибутов). Если по каким-то причинам нет PIT, значит, не будет синхронизации, скорее всего ничего работать не будет. Если нет PIC - да и фиг с ним, об этом я писал выше (про GiveIO и подобные). Если недоступны регистры атрибутов VGA, в зависимости от видеорежима цвета будут в порядке или не очень. Если недоступен клавиатурный контроллер - не будет работать ввод с клавиатуры.
Mad Killer/PG
18.11.2008, 19:37
Специфическое да ничего вроди,не помню,может мотороловские дрова,но они не к чему видимо.
По поводу гнилого формата драйвера виртуального устройства накопал кое-что. Попробуйте:
Если же при запуске 16-битных программ появляется сообщение об ошибке "...SYSTEM\CurrentControlSet\Control\VirtualDeviceD rivers VDD Virtual Device Driver format in the registry is invalid...", то в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\VirtualDeviceDrivers удалите параметр "VDD", затем создайте заново параметр с именем "VDD" и типом REG_MULTI_SZ. Значение параметра оставьте пустым.
И кстати нарыл некоторые сведения об ограничениях NTVDM:
Следующие функции не работают под управлением Windows XP.
• Поддерживаются все функции MS-DOS за исключением интерфейса API переключения задач.
• Не поддерживаются блочные драйверы устройств. Поскольку не поддерживаются блочные устройства, то не поддерживаются функции API IOCTL (I/O control) для MS-DOS, работающие с подобными устройствами, и функции SETDPB.
• Функция 1A прерывания 10 возвращает 0. Все остальные функции передаются в память только для чтения (ROM).
• Не поддерживаются вызовы прерывания 13, использующие запрещенные функции доступа к диску.
• При вызове прерывания 18 (ROM BASIC) генерируется сообщение о том, что ROM BASIC не поддерживается.
• Вызов прерывания 19 не перезагружает компьютер, а завершает работу текущей виртуальной машины DOS (VDM).
• Не поддерживается вызов прерывания 2F, используемый программой DOSKEY (AX = 4800).
• Не поддерживаются функции MSCDEX (Microsoft CD-ROM Extension) 2, 3, 4, 5, 8, E и F.
• На компьютерах x86 подсистема выполнения 16-разрядных приложений Windows поддерживает программы, работающие в расширенном режиме, но не поддерживает 16-разрядные драйверы виртуальных устройств (VxD). На компьютерах, не совместимых с архитектурой x86, данная подсистема эмулирует набор команд процессора Intel 40486, что позволяет запускать программы расширенного режима (например, Microsoft Visual Basic) на RISC-компьютерах (компьютеры с сокращенным набором инструкций).
Это означает, что не поддерживаются 16-разрядные программы, требующие неограниченного доступа к оборудованию. Программы, которым нужен такой доступ, не будут работать под управлением Windows NT, Windows 2000 и Windows XP.
Mad Killer/PG
21.11.2008, 19:56
VirtualDeviceDrivers - ха вообще нет такого раздела у меня в реестре;(
Добавлено через 2 минуты
ARTi, дай свою фикс версию,можно на мыло попробую.
Выкладываю.
В некоторых случаях независимо от установок видео выбирался видеорежим 1 (псевдографический-80, который был не реализован), даже если был задан режим 2 (графический-320). Исправлено.
Реализован псевдографический-80. Оказалось, что он даже более совместимый, чем псевдографический-40, но медленнее.
Улучшено автоопределение частоты процессора (актуально для работы из-под Virtual PC).
Ну и больше вроде ничего интересного. Хотя видеорежимы подправлены/добавлены, скоро нафиг все переработаю. Текущая логика задания видеорежима все больше кажется мне неправильной.
P.S. Это только обновление, полный комплект необходимых файлов - в предыдущей версии
Mad Killer/PG
22.11.2008, 10:22
Скачал,вечером отпишусь. Переработка видеорежимов-почему и для чего?
Дело вот в чем. Я хочу сделать так, чтобы эмулятор мог выступать в роли конструктора нужной конфигурации (естественно, в некоторых пределах). Для этого я собираюсь сделать, в частности, гибкую настройку неполной дешифрации портов. И было бы хорошо, если все ограничивалось лишь портами, раскладкой ОЗУ/ПЗУ и временами. Есть же еще, как минимум, разные конфигурации видеопамяти. Например:
[Pentagon]
4-bit pallete
512x192x2, black-and-white
384x304x16, 16 colors total
[ATM-Turbo]
6-bit pallete
640x200x16, 64 colors total
[Profi]
512x240x?
[Scorpion + GMX]
640x200x16
[Sprinter]
24-bit pallete
320x256x256
640x256x16
[ZX-Next]
640x200x?
[Original]
4-bit pallete
256x192x16, 16 colors total
[ZX-Poly]
4-bit pallete
512x384x16, 16 colors total
[Timex]
4-bit pallete
512x192x2, 16 colors total
и т.д.
Конечно, охватывать всех и вся бессмысленно и не стоит даже пытаться. Но также нет желания недалекой реализацией вносить какие-то жесткие ограничения, которые потом придется все равно преодолевать. Для эмуляции указанных выше возможных разрешений клонов ZX подходит некое универсальное разрешение VGA/SVGA 640x480x256 или, если бы мы вдруг захотели получить тот же чересстрочный режим, тогда 640x960x256 или 1280x1024x256. Последнее разрешение кажется удобным, но оно не всегда может быть доступным. А если оно доступно, то все равно его обслуживание будет тормозным. Тогда вообще весь смысл запуска на древних компах теряется...
При этом, для стандартного экрана Speccy достаточно и псевдографического 40x240x16 (самый быстрый) или 80x240x16 (чуть медленнее, но более совместимый). Но при его использовании некоторые конфигурации клонов ZX станут недоступны.
И потом. Я специально сделал возможность плавно менять разрешение экрана, т.к. при этом меняются параметры развертки, что может позволить получить нужную или максимально близкую частоту кадров.
Итого... я еще не решил, как мне поступить. То, как сделано сейчас, мне вскоре начнет мешать.
Mad Killer/PG
22.11.2008, 17:32
Ясно,правильно можно будет использовать "подкрутку синхронизации"для разных моников и режимов соответственно,я так понял.
У меня уже вечер;=)
Значится так,ошибка NTVDM.com пропала,всё-же так ничего и не происходит из-за ошибки VirtualDevice-притом что такой записи в реестре нет,я щас попробую его просто создать.
В итоге,когда я игнорирую ошибку и продолжаю запуск программы,то появляется курсор в верхнем правом углу монитора и всё на этом,тоже происходит с VirtualPC.
Добавлено через 9 минут
ARTi скопируй свой раздел реестра а я создам у себя его такого-же.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\VirtualDeviceDrivers]
"VDD"=hex(7):00,00
Создай файл и скопируй в него эту цитату. Сохрани файл с расширением reg. Запусти его, ответь "да".
Относительно 6.01a - сейчас скопировал в VIrtual PC, проверил - работает. Плохо, правда, но работает. Попробуй удалить vzx.cfg.
P.S. Форум почему-то упорно вставляет пробел в слове Control. Этот пробел не нужен, его надо убрать!
Mad Killer/PG
23.11.2008, 00:43
Ну зараза,это ж надо так ругается что Возможен импорт только двоичных файлов данных реестра.Notepad++.
"VDD"=hex(7):00,00 - что это за параметр,синтаксис точно такой ?
Уважаемый ARTi !
Заранее простите за глупый волрос.
Я установил Syser 1.99.1900.1095 всё работает.
Но есть одна проблема - не могу
сохранить список breakpoints и содержимое
окна Trace.
Заранее благодарен Вам,
АРР
Mad Killer/PG
15.02.2009, 13:43
Очень жду новую версию.
Привет!
К сожалению, нового ничего нет (почти):
1. Наверное, поставил точку в определении частоты таймера/процессора.
2. Улучшил определение частоты вертикальной развертки, но пока не остановился на достигнутом.
3. Восстановил звук (вернее, сделал откат к предыдущей версии, работает вариант для SB16), чтобы хоть как-то что-то...
4. Чересстрочный режим - не помню, было ранее объявлено или нет? Так или иначе, сам сижу постоянно в нем.
5. Первоначальные математические подсчеты местами сделаны более точными, но это пока не доделано.
6. Говорил или нет? - По F1 происходит переинициализация видеорежима. Ибо Windows любит его все время переключать, при этом восстанавливается зачастую не все. Однако, на некоторых машинах F1 (напр. у меня на рабочей, а на домашней почему-то - нет) каким-то образом портит регистры/память (в т.ч. ROM) ZX Spectrum'а, пока не разобрался.
7. Может и еще что-то есть. Но по-моему, это и все.
Просьба отписать о кач-ве определения частот/подсчетов, а также о плавности эмулируемой развертки.
slavius2006
17.02.2009, 01:25
В полноэкранном режиме эмулятор запускается, но после "Press any key" появляется экран стандартного спектрума и на этом все виснет. Так же за экран уходит нижняя строчка, видны только вершины букв. Когда запускаеш в оконном режиме, то вообще ничего не происходит, черный экран и все.
Запускал из под Windows XP SP3
В оконном режиме ничего и не должно быть. А вот можно поподробнее - что значит "появляется экран стандартного спектрума"? Сброс проходит нормально? Или просто черный экран с белым бордюром?
Что касается уходящих за экран буковок и вообще видеорежима - настраивается в ini-файле. Попробуйте поставить Main Video Mode = 0 или Main Video Mode = 2.
Есть ли реакция на клавиши F1 (реинициализация видео) / F4 (сброс в TR-DOS) / F5 (сброс в 128k Basic) / F6 (сброс в 48k Basic) / F12 (выход) ?
Да, и что показывает по поводу частоты процессора и вертикальной развертки? Насколько соответствует?
Спасибо.
P.S. Возможно я с pif-файлом что-то недосмотрел - рабочая папка должна соответствовать той, где лежит все хозяйство. Если не соответствует, тогда, возможно, он просто rom-файлы не находит. Удалите pif-файл и в свойствах vzx.exe поставьте полноэкранный режим.
Mad Killer/PG
17.02.2009, 20:12
Поздравляю работает!!! Ура!!! Частоту определяет правильно,но задержка нажатий клавиш слегка неточно работает,ибо происходит залипание.В трдос выходит,клавиши юзабилити.
Частоту определяет правильно,но задержка нажатий клавиш слегка неточно работает,ибо происходит залипание.В трдос выходит,клавиши юзабилити.
1. Какова частота вертикальной развертки?
2. О какой задержке нажатий клавиш идет речь? Что-то туплю...
3. Вообще проблемка с залипанием клавиш эмулируемой клавиатуры при нажатии на реальной клавиатуре более одной клавиши имеет место быть, но это еще одна для меня неприятность - надо полностью переделывать работу с клавой.
4. На чем и под чем хозяйство запускалось? Что за проц, видео, ОС?
5. Кстати, определилось ли аудио? Если да, то какое?
Mad Killer/PG
17.02.2009, 23:21
1.60.03,или 50.00-колебается,зависимость не понял пока.
2.Задержка,ну например нажимаю я в ТРДОСе кнопку R-и за доли секунд наштамповано десяток RUN ...
3.Это имелось ввиду залипание пункта 2.
4.Пока что домашняя машинка Dual CORE AMD64 6000+,ATI4850,WinXPsp2.
5.SB found.
Спасибо за подробности.
1. Значит, не всегда видит наличие сигнала обратного хода луча (когда не видит, то принимает частоту за 50 Гц ровно). Попробуем поправить.
2. Всегда ли происходит залипание? Хоть иногда бывает реакция на отпускание клавиши?
3.
4.
5. Какой именно SB? Звуком постараюсь заняться в ближайшее время.
Mad Killer/PG
18.02.2009, 10:33
2.Всегда,но замечаю,что дело тут в скорости работы видимо,ибо и курсорчик моргает раз в десять интенсивней.
5.У меня стандартная встроенная звуковуха Realteck.
2. Ах вот в чем дело... Значит дело в эмулируемой скорости Z80 - она у тебя почему-то на порядок выше, вот и получается... А какую частоту Z80 показывает вначале?
5. Не, я про то, какие подробности пишутся после "SB found"?
Вот, немного "улучшил". Надоело возиться с переименованием файлов, так что ввел ключи: Font File, ROM File, FDC Drive. См. ini-файл.
На этот раз выкладываю полный комплект, вместе с компилятором/линкером и утилитами для dos32a. Вроде ничего не забыл.
Просьба всем, кто будет пробовать, отписываться: что и как определилось при старте, какая система (ОС, проц), как работает/не работает, есть ли звук, похожа ли скорость эмуляции, плавная ли синхронизация с экраном и т.д.. Если менялись настройки в vzx.ini, то какие и как.
Спасибо за терпеж.
P.S. В DOSBox'е звук должен работать со всеми SB, кроме SB1. С этим разберусь позже.
Mad Killer/PG
21.02.2009, 15:37
Ух прошу извинить,что не писал,вчера заплёл косичку к pentium 3 slot1 450 mhz,video agp 16 mb,sound ещё не знаю какая,к моему рабочему компу.Запустил ,из хорошего всё работает даже звук,частоты z80 -46 fps,прочие подробности сообщу позже,также сегодня дома потестю вечером и отпишусь подробно о работе и параметрах.
Mad Killer/PG
23.02.2009, 21:53
ARTi, создай пожалуйста функцию автозаписи конфига компьютера после старта эмулятора,и интегрируй в пакет будет намного проще выкладывать текстовичёк дебаггер.
Так. Немного подправил звук. В DOSBox должен работать со всеми моделями SB. В Windows NTVDM, там где SB определяется, звук (у меня по крайней мере) все еще не работает. Также добавил, по желанию трудящихся, автосохранение vzx.cfg (при его отсутствии) после получения настроек из vzx.ini (просьба этих самых трудящихся ;) отписаться, правильно ли я их понял). Еще упростил работу с файлами (папками). Убрал один глюк, вернее, старинную мини-"фичу", тянувшуюся с древних времен и ставившую мне палки в колеса :D.
интегрируй в пакет будет намного проще выкладывать текстовичёк дебаггер.
Тут не совсем понял, о чем речь, можно поразвернутее, пожалуйста.
Mad Killer/PG
03.03.2009, 23:00
Значит новая версия работает также на моём АМД-глючит безбожно;).
Поподробнее про текстовичёк,ну это так называемый лог файл со всеми параметрами компа и показателями эмулятора,вот можно их считывать и сохранять в папку с эмулем,тогда я легко смогу тебе её скидывать сюда,и ты будеш видеть,что происходит.
А это эмуль только под дос? У меня не пошёл вообще из под винды.
Он и под DOS, и под NTVDM (DOS-эмулятор Windows NT). Если что-то не работает, просьба сообщить, что именно и как. Если с работой из-под DOS все более или менее ясно, то с NTVDM есть нюансы. Это и оконный/полноэкранный режим, и неопределенность со звуком, и исправность самого NTVDM, а также и то, что при аварийном завершении не всегда видно, что же именно произошло. В ближайшее время я попробую предпринять шаги в сторону просьбы Mad Killer/PG, а то ситуация, когда у меня везде работает (на работе, дома и еще кое-где, в целом >7 машин, от субноутов до десктупов), а у других совсем плохо, напрягает :)
В любом случае, если так вышло, что вы потратили время, а эмулятор не заработал, пожалуйста, извините.
Mad Killer/PG
06.03.2009, 22:22
Да ну,наоборот разработчику мегареспект,что тратиш своё время! Поэтому...А глюки,куда уж без них, нормальных программ не напишеш.
По эмулятору-желательный мини хелпик-текстовый файлик,где описаны будут в кратце клавиши управления и история улучшений:)
Всем привет! Выкладываю обновление в спешке - убегаю с работы. На сегодня лишь пару слов пояснений, в более удобный момент опишу подробно.
Итак, в этой версии реализована одна из важных задуманных когда-то фич: гибкая дешифрация портов. Это значит, что порты, их адреса, маски, приоритеты (если один адрес разделяется несколькими устройствами) и функции задаются в ini-файле. Живой пример вы можете увидеть в прилагаемом vzx.ini.
Также исправил ошибку, из-за которой эмулятор мог просто не запуститься, т.е. вывалиться с ошибкой на стадии ранней инициализации (что, похоже, и происходило у VNN_KCS, см. потс выше).
Добавил возможность скидывания лога инициализации в файл. Для этого нужно запустить vzxdbg.pif (только для Windows) или vzxdbg.bat, при этом эмулятором можно пользоваться как обычно. Так что если что-то не так работает/вываливается и т.д. - запускаете один из vzxdbg и после того, как все произойдет, выкладываете или высылаете мне vzx.log.
На данный момент есть известные глюки, продолжаю над ними работать, но промежуточную версию все же решил выложить.
Mad Killer/PG
31.05.2009, 23:23
на вот такой,смотри лог конфигурации работает,но глючит видео,всё-таки рекомендую считывать в лог файл видеокарту и её параметры.Пробовал в разных режимах - везде есть баги с видеовыводом,надo бы реализовать загрузку TRD.
1. Что именно работает и как?
2. Как глючит видео? Считывание инфы о видео попробую сделать.
3. Что за видяха?
4. Поддержка *.trd есть, что имеется в виду под выражением "реализовать загрузку TRD"?
5. А что это за проц такой с частотой 450 МГц?
Mad Killer/PG
01.06.2009, 02:23
1. Что именно работает и как?
Всё запускается нормально,единственно есть проблемы с отображением на экране.
2. Как глючит видео? Считывание инфы о видео попробую сделать.
При первом режиме информация смещенна за видимое поле монитора,как бы нет автопозиционированния,воз ожно это проблема моника моего.При режимах 2,3 на экране отображается накладыванние изображения два раза со смещением вверх на десяток знакомест.В первом режиме отображение нормальное но в главном меню спектрума есть чередующийся ряд вертикальных столбиков с повышенной яркостью шириной в четыре примерно пикселя,на расстоянии друг от друга в два знакоместе,не равномерно распределены,больше их к правому краю экрана.
3. Что за видяха?
Radeon 6000 VIVO 64mb
4. Поддержка *.trd есть, что имеется в виду под выражением "реализовать загрузку TRD"?
какими клавишами загрузить произвольный файл ?
5. А что это за проц такой с частотой 450 МГц?
;) Это слотовый пентиум 3.
Спасибо за ответ, но осмелюсь попросить немного подробнее...
1. Запускается и работает нормально - со скоростью как? Что со звуком - работает ли и как? Какая Windows - XP?
2. По поводу видео. Если можно - фотографии экранов режимов 0, 1 и 2. Хотя я догадываюсь, что происходит: судя по всему, у тебя ЭЛТ-монитор, а это значит, что пропорции экрана 4:3, однако мои настройки были не для такого случая, попробуй Video X Visible = 320 в vzx.ini (для режимов 0 и 1).
И, эта, как там синхронизация с экраном?
3. Radeon - это хорошо :). Хотя и nVidia тоже...
4. Любые загружаемые файлы пока указываются только в vzx.ini. Загрузка произвольных файлов скоро будет.
5. Значит про проц я угадал :).
Mad Killer/PG
15.06.2009, 22:40
Странно,вероятно из-за "хака" стёрлось моё сообщение последние,итак тестирую на домашнем двухядерном-не работает нормально вообще,во всех режимах вот лог.
По логу вроде все нормально, хотя это само по себе еще ни о чем не говорит. Попробуй Timer Read Method = 1 в vzx.ini. Поможет или нет? Если нет, тогда просьба проверить все значения от 0 до 7 (кроме уже испробованных 1 и 5).
Спасибо за терпение.
P.S. Данная проблема и ее устранение очень важно: если не будет нормальной синхронизации в эмуляторе, тогда читай как в анекдоте: нет ножек - нет и мультиков!
P.P.S. Да, и что там с аудио/видео?
Mad Killer/PG
16.08.2009, 23:40
Timer Read Method = 1 в vzx.ini
Помогло,запускается стабильней,более менее нормально.
Прикручивай ГУИ ТРД лоадера и будем дальше смотреть.
Что-то давно меня тут не было. Приходится нынче на работе работать, а не играть в футбол половыми органами... Не знаю, когда зайду еще раз, так что выкладываю старье как есть...
Из тех изменений, что мне помнятся:
1. Поддержка "тапок".
2. Что-то подправлено в командах.
3. Но все еще без интерфейса.
Вкратце об управлении - что-то вдарило мне в башку, и я его немного изменил:
1. [F1] - переинициализация видеокарты, на случай переключения на другую программу, а потом обратно.
2. [F2] и [F3] вроде бы без изменений - запись/чтение указанного snapshot в настройках Save Snapshot и Startup Snapshot соответственно. С нажатым [Shift] назначение клавиш меняется местами.
3. [F4] - старт/стоп магнитофонной "ленты" (в частности, "тапок"). По достижению конца "ленты" встает на паузу в начало. Для "досрочного" сброса в начало нажимать с клавишей [Shift]. По старту эмулятора "лента", указанная в настройке Load Tape, стоит на паузе в начале.
4. [F9] - сброс в меню 48k. С [Shift] - в 48k TR-DOS.
5. [F10] - сброс в меню 128k. С [Shift] - в 128k TR-DOS.
6. [F12] - генерация NMI.
7. [Ctrl]+ - выход из эмулятора. Сочетание, как выяснилось, не шибко удачное, но и [F12] был не сахар.
8. Что означают другие клавиши и означают ли, надо смотреть в коде, но сейчас лень.
Еще немного о настройках:
1. Timer Read Method: 5 - попытка использовать в кач-ве таймера счетчик тактов процессора; 1 - использование системного таймера 1,193 МГц. По умолчанию стоит 5, но если что-то не так со скоростью (или неправильно определяется частота процессора), можно поставить 1.
2. Main Video Mode - лучше использовать режимы 0 или 1. Опять же, если не работает в одном, можно попробовать другой.
3. Video X Visible и Video Y Visible: для мониторов с классической пропорцией 4:3 подходящие пропорциональные значения, например, 320 и 240 соответственно. Для моников, ноутов и нетбуков с другими пропорциями, используйте значения навроде таких 336x216,352x208 и т.д. Предупреждение - не все мониторы корректно будут отображать Video X Visible больше 320. Тем не менее, варьирование данных параметров на ЭЛТ-мониторе скорее всего позволит добиться частоты кадров близкой к 50 Гц.
4. Z80 Speed. Если стоит Auto, скорость всей системы подстраивается под измеренную реальную частоту кадров. Т.е. если, к примеру, измеренная частота кадров 60 Гц, то вся система будет работать быстрее на ~20% в угоду синхронизации с реальной частотой кадров.
Если же указано число, оно воспринимается как проценты от скорости.
5. Z80 Clock Multiplier - умножение тактовой частоты эмулируемого процессора.
6. Interrupt Length - длина прерывания в тактах процессора.
7. Если кто-то дочитал до этого пункта, значит далее разберется сам, в файле настроек vzx.ini достаточно подробные комментарии (кроме гибкой дешифрации портов).
Вместе с архивом с эмулятором выкладываю мелкую подборку "тапок". Работают не все (в смысле, не всё ПО в этих "тапках" совместимо с эмулируемым клоном компьютера), какие не помню, так что приложил все, что валяются у меня рядом с эмулятором.
Если кто-то подскажет мне,
1) как избавиться от "пуков" при воспроизведении аудио и
2) как в начале каждой передачи DMA гарантированно и быстро устанавливать очередность стерео каналов,
я буду очень благодарен. Также пытался где-то месяц назад затеять разговор с [b]Conan'ом о работе различных реализаций подсистемы памяти, но почти сразу же увяз в своей работе...
До встречи тут, когда-нибудь.
Продолжим наконец...
Следующий шаг. Реализован ZS Scorpion 256k Turbo+, различные Turbo Sound. Также перелопатил команды, кое-какие все еще ведут себя не совсем как на реале (INI/INIR/IND/INDR и OUTI/OTIR/OUTD/OTDR), а остальные вроде норм.
Поддержка Turbo Sound сделана следующим образом: в микшировании звука всегда участвует 4 штуки AY, а при обращении через порты участвует одна AY, выбираемая селекторами NedoPC и/или PoS (необходимо добавить в пространство портов в/в через файл ini). В файле vzx_core_scorpion256k.ini наглядный пример.
Таким образом, релизовываются Turbo Sound по NedoPC и Turbo Sound по Power of Sound. Причем, в функции порта не указывается номер AY (ибо их на одном порту висит аж 4 штуки). Однако, если надо, чтобы всегда была только одна AY на экзотическом порту (для эмуляции Quadro-AY) или даже на родном, надо указывать ее конкретный номер от 0 до 3 в функции порта, т.е., например, не Read AY Register, а Read AY0 Register и т.д. Какая там дешифрация у Quadro-AY я не в курсе, так что в примере ее нет, но можно и добавить как я выше написал.
Кстати, т.к. эмуляция AY у меня тормозная, то 4 штуки заметно замедляют эмулятор. Что ж, может придумаю, что с этим можно сделать.
С ZS Scorpion 256k все просто: турбо можно включить/выключить (если соотв. портовые функции "повешены" на соотв. порты в/в, в прилагаемом ini все есть).
Добавил мелкую фичу, теперь любую портовую функцию можно повесить не только на какой-либо порт ZX, а еще и в порт в/в AY (Port A или Port B).
Еще мне надоело постоянно что-то править в одном-единственном жирном ini-файле. Так что теперь в файле настроек можно написать Include = и далее имя файла доп. файла настроек. В архиве ini-файлов 6: один главный (vzx.ini), который ссылается на остальные 5, настройки между которыми я распределил по смыслу, что видно из их названия.
Со звуком, в целом, пока беда. Однако при тех настройках, что в архиве, у меня вроде не пердит.
Просьба отписываться, чего и как. Спасибо.
Расскажу-ка я про директиву Add Device, чтобы убрать все неясности. Итак, рассмотрим на примере:
Add Device = port 0x7FFD, mask 0x8003, spaces std+bdi, prio 1, write 128k MMU
port - тут все понятно, указывается "официальный" номер порта портовой функции/устройства. Указан порт 07FFDh, стандартный порт для задания конфигурации памяти 128k;
mask - и тут все ясно, установленные биты в маске указывают, что при неполной дешифрации именно их надо брать во внимание. В данном случае дешифрация идет по линиям A15,A1,A0;
space - указывает, в каком пространстве в/в порт будет доступен. Всего пространства пока 2 (других не знаю) - Standart и BetaDisk. В предыдущих версиях указывалось числовое значение (1 и 2 соотв.), теперь будет ключевое слово (несколько вариантов написания, см. inifile.asm). В примере выше использована разновидность spaces, описанная ниже;
spaces - то же самое, что и space, но через "+" можно указать одновременно несколько пространств в/в, в которых порт будет виден. Системный порт 07FFDh должен быть виден как в обычном пространстве, так и в бетадисковом, отсюда и пишем Stadart+Betadisk (в примере написано std+bdi, напоминаю, для каждого ключевого слова имеется несколько вариантов написаний);
prio - приоритет. Это черновое решение (другого логичного не придумал) следующего момента. Иногда маски могут быть такими, что определенный номер порта затронет не одну порт.функцию, а несколько - именно так ведь и было задумано в оригинальном ZX Spectrum. Ну и вот, во избежание проблем, я где-то видел фразы, что "выбор такого-то устройства блокирует остальные". Т.е., положим, есть 3 устройства - X, Y и Z. Дешифрацией предусмотрено, что могут быть доступны 3 этих устройства одновременно, однако из-за особенностей схемы или просто по смыслу, к примеру, при записи в X запись в Y и Z блокируется. Таким образом, т.к. в эмуляторе такая запись по-любому эмулируется последовательно, я сделал приоритеты. 0 приоритет максимальный, 255 - минимальный (вряд ли такое значение когда-нибудь пригодится). Т.е. для X надо сделать приоритет равным 0, для других - значением выше. Если нужно, чтобы доступ шел ко всем устройствам, значения приоритетов должны следовать один за другим (0,1,2) или быть равными (0,0,0 или 0,0,1 или 0,1,1). Если же нужно, чтобы устройство блокировало доступ к другим устройствам с более низким приоритетом, цепочку приоритетов необходимо "разорвать" (0,2,3 или 0,2,2). Вернемся к этому ниже на других примерах.
write 128k MMU - указание портовой функции, сначала идет тип доступа (read/write), затем непосредственно функция (несколько вариантов написания). Доступ перепутать не получится - он жестко привязан к функции и введен для удобочитаемости, к тому же есть порты, смысл которых одинаков как для чтения, так и записи (регистры ВГ93, к примеру).
С этим примером вроде разобрались. Хочу остановиться на паре других по поводу приоритетов:
Add Device = port 0x00FF, mask 0x0000, space std, prio 9, read bus state
//Add Device = port 0x00FE, mask 0x0000, space std, prio 9, write ULA
Тут указаны странные маски и приоритеты, значения которых гораздо выше всех остальных устройств в списке (по крайней мере в прилагаемых конфигах в архиве). Смысл следующий: так как маска = 0, порт будет выбираться всегда, по любому номеру, а номер лишь указан для наглядности. Однако цепочка приоритетов с любым другим устройством всегда разорвана - именно поэтому число выбрано заведомо большое. Так что смысл такой записи таков: если есть другие устройства - доступ идет только к ним, а если устройств нет, тогда доступ идет к указанному в строке.
Таким образом имитируется понятие "несуществующий порт". На оригинальном Spectrum это порт 0FFh, который на самом деле любой, не принадлежащий другим устройствам, и это чтение состояния шины, о чем написано в первой строке. На моем первом реале при записи в несуществующий порт запись велась в 0FEh, что и означает вторая (закомментированная) строка.
Насколько я помню, с несуществующими портами также можно строить цепочки, т.е. в конкретном примере можно добавить какое-нибудь устройство с приоритетом 10.
В последней версии добавилась возможность вешать портовые функции не только на обычные порты, но и на порты AY (Port A и Port B). Рассмотрим примеры:
Add Device = AY0 port A, read ZS combo state
Add Device = AY0 port B, write ULA
Забегая вперед, скажу, что вторая строчка добавлена лишь для демонстрации. Итак, тут в общем-то все ясно:
AY0 port B - указывается, на какой AY (напоминаю, их у меня 4, так что если надо, чтобы правило распространялось на все сразу, надо писать 4 строчки - по одной на каждую) на каком порту (Port A или Port B) "висит" портовая функция. Номер AY указывается от 0 до 3.
write ULA - портовая функция.
Это было по второй строчке. По первой, думаю, уже все ясно.
port, mask, space(s) запрещены к использованию в строках такого типа. Насчет prio не помню, но по смыслу его тоже тут не должно быть.
Последнее, все параметры можно указывать в любом порядке. Теперь вроде все рассказал :)
Да, совсем забыл! VZX.CFG от предыдущей версии крайне желательно удалить!!!
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot