Вход

Просмотр полной версии : Библиотека нужных процедур для написания демо



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

jerri
18.12.2012, 11:09
Помогите!!!!

Имеем
В HL - адрес в экране
Нужно перейти на 3 знакоместа вниз и на 2 вправо

Вот в атрибутах легко:
LD DE,98
ADD HL,DE

А в экранных адресах не могу

---------- Post added at 09:23 ---------- Previous post was at 09:20 ----------

Через треть не получается!
Можно конечно перевести в атрибуты
сделать:
LD DE,98
ADD HL,DE
и обратно в экран



ld a,l
add a,98
ld l,a
jr nc,l0
ld a,h
add a,8
ld h,a
l0

GM BIT
18.12.2012, 16:13
Ещё вопрос, что-то я ассемблер вообще забыл, запарился с условиями

в HL адрес в экране
увеличиваю его командами:
INC L
INC L
Как мне правую границу проверить? если вышла за предел экрана вернуть на начало строки
Вообщем смысл: если L>правой границы то L=L-32

NovaStorm
18.12.2012, 16:34
>если L>правой границы то L=L-32
AND 00011111b ?

Titus
18.12.2012, 16:36
Ещё вопрос, что-то я ассемблер вообще забыл, запарился с условиями

в HL адрес в экране
увеличиваю его командами:
INC L
INC L
Как мне правую границу проверить? если вышла за предел экрана вернуть на начало строки
Вообщем смысл: если L>правой границы то L=L-32

Завивисит от задачи.
Иначе в общем случае получится слишком топорно, типа:
LD A,L
AND C
CP C (в C - 0x1F)
JR Z, ...
INC L

GM BIT
18.12.2012, 16:49
>если L>правой границы то L=L-32
AND 00011111b ?
Это подходит для первой строки
А если это вторая строка? и L=32 до 64?

---------- Post added at 15:49 ---------- Previous post was at 15:48 ----------


Завивисит от задачи.
Иначе в общем случае получится слишком топорно, типа:
LD A,L
AND C
CP C (в C - 0x1F)
JR Z, ...
INC L
Не понимаю

Titus
18.12.2012, 16:52
Не понимаю

LD A,L - a = L
AND C - a = a AND 0x1F (оставляем только младшую часть 0..31)
CP C (в C - 0x1F) (сравниваем, если младшая часть байта равна 31)
JR Z, ... (то переходим туда, где можно отмотать к началу строки)
INC L (иначе прибавляем L на единицу)

GM BIT
18.12.2012, 16:56
забыл сказать: значения L у меня четные, и увеличиваются на 2

Titus
18.12.2012, 16:59
забыл сказать: значения L у меня четные, и увеличиваются на 2
Лучше привести смысловую часть алгоритма)

drbars
18.12.2012, 17:02
А я вот с оптимизацией условия мучаюсь :)

Вот например:
(H = 0) AND (L = 0) ТОГДА <переход> — это понятно



LD A,H
OR L
JP Z,переход


А вот так:
(H = 0) OR (L = 0) ТОГДА <переход>



LD A,L
OR A
JP Z,переход
LD A,H
OR A
JP Z,переход



А с одним переходом как?

GM BIT
18.12.2012, 17:03
Допустим


coor ld hl,16384
inc l
inc l
ld a,l
and 31
ld l,a
ld (coor+1),hl
ld (hl),255
jr coor

Это только в верхней строке

Вот так нужно, только для любой строки

drbars
18.12.2012, 17:04
Как мне правую границу проверить?
BIT 5,L ?

jerri
18.12.2012, 17:08
Допустим


coor ld hl,16384
inc l
inc l
ld a,l
and 31
ld l,a
ld (coor+1),hl
ld (hl),255
jr coor

Это только в верхней строке

Вот так нужно, только для любой строки




ld a,l
and #e0
ld d,a
inc l
inc l
ld a,l
and #1f
or d
ld l,a

Titus
18.12.2012, 17:10
А вот так:
(H = 0) OR (L = 0) ТОГДА <переход>



LD A,L
OR A
JP Z,переход
LD A,H
OR A
JP Z,переход



А с одним переходом как?
Тоже зависит от контекста)

GM BIT
18.12.2012, 17:16
BIT 5,L ?
А если значения от 32-64?

---------- Post added at 16:16 ---------- Previous post was at 16:11 ----------



Код:
ld a,l
and #e0
ld d,a
inc l
inc l
ld a,l
and #1f
or d
ld l,a
_________

Похоже на правду, спасибо Jerri второй раз выручаешь за день
Не получается на смежных третях

drbars
18.12.2012, 17:19
Тоже зависит от контекста)
Контекст я уже с трудом сам вспоминаю :)

Но суть такова: Если H=0 или L=0 выполняется условие X, но H <> L всегда кроме условия H=L=0

Titus
18.12.2012, 17:22
Контекст я уже с трудом сам вспоминаю :)

Но суть такова: Если H=0 или L=0 выполняется условие X, но H <> L всегда.
Тогда твой пример подходит) И множество других подойдут)

drbars
18.12.2012, 17:27
Тогда твой пример подходит) И множество других подойдут)
Да, но я не могу придумать как сделать с одним переходом :)

jerri
18.12.2012, 17:31
А если значения от 32-64?

---------- Post added at 16:16 ---------- Previous post was at 16:11 ----------



Похоже на правду, спасибо Jerri второй раз выручаешь за день
Не получается на смежных третях

странно - не должно такого быть

hl - #50fe
d=#e0
l=#00
l=#e0

или я что то не понимаю?

GM BIT
18.12.2012, 18:18
Сейчас, я тестю :)

---------- Post added at 16:54 ---------- Previous post was at 16:34 ----------

jerri, Все допер почему не получается, мне это условие нужно впихнуть в ту прогу которую ты раньше давал, без INC L: INC L

---------- Post added at 17:18 ---------- Previous post was at 16:54 ----------

jerri, помоги

Titus
18.12.2012, 18:22
Да, но я не могу придумать как сделать с одним переходом :)

А вот такой вариант:

LD A,L
ADD 0xFF
SBC A,A
AND H
JR Z, ...

jerri
18.12.2012, 18:24
Сейчас, я тестю :)

---------- Post added at 16:54 ---------- Previous post was at 16:34 ----------

jerri, Все допер почему не получается, мне это условие нужно впихнуть в ту прогу которую ты раньше давал, без INC L: INC L

---------- Post added at 17:18 ---------- Previous post was at 16:54 ----------

jerri, помоги

это сложнее
разложи на 2 этапа
прибавление смещения вниз
прибавление смещения вправо
иначе будут проблемы с третями

GM BIT
18.12.2012, 18:35
ddd1 ld a,e
add a,96
ld e,a
jr nc,ddd2
ld a,d
add a,8
ld d,a
ddd2
ld a,e
and 224
ld ixl,a
inc e
inc e
ld a,e
and 31
or ixl
ld e,a
ret


Спасибо!!!!! Вот что вышло и работает, переделал на ixl все регистры заняты

jerri
18.12.2012, 18:45
ddd1 ld a,e
add a,96
ld e,a
jr nc,ddd2
ld a,d
add a,8
ld d,a
ddd2
ld a,e
and 224
ld ixl,a
inc e
inc e
ld a,e
and 31
or ixl
ld e,a
ret


Спасибо!!!!! Вот что вышло и работает, переделал на ixl все регистры заняты



ddd1 ld a,e
add a,96
ld e,a
jr nc,ddd2
ld a,d
add a,8
ld d,a
ddd2
ld a,e
inc e
inc e

xor e
and #e0
xor e

ld e,a
ret


вот так побыстрее будет

drbars
18.12.2012, 19:20
А вот такой вариант:

LD A,L
ADD 0xFF
SBC A,A
AND H
JR Z, ...

