
Сообщение от
psb
есть один минус значительный: например, если на прерываниях висит музыка, мы их запрещаем на очень долгое время - будут завывания... так что, все же, не любые условия.
В самом худшем случае будет одно завывание. Т.к. если PC один раз определен, то всю процедуру можно свернуть в "LD HL, const; RET"
Если оценить по времени процедуру Лас, то в наиболеевероятномслучае (если вся память не забита кодом #18) время поиска составляет ~64k*40 тактов, что порядка 0.6-0.7 с.
Вот модифицированная на ускорение программа Лас'а:
Код:
ld ix,#4000 ;начинаем искать в памяти с этого адреса
ld de,#0010 ;шаг поиска
bad ld a,#18 ;ищем код JR
not_jr cp (ix+0) ;в памяти лежит JR?
add ix, de
jr nz,not_jr ;если не JR, поиск далее
; докатываем до конца блока из #18
loop18 inc ix
cp (ix+0)
jr z, loop18
dec ix
ld a,(ix+0) ;иначе берем смещение за JR
cp 2 ;сравниваем с величиной относительного смещения нашего JR
jr nz,bad ;оно не такое как у нас?
ld (ix+0),0 ;если значение такое же, то уничтожаем смещение
jr block
; #18 15 раз.
DEFB #18,#18,#18,#18,#18,#18,#18,#18,#18,#18,#18,#18,#18,#18,#18,#18
block DEFB #18 ;вот тут после JR (код #18) - 16й #18.
DEFB 2 ;cмещение указывает через ловушку
jr trapped ;<----сюда попадем если обнулили искомое смещение.
ld (ix+0),a ;иначе попадаем сюда. восстанавливаем смещение
jr bad ;и снова ищем JR
trapped ;cюда попадаем, если уничтожили нужное смещение
ld (ix+0),a ;восстанавливаем байт смещения
;IX установлен на байт смещения
LD DE,16
ADD IX,DE
;вот и все. PC вычислен
;IX=$ !!!
;тут можно восстановить режим прерываний, если изменяли его ранее
Здесь имеем скорость перебора ~ в 16 раз более высокую.