Нужен ассемблер с операциями "деление/остаток от деления" или "младший байт/старший байт слова".
Вид для печати
и код должен быть хитро выровнян :)Код: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
ксожалению фирменные игрописатели
восновном использует именно этот самый длинный из возможных вариантов... :v2_dizzy_facepalm:
- - - Добавлено - - -
а больше подробностей?
а так один вывод на ямаху столько сожрет
но можот можно как то извратится
с пропуском вывода
чтобы успевать в нужный битрейт
или накапливать данные для разового вывода
- - - Добавлено - - -
JV-Soft, если еще не придумано
предлагаю "рекомпилировать" вгм при инициализации
подменяя команды вгм-а на младший адрес обработчика
чтобы делать так
- - - Добавлено - - -Код:ld a,(de) ;7
ld l,a ;4
jp (hl) ;4
Вариант 2
по спецификации вгм-а что у меня перед глазами
команды начинаются с $4F
и если команды с $C0 не используються
то можно использовать команду как старший адрес для jp (hl)
включить вторую видео страницу освободив память по $4000
а через окно $С000 делать свои грязные дела :)
и думаю пропуск обновления регистров
должен прокатить
особенно частотных
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
...
если нужна сохранность hl
еще есть относительно быстрые jp(ix) jp(iy)
которые очень удобно использовать как более быстрый переход в часто вызываемое место
тк быстрее jp на 2 такта