Просмотр полной версии : Библиотека нужных процедур для написания демо
Помогите!!!!
Имеем
В 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
Ещё вопрос, что-то я ассемблер вообще забыл, запарился с условиями
в HL адрес в экране
увеличиваю его командами:
INC L
INC L
Как мне правую границу проверить? если вышла за предел экрана вернуть на начало строки
Вообщем смысл: если L>правой границы то L=L-32
NovaStorm
18.12.2012, 16:34
>если L>правой границы то L=L-32
AND 00011111b ?
Ещё вопрос, что-то я ассемблер вообще забыл, запарился с условиями
в HL адрес в экране
увеличиваю его командами:
INC L
INC L
Как мне правую границу проверить? если вышла за предел экрана вернуть на начало строки
Вообщем смысл: если L>правой границы то L=L-32
Завивисит от задачи.
Иначе в общем случае получится слишком топорно, типа:
LD A,L
AND C
CP C (в C - 0x1F)
JR Z, ...
INC L
>если 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
Не понимаю
Не понимаю
LD A,L - a = L
AND C - a = a AND 0x1F (оставляем только младшую часть 0..31)
CP C (в C - 0x1F) (сравниваем, если младшая часть байта равна 31)
JR Z, ... (то переходим туда, где можно отмотать к началу строки)
INC L (иначе прибавляем L на единицу)
забыл сказать: значения L у меня четные, и увеличиваются на 2
забыл сказать: значения L у меня четные, и увеличиваются на 2
Лучше привести смысловую часть алгоритма)
А я вот с оптимизацией условия мучаюсь :)
Вот например:
(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,переход
А с одним переходом как?
Допустим
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
Это только в верхней строке
Вот так нужно, только для любой строки
Как мне правую границу проверить?
BIT 5,L ?
Допустим
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
А вот так:
(H = 0) OR (L = 0) ТОГДА <переход>
LD A,L
OR A
JP Z,переход
LD A,H
OR A
JP Z,переход
А с одним переходом как?
Тоже зависит от контекста)
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 второй раз выручаешь за день
Не получается на смежных третях
Тоже зависит от контекста)
Контекст я уже с трудом сам вспоминаю :)
Но суть такова: Если H=0 или L=0 выполняется условие X, но H <> L всегда кроме условия H=L=0
Контекст я уже с трудом сам вспоминаю :)
Но суть такова: Если H=0 или L=0 выполняется условие X, но H <> L всегда.
Тогда твой пример подходит) И множество других подойдут)
Тогда твой пример подходит) И множество других подойдут)
Да, но я не могу придумать как сделать с одним переходом :)
А если значения от 32-64?
---------- Post added at 16:16 ---------- Previous post was at 16:11 ----------
Похоже на правду, спасибо Jerri второй раз выручаешь за день
Не получается на смежных третях
странно - не должно такого быть
hl - #50fe
d=#e0
l=#00
l=#e0
или я что то не понимаю?
Сейчас, я тестю :)
---------- 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, помоги
Да, но я не могу придумать как сделать с одним переходом :)
А вот такой вариант:
LD A,L
ADD 0xFF
SBC A,A
AND H
JR Z, ...
Сейчас, я тестю :)
---------- 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 этапа
прибавление смещения вниз
прибавление смещения вправо
иначе будут проблемы с третями
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
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
вот так побыстрее будет
А вот такой вариант:
LD A,L
ADD 0xFF
SBC A,A
AND H
JR Z, ...
Волшебный флаг C ? Шикарно! :v2_dizzy_roll:
Нужна процедура деления.
Вида: (+-)16/16=16.16
Кучу разных перебрал, но всё равно лажают, ибо заточены и подрезаны под конкретные задачи.
А нужно просто деление регистровой пары на пару с учётом знаков.
(ну или на крайняк - без знаков, но чтоб не лажала)
Есть у кого варианты?
;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
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
Вот такая у меня в Эйфории пашет безотказно:
Тоже врёт.
Или я что-то не так делаю?
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
это как?
это как?
Раздели на калькуляторе
Получишь: 1234/5678=0,21733004579
и ещё куча цифр, но нам такой точности не надо
Нам надо 16-ти битная дробная часть
т.е. умножаем это число на 65536 и получаем 14242 (#37A2)
Andrew771
11.02.2014, 10:12
аа, понял. Эта процедура только для целочисленного деления.
Смотри тут
Есть вроде подходящая процедура - 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 бит переделать?
Destr, там еще какая то таблица требуется
FDVW2 LD H,TBLOG2[
ты бы размерность таблицы посмотрел
ты бы размерность таблицы посмотрел
768 вроде
А что?
Смотри тут
Spectrum Expert #01 (http://www.zxpress.ru/article.php?id=11746)
Так, с делилкой вроде разобрались.
Как насчёт умножайки?
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
процедуры пройдут?
Вообще нужна процедура 16=16*16
Но хитрая.
Сейчас делаю так:
CALL IMULW ;HLDE=HL*DE
LD E,D,D,L
Т.е. нужны собственно не HLDE, а только LD
Как-бы сократить чтоб шустрей было?
denpopov
13.02.2014, 22:16
Как-бы сократить чтоб шустрей было?
если не секрет, что ты такого задумал-то?
если не секрет, что ты такого задумал-то?
Да какие там секреты, векторной графикой занялся.
Большой уже, хватит растром баловатся...
denpopov
13.02.2014, 22:37
Да какие там секреты, векторной графикой занялся.
я не такой эксперт, как в векторной(3d?) графике, но скорее всего мне кажется, что скорость упирается в растеризацию(суть отрисовку).
я не такой эксперт, как в векторной(3d?) графике, но скорее всего мне кажется, что скорость упирается в растеризацию(суть отрисовку).
Под растром я имел в виду спрайтовую графику.
А в векторной всё упирается в математику (ибо в отрисовку на спектруме упирается вообще всё, кроме может быть чисто текстовых адвентюр)
denpopov
13.02.2014, 23:44
Destr, не понял тебя, что ты имеешь в виду.
Destr, не понял тебя, что ты имеешь в виду.
Да что непонятно?
Отрисовка на спеке это всегда проблема.
А с векторной графикой - ещё и траблы с математикой прицепляются.
Итого: помимо быстрой отрисовки нужны ещё и быстрые вычисления.
Книга: А.Л.Гуртовцев, С.В.Гудыменко. "Программы для микропроцессоров".
Рассматриваются алгоритмы процедур вычисления и приводятся конкретные процедуры для процессора КР580ВМ80А.
denpopov
14.02.2014, 08:47
Итого: помимо быстрой отрисовки нужны ещё и быстрые вычисления.
Не знаю, что тебе посоветовать. Есть дема Paranoia, есть крэктро:
http://zxaaa.untergrund.net/view_demo.php?id=2656
3d эффект там шустрый, код похож, поэтому либо у авторов спрашивать исходники, либо изучать код самому. Имхо это лучше, чем ломать голову над скоростью.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot