Info Guide #08
30 ноября 2005

For Coderz - Маленькие программерские хитрости.

<b>For Coderz</b> - Маленькие программерские хитрости.
   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 



Другие статьи номера:

Inferno - Авторы журнала.

Inferno - Вступление от редактора.

Inferno - Ошибки в предыдущих номерах.

Inferno - Об оболочке.

Железо - CD-ROM - устройство и хитрости подключения.

For Coderz - CD video на ZX. Как написать плеер видео с компакт-диска.

Sofтинка - Техническое руководство по дисковой системе DISCiPLE/+D.

For Coderz - Маленькие программерские хитрости.

Математика - История решения теоремы Ферма.

Gameland - Игра Шестнашки.

Sofтинка - Описания и история изменений программы для работы с жестким диском HDDoctor v0.9.

Секреты - Секретные кнопки в разных приложениях: Wolfenstein'2004, IG#5, ACEdit, DNA OS, Wild Disk Copier.

Sofтинка - Улучшения конвертора графики в Gigascreen.

Звук - Ламповые усилители. Стерео лампочник 2х5 Вт из старых телевизоров.

Железо - Обзор кассетных проигрывателей.

Inferno - Письма в редакцию.

Gamedev - История создания игры Pang.

Gamedev - Советы при написании аркадной игры.

Реклама - Реклама от Романа Чунина.

Реклама - Реклама от Алексея Жабина.

Реклама - Реклама от В. Богдановича.

Интервью - Интервью с Николаем Родионовым, автором известных книг для ZX Spectrum

For Coderz - Вычисление тригонометрических и алгебраических функций в языках высокого уровня.

DIY - схема 16-цветного видео-режим v1.1 для пентагона.

Железо - Описание микросхемы К555ТЛ2.

For Coderz - Программирование устройства генерации звука Turbo Sound.

Sofтинка - 384x304 viewer. программа позволяющая просматривать цветные картинки, по размерам превышающие экран.

Sofтинка - Эмулятор ZX Spectrum на ZX Spectrum.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Вступление - Приветствия и вступительное слово.
Вступление - содержание номера.
Marsms - Компиляции: Космополит, Земляне, Онанизм, О, Vel, любимый, Чистота.
Горшырзы - повествование о том, где вы никогда не захотели оказаться, но другие вас там очень хотели бы видеть.
Советы - Терминатор 1.

В этот день...   21 ноября