PDA

Просмотр полной версии : ЭТЮДЫ



Страницы : 1 2 [3] 4 5

denpopov
06.11.2014, 04:43
Да чо ААА? он математиком обзовет, или как то еще...Надо попробовать эмулятор, наверное..

Про быстрое умножение речь уже шла, вот реализация на 6502:
http://atariage.com/forums/topic/78839-russian-multiplication/

оччень интересно.

denpopov
09.11.2014, 18:12
товарищи-кодеры, подскажите идею ГСЧ в диапазоне 0-320.

Reobne
09.11.2014, 18:45
товарищи-кодеры, подскажите идею ГСЧ в диапазоне 0-320.
Идея проста: генерируем СЧ (0-NN), умножаем на 320, делим на NN.

denpopov
09.11.2014, 18:53
Идея проста: генерируем СЧ (0-NN), умножаем на 320, делим на NN.

я слышал другое - RND() mod 320. Вернее, 319, я ошибся. просто выходит это медленно..

Reobne
09.11.2014, 18:57
Попробуй мою идею. Умножение на константу, в которой всего 2-3 бита установлены, деление на степень двойки - это быстро, сам понимаешь.

denpopov
09.11.2014, 19:19
Умножение на константу

Это непонятно.

denpopov
09.11.2014, 19:33
мда.."кипит мой разум возмущенный". попробую.

Reobne
09.11.2014, 19:42
Можно быстрее и грубее, если нужно быстрее.
В конце концов можно забить страничку заранее подготовленными значениями. И даже не брать их случайно, а подряд. Тогда будет вообще быстро. :)

denpopov
09.11.2014, 19:43
Последний раз редактировалось krt17; 09.11.2014 в 19:34. Причина: чутка побыстрее

по-моему не быстрее

---------- Post added at 19:43 ---------- Previous post was at 19:42 ----------


В конце концов можно забить страничку заранее подготовленными значениями. И даже не брать их случайно, а подряд. Тогда будет вообще быстро.

подряд не катит..

Reobne
09.11.2014, 19:54
Вот придумал вариант кода. Вход HL=RND (используем 14 младших бит). Выход (C)H=RND(0-319)


ld c,l
ld a,h
and #3f
ld b,a
add hl,hl
add hl,hl
add hl,bc

denpopov
09.11.2014, 19:54
вот что родилось, пока пыхтел:



new_r
call random;x=random(x-1)+1
ld l,a
call random
ld h,a

find_r
push hl
ld de,319
or a
sbc hl,de
pop hl
jr c,got_r
or a
sbc hl,de
jr find_r
got_r
ex de,hl

Reobne
09.11.2014, 20:01
Оптимизирую твою идею :)


new_r
call random;x=random(x-1)+1
ld l,a
call random
OR #f0 ; Это чтобы быстрее приехать
ld h,a

ld de,320
find_r
ADD HL,DE
JP NC,find_r

ex de,hl

denpopov
09.11.2014, 20:21
хехе, как допилю основу, придется тест алгоритмов проводить..

---------- Post added at 20:15 ---------- Previous post was at 20:13 ----------


я так понимаю random дает a=rnd(0-#ff) тоесть ряд 256 значений еще и подряд 2 раза тоесть 128 для 0-319 будет много
пустышек с малым периодом, довольно специфический рандом.

алгоритм старый, не могу найти, где я сравнивал с алгоритмом introspec'a. этот получше:)


random:
push bc
R1: LD C,#18
R2: LD A,#70
ADD A,C
LD C,A
LD (R1+1),A
R3: LD A,#FD
SUB C
LD C,A
LD(R2+1),A
RRCA
LD (R3+1),A
pop bc
RET


---------- Post added at 20:21 ---------- Previous post was at 20:15 ----------

вроде это:
http://zx-pk.ru/showpost.php?p=701098&postcount=36

denpopov
11.11.2014, 07:33
Мне одинаково подошли варианты krt17 и Reobne.
Спасибо за помощь.

rasmer
19.11.2014, 19:43
ну если интересно как в асме - инкбинишь кодовый блок, потом инкбинишь или инклюдишь или прописываешь напрямую кусок которым пропатчиваешь, потом также записываешь бинарник\хобету\снапшот....
sjasmplus по моему с этим удачно справится!

denpopov
20.11.2014, 20:05
глянул на процедуру умножения baze/au
http://baze.au.com/misc/z80bits.html#1.4

интересно, что умножение с учетом знака. А вот резульаьы теста просто странные:

ld bc,#FEFF; (-2)*(-1)=2
ld bc,#FE02;2*(-2)=$FC
ld bc,#7070; ?$70*$70=$3100
ld bc,$0F10;$F0

откуда выползло такое?

Titus
20.11.2014, 20:15
ld bc,#7070; ?$70*$70=$3100

откуда выползло такое?

Какое такое? Вообще-то $70 умножить на $70 и будет $3100

denpopov
20.11.2014, 20:32
Вообще-то $70 умножить на $70 и будет $3100

результат HL=$A200, bc=$3100

Titus
20.11.2014, 21:01
результат HL=$A200, bc=$3100

Такой результат не верен, разумеется)
Почему - не знаю, я эту процедурку не тестировал)

denpopov
21.11.2014, 06:09
Почему - не знаю, я эту процедурку не тестировал)

лучше б попробовал за время своих постов. всяко экономия:)

Reobne
21.11.2014, 07:24
Попробуй исправить
jp pe,Plus на jp p,Plus.
И результат - удвоенное произведение.

We could divide table entries by 2 instead but that causes loss of precision. То есть, можно элементы таблицы забить делёными на 2, тогда будет не удвоенное произведение, а нормальное, но потеряется немного точности.

---------- Post added at 11:24 ---------- Previous post was at 11:19 ----------

И когда пишешь пишешь про проблему, то описывай проблему, а не ограничивайся описанием того, как должно быть правильно. А то создаётся впечатление, что ты принимаешь правильное за неправильное, и конечно тестировать ничего уже не нужно.

denpopov
21.11.2014, 07:41
И когда пишешь пишешь про проблему, то описывай проблему, а не ограничивайся описанием того, как должно быть правильно.

кажется я жирным выделил неверный результат.

---------- Post added at 07:41 ---------- Previous post was at 07:39 ----------


jp pe,Plus на jp p,Plus.
И результат - удвоенное произведение.

да, получилось. удвоенного произведения я не заметил, ибо:

sra h ; uncomment to get real product
rr l

Reobne
21.11.2014, 07:44
кажется я жирным выделил неверный результат.
Там написано ?$70*$70=$3100 но оно так и есть, это верный результат.

denpopov
21.11.2014, 07:54
Там написано ?$70*$70=$3100 но оно так и есть, это верный результат.

заодно знак вопроса впереди. к черту эту риторику, сейчас заработало.

а теперь вопрос: как лучше выделить из HL при умножении?
т.е. L или H?

SAM style
23.11.2014, 11:55
Это не совсем удобно. В моем случае адрес начала кода известен и его не изменить. А делать CLEAR xxx-1 после каждой введенной строки, слишком муторно, лучше способ из книги как-то допонять/допилить.Какой адрес кода? Не надо делать CLEAR постоянно. Сделай один раз и забудь об этом, пока бейсику хватает места.

denpopov
01.12.2014, 07:39
Вычитал в древнем журнале заметку про вычисление pi=3.14159 с точностью до знака.

Помогите найти ошибку. код не ахти, конечно...

denpopov
01.12.2014, 16:34
Нашел ошибку - в ДНК процедуре деления. _div вроде как.
На Си все считается, но очень медленно.
может, из z88 что-то и выйдет...

Shadow Maker
01.12.2014, 17:04
А дайте короткую процедуру scr2attr?

SAM style
01.12.2014, 17:16
А дайте короткую процедуру scr2attr?HL(scr) -> HL(atr)

ld a,h
rra
rra
rra
and 3
or #58
ld h,a
ret

denpopov
09.12.2014, 14:51
Застрял над идеей, нужно построить табличку 32х24 примерно так:


03230
32123
03230


короче, вышел медленный *****код:(

любые идеи приветствуются.

Reobne
09.12.2014, 14:56
loop
REP 16
PUSH HL,DE
ENDREP
EXX
djnz loop

denpopov
09.12.2014, 15:24
и как из этого выйдет ромб?

Reobne
09.12.2014, 15:26
Ах тебе ромб нужен?
Тогда я тебя не понял. :)

denpopov
09.12.2014, 15:28
Ах тебе ромб нужен?
а из цифр неясно разве?

Reobne
09.12.2014, 15:30
Еденичка это центр? Тебе нужно со смещённым центром, или в центре квадратик 2х2?

---------- Post added at 19:30 ---------- Previous post was at 19:28 ----------


а из цифр неясно разве?
Неясно.
Я решил, что тебе нужны чередующиеся волны.
Ты хоть-бы свой *****код приложил, или цифр дал больше, с чётными размерами...

denpopov
09.12.2014, 15:38
Еденичка это центр? Тебе нужно со смещённым центром, или в центре квадратик 2х2?

центр - 1, строится нечто вроде ромба из цифр 2,3 и т.д. нужна табличка 32х24


Ты хоть-бы свой *****код приложил,
стесняюсь я:(

jerri
09.12.2014, 15:55
denpopov,
заполняешь массив 0
в нужное место втыкаешь 1

потом делаешь скан таблицы и если находишь N то по координатам nn-32,nn+32,nn-1,nn+1 втыкаешь N+1 (если там 0)
повторяешь пока не закончится место.

если хочешь сгенерить в процессе асемблирования то ест еще такой вариант

row=15

dup 12
count=row
dup 15
db count
count=count-1
edup

dup 17
db count
count=count+1
edup
row=row+1
edup

если нужно чтобы еще ромб был поровнее то надо с db что то делать
типа

db count*(count<15)

denpopov
09.12.2014, 15:57
потом делаешь скан таблицы и если находишь N то по координатам nn-32,nn+32,nn-1,nn+1 втыкаешь N+1 (если там 0)
повторяешь пока не закончится место.
в том то и дело, что слева картинка не похожа на ту, что справа.

jerri
09.12.2014, 17:31
в том то и дело, что слева картинка не похожа на ту, что справа.

шта?


03230
32123
03230


что тут слева не то что справа?
а так вокруг 1 ты расставляешь 2
вокруг 2 ты расставляешь 3

Reobne
09.12.2014, 17:47
Сделал за 5300 тактов. С помощью PUSH.

Код для EmuZWin:

org 30000
entrypoint $

DI
IM 0
LD HL,$4000
LD (HL),$FF
LD DE,$4001
LD BC,$17FF
LDIR

LD HL,$0001
LD DE,$0203
EXX
LD HL,$0100
LD DE,$0302
MAINLOOP
LD A,7
OUT ($FE),A
LD SP,$4000+$1800+$300
LD B,6
LOOP1
DUP 4
PUSH HL
PUSH DE
ENDDUP
EXX
INC SP
DUP 4
PUSH DE
PUSH HL
ENDDUP
PUSH DE
EXX
INC SP
LD A,L
PUSH AF
INC SP
DUP 4
PUSH DE
PUSH HL
ENDDUP
INC SP
EX DE,HL
EXX
DUP 4
PUSH DE
PUSH HL
ENDDUP
EX DE,HL
EXX
DJNZ LOOP1

LD B,6
LOOP2
DUP 4
PUSH DE
PUSH HL
ENDDUP
EXX
INC SP
DUP 4
PUSH HL
PUSH DE
ENDDUP
PUSH HL
EXX
INC SP
LD A,L
PUSH AF
INC SP
DUP 4
PUSH DE
PUSH HL
ENDDUP
INC SP
EX DE,HL
EXX
DUP 4
PUSH DE
PUSH HL
ENDDUP
EX DE,HL
EXX
DJNZ LOOP2

LD SP,$FFFF
LD A,0
OUT ($FE),A
EI
NOP
NOP
NOP
HALT
HALT
HALT
DI
INC H
RES 2,H
INC L
RES 2,L
INC D
RES 2,D
INC E
RES 2,E
EXX
INC H
RES 2,H
INC L
RES 2,L
INC D
RES 2,D
INC E
RES 2,E
EXX
JP MAINLOOP


denpopov, так ты хотел?

Reobne
09.12.2014, 17:54
Если на бордере не видно мерцания, говорящее о времени отрисовки, то надо включить в эмуляторе полный бордер, полоска довольно таки узкая.

denpopov
09.12.2014, 18:10
Собственно, есть один эффект в Dust/g0blinish, поэтому и нужна таблица.


что тут слева не то что справа?
а так вокруг 1 ты расставляешь 2
вокруг 2 ты расставляешь 3

в центре 1, вокруг него ромб из 2ек, потом ромб из троек и т.д.

получилось вот что. в сырке точно *****код:v2_dizzy_facepalm:

Reobne
09.12.2014, 19:15
потом ромб из троек и т.д
Что и.т.д? Ноль или всё таки 4? :)
Для такого простого эффекта не нужно строить таблицу, а если и строить, то медленный код вполне подойдёт, так как таблица строится один раз. Надо стремиться сделать короткий код, а не быстрый.
Зачем ты тут (http://zx-pk.ru/showpost.php?p=760167&postcount=535) написал после тройки ноль, и что твой код медленный? :)

denpopov
09.12.2014, 19:18
Зачем ты тут написал после тройки ноль, и что твой код медленный?
крыша едет уже:)
попробую написать на свежую голову. все дело в счетчиках.

---------- Post added at 19:18 ---------- Previous post was at 19:17 ----------


Для такого простого эффекта не нужно строить таблицу, а если и строить, то медленный код вполне подойдёт, так как таблица строится один раз
пауза в деме излишняя

Reobne
09.12.2014, 21:23
Убрал построение таблицы.
Чуток оптимизнул.
Можно ещё в разы ускорить, если не проверять все 32х24 атрибута на каждом кадре, а указателем шагать по диагоналям, по сторонам ромба. На и так за кадр успевает, а короче получится врятли.

ORG 6000H
ENTRYPOINT $
LD HL,4000H
LD DE,4001H
LD BC,1AFFH
LD (HL),FFH
LDIR
EI
LD A,29
LD (KADR),A
MAINLOOP
LD A,0
OUT (FE),A
HALT
LD A,1
OUT (FE),A
LD A,2
KADR EQU $-1
DEC A
LD IX,5800H
LD HL,SATTR
LD DE,#180C
LOOP1
LD B,#10
LOOP2
DEC A
JR NZ,SKIP1
LD C,(HL)
LD (IX+0),C
SKIP1
INC IX
INC HL
DJNZ LOOP2
LD B,#10
LOOP3
INC A
JR NZ,SKIP2
LD C,(HL)
LD (IX+0),C
SKIP2
INC IX
INC HL
DJNZ LOOP3
DEC E
DEC A
BIT 7,E
JR Z,$+4
INC A
INC A
DEC D
JR NZ,LOOP1

LD HL,KADR
DEC (HL)
JR NZ,MAINLOOP
JR $

SATTR
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 00H, 2DH, 2DH, 2DH, 00H, 2DH, 2DH
DEFB 2DH, 00H, 00H, 00H, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 2DH
DEFB 2DH, 00H, 2DH, 00H, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 00H, 2DH, 00H, 00H, 00H, 2DH, 00H, 2DH
DEFB 2DH, 00H, 00H, 00H, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 2DH
DEFB 2DH, 00H, 00H, 00H, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 00H, 00H, 2DH, 2DH, 2DH, 00H, 00H, 2DH
DEFB 00H, 00H, 00H, 00H, 00H, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 2DH
DEFB 2DH, 00H, 00H, 00H, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 00H, 2DH, 00H, 2DH, 2DH, 2DH
DEFB 2DH, 00H, 2DH, 00H, 2DH, 2DH, 2DH, 2DH
DEFB 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH, 2DH
DEFB 12H, 12H, 12H, 12H, 12H, 12H, 12H, 12H
DEFB 12H, 12H, 12H, 12H, 12H, 12H, 12H, 12H
DEFB 12H, 12H, 12H, 12H, 12H, 12H, 12H, 12H
DEFB 12H, 12H, 12H, 12H, 12H, 12H, 12H, 12H

denpopov
13.12.2014, 06:26
все же я табличку построил, 45 байт



device zxspectrum128
ORG #6000
begin

; jr $
; inc d;$14
; dec d;$15

; ld hl,#4000,de,#4001,bc,6143,(hl),#AA:ldir

ld hl,#5800
ld d,$1B
call draw

ld d,$11
ld a,$14,(opcode1),a
call draw
jr $
draw:

ld c,12
sp0:
ld e,d
ld b,16
sp1: ld (hl),e
dec e
inc hl
djnz sp1

ld b,16
sp2:
ld (hl),e
inc e,hl
djnz sp2

opcode1: dec d

dec c
jr nz,sp0
ret
end
display /d,end-begin
savesna "spir.sna",begin

denpopov
07.01.2015, 08:32
возвращаясь к вычислению числа pi=3.141
хоть и считается число, но выходит медленно

Andrew771
14.01.2015, 16:18
Накалякал процедуру опроса всех 40 клавиш Спектрума. В результате выдает коды нажатых одной или двух одновременно клавиш.
Почему-то никогда не встречал такой процедуры у других. Везде только опрос конкретных нескольких клавиш.



; чтение до двух одновременно нажатых клавиш
; вход: нет
; выход: (code_key_1),(code_key_2) = коды нажатых клавиш (если не нажата, то 0)

readkey ld de,0
ld (code_key_1),de


ld bc,32766
call readkey_10
ld bc,49150
call readkey_10
ld bc,57342
call readkey_10
ld bc,61438
call readkey_10
ld bc,63486
call readkey_10
ld bc,64510
call readkey_10
ld bc,65022
call readkey_10
ld bc,65278
call readkey_10
ret

readkey_10 in a,(c)

rrca
call nc,readkey_20
inc e

rrca
call nc,readkey_20
inc e

rrca
call nc,readkey_20
inc e

rrca
call nc,readkey_20
inc e

rrca
call nc,readkey_20
inc e

ret

readkey_20 push af

ld bc,code_key_1
ld a,(bc)
and a
jp z,readkey_21
inc bc

readkey_21 ld hl,table_code_key
add hl,de
ld a,(hl)
ld (bc),a

pop af

ret

code_key_1 defb 0 ; код нажатой клавиши 1
code_key_2 defb 0 ; код нажатой клавиши 2

table_code_key defb 32,16,77,78,66 ; таблица кодов нажатых клавиш для полурядов
defb 13,76,75,74,72
defb 80,79,73,85,89
defb 48,57,56,55,54
defb 49,50,51,52,53
defb 81,87,69,82,84
defb 65,83,68,70,71
defb 17,90,88,67,86


А мне сейчас нужен генератор случайных чисел в диапазоне от 0 до Х. Число Х задается в начале процедуры, может быть любым в диапазоне 1..65535. Ни у кого не завалялась? :)

Alex Rider
14.01.2015, 16:31
Накалякал процедуру опроса всех 40 клавиш Спектрума.
Примерно то же самое в ПЗУ по адресу #028e.

Andrew771
14.01.2015, 16:41
Примерно то же самое в ПЗУ по адресу #028e.
круто, спасиб, посмотрю!
Можь там и random завалялся? :)

Alex Rider
14.01.2015, 16:51
Можь там и random завалялся?
Не, ПЗУшный рандом очень тормозной и хочет калькулятор, которым делит на ноль.

Alex Rider
14.01.2015, 16:51
Можь там и random завалялся?
Не, ПЗУшный рандом очень тормозной и хочет калькулятор, которым делит на ноль.

Reobne
14.01.2015, 17:23
А мне сейчас нужен генератор случайных чисел в диапазоне от 0 до Х. Число Х задается в начале процедуры, может быть любым в диапазоне 1..65535. Ни у кого не завалялась?
Нужно умножить X+1 на Random(0..65535) и в старших 16 разрядах 32 разрядного результата умножения будет то, что надо.

jerri
14.01.2015, 17:35
scan_kbd
ld a,-2
ld c,a
ld hl,kb_buf
dup 7
ld b,a
ini
rlca
edup
ld b,a
ini
xor a
in a,(-2)
cpl
and #1f
ld (cur_keys),a
ret z
scf
ret
scan_ctrl
ld bc,k_table
ld de,kb_buf
exx
ld b,8
scan_ctrl0
exx
ld a,(bc)
inc bc
ld l,a
ld h,0
add hl,de
ld a,(bc)
inc bc
and (hl)
cp 1
exx
rr e
djnz scan_ctrl0
ld a,e
ld (cur_keys),a
kemp_act ret
ld bc,#001f
in a,(c)
and #0f
or e
ld (cur_keys),a
ret
scan_tbl
ld hl,kb_buf
ld b,8
scan_tbl0
ld c,#10
scan_tbl1
ld a,(hl)
and c
cp 1
jr c,scan_tbl2
rrc c
jr nc,scan_tbl1
inc hl
djnz scan_tbl0
ld c,b
ret
scan_tbl2
ld a,8
sub b
ld b,a
ret
t_table
db 2,4
db 1,16
db 1,1
db 2,8
k_table
; p o a q Sp En H
db 5, 1 ;p
db 5, 2 ;o
db 1, 1 ;a
db 2, 1 ;q

db 2, 1 ;

db 2, 16 ;T
db 2, 8 ;R
db 5, 16 ;Y

cur_keys db 0
old_keys db 0
prs_keys db 0
key_prsed db 0
kb_buf ds 8

; 1 2 4 8 16
;#fe 0 cs z x c v
;#fd 1 a s d f g
;#fb 2 q w e r t
;#f7 3 1 2 3 4 5
;#ef 4 0 9 8 7 6
;#df 5 p o i u y
;#bf 6 en l k j h
;#7f 7 sp ss m n b
keys_table
db #01,"ZXCV"
db "ASDFG"
db "QWERT"
db "12345"
db "09876"
db "POIUY"
db #0d,"LKJH"
db #20,#02,"MNB",#00
key_char
ld de,keys_table
ld hl,kb_buf
ld c,8
key_char0
ld a,(hl)
inc hl
ld b,5
key_char1
rra
jr nc,key_char2
inc de
djnz key_char1
dec c
jr nz,key_char0
key_char2
ld a,(de)
ld (key_prsed),a
ret

Andrew771
14.01.2015, 17:43
Нужно умножить X+1 на Random(0..65535) и в старших 16 разрядах 32 разрядного результата умножения будет то, что надо.
ого, крутяк. Проверил, действительно так. Даж удивительно.

Reobne
14.01.2015, 18:58
ого, крутяк. Проверил, действительно так. Даж удивительно
Против математики не попрёшь. :)
Хотя это не идеальное решение, при больших числах X будет заметна неравномерность распределения случайных чисел, в пределах единицы. То есть например двойка будет выпадать чаще тройки. Чтобы уменьшить этот эффект, можно добавить разрядов (умножать на рандом(0..FFFFFF). Чтобы совсем устранить, надо сложнее: Надо найти самую старшую единицу у X. Подготовить маску с нужным числом единиц. ( например для X=5 маска будет 7, для 191 маска будет 255) потом вызывать рандом, маскировать, сравнивать с X, до тех пор пока не получится числа в нужных пределах. Непонятно сколько будет работать программа, зато правильное распределение.

Andrew771
15.01.2015, 09:31
Чтобы совсем устранить, надо сложнее: Надо найти самую старшую единицу у X. Подготовить маску с нужным числом единиц. ( например для X=5 маска будет 7, для 191 маска будет 255) потом вызывать рандом, маскировать, сравнивать с X, до тех пор пока не получится числа в нужных пределах. Непонятно сколько будет работать программа, зато правильное распределение.
Вот именно я так и хотел реализовать, но простой способ с умножением понравился больше. Возможно, реализация с масками не будет дольше умножения, т.к. на умножение тоже нужно время, а тут просто несколько сдвигов регистровой пары и сравнений.

drbars
16.01.2015, 20:27
У меня тоже всю клаву светит, примерно так:



MODULE KEYBOARD

; Начало массива клавиш
KEY_MAP:
DS #28,#00
KEY_A EQU KEY_MAP+#00
KEY_B EQU KEY_MAP+#01
KEY_C EQU KEY_MAP+#02
KEY_D EQU KEY_MAP+#03
KEY_E EQU KEY_MAP+#04
KEY_F EQU KEY_MAP+#05
KEY_G EQU KEY_MAP+#06
KEY_H EQU KEY_MAP+#07
KEY_I EQU KEY_MAP+#08
KEY_J EQU KEY_MAP+#09
KEY_K EQU KEY_MAP+#0A
KEY_L EQU KEY_MAP+#0B
KEY_M EQU KEY_MAP+#0C
KEY_N EQU KEY_MAP+#0D
KEY_O EQU KEY_MAP+#0E
KEY_P EQU KEY_MAP+#0F
KEY_Q EQU KEY_MAP+#10
KEY_R EQU KEY_MAP+#11
KEY_S EQU KEY_MAP+#12
KEY_T EQU KEY_MAP+#13
KEY_U EQU KEY_MAP+#14
KEY_V EQU KEY_MAP+#15
KEY_W EQU KEY_MAP+#16
KEY_X EQU KEY_MAP+#17
KEY_Y EQU KEY_MAP+#18
KEY_Z EQU KEY_MAP+#19
KEY_0 EQU KEY_MAP+#1A
KEY_1 EQU KEY_MAP+#1B
KEY_2 EQU KEY_MAP+#1C
KEY_3 EQU KEY_MAP+#1D
KEY_4 EQU KEY_MAP+#1E
KEY_5 EQU KEY_MAP+#1F
KEY_6 EQU KEY_MAP+#20
KEY_7 EQU KEY_MAP+#21
KEY_8 EQU KEY_MAP+#22
KEY_9 EQU KEY_MAP+#23
KEY_SPC EQU KEY_MAP+#24
KEY_ENT EQU KEY_MAP+#25
KEY_CS EQU KEY_MAP+#26
KEY_SS EQU KEY_MAP+#27
;-----------------------------------------------------------------------------------------
; Процедура сканирования портов клавиатуры
CHECK_KEYS:
LD (SCAN_SP+1),SP
LD SP,KEY_TAB ; Опрос клавиатуры
LD DE,MAIN.KEY_MAP
LD BC,#28FF
SCANLP POP HL
LD A,L
IN A,(#FE)
AND H
ADD A,C
SBC A,A
LD (DE),A
INC E
DJNZ SCANLP
SCAN_SP LD SP,#0000
RET

;------------------------------------------------------------------------------------------------------------
; Таблица портов клавиатуры
KEY_TAB:
DB #FD,1 ;#14
DB #7F,16 ;#23
DB #FE,8 ;#21
DB #FD,4 ;#16
DB #FB,4 ;#0C
DB #FD,8 ;#17
DB #FD,16 ;#18
DB #BF,16 ;#19
DB #DF,4 ;#11
DB #BF,8 ;#1A
DB #BF,4 ;#1B
DB #BF,2 ;#1C
DB #7F,4 ;#25
DB #7F,8 ;#24
DB #DF,2 ;#12
DB #DF,1 ;#13
DB #FB,1 ;#0A
DB #FB,8 ;#0D
DB #FD,2 ;#15
DB #FB,16 ;#0E
DB #DF,8 ;#10
DB #FE,16 ;#22
DB #FB,2 ;#0B
DB #FE,4 ;#20
DB #DF,16 ;#0F
DB #FE,2 ;#1F
DB #EF,1 ;#09
DB #F7,1 ;#00
DB #F7,2 ;#01
DB #F7,4 ;#02
DB #F7,8 ;#03
DB #F7,16 ;#04
DB #EF,16 ;#05
DB #EF,8 ;#06
DB #EF,4 ;#07
DB #EF,2 ;#08
DB #7F,1 ;#27
DB #BF,1 ;#1D
DB #FE,1 ;#1E
DB #7F,2 ;#26

ENDMODULE

Destr
26.01.2015, 12:30
Может уже где и обсуждалось, но не нашёл:
Как подсчитать сколько фреймов занимает какая-либо процедура?
Причём не тактов (они могут быть по разному в зависимости от данных), а именно сколько INTов успевает проходить.
Можно конечно вешать счётчик на IM2, но если прога меняет стек?
Например выбирает данные с него - прерывания приходится запрещать.

denpopov
26.01.2015, 12:49
посмотри мультиколор в MQM4, там интересная процедурка определения тактов.


Как подсчитать сколько фреймов занимает какая-либо процедура?

а поделить число тактов на число, занимаемое процедурой никак?

Reobne
26.01.2015, 12:56
Destr,
На обычном, нетурбированом: грубо 3 500 000/50 = 70 000 тактов/кадр.
Реально - плюс минус немного, в зависимости от клона.
Если прерывания включены, то программа обработки своё тоже отжирает.

Сколько тактов затрачивает процедура, делим на 70 000, получаем сколько кадров она будет работать.

А если нужно во время выполнения знать кадр, то:
1. Включить прерывания и считать.
2. Заранее посчитать сколько тратят процедуры времени, и при вызове суммировать.
3. Заранее примерно посчитать сколько тратят процедуры, суммировать. Когда возможно, включать прерывания, и синхронизировать (например считаем в тысячах тактов, пришло прерывание - в счётчике 72 - плюсуем один кадр, в счётчике 230 - плюсуем 3 кадра. Другой вариант - считаем в 273-шках тактов, при прерывании оругляем до второго байта счётчика, который и будет числом кадров. То есть, если младший байт >128, то старшему +1, и младший в любом случае обнуляем.)
4. Не знаю... Терпеть... Попробовать обойтись без счётчика кадров. :)

Destr
26.01.2015, 13:15
посмотри мультиколор в MQM4, там интересная процедурка определения тактов.
А это что? Игра, дема или ещё что?

а поделить число тактов на число, занимаемое процедурой никак?
Никак. Она может занимать и 10 000 и 100 000 тактов

Reobne
26.01.2015, 13:17
Чтобы не отключать прерывания, при использовании стека, можно регенерировать потерянные ячейки, как, например, в Amaurote.

Либо, если известно, что последний POP был POP DE;
если он там не испорчен, если не было EXX, то можно регенерировать из него.


II_Proc: LD (HL_Store+1),HL
POP HL
PUSH DE
LD (RET_Store+1),HL
LD (SP_Store+1),SP
LD SP,II_SP
PUSH AF
...
POP AF
HL_Store: LD HL,nn
SP_Store: LD SP,nn
RET_Store: JP nn
Пишу из головы, для идеи, возможны ошибки.

denpopov
09.02.2015, 08:12
add a,1

а как повлияет adc a,0 ?

Destr
09.02.2015, 14:22
Сравнение двух 16-битных чисел со знаком.
Signed int comparison


; сравнение HL(sgn) и DE(sgn) на выходе флаг C установлен если HL<DE
CMP_HL_DE
LD A,H ;4
XOR D ;4
JP P,CHD1 ;10
LD A,H ;4
RLA ;4
JP CHD2 ;10
CHD1 SBC HL,DE ;11
CHD2
; (алгоритм подсказал sam style)

Sergey
09.02.2015, 16:08
; сравнение HL(sgn) и DE(sgn) на выходе флаг C установлен если HL<DE...


Гениально. Я, кстати, предполагал, что алгоритм с ветвлениями может быть быстрее.
Получилось быстрее на 27 тактов, короче - на 6 байт

Destr
09.02.2015, 16:25
Гениально. Я, кстати, предполагал, что алгоритм с ветвлениями может быть быстрее.
Получилось быстрее на 27 тактов, короче - на 6 байт
Просто ты пошёл по ошибочному пути сравнивая 17 битные числа.
Я на те-же грабли наступил, но по счастью мимо пробегал самстайл и вместе накропали сравнение знаков, ну потом я долизал до теперешнего вида.
Кстати можно ещё сократить/ускорить, но это уже с потерей универсальности (т.е. вызывающая прога должна будет контролить не только С но ещё и P)

Ещё в тему - нахождение средней точки между HL и DE (тоже со знаками)
LD A,H
XOR D
ADD HL,DE
JP P,$+4
CCF
RR H
RR L

denpopov
09.02.2015, 16:29
Наберите программку на Си, сгенерьте сырок, а там сравните:)

Destr
09.02.2015, 16:33
Наберите программку на Си, сгенерьте сырок, а там сравните
Так сгенерь да покаж.
(я например не умею)

Sergey
09.02.2015, 19:25
Так сгенерь да покаж.
(я например не умею)
Опосля избавления от индексной адресации операндов и повышения наглядности получилось это:

_sgncmp:

;sgncmp.c:3: if (A>B) return 0;
ld a,l ; A_low
sub a,e ; B_low
ld a,h ; A_high
sbc a,d ; B_high
jp PO, 00109$
xor a, #0x80
00109$:
jp P,A_меньше_B
ld hl,#0x0000 ; A>B
ret
A_меньше_B: ; A<B
ld hl,#0x0001
ret
В обсчем, SDCC меня тоже уделал! :)
P.S. Убожество своё потёр нафиг.
P.P.S. Твою процедурку можно убыстрить на целых 2(!) такта, заменив JR на JP.

denpopov
09.02.2015, 19:52
В обсчем, SDCC меня тоже уделал!

говорили тебе, а ты не слушал:v2_dizzy_facepalm:

Destr
09.02.2015, 23:44
Твою процедурку можно убыстрить на целых 2(!) такта, заменив JR на JP.
Ага.
Это мой бич, я всё время путаюсь кто из них быстрей...
(наверное в голове стоит что чем длинней команда в байтах, тем медленнее)

Vladson
10.02.2015, 01:48
Это мой бич, я всё время путаюсь кто из них быстрей...
Мне бы твои проблемы, я после привыкания к современным реалиям (в 99% случаев приходится писать не быстрый код, а расширяемый и легкоподдерживаемый, независимо от сис-требований) вообще почти уже разучился считать такты и байты. Стараюсь по привычке писать "как лучше" и только потом когда ничего не работает, уже вспоминаю что на Z80 нету "стопицот" гигов и гигагерц :)

Destr
10.02.2015, 07:07
Sergey, так в среднем ещё быстрей выходит:


LD A,H ; 4
XOR D ; 4
LD A,H ; 4
RLA ; 4
JP M,CHD ; 10
SBC HL,DE ; 15
CHD

26/41 тактов

Всё, вилы!


LD A,H ; 4
XOR D ; 4
JP P,CHD ; 10
EX DE,HL ; 4
CHD SBC HL,DE ; 15

33/37 т.

P.S. Это надо-же, всю ночь мучатся...
Как работает - разбирайся сам, я спать наконец-то :)

Reobne
10.02.2015, 08:50
Оформленна как подпрограмма.
Недостатки: более медленная, большая, сложно переделать в inline.
Достоинства: не портятся HL, DE. Возможно творчески переделать в inline, так что скорость увеличится. (Сейчас, когда она как подпрограмма, то содержит много условных переходов для подготовки флага C. Inline эти переходы можно использовать непосредственно)



LD A,H ;4
SUB D ;4
JP Z,HiEQ ;10
CCF ;4 (=22)
RET PE ;5 (exit 33 p=0.25)
JP P,Els_ ;10
SCF ;4
RET ;10 (exit 51 p=0.373)
Els_:
XOR A ;4
RET ;10 (exit 51 p=0.373)
HiEQ:
LD A,L ;4
CP E ;4
RET ;10 (exit 36 p=0.004)


Вероятности p посчитаны при равномерном распределении аргументов (-32768..32767). Чем меньше диапазон значений аргументов будет на самом деле, тем выше будет вероятность последнего выхода в 36 тактов.


, чтобы убедится, что все процедуры работают одинаково. Все 5 версий, которые я нашёл в этой теме. Файл - ассемблер EMUZWin.
Сам я убедился. :)
(Хм. А вдруг они все работают одинаково неправильно? :) )
Там два режима, 0 - полный перебор значений, сначала меняются старшие байты. 1 - берутся псевдослучайные 256 байт из ПЗУ, и тесты проходят только с ними.

Andrew771
10.02.2015, 10:00
Мне бы твои проблемы, я после привыкания к современным реалиям (в 99% случаев приходится писать не быстрый код, а расширяемый и легкоподдерживаемый, независимо от сис-требований) вообще почти уже разучился считать такты и байты. Стараюсь по привычке писать "как лучше" и только потом когда ничего не работает, уже вспоминаю что на Z80 нету "стопицот" гигов и гигагерц
На Спеке тоже не стоит заморачиваться везде с быстродействием, а только в критических кусках. Иначе разработка будет длиться вечно.

denpopov
10.02.2015, 11:02
На Спеке тоже не стоит заморачиваться везде с быстродействием, а только в критических кусках. Иначе разработка будет длиться вечно.

Скорее всего - "гладко было на бумаге, да забыли про овраги"...

Destr
10.02.2015, 14:36
Хм. А вдруг они все работают одинаково неправильно?
Свои варианты я проверял на 3д-бегалке.
(там не забалуешь, если что не так то сразу кранты)
Работают.

Sergey
10.02.2015, 16:16
Свои варианты я проверял на 3д-бегалке.

Оу! Проверь, пожалуйста, тогда и это:


or a,a ; 4
sbc hl,de ;15
jp PO,_no_xor ;10
ld a,h ; 4
xor a, #0x80 ; 7
_no_xor:
jp P,A_меньше_B
ld hl,#0x0000 ; A>B
ret
A_меньше_B: ; A<B
ld hl,#0x0001
ret
29/40 тактов

Переход, не по CF, а по флагу знака, P/M

Destr
10.02.2015, 16:49
Оу! Проверь, пожалуйста, тогда и это:

Переход, не по CF, а по флагу знака, P/M
Не могу, тёзка.
Если по P/M (у меня макрос, его поменять нет проблем, но если надо контролировать другой флаг, то придётся весь текст перелопачивать где есть сравнение)
Без обид, проверяй как-нибудь иначе (что там Reobne, накалякал?)

Sergey
10.02.2015, 16:56
Не могу, тёзка.
Если по P/M (у меня макрос, его поменять нет проблем, но если надо контролировать другой флаг, то придётся весь текст перелопачивать где есть сравнение)
Без обид, проверяй как-нибудь иначе (что там Reobne, накалякал?)

А если так? ;)

_no_xor:
jp P,A_меньше_B
CCF
ret
A_меньше_B: ; A<B
SCF
ret

Destr
10.02.2015, 17:03
or a
sbc hl,de
jp PO,.nx
ld a,h
xor a, #80
.nx
jp P,.amb
CCF
ret
.amb
SCF
ret


Если я правильно написал, то не работает.

Reobne
10.02.2015, 17:09
...A_меньше_B ld hl,#0x0000 ; A>B ret A_меньше_B: ; A<B...
Проверял на своей тест-проге. Тест не пройден. :(
Судя по комментам, у тебя 2 исхода A>B и A<B. Лучше и понятнее писать HL<DE и HL>=DE. А то я смотрю и не понимаю, что тут вообще изначально подразумевалось, и как прогу можно исправить, чтобы заработала.

Sergey
10.02.2015, 17:17
Проверял на своей тест-проге. Тест не пройден. :(
Судя по комментам, у тебя 2 исхода A>B и A<B. Лучше и понятнее писать HL<DE и HL>=DE. А то я смотрю и не понимаю, что тут вообще изначально подразумевалось, и как прогу можно исправить, чтобы заработала.
A - HL
B - DE

Reobne
10.02.2015, 17:37
Sergey, Исправил конец на вот так:

jp M,A_меньше_B
ld hl,#0000 ; HL>=DE

ret
A_меньше_B: ; HL<DE
ld hl,#0001
ret
И заработало! :)

Reobne
10.02.2015, 17:41
Текущая версия тестов. 6 разных процедур тестируются на совпадение результатов.

denpopov
10.02.2015, 17:41
а нельзя ли поменять LD HL,nnnn на установку флага С?

Sergey
10.02.2015, 17:52
а нельзя ли поменять LD HL,nnnn на установку флага С?
http://zx-pk.ru/showpost.php?p=780698&postcount=587

Sergey
11.02.2015, 22:13
Sergey, так в среднем ещё быстрей выходит:
...
Всё, вилы!


LD A,H ; 4
XOR D ; 4
JP P,CHD ; 10
EX DE,HL ; 4
CHD SBC HL,DE ; 15

33/37 т.
...
Думали тема раскрыта? - Ха! :)
Заменяем EX DE,HL, время которого ПРИБАВЛЯЕТСЯ к 16-битному вычитанию, на вычитание HL из DE с помощью 8-битной арифметики, которое выполняется ВМЕСТО 16-битного вычитания. Идея использования 8-й арифметики взята из SDCC.


LD A,H ; 4
XOR D ; 4
JP P,CHD ; 10
; EX DE,HL ; 4
ld a,e ; 4
sub l ; 4
ld a,d ; 4
sbc a,h ; 4
<ветвление по результату сравнения (CF)>
CHD SBC HL,DE ; 15
<ветвление по результату сравнения (CF)>
34/33 такта. Среднее время выполнения 33,5.

Destr
11.02.2015, 22:28
<ветвление по результату сравнения (CF)>
А оно что, не съест такты?
Т.е. эти <ветвление по результату сравнения (CF)> В ЛЮБОМ СЛУЧАЕ ПРОИСХОДЯТ.
Неважно внутри процедуры (как твой пример) или после (как мой)
У тебя получается либо 15 тактов на SBC и ветвление либо 16 на сравку + опять ветвление.

Sergey
11.02.2015, 22:30
А оно что, не съест такты?
Т.е. эти <ветвление по результату сравнения (CF)> В ЛЮБОМ СЛУЧАЕ ПРОИСХОДЯТ.
Неважно внутри процедуры (как твой пример) или после (как мой)
Так это ж уже использование результатов сравнения, а не само сравнение. Ты, совершенно, прав.
Ну что, - мы, таки, молодцы? :)

Теперь надо утвердить две процедуры: самую быструю и самую короткую.

Destr
11.02.2015, 22:35
Ну что, - мы, таки, молодцы?
Ты молодец.
Если бы тему не поднял я бы не решился пихать в этюды (а уж тем более ломать башку над оптимумом)
(так бы и юзал то что вначале привёл в пример. правда до тех пор пока не пришла пора мою 3д оптимизить. пока что я пишу так, навскидку лишь-бы работало, скорость буду выжимать потом)
А на счёт короткости - забей, никому байт не помешает (ну не сможешь ты заюзать 1024 процедуры. да ещё чтоб в каждой байт сэкономить и килобайт получить. это не так делается)

Sergey
11.02.2015, 22:57
...так бы и юзал то что вначале привёл в пример. правда до тех пор пока не пришла пора мою 3д оптимизить...
Искренне рад оказаться полезным :)

---------- Post added at 23:57 ---------- Previous post was at 23:46 ----------

Итог. Сравнение двух 16-битных чисел со знаком.
Вход: HL = число №1, DE = число №2.
Выход: CF=1 - число в HL меньше; CF=0 - число в DE меньше или равно HL.
Самая короткая процедура (7 байт, 33/37 тактов, средн.35 тактов), автор Destr:

LD A,H ; 4
XOR D ; 4
JP P,CHD ; 10
EX DE,HL ; 4
CHD SBC HL,DE ; 15
<ветвление по результату сравнения (CF)>

Самая быстрая процедура (10 байт, 34/33 такта, средн.33,5 такта), авторы Destr, Sergey:

LD A,H ; 4
XOR D ; 4
JP P,CHD ; 10
ld a,e ; 4
sub l ; 4
ld a,d ; 4
sbc a,h ; 4
<ветвление по результату сравнения (CF)>
CHD SBC HL,DE ; 15
<ветвление по результату сравнения (CF)>

Destr
11.02.2015, 23:55
Самая быстрая процедура (10 байт, 34/33 такта, средн.33,5 такта)
Есть ещё ньюанс - зачастую ветвления нет.
Нужен только флаг С
Рабочий пример:


LD HL,арг1:LD DE,арг2:CP_HLDE:RL C
LD HL,арг3:LD DE,арг4:CP_HLDE:RL C
LD A,C:AND 3:RET Z:CP 3:SCF:RET Z


Где CP_HLDE - наш макрос сравнения.
В последней строчке - принимается решение по выходу в зависимости от результатов двух сравнений.
Вот и посчитай как это всё умедлится если юзать ветвления.

---------- Post added at 23:55 ---------- Previous post was at 23:40 ----------

(+20 тактов, ого!)

Sergey
12.02.2015, 04:19
+20 тактов, ого!

Нет пределов совершенству :)

denpopov
17.04.2015, 17:01
Заглохла темка. Прочитал про dither 2x2, вышел вот такой набор:
http://www.graphicsmill.com/docs/gm/DitheringBasicConcepts1.png

Интересно, как использовать набор как чанки 4х4, и есть ли смысл заниматься?

Destr
19.04.2015, 16:53
Интересно, как использовать набор как чанки 4х4, и есть ли смысл заниматься?
Вообще некратный, тяжко что-либо делать с ним.
Ну демомакеры конечно юзают такое, а вот для чего-либо другого - вряд-ли смысл есть...
На ум приходит только "размывание" экрана, ну типа как Untouchables (там квадратиками, а можно эти чанки заюзать...)

denpopov
21.04.2015, 12:26
Вообще некратный, тяжко что-либо делать с ним.
глупость сказал, да?

denpopov
02.08.2015, 10:27
Написал программу генерации лабиринта, алгоритм взят Здесь (http://swag.outpostbbs.net/MISC/0009.PAS.html)

Идея заглохла - как показать на экране, оставлю код здесь.


device zxspectrum128
ORG #6400
begin
bw: db 1,2,4,8
bx: db 0,0,1,-1
by: db -1,1,0,0

runi:

PLOTTBL EQU #6000
ld sp,$FFE0
call FORMER

ld de,$0101
call ma

ld hl,$5800,de,$5801,bc,767,(hl),7:ldir

jr $
ma:
; a(x,y)=1;a[p] := True; {make a path}
call PLOT
ld a,(bc):or (hl):ld (bc),a
Repeat:
ld ix,bw; d=0;{check For allowable directions}
;D=y,E=x
;up
; If y>2 And a(x,y-2)=0:d+1:EndIf
ld a,d
cp 2
jr c,test2
push de
dec d,d
call PLOT
pop de
jr nz,test2
ld a,ixl:or 1:ld ixl,a
test2:
;;down
; If y<190 And a(x,y+2)=0:d+2:EndIf
ld a,d
cp 190
jr nc,test4
push de
inc d
inc d
call PLOT
pop de
jr nz,test4
ld a,ixl:or 2:ld ixl,a
test4:
;;right
; If x<>253 And a(x+2,y)=0:d+4:EndIf
ld a,e
cp 253+1
jr z,test8
push de
inc e
inc e
call PLOT
pop de
jr nz,test8
ld a,ixl:or 4:ld ixl,a
test8:
;;left
; If x>2 And a(x-2,y)=0:d+8:EndIf
ld a,e
cp 2
jr c,test_e
push de
dec e
dec e
call PLOT
pop de
jr nz,test_e
ld a,ixl:or 8:ld ixl,a
test_e:

ld a,ixl:or a:ret z
; If d <> 0
; Repeat; {choose a direction that's legal}
; i = Random(4);
; Until (d &(1<<i));
ld b,bw/256
cho_dir:
call random
and 3
ld c,a
ld a,(bc)
and ixl
jr z,cho_dir

; a(x+bx(i),y+by(i) )=1;;;;a[p + b[i]] := True; {make a path}
; push ix
ld ixl,c
push de
ld a,e:add a,(ix+4):ld e,a
ld a,d:add a,(ix+8):ld d,a
call PLOT
ld a,(bc):or (hl):ld (bc),a
; ei:halt
; m(x+bx(i)*2,y+by(i)*2);;m(p + 2 * b[i]); {recurse}
;pop de
ld a,e:add a,(ix+4):ld e,a
ld a,d:add a,(ix+8):ld d,a
call ma
pop de
; pop ix
jp Repeat
; EndIf
; Until d = 0; {Until stuck}

random:
R1:LD C,$15+3
R2:LD A,#70
ADD A,C:LD C,A
LD (R1+1),A
R3:LD A,#FD
SUB C:LD C,A,(R2+1),A
RRCA:LD (R3+1),A
RET

FORMER LD DE,#4000,BC,#8000,L,E
FLP1 LD H,high PLOTTBL
LD (HL),D:INC H:LD (HL),E:INC H
LD (HL),C:INC H:LD (HL),B
RRC B
LD A,C:ADC A,0:LD C,A
FBR1 INC D:LD A,D:AND 7
JR NZ,FNXT:LD A,E:ADD A,32
LD E,A:JR C,FNXT
LD A,D:SUB 8:LD D,A
FNXT INC L:JR NZ,FLP1
LD HL,PLOTTBL+#C0,BC,#3F
LD DE,HL:INC E
LD (HL),0:LDIR
RET
;-----------ставим точку на DE------------------------
PLOT:; PUSH HL,BC
LD H,HIGH PLOTTBL,L,D,B,(HL):INC H
LD A,(HL),L,E:INC H:OR (HL)
INC H:LD C,A,A,(BC)
and (hl)
;OR (HL):LD (BC),A
; POP BC,HL
RET

end
display /d,end-begin
savesna "!void.sna",runi;begin

jerri
02.08.2015, 11:15
denpopov, тебе алгоритм нужен? или для общего развития выкладываешь?

denpopov
02.08.2015, 11:18
denpopov, тебе алгоритм нужен? или для общего развития выкладываешь?

Нет, алгоритмов завались. В общем-то была идею брождения по большому лабиринту, не знаю, как лучше показать на экране.

jerri
02.08.2015, 11:57
щас не вспомню как называется игра на атари
короче на экране лабиринт и ползают мелкие твари
но там где герой чтото вроде лупы и мелкие твари увеличены в несколько раз

denpopov
02.08.2015, 12:06
и я на атари такую не помню.

jerri
02.08.2015, 12:11
и я на атари такую не помню.

точно
не атари - аппл


http://www.youtube.com

denpopov
02.08.2015, 12:19
В общем-то подобная идея витала в голове, оставлю в "Этюдах":)

denpopov
02.08.2015, 13:30
Вышло полное уныние

jerri
02.08.2015, 15:11
Уныло потому что скучно, мелко и лабиринт красив только на картинке

denpopov
02.08.2015, 15:14
и ошибка
cp 253+1

заменить на cp 253

char
02.09.2015, 06:57
а ищо кое где пользительно што add hl,de не влияет на Z )

denpopov
04.09.2015, 09:00
Господа, раз речь пошла о флагах, то вот такая задача:

в HL и DE есть некоторые значения. Выполняю SBC HL,DE.Как мне определить функцию sign? Знак то есть.

shurik-ua
04.09.2015, 11:12
bit 7,h ?
или я не понял вопроса )

Destr
04.09.2015, 11:32
в HL и DE есть некоторые значения. Выполняю SBC HL,DE.Как мне определить функцию sign? Знак то есть.
sbc hl,de
jp z, нуль
jp m, минус
jp p, плюс
минус: ......
....
....
плюс:
....
....

А если нужно значение функции (-1,0,+1) то как-то так:
xor a
sbc hl,de
jr z, zero
rlc h
sbc a,a
ccf
adc a,0
; rrc h - если надо - можно восстановить h
zero:

shurik-ua
04.09.2015, 12:27
sbc hl,de
jr z, zero
sbc рег пар - не влияет же на флаг z

а нет - влияет - зачем тогда так на ноль проверять )

плюс:
ld a,h
or l
jp z, нуль

Destr
04.09.2015, 13:43
а нет - влияет - зачем тогда так на ноль проверять )
Ну да, сразу переходить можно...
Исправил.
Но это как-бы пол-ответа. Он ведь именно функцию сигнум просил, так что см. часть 2.

denpopov
04.09.2015, 14:32
а нет - влияет - зачем тогда так на ноль проверять )

Да, 0 тоже важен.

---------- Post added at 15:32 ---------- Previous post was at 15:30 ----------


Он ведь именно функцию сигнум просил, так что см. часть 2.

немного матчасти:
https://upload.wikimedia.org/math/d/8/5/d854a9abec6fbd7864430f2053ee8993.png

может, проще лукап построить? 0, 1(127 раз), -1 (до конца) ?

shurik-ua
04.09.2015, 15:15
может, проще лукап построить?
если только память девать некуда.
можно ещё так, как комбинация двух вариантов предложенных Destr


xor a
sbc hl,de
jr z,exit
ld a,1
jp p,exit
neg
exit:

denpopov
04.09.2015, 16:15
может,
ld a,1
на
inc a
поменять?

shurik-ua
04.09.2015, 16:17
нет )

Destr
04.09.2015, 18:41
может,
ld a,1
на
inc a
поменять?
Флаг знака слетит и jp p,exit не сработает как надо.

shurik-ua
04.09.2015, 18:55
ещё посмотрел тут в справочнике - если после этой функции (sign) нужно обрабатывать флаг переноса, то тогда нужно заменить команду "neg" на "cpl, inc a" - по тактам и памяти выходит столько же, но флаг переноса не меняется.

Destr
04.09.2015, 22:10
Как вариант:


xor a
sbc hl,de
jr z,exit
rlc h
sbc a,a
or 1
exit:

shurik-ua
05.09.2015, 01:57
Как вариант:
да неплохо - из минусов что рег H меняется и флаг переполнения теряется, но если для условий задачи это неважно, то этот вариант видимо самый быстрый.

char
05.09.2015, 14:33
rlc h -> ld a,h:rla

Destr
01.11.2015, 00:43
Никогда не использовал daa, заставило разобраться как именно она работает.
Ещё тогда (05.09.2015) насторожило.
И жило где-то внутри, грызло - чёрт, где-то я это видел...
И вот на днях штудируя и упорядочивая прессу - наткнулся:

" Работая на ассемблере уже несколько лет, я долгое время так и не знал
принципа работы (стыдобушка!) команды DAA (#27). Но вот недавно, загрузив
непревзойденный STS, я наконец детально разобрался в алгоритме работы этой
операции, чем и делюсь с теми, кто по каким-то причинам до сих пор этого не
сделал.
На работу команды влияют флаги C,H,N, а также содержимое регистра A.
Алгоритм:
1. Если флаг N выключен (равен 0), то в последующих шагах выполняется операция
сложения. Если же включен (равен 1), то операция вычитания.
2. Если аккумулятор больше #90 или флаг C включен, то к аккумулятору
прибавляется (вычитается) #60. Здесь не случайно написано "или". Если и
A>#90, и CF=1, то сложение (вычитание) #60 происходит всего лишь один раз.
3. Если младший полубайт больше #9 или флаг H включен, то аналогично п.2 к
аккумулятору прибавляется (вычитается) #06. Здесь также работает принцип
OR."

Пруф: http://zxpress.ru/book_articles.php?id=671

От себя могу добавить следующее:
1. Уже в те времена не знать как работает DAA считалось неприличным ("стыдобушка")
2. Уже сейчас только krt17, "Никогда не использовал daa, заставило разобраться как именно она работает.
3. Я лично так и не прочувствовал все тонкости работы этой команды.

Вывод неутешителен (для меня), надеюсь я один такой тормоз.
За сим откланиваюсь, до новых встреч други, надеюсь скоро снова будем грызть-оптимизировать какой-нибудь интересный этюд.

Destr
01.11.2015, 02:12
По хорошему немало площади z80 убили на это daa и флаг половинного переноса, могли бы что нибудь по прикольнее придумать, вернее даже не z80 а 8080.
Но они видимо предвидели (читай "предполагали") будущее.
Когда преобразования встанут ребром.
Я счаз работаю с ПЛК, там порой нужно привести сигнал из аналогового уровня к процентному (например. или к примеру дольному)
Ну и как этот IEEE (скажем 4.0073+e004) превратить в вид для человеков?
Вот и вспомнил DAA (не помогло сразу, но ведь есть TRUNC) !
:)

char
01.11.2015, 02:30
Видимо чел так и не разобрался или не смог изложить правильно. Там если старший полубайт >9 а не весь байт >90. Ну и по чесноку, и после того как разобрался, использовать не начал :) По хорошему немало площади z80 убили на это daa и флаг половинного переноса, могли бы что нибудь по прикольнее придумать, вернее даже не z80 а 8080.

четай попусту не балтай

савсем глюпий штоли, да? ;)

старший полубайт > 9
это и есть "байт больше #90", как написано

char
01.11.2015, 03:01
ладно, уговорил :D
"старший полубайт" значит.

Alex Rider
01.11.2015, 05:27
По хорошему немало площади z80 убили на это daa и флаг половинного переноса, могли бы что нибудь по прикольнее придумать, вернее даже не z80 а 8080.

Область применения DAA весьма специфическая, но есть. Тот же BASIC'овский PRINT n (а, вернее говроя, STR$, на базе которой работает PRINT) без него было бы ощутимо тормознее. Говорят, DAA используется в играх во всяких десятичных счетчиках.

Destr
01.11.2015, 11:59
Говорят, DAA используется в играх во всяких десятичных счетчиках.
Я как закоренелый читер частенько натыкаюсь на DAA когда выцепляю всякие вывод жизней и прочее на экран. Так что для ассемблера DAA тоже не редкость. Даже в своей проге как-то юзал. Но не прочухал до конца, как она работает. Вот-бы схему увидеть (логическую) как оно устроено...
Есть у нас умельцы нарисовать? (или готовая у кого завалялась?)

LW
01.11.2015, 13:42
53939

53940

Пример:


ld a,%00010101 ;(15)
ld c,%00111001 ;(39)
add a,c ;a=%01001110 (4E)
daa ;a=%01010100 (54)


вызывается после операций сложения/вычитания чисел в BCD формате, для коррекции результата

LW
27.11.2015, 08:48
11 тактов/3 байта

sub #01
sbc a,a

jerri
03.12.2015, 23:23
Еще небольшая задачка для оптимизаторов. Стандартный случай, инициализация im2, необходимо залить табличку, и отправить обработчик на метку int, di/ei и ret не забываем. Мне лично нравится табличка в fe но это не столь важно, главное >7f. У меня пока 26 байт, кто какими вариантами пользуется?

а что много вариантов разве?

ты эту процедурку один раз используешь.

я вообще на стадии компиляции табличку создаю

jerri
04.12.2015, 21:10
не не 260 байт не правильно
пиши 49152 - 131072

Destr
04.12.2015, 21:50
У меня пока 26 байт, кто какими вариантами пользуется?
Ну у меня в районе 30 или 40.
А вообще покажи свой 26, тогда может что и придумается.

Destr
04.12.2015, 22:20
Тут di в общем то и не нужен, но возможно есть вариант с ld i,a до готовых данных поэтому оставил, дабы не было преимуществом. Задача в общем не критична, тут просто забавный момент в объединении 3 простых задач, не знаю, мне иногда нравится над такими подумать.
Так вроде получается что у тебя приколочено к адресам конкретным (#fe00-#ff00 на таблицу и #fd на вектор).
Противоречие

Мне лично нравится табличка в fe но это не столь важно, главное >7f.
Ведь если вектор куда-нибудь в #80 запихать (к примеру то уже получится бяка).
И перехода на int

и отправить обработчик на метку int
что-то я не увидел (пропустил?).

Да и не универсальна получается процедура.

У меня такая:


DI
IM 2
LD BC,256
LD A,IVEC
LD I,A,H,A,D,H,E,B,L,C
LD (HL),high IADR
LDIR
LD HL,INT
LD A,#C3
LD (IADR),A
LD (IADR+1),HL
RET
IADR EQU #FDFD
IVEC EQU #FE

Если любитель - подумай может сократишь как-нибудь...

drbars
05.12.2015, 16:17
Мой вариант:



V_TAB EQU #BF

DI
LD HL,V_TAB*256
LD (HL),H
LD C,H
LD B,L
DEC HL
LD (HL),C
DJNZ $-2
LD A,H
INC H
LD L,H
LD (HL),#C3
LD HL,KEYS
LD (V_TAB*256+192),HL
LD I,A
IM 2
EI

drbars
13.12.2015, 09:12
Хороший вариант для 128к+
Извращаться можно всяко, но я считаю лучше всего таблицу в DEFS описать.



V_TAB EQU #BF

DI
LD HL,V_TAB*256+2
LD SP,HL
LD L,H
LD B,#81
PUSH HL
DJNZ $-1
LD (HL),#C3
LD SP,HL
LD HL,KEYS
LD (V_TAB*256+192),HL
LD A,V_TAB-1
LD I,A
IM 2

AndTorp
17.05.2016, 19:07
Здравствуйте. Как можно переделать этот кошмар?


LD A,(M1)
ADD A,L
LD L,A
LD A,(M1)
XOR #01
LD (M1),A

Суть:
- в (M1) попеременно 0 или 1;
- регистр L увеличивается, когда (M1)=1, т.е. через раз;
- значение ячейки M1 предварительно установлено и используется еще в одной процедуре.

denpopov
17.05.2016, 20:16
m1: ld a,NN
xor 1
ld (m1+1),a
add a,l
ld l,a

AndTorp
17.05.2016, 23:30
denpopov, надо сначала менять значение регистра L, а потом (M1)

krt17
18.05.2016, 00:01
если так принципиально


ld a,(m1)
xor #01
jr z,.l1
inc l
.l1
ld (m1),a

переменные к коде моветон :)

AndTorp
18.05.2016, 00:12
denpopov, вариант подошел. Только пришлось поменять условия в паре мест. Спасибо.



переменные к коде моветон
А что делать, если мне надо увеличивать L через раз? Вот завел такой флажок.

krt17
18.05.2016, 00:21
А что делать, если мне надо увеличивать L через раз?
Да как обычно головой думать. Мой ответ был как бы сарказмом, тут проблемы просто нет.

AndTorp
19.05.2016, 23:46
Здравствуйте. Помогите модернизировать процедуру расчета адреса:

LD A,L
AND 7
RRCA
RRCA
RRCA
OR H
LD H,L
LD L,A
LD A,H
AND #18
OR #40
LD H,A
На входе:
H = X-координата от 0 до 31;
L = Y-координата от 0 до 47.
Т.е. по вертикали в одно знакоместо 8x8 "укладываются" по два прямоугольника высотой 4 пикселя каждый.

На выходе:
HL = адрес в экранной области.

Destr
20.05.2016, 07:45
Здравствуйте. Помогите модернизировать процедуру расчета адреса:
Ну самое простое - это учитывать младший бит Y-координаты:


SRL L
EXA
LD A,L
AND 7
RRCA
RRCA
RRCA
OR H
LD H,L
LD L,A
LD A,H
AND #18
OR #40
LD H,A
EXA
RET NC
SET 2,H
RET

А вообще исходя из строния спек-экрана разумней (на мой взгляд) хранить координаты наоборот (H=Y, L=X).
Тогда расчёт такой:


; Stolb-столбец
; Sg-сегмент
; Str-строка в сегменте
; P-старший бит пикселей в знакоместе по вертикали
; Формат координат: H=00SgStrP L=000Stolb
; Формат адреса в экране: H=010SgPix L=StrStolb
RRC H ; H=P00SgStr
LD A,H ; A=P00SgStr
RRCA ; A=rP00SgSt
RRCA ; A=trP00SgS
RRCA ; A=StrP00Sg
XOR L
AND #E0
XOR L ; A=StrStolb
LD L,A ; L сформирован
LD A,H ; A=P00SgStr
RLC H ; H=00SgStrP
RLC H ; H=0SgStrP0
RLC H ; H=SgStrP00
XOR H
AND %11100
XOR H ; A=000SgP00
OR #40 ; A=010SgP00
LD H,A ; H сформирован

Можно сделать и быстрей.
(XOR-AND-XOR тут сделано для защиты от переполнения, например если L вылезло за 31).
В общем как-то так, оптимизаций наверняка море :)

denpopov
20.05.2016, 12:42
а так не лучше, не?
http://speccy.info/w/index.php?title=Построение_точки&diff=35972&oldid=32289

понадобится 1024 байта для построение точки.

Bedazzle
20.05.2016, 22:28
XOR-AND-XOR тут сделано для защиты от переполнения

Кстати, вопрос чутка в сторону - у меня в задворках памяти где-то сидит, что xor-and-xor как-то можно использовались для вывода спрайтов. Или я глючу?

Destr
21.05.2016, 10:33
Кстати, вопрос чутка в сторону - у меня в задворках памяти где-то сидит, что xor-and-xor как-то можно использовались для вывода спрайтов. Или я глючу?
Да можно, просто OR-XOR или AND-OR быстрей...

drbars
29.05.2016, 14:49
AndTorp,



LD A,D
RRCA
RRCA
RRCA
RRCA
AND %11100000
OR E
LD E,A
LD A,D
RRA
AND %00011000
EX AF,AF'
LD A,D
RLCA
RLCA
AND %11111100
LD D,A
EX AF,AF'
XOR D
AND %11111000
XOR D
OR #40
LD D,A


либо



SLA D
SLA D
LD A,D
AND #38
RLCA
RLCA
OR E
LD E,A
LD A,D
AND #C0
RRA
SCF
RRA
RRCA
XOR D
AND #F8
XOR D
LD D,A


Как-то так...

denpopov
26.06.2016, 18:40
копаюсь в одной демке, вот код HL=A*E


sub_80CB:
ld hl, 0
bit 7, e
jr z, loc_80D3
dec hl
loc_80D3:
ld d, h
loc_80D4:
srl a;0->A->c
jr nc, loc_80D9
add hl, de
loc_80D9:
sla e;C<-E-<0
rl d; thru C
or a
jr nz, loc_80D4
ld a, h
ret

Вроде и знак учитывается, а знак двух регистров - нет. Непонятно, как это работает?

drbars
18.09.2016, 16:36
Оставлю пример здесь. Зеркалирование байта, другой способ.



; Mirror byte Z80 example 1

LD HL,BYTE ; Set pointer to byte
LD DE,#5533 ; Masks to registers
LD (HL),#0F ; Set byte to memory (for example)

;----------------------------------------------------------------------
; 21 bytes, 103 t.
LD A,(HL)
AND D
ADD A,A
LD C,A
LD A,(HL)
RRA
AND D
OR C
LD B,A
RRA
RRA
AND E
LD C,A
LD A,B
AND E
ADD A,A
ADD A,A
OR C
LD (HL),A
RRD
;----------------------------------------------------------------------

LD A,(HL) ; Get result from memory to reg A
RET


;----------------------------------------------------------------------
; Mirror byte Z80 example 2
; 17 bytes, 66 t.
LD C,A
RLCA
RLCA
XOR C
AND %10101010
XOR C
LD C,A
RLCA
RLCA
RLCA
RRC C
XOR C
AND %01100110
XOR C
;----------------------------------------------------------------------
; Get result to reg A

Sergey
28.09.2016, 10:07
Оставлю пример здесь. Зеркалирование байта, другой способ.

А это было?

DUP 8 ; зеркалируемый байт в H.
add hl,hl
rra
EDUP
;--------------------- 16b, 120t.


ld b,8 ; зеркалируемый байт в H.
loop: add hl,hl
rra
djnz loop
;--------------------- 6b, 231t.



ld b,8 ; зеркалируемый байт в H.
loop: rl h
rra
djnz loop
;--------------------- 7b, 207t.

drbars
28.09.2016, 17:30
Sergey, это классические способы.

Shiny
27.01.2017, 08:57
Оставлю пример здесь. Зеркалирование байта, другой способ

Fast Z80 Bit Reversal (http://retro666.rssing.com/browser.php?indx=7149388&item=32)
Сайт сам по себе годный, есть интересные этюды.

Shiny
31.01.2017, 21:41
Интересная такая заметка:
Ultrafast Multiplication (http://www.cpcwiki.eu/index.php/Programming:Ultrafast_Multiplication)



The following is the fastest possible multiplication routine (in a little specialised way) for the CPC, coded by Prodatron for the Voyage 1993 Megademo and the Digital Orgasm demo. It works with signed values and is mainly used for 3D graphic calculations. You can change it to HL=DE*L by removing LD A,H in front of every RET command inside the MULxxx sub-routines, but in this case L has to be positive.

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@ @
;@ U L T R A F A S T M U L T I P L I C A T I O N @
;@ @
;@ (c)oded 1993 by Prodatron / SymbiosiS @
;@ @
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;### MULTI -> Multiplies two signed integer values (A=DE*L/256)
;### Input DE=value1 (signed), L=value2 (signed)
;### Output A=DE*L/256 (signed)
;### Destroyed F,BC,DE,HL
MULTI LD H,MULTAB/512
ADD HL,HL
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
PUSH BC
RET
;

DS -$ MOD 512

MULTAB
DEFW MUL000,MUL001,MUL002,MUL003,MUL004,MUL005,MUL006,M UL007,MUL008,MUL009,MUL010,MUL011,MUL012,MUL013,MU L014,MUL015,MUL016,MUL017,MUL018,MUL019,MUL020,MUL 021,MUL022,MUL023,MUL024,MUL025,MUL026,MUL027,MUL0 28,MUL029,MUL030,MUL031,MUL032,MUL033
DEFW MUL034,MUL035,MUL036,MUL037,MUL038,MUL039,MUL040,M UL041,MUL042,MUL043,MUL044,MUL045,MUL046,MUL047,MU L048,MUL049,MUL050,MUL051,MUL052,MUL053,MUL054,MUL 055,MUL056,MUL057,MUL058,MUL059,MUL060,MUL061,MUL0 62,MUL063,MUL064,MUL065,MUL066,MUL067
DEFW MUL068,MUL069,MUL070,MUL071,MUL072,MUL073,MUL074,M UL075,MUL076,MUL077,MUL078,MUL079,MUL080,MUL081,MU L082,MUL083,MUL084,MUL085,MUL086,MUL087,MUL088,MUL 089,MUL090,MUL091,MUL092,MUL093,MUL094,MUL095,MUL0 96,MUL097,MUL098,MUL099,MUL100,MUL101
DEFW MUL102,MUL103,MUL104,MUL105,MUL106,MUL107,MUL108,M UL109,MUL110,MUL111,MUL112,MUL113,MUL114,MUL115,MU L116,MUL117,MUL118,MUL119,MUL120,MUL121,MUL122,MUL 123,MUL124,MUL125,MUL126,MUL127
DEFW NEG128,NEG127,NEG126,NEG125,NEG124,NEG123,NEG122,N EG121,NEG120,NEG119,NEG118,NEG117,NEG116,NEG115,NE G114,NEG113,NEG112,NEG111,NEG110,NEG109,NEG108,NEG 107,NEG106,NEG105,NEG104,NEG103,NEG102,NEG101,NEG1 00,NEG099,NEG098,NEG097,NEG096,NEG095
DEFW NEG094,NEG093,NEG092,NEG091,NEG090,NEG089,NEG088,N EG087,NEG086,NEG085,NEG084,NEG083,NEG082,NEG081,NE G080,NEG079,NEG078,NEG077,NEG076,NEG075,NEG074,NEG 073,NEG072,NEG071,NEG070,NEG069,NEG068,NEG067,NEG0 66,NEG065,NEG064,NEG063,NEG062,NEG061
DEFW NEG060,NEG059,NEG058,NEG057,NEG056,NEG055,NEG054,N EG053,NEG052,NEG051,NEG050,NEG049,NEG048,NEG047,NE G046,NEG045,NEG044,NEG043,NEG042,NEG041,NEG040,NEG 039,NEG038,NEG037,NEG036,NEG035,NEG034,NEG033,NEG0 32,NEG031,NEG030,NEG029,NEG028,NEG027
DEFW NEG026,NEG025,NEG024,NEG023,NEG022,NEG021,NEG020,N EG019,NEG018,NEG017,NEG016,NEG015,NEG014,NEG013,NE G012,NEG011,NEG010,NEG009,NEG008,NEG007,NEG006,NEG 005,NEG004,NEG003,NEG002,NEG001
;
MUL000 LD HL,0:LD A,H:RET
MUL064 ADD HL,HL
MUL032 ADD HL,HL
MUL016 ADD HL,HL
MUL008 ADD HL,HL
MUL004 ADD HL,HL
MUL002 ADD HL,HL
MUL001 LD A,H:RET
MUL096 ADD HL,HL
MUL048 ADD HL,HL
MUL024 ADD HL,HL
MUL012 ADD HL,HL
MUL006 ADD HL,HL
MUL003 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL080 ADD HL,HL
MUL040 ADD HL,HL
MUL020 ADD HL,HL
MUL010 ADD HL,HL
MUL005 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL112 ADD HL,HL
MUL056 ADD HL,HL
MUL028 ADD HL,HL
MUL014 ADD HL,HL
MUL007 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:RET
MUL072 ADD HL,HL
MUL036 ADD HL,HL
MUL018 ADD HL,HL
MUL009 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL088 ADD HL,HL
MUL044 ADD HL,HL
MUL022 ADD HL,HL
MUL011 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:RET
MUL104 ADD HL,HL
MUL052 ADD HL,HL
MUL026 ADD HL,HL
MUL013 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL120 ADD HL,HL
MUL060 ADD HL,HL
MUL030 ADD HL,HL
MUL015 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:RET
MUL068 ADD HL,HL
MUL034 ADD HL,HL
MUL017 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL076 ADD HL,HL
MUL038 ADD HL,HL
MUL019 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL084 ADD HL,HL
MUL042 ADD HL,HL
MUL021 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:RET
MUL092 ADD HL,HL
MUL046 ADD HL,HL
MUL023 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:RET
MUL100 ADD HL,HL
MUL050 ADD HL,HL
MUL025 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:RET
MUL108 ADD HL,HL
MUL054 ADD HL,HL
MUL027 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:RET
MUL116 ADD HL,HL
MUL058 ADD HL,HL
MUL029 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:ADD HL,BC:LD A,H:RET
MUL124 ADD HL,HL
MUL062 ADD HL,HL
MUL031 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:RET
MUL066 ADD HL,HL
MUL033 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL070 ADD HL,HL
MUL035 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:RET
MUL074 ADD HL,HL
MUL037 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:RET
MUL078 ADD HL,HL
MUL039 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:RET
MUL082 ADD HL,HL
MUL041 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:RET
MUL086 ADD HL,HL
MUL043 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL090 ADD HL,HL
MUL045 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:RET
MUL094 ADD HL,HL
MUL047 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:RET
MUL098 ADD HL,HL
MUL049 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:RET
MUL102 ADD HL,HL
MUL051 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:RET
MUL106 ADD HL,HL
MUL053 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:RET
MUL110 ADD HL,HL
MUL055 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL114 ADD HL,HL
MUL057 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL118 ADD HL,HL
MUL059 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL122 ADD HL,HL
MUL061 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL126 ADD HL,HL
MUL063 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:RET
MUL065 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:RET
MUL067 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:RET
MUL069 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:RET
MUL071 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:RET
MUL073 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:RET
MUL075 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:RET
MUL077 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:RET
MUL079 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:RET
MUL081 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:RET
MUL083 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:RET
MUL085 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL087 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:RET
MUL089 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:RET
MUL091 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:RET
MUL093 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:RET
MUL095 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:RET
MUL097 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:RET
MUL099 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:RET
MUL101 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:RET
MUL103 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:RET
MUL105 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL107 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL109 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:RET
MUL111 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:RET
MUL113 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL115 LD E,L:LD D,H:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:RET
MUL117 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:RET
MUL119 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL121 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL123 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL125 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:RET
MUL127 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:RET
;
NEG064 ADD HL,HL
NEG032 ADD HL,HL
NEG016 ADD HL,HL
NEG008 ADD HL,HL
NEG004 ADD HL,HL
NEG002 ADD HL,HL
NEG001 LD A,H:NEG:RET
NEG096 ADD HL,HL
NEG048 ADD HL,HL
NEG024 ADD HL,HL
NEG012 ADD HL,HL
NEG006 ADD HL,HL
NEG003 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG080 ADD HL,HL
NEG040 ADD HL,HL
NEG020 ADD HL,HL
NEG010 ADD HL,HL
NEG005 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG112 ADD HL,HL
NEG056 ADD HL,HL
NEG028 ADD HL,HL
NEG014 ADD HL,HL
NEG007 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG072 ADD HL,HL
NEG036 ADD HL,HL
NEG018 ADD HL,HL
NEG009 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG088 ADD HL,HL
NEG044 ADD HL,HL
NEG022 ADD HL,HL
NEG011 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:NEG:RET
NEG104 ADD HL,HL
NEG052 ADD HL,HL
NEG026 ADD HL,HL
NEG013 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG120 ADD HL,HL
NEG060 ADD HL,HL
NEG030 ADD HL,HL
NEG015 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG068 ADD HL,HL
NEG034 ADD HL,HL
NEG017 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG076 ADD HL,HL
NEG038 ADD HL,HL
NEG019 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG084 ADD HL,HL
NEG042 ADD HL,HL
NEG021 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:NEG:RET
NEG092 ADD HL,HL
NEG046 ADD HL,HL
NEG023 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG100 ADD HL,HL
NEG050 ADD HL,HL
NEG025 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:NEG:RET
NEG108 ADD HL,HL
NEG054 ADD HL,HL
NEG027 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:NEG:RET
NEG116 ADD HL,HL
NEG058 ADD HL,HL
NEG029 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:ADD HL,BC:LD A,H:NEG:RET
NEG124 ADD HL,HL
NEG062 ADD HL,HL
NEG031 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG066 ADD HL,HL
NEG033 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG070 ADD HL,HL
NEG035 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:NEG:RET
NEG074 ADD HL,HL
NEG037 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:NEG:RET
NEG078 ADD HL,HL
NEG039 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG082 ADD HL,HL
NEG041 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:NEG:RET
NEG086 ADD HL,HL
NEG043 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG090 ADD HL,HL
NEG045 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG094 ADD HL,HL
NEG047 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG098 ADD HL,HL
NEG049 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:NEG:RET
NEG102 ADD HL,HL
NEG051 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:NEG:RET
NEG106 ADD HL,HL
NEG053 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:NEG:RET
NEG110 ADD HL,HL
NEG055 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG114 ADD HL,HL
NEG057 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG118 ADD HL,HL
NEG059 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG122 ADD HL,HL
NEG061 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG126 ADD HL,HL
NEG063 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG065 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:NEG:RET
NEG067 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:NEG:RET
NEG069 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:NEG:RET
NEG071 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG073 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:NEG:RET
NEG075 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:NEG:RET
NEG077 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,BC:LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:NEG:RET
NEG079 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG081 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:NEG:RET
NEG083 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG085 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG087 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG089 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:NEG:RET
NEG091 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG093 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:NEG:RET
NEG095 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG097 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,BC:LD A,H:NEG:RET
NEG099 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG101 LD C,L:LD B,H:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD A,H:NEG:RET
NEG103 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG105 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG107 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG109 LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:ADD HL,DE:LD A,H:NEG:RET
NEG111 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG113 LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG115 LD E,L:LD D,H:ADD HL,HL:LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG117 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:LD E,L:LD D,H:ADD HL,HL:ADD HL,DE:ADD HL,HL:ADD HL,HL:ADD HL,DE:LD A,H:NEG:RET
NEG119 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG121 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG123 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG125 LD C,L:LD B,H:ADD HL,HL:LD E,L:LD D,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:OR A:SBC HL,DE:LD A,H:NEG:RET
NEG127 LD C,L:LD B,H:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:ADD HL,HL:OR A:SBC HL,BC:LD A,H:NEG:RET
NEG128 LD A,L:RR H:RRA:NEG:RET


Действительно ли процедура быстрая?

Destr
23.02.2017, 10:28
Проснулся только что и приснилось мне как сделать "умное" увеличение любой картинки в 2 раза. Так чтобы например шахматная сетка пикселей в участке изображения не растягивалась в сетку 2х2 пикселя, а оставалась прежней сеткой.
Суть идеи такова:
1. В исходной картинке работаем с блоками 2х2 пикселя.
2. В выходной картинке работаем с блоками 4х4.
3. Берем первый блок. Разбиваем его на две пары бит (верхние 2 и нижние 2). Получаем 4 бита в ряд. Это число от 0 до 15.
4. Полученое число - есть индекс чанка 4х4 который максимально "подходит" под такой расклад битов (2х2).
5. Впихиваем чанк в текущую позицию выходной картинки и переходим к следующей.
Ну и так до победного.
Чанки конечно подготовлены заранее.
Кому интересно (думается что Oleg N. Cher обрадуется этой теме) - может попробовать реализовать. Покажите потом что вышло, самому мне не до того пока что.
Если такое уже придумано и я открыл Америку - то пущай потрут пост (кто тут у нас модер).
За сим пока откланиваюсь, всех с праздником.

Shiny
23.02.2017, 11:14
Усложнил немношк.
Увеличение в 2 или в 4 раза?
Я реализовал увеличение 2х2, построил lut для байтов. для 4х4 делал только вывод текст 4х4, это надо искать, не помню как делал.

Bedazzle
23.02.2017, 13:53
Проснулся только что и приснилось мне как сделать "умное" увеличение любой картинки в 2 раза. Так чтобы например шахматная сетка пикселей в участке изображения не растягивалась в сетку 2х2 пикселя, а оставалась прежней сеткой.

Что-то похожее как раз обдумывал для компрессии масок к спрайтам.

Shiny
24.02.2017, 09:56
написал два вывода спрайта 2х2 и 4х4. Не ахти какая скорость, конечно же.
нужно нажать пробел для вывода 4х4.

Shiny
01.04.2017, 10:52
Камрады, наведите меня на истинный путь: нужно получить A*128

char
01.04.2017, 11:43
что-нибудь типа
ld h,a
xor a
rr h
rra
ld l,a

Shiny
17.06.2017, 16:07
61394
https://cs14029.userapi.com/c841235/v841235462/1831/sZY_fhLQEyU.jpg

Забыл об одной интересной статье (http://members.chello.at/easyfilter/bresenham.html) об алгоритмах Брезенхема. Вариант окружности очень интересный, я попытался его реализовать.

char
18.06.2017, 12:11
http://zx-pk.ru/threads/25602-algoritmy-risovaniya-okruzhnosti-i-over-1.html?p=836719&highlight=#post836719

Shiny
18.06.2017, 12:30
Есть разница: 4 и 8.

А за подобный код


ld hl,_NULL
Y_CIRC equ $-2


давно пора расстреливать из *****мета.

shurik-ua
18.06.2017, 12:34
давно пора расстреливать из *****мета.
а чем это плохо кстати ?

Shiny
18.06.2017, 12:53
а чем это плохо кстати ?

трудно читать.



ld (Y_CIRC+1),hl

...
Y_CIRC: ld hl,0


так лучше, наверное?

shurik-ua
18.06.2017, 12:57
ну не знаю - дело вкуса имхо )

char
18.06.2017, 16:41
Есть разница: 4 и 8.

А за подобный код


ld hl,_NULL
Y_CIRC equ $-2


давно пора расстреливать из *****мета.

из *****мета надо расстреливать тех кто с *****метами. ))

во первых там 1996 год, а в пятых ) всё там норм, - при замене, скажем, hl на ix, - и быстрее редактируется, и меньше шансов словить ошибку по недосмотру: Y_CIRC+1 или Y_CIRC+2...
а по _NULL/_HLHL/_DEDE/_BCBC/... и т.д. - легче искать/видеть - где именно изменяемая команда, а не банальный 0.



ld (Y_CIRC+1),hl

...
Y_CIRC: ld hl,0

shurik-ua
18.06.2017, 16:48
не знаю было или нет, но вдруг не было и кому-то пригодится
печать байта в HEX формате - вродебы меньше по памяти сделать не получится.


PRINT_HEX
ld b,a
and $f0
rrca
rrca
rrca
rrca
call hex2
ld a,b
and $0f
hex2
cp 10
jr nc,hex1
add 48
jp PRINT_CHAR
hex1
add 55
jp PRINT_CHAR

SaNchez
18.06.2017, 17:12
PRINT_HEX
ld b,a
rrca
rrca
rrca
rrca
call hex1
ld a,b
hex1
and $0f
cp 10
jr c,hex2
add a,7
hex2
add a,48
jp PRINT_CHAR

Shiny
18.06.2017, 17:28
печать байта в HEX формате - вродебы меньше по памяти сделать не получится.

http://hype.retroscene.org/blog/567.html

а это повеселее:
http://hype.retroscene.org/blog/569.html

Shiny
19.06.2017, 08:08
Наверное, подобное изобретали, вот кот определения адреса данных символа в стандартном шрифте:


;HL=text message
ld a,(hl)
; push hl; если надо
;$3c00/8=$780
or 128
ld l,a
ld h,7
add hl,hl
add hl,hl
add hl,hl

jerri
19.06.2017, 09:57
Наверное, подобное изобретали, вот кот определения адреса данных символа в стандартном шрифте:


;HL=text message
ld a,(hl)
; push hl; если надо
;$3c00/8=$780
or 128
ld l,a
ld h,7
add hl,hl
add hl,hl
add hl,hl


зачем так сложно?



;HL=text message
; push hl; если надо
ld l,(hl)
;$3c00/4=$f00
add hl,hl
ld h,#0f
add hl,hl
add hl,hl

Shiny
19.06.2017, 10:41
окак(:

shurik-ua
19.06.2017, 12:12
;HL=text message
; push hl; если надо
ld l,(hl)
;$3c00/4=$f00
; add hl,hl ;11 tacts / 1 byte
sla l ;8 tacts / 2 bytes ; ну а вдруг надо )
ld h,#0f
add hl,hl
add hl,hl

Shiny
19.06.2017, 12:43
Маленький урок sizecoding:
sla l - 2 байта против add hl,hl - 1 байт.
Но в случае печати текста можно сделать и пошустрее.

shurik-ua
19.06.2017, 13:09
Маленький урок sizecoding:
дык я ж сразу и написал

Shiny
19.06.2017, 17:58
Буржуи объявили новое компо, написать эффект:

https://www.youtube.com/watch?v=d3zgfAx0_zs

как заявлено пока что 48 байт.

Shiny
30.06.2017, 07:45
В рамках пятницы



t_b:
ld hl,$2C0
td:
ld b,5
push hl
tl:
add hl,hl
jr nc,nol
inc l
nol:
djnz tl
ld (hl),5*8
pop hl
inc l
;L=X,H=Y(7-3 bit)
ld a,h
add a,8
ld h,a
cp $ba
jr nz,td
t_e:
jr $

SaNchez
30.06.2017, 08:18
Что это? :v2_dizzy_surrender:

Shiny
30.06.2017, 08:20
"Есть только один способ - проверить"(с)Семейка Адамс.

SaNchez
30.06.2017, 08:29
Проверил. Сначала залил экран значением #55, атрибуты #07. После выполнения атрибуты поменялись на #28 + появилась атрибутная диагональная полоска.

Shiny
30.06.2017, 09:34
значит, нечетко.

Shiny
03.07.2017, 16:07
А известен ли кому-то алгоритм нахождения простых чисел?
Согласно заметке (http://www.retroprogramming.com/2010/01/8-bit-home-computer-benchmarks.html) Бейсик просто отдыхает, причем на z80, а не на 6502

Гугл вывел на : http://forum.6502.org/viewtopic.php?p=40575

Может, есть что-то пошустрее и попонятнее?

Это неясно вообще:


10 X=0
20 N=1
100 N=N+1
110 A=N-1
120 A=A-1
130 #=A<2*200
140 B=N/A
150 #=%=0*100
160 #=120
200 ?=N
210 ?=""
220 X=X+1
230 #=X<20*100

Den1982
03.07.2017, 22:05
http://zxpress.ru/book_articles.php?id=209

Bedazzle
03.07.2017, 22:06
чиста на правах мозгового штурма:



Это неясно вообще:


10 X=0
20 N=1

100 N=N+1
110 A=N-1
120 A=A-1
130 #=A<2*200 переход на 200, если меньше двух
140 B=N/A
150 #=%=0*100 переход на 100, если целое
160 #=120 переход на 120

200 ?=N печать числа
210 ?=""
220 X=X+1
230 #=X<20*100 переход на 100, если меньше 20

Shiny
04.07.2017, 08:07
Bedazzle, спасибо

каюсь, я не прочитал тред (http://forum.6502.org/viewtopic.php?f=2&t=3472&sid=ffa822199594f9bc0d92328b58788468&start=15)

Наверное, проще использовать решето Эратосфена?



ld a,2
call $1601
ei
ld hl,0;$FBFF
ld de,$0001
ld b,$10
Loop:
inc hl
push hl
push bc
inc de

Sieve:
ld b,$FF
ld a,b
Loop2:
add hl,de
; ld (hl),a
push bc,de,hl
;печать
ld bc,hl
call 6683;
ld a,","
rst 10h
pop hl,de,bc
djnz Loop2

pop bc
pop hl
djnz Loop
;ret
jr $


Наверное, если сжать данные, то получится таблика 8КБайт?

Shiny
29.07.2017, 07:35
Из FaceBook:


; 16-bit xorshift pseudorandom number generator by John Metcalf
; 20 bytes, 86 cycles (excluding ret)

; returns hl = pseudorandom number
; corrupts a

; generates 16-bit pseudorandom numbers with a period of 65535
; using the xorshift method:

; hl ^= hl << 7
; hl ^= hl >> 9
; hl ^= hl << 8

; some alternative shift triplets which also perform well are:
; 6, 7, 13; 7, 9, 13; 9, 7, 13.

org 32768

xrnd:
ld hl,1 ; seed must not be 0

ld a,h
rra
ld a,l
rra
xor h
ld h,a
ld a,l
rra
ld a,h
rra
xor l
ld l,a
xor h
ld h,a

ld (xrnd+1),hl

ret


Как бы оценить, насколько качественный генератор?

Bedazzle
29.07.2017, 10:14
Как бы оценить, насколько качественный генератор?

Сгенерить длинную последовательность, сохраняя куски в файлы.
Потом на пц строить картинки разные. Для начала - первое число Х, второе У, третье - цвет (тут нужна будет поллитра).
Ну и визуально смотреть, насколько прослеживается система в полученной плазме. :)

Также можно в экселях сабтоталы разные сделать по числам - какое число сколько раз выпало, и т.п.

Shiny
08.08.2017, 07:20
Короче, вот что получилось:

http://i94.fastpic.ru/big/2017/0808/c7/ff2f7c579dec887baed1a0cafd70adc7.png

krt17
29.09.2017, 20:55
В 99% игр, где управление пойти вверх вниз вправо влево без диагоналей, при одновременном нажатии 2 клавиш срабатывает та что опрашивается раньше, меня это часто напрягало если нужно изменить направление резко надо помнить толи надо нажать точно, толи отпустить в зависимости от того куда в данный момент движется игрок. Раз уж занялся 3dgm решил сделать по нормальному. Может кому еще понравится идея

checkKey
ld a, (oldKey)
ld b, a
ld a, (joyKey)
ld (oldKey), a
ld c, a
xor b
ld b, a
ld a, (realKey)
ret z
and b
jr nz, .s1
ld a, c
and b
jr nz, .s2
.s1
ld a, c
.s2
ld (realKey), a
ret
joyKey db 0
oldKey db 0
realKey db 0

Vladson
29.09.2017, 21:48
Шынни, из той же оперы что всякие LFSR или LSFR не помню как он там называется, свою функцию он выполняет, он прост и его можно даже "железно" реализовать на простейшей логике, ждать от него звёзд с небес в отношении "случайности" я бы не стал...

Dart Alver
30.09.2017, 01:43
Делал спрей для BGE, потребовался генератор случайных чисел. Два забраковал - не заполняли область, в конце концов откопал в интернете метод Фибоначчи с запаздываниями и пожертвовал буфером в 256 байт (можно меньше, но тогда медленнее будет) жалко, но зато работает как надо.
А один из прежних (забыл как обзывать) приспособил для заполнения буфера. Так на вшивость не тестировал, но в спрее раскидывает равномерно и заполняет полностью.



RNDF ld hl,RNDbuff ; начальное заполнение буфера для RND ; адрес буфера кратен 256
ld c,0
1 ld a,r
and #07
ld b,a
ld a,#35
.seed EQU $-1
2 bit 0,a
jr z,3F
xor %01110000
3 rrca
djnz 2B
ld (.seed),a
ld (hl),a
inc l
dec c
jr nz,1B
ret


RND ; метод Фибоначчи с запаздываниями , использую буфер на 256 байт вместо 98 для удобства.
push hl,de,bc
ld de,RNDbuff+256-97 ; 97 a
.ia EQU $-2
ld hl,RNDbuff+256-33 ; 33 b
.ib EQU $-2
ld bc,RNDbuff ; 0 i
.ii EQU $-2
ld a,(de)
sub (hl)
ld (bc),a ; X[i]= X[i-a]-X[i-b]
inc l
inc c
inc e
ld (.ia),de
ld (.ib),hl
ld (.ii),bc
pop bc,de,hl
ret

blackmirror
30.09.2017, 15:15
Dart Alver, если уж делать большой буфер, то есть парочка вариантов поинтереснее:

rnd: jp x0

x0:
ld a,x1
ld (rnd+1),a
ld a,(x1_n+1)
x0_n: sub a,n
ld (x2_n+1),a
ret
....
xn:
ld a,x1
ld (rnd+1),a
ld a,(x0_n+1)
xn_n: sub a,n
ld (x1_n+1),a
ret


rnd:
push hl
p0: ld hl,ptr
inc l
; jr z, patch1
mov a,l
ld (p0+1),a
add a,ofs1
; jr z,patch2
ld (p1+1),a
ld a,(hl)
p1: ld l,n
sub a,(hl)
ld (hl),a
pop hl
ret
Первый вариант тратит 14 тактов на jp/ret, 20 тактов на правку команды jp, и 33 такта на вычисления. На генерацию одного байта тратится 67 тактов, недостаток только в том, что каждый элемент массива заменён кодом размером 14 байт.
Второй вариант хорошо работает, если сделать 256 элементов в буфере, чтобы записывать новый элемент на место одного из старых, тогда вычисления займут 104 такта. Если нужен буфер конкретного размера, то можно либо добавить условные переходы на подпрограммы, которые будут править указатели и менять ofs1 на ofs2 и обратно при достижении указателями конца буфера, либо добавить только один из них, а подпрограммы чуть усложнить, чтобы они убирали первый условный переход и вставляли второй и наоборот, тогда вместо 14 дополнительных тактов при буфере на 98 элементов в среднем мы будем терять 10.

Shiny
30.09.2017, 18:56
Куда уж поинтересней, jp/jr не быстрее?

blackmirror
01.10.2017, 16:41
Куда уж поинтересней, jp/jr не быстрее?
Это меня малость переглючило, я забыл что для ret нужно не только код команды прочитать, но и два байта вытащить из стека, и считал что ret выполняется за 4 такта, поэтому в сумме у меня получилось 14 тактов вместо 20.

Перебор генераторов вида x(n)=x(n-m)-x(n-1) позволил найти парочку весьма симпатичных:
Первый получается при m=22, с длиной цикла 2^22-1, если в изначальном массиве не все числа чётные.
Второй получается при m=37, с длиной цикла 2^37-2^19-2^18+1, если в изначальном массиве только одно нечётное число.
Если забить на сохранение hl, для 8-разрядного генератора можно использовать вполне компактный код:

rnd8: ld hl,buf-22
ld a,(hl)
inc l
jr z,rnd_2
rnd_1: sub a,(hl)
ld (hl),a
ld (rnd+1),hl
ret
rnd_2: ld l,-22
jp rnd_1
Для 16-разрядного, при m=22, можно использовать вариант с 11 подпрограммами по 19 байт каждая + 3 байта на модифицируемую команду jp:

rnd16: jp rnd_0

rnd_0: ld hl,nn
ld a,rnd_1
ld (rnd+1),a
ld a,(rnd_10+1)
sub a,l
ld l,a
sub a,h
ld h,a
ld (rnd_0+1),hl
ret
...

Shiny
01.10.2017, 17:08
Замудреный код. окажись он по адресу $60FE и посыплется.

Dart Alver
02.10.2017, 21:46
rnd:
push hl
p0: ld hl,ptr
inc l
; jr z, patch1
mov a,l
ld (p0+1),a
add a,ofs1
; jr z,patch2
ld (p1+1),a
ld a,(hl)
p1: ld l,n
sub a,(hl)
ld (hl),a
pop hl
ret


Подставил в спрей с ofs1=-22, работает вродебы нормально, заполняет область целиком, прирост в скорости в моём случае не определяется вовсе, разве что экономия десятка байтов кода, хотя при буфере 256 b тоже не особо существенно но тем не менее ))
По поводу вообще... Я скажем так в гсч вообще 0.0, поэтому брал готовую формулу из интернета X[i]=X[i-a]-X[i-b] с рекомендованными значениями a=97, b=33. У вас немного попроще X[i]=X[i-a]-X[i-1] и в принципе для моей цели она вполне подошла, так что респект. ))

А тут что-то вы перемудрили - не работает ))





rnd8: ld hl,buf-22
ld a,(hl)
inc l
jr z,rnd_2
rnd_1: sub a,(hl)
ld (hl),a
ld (rnd+1),hl
ret
rnd_2: ld l,-22
jp rnd_1



Не понял логику в " rnd_1: sub (hl) " , когда l<>0. А результат - зацикливается гдето на десятке точек.

blackmirror
02.10.2017, 22:40
А тут что-то вы перемудрили - не работает ))
Смысл всех переходов в этом коде, чтобы перезагрузить указатель на текущий элемент, если он дошёл до конца буфера, а адрес конца буфера должен быть кратен 256 байтам. Можно inc заменить на dec, а -22 на +22, чтобы buf указывал на начало буфера, но тогда буфер нужно увеличить на 1 элемент, поскольку 0й не будет использоваться. А так код вычисляет x[n]=x[n-1]-x[n-22] и записывает на место x[n-22]. Минимум данные вместе с кодом займут 40-41 байт, если делать буфер 256 байт, то можно выкинуть условный переход и выиграть 7 тактов.

Reobne
03.10.2017, 06:27
ld (rnd8+1),hl

Shiny
03.10.2017, 08:05
ГСЧ - полная засада. Я бился над chaosgame, получилось так, что период случайных чисел короток.
на помощь пришло ROM(подобный трюк использовался в Fractals/Alan Cox)62390

Dart Alver
03.10.2017, 21:56
ld (rnd8+1),hl
Ну это естественно, в первом варианте тоже не mov а ld
Проверочный код был:


RND push hl
ld hl,RNDbuff+256-22
.bfadr EQU $-2
ld a,(hl)
inc l
jr z,.rnd_2
.rnd_1 sub a,(hl)
ld (hl),a
ld (.bfadr),hl
pop hl
ret
.rnd_2 ld l,-22
jp .rnd_1



А так код вычисляет x[n]=x[n-1]-x[n-22] и записывает на место x[n-22].

Не прокатывает, выдаёт повторяющуюся последовательность из 9-12 точек (по разному от начального буфера)
Вот скрины при первом варианте и при этом

62400 62401

blackmirror
03.10.2017, 22:58
Dart Alver,
RNDbuff на 256 байт выровнен, и действительно ли начальные числа попадают куда нужно? Вообще этот генератор очень похож на CRC с полиномом x^22+x^21+1, хоть он и прост, но генерируемая последовательность имеет период 2^22-1 и в этих пределах любые 22 подряд идущих бита(младшие разряды нашего генератора) будут встречаться ровно один раз.

Dart Alver
03.10.2017, 23:53
RNDbuff на 256 байт выровнен, и действительно ли начальные числа попадают куда нужно?
Разумеется да.
Нашел причину, она в неправильной формуле. Правильно должно быть X[n]=X[n-22]-X[n-1] а не наоборот.
Если заменить строку


.rnd_1 sub a,(hl)

на


.rnd_1 neg
add a,(hl)


Всё становится так как и должно быть. ))

Dart Alver
04.10.2017, 21:04
blackmirror, Дико извиняюсь, был неправ. С формулой всё в порядке. Ошибка была в компиляции, нужно было писать не sub a,(hl) , а sub (hl). SjASMPlus команду sub a,(hl) понимает как sub a : sub (hl), а я забыл это поправить отсюда и все косяки были ))

shurik-ua
04.10.2017, 22:16
SjASMPlus команду sub a,(hl) понимает как sub a
тоже помню вечерочек скоротал, отлавливая безобидное xor e,l )

Shiny
29.10.2017, 18:53
Наверное, пригодится:
https://github.com/impomatic/z80snippets

Shiny
26.11.2017, 10:19
Писал эффект появления картинки для мегадемо, вышло слишком заморочено. Вот другой вариант, но показ выходит слишком медленный.

Destr
09.02.2018, 09:33
Беззнаковое деление 8/8=8.8
(по мотивам Программистам - Алгоритмы работы и примеры процедур для быстрых вычислений на асемблере (http://zxpress.ru/article.php?id=9903))
Из недостатков - юзается доп-регистр (в данном случае D, но можно любой) и числа должны быть беззнаковые.


; H.L=H/A (D=corrupt)
NEG:LD D,A ; 8+4=12
XOR A:LD L,A ; 4+4=8
RL H,H ; 8+8=16
DUP 7
RLA ; 4
ADD A,D ; 4
JP C,1F ; 10
SUB D ; 4
1 RL H ; 8
EDUP ; t=30
DUP 8
RLA ; 4
ADD A,D ; 4
JP C,2F ; 10
SUB D ; 4
2 RL L ; 8
EDUP ; t=30
; 12+8+16+(30*7)+(30*8)=486 тактов в пиковом случае (min=426)

Наверное сейчас это уже никому не надо, но для понимания двоичной математики ковырял-ускорял. Быстрей вроде не получается или это я уже "замылился".

Shiny
09.02.2018, 10:05
NEG:LD D,A
непонятно(

Destr
09.02.2018, 10:19
непонятно(
Всё просто - вместо того чтоб делать CP D или SUB D - юзается не прямой делитель, а с обратным знаком.
Классический алгоритм (без NEG):


DUP 8
RLA
SUB D
JP NC,1F
ADD A,D
1 RL H
EDUP

Даст правильный ответ, но в инверсном виде, т.е. после всего надо ещё делать LD A,H:CPL:LD H,A (почему так - лучше разобратся как происходит двоичное деление)
А если делитель инвертировать - то заменой SUB/ADD/JP - можно добится что флаг С сразу будет выставлятся "наоборот".
На понимание этого и эксперименты я потратил пару дней (в свободные минуты на работе) :)
Вообще изначально код из статьи был этот:


1.1 Пример_простейшей_процедур ы_деления:

НА ВХОДЕ : C = Делимое, В = Делитель
НА ВЫХОДЕ: L = результат, A = остаток

;L=C/B:
DIVIS XOR A ;обнуление текущего остатка
DIVIS2 LD L,#01 ;счетчик (сдвиг 8 раз)
D1 RL C ;чтение текущего разряда
RLA ;накопитель разрядов
CP B ;какой результат текущего разряда
JR C,ZER ;переход,если текущий разряд=0
SUB B ;тек.разряд=1,снятие с накопителя
SLI L ;занесение разряда=1
JR NC,D1 ;переход,если счетчик не переполнился
RET ;выход
ZER SLA L ;занесение разряда=0
JR NC,D1 ;переход,если счетчик не переполнился
RET ;выход

krt17
17.02.2018, 00:11
Destr красава, особенно полезно для 8 бит результата плюс остаток.
Небольшой макрос для вычисления адреса в пиксельном экрана познакоместно. Раньше мучался, сейчас использую постоянно.

macro at x,y
db (y&0x07)*0x20+x
db (y&0x18)+0x40
endm

Destr
17.02.2018, 21:42
Небольшой макрос для вычисления адреса в пиксельном экрана познакоместно
Это где такое возможно???
(в подписи: "Лапоть, кроме STORM и sjAsm ничерта не умею")

Black Cat / Era CG
17.02.2018, 21:52
Это sjasm

Shiny
18.02.2018, 07:39
похоже, что х=0..31

Shiny
20.02.2018, 10:26
подсмотрено в FaceBook

Shiny
22.03.2018, 10:27
встретился интересный алгоритм построения окружностей, близко к Minskytron(PDP1).
Кто-нибудь сделает на ассемблере?

Знахарь
22.03.2018, 11:48
Это где такое возможно???
(в подписи: "Лапоть, кроме STORM и sjAsm ничерта не умею")

ну чего ж таак сразу, в alasm у меня в свое время тоже были подобные макросы в ассортименте - удобно.

Shiny
26.04.2018, 10:36
Найдено в некотором блоге:


;input:
;BC=Y.X
output:
;HL=screen address

pixelAddress:: ld a, b
and %00000111
ld h, a ; h contains Y2-Y0
ld a, b
rra
scf ; set bit 14
rra
rra
ld l, a ; l contains Y5-Y3
and %01011000
or h
ld h, a ; h is complete now
ld a, c ; divide X by 8
rr l ; and rotate Y5-Y3 in
rra
rr l
rra
rr l
rra
ld l, a ; l is complete now
ret

Vladson
26.04.2018, 16:59
Кстати по поводу круга выше (Minskytron) это всё тот же часто обсуждаемый алгоритм. Ускорить можно тем что отрисовывать сразу 8 точек за одно вычисление, обсуждали его тут много. Вот тут проще понять что к чему (где радиусы итд) 65144

Ну или чтоб не отвлекаться можно и по одному, просто дольше
65146

Кстати количество циклов (два пи эр) на асме можно считать Y / 40
(256/81 хоть и грубое, но достаточно простое и близкое приближение числа пи)

Знахарь
27.04.2018, 10:49
Destr красава, особенно полезно для 8 бит результата плюс остаток.
Небольшой макрос для вычисления адреса в пиксельном экрана познакоместно. Раньше мучался, сейчас использую постоянно.

macro at x,y
db (y&0x07)*0x20+x
db (y&0x18)+0x40
endm


Вот, кстати, нашлись подобные макросы в Alasm:

alasm:

Вычисление экранного адреса.

getS метка,3,4*8 (4пикселя и *8 для знакомест)

\0 - Имя создаваемой переменной
\1 - X coord (в знакоместах)
\2 - Y coord (в пикселях)

MACRO getS ; label,X,Y ($-SCR)
\0 EQU Ss
\0=\0+((\2)&192*32)+((\2)&7*256)+((\2)&56*4)+((\1)&31)

ENDM



Вычисление адреса в атрибутах.

get@ метка,X,Y

\0 - Имя создаваемой переменной
\1 - X координата (в знакоместах)
\2 - Y координата (в знакоместах)

MACRO get@ ; label,Xat,Yat (@-ATTR)
\0 EQU As
\0=\0+((\2)*32)+((\1)&#1F)

ENDM

Знахарь
08.05.2018, 20:54
коллеги, а никто не желает запостить этюдик поворот спрайта на 90 градусов? Простой - кратный знакоместу. Хватит для 8х8 точек и 16х16 точек

char
09.05.2018, 10:26
навскидку, будет что-то такое:



symrot:
ld b,#08
lp_rot1:
push hl
ld a,#80
lp_rot2:
rlc (hl)
inc hl
rra
jr nc,lp_rot2

pop hl
ld (de),a
inc de
djnz lp_rot1

ret


для 2*2, можно дописать сверху:



symrot4:
call symrot2
ld c,#08
add hl,bc

symrot2:
push hl
ld bc,#0010
add hl,bc
call symrot
pop hl


не проверялось, возможно где-то что-то просмотрел :D

blackmirror
09.05.2018, 12:12
Если рассматривать вариант отражения спрайта 8x8 относительно диагонали (поворот на 90* получается при записи строк в обратном порядке, но с диагональю проще объяснять), то нужно выполнить следующие операции:
1) разделить блок 8x8 на 4 части, два блока на диагонали оставить на месте, два других переставить.
2) разделить каждый блок 4x4 на 4 части, два блока на диагонали оставить на месте, два других переставить.
3) разделить каждый блок 2x2 на 4 точки, две точки на диагонали оставить на месте, две другие переставить.
При желании данные шаги можно выполнять и в другом порядке.

Для выполнения 1 шага нужно загрузить первые 4 строки в BCDE, далее используя команду RLD и регистр A обменять младшие половины загруженныx строк со старшими половинами строк лежащих в памяти(два блока в памяти при этом будут переставлены, но это можно исправить сдвинув каждую строку 4 командами RLC или RRC, когда дело дойдёт до второй половины спрайта).

Для выполнения 2 шага нужно провести следующие вычисления:
A=(B^(D>>2))&0x33;
B^=A;
D^=A<<2;
и аналогично для строк C и E

Третий шаг выглядит аналогично, только сдвиг будет не на 2, а на 1, и маска будет 0x55 вместо 0x33.
Теперь первая половина спрайта готова и нужно загрузить и выполнить 2 и 3 шаг для второй половины спрайта.

Shiny
09.05.2018, 13:37
с 16х16 вышло так

char
09.05.2018, 15:17
если 16*16 графика идет не посимвольно, а 2 байта * 16 строк, то тогда можно вот так, без ix/iy :D


rot16:
call rot16a
inc hl

rot16a:
ld bc,#0880
lp_r161:
push hl
ld a,c
lp_r162:
rlc (hl)
inc hl
inc hl
rra
jr nc,lp_r162

ex af,af'

ld a,c
lp_r163:
rlc (hl)
inc hl
inc hl
rra
jr nc,lp_r163

ld (de),a
inc de
ex af,af'
ld (de),a
inc de

pop hl
djnz lp_r161

ret

Shiny
09.05.2018, 15:22
если 16*16 графика идет не посимвольно, а 2 байта * 16 строк, то тогда можно вот так, без ix/iy

это зеркальное отражение по вертикали.

char
09.05.2018, 15:32
это зеркальное отражение по вертикали.

где? ...сходил, проверил, все нормально сработало, даже без ошибок :D

вставь к себе

ld hl,spr
ld de,spr+32
push de
call rot16
pop hl
push de
call rot16
pop hl
push de
call rot16
pop hl

Shiny
09.05.2018, 16:01
мда. не увидеть такого простого решения:v2_dizzy_facepalm:

стареем.

krt17
09.05.2018, 20:35
Просто 2 на 2 вращать не очень интересно поэтому от меня произвольного размера

;in hl - original
; de - destination
; bc - height weight
sprRotate
ld a, e
add a, b
ld e, a
jr nc, $+3
inc d
dec de
ld a, c
.l3 ; цикл по строкам
push af
ld a, 0x08
.l2 ; цикл по линиям
push af
push hl
push bc
ld a, b
.l1 ; цикл по байтам в линии
push af
ld b, 0
ld a, 0x80
.l0 ; цикл по байтам
rlc (hl)
rra
jr c, .s1
add hl,bc
jr .l0
.s1
add hl,bc
ld (de), a
dec de
pop af
dec a
jr nz, .l1
pop bc
push bc
ex de, hl
ld c, b
ld b, a
add hl, bc
add hl, bc
ex de, hl
pop bc
pop hl
pop af
dec a
jr nz, .l2
inc hl
pop af
dec a
jr nz, .l3
ret

Ну и проверка со спрайтом на злобу дня так сказать

char
10.05.2018, 14:54
навскидку, можно сделать колдунства:



inc d
; dec de ;удалили
ld a, c
...
dec de ;вставили
ld (de), a
; dec de ;удалили

-1 байт




; ld a, b ;удалили
.l1 ; цикл по байтам в линии
; push af ;удалили
push bc ;вставили

;...


; pop af ;удалили...
; dec a
; jr nz, .l1
; pop bc
; push bc
; ex de, hl
; ld c, b
; ld b, a
pop bc ;вставили...
djnz .l1
pop af
push af
ld c,a
ex de, hl

-3 байта




rlc (hl)
rra
; jr c, .s1 ;удалили...
; add hl,bc
; jr .l0
;.s1
; add hl,bc
ex af,af' ;вставили...
add hl,bc
ex af,af'
jr nc,.l0

-1 байт


если захотелось слегка ускорить внутренний цикл, то можно так:



ld a, 0x80
rlc (hl)
rra
.l0 ; цикл по байтам
add hl,bc
rlc (hl)
rra
; jr c, .s1
; add hl,bc
; jr .l0
;.s1
; add hl,bc
jr nc,.l0
add hl,bc

+1 байт

:D

krt17
10.05.2018, 21:22
Ну первым делом нужно убрать двойной add hl,bc если уж кому то интересна битва за байты, мне совсем нет, основной посыл вертеть оберон.

Shiny
10.05.2018, 22:11
если экономить байты, то можно цикл выделить в процедуру.

char
11.05.2018, 01:22
что-то у меня мотивация пропадает что-то кому-то писать здесь в редкое свободное время :D

быстро сходу было вырезано-сэкономлено аж 5 байт тремя блоками действий.

в курсе как вырезать еще? - доведите до ума этюды для посетителей, будет всем полезно... :) понты к коду не пришьешь

Shiny
11.05.2018, 11:00
Известная задача - преобразовать число 0-15 в код hex:



;8 bytes
cp 9+1
jr c,no7
add a,7
no7:
add a,"0"

;8 bytes
and 0Fh
add a, 90h
daa
adc a, 40h
daa

;7 bytes
and $0F
cp 10
sbc a,$69
daa


но разница все де есть, да?

char
11.05.2018, 13:58
вроде было уже где-то на форуме, а так, понятно, что коротко и приятно, давно ж юзается :D

http://optotech.net.br/msx/v6z80/v6z80p-code-2076-trunk/FLOS/inc/commands/d.asm


; DIS-Z80 by John Kerr, published in the SUBSET column of Personal Computer World 1987.
...
HEXOP AND $0F
CP 10
SBC A,$69
DAA

Shiny
11.05.2018, 14:14
вроде было уже где-то на форуме, а так, понятно, что коротко и приятно, давно ж юзаетс

дам наводку: а где тут DAA?

char
11.05.2018, 14:24
дам наводку: а где тут DAA?

не понятен вопрос, DAA есть и там, и там :D

Shiny
11.05.2018, 14:52
не понятен вопрос, DAA есть и там, и там

sapienti sathttp://sysadmins.ru/images/smiles/smiley.gif

char
11.05.2018, 14:58
пока видно, что 1987 год списан из больших в маленькие буквы, и там и там 7 байт, дальше пошло зафлуживание :D

Shiny
11.05.2018, 15:17
дальше пошло зафлуживание

хорошо постарался

Знахарь
11.05.2018, 20:44
я тоже не возьму в толк DAA - объясните, что не так - 5 минут побыть дураком очень полезно.

Процедурки поворота на 90 град - отличные. И потраченное редкое свободное время оценено. Хорошо, друзья, а возможен ли табличный вариант или еще что-то - выжать скорость. Ну, разумеется, без фанатизма на полпамяти )))

Shiny
11.05.2018, 20:57
Хорошо, друзья, а возможен ли табличный вариант или еще что-то - выжать скорость.

лукап возможен по идее, но придется пожертвовать памятью ради скорости. проще, как в написанном примере заранее подготовить повернутые спрайты.



я тоже не возьму в толк DAA
в Бейсике есть аналог DAA? дада, и не у всех процов есть инструкцыя.

drbars
14.05.2018, 14:47
Тут стало снова интересно :)

Вот, генерация автомаски тайла 16х16 из Диззика. Кто быстрее? :v2_dizzy_step:



;---------------------------------------------------------------
; Генерация автомаски тайла
CREATE_AUTOMASK:
LD HL,FOREGND_BUF ; Сдвиг вверx
LD DE,FOREGND_BUF+4
LD C,#0F

LD B,C
JR UP_CPY1
UP_CPY2 INC E
INC E
INC E
INC L
INC L
INC L
UP_CPY1 LD A,(DE)
INC E
OR (HL)
LD (HL),A
INC L
LD A,(DE)
OR (HL)
LD (HL),A
DJNZ UP_CPY2
EX DE,HL ; Сдвиг вниз
LD B,C
JR DN_CPY1
DN_CPY2 DEC E
DEC E
DEC E
DEC L
DEC L
DEC L
DN_CPY1 LD A,(DE)
DEC E
OR (HL)
LD (HL),A
DEC L
LD A,(DE)
OR (HL)
LD (HL),A
DJNZ DN_CPY2
EX DE,HL
INC C ; Сдвиг вправо
LD B,C
RR_LP2 LD E,(HL)
LD A,E
RRA
OR E
LD (HL),A
INC L
RR E
LD A,(HL)
RRA
OR (HL)
LD (HL),A
INC L
INC L
INC L
DJNZ RR_LP2
LD B,C ; Сдвиг влево и инверсия
RL_LP2 DEC L
DEC L
DEC L
LD E,(HL)
LD A,E
RLA
OR E
CPL
LD (HL),A
DEC L
RL E
LD A,(HL)
RLA
OR (HL)
CPL
LD (HL),A
DJNZ RL_LP2
RET


- - - Добавлено - - -

Можно ещё попробовать придумать быстрый алгоритм, который может сделать маску с заливкой пустот внутри.

Знахарь
14.05.2018, 15:33
а есть какие-то параметры вход/выход, особенности, ограничения?

Shiny
14.05.2018, 15:41
я чужой на этом празднике жизни(:

Знахарь
14.05.2018, 15:46
Шынни, давай не скромничай! Лучше станцуй на столе со своим вариантом ;))

drbars
14.05.2018, 16:40
а есть какие-то параметры вход/выход, особенности, ограничения?
Формат хранения спрайта и маски для него. 2 через 2.

ZX_NOVOSIB
15.05.2018, 18:10
Один товарищ написал (https://busy.speccy.cz/tvorba/usr0.htm) волшебную процедуру, которая мягко убивает 128-ой бейсик, не прерывая выполнение самой бейсик-программы. Как известно, если бейсик запущен в 128-ом варианте, то он и работает медленнее, и буфер принтера занимает и т.д. С этой же процедурой - всё зашибись. Есть только один вопрос, реально ли её сделать покороче 45-ти байт? :)



OUTPUT Usr0x02.bas

org #5CCB

;; Three basic lines

line1 dw #0100,lenln1-4
db REM,'Busy soft 07.04.2017',#0D

line2 dw #0200,lenln2-4
db RAND,USR,VAL,'"',PEEK,'23627+256*',PEEK,'23628+3"',#0D

line3 dw #0300,lenln3-4
db LOAD,'""',#0D

;; Basic variables

varss db 'S'+#80 ;; Variable s$
dw lencod ;; Length of whole variable content

OUTPUT Usr0x02.cod

;; Content of variable s$

start res 4,(iy+#01) ;; Switch to 48 basic
ld hl,(ramtop) ;; Recontruction of stack for 48 basic
ld (hl),#3E ;; End-of-stack mark for basic RETURN
dec hl ;; (for detect RETURN without GOSUB)
ld sp,hl
ld hl,main ;; Standart error handler
push hl ;; (for displaying error messages)
ld (errsp),sp

ld hl,inican
ld de,canmem ;; Base address for channel information
ld bc,21
ld (chans),de
ldir
ld l,low stdata ;; Initial open channels
ld e,low strms
ld c,low 14
ldir

jp runbas ;; Continue in 48 basic interpreter

endend

;; Lengths

lenln1 = line2-line1
lenln2 = line3-line2
lenln3 = varss-line3
lenbas = varss-line1
lencod = endend-start
lenall = endend-line1

;; Basic tokens

REM = #EA
RAND = #F9
VAL = #B0
USR = #C0
PEEK = #BE
LOAD = #EF

;; Used ROM addresses

main = #1303
inican = #15AF
stdata = #15C6
runbas = #1BF4

;; Used system variables

strms = #5C10
errsp = #5C3D
chans = #5C4F
ramtop = #5CB2
canmem = #5CB6

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

creator
15.05.2018, 19:45
процедуру, которая мягко убивает 128-ой бейсик, не прерывая выполнение самой бейсик-программы
А я всегда использовал для этого дела кусок от загрузчика TASM. Например (http://zx-pk.ru/threads/297-chity-v-igrakh.html?p=823460&viewfull=1#post823460).