Этюды
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'е выравнивание на
ближайший вперёд#XXEO. В других ассембле─
рах вместо точки можно использовать&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
Other articles: