Просмотр полной версии : Формат .Z80
CityAceE
03.08.2023, 21:54
Есть такой древний известный эмуляторный формат снепшотов .Z80. Вот его описание:
1. Раз (англ.) (https://neuro.me.uk/projects/wos/sinclairfaq.dev/dev/reference/z80format.htm)
2. Два (англ.) (https://worldofspectrum.org/faq/reference/z80format.htm)
3. Три (рус.) (http://www.emuverse.ru/wiki/.z80)
Там вроде всё предельно понятно. Но, то ли я считать не умею, то ли одно из двух - между заголовком и, собственно, данными, всегда есть некие три байта, которые нигде не документированы. Чаще всего это три нуля, но иногда это последовательность из #00, #FF, #00. Ткните, пожалуйста, меня носом где я не так считаю или какую информацию воспринял превратно.
Прилагаю для примера игру HUDSON HAWK в формате .Z80. Там как раз сразу после заголовка длиной #33 идут те самые три байта #00, #FF, #00, и уже после них байты данных с заголовком (#E3, #3E, #03 - запакованные данные длиной #3EE3 в странице #03).
Spectramine
04.08.2023, 00:44
Заголовок длиной #37=55 байт, в нем последние 16 байт - содержимое регистров AY. Откуда взялась длина заголовка #33, непонятно.
marinovsoft
04.08.2023, 03:33
https://zx-pk.ru/threads/34789-podderzhka-hdd-slave-v-scorpion-zs-256.html?p=1172928&viewfull=1#post1172928
type
ThdrZ80 = packed record
a,f:Byte;
bc,hl,pc,sp:Word;
i,r,flags:Byte;
de,bc1,de1,hl1:Word;
a1,f1:Byte;
iy,ix:Word;
iff1, iff2, im:Byte;
{ 2.01 extension }
len, newpc:Word;
model, p7FFD:Byte;
r1,r2, p7FFD_1:Byte;
AY:Array[0..15] of Byte;
{ 3.0 extension }
LowT:Word;
HighT:Byte;
ReservedFlag:Byte;
MgtRom:Byte;
MultifaceRom:Byte;
RamRom0:Byte; // 0000-1FFF ram/rom
RamRom1:Byte; // 2000-3FFF ram/rom
KbMap1:Array[0..9] of Byte;
KbMap2:Array[0..9] of Byte;
MgtType:Byte;
Disciple1:Byte;
Disciple2:Byte;
p1FFD:Byte;
end;
Значение len равно длине дополнительного заголовка без учета самого поля len. То есть для того, чтобы найти начало данных страниц, нужно прочитать изначальный заголовок, проверить если PC=0, то прочитать два байта в len и пропустить len байт. Надеюсь не слишком спутано объяснил, в исходнике по ссылке будет понятнее.
CityAceE
04.08.2023, 08:17
Откуда взялась длина заголовка #33, непонятно.
Да, что-то не то, я написал. По адресу #001E находится длина дополнительного заголовка - #17. Итого длина старого заголовка #1E + длина дополнительного #17 = #35. По адресу #0035 у нас #FF, #00.
Значение len равно длине дополнительного заголовка без учета самого поля len.
Собственно, я пришёл к точно такому же выводу, хотя это нигде не оговаривается.
То есть для того, чтобы найти начало данных страниц, нужно прочитать изначальный заголовок, проверить если PC=0, то прочитать два байта в len и пропустить len байт.
Примерно так и делаю в конверторе Z80 -> SNA.
Вообще, после изучения формата .Z80 мне он показался каким-то весьма странным. Такое ощущение, что автор каждый раз накидывал на него сверху какие-то данные по ходу написания эмулятора. Все данные сильно разрознены. Да к тому же в самом снепшоте автор пытается хранить настройки самого эмулятора.
Black Cat / Era CG
04.08.2023, 08:21
Да к тому же в самом снепшоте автор пытается хранить настройки самого эмулятораОно как бы в некотором смысле даже логично. Типа сейв состояния эмулятора, заточенный работать именно на этом эмуляторе.
- - - Добавлено - - -
Кто ж мог подумать, что люди будут использовать их для того, для чего они не задуманы.
Spectramine
04.08.2023, 09:50
Собственно, я пришёл к точно такому же выводу, хотя это нигде не оговаривается.
С длиной расширения заголовка, включающей поле длины, 16 байт содержимого регистров AY не влазят в расширение. Логичный вывод - длина расширения не включает поле длины.
- - - Добавлено - - -
Оно как бы в некотором смысле даже логично. Типа сейв состояния эмулятора, заточенный работать именно на этом эмуляторе.
- - - Добавлено - - -
Кто ж мог подумать, что люди будут использовать их для того, для чего они не задуманы.
Я в свое время делал своё расширение .z80 формата , писал дополнительные настройки своего эмулятора в него, причем расширение было не в заголовке, а после содержимого памяти. Когда сделал поддержку SZX формата, всю доп.инфу стал хранить в отдельном своем блоке SZX, там удобнее - можно задать сигнатуру своего блока на общем формате блоков. К сожалению, некоторые существующие эмуляторы (SpecEmu, Fuse), вместо того чтобы спокойно проигнорировать незнакомый блок (мало ли кто какие расширения добавил у себя), информируют о неверном формате, и даже отказываются грузить SZX. А Спектакулятор и Спуд вообще вылетают. Приходится для совместимости делать разные сейвы для себя и других эмулей.
Хорошо, что не все эмуляторы такие - ZXMAK2, Zero, Es.pectrum игнорируют незнакомые блоки SZX.
Lethargeek
04.08.2023, 10:24
Оно как бы в некотором смысле даже логично. Типа сейв состояния эмулятора, заточенный работать именно на этом эмуляторе.
вряд ли там задумано так было, скорей от лени - проще было сбросить на диск тупо состояние структур в памяти
причем расширение было не в заголовке, а после содержимого памяти.
слегка офф, но бесит до сих пор, что в несжатом sna регистры+ сунуты в начало и в середину, а не в конец, отчего неудобно покать sna в обычном hexedit :v2_dizzy_angry:
Spectramine
04.08.2023, 10:40
слегка офф, но бесит до сих пор, что в несжатом sna регистры+ сунуты в начало и в середину, а не в конец, отчего неудобно покать sna в обычном hexedit :v2_dizzy_angry:
Дауш) ещё и порядок регистров такой, что иначе как "от фонаря" не назовешь, смотреть тоже неудобно. Про PC вообще молчу.
Может уважаемые знатоки тогда подскажут, что не так со снапшотами в другом, хорошем, эмуляторе Z80Stealth (увы, автор давно тут не появлялся)?
Читать то он читает любые снапшоты .z80, авот записывает похоже в своем собственнном формате, и не один известный(мне:) эмуль этот снапшот не понимает :(( Я тут застрял в игре на 96 уровне, но или игра всё, или эмуль - всё, но проверить в других эмулях нереально. Тоже видимо надо конвертер z80=>z80
Spectramine
05.08.2023, 06:52
Похоже, автор Z80Stealth где-то налажал с упаковкой памяти внутри формата .z80
CityAceE
05.08.2023, 11:36
записывает похоже в своем собственнном формате
Да, там сразу же в заголовке идёт расхождение со стандартным описанием формата.
CityAceE
05.08.2023, 15:12
Тоже видимо надо конвертер z80=>z80
Стандартный формат .Z80 может хранить память не более 128К (8 страниц). В предложенном варианте от Z80Stealth вначале сохранено 86 страниц с номерами от #00 до #55 (1376 Кб), следом идут ещё 130 страниц с номерами от #00 до #81 (2080 Кб) и, наконец, ещё три страницы 4, 5, 8 (стандартное ОЗУ 48 Кб), которые дублируются из первого набора страниц. Естественно, это выходит далеко за рамки стандартного формата .Z80.
Воспользовавшись своими наработками, конвертнул этот снепшот в стандартный SNA в версии для 128 Кб. Естественно, сохранились только первые 8 страниц. Сама игра вроде запускается и работает, но AY шумит. Несохранённые страницы не были пустыми. Как минимум, в трёх из них было много каких-то данных. Скорее всего я не уловил порядок расположения страниц, так как среди первых 8 сохранённых страниц было 4 точно были пустыми. Вероятно, если ещё посидеть и поразбираться, можно будет улучшить результат.
Spectramine
05.08.2023, 16:09
Стандартный формат .Z80 может хранить память не более 128К (8 страниц). В предложенном варианте от Z80Stealth вначале сохранено 86 страниц с номерами от #00 до #55 (1376 Кб), следом идут ещё 130 страниц с номерами от #00 до #81 (2080 Кб) и, наконец, ещё три страницы 4, 5, 8 (стандартное ОЗУ 48 Кб), которые дублируются из первого набора страниц. Естественно, это выходит далеко за рамки стандартного формата .Z80.
Какой ужос. Автор вообще не парился с совместимостью. Плюс зачем хранить страницы по 2 раза? Кстати, стандартное ОЗУ 48кб это обычно страницы 5,2,0, так, по крайней мере, после перехода в 48кб режим на 128кб машинах. Ну ещё может быть логично 0,1,2, если не париться с совместимостью 48/128 снапов.
Воспользовавшись своими наработками, конвертнул этот снепшот в стандартный SNA в версии для 128 Кб. Естественно, сохранились только первые 8 страниц. Сама игра вроде запускается и работает, но AY шумит.
Скорее всего шумит, потому что в SNA не сохраняется содержимое регистров AY.
CityAceE
05.08.2023, 16:42
Стандартный формат .Z80 может хранить память не более 128К (8 страниц). В предложенном варианте от Z80Stealth вначале сохранено 86 страниц с номерами от #00 до #55 (1376 Кб), следом идут ещё 130 страниц с номерами от #00 до #81 (2080 Кб)
Я так понял, что вначале идёт память самого Спектрума, вероятно, какого-то жирного Пентагона с диким количеством памяти. А во втором блоке память General Sound. А, возможно, в такие снепшоты всегда отгружается максимально возможное количество памяти.
Кстати, стандартное ОЗУ 48кб это обычно страницы 5,2,0, так, по крайней мере, после перехода в 48кб режим на 128кб машинах. Ну ещё может быть логично 0,1,2, если не париться с совместимостью 48/128 снапов.
Там всё ещё более запутано. Страницы 48 Кб из третьего блока, которые с номерами 4, 5, 8, по содержимому соответствуют страницам 2, 0, 5 из первого блока. Я просто проигнорировал третий блок и брал всю информацию из первого блока по правилам построения .Z80, естественно сделав корректировку на номера страниц, так как в стандартном .Z80 номера страниц лежат в диапазоне #03-#0A, а тут нумерация начинается с нуля.
Скорее всего шумит, потому что в SNA не сохраняется содержимое регистров AY.
Оказывается, это эмулятор, на котором я проверял, косячил - он шумел после предыдущего запущенного снепшота. А после сброса эмулятора и загрузки снепшота на бело никакого шума больше AY нет. И на первый взгляд всё вроде как работает, как должно.
Собственно, посмотрел оригинал игры и она оказалась, рассчитанной на 48К. Так что и рабочий снепшот можно сделать соответствующий (см. вложение).
Спасибо!!
Тяжковато в эту игру играть без мышА, но я смог :) в десятый раз наверное прошел этот 95 уровень, в этот раз на SpecEmu. Увы, все так же точно - 96 уровень не работает. (Видимо происходит переполнение экрана вновь добавленными квадратиками )
Ну тогда я абсолютный WIN! :)
По поводу странного.z80 в Стелсе. Ну кто же знал, что автор задумал свой собственный формат и явно это нигде не указал. Видимо он под 512-ю модель Пентагона изобретал. Теперь мы этого не узнаем, увы.
p.s. В принципе можно попробовать загрузить демо в Pent512 cо всеми страницами GS и сделать снапшот
CityAceE
05.08.2023, 20:12
Тяжковато в эту игру играть без мышА
Почему без мыша? У меня работает мышь в игре, загруженной с этого снепшота (SNA48).
UncleDim
05.08.2023, 23:40
(извинити мы люди не местные)
а формат с сохранением рома существует? где-то глубоко тлеющая идея про ленинград с мелкой пзу и псевдоромом, с загрузкой этого псевдорома и рама за раз - получила некое свежее дыхание (загрузил картинку с SD, прикрученную на порт fe ленинграда, вместо магнитофона, напрямую), ну так когда/если дойдет до загрузки с выбором файла, то он может уже существует? (не целиком же велосипед заново изобретать)
Spectramine
06.08.2023, 01:13
а формат с сохранением рома существует?
Да, как раз .z80 позволяет сохранять страницы ПЗУ в себе. А также .szx. Но обычно ПЗУ не сохраняются эмуляторами.
UncleDim
06.08.2023, 02:04
.z80 позволяет
пасиб)
буду думать в эту сторону..
Да, что-то не то, я написал. По адресу #001E находится длина дополнительного заголовка - #17. Итого длина старого заголовка #1E + длина дополнительного #17 = #35. По адресу #0035 у нас #FF, #00.
длина основного заголовка действительно #1e (30), а вот дополнительного заголовка не #17 (23), а #19 (25). Отсюда у вас и получилось два якобы "лишних" байта, на самом деле это два последних байта расширенного заголовка, т.е. последние байты регистров AY.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot