и код должен быть хитро выровнянКод: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 тактов
по этой процедуре
вариант с ex de,hl такой же по тактамКод: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
- - - Добавлено - - -
без jp и hlКод:ld e,a ;4 ld d,nn ;7 push de ;11 ret ;10 ; 32t
если небольшое количество процедур и номера не подряд
еще медленный вариант с сокращенным набором процедур и обрезкой старших бит за одно
- - - Добавлено - - -Код:add a,a ;4 add a,a ;4 ld l,a ;4 ld h,nn ;7 jp (hl) ;4 ;\\\\\\\\\\\\\\\\\\\\\ jp nnnn ;10 nop ; ; 33t
ксожалению фирменные игрописатели
восновном использует именно этот самый длинный из возможных вариантов...
- - - Добавлено - - -
а больше подробностей?
а так один вывод на ямаху столько сожрет
но можот можно как то извратится
с пропуском вывода
чтобы успевать в нужный битрейт
или накапливать данные для разового вывода
- - - Добавлено - - -
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.
NEO SPECTRUMAN, услышал тебя ,но пока у меня время мое мне не принадлежит , сорри выпал. Но тему это поднимем ,плеер написан играет ,Мик карту сваял почти.
Увы общий формат форума вышел из рамок моего любимого места , более тут не бываю.
Делаю так:
TAB_VECT - адрес начала таблицы, размещённой кратно 16.Код:PUSH H ADD A ADI TAB_VECT STA $+4 LHLD TAB_VECT XTHL RET
Пара HL не портится.
- - - Добавлено - - -
Тут можно немного сэкономить, я в таком случае делаю так:
Код:DCR A JM ROUTINE1 JZ ROUTINE2 DCR A JZ ROUTINE3 ...
Критиковать - значит объяснять автору, что он делает не так, как делал бы я, если бы умел
Доброго дня!
Многие предлагают вызов функций через табличку по 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 тактов
То занимает он 27 тактовКод:CALL FUNC ... FUNC JP ADR ...
Есть мысль использовать такой вариант и настройку на адрес при старте программы:
PS: Ранее ещё была похожая тема по вызову функций https://zx-pk.ru/threads/1811-vyzov-...herez-rst.htmlКод:LD DE,STING CALL LOAD_DLL ;После вызова в DE-адрес программы в памяти LD (PRINT+1),DE ... STRING DEFM "print.dll",13 ... PRINT JP ADR ... В коде юзаем вызов ... CALL PRINT ...
Последний раз редактировалось specorg; 03.07.2019 в 19:28. Причина: ошибка
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
если нужна сохранность hl
еще есть относительно быстрые jp(ix) jp(iy)
которые очень удобно использовать как более быстрый переход в часто вызываемое место
тк быстрее jp на 2 такта
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)