Info Guide #11
05 июля 2015

Code - Этюды: Вызов функции по номеру, Поиск текста по номеру, Определение наличия музыкального сопроцессора, Установка пикселя на ATM Turbo 2, Библиотеки процедур в ALASM, Короткий генератор случайных чисел, Ускорение LD:PUSH.

           Этюды
Alone Coder 

        1. Вызов функции по номеру

 а)если номера идут не подряд:

;HL=список функций 
   ;(номер, смещение адреса),
   ;0=конец списка, т.е. функции 0 нет
;C=номер функции 
#1624
   CALL #16DC
   RET NC;функция не найдена
   LD D,0
   LD E,(HL);смещение адреса функции
   ADD HL,DE
   JP (HL)
   ...
#16DB
   INC HL
#16DC
   LD A,(HL)
   AND A
   RET Z;конец списка,функция не найдена
   CP C
   INC HL
   JR NZ,#16DB
   SCF
   RET

;пример списка функций: 
   DB 1
   DB 255&(func1-$)
   DB 10
   DB 255&(func10-$)
   DB 0;конец списка
;сами функции рядом: 
func1
   ...
   RET
func10
   ...
   RET

 б)если номера функций идут подряд (1,2,
...): 

;B=номер функции 
   DJNZ nofunc1
   <func1>
   RET
nofunc1
   DJNZ nofunc2
   <func2>
   RET
nofunc2
   ...
;у последней функции номер не проверяется 
;(может быть 0) 
   <func0>
   RET


             2. Поиск текста
     (например, сообщения) по номеру

 а)вариант из ACEdit:

;HL=указатель на список текстов 
   ;(каждый текст кончается на 0) 
;D=номер текста (1..n) 
;возвращает HL = указатель на нужный текст 
   LD B,H;достаточно большое число
   XOR A;символ конца текста
   DEC D
   RET Z
   CPIR;ищем символ конца текста
         ;и ставим HL после него
   JR $-4

 б)вариант в ПЗУ 48 Basic
(только для ASCII, т.к. 7-й бит занят под
признак конца текста):

;DE=указатель на список текстов 
   ;(каждый с установленным 7-м битом
   ;в последнем символе)
;A=номер текста (0..n) 
;возвращает DE = указатель на нужный текст 
#0C41
   PUSH AF
   EX DE,HL
   INC A
#0C44
   BIT 7,(HL)
   INC HL
   JR Z,#0C44
   DEC A
   JR NZ,#0C44
   EX DE,HL
   POP AF
   cp #20   ;это
   ret c    ;для
   ld a,(de);нас
   sub #41  ;не важно
   RET

;пример списка текстов: 
#0095
   DB #BF   ;любой байт с установленным
              ;7-м битом (будет пропущен)
   DB "RN","D"+#80
   DB "INKEY","$"+#80
   ...


          3. Определение наличия
        музыкального сопроцессора

   LD BC,#FFFD
   XOR A;A=0/2/4/7/11 (полные 8-битные)
   OUT (C),A;избегаем OUT (C),0
   IN L,(C);oldR0
   INC L
   LD B,#BF
   OUT (C),L;newR0 != oldR0
;читать R0 и проверить, изменился ли он 
   LD B,#FF;#fdfd нельзя на ATM1
   IN A,(C);R0
   CP L;newR0
   JR Z,AY_ON;R0 == newR0
AY_OFF

   Кто придумает короче без потери совмес─
тимости?


           4. Установка пикселя
      в режиме 320x200 на ATM Turbo 2

   Поскольку  X-координата не помещается в
одном байте, отрежем младший бит в отдель─
ный регистр.

;setpixel (EGA screen) 
;страницы экрана - в двух окнах памяти 
;addr = tY(y) + tX(x) 
;l=x 
;e=y 
;lx=xlow mask 
;d='tY 
;h='tX 
   LD A,(DE);(y*40)
   ADD A,(HL);x div 4
    LD C,A
   INC D
   INC H
   LD A,(DE);'(y*40)
   ADC A,(HL);f(x mod 4)
    LD B,A
   LD A,(BC)
  (X)OR LX;xlow mask
   LD (BC),A
   DEC D
   INC H
