Info Guide
#08
30 ноября 2005 |
|
For Coderz - Маленькие программерские хитрости.
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
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября