Новый эмулятор ZX-Spectrum - Спектрамин

Всем привет.

Выкладываю первый релиз своего эмулятора Спектрамин, с минимальным функционалом, для публичного тестирования качества эмуляции и совместимости с играми и демками. Управление — контекстное меню (правый клик мышью) и хоткеи (см. в меню).

Приоритеты при разработке:
1) удобство использования;
2) точность эмуляции — z80, задержки, порты, недокументированные особенности.
Из периферии, кроме кэмпстона на стрелках+TAB, и ULAplus, на данный момент ограниченно поддерживается TR-DOS (trd, scl и hobeta) и +3DOS (.dsk), в рамках возможностей dll-ек от эмулятора SpecEmu (Mark Woodmass разрешил их использовать, за что ему большое спасибо).
Эмулируется плавающая шина +2А/+3 (48/128 тоже, конечно).

Эмулятор распространяется как донейшнваре, то есть бесплатный, но если есть желание поддержать разработку донейтом, реквизиты в About эмулятора.

Точно работает под Windows 7 32 и Windows XP 32, под другими ОС не проверял.

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

Ссылки на файлы:
v.1.01b
Полный zip-архив с обеими версиями: www81.zippyshare.com/v/YVHfMMML/file.html
Облегченный zip-архив без добавочных файлов (игр, дем, тестов): www81.zippyshare.com/v/NvuBxymN/file.html
Установщик русской версии: www81.zippyshare.com/v/oAmqJk8Z/file.html
Установщик английской версии: www81.zippyshare.com/v/hUJSsvD6/file.html

Любые указания на ошибки и несовместимость/незагружаемость/неработоспособность, пожелания по функционалу и интерфейсу, и т.п., будут полезны. Просьба — если вы нашли файл, который не работает/работает неправильно, приведите, пожалуйста, ссылку, по которой можно этот файл скачать, и хотя бы краткое описание проблемы.

33 комментария

avatar
На чём написан?
Будет ли открытый код?
Планируется поддержка только Windows, или чего-то ещё?

Какова сверхзадача? (Написать самый лучший или быстрый или мальенький или ещё какой эмулятор?)
  • oisee
  • +4
avatar
Написан на Делфи.
Код открытым будет, но только когда я потеряю интерес к разработке)
Пока что только Windows, от всего остального я далек.
Приоритеты разработки — удобство использования для игр, просмотра дем, и, в дальнейшем, разработки софта, и точность эмуляции самых распространенных моделей. Поддержка всевозможной периферии — не в приоритетах.
avatar
Ага вон уже за дельфи не минусуют ;)
avatar
Хотелось бы взглянуть на сорцы.
  • tsl
  • +1
avatar
Сорцы открывать пока не планирую.
avatar
Из каких соображений?
avatar
Жадный.
avatar
А вы с ним договоритесь на NDA :)
avatar
Да не, я чото думаю в сорцах тонна быдлокода, и «жадный» аффтар не хочет палиться :D
avatar
на первых порах, если проект не слишком сурьезный, ничего страшного в легком говнокоде не вижу, главное — чтобы работало и чтобы потом понять можно было :)
avatar
Будет ли дебаггер?
  • sq
  • 0
avatar
Он есть, но для внутреннего употребления, для релиза его надо допиливать и дописывать, а мне пока лень.
avatar
Понятно, что это только первая версия, но точность впечатляет уже сейчас.
Тем не менее, одну нестыковку я нашёл: сборник mmcm должен работать на +3, но сейчас не работает, причём выдаёт очень необычное сообщение об ошибке — по сути, не срабатывает выравнивалка на такт, что означает то ли нестыковку в эмуляции процессора (маловероятно, т.к. другие модели работают нормально), то ли какая-то непоследовательность в отработке кадрового прерывания. К сожалению, не знаю как помочь подробнее. Вот эта процедура работает более-менее везде:
;
;  align ver.0.3	copyright (c) 2013 introspec
;
;  this function aligns the execution to a 4 tact boundary and also computes (approximately)
;  the number of tacts in the frame (actually, number of tacts divided by 8 modulo 256).
;
;  после вызова этой функции исполнение программы оказывается выровненным до границы в 4 такта
;  (но, внимание, см. комментарий перед RET). в регистре C возвращается число тактов в кадре минус
;  107, делёное на 8 и взятое по модулю 256. работоспособность не гарантируется если эту
;  программу (или её стек) разместить в медленной памяти (что м.б. актуально на любой классике).
;  при вызове на скорпионе функция устанавливает флаг C.
;
;  общая идея этой процедуры сродственна процедуре Alone Coder'a (см. приложение к ZX-Guide #3),
;  но реализованный алгоритм, вообще говоря, новый.
;
;  главные достоинства новой реализации: более понятный код (субъективно), сопоставимый по длине
;  код (объективно), полноценная поддержка скорпиона (объективно), плюс, ценный бонус -
;  сравнительно точное измерение продолжительности фрейма и потенциал несложной доработки для
;  точного (до 4-х тактов) определения продолжительности фрейма (конечно, по модулю 256).
;
;  главный недостаток: более долгая работа цикла (до 12 фреймов). возможно сделать вариант этой
;  процедуры с фиксированным временем исполнения (4 фрейма). кроме того, мне кажется, что тут
;  остался ещё некоторый потенциал по дальнейшей оптимизации по длине.
;	

			MODULE	AlignInt

@OldAlignInt:		;ld	hl, (IM2Entry+1)
			;ld	(PrevHandler+1), hl
			ld	hl, IntEntry
			ld	(IM2Entry+1), hl
			dec	hl
			dec	hl
			ld	b, #00
			ld	d, 11

DoItAgain:		ei				; 4t
			xor	a			; 4t

MeasuringLoop:		inc	a			; 4t
			jp	(hl)			; 4t

;
;  идея данного алгоритма следующая: мы крутимся в цикле из 8 тактов пока не наступит прерывание.
;  когда прерывание наступает, мы смотрим на младший бит адреса где нас прервали. нас интересует
;  ситуация, когда в прошлые разы прерывание происходило на одной из 4-х тактовых команд, а вот
;  сейчас произойдёт уже на другой. поэтому мы отстаём каждый фрейм на 1 такт, вдвигаем младшие биты
;  полученных адресов в регистр B и ждём, пока B не окажется заполненным 10001000 или 01110111.
;
;  эта логика не работает на скорпионе, т.к. он всегда подравнивает исполнение нашего цикла из 4-х
;  тактных команд до чётного числа тактов, а также добавляет задержки, указанные в квадратных скобках.
;  тем не менее, число тактов в обработчике прерывания подогнано так, чтобы скорпион оказывался
;  на границе двух команд каждый второй такт, что позволяет опознать его по значению 10101010 или
;  01010101 в регистре B. так как число тактов на скорпионе 69888, как и на классике, выравнивание
;  на 0 можно опознать по младшему биту адреса последней выровненной команды.
;  

			; точка входа обработчика прерывания (+19t int +10t[+1] jp)
IntEntry:		ld	c, a			; 4t
			pop	af			; 10t	(AF = MeasuringLoop или AF = MeasuringLoop+1; флаг C - младший бит адреса)
			sbc	a			; 4t	(флаг C (т.е. младший бит адреса) заполняет A)
			rl	b			; 8t	(младший бит адреса нужно вдвинуть в регистр B)
			xor	b			; 4t	(аккумулятор теперь содержит В, инвертированное если младший бит B был 1, т.е. младший бит всегда 0)
			cp	%10001000		; 7t	(так выглядит нулевой сдвиг)
			jp	z, NormalAligned	; 10t[+1]
			dec	d			; 4t
			jr	nz, TestScorp		; 12t

			inc	d			; nz is used to say "unrecognized pattern"
			ret

TestScorp:		ld	a, b			; 4t	(на скорпионе приходится смотреть напрямую на адреса)
			IF	MeasuringLoop and 1
			cp	%10101010		; 7t
			ELSE
			cp	%01010101		; 7t
			ENDIF
			jr	nz, DoItAgain		; 12t[+1]
							; от прерывания до следующей итерации получается 19+10 + 4+10+4+8+4+7+10+4+12 + 4+7+12 + 4+4 = 123 тактов
							; т.е. всякий раз мы сдвигаемся на один такт назад (на скорпионе - сдвигаемся на 2 такта вперёд)
ScorpionAligned:	scf				; 4t[+1]
			; мы на скорпионе и выполнили 19+(10+1)+4+10+4+8+4+7+(10+1)+4+7+(7+1)+(4+1) = 102 такта, плюс 2 такта сдвига.

NormalAligned:		; мы на машине без задержек и выполнили 19+10+4+10+4+8+4+7+10 = 76 тактов

			; в обоих случаях мы выровнены на границу в 4 такта.
			; команда RET имеет продолжительность 10 тактов, поэтому иногда м.б. удобно добавить ещё 2 такта для компенсации.
			;inc	hl
PrevHandler:		;ld	hl, 0
			;ld	(IM2Entry+1), hl
			ret

но на +3 в новом эмуляторе мы выпадаем на ветку «unrecognized pattern». Это первый раз что я вижу эту ветку сработавшей.
avatar
Спасибо за подробный отчет. Не могли бы вы привести ссылку на этот сборник? Вроде бы с эмулятором идет сборник mmcm, он в папке Demos/Scorpion/Green, и вроде бы он работает нормально под +3, я проверил, и картинка в начале идет примерно так же, как на Скорпионе.
avatar
Хотелось бы узнать, как это ты грузишь .scl в +3? :)))

Возьми тапок в официальном релизе: www.pouet.net/prod.php?which=65367
Как ещё один из вариантов возникновения проблемы — турбозагрузка?
avatar
Элементарно, в эмуле TR-DOS цепляется к любой модели.
avatar
Да, точно, турбозагрузка, на время загрузки с ленты задержки отключаются, видимо, на момент теста считает, что загрузка ещё идет. У меня с первого раза загрузилась в +3 нормально, на второй выдала мессагу о необычном паттерне.
avatar
Раз уж зашел разговор о mmcm, вопрос — на реальном зеленом Скорпионе картинка на бордюре такая же, как на остальных моделях? Потому что у меня в эмуле она на 8 пикселей сдвинута на Скорпионе влево, похожий результат на ZXMAK2
avatar
Когда я писал свой бордерный просмотщик в 2013, я искал кто бы мог протестировать всё на реале. Насколько я помню, что-то тестировал DDp, что-то тестировал Evgeny Muchkin. По итогам этих тестов зелёный скорпион был добавлен в Unreal. Подробнее сейчас не вспомню…
avatar
Картинка в Unreal та же, что в Спектрамин, так же на 8 тактов сдвинута влево по сравнению с другими моделями. Так что буду считать, что всё правильно)
avatar
на 8 пикселей.
avatar
8 пикселей означает 4 такта.

Проверил, да, похоже что я в запарке пропустил баг. Видимо, что-то докручивал и забыл перепроверить каждую модель. Спасибо, не знал!
avatar
И еще — есть ли ещё какие-нибудь демы под зеленый Скорпион?
avatar
На сайте ААА была версия Satisfaction пофикшенная под зеленый скорп. Из моего софта зеленый скорп поддержан в mgdma, бордерных картинках, интры mmcm и eager, ангел в конце break space.
avatar
Кстати, если грузить с зажатым Ctrl (он отключает почти всё ускорение загрузки, кроме свертки цикла ловли фронта, это иногда помогает), mmcm работает на +3. То есть он не работает из-за флэш-загрузки, что довольно странно, буду разбираться.
avatar
Но на желтом Скорпионе как раз сборник из релиза не работает, выдает сообщение на английском, что компьютер имеет
M1 задержки, возможно, это или Ленинград, или желтый Скорпион, и на программа не может работать.
avatar
На жёлтом и не должно работать, я мало что под него фиксил. Под жёлтым будет работать MGDMA, и некоторые из бордерных картинок. Почти наверняка работает Mercenary; Rear View — не помню уже. Подробнее прямо сейчас не вспомню, т.к. это было довольно давно. Когда я это всё доделаю, бордерная графика будет точно работать на обоих скорпионах.
avatar
Просьба — если вы нашли файл, который не работает/работает неправильно, приведите, пожалуйста, ссылку, по которой можно этот файл скачать, и краткое описание проблемы.
  • Weiv
  • 0
avatar
Я нашёл такой файл в комплекте с эмулятором — Dark Fusion. После выбора режима игры всё почему-то вылетает в бейсик, это норма?
avatar
Хм, я не смог добиться вылета в бейсик ни с одной моделью. Правда, заметил, что в некоторых моделях проскакивает блок ленты, и приходится дольше ждать загрузки. Напишите, пожалуйста, какая у вас операционная система, и в какой модели Спектрума вы запускаете Dark Fusion?
avatar
Ложная тревога, теперь всё понял. Оказывается, после выбора режима игры бордюр и шум с динамика — это дальнейшая загрузка с ленты, которую я счел за затянувшийся эффект и нажимал space. Потому и вылет в бейсик. Оказалось, нужно было ждать загрузку.

Привык к унрилу, что тут скажешь, может где-нибудь в строке статуса писать, чем занимается эмулятор?
avatar
Да нет, тревога не ложная) Я уже нашел глючные режимы — с читами в модели 48к игра после Start Game сбрасывается или глючит. Но похоже, что это глюк релиза игры. В 128к машинах режимы с читами работают нормально. И, как оказалось, проскакивания блока ленты нет, а есть релиз, с тремя образами игры под каждый режим — без читов, и на каждый чит свой образ. Очень странное решение. В общем, корявый релиз.

Бордюр и шум с динамика — это же как раз индикация загрузки у реального спектрума) Именно этот шум и указывает в эмуле на быструю загрузку с ленты, ориентируйтесь на него. В принципе, можно и в кэпшне формы выдавать сообщение о загрузке, подумаю.
avatar
Да, и какой режим игры вы выбираете?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.