Важная информация

User Tag List

Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 18 из 18

Тема: Таблица переходов (computed goto)

  1. #11
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,645
    Спасибо Благодарностей отдано 
    243
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от shurik-ua Посмотреть сообщение
    тоже думал об этом - только непонятно как эти таблицы будут генерироваться во время ассемблирования.
    Нужен ассемблер с операциями "деление/остаток от деления" или "младший байт/старший байт слова".

  2. #12
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    Cool

    Код:
    	ld l,a		;4
    	ld h,nn		;7
    	
    	ld h,(hl)	;7
    	jp (hl)		;4
    			;	22t
    и код должен быть хитро выровнян


    Код:
    	ld l,a		;4	c 
    	ld h,nn		;7
    	
    	ld h,(hl)	;7
    	jp (hl)		;4
    ;\\\\\\\\\\\\\\\\\\\\\
    	jp nnnn		;10
    			;	32t
    тоже самое когда код не получается выровнять
    и всеравно быстрей каноничных 37 тактов
    по этой процедуре
    Код:
    	ld l,a		;4
    	ld h,nn		;7
    	
    	ld a,(hl)	;7
    	inc h		;4
    	ld h,(hl)	;7
    	ld l,a		;4
    	jp (hl)		;4
    			;	37t
    вариант с ex de,hl такой же по тактам

    - - - Добавлено - - -

    Код:
    	ld e,a		;4
    	ld d,nn		;7
    	push de		;11
    	ret		;10
    			;	32t
    без jp и hl
    если небольшое количество процедур и номера не подряд

    еще медленный вариант с сокращенным набором процедур и обрезкой старших бит за одно
    Код:
    	add a,a		;4
    	add a,a		;4
    	ld l,a		;4
    	ld h,nn		;7
    	jp (hl)		;4
    ;\\\\\\\\\\\\\\\\\\\\\
    	jp nnnn		;10
    	nop		;
    			;	33t
    - - - Добавлено - - -

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Например, одно из возможных решений выглядит так:
    ксожалению фирменные игрописатели
    восновном использует именно этот самый длинный из возможных вариантов...

    - - - Добавлено - - -

    Цитата Сообщение от JV-Soft Посмотреть сообщение
    Очень полезная тема , давайте еще извращений , мне в VGM плеере за 69 тактов надо выбрать команду ,сделать переход на ее обработчик, выбрать данные, вывести их на ямаху )
    а больше подробностей?

    а так один вывод на ямаху столько сожрет

    но можот можно как то извратится
    с пропуском вывода
    чтобы успевать в нужный битрейт
    или накапливать данные для разового вывода

    - - - Добавлено - - -

    JV-Soft, если еще не придумано
    предлагаю "рекомпилировать" вгм при инициализации
    подменяя команды вгм-а на младший адрес обработчика

    чтобы делать так
    Код:
    ld a,(de)	;7
    ld l,a	;4
    jp (hl)	;4
    - - - Добавлено - - -

    Вариант 2
    по спецификации вгм-а что у меня перед глазами

    команды начинаются с $4F

    и если команды с $C0 не используються

    то можно использовать команду как старший адрес для jp (hl)

    включить вторую видео страницу освободив память по $4000

    а через окно $С000 делать свои грязные дела


    и думаю пропуск обновления регистров
    должен прокатить
    особенно частотных
    Последний раз редактировалось NEO SPECTRUMAN; 02.07.2019 в 18:08.

  3. #13
    Guru
    Регистрация
    14.05.2015
    Адрес
    г. Харьков, Украина
    Сообщений
    2,940
    Спасибо Благодарностей отдано 
    150
    Спасибо Благодарностей получено 
    302
    Поблагодарили
    171 сообщений
    Mentioned
    4 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    NEO SPECTRUMAN, услышал тебя ,но пока у меня время мое мне не принадлежит , сорри выпал. Но тему это поднимем ,плеер написан играет ,Мик карту сваял почти.
    Увы общий формат форума вышел из рамок моего любимого места , более тут не бываю.

  4. #14
    Guru Аватар для Denn
    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,223
    Спасибо Благодарностей отдано 
    475
    Спасибо Благодарностей получено 
    900
    Поблагодарили
    592 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    Arrow

    Делаю так:

    Код:
    PUSH H
    ADD A
    ADI TAB_VECT
    STA $+4
    LHLD TAB_VECT
    XTHL
    RET
    TAB_VECT - адрес начала таблицы, размещённой кратно 16.
    Пара HL не портится.

    - - - Добавлено - - -

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    При малом количестве веток можно еще рассмотреть такой вариант:
    Код:
        OR A ;4
        JR Z,ROUTINE1 ;7/12
        DEC A ;4
        JR Z,ROUTINE2 ;7/12
        DEC A ;4
        JR Z,ROUTINE3 ;7/12
        ....
    Тут можно немного сэкономить, я в таком случае делаю так:

    Код:
    DCR A
    JM ROUTINE1
    JZ ROUTINE2
    DCR A
    JZ ROUTINE3
    ...
    Критиковать - значит объяснять автору, что он делает не так, как делал бы я, если бы умел

  5. #15
    Junior
    Регистрация
    28.10.2010
    Адрес
    Россия
    Сообщений
    26
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Доброго дня!

    Многие предлагают вызов функций через табличку по jp (hl), а в самой табличке JP xxxx

    Я тоже думаю такой вариант использовать - в теле программы для вызова функции использовать такую конструкцию:
    Код:
    CODE
    	LD H,tab/256;7t 2b
    	JP (HL);4t,1b
    	...
    TAB	
    FUNC1	JP xxxx;10t 3b
    FUNC2	JP xxxx;10t 3b
    FUNC3	JP xxxx;10t 3b
    	...		
    Вызов:
    	LD L,func    ;7t 2b
    	CALL CODE ;17t 3b
    45 тактов
    Если вместо CALL сделать RST, то 39 тактов
    Если сравнить с таким вариантом вызова функций:

    Код:
    	CALL FUNC
    	...
    FUNC JP ADR
    	...
    То занимает он 27 тактов

    Есть мысль использовать такой вариант и настройку на адрес при старте программы:

    Код:
    	LD   DE,STING
    	CALL LOAD_DLL
    ;После вызова в DE-адрес программы в памяти
    	LD  (PRINT+1),DE
    	...
    STRING	
    	DEFM "print.dll",13
    	...
    PRINT JP ADR
    	...
    
    В коде юзаем вызов
    	...
    	CALL PRINT
    	...
    PS: Ранее ещё была похожая тема по вызову функций https://zx-pk.ru/threads/1811-vyzov-...herez-rst.html
    Последний раз редактировалось specorg; 03.07.2019 в 19:28. Причина: ошибка

  6. #16
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,044
    Спасибо Благодарностей отдано 
    959
    Спасибо Благодарностей получено 
    241
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от specorg Посмотреть сообщение
    ...LD HL,TAB+XX:JP (HL)...
    То есть XX, это константа. Известна на этапе компиляции?
    И, в любом случае, почему не написать одной командой:"JP TAB+XX" или "CALL TAB+XX"? Заодно и регистр HL не портится.

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

  8. #17
    Junior
    Регистрация
    28.10.2010
    Адрес
    Россия
    Сообщений
    26
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    То есть XX, это константа. Известна на этапе компиляции?
    И, в любом случае, почему не написать одной командой:"JP TAB+XX" или "CALL TAB+XX"? Заодно и регистр HL не портится.
    Ошибочка (копипаста) вышла это скорее не вызов функции, а переход на саму функцию - исправил.

  9. #18
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    если нужна сохранность hl
    еще есть относительно быстрые jp(ix) jp(iy)
    которые очень удобно использовать как более быстрый переход в часто вызываемое место
    тк быстрее jp на 2 такта

Страница 2 из 2 ПерваяПервая 12

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

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

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

Похожие темы

  1. частотная таблица
    от goodboy в разделе Музыка
    Ответов: 36
    Последнее: 26.07.2017, 13:41
  2. Программы переходов экрана
    от AAA в разделе Софт
    Ответов: 2
    Последнее: 19.03.2013, 18:02
  3. Настроечная таблица
    от Addison в разделе Софт
    Ответов: 11
    Последнее: 19.07.2009, 20:15
  4. Кворум + 5V + TV = Шахматная Таблица
    от JeRrS в разделе Кворум
    Ответов: 1
    Последнее: 07.10.2006, 14:19
  5. Имитация GOTO из машкода
    от Jukov в разделе Программирование
    Ответов: 7
    Последнее: 01.10.2006, 15:12

Ваши права

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