Просмотр полной версии : Надёжное и элегантное автоматическое опознание модели спектрума
introspec
31.08.2013, 22:22
всем пока
Alex Rider
31.08.2013, 22:26
Возможно, курение исходников эмуляторов - неплохой путь для нахождения новых детектов. ZXMAK2 в этом смысле хорош.
introspec
31.08.2013, 22:29
Возможно, курение исходников эмуляторов - неплохой путь для нахождения новых детектов. ZXMAK2 в этом смысле хорош.
Я понимаю, как разбираться в железе, но прошу поделиться конкретным опытом, так же, как я поделился своим опытом чуть выше. Изобрести тест ничего не стоит, а вот учесть, что новоизобретённый тест сделает на какой-нибудь неучтённой конфигурации - далеко не тривиальная задача.
4. #FF по адресу #0013 (48k ПЗУ)
Верно для всех британских спектрумов, т.е. 48/48+/128/+2(серый)
Удобно, чтобы отсечь испанские спектрумы, т.е. +2a/+2b/+3.
На самом деле испанский спектрум это ZX Spectrum 128.
Модель +2 идентична модели 128, но в другом корпусе с магнитофоном и переразведенной платой.
+2a/+2b/+3 разработка Amstrad, британской фирмы.
introspec
01.09.2013, 12:16
На самом деле испанский спектрум это ZX Spectrum 128.
Модель +2 идентична модели 128, но в другом корпусе с магнитофоном и переразведенной платой.
+2a/+2b/+3 разработка Amstrad, британской фирмы.
Да, спасибо за поправку, не знаю, где я подцепил эту идею. Сейчас переделаю пост.
introspec, я так понял ты собираешься сделать универсальную тестирующую процедуру, которая однозначно на выходе выдает модель?
Думаю тут комплексно всё тестить нужно, и память, и такты и прошивки.
introspec
01.09.2013, 13:36
Думаю тут комплексно всё тестить нужно, и память, и такты и прошивки.
Ну я примерно так и делаю сейчас. Любую классику я сейчас ловлю по числу тактов и/или поведению диспетчера памяти #1FFD; плюс, есть ещё описанное выше свойство ПЗУ, которым я больше не пользуюсь, хотя работало оно, кажется, неплохо.
Проблемы у меня начинаются с отечественными клонами, т.к. многие из них имеют довольно похожие времянки. Плюс, их реально слишком много, а хочется, ок, если не поддерживать ВСЁ, то хотя бы более-вменяемо отрабатывать на неподдержанном "в лоб" железе.
хорошее определение классики (для правильного построения бордюрного скролла) есть в игре Sentinel, там после задержки проверяется системная переменная (frames)
Компы Амстрада можно определить по 1FFD, отключением ПЗУ, потом смотрим регистры FDC если они есть, то вполне вероятно, что у нас +3. У +2(серый) и +2A/B+3 разные страницы медленные (на форуме velesoft расписывал уже 2 или 3 раза). Читать содержимое ПЗУ не очень надёжный способ, т.к. юзер ПЗУ может и заменить. Если на профи нажата кнопка отключения всего, что выше Sp-128, то DFFD не опознается никак. Времянки смотреть + читать пустую шину данных, на 48, 128 и +2(серый) будут читаться атрибут если мы читаем в момент его отображения на экране, на компах от Амстрада этого вроде нет (я не помню точно).
introspec
01.09.2013, 16:09
хорошее определение классики (для правильного построения бордюрного скролла) есть в игре Sentinel, там после задержки проверяется системная переменная (frames)
Спасибо! у меня с классикой пока нет проблем, но глянуть полезно будет.
---------- Post added at 13:09 ---------- Previous post was at 13:01 ----------
Компы Амстрада можно определить по 1FFD, отключением ПЗУ, потом смотрим регистры FDC если они есть, то вполне вероятно, что у нас +3. У +2(серый) и +2A/B+3 разные страницы медленные (на форуме velesoft расписывал уже 2 или 3 раза). Читать содержимое ПЗУ не очень надёжный способ, т.к. юзер ПЗУ может и заменить. Если на профи нажата кнопка отключения всего, что выше Sp-128, то DFFD не опознается никак. Времянки смотреть + читать пустую шину данных, на 48, 128 и +2(серый) будут читаться атрибут если мы читаем в момент его отображения на экране, на компах от Амстрада этого вроде нет (я не помню точно).
Да, про дополнительные ПЗУ, изменённые медленные страницы и отсутствие порта #FF у Amstrad я знаю. Про порты диска я не подумал, спасибо, хотя пока мне не нужно было отличать +2а от +3.
Про тумблер у профи не знал - получается, надёжнее всего сделать тест задержек памяти и ловить отечественные клоны на их отсутствии. Спасибо, это очень полезная информация.
Тесты через TR-DOS не годятся, т.к. вылетают там, где её нет.
Проверить наличие TR-DOS можно проанализировав область системных переменных и уже оттуда плясать дальше.
SoftLight
19.09.2013, 12:52
Проверить наличие TR-DOS можно проанализировав область системных переменных и уже оттуда плясать дальше.
Если тест загружается с магнитофона то область переменных TR-Dos может быть еще не инициализирована.
А если серьезно, то надо делать три теста для более менее правдоподобного определения модели:
1) CRC16 ПЗУ (и соотв. где-то под рукой иметь табличку собранных заранее значений);
2) Длина INT
3) Порты
Только вот какой смысл? Такой полноценный тест как раз и займет большую часть ОЗУ в 16k модели. Лучше заранее затачивать свои разработки на кол-во строк в экране Pentagon/Original - все остальное лесом.
Если тест загружается с магнитофона то область переменных TR-Dos может быть еще не инициализирована.
тут уже чисто логика здравого разума. Если загрузили с магнитофона при наличии TR-DOS - ну не лох ли я? Во всяком случае катастрофы не будет, как при попытке обращения к TR-DOS при ее отсутствии.
---------- Post added at 12:16 ---------- Previous post was at 12:14 ----------
1) CRC16 ПЗУ (и соотв. где-то под рукой иметь табличку собранных заранее значений);
не очень удачная идея... для фирменных машин - все ок, а вот для остальных... Сколько версий 48го бейсика существует? Сотни, если не больше.
Сотни, если не больше.
Какие сотни? rom'ы в студию.
drbars, увы итальянский сайт с ромами сломался... но сам можешь примерно прикинуть - чуть ли не каждая фирма, выпускающая клон спектрума считала своим долгом сделать свою версию бейсика, внедряла в нее русский шрифт, копирайты, турбо-загрузчики и прочие плюшки. Один Робик только имеет 3 версии ПЗУ Basic48, из-за чего поплатился с совместимостью, как и многие другие русские клоны. А всякие Didactic Scalika, Delta, Орель БК??? Или они все будут иметь одну CRC?
---------- Post added at 12:30 ---------- Previous post was at 12:28 ----------
Я не говорю уже о том, что некоторые версии TR-DOS с возможностью чтения с винта, часть функций содержали процедуры работы с винтом в области 48го бейсика.
---------- Post added at 12:31 ---------- Previous post was at 12:30 ----------
ПЗУ Basic48 Кворумов так же содержало модифицированный шрифт.
---------- Post added at 12:32 ---------- Previous post was at 12:31 ----------
OpenBasic или как его там... так же очередная версия!
---------- Post added at 12:53 ---------- Previous post was at 12:32 ----------
rom'ы в студию.
нашел полсотни ромов... подскажите чем проверить уникальность файлов?
UPD: нашел, среди 50 ромов только 2 одинаковых пары! Все еще думаете сотню не наберем? ;)
http://s019.radikal.ru/i612/1309/11/bd51e8efacb0t.jpg (http://radikal.ru/fp/ea025c20ce9c4e31a2b6b86a69ca25f5)[COLOR="Silver"]
---------- Post added at 13:10 ---------- Previous post was at 12:53 ----------
Все ромы тут - http://rghost.ru/48835637
UPD: нашел, среди 50 ромов только 2 одинаковых пары! Все еще думаете сотню не наберем?
разве сотня это много?
BYTEMAN, ну не то что бы мало... но оно указывает уже на то, что таким способом определять модель нет смысла, только для "фирмы"...
SoftLight
19.09.2013, 14:59
Почему нет смысла проверять CRC ПЗУ? Зато так вы, скажем, сможете точно определить какая из трех моделей Робика перед нами. Самая точная привязка по железу. Ну а если кто ПЗУ своего клона перепрошил - тут как бы сам виноват. Вся табличко займет 100 байт.
Зато так вы, скажем, сможете точно определить какая из трех моделей Робика перед нами.
Это мало расскажет даже о самом Робике... у меня через полгода мучений с игрушками на Робике сменилась прошивка Basic48 от фирменного спека... И что даст вам CRC в таком случае? Имхо это тупиковая ветвь... Этот способ надежным, как писал ТС, не назовешь.
В принципе, АТМ можно попытаться определить, написав на экране большими буквами что-то обидное для АТМ-щиков.
Если человек со злости ударит по клавиатуре -- значит, АТМ.
Этот же способ годится для определения некоторых других моделей.
SoftLight
19.09.2013, 15:37
В принципе, АТМ можно попытаться определить, написав на экране большими буквами что-то обидное для АТМ-щиков.
Если человек со злости ударит по клавиатуре -- значит, АТМ.
Этот же способ годится для определения некоторых других моделей.
Да и опросить сколько кнопок одновременно было нажато. Это ближе к методу который Вы в соседней теме предложили с нажатием цифры изображенной на экране.
А если серьезно -- а может, пускай юзер сам в сетупе выбирает модель из полусотни вариантов, а тест только на тонкие различия смотрит?
надо уходить от четкой логики к нечеткой:) там можно и пзу применить, и все что хочешь. и даже отмазаться, что вот 99%, что у вас скорпион, а не 100%:)
А если серьезно, то надо делать три теста для более менее правдоподобного определения модели:
1) CRC16 ПЗУ (и соотв. где-то под рукой иметь табличку собранных заранее значений);
2) Длина INT
3) Порты
И крайне желательно предусмотреть ручной выбор, на случай если неправильно определит автоматом или попадется неизвестный зверь. Тем более что:
1) уже писали (хотя можно попытаться определять не CRC или не только его, а отдельные куски кода или например надписи)
2) длительность инта на многих клонах пытались (доработками или настройками)
3) Многи порты (особенно память) на разных клонах могут пересекаться или дублироваться
---------- Post added at 16:45 ---------- Previous post was at 16:30 ----------
Ну а если кто ПЗУ своего клона перепрошил - тут как бы сам виноват. Вся табличко займет 100 байт
Если не бОльшая часть, то очень многие такие ПЗУ давно заменены на стандартные
---------- Post added at 16:51 ---------- Previous post was at 16:45 ----------
А вообще, imho, задача сильно упрощается если определиться для чего это определение нужно. Для многих задач достаточно не достоверно определить модель, а определить определенные параметры модели или их совокупность.
introspec
19.09.2013, 18:35
И крайне желательно предусмотреть ручной выбор, на случай если неправильно определит автоматом или попадется неизвестный зверь. Тем более что:
1) уже писали (хотя можно попытаться определять не CRC или не только его, а отдельные куски кода или например надписи)
2) длительность инта на многих клонах пытались (доработками или настройками)
3) Многи порты (особенно память) на разных клонах могут пересекаться или дублироваться
А вообще, imho, задача сильно упрощается если определиться для чего это определение нужно. Для многих задач достаточно не достоверно определить модель, а определить определенные параметры модели или их совокупность.
Лично меня в первую очередь интересуют точные временные параметры кадра (бордер и/или мультиколор). К сожалению, варианты с ручным выбором далеко не всегда реалистичны, просто в силу усложнения итогового кода и ограниченных возможностей спектрума как машины. Более реалистично, с моей т.зр. оказывается поддержать фиксированный набор хорошо изученных и распространённых моделей.
1. Тесты ПЗУ я не считаю элегантными и, по возможности, стараюсь их избегать, т.к. они, в каком-то смысле, косвенные. Т.е. если мы видим ПЗУ как у оригинального Спектрума, это не означает, что это Спектрум оригинальный. Если мы видим ПЗУ отличное от оригинального Спектрума, это не значит, что интересующие меня времянки не совпадут с оригиналом. Не очень ясно в таком случае, как относиться к любым итоговым результатам таких тестов - в любом случае, решение придётся принять на основании чего-то ещё, так зачем плодить сущности? Примерно по тому же принципу, определение TR-DOS по системным переменным - возможно, но не очень-то и надёжно.
2. Длительность инта. Кстати, неудачное название теста, т.к. под этим некоторые люди понимают число тактов между кадровыми прерываниями, а некоторые - собственно, саму продолжительность сигнала кадрового прерывания поступающего на процессор. В моём понимании, это отличный тест, т.к. его легко сделать компактным по памяти, и т.к. этот тест позволяет чётко отличить некоторые модели спектрумов, в частности пентагон и зелёный скорпион, а также спектрумы от Amstrad.
3. Именно из-за того, что порты пересекаются, дублируются и, зачастую, из-за неполной дешифрации, ещё и откликаются на чужие имена, я и просил людей поделиться своми наработками в этом плане.
4. У себя в программе я остановился на 2 основных тестах: кол-во тактов на фрейм + вариант кол-ва тактов на фрейм завязанный на медленной памяти, так что можно отличать компьютеры с вейтами от компьютеров без вейтов, а ещё и сортировать по видам вейтов. Кроме этого, я написал дополнительный определитель по портам, но им я совершенно недоволен, т.к. он далеко не всегда отлавливает то, что мне хотелось бы отловить.
Если временные параметры, то что мешает запилить сетуп, в котором юзер курсорными клавишами подгоняет простенький бордюрный эффект под метку на экране?
introspec
19.09.2013, 18:44
А если серьезно, то надо делать три теста для более менее правдоподобного определения модели:
1) CRC16 ПЗУ (и соотв. где-то под рукой иметь табличку собранных заранее значений);
2) Длина INT
3) Порты
Только вот какой смысл? Такой полноценный тест как раз и займет большую часть ОЗУ в 16k модели. Лучше заранее затачивать свои разработки на кол-во строк в экране Pentagon/Original - все остальное лесом.
Согласен, кроме ПЗУ, по причинам изложенным выше. Проверять ПЗУ по-настоящему есть смысл только в том случае, если планируется именно что использование ПЗУ. По-настоящему, я надеялся услышать какие-то идеи относительно 3, т.е. о проверенных в деле последовательностях для тестирования моделей по портам.
---------- Post added at 15:44 ---------- Previous post was at 15:40 ----------
Если временные параметры, то что мешает запилить сетуп, в котором юзер курсорными клавишами подгоняет простенький бордюрный эффект под метку на экране?
Мешает то, что есть очень много различных подводных камней, которые можно обойти в случае знания конкретной модели спектрума, и которые нельзя обойти "простеньким бордюрным эффектом". Разные виды задержек памяти и процессора. Разное положение int относительно экрана.
Разное положение int относительно экрана.
А что тут сложного? Пауза больше -- пауза меньше.
Разные виды задержек памяти и процессора
Мда, согласен.
introspec
19.09.2013, 18:50
А что тут сложного? Пауза больше -- пауза меньше.
Ммм... давай сделаем так, запрограммируюй что-нибудь в этом роде, работающее одновременно хотя бы на 48к оригинале, 128к+3 от Amstrad, Пентагоне и, для пущего веселья, на Ленинграде-1, и приходи сюда снова, обсудим.
Ммм... давай сделаем так, запрограммируюй что-нибудь
Ко мне больше подходит вот это. Я не кодер.
introspec
19.09.2013, 18:58
Я не кодер.
Ну и зачем тогда засорять темы рассуждениями по типу:
А что тут сложного? Пауза больше -- пауза меньше.
А если поиграть со стеком на грани вылета из прерывания и посмотреть, в какой памяти на каких значениях процедура вылетает?
Ты извини, если я случайно глупости пишу.
---------- Post added at 17:03 ---------- Previous post was at 17:01 ----------
Есть такой прием -- "свежая голова", человек со стороны. Иногда он неожиданно находит правильное решение.
Вот я и хочу тебе помочь.
К сожалению, варианты с ручным выбором далеко не всегда реалистичны, просто в силу усложнения итогового кода и ограниченных возможностей спектрума как машины. Более реалистично, с моей т.зр. оказывается поддержать фиксированный набор хорошо изученных и распространённых моделей.
Я имел ввиду ручной выбор из тех моделей, которые должны определяться автоматом. Просто на случай неправильного определения.
introspec
19.09.2013, 19:13
Я имел ввиду ручной выбор из тех моделей, которые должны определяться автоматом. Просто на случай неправильного определения.
Ну я всё же спрашивал о "надёжном" определении! :)))))))
Максагор
19.09.2013, 22:34
7. Я не знаю ни одного элегантного и надёжного теста АТМ1 и АТМ2. Тесты через TR-DOS не годятся, т.к. вылетают там, где её нет. Может быть кто-то знает хороший простой тест наличия TR-DOS? Из документации, у меня сложилось впечатление, что можно бы было ловить ATM по поведению битов 5 и 7 порта #FE (при чтении). К сожалению, я не уверен, есть ли хоть один эмулятор который бы воспроизводил корректное поведение этих битов. Не подскажете?
Именно так, по отслеживанию сигнала Z (который по схеме, прошитой в ПЛМ1556ХЛ8, "мигает" - иногда в "1", иногда в "0") при чтении порта #FE. В АТМ-1 он висит на бите D7, а в АТМ-2(+) - на бите D5.
Как там в эмулях, не знаю...
introspec
19.09.2013, 23:51
Именно так, по отслеживанию сигнала Z (который по схеме, прошитой в ПЛМ1556ХЛ8, "мигает" - иногда в "1!, иногда в "0") при чтении порта #FE. В АТМ-1 он висит на бите D7, а в АТМ-2(+) - на бите D5.
Как там в эмулях, не знаю...
Тогда поэкспериментирую по крайней мере. А как часто мигает? несколько раз за прерывание или реже? Или это до сих пор военная тайна? :)
Максагор
20.09.2013, 02:22
Тогда поэкспериментирую по крайней мере. А как часто мигает? несколько раз за прерывание или реже? Или это до сих пор военная тайна? :)
Определенное количество раз за прерывание и в определенном порядке ноликов и единичек по определенному алгоритму. На этом сигнале в свое время строилась система защиты плат от пиратского копирования. "Родная" ПЗУ от МикроАРТ была заксорена (так, что даже не просмотришь HEX-эдитором), а в определенной последовательности ноликов и единичек сигнала Z был зашифрован ключ от расксорки. Если ключ не подходил (или контрольная сумма ПЗУ в результате правки не совпадала), комп ругался, что он взломан злобными хакерами и отказывался работать (выхавал надпись "I cracked! I halted! Press RESET to continue!"). Сама ПЛМ 1556ХЛ8 была защищена от считывания, чтобы нельзя было посмотреть, как сформировать такой же сигнал. Само собой, что сигнал Z был разным у разных версий ATM - на ATM-1 - одна последовательность, на ATM-2 версии фирмы ATM - другой, ну уже на ATM-2 и 2+ от МикроАРТ - третий. В современном ПЗУ xBIOS, само собой, эта защита уже не используется...
Но это так - сообщаю для академического саморазвития. Нам все эти последовательности не нужны. Нам нужно просто дать HALT, после чего в течении одного прерывания читать нужный бит. Если он хотя бы ОДИН раз изменит свое значение, значит это та самая модель, которую мы определяем. Вот и все.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot