Вход

Просмотр полной версии : Полосы в ZX Spectrum без ПЗУ как образуются?



PATHNK
27.04.2013, 10:20
Смутно помню когда налаживал ZX Spectrum'ы одним из последних этапов был запуск Speccy без ПЗУ. При этом на экране отображались повторяющиеся полосы, которые ни с чем не спутаешь (изображение не нашел в Инете). И еще важный момент эти полосы могли в случайном порядке меняться местами при сбросе, но были только двух видов.

Еще тогда задумывался: "Как же они образовываются"?, и не находил ответа. Пробую сейчас разобраться: все равно что-то другое получается явно ошибочное. Вот смотрите:
- Нажимаем мы сброс, Z80 обнуляет все регистры и считывает с 0 адреса регистра команд команду #FF которая "висит" на пустой шине данных;
- Это команда RST #38 (RST это сокращенное RESTART) аналогична CALL #38 только однобайтовая;
- По ней мы обращаемся к адресу #0038 и считываем команду оттуда, там опять #FF, таким образом входим в вечный цикл, при этом стек будет сохраняться вплоть до 0 и потом "все опять повторится сначала...";
- Таким образом у нас в оперативке, в том числе и в видео области будет повторяющееся число #0038.
Рассуждения правильные или нет?
Но откуда взяться случайному переходу в два вида?

Lion17
27.04.2013, 10:44
Знаменитый "матрас".
Могу придумать только одно объяснение - это зависит от состояния SP в момент Reset'а. Четный-нечетный. Соответственно полосы могут смещаться на байт в сторону.

По этой версии не все регистры Z80 обнуляются при сбросе.

Хотя у Шин Янга написано, что SP всегда устанавливается в FFFF. Но возможны это отличается для разных производителей, либо из-за дребезга линии Reset, сброс выполняется не до конца. Ведь не зря есть требование удерживать Reset в течении определенного количества тактов.

Eltaron
27.04.2013, 10:44
#0038
#0039, в стек кладется адрес возврата

ZEK
27.04.2013, 12:08
Хотя у Шин Янга написано, что SP всегда устанавливается в FFFF.
когда было подключена DE1 к KAY, смотрел на шину, так вот SP там отфоноря

Blade
27.04.2013, 12:27
Z80 User Manual, стр.9:

RESET initializes the CPU as follows: it resets the interrupt enable flip-flop, clears the PC and registers I and R, and sets the interrupt status to Mode 0.

ZXMAK
27.04.2013, 18:46
вот такая картинка получается без пзу:
http://savepic.org/3444040.png

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

goodboy
27.04.2013, 18:58
Кстати, я помню что вне зависимости от наличия пзу, в момент включения на экране спектрума появлялась систематическая картинка из прямоугольных областей залитых разным цветом. Картинка напоминала шахматную доску. После сброса эта картинка не появлялась, только в момент включения.

такая картинка получается без процессора.

ZXMAK
27.04.2013, 19:47
такая картинка получается без процессора.

Да, так вот интересно - за счет чего?

PATHNK
27.04.2013, 21:44
Да, так вот интересно - за счет чего?
А ведь действительно были (!) я и забыл, и разных размеров, на Пентагоне более крупные, на Краснодаре более мелкие кажется.
Теоретически должен быть хаос: при включении питания ячейки памяти содержат случайную информацию.

Кстати с "матрасом" все сходится: число #0039 - это %00000000 00111001 синие полосы на белом фоне - 2 белых, 3 синих, 2 белых, 1 синяя; потом 8 черных. Действительно при нажатии кнопки Reset в регистр SP (Stack pointer) заносится случайное число и в зависимости от младшего бита картинка может смещаться на 8 пикселей.
Можно даже рассчитать за сколько процессор "пробежит" через все адресное пространство:
(1 / 3500000) * 65536 * 11 (тактов на выполнение #RST 38) = ~0.2 секунды

Lion17
27.04.2013, 22:51
Действительно при нажатии кнопки Reset в регистр SP (Stack pointer) заносится случайное число и в зависимости от младшего бита картинка может смещаться на 8 пикселей.
Можно даже рассчитать за сколько процессор "пробежит" через все адресное пространство:
(1 / 3500000) * 65536 * 11 (тактов на выполнение #RST 38) = ~0.2 секунды
Думаю, число все же не случайное, а сохраняется текущее. Если Reset произошел посреди выполнения операции, то SP уменьшится только на единицу и произойдет смещение матраса.

А насчет подсчета, ты не учел, что на стек помещается сразу два байта, так что надо умножать на 32768.

PATHNK
28.04.2013, 00:33
Думаю, число все же не случайное, а сохраняется текущее. Если Reset произошел посреди выполнения операции, то SP уменьшится только на единицу и произойдет смещение матраса.

Это очень маловероятно, потому что Reset "замораживает" процессор, а регистры как элементы динамической памяти требуют регенерации.
Но все-таки я решил проверить. Нашел книжку (http://rainemu.swishparty.co.uk/html/archive/dev/z80-documented.pdf). Тут описывается алгоритм этой команды:

(SP-1) <- PCh
(SP-2) <- PCl
SP <- SP-2
PC <- p

т.е. SP не может быть уменьшен на 1.
Описание тактов:
4 такта - выборка команды из памяти;
3 такта запись страшего байта PCh
3 такта запись младшего байта PCl
1 такт уменьшение на SP 2 и копирование #0038 в регистр PC



А насчет подсчета, ты не учел, что на стек помещается сразу два байта, так что надо умножать на 32768.

А вот здесь правильно, пока процессор 65636 раз выберет команду RST#38 экран построится дважды.

Lion17
28.04.2013, 01:24
Это очень маловероятно, потому что Reset "замораживает" процессор, а регистры как элементы динамической памяти требуют регенерации.
Но все-таки я решил проверить. Нашел книжку (http://rainemu.swishparty.co.uk/html/archive/dev/z80-documented.pdf). Тут описывается алгоритм этой команды:

(SP-1) <- PCh
(SP-2) <- PCl
SP <- SP-2
PC <- p

т.е. SP не может быть уменьшен на 1.
Описание тактов:
4 такта - выборка команды из памяти;
3 такта запись страшего байта PCh
3 такта запись младшего байта PCl
1 такт уменьшение на SP 2 и копирование #0038 в регистр PC


1. ИМХО, регистры в процессоре статические. Регенерации не требуют.
2. Алгоритм-то правильный, но на уровне микрокода, уверен, дело обстоит не так. (SP-1) <- PCh откуда берется SP-1? Его сначала надо вычислить, для этого нужен дополнительный двух-байтный регистр, лишнее копирование, лишний декремент. Зачем это нужно?
Реальный алгоритм должен быть типа такого:
SP--
[SP]<-PCh
SP--
[SP]<-PCl
PC<-p

По тактам тоже не верно. Я проверял осциллографом команды, следил в какой момент идет обращение к памяти.
Выходит так: 4-1-3-3

ZXMAK
28.04.2013, 02:06
1. ИМХО, регистры в процессоре статические. Регенерации не требуют.
2. Алгоритм-то правильный, но на уровне микрокода, уверен, дело обстоит не так. (SP-1) <- PCh откуда берется SP-1? Его сначала надо вычислить, для этого нужен дополнительный двух-байтный регистр, лишнее копирование, лишний декремент. Зачем это нужно?
Реальный алгоритм должен быть типа такого:
SP--
[SP]<-PCh
SP--
[SP]<-PCl
PC<-p

По тактам тоже не верно. Я проверял осциллографом команды, следил в какой момент идет обращение к памяти.
Выходит так: 4-1-3-3

RST #FF выполняется за 4+1+3+3 такта:
1) чтение инструкции 4 такта
2) выставление IR на шину адреса (без обращения к памяти) - 1 такт
3) SP--, [SP] = PCH - 3 такта
4) SP--, [SP] = PCL, PC=#FF - 3 такта

PATHNK
28.04.2013, 09:54
Можно сделать 100 сбросов и подсчитать сколько раз поменялись полосы.
Если ~50 раз - то информация в регистрах теряется.
Иначе вероятность перехода 3/11 ~27%, должно быть около 30 изменений полос.
У меня нет Спектрума живого :(