;74(66) t-states 
(ср.62(58) такта на 6912, см. ZX-Guide #1)

   Таблицы подготавливаются так:

   LD HL,#4000;экран в #4000 и #c000
   LD BC,40
   LD E,B
mkty0
   LD D,'tY
   LD A,L
   LD (DE),A
   INC D
   LD A,H
   LD (DE),A
   ADD HL,BC
   INC E
   JNZ mkty0
mktx0
   LD D,'tX
   LD A,E
   RRA
   RRA
   AND #3F
   LD (DE),A
   INC D
   LD A,E
   RRCA
   AND #80
   BIT 2,E
   JZ $+4
   OR #20
   LD (DE),A;#00,#80,#20,#a0
   INC E
   JNZ mktx0

   В Nedodemo 2 использовался вариант это─
го метода приX=0..255:

;l=x 
;e=y 
;d='tY 
   LD H,'tX
   LD A,(DE);(y*40)
   ADD A,(HL);x div 4
    LD C,A
   INC D
   INC H
   LD A,(DE);'(y*40)
   ADC A,(HL);f(x mod 4)
          ;#00,#00,#80,#80,#20,#20,#a0,#a0
    LD B,A
   INC H;'tXmask
   LD A,(BC)
  (X)OR (HL);xlow mask
   LD (BC),A
   DEC D
;80(76) t-states 

   В  генераторе таблиц надо добавить тре─
тийRRA, второй RRCA, заменить #3F  на #1F
и вставить передLD (DE),A:
   INC D
   LD A,E
   RRA
   SBC A,A
   XOR %01000111;left pixel
   AND C


      5. Библиотеки процедур в ALASM

   Если  надо сделать библиотеку процедур,
каждая  из  которых  будет компилироваться
только тогда,когда используется в програм─
ме, то можно пойти такими путями:

 а)создать макросы на каждую процедуру:

    INCLUDE "math",pgmath
...
MUL _MUL
DIV _DIV

math.h:
   MACRO _MUL
;процедура умножения 
   RET
   ENDM

   MACRO _DIV
;процедура деления 
   RET
   ENDM

 б)один и тот же модуль инклюдить неско─
лько раз - по одному для каждой процедуры. 
Это  эффективнее  по  памяти, чем  макросы 
(где  может  просто переполниться страница 
макросов), но скорость не гарантируется: 

    ...
MUL INCLUDE "math",pgmath
DIV INCLUDE "math",pgmath
    ...

math.H:
   IFN ?mathtwice
const1=1
const2=2
   ...
   MACRO mathbla
   ...
   ENDM
mathtwice
   ENDIF

   IF0 ?MUL;если метка определена
   IFN ?MULcompiled
;процедура умножения 
   RET
MULcompiled
   ENDIF
   ENDIF

   IF0 ?DIV;если метка определена
   IFN ?DIVcompiled
;процедура деления 
   RET
DIVcompiled
   ENDIF
   ENDIF

 в)инклюдить все библиотеки в самом кон─
це, чтобы  они сами могли проверять, какие 
процедуры используются, какие нет: 
 
    ...
    CALL MUL
    CALL DIV
    ...
    INCLUDE "math",pgmath

math.h:
   IFN ?MUL;если к метке обращались
MUL
;процедура умножения 
   RET
   ENDIF

   IFN ?DIV;если к метке обращались
DIV
;процедура деления 
   RET
   ENDIF


   6. Короткий генератор случайных чисел
              (прислал Tiboh)

   EXX
   INC HL
   RES 3,H
   LD A,R
   XOR (HL)
   EXX


           7. Ускорение LD:PUSH

   Обычный код вывода на экран типаLD DE:
PUSH DE неудачно ложится на задержки в фи─
рменных машинах (4 восьмитактовых цикла).
   Если  же  есть свободный регистрBC, то
можно выиграть в скорости, переписав так:

   LD BC,nn
   LD DE,nn
   PUSH BC
   PUSH DE

   Это занимает 7 восьмитактовых циклов,то
есть 3.5 на каждыйPUSH.
   Добавление регистраHL в общем невыгод─
но (11 восьмитактовых циклов на триPUSH),
но  если постараться загнать группуPUSH в
поле бордера, можно чего-то добиться.



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

Об оболочке - журнал состоит из разделов, а разделы из статей.

От авторов - предисловие: Прошло 8 лет с момента выхода прошлого номера Info Guide. Что изменилось на Спектруме за это время?

Комьюнити - Spectrum в глубинке: в городе, население которого не превышает 15 тысяч человек, появление компьютера было сравнимо с изготовлением атомной бомбы в гараже.

Комьюнити - Forever 2015: отчет с демопати для всех 8-битных компьютеров.

Комьюнити - DiHalt 2015: отзывы от Lilka и Louisa.

Комьюнити - Как это было в Бразилии: история развития Спектрума в Бразилии от Paulo Silva.

Комьюнити - Беседа с Tiboh/Debris - программистом из Красноярска, долгие годы занимавшимся обработкой архивов спектрумовских программ.

Комьюнити - интервью с Raver/Phantasy взятое на irc.forestnet.org

Code - Этюды: Вызов функции по номеру, Поиск текста по номеру, Определение наличия музыкального сопроцессора, Установка пикселя на ATM Turbo 2, Библиотеки процедур в ALASM, Короткий генератор случайных чисел, Ускорение LD:PUSH.

Code - точка зрения: проекция пространства на экран из одной точки.

Code - чанковый эффект: Magnets stretching

Code - О мерцающем бордере: использование мерцание для повышения разрешения на бордере.

Code - Скриптование в демо: синхронизация эффектов под музыку и не только.

Графика - режиссура в демо: палитра изобразительных средств в Демомейкинге.

Графика - Мини-опрос художников: Dimidrol, Einar Saukas, Sand, Rion, riskej.

Графика - интервью с художником RayNoa/MAYhEM.

Музыка - Синхронизация музыки: nq рассказывает о создании треков под таймлайн.

Музыка - Беседа с MmcM/Sage group, известным AY-музыкантом, о его знаменитой технике.

Музыка - Беседа с Manwe/SandS - известным композитором, одним из старейших демосценеров России.

Музыка - Однобитная музыка: почему бипер ZX Spectrum продолжает вызывать восхищение?

Музыка - Горизонты турбосаунда: Cj Splinter делится опытом работы с TurboSound.

Музыка - Снова о плейерах Pro Tracker 3.x

Музыка - Музыкальный движок Muse 128b.

Системки - Как приручить IAR C Compiler.

Системки - Оберон для ZX Spectrum: Тонкости при разработке на Обероне в среде ZXDev (часть 1).

Системки - Оберон и ассемблер: Сопряжение с ассемблером (часть 2).

Системки - ZX-Basic Compiler: расширяемый кросс-компилятор.

Системки - Программы с поддержкой HDD, или "Linux" для Спектрума с винтом (или SD-картой).

Системки - iS-DOS/TASiS: о базовых принципах программирования под ОС iS-DOS/TASiS (часть 1).

Системки - iS-DOS/TASiS: как писать игры под iS-DOS/TASiS (часть 2).

Системки - iS-DOS/TASiS: Работа с палитрой и переключение графических режимов в TASiS (часть 3).

Металлолом - о строении экрана 6912 с аппаратной точки зрения.

Металлолом - Палитра для ZX Spectrum в различных графических режимах.

Металлолом - Эмуляция контроллера дисковода 1818ВГ93.

Дикий ум - Генерация и оптимизация кода в компилятора (часть 1)

Дикий ум - Генерация и оптимизация кода в компилятора (часть 2).

Дикий ум - ловля багов: самые типичные ошибки, при разработке на ассемблере Z80 (часть 1).

Дикий ум - ловля багов: самые типичные ошибки, при разработке на ассемблере Z80 (часть 2).

Дикий ум - алгоритм сжатия видео - 16 цветов на точку.

Игрушки - Разработка игр на Evo SDK (часть 1).

Игрушки - Разработка игр на Evo SDK (часть 2).

Игрушки - секрет успеха игры Jet Set Willy выпущенной в 1984 году.

Игрушки - Metal Man Reloaded: История создания от Oleg Origin.

Игрушки - Строение скриптового движка игры на примере L7 script engine.

Мыльница - Секретные кнопки в играх: Project ROBO, Ninjajar!, Uwol, Quest for Money, Zooming Secretary, Game About Squares.

Мыльница - письма: Kq, elfh, mig'95, wbr^NOT-Soft.

Мыльница - errata: Работа над ошибками.

Мыльница - об авторах журнала.


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

Похожие статьи:
News - рассказ Werewolves'a о поездках по стране
Разное - Дилерская_сеть.
Мнение - lzb/j77: "Я и тут молчать не буду!"

В этот день...   19 июля