1. Составление таблицы по адресу HL'
При составлении таблицы по адресу HL'
вместо конструкции
PUSH DE
EXX
POP DE
LD (HL),E
INC HL
LD (HL),D
(45 тактов)
можно использовать
LD A,D
EXA
LD A,E
EXX
LD (HL),A
INC HL
EXA
LD (HL),A
(40 тактов)
Замечено при написании спрайтового дви─
жка для Pang 16C.
2. Смена регистра буквы
Используется в ACEdit во время ввода
символа (если включен Caps Lock ).
RECAP CP "Є
RET NC
XOR 1
CP "Ё
RET NC
XOR 1
CP "р
JNC BECAPRL
CP "░
RET NC
CP "а
JNC BECAPOK
CP "Р
JNC BECAPRL
CP "А
JNC BECAPOK
CP "@
RET Z
CP "_
RET Z
CP "A
RET C
CP "{
RET NC
CP "[
JC $+5
CP "a
RET C
BECAPOK XOR 80
BECAPRL XOR #70
RET
3. Как считать такты
Если нужно быстро выяснить, сколько в
процедуре тактов, вовсе не нужно брать ка─
лькулятор и складывать такты команд сверху
вниз. Я пользуюсь более удобным способом:
Считаем количество команд с 4 тактами
(команды с 8 тактами считаем за две, кома─
нды с 12 тактами - за три, команды с 11
тактами считаем за 4-тактовые).Умножаем на
4. Записываем (или запоминаем).
Считаем количество команд с 7 тактами
(команды с 11 тактами тоже считаем). Умно─
жаем на 7. Записываем (или запоминаем).
Считаем количество команд с 10 тактами.
Умножаем на 10.
Считаем кол-во команд с 6 тактами (если
есть). Умножаем на 6.
Остальные команды можно посчитать отде─
льно.
Всё складываем и получаем результат.Для
маленьких процедурок легко посчитать в
уме почти без шансов ошибиться.
Если программа большая, то можно идти
сверху вниз и ставить палочки на бумаге
(строчка палочек - 4-тактовых команд,стро─
чка 7-тактовых и т.д.). Но это уже похоже
на сплошной подсчёт. Для последнего, чтобы
минимизировать ошибки, считайте два раза:
сверху вниз и снизу вверх. Удобно ещё под─
писывать промежуточные суммы (см. пример в
следующем этюде).
Если в процедуре используются ветки та─
кого типа:
JR cc,skip
<команды>
skip
то надо действовать следующим образом:
Если нам нужно максимальное число так─
тов,то считаем JR за 7 тактов и не пропус─
каем ни одной команды (но для одной 4-так─
товой команды максимум будет всё-таки JR =
= 12 тактов).
Если нам нужно среднее число тактов, а
вероятность выполнения условия равна 50%,
то считаем JR за 9.5 тактов, а время выпо─
лнения внутренних <команд> делим на 2.
Если используется полная альтернатива
(две ветки), то отдельно считаем время вы─
полнения каждой ветки.
4. Микротоны
Пересчёт нот с микротонами в период AY
удобнее всего производить по следующей фо─
рмуле: t=f(xhi)*k(xlo), где xhi=нота, xlo=
=микротон,а f() и k() - некоторые функции.
f представляет из себя таблицу FRQTAB,
которую желательно вычислить на основе та─
блицы Sound Tracker (точнее, на основе па─
раметров, по которым построена таблица ST,
т.к.в таблице ST есть ошибки). Формула для
f приблизительно следующая: f=fST*248/256.
Ноты в таблице идут от высоких к низким.
k для 16 микротонов (1/32 тона) держит─
ся в пределах 1+((0..14)/256) и примерно
равно 1+(xlo/256). Поскольку 1+(16/256) <
< 2^(1/12), то перескока 15-го микротона
за следующую ноту не будет (но они будут
очень близко,что даёт некоторую неравноме─
рность, заметную на слух).
EXPER
;было: DE=%0nnnnnnnmmmm0000
;стало:HL=период для AY
;----------------------
;BC=f(xhi)
LD L,D ;%0nnnnnnn
SLA L
LD H,'FRQTAB
LD C,(HL)
INC L
LD B,(HL) ;%0000xxxx
;37
;----------------------
;+BC*xlo/256
LD L,0 ;нельзя правильно округлять
LD H,E ;%mmmm0000
SLA H
;56
JR NC,$+3 ; ^
ADD HL,BC ;
ADD HL,HL ;
JR NC,$+3 ; MAX 105
ADD HL,BC ;
ADD HL,HL ;
JR NC,$+3 ;
ADD HL,BC ;
ADD HL,HL ;
JR NC,$+3 ;
ADD HL,BC ; v
;161
;теперь H надо прибавить к BC
LD A,C
ADD A,H
LD L,A
ADC A,B
SUB L
LD H,A
;185
RET
Второе приближение k (нужное для 64 или
256 микротонов) можно найти, опять анали─
зируя таблицу частот.Находим,что множитель
при xlo в случае 256 микротонов от центра:
(2^(1/24)-1)/128=0.0002289 ў15/65536 почти
точно! Впрочем,мы прибавляем не от центра,
взамен у нас (напомню) таблица сдвинута
относительно Sound Tracker.
Для этой процедуры данные крайних октав
( 2 сверху, 2 снизу) в таблице FRQTAB дол─
жны быть пересчитаны на 2 октавы ближе к
центру, иначе для высоких недостижима нуж─
ная точность, а для низких при умножении
будет переполнение!
EXP256
;было: DE=%0nnnnnnnmmmmmm00
;стало:HL=период для AY
;----------------------
;BC=f(xhi)
LD L,D ;%0nnnnnnn
SLA L
LD H,'FRQTAB
LD C,(HL) ;%llllllll
INC L
LD B,(HL) ;%0000hhhh
;37
;----------------------
;DE=g(xlo)
;g(xlo)~=xlo*15.22/16
LD A,E
RRA
RRA
RRA
RRA
AND #C
SUB E
NEG
ADD A,A
LD H,A
LD L,128>6
;91
;----------------------
;+BC*g(xlo)/65536
JR NC,$+3 ; MAX 18
ADD HL,BC ;
DUP 5
ADD HL,HL ;
JR NC,$+3 ; MAX 145
ADD HL,BC ;
EDUP
;254
SRL H
RR L
SRL H
;278
;теперь H надо прибавить к BC
LD A,H
ADD A,C
LD L,A
ADC A,B
SUB L
LD H,A
;302
LD A,D
CP 2*12
JR NC,E256N3L
;2 верхние октавы
;сдвиг HL на 2 бита вправо
SRL H
RR L
SRL H
RR L
;MAX 352
RET
E256N3L
CP 6*12
RET C
;2 нижние октавы
;сдвиг HL на 2 бита влево
ADD HL,HL
ADD HL,HL
RET
Полную программу с таблицей и генерато─
ром таблицы ищите в приложении.
5. Диск B
Со сменой версии аласма (текущая -
5.03) появилась одна очень полезная хитро─
сть, позволяющая сэкономить место на рабо─
чей дискете с исходниками.Реализация кома─
нды MOVE в ассемблере хоть и уменьшила те─
сноту,но недостаточно; теперь организована
дополнительная экономия.
Суть в следующем: предполагается, что
при запуске компьютера или эмулятора в ди─
сковод B засунут "системный диск". Автома─
тическое втыкание этого диска при запуске
Unreal Speccy можно реализовать через .bat
или через смену командной строки в обрабо─
тчиках типов файлов. Последнее можно сде─
лать либо ручками - через Проводник, либо
через Total Commander, либо создав и запу─
стив reg-файл соответствующего вида. В об─
щем, выбор есть.
Итак, на "системном диске" следует раз─
местить:
ACEdit
BGE
PT3+PT Util
ALASM+STS
HRUST1
ZXRar+ZXUnRar
PUSHER
Laser Compact
а также следующие стандартные файлы:
mrip*.H - автосборщик медленный
m2hr*.H - автосборщик быстрый
SAVEOBJ*.H - сохранялка кусков памяти
smallunr.H - распаковщик ZXRar
DEHRUST.C - распаковщик HRUST1
playFAST.H - проигрыватель PT3
и что-нибудь ещё по вашему вкусу.
Что мы получили? А получили мы то,что с
рабочей дискеты теперь можно всё это сте─
реть! От аласма остаётся только загрузчик
размером в один сектор!
Грузить файлы с диска B нужно директи─
вами (привожу примеры):
INCLUDE "B:mrip*"
INCBIN "B:DEHRUST"
А оставшиеся системные программы можно
очень быстро и удобно запускать прямо из
Mr Gluk Reset Service.
К сожалению, такая полезная программа,
как SCUT, не умеет переключать дисководы,
поэтому её нельзя записать на "системный
диск". Будем ждать, когда появится её ана─
лог.
Alone Coder