Волшебный флаг C ? Шикарно! :v2_dizzy_roll:

Destr
10.02.2014, 18:43
Нужна процедура деления.
Вида: (+-)16/16=16.16
Кучу разных перебрал, но всё равно лажают, ибо заточены и подрезаны под конкретные задачи.
А нужно просто деление регистровой пары на пару с учётом знаков.
(ну или на крайняк - без знаков, но чтоб не лажала)
Есть у кого варианты?

GM BIT
11.02.2014, 07:11
;HL/DE=BC,HL-ОСТАТОК
DIVW LD A,E:OR D
RET Z
XOR A
LD C,A,B,A
EX DE,HL
DIVW1 INC B
BIT 7,H
JR NZ,DIVW2
ADD HL,HL
JP DIVW1
DIVW2 EX DE,HL
DIVW3 OR A
SBC HL,DE
JR NC,DIVW4
ADD HL,DE
DIVW4 CCF
RL C:RL A
RR D,E
DJNZ DIVW3
LD B,A
RET

Destr
11.02.2014, 07:36
GM BIT, что-то не работает как надо.
Пробую делить 1234 на 5678.
Должно получится: #000037A2 а получается #000004D2 (т.е. HL остаётся как был)

Andrew771
11.02.2014, 09:16
Вот такая у меня в Эйфории пашет безотказно:


; функция 16-разрядного беззнакового деления
; (C) Aleksey Malov aka Vivid
; little optimized by Vitaly Vidmirov
; hl = de/bc de = de%bc ~840 takts.
; hl = 65535, de = de(dividend) if bc(divisor) == 0.
div ld hl,65535
ld a,b
or c
ret z ; если bс=0


xor a ;меняем знак
sub c ; у делителя
ld c, a
sbc a, b
sub c
ld b, a
ld hl,0 ;обнулили новое делимое
ld a,d ;сначала двигаем
rla ;старший байт делимого
;t=18
; REPEAT 8
rl l ;
add hl,bc ;
jr c,$+4 ;8 раз
sbc hl,bc ;
rla ; t=8*45=360
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
; ENDR

ld d,a ;ст. байт результата
ld a,e ;теперь двигаем
rla ;младший байт t=12

; REPEAT 8
adc hl,hl ;
add hl,bc ;
jr c,$+4 ;8 раз
sbc hl,bc ;
rla ; t=8*52=416
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
; ENDR

ld e,a ;мл. байт результата
;hl-остаток от деления
;t=4
ex de, hl
ret

Destr
11.02.2014, 09:45
Вот такая у меня в Эйфории пашет безотказно:
Тоже врёт.
Или я что-то не так делаю?


DEVICE ZXSPECTRUM128
STARTFORSNA EQU #8C22
ORG STARTFORSNA
LD SP,#5C00

LD DE,1234
LD BC,5678
CALL div ; должно быть #37A2
JR $

; Andrew771
; функция 16-разрядного беззнакового деления
; (C) Aleksey Malov aka Vivid
; little optimized by Vitaly Vidmirov
; hl = de/bc de = de%bc ~840 takts.
; hl = 65535, de = de(dividend) if bc(divisor) == 0.
div ld hl,65535
ld a,b
or c
ret z ; если bс=0


xor a ;меняем знак
sub c ; у делителя
ld c, a
sbc a, b
sub c
ld b, a
ld hl,0 ;обнулили новое делимое
ld a,d ;сначала двигаем
rla ;старший байт делимого
;t=18
; REPEAT 8
rl l ;
add hl,bc ;
jr c,$+4 ;8 раз
sbc hl,bc ;
rla ; t=8*45=360
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
rl l
add hl,bc
jr c,$+4
sbc hl,bc
rla
; ENDR

ld d,a ;ст. байт результата
ld a,e ;теперь двигаем
rla ;младший байт t=12

; REPEAT 8
adc hl,hl ;
add hl,bc ;
jr c,$+4 ;8 раз
sbc hl,bc ;
rla ; t=8*52=416
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
adc hl,hl
add hl,bc
jr c,$+4
sbc hl,bc
rla
; ENDR

ld e,a ;мл. байт результата
;hl-остаток от деления
;t=4
ex de, hl
ret


; GM BIT
; HL/DE=BC,HL-ОСТАТОК
DIVW LD A,E:OR D
RET Z
XOR A
LD C,A,B,A
EX DE,HL
DIVW1 INC B
BIT 7,H
JR NZ,DIVW2
ADD HL,HL
JP DIVW1
DIVW2 EX DE,HL
DIVW3 OR A
SBC HL,DE
JR NC,DIVW4
ADD HL,DE
DIVW4 CCF
RL C:RL A
RR D,E
DJNZ DIVW3
LD B,A
RET

SAVESNA "test.sna",STARTFORSNA

Andrew771
11.02.2014, 09:49
Тоже врёт.
Или я что-то не так делаю?
1234 / 5678 = 0

---------- Post added at 09:49 ---------- Previous post was at 09:48 ----------


должно быть #37A2
это как?

Destr
11.02.2014, 09:54
это как?
Раздели на калькуляторе
Получишь: 1234/5678=0,21733004579
и ещё куча цифр, но нам такой точности не надо
Нам надо 16-ти битная дробная часть
т.е. умножаем это число на 65536 и получаем 14242 (#37A2)

Andrew771
11.02.2014, 10:12
аа, понял. Эта процедура только для целочисленного деления.

GM BIT
11.02.2014, 10:29
Смотри тут

Destr
11.02.2014, 14:52
Смотри тут
Есть вроде подходящая процедура - DIV 12/12=8.8


;DIV 12/12=8.8
;HL(SIGN)=HL(SIGN)/DE(UNSIGN)

FDIVW LD BC,0
EX DE,HL
INC H:DEC H
JR Z,FDVW2
.3 INC B:SRA H:JR Z,FDVW1:RR L
INC B:SRA H
FDVW1 RR L
FDVW2 LD H,TBLOG2[
LD A,(HL):INC H
LD H,(HL):LD L,A
ADD HL,BC
EX DE,HL
LD A,H:RLA
JR NC,FDVW3
LD A,L:CPL:LD L,A
LD A,H:CPL:LD H,A:INC HL
SCF
FDVW3 EX AF,AF
LD BC,#0800
INC H:DEC H
JR Z,FDVW5
.3 INC B:SRA H:JR Z,FDVW4:RR L
INC B:SRA H
FDVW4 RR L
FDVW5 LD H,TBLOG2[
LD A,(HL):INC H
LD H,(HL):LD L,A
ADD HL,BC
OR A:SBC HL,DE
JP M,FDVW8
LD A,H:LD B,A
LD H,TB2X[
LD L,(HL):LD H,1
SUB 8:JR NC,FDVW7
LD A,7:SUB B
LD ($+4),A
JR NZ,$
.7 ADD HL,HL
LD L,H,H,0
FDVW6 EX AF,AF
RET NC
LD A,L:CPL:LD L,A
LD A,H:CPL:LD H,A:INC HL
RET
FDVW7 LD A,#0F:SUB B
JR C,FDVW8
LD ($+4),A
JR NZ,$
.7 ADD HL,HL
JR FDVW6
FDVW8 LD HL,0
RET

А возможно её под 16 бит переделать?

jerri
11.02.2014, 15:02
Destr, там еще какая то таблица требуется



FDVW2 LD H,TBLOG2[


ты бы размерность таблицы посмотрел

Destr
11.02.2014, 15:15
ты бы размерность таблицы посмотрел
768 вроде
А что?

Titus
11.02.2014, 15:25
Смотри тут

Spectrum Expert #01 (http://www.zxpress.ru/article.php?id=11746)

Destr
11.02.2014, 19:06
Так, с делилкой вроде разобрались.
Как насчёт умножайки?
16*16=32 (HL*DE=HLDE)
Сейчас юзаю такую:


IMULW ; (+-) HLDE = HL*DE
LD A,H:XOR D:PUSH AF
BIT 7,H:CALL NZ,NEGHL
BIT 7,D:CALL NZ,NEGDE
CALL MULW
POP AF
RET P
NEGHLDE XOR A:SUB E:LD E,A
LD A,0:SBC A,D:LD D,A
LD A,0:SBC A,L:LD L,A
SBC A,H:SUB L:LD H,A
RET
MLW0 LD HL,0
RET
NEGHL XOR A:SUB L:LD L,A
SBC A,H:SUB L:LD H,A
RET
NEGDE XOR A:SUB E:LD E,A
SBC A,D:SUB E:LD D,A
RET
MULW ; HLDE = HL * DE
LD A,L:OR H:JR Z,MLW0
LD A,E:OR D:JR Z,MLW0
LD A,L,B,H:LD HL,0:OR A
JP Z,MLW3
DUP 8
RRA:JR NC,$+3:ADD HL,DE:RR H,L
EDUP
RRA:LD C,A
LD A,B
MULW1 OR A:JR Z,MLW2
DUP 8
RRA:JR NC,$+3:ADD HL,DE:RR H,L
EDUP
RRA:LD D,A,E,C
RET
MLW3 LD A,L,L,H,H,0
LD C,A,A,B
JR MULW1
MLW2 LD A,L,L,H,H,0
LD D,A,E,C
RET


Бывают быстрей?

denpopov
12.02.2014, 07:43
Ребята, а отсюда:
http://baze.au.com/misc/z80bits.html

процедуры пройдут?

Destr
13.02.2014, 22:15
Вообще нужна процедура 16=16*16
Но хитрая.
Сейчас делаю так:
CALL IMULW ;HLDE=HL*DE
LD E,D,D,L

Т.е. нужны собственно не HLDE, а только LD
Как-бы сократить чтоб шустрей было?

denpopov
13.02.2014, 22:16
Как-бы сократить чтоб шустрей было?
если не секрет, что ты такого задумал-то?

Destr
13.02.2014, 22:31
если не секрет, что ты такого задумал-то?
Да какие там секреты, векторной графикой занялся.
Большой уже, хватит растром баловатся...

denpopov
13.02.2014, 22:37
Да какие там секреты, векторной графикой занялся.
я не такой эксперт, как в векторной(3d?) графике, но скорее всего мне кажется, что скорость упирается в растеризацию(суть отрисовку).

Destr
13.02.2014, 23:08
я не такой эксперт, как в векторной(3d?) графике, но скорее всего мне кажется, что скорость упирается в растеризацию(суть отрисовку).
Под растром я имел в виду спрайтовую графику.
А в векторной всё упирается в математику (ибо в отрисовку на спектруме упирается вообще всё, кроме может быть чисто текстовых адвентюр)

denpopov
13.02.2014, 23:44
Destr, не понял тебя, что ты имеешь в виду.

Destr
14.02.2014, 00:11
Destr, не понял тебя, что ты имеешь в виду.
Да что непонятно?
Отрисовка на спеке это всегда проблема.
А с векторной графикой - ещё и траблы с математикой прицепляются.
Итого: помимо быстрой отрисовки нужны ещё и быстрые вычисления.

AndTorp
14.02.2014, 07:55
Книга: А.Л.Гуртовцев, С.В.Гудыменко. "Программы для микропроцессоров".
Рассматриваются алгоритмы процедур вычисления и приводятся конкретные процедуры для процессора КР580ВМ80А.

denpopov
14.02.2014, 08:47
Итого: помимо быстрой отрисовки нужны ещё и быстрые вычисления.
Не знаю, что тебе посоветовать. Есть дема Paranoia, есть крэктро:
http://zxaaa.untergrund.net/view_demo.php?id=2656

3d эффект там шустрый, код похож, поэтому либо у авторов спрашивать исходники, либо изучать код самому. Имхо это лучше, чем ломать голову над скоростью.