Info Guide #12
31 декабря 2017

Код - этюды: вызов процедур по списку адресов.

           Этюды
                    1.
              (от Screw'а)
   Обвязка  для  вызова шитого кода (вызов
процедур  по списку адресов) без использо─
вания стека:
     LD E,(HL)
     INC L
     LD D,(HL)
     INC L
     EX DE,HL
     JP (HL)
   Предполагается, что  каждая  вызываемая
процедура сделаетEX DE,HL ,когда ей удоб─
но.
   Если можно использовать стек, то доста─
точно RET или (если процедуры сами перес─
тавляют стек)LD SP,HL:INC L,L:RET либо LD
SP,HL:INC H:RET  при "вертикальном" распо─
ложении  шитого кода. Если жеHL занят, то
можноLD IX,next:JP patched_addr:next.

                    2.
               (от JtN'а)
   Как проинвертировать на Бейсике1 бит в
8-битной переменной:
     POKE 16384,s
     PLOT OVER 1;q,175
     LET s=PEEK 16384
   А  чтобы взять старший или младший байт
двухбайтного  числа n, достаточно сделать
RANDOMIZE n  и читатьPEEK 23670 (младший) 
и23671 (старший). А через  RANDOMIZE N*8:
... PEEK 23670/8  можно сделать отбрасыва─
ние трёх старших битов - полезно при опро─
се клавиатуры.

                    3.
                (от LVD)
   Если у вас переменные сохраняются в ко─
де, а их начальные значения не важны, то:
     LD BC,#0101
     LD DE,#1111
     LD HL,#2121
пакуются лучше, чем
     LD BC,0
     LD DE,0
     LD HL,0
   Это  можно  распространить и наLD r,n,
SUB n, CP n, и в каком ещё виде бывают ин─
лайновые переменные.

                    4.
              (от Fyrex'а)
   Как сделать цикл с 16-битным счётчиком?
Обычно делают так:
     DEC BC
     LD A,B
     OR C
     JP NZ,loop
(6 байт, 24 такта)
   А вот код из старых игр,выходит по255:
     DEC BC
     INC B
     DJNZ loop
(4 байта, 23 такта)
   Если есть лишняя регистровая пара:
     ADD HL,DE;-1
     JP C,loop
(4 байта, 21 такт)
   Если  не важна неравномерность скорости
(но  начальное  содержимое  счётчика  надо
подготовить):
     DJNZ loop
     DEC C
     JR NZ,loop
(5 байт, в среднем 13 тактов с копейками)
   Если одновременно надо инкрементировать
(или декрементировать)HL:
     CPI(или CPD)
     JP PE,loop
(5 байт, 26 тактов с экономией INC/DEC HL)

                    5.
           (от Alone Coder'а)
  DS .(#E0-$) - в ALASM'е выравнивание на
ближайший вперёд#XXE0. В других ассембле─
рах  вместо  точки можно использовать&255
или встроенные функции ассемблера.
  DS -$&mask - аналогALIGN mask+1 (алас─
мовский вариант дляALIGN 256:DS .(-$) )

                    6.
                (от LVD)
   Сложение двух знаковых 8-битных чисел:
     ADD A,...
     RLCA
     RRCA
     JP PO,$+4;PE=переполнение
     CCF
;CY=9-й бит результата 
   Дальше можно сделатьRRA, чтобы привес─
ти  число  к обычному 8-битовому знаковому
виду делением на2.
   Абсолютную величину знакового 8-битного
числа можно вычислить так:
     XOR A
     SUB H
     RET P
     LD A,H
     RET




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

Похожие статьи:
Рецензии - рецензия на игру "Тайны Капитана Шелтона".
Наши новости - Полная версия "Черного ворона".
Новости - пару новостишек из Сибири: Kas29 готов представить миру свою новую игру, Buddy чинит свою крышу и совсем забил на Спек, NOT-Soft вся банда занята подготовкой к CSP.

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