Используем RST 0 в своих ПЗУ
Долго хотелось использовать мне 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 (что уже выглядит юзабельно)
кто напишет ищо быстрее?