![]() |
|
:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №27 (05.08.2006) Просмотров: 4495
Рубрика: Этюды. Номер: №27 (05.08.2006). ЭтюдыВладислав Ювженко, г. Красноярск№ 1. Быстрая переброска байт между страницами. На входе: HL - адрес «откуда» DE - адрес «куда» BC - какие страницы переключать A - сколько байт перебросить. Например, необходимо перебросить блок размером 6144 байта, тогда A = 12. Вычисляется по Формуле: 6144/2/256. Можно перебрасывать только «круглые» и четные числа. ;41 байт
EXX
LD B,A
LD C,0
EXX
LD A,B
EX AF,AF
LD A,C
LD BC,#7ffd
DI
LD (stak+1),SP
LD SP,HL
EX DE,HL
EXX
EXX
EX AF,AF
OUT (C),A
EX AF,AF
POP DE
OUT (C),A
LD (HL),E
INC HL
LD (HL),D
INC HL
EXX
DEC C
JR NZ,$-14
DJNZ $-16
stak LD SP,0
EI№ 2. Обмен байтами между страницами. На входе: HL - откуда DE - страницы BC - куда A - сколько (только «круглые» числа) ;35 байт.
PUSH BC
EXX
POP HL
LD B,A
LD C,0
EXX
LD BC,#7ffd
OUT (C),D
EXX
EXX
LD A,(HL)
EX AF,AF
OUT (C),E
EXX
LD A,(HL)
EX AF,AF
LD (HL),A
INC HL
EXX
OUT (C),D
EX AF,AF
LD (HL),A
INC HL
EXX
DEC C
JR NZ,$-18
DJNZ $-20№ 3. Быстрая печать текста на 32 символа в строке. На входе: DE - куда печатать (адрес экрана) BC - адрес текста (конец 0) ;49 байт
DI
LD (stk+1),SP
print LD A,(BC)
OR A
JR Z,stk
LD L,A
ADD HL,HL
LD H,15
ADD HL,HL
ADD HL,HL
LD SP,HL
EX DE,HL
!ASSM 4
POP DE
LD (HL),E
INC H
LD (HL),D
INC H
!CONT
ORG $-1
EX DE,HL
LD A,D
SUB 7
LD D,A
INC BC
INC E
JR print
stk LD SP,0
EI№ 4. Процедура предназначена для распаковки картинок формата multi studio 2. 1 (с расширением «p») в более приемлемый вид. На авторство я не претендую, процедуру написал Disabler/OHG/DPL, но я неплохо ее оптимизировал. ;44 байта.
LD HL,адрес
пакованной
картинки
LD B,L
EXX
LD HL, куда распаковывать (буфер размером 12288 байт (3 RGB спрайта размером 4096 байт.)
LD C,6
mu02 PUSH HL
LD B,8
mu03 EXX
DEC B
INC B
JR NZ,mu04
LD A,(HL)
CP 154
INC HL
JR NZ,mu05
LD C,(HL)
INC HL
LD B,(HL)
INC HL
mu04 DEC B
LD A,C
mu05 EXX
LD (HL),A
INC H
DJNZ mu03
LD D,H
POP HL
INC L
JR NZ,mu02
LD H,D
DEC C
JR NZ,mu02* * * Максим Торгунаков (TMA), г. Красноярск № 1. Обмен байтов между областями памяти. Без учета страниц. На входе: HL - откуда DE - куда BC - сколько ;9 байт.
LD A,(DE)
LDI
DEC HL
LD (HL),A
INC HL
JP PE,$-6№ 2. Заполнение памяти, произвольным байтом. На входе: DE - адрес конца области + 1 B - длинна области*256 C - байт заполнения ;144 байта.
DI
LD HL,0
ADD HL,SP
EX DE,HL
LD SP,HL
EX DE,HL
LD D,C
LD E,C
!ASSM 128
PUSH DE
!CONT
DEC B
JP NZ,$-129
LD SP,HL
EI№ 3. Генератор случайных чисел. На один байт больше чем в «Абзаце» #26 и медленнее работает, зато лучше «перемешивает». ;11 байт
rnd LD A,53
ADD A,A
JR NC,$+5
LD C,51
XOR C
LD (rnd+1),A№ 4. Быстрое рисование окружности. Сначала декранч. LD HL, адрес килобайтной таблички.
LD DE,#57e0
LD BC,#80
l0 LD (HL),E
INC H
LD (HL),D
DEC H
LD A,D
DEC D
AND 7
JR NZ,l1
LD A,E
ADD A,#e0
LD E,A
SBC A,A
AND 8
ADD A,D
LD D,A
l1 INC L
LD A,L
XOR #c0
JR NZ,l0
l2 LD (HL),A
INC H
LD (HL),A
DEC H
INC L
JR NZ,l2
INC H
INC H
l3 LD (HL),A
INC H
LD (HL),C
RRC C
ADC A,B
DEC H
INC L
JR NZ,l3Сама процедура. На входе: HL - координаты Y,X A - радиус (нельзя задавать 0) EXX
LD B,#60
EXX
LD B,A
LD C,0
RRA
loop EX AF,AF
LD A,H
ADD A,B
JR C,skip0
CP #c0
JR NC,skip0
LD LX,A
LD A,L
ADD A,C
CALL NC,plot
LD A,L
SUB C
CALL NC,plot
skip0 LD A,H
SUB B
JR C,skip1
LD LX,A
LD A,L
ADD A,C
CALL NC,plot
LD A,L
SUB C
CALL NC,plot
skip1 LD A,H
ADD A,C
JR C,skip2
CP #c0
JR NC,skip2
LD LX,A
LD A,L
ADD A,B
CALL NC,plot
LD A,L
SUB B
CALL NC,plot
skip2 LD A,H
SUB C
JR C,skip3
LD LX,A
LD A,L
ADD A,B
CALL NC,plot
LD A,L
SUB B
CALL NC,plot
skip3 EX AF,AF
INC C
SUB C
JR NC,loop
DEC B
ADD A,B
EX AF,AF
LD A,B
CP C
JR NC,loop+1
RET
plot EXX
LD E,A
LD D,LX
LD H,B
LD L,D
LD A,(HL)
INC H
LD D,(HL)
INC H
LD L,E
OR (HL)
LD E,A
INC H
LD A,(DE)
OR (HL)
LD (DE),A
EXX
RETСовокупный размер декранча и процедуры 166 байт. * * * ;by Axor
;HL=HL*128, 35 тактов
LD A,L
RRC H
RRA
LD H,A
LD L,0
RR L |