Просмотр полной версии : Используем RST 0 в своих ПЗУ
NEO SPECTRUMAN
20.12.2020, 09:46
Долго хотелось использовать мне rst 0
всегда было очевидно, что достаточно где то поставить один байт в памяти
и проверять его кодом по $0000
НО всегда останавливала вероятность ложного срабатывания которая таки существует...
(а при прерывании программы ресетом еще и однозначно)
что могло бы приводить иногда к невозможности включить машину с первого раза
или сброса ее кнопкой ресета без выдергивания из розетки...
...но щас ВНЕЗАПНО вспомнил что при сбросе SP ОДНОЗНАЧНО $FFFF
и вот по нему мы и можем определить что происходит ресет или rst 0
а единственная вероятность ложного сброса только при
jp $0000 когда sp = $FFFF
и
rst 0 когда sp = $0001 (что в общем то в здравом уме невозможно)
вот мой вариант обработчика оптимизированного на скорость
который ложно срабатывает при
jp $0000 когда sp = $FFFF...$0003
и при
rst0 когда sp = $0001...$0005
то есть ложное срабатывание возможно только при кривых руках
rst0
;sp - $FFFF
push af ;sp = $FFFD ;11
push hl ;sp = $FFFB ;11
ld hl,$0005 ; -$FFFB ;10
add hl,sp ;11
jr c,reset ;7
rst0_code
pop hl ;10
pop af ;10
ret ;
;70+10t
;49+10t без сохранения AF
;28+10t без сохранения HL
просмотрел код залазит на rst 8
так что по +10 к растактовке
на дополнительные jp на add hl,sp
в отличии от обычного rst
такой вариант жрет соответственно
на 70+10t больше
на 49+10t больше без сохранения AF
на 28+10t больше без сохранения AF, HL (что уже выглядит юзабельно)
кто напишет ищо быстрее?
Lethargeek
20.12.2020, 10:38
а не проще i на ноль проверять?
вспомнил что BusySoft что-то химичил с reset`ом
https://translate.google.ru/translate?hl=ru&sl=sk&u=https://busy.speccy.cz/tvorba/stoprese.htm&prev=search&pto=aue
А вот это
rst0
;sp - $FFFF
push af ;sp = $FFFD ;11
push hl ;sp = $FFFB ;11
разве корректно делать до того, как будет настроен указатель стэка?
После сброса мы попортим ОЗУ на вершине(
Полагаю, что в некоторых случаях
ld hl,$0005 ; -$FFFB ;10
можно заменить на
ld h,0 ; 10 5
NEO SPECTRUMAN
20.12.2020, 12:11
разве корректно делать до того, как будет настроен указатель стэка?
корректно
по настроености стека мы и определяем ресет это или вызов процедуры через rst 0
если стек не настроен
мы ресетим и настраиваем
а не проще i на ноль проверять?
а кто сказал что при сбросе i = 0?
Matt4 has done some excellent research on this. He found that AF and SP are always set to
FFFFh after a reset, and all other registers are undefined (different depending on how long the
CPU has been powered off, different for different Z80 chips). Of course the PC should be set to
0 after a reset, and so should the IFF1 and IFF2 flags (otherwise strange things could happen).
Also since the Z80 is 8080 compatible, interrupt mode is probably 0.
гдето есть экспериментальное подтверждение?
- - - Добавлено - - -
вспомнил что BusySoft что-то химичил с reset`ом
это халтура
там надпись флешом котороая в момент прохождения по ней луча затирается атрибутами
даже на времянках пентагона видно что это лажа
с таким же успехом дето в наших софтварях
во время нажатия сброса устанавливается экран с 5-й страницой вместо всегда отображаемой в софтвари 7-й
и проявляется глубокий смысл на экране или порицание за произведенный сброс (ужо не помню что именно)
корректно
по настроености стека мы и определяем ресет это или вызов процедуры через rst 0
если стек не настроен
мы ресетим и настраиваем
В рамках проверки, в случае сброса, мы портим ОЗУ. Если содержимое ОЗУ до исполнения кода RESET'а не играет роли, то тогда без проблем.
NEO SPECTRUMAN
20.12.2020, 12:22
В рамках проверки, в случае сброса, мы портим ОЗУ. Если содержимое ОЗУ до исполнения кода RESET'а не играет роли, то тогда без проблем.
прога цивилизовано ложит на стек
если это включение
то содержимое памяти нам безразлично
если мы
сами решили делать команду равносильную call 0
то стеком вполне можно пользоваться
если же нажали ресет чтоб сдампить память
то портятсо только последние несколько байт в районе $FFFF
но это наверно не тот случай...
ну и если обработчик rst 0 принимает данные например в bc, de
а возвращает в a, hl
то вообще ничего не нужно пушить
и ничего не портитсо :v2_dizzy_roll:
если же нажали ресет чтоб сдампить память
то портятсо только последние несколько байт в районе $FFFF
Именно. В общем случае это некорректно.
NEO SPECTRUMAN
20.12.2020, 12:34
интересно в i8080 так же ресетитсо SP
а то эта фича было бы полезна для zx8080
- - - Добавлено - - -
Именно. В общем случае это некорректно.
в общем случае КНОПКА РЕСЕТ
сделана ВМЕСТО выдергивания из розетки и втыкания
и ОБЫЧНО ресет очищает всю память НАХРЕН :)
так что про порчу ресетом полтора байта перед полной очисткой всей памяти можно не заикатся
так же как и nmi похерит все что извращенно юзает стек и это не его проблемы
ну и не нравитсо не используйте оно в прошивках своих скорпионов :)
- - - Добавлено - - -
разве корректно делать до того,
флаги по другому не сохранить
хотя нужны ли они? скорей всего они трижды не нужны
но ld (nnnn),a и ld (nnnnn),hl намного более прожорливые чем push-ы
и требуют где то дополнительную память
то есть в случае ресета в любом случае что то похеретсо
или память или F. HL
Lethargeek
20.12.2020, 12:50
а кто сказал что при сбросе i = 0?
даташит официальный зайлоговский (27/306):
http://www.electroscheme.ru/datasheet/Zilog/z80cpu_um.pdf
но есть нюанс (c)
http://www.primrosebank.net/computers/z80/z80_special_reset.htm
и еще на ту же тему
https://baltazarstudios.com/zilog-z80-undocumented-behavior/
https://worldofspectrum.org/forums/discussion/comment/539714#Comment_539714
NEO SPECTRUMAN
20.12.2020, 13:08
но есть нюанс (c)
ну специал ресет же вроде хитрой подачей ресета вызывается
и в условиях спектрума это наверно не применимо...
- - - Добавлено - - -
даташит официальный зайлоговский
а почему это тогда не упоминается в "The Undocumented Z80 Documented"
там пишут про
all other registers are undefined
проверка на I наверное была бы побыстрее...
Lethargeek
20.12.2020, 13:32
а почему это тогда не упоминается в "The Undocumented Z80 Documented"
там пишут про
all other registers are undefined
так потому, небось, что как раз и нарвались на особый резет
по ссылке на wos во всех проверках i=0 даже если изредка r>0
NEO SPECTRUMAN
20.12.2020, 13:44
но на i8080 нету никакого I :)
только по SP
и то еще нужно уточнить
а точно ли он там сбрасывается в $FFFF
- - - Добавлено - - -
вощем rst 0 вполне можно юзать в своих грязных целях
а не только для сброса
Lethargeek
20.12.2020, 13:48
но на i8080 нету никакого I
i8080 не нужен :v2_dizzy_fire:
NEO SPECTRUMAN
20.12.2020, 13:50
i8080 не нужен
i8080 нужон :v2_dizzy_bomb:
не нужны мнемоники i8080 :v2_dizzy_fire::v2_dizzy_fire::v2_dizzy_fire::v2_d izzy_fire::v2_dizzy_fire:
да и придумалось оно в процессе размышлений о том как сделать альтернативу JR для zx8080
:)
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot