User Tag List

Страница 5 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 41 по 50 из 53

Тема: Определение текущего адреса

  1. #41

    Регистрация
    18.11.2008
    Адрес
    пос.Полярный, ЯНАО
    Сообщений
    1,079
    Спасибо Благодарностей отдано 
    5
    Спасибо Благодарностей получено 
    15
    Поблагодарили
    9 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот самое оригинальное решение топика . Алгоритм, естественно, можно модифицировать. Но идею я постараюсь до вас донести, спектрумисты.
    Процедура, естественно, релоцируема.
    Прерывания можно и не запрещать, если вы уверены в том что не данная процедура не модифицирует код процедуры обработки прерываний и вызываемых ею подпрограмм в неподходящий момент.)

    В общем, эта процедура ищет в памяти последовательность #18,#02
    и если находит, то обнуляет смещение, и если получается что она модифицировала сама себя, то IX будет указывать на нашу программу и мы его скорректируем с PC, а если модифицировала что-то иное - то тут же восстановит данные и поиск продолжится.

    Код:
     ;тут надо бы запомнить режим прерываний, процедуру писать не буду
    
    	       di
    ;а можно и не запрещать прерывания по вышеизложенным причинам.
            ld ix,#4000		;начинаем искать в памяти с этого адреса
    bad	ld a,#18		;ищем код JR
    not_jr	cp (ix+0)		;в памяти лежит JR?
    	inc ix
    	jr nz,not_jr	;если не JR, поиск далее
    	ld a,(ix+0)		;иначе берем смещение за JR
    	cp 2	;сравниваем с величиной относительного смещения нашего JR
    	jr	nz,bad	;оно не такое как у нас?
    	ld (ix+0),0 ;если значение такое же, то уничтожаем смещение
            DEFB	#18	;вот тут после JR (код #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=$  !!!
            ;тут можно восстановить режим прерываний, если изменяли его ранее

  2. #42

    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,822
    Спасибо Благодарностей отдано 
    274
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    95 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Лас Посмотреть сообщение
    Вот самое оригинальное решение топика
    Я прикидывал такой вариант, но он не подходит если в код в области ROM лежит.
    Там ведь менять нельзя?
    Или я опять не понял требований темы?

    А если в общем плане (при нормальных условиях, без извратов с неизвестным стеком, ROM, IM и т.д.) - то это самый лучший вариант.

  3. #43

    Регистрация
    18.11.2008
    Адрес
    пос.Полярный, ЯНАО
    Сообщений
    1,079
    Спасибо Благодарностей отдано 
    5
    Спасибо Благодарностей получено 
    15
    Поблагодарили
    9 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Destr Посмотреть сообщение
    А если в общем плане (при нормальных условиях, без извратов с неизвестным стеком, ROM, IM и т.д.) - то это самый лучший вариант.
    Я извиняюсь, но это самый подходящий вариант при любых условиях , за исключением работы этого варианта из ПЗУ. Но такого условия не стояло. Условие стояло - "пзу может отсутствовать" .
    Да, пзу может отсутствовать. Прерывания мы запретим. Стек может быть где угодно (неизвестен) и режим прерываний может быть любым (IM 0,1,2). А состояние прерываний (enable/disable) может определить, сохранить и восстановить даже зеленый нуб.

  4. #44

    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,928
    Спасибо Благодарностей отдано 
    37
    Спасибо Благодарностей получено 
    124
    Поблагодарили
    44 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Лас Посмотреть сообщение
    Вот самое оригинальное решение топика .
    Круто! Гениально! Респект! Спасибо! Буду использовать этот вариант.

  5. #45

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    есть один минус значительный: например, если на прерываниях висит музыка, мы их запрещаем на очень долгое время - будут завывания... так что, все же, не любые условия.

  6. #46

    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,928
    Спасибо Благодарностей отдано 
    37
    Спасибо Благодарностей получено 
    124
    Поблагодарили
    44 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от psb Посмотреть сообщение
    есть один минус значительный: например, если на прерываниях висит музыка, мы их запрещаем на очень долгое время - будут завывания... так что, все же, не любые условия.
    Да, не учел этого... Да и время вызова получится существенное. Придется идти на такие хитрости и ограничения:
    1) во время поиска прерывания не запрещать, запрещать только на момент проверки адреса;
    2) сделать настройку на адрес при первом вызове;
    3) запретить перемащать код в памяти после первого вызова (ну или делать проверку по ключу на перемещение и повторять настройку при перемещении).

  7. #46
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #47

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    и весь этот геморрой, чтобы не юзать стек (который наверняка можно юзать) и не портить экран на неск. тактов (которые даже не увидишь).

  9. #48

    Регистрация
    25.04.2009
    Адрес
    Gomel, Belarus
    Сообщений
    32
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от psb Посмотреть сообщение
    есть один минус значительный: например, если на прерываниях висит музыка, мы их запрещаем на очень долгое время - будут завывания... так что, все же, не любые условия.
    При необходимости процедуру можно ускорить в разы и даже в десятки раз.

    Например в памяти располагаем ключ из одинаковых байт X длиной в N. При поиске ищем байт X с шагом N. Если нашли, определяем его хвост. Меняем хвост. Если это наш измененный хвост, значит мы нашлись.

  10. #49

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от bsivko Посмотреть сообщение
    При необходимости процедуру можно ускорить в разы и даже в десятки раз.
    только запрос на прерывание обычно длится 28 тактов.

  11. #50

    Регистрация
    25.04.2009
    Адрес
    Gomel, Belarus
    Сообщений
    32
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от 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 раз более высокую.
    Последний раз редактировалось bsivko; 22.06.2012 в 18:37.

Страница 5 из 6 ПерваяПервая 123456 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Расчет адреса точки на экране
    от Ares в разделе Программирование
    Ответов: 10
    Последнее: 26.07.2012, 17:46
  2. Адреса 00H-100H
    от Helloween в разделе Оси
    Ответов: 14
    Последнее: 10.05.2011, 14:26
  3. FDD - адреса
    от AlexBel в разделе MSX
    Ответов: 1
    Последнее: 11.05.2009, 10:45
  4. Определение Turbo-FM
    от Максагор в разделе Программирование
    Ответов: 21
    Последнее: 28.09.2007, 20:29
  5. Определение номера дисковода
    от goodboy в разделе Программирование
    Ответов: 2
    Последнее: 22.06.2005, 01:54

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •