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'е выравнивание на ближайший вперёд#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
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября