Долго хотелось использовать мне rst 0
всегда было очевидно, что достаточно где то поставить один байт в памяти
и проверять его кодом по $0000
НО всегда останавливала вероятность ложного срабатывания которая таки существует...
(а при прерывании программы ресетом еще и однозначно)
что могло бы приводить иногда к невозможности включить машину с первого раза
или сброса ее кнопкой ресета без выдергивания из розетки...
...но щас ВНЕЗАПНО вспомнил что при сбросе SP ОДНОЗНАЧНО $FFFF
и вот по нему мы и можем определить что происходит ресет или rst 0
а единственная вероятность ложного сброса только при
jp $0000 когда sp = $FFFF
и
rst 0 когда sp = $0001 (что в общем то в здравом уме невозможно)
вот мой вариант обработчика оптимизированного на скорость
который ложно срабатывает при
jp $0000 когда sp = $FFFF...$0003
и при
rst0 когда sp = $0001...$0005
то есть ложное срабатывание возможно только при кривых руках
просмотрел код залазит на rst 8Код: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
так что по +10 к растактовке
на дополнительные jp на add hl,sp
в отличии от обычного rst
такой вариант жрет соответственно
на 70+10t больше
на 49+10t больше без сохранения AF
на 28+10t больше без сохранения AF, HL (что уже выглядит юзабельно)
кто напишет ищо быстрее?