PDA

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



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

GM BIT
31.03.2014, 11:53
если использовать set'ы - 700*15=10 500т
+ inc h - 700*4=2800т
итого 12800, а есть около 18000 свободных

jerri
31.03.2014, 11:56
Помогите с оптимизацией построения вертикальной линии. То, что надумал я не устраивает по скорости
Дело в том, что на входе желательно только иметь адрес и кол-во точек

До начала построения основного экрана строится линия примерно из 350 точек, хочется выйти на 700 :)



/// вход hl,adr, b - длина

line ld hl,16384 ;начало линии
ld b,85
ld a,h
and 7
sub 8
neg
ld c,a
///

sc0 set 2,(hl) ;рисуем в одном знакоместе
inc h ;
dec c ;
jr z,sc1 ;
djnz sc0 ;
ret
sc1 ;переходим на знакоместо ниже
ld a,l
add a,32
ld l,a
jr c,sc3
ld a,h
sub 8
ld h,a
sc3 ld c,8
djnz sc0
ret


но это все медленно



быстро так
на входе
sp адрес таблицы адресов экрана
b количество точек

loop
pop hl
add hl,de
set 2,(hl)
djnz loop

GM BIT
31.03.2014, 12:14
по идее не помешало бы развернуть такой цикл.
там два djnz, не могу додуматься. наверное и поможет

---------- Post added at 10:59 ---------- Previous post was at 10:58 ----------


или pop hl
нет у меня 16384 свободных

---------- Post added at 11:00 ---------- Previous post was at 10:59 ----------


быстро так
это намного медленнее пред варианта

---------- Post added at 11:03 ---------- Previous post was at 11:00 ----------

Jerri за избавление от доп переменной спасибо

---------- Post added at 11:14 ---------- Previous post was at 11:03 ----------

как-бы развернуть цикл, чтоб осталось:

вначале set + inc h сколько надо
середина down_hl: dup 8: set: inc h: edup: down_hl
конец set + inc h сколько надо

было бы идеально

alone
31.03.2014, 12:47
loop
dup 8
set 2,(hl)
inc h
edup
ld a,l
sub e;-32
ld l,a
sbc a,a
and d;-8
add a,h
ld h,a
djnz loop

А начало и конец дорисовывать отдельно.

jerri
31.03.2014, 16:15
GM BIT, там не 16384

там 192*2 байта таблица

zebest
05.04.2014, 11:24
Как правильно организовать кольцевой счетчик на 6 (цветов)?
естьhttp://savepic.org/5257679.gifнадоhttp://savepic.org/5252559.gif
Только надо "ровный", без условных переходов, ибо бордюр, а у мну только на 8 получился, и то криво((
В шесть регистров надо 6 чисел записывать. Можно конечно в памяти сделать 6 ячеек и LDIR-ом их сдвигать по кругу, но тогда я не придумаю как задержку регулировать а5 же ровно.

drbars
05.04.2014, 11:36
Как правильно организовать кольцевой счетчик на 6 (цветов)?а у мну только на 8 получился

На 8, я полагаю, так:



COUNTER:
LD A,#FF
INC A
AND %00000111
LD (COUNTER+1),A
RET

denpopov
05.04.2014, 12:05
Как правильно организовать кольцевой счетчик на 6 (цветов)?
lookup?LUT?

alone
05.04.2014, 12:17
ld l,(hl)

Это вся процедура. Номер цвета в L. Старший байт адреса таблицы в H. Таблица содержит 1,2,3,4,5,0.

---------- Post added at 12:17 ---------- Previous post was at 12:13 ----------

Если надо использовать не цвета 0,1,2,3,4,5, а, например, цвета 2,6,4,5,1,3 (в таком порядке), то таблица будет начинаться с адреса #xx01 и содержать 3,6,2,5,1,4.

drbars
05.04.2014, 12:17
Это вся процедура. Номер цвета в L. Старший байт адреса таблицы в H. Таблица содержит 1,2,3,4,5,0.

---------- Post added at 12:17 ---------- Previous post was at 12:13 ----------

Если надо использовать не цвета 0,1,2,3,4,5, а, например, цвета 2,6,4,5,1,3 (в таком порядке), то таблица будет начинаться с адреса #xx01 и содержать 3,6,2,5,1,4.

А без таблиц ? :)

jerri
05.04.2014, 12:42
А без таблиц ? :)

а без таблиц



;0 1 2 3 4 5
ld a,0
counter equ $-1
inc a
cp 6
jr nz,$+3
xor a
ld (counter),a

drbars
05.04.2014, 13:48
а без таблиц



;0 1 2 3 4 5
ld a,0
counter equ $-1
inc a
cp 6
jr nz,$+3
xor a
ld (counter),a


топик стартер просил "ровный".

---------- Post added at 16:19 ---------- Previous post was at 15:57 ----------

Вот, ровный:



CNT:
LD A,#FF
INC A
CP 6
LD C,A
SBC A,A
AND C
LD (CNT+1),A


---------- Post added at 16:48 ---------- Previous post was at 16:19 ----------

Я бы ещё добавил указатель на ячейку


MAX = порог счета

LD HL,указатель на ячейку счетчика
INC (HL)
LD A,(HL)
CP MAX
SBC A,A
AND (HL)
LD (HL),A

denpopov
05.04.2014, 14:38
ld a,0
counter equ $-1
inc a
cp 6
jr nz,$+3
xor a
ld (counter),a

не люблю я такой код, привычнее это:

counter:ld a,0
inc a
...
ld (counter+1),a

jerri
05.04.2014, 14:44
denpopov, а по мне так удобнее

denpopov
05.04.2014, 15:03
denpopov, а по мне так удобнее
не буду спорить, просто мой пример все же читаемый.
осталось подойти к лукапам:)

Blade
05.04.2014, 15:45
не буду спорить, просто мой пример все же читаемый.

А через месяц забыл,что там код модифицируется и сделал так:

counter: push af
ld a,0

drbars
05.04.2014, 16:57
Зато "ровная"
Надо по хорошемуу только цвета 1,2,3,4,5,6 чтобы по регистрам по кольцу двигались. Так понятнее изложил?

Так что ли?


LD HL,(colors)
LD DE,#20 ; speed
LD C,#06 ; step
ADD HL,DE
LD (colors),HL
LD A,H
AND #07

CP C
LD B,A
SBC A,A
AND B
INC A
LD B,A

CP C
SBC A,A
AND B
INC A
LD D,A

CP C
SBC A,A
AND D
INC A
LD E,A

CP C
SBC A,A
AND E
INC A
LD H,A

CP C
SBC A,A
AND H
INC A
LD L,A

CP C
SBC A,A
AND L
INC A
RET

denpopov
05.04.2014, 17:07
А через месяц забыл,что там код модифицируется и сделал так:

вряд ли.

Alex Rider
05.04.2014, 17:13
А альтернативный набор занят совсем? Если в нем хранить цвета, кольцевой буффер можно сделать цепочкой пересылок типа (если c не нужен):


ld c,a
ld a,b
ld b,e
ld e,d
ld d,l
ld l,h
ld h,c


Если этот вариант не катит, то алоновский будет как-то так выглядеть:


...
ld h,high table
counter = $ + 1
ld l,#01
ld l,(hl)
ld b,l
ld l,(hl)
ld d,l
ld l,(hl)
ld e,l
ld l,(hl)
ld a,l
ex af
ld l,(hl)
ld a,l
ld l,(hl)
ld h,a
ld (counter),a
ex af
...
align #100
table: db #01, #02, #03, #04, #05, #06, #01

zebest
05.04.2014, 19:04
А альтернативный набор занят совсем?
Свободен совсем, с ним конечно да, наверное проще.
Вопрос остается в том, что моя процедура сразу со счетчиком тактов, причем ровным. Если его реализовать отдельно - то можно любую из вышеприведенных реализовать, даже мой вариант с LDIR-ом. Вообщем чтобы не объяснять третий раз - исходник с некоторыми комментариями и снапшотом.

jerri
05.04.2014, 21:35
вряд ли.

открой свой код трех летней давности и скажи что ты видишь.

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


Свободен совсем, с ним конечно да, наверное проще.
Вопрос остается в том, что моя процедура сразу со счетчиком тактов, причем ровным. Если его реализовать отдельно - то можно любую из вышеприведенных реализовать, даже мой вариант с LDIR-ом. Вообщем чтобы не объяснять третий раз - исходник с некоторыми комментариями и снапшотом.

я бы сделал так



NOP:NOP: ;NOP:NOP: ;NOP ;:NOP
DEC DE
LD (STACK),SP

ld sp,color_table
col_ptr equ $-2
pop bc,de,hl
ld a,c
ld c,#fe
;рисуем
;
;
;
;
ld hl,(colors)
ld de,#20 ; скорость
add hl,de
LD A,h
CP max
SBC A,A
AND h
LD h,a
ld (colors),hl
ld e,h
ld hl,color_table
add hl,de
ld (col_ptr),hl
;
;
;
;
;
;
;
color_table db 1,2,3,4,5,6,1,2,3,4,5,6

drbars
05.04.2014, 21:59
А я так:



;======================
Color LD HL,colors
LD A,(HL)
INC A
AND #07 ; speed
LD (HL),A
INC L
ADD A,#FF
CCF
SBC A,A
AND #01
LD B,A

LD C,#06

LD A,(HL)
ADD A,B
CP C
LD B,A
SBC A,A
AND B
LD (HL),A

CP C
LD B,A
SBC A,A
AND B
INC A
LD B,A

CP C
SBC A,A
AND B
INC A
LD D,A

CP C
SBC A,A
AND D
INC A
LD E,A

CP C
SBC A,A
AND E
INC A
LD H,A

CP C
SBC A,A
AND H
INC A
LD L,A

CP C
SBC A,A
AND L
INC A
RET

zebest
05.04.2014, 22:32
Отлично)) Вариант от drbars работает так, как задумано))
Правда против часовой стрелки, я хотел по)) Не суть. Как скорость менять - не понял)
Вариант от jerri тоже отлично работает, задумка интересная со стеком, но вот цвета путает(( Видимо надо как то таблицу перестроить. Суть в том, чтобы по часовой стрелке менялись A>B>D>E>H>L и снова >A

denpopov
05.04.2014, 22:49
открой свой код трех летней давности и скажи что ты видишь.
а вот древнего кода у меня и не осталось :(

drbars
05.04.2014, 22:50
Отлично)) Вариант от drbars работает так, как задумано))
Правда против часовой стрелки, я хотел по)) Не суть. Как скорость менять - не понял)
Упс.



AND #07 ; speed

AND %00001111 - медленее
AND %00000011 - быстрее

jerri
05.04.2014, 23:33
а вот древнего кода у меня и не осталось :(

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

---------- Post added at 23:33 ---------- Previous post was at 23:30 ----------



Вариант от jerri тоже отлично работает, задумка интересная со стеком, но вот цвета путает(( Видимо надо как то таблицу перестроить. Суть в том, чтобы по часовой стрелке менялись A>B>D>E>H>L и снова >A

ну это потому что у тебя последовательность регистров не правильная



a b e d l h
a b e d l h
a b e d l h
color_table db 1,2,3,4,5,6,1,2,3,4,5,6

denpopov
06.04.2014, 08:48
Вроде как похоже на смену цветов..

?

zebest
06.04.2014, 15:15
zebest, да
Это хорошо)

a b e d l h - в принципе могу перерисовать под такую последовательность, тогда все верно будет?)
В принципе получилось не все так просто)) хех
BC написан вот под такой массив -

registr: array [0..6] of string = ('0','a','b','d','e','h','l');
Пришлось искать как раз трехлетнийе исходники, хорошо с какими-никакими комментами, и переписывать в соответствии с новыми указаниями ВЦСПС и ЦК ВЛКСМ

registr: array [0..6] of string = ('0','a','b','e','d','l','h');
Ну и при выводе текста поменять половинки регистров. Все получилось.
Результат - в аттаче. Интересный бонус - бесплатный мультиколор на бордюре. Там же, в аттаче.
ХорошО смотриЦЦа в Анриле с "no paper" :)
Еще раз всем спасибо):v2_dizzy_vodka3:

drbars
06.04.2014, 16:17
out (c),0 - команда нестабильная.

Кстати, а что за флаговое безобразие после BIT n,(HL), которое на WOS'е трут?

zebest
08.04.2014, 15:38
Вроде как похоже на смену цветов..
Похоже)) Но пример - маленький..
Дорисовал картинку))
тут же надо будет менять все 768 байт атрибутов. Я правильно понимаю??
Сделать такой же фокус - атрибуты цвета менять по кругу, или сложно и тактов не хватит??
В аттаче - статический экран, но с картинойю..
http://savepic.net/5159201m.png (http://savepic.net/5159201.htm)

drbars
08.04.2014, 17:26
тут же надо будет менять все 768 байт атрибутов.[/IMG][/URL]
768 байт? :rolleyes:

jerri
08.04.2014, 18:52
drbars, да легко
ld e,(hl)
ld a,(de)
ld (hl),a
inc l(hl)

вот 768 таких конструкций разместить там, где место по тактам есть

denpopov
08.04.2014, 19:09
Похоже)) Но пример - маленький..
Дорисовал картинку))
тут же надо будет менять все 768 байт атрибутов. Я правильно понимаю??
Сделать такой же фокус - атрибуты цвета менять по кругу, или сложно и тактов не хватит??
В аттаче - статический экран, но с картинойю..
я намедни занят, погляжу потом.
все сводится к построению лукапа и смены 768 байт.

jerri
08.04.2014, 21:58
zebest, А потому что у тебя еще бордюр вертится.
HL должен указывать на начало области аттрибутов (#5800)
DE на таблицу изменения цвета (тут все сложно)

zebest
08.04.2014, 22:43
А потому что у тебя еще бордюр вертится.
а если пока абстрагироваться от бордюра?? Сперва без него сделать?
Ну а если с бордюром - то условные переходы тоже можно же выравнивать.
Понятно, что в за один фрейм не выйдет все перерисовать, но теоретически можно же разделить подготовку экрана на несколько прерываний, бордюр как бы тоже не каждое прерывание перекрашивается..
Эт так, теоретизирование)

denpopov
09.04.2014, 07:53
Выявлем прелести конвертирования картинки)

denpopov
09.04.2014, 07:55
Ну а если с бордюром - то условные переходы тоже можно же выравнивать.
можно и проще сделать. Сколько переменных для бордера?

zebest
09.04.2014, 11:26
Выявлем прелести конвертирования картинки)
ну я то ее сперва нарисовал, а потом конвертил. Это прелести ограничения цветов на знакоместо, тут ничего не попишешь.
Но в целом да, так как задумано работает)


Сколько переменных для бордера?
Все регистРы) Исходники же выше были неск.раз.
Если тактов не особо много - то можно попробовать совместить с бордюром.

denpopov
09.04.2014, 11:43
Это прелести ограничения цветов на знакоместо, тут ничего не попишешь.
ну по-любому есть расхождение.


Исходники же выше были неск.раз.
надо бы на новый глянуть.


Если тактов не особо много - то можно попробовать совместить с бордюром.
Ты используешь задержку до вывода бордера, надо посчитать, на что хватит тактов, тогда можно и поменять цикл задержки на верчение атрибутов.

denpopov
09.04.2014, 12:19
ну я думаю там около ~3400 тактов до начала построения

откуда?

посчитал, выходит 21*768 тактов

denpopov
09.04.2014, 13:08
выходит 16128 тактов твоя процедура жрет.
проще подготовить 6 фаз и кидать на экран по очереди.

denpopov
09.04.2014, 13:22
ну да.

denpopov
21.04.2014, 09:30
Попалось мне быстрое умножение:


Fast multiply: don't blink or you'll miss it.

Let f(x) = x^2 / 4. Then

a*b = f(a+b) - f(a-b)

Thus with a table of squares you can do integer multiplies very quickly.
To see an implementation of this algorithm, see C=Hacking.



вот только я никак не соображу, как реализовать это.

denpopov
21.04.2014, 11:22
SoftLight, приятно, что понял, о чем я говорю.
по идее, можно сделать два лукапа:
256 байт - это младший байт x*x/4
256 байт - это старший байт x*x/4

и потом выходит полный трэшак, если реализовать такое быстрое умножение..


а на потом есть еще один интересный алгоритм, на котором я залип:(

rajdee
21.04.2014, 11:48
Попалось мне быстрое умножение:


Fast multiply: don't blink or you'll miss it.

Let f(x) = x^2 / 4. Then

a*b = f(a+b) - f(a-b)

Thus with a table of squares you can do integer multiplies very quickly.
To see an implementation of this algorithm, see C=Hacking.



Я тут вспомнил про свою статью для Demo or Die 2000 года :)



Табличное умножение 8*8 с учетом знака.
------------------------------------------

Умножение производится на основе одной из
формул сокращенного умножения,в частности:

(a-b)(a+b)=a^2-b^2

Пусть: ┌──
│ X=a-b
│ Y=a+b
└──

Решая эту систему уравнений получим:

a=(X+Y)/2
b=(Y-X)/2

Тогда произведение X и Y будет определять
ся из выражения:

X*Y=a^2-b^2=((X+Y)^2 - (Y-X)^2) / 4

Это может выглядеть например так:

IMUL_HL=D*E
;----------------------------------
; IN: H=TB_XX/256
; D=X[-128,127]
; E=Y[-128,127]
; BC-NoT USED
; OUT:HL=D*E
; A=0 !
;----------------------------------
imul
;----------------------------------
ld h,tb_xx[
;----------------------------------
ld a,e
sub d ; y-x
ld l,a
ld a,e ; y
add a,d ; x+y
ld e,(hl)
inc h
ld d,(hl) ; (y-x)^2
ld l,a
ld a,(hl)
dec h
ld l,(hl)
ld h,a ; (x+y)^2
xor a ;... может кому пригодится? :)
sbc hl,de
;----------------------------------
ret

min/max=83 tps (без учета RET)

Структура таблицы TB_XX (таблица
квадратов чисел от -128 до 127) аналогична
структуре таблицs описанной в Spectrum
Expert#1 - имеет рaзмер 256*16 бит, с
учетом знaкa числa. Единственное отличие,
в таблице хранятся квадраты чисел/4
Тaблицa оргaнизовaнa следующим образом:
млaдшие бaйты лежaт в первом сегменте,a
стaршие в следующем (т.е. по смещению 256)


Процедура генерации несколько отличается
от приведенной в SE#1.(Процедура крайне не
оптимизирована, но все же более компактна и
быстродейственна)

;gen_table x*x x=(-128;127)
;--------------------------------
gen_xx ld hl,tb_xx
ld d,l,e,l
ld bc,de
lp1 ld (hl),e
inc h
ld (hl),d
dec h
ex de,hl
inc bc
add hl,bc
inc bc
ex de,hl
inc l
jp p,lp1
ld de,hl
lp2 ld a,(hl)
ld (de),a
inc d,h
ld a,(hl)
ld (de),a
dec d,h
inc e
dec l
jr nz,lp2
ret
----------------------------
37b


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

Это была вторая часть статьи, а начало статьи было примерно таким.


Вычисление площади треугольника
матричным методом
──────────────────────────────────────────
(c) raid`00


Пусть A(x1,y1),B(x2,y2),C(x3,y3)-вершины
треугольника,площадь которого определяется
из выражения:

┌ ┐
│ x1-x3 y1-y3 │
S=+-1/2│ │ (1)
│ x2-x3 y2-y3 │
└ ┘

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

S=+-(1/2)*((x1-x3)*(y2-y3)-(y1-y3)*(x2-x3))

Минус перед 1/2 берется в случаи,когда
получившийся определитель имеет отрица
тельное значение, в противном случаи плюс.

;----------------------------------
; IN: H=COORD_TAB[
; Формат таблицы:
; x1,x2,x3,y1,y2,3:[-128,127]
; OUT: HL-площадь треугольника
; в кв.пикселах :)
;----------------------------------
ld a,(hl):inc l ;*
ld b,(hl):inc l ;*
ld c,(hl):inc l ;*
sub c ;*
ld d,a ;*
ld a,b ;*
sub c ;*
ld c,a ;*
ld b,(hl):inc l ;*
ld a,(hl):inc l ;*
ld l,(hl) ;*
sub l ;*
ld e,a ;*
ld a,b ;*
sub c ;*
ld b,a ;*
call IMUL ; см.ниже
ld de,bc
ld bc,hl
call IMUL
ld de,bc
or a:sbc hl,de
inc h
dec h
jp p,loop1
ex de,hl
ld h,a ;обнуляется в IMUL!!!
ld l,a
or a:sbc hl,de
loop1 srl h:rr l
ret

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

;---------------------------------
; IN: A-X1 D-Y1
; B-X2 H-Y2
; C-X3 L-Y3
;---------------------------------
sub c
ld e,a
ld a,b
sub c
ld c,a
ld a,d
sub l
ld b,a
ld a,h
sub l
ld d,a

SoftLight
21.04.2014, 11:55
Засунул генерилку таблицы gen_table в ужасм и потестил, и вот что-то она мне возвращает таблицу длиной 96 чисел только вместо 256 ( а стоп, надо просто tb_xx задать началом параграфа, типа $c000 ))

denpopov
26.04.2014, 14:05
Наткнулся на вот такое:
Retro Programming: Plotting the Mandelbrot Set on the ZX Spectrum (http://www.retroprogramming.com/2014/03/plotting-mandelbrot-set-on-zx-spectrum.html)

это достойно, я считаю.

AAA
26.04.2014, 14:26
Наткнулся на вот такое:
Retro Programming: Plotting the Mandelbrot Set on the ZX Spectrum

это достойно, я считаю.

А этот сперматазойд может постоянно менятся ка каледоскоп в реалтайме?

denpopov
26.04.2014, 14:52
А этот сперматазойд может постоянно менятся ка каледоскоп в реалтайме?
у тебя есть архив дем, ищи знакомую картинку по тегу fractals,mandelzoom. Зря люди старались, что ли?

Hacker VBI
26.04.2014, 14:56
denpopov, AAA, AloneCoder делал фрактальчик атрибутный

denpopov
26.04.2014, 14:59
denpopov, AAA, AloneCoder делал фрактальчик атрибутный
эти ужасные треугольники? бред.

Sergey
27.04.2014, 09:18
denpopov, AAA, AloneCoder делал фрактальчик атрибутный

Для справки: тема фракталов раскрыта ALK`/Stars of Keladan в 5-м Обероне. Статья "Ликбез".

denpopov
27.04.2014, 09:23
Для справки: тема фракталов раскрыта ALK`/Stars of Keladan в 5-м Обероне. Статья "Ликбез".

у меня исходник есть, хотя я сам не читал статью.

denpopov
30.04.2014, 07:27
еще одна находка:

http://www.cirsovius.de/CPM/Projekte/Artikel/Mathe/SinCosInteger/SinCosInteger-en.html

и, если полистать вдумчиво, то есть интересное.

crazy_bender/ex-PLACEBO
30.04.2014, 09:44
к сожалению статья только под Моторовский проц. Поэтому надо под каждую конкретную машину искать свои варианты. теория хороша но реализация будет совсем разной

denpopov
30.04.2014, 10:05
к сожалению статья только под Моторовский проц

разве не для z80?

Shadow Maker
30.04.2014, 11:08
к сожалению статья только под Моторовский проц. Поэтому надо под каждую конкретную машину искать свои варианты. теория хороша но реализация будет совсем разной
Там же линк есть на Z80-реализацию: http://www.cirsovius.de/CPM/Projekte/Artikel/Mathe/SinCosInteger/SINCOS-MAC.txt

crazy_bender/ex-PLACEBO
30.04.2014, 11:20
ну тогда надо было сразу на Z80 вариант давать ссылку )

denpopov
25.05.2014, 08:28
Надо получить HL=A*128

делаю:
ld h,a,l,0
or a:srl h:rr l;A*128

выходит фигня:(
подскажите плз, что не так?

Reobne
25.05.2014, 09:44
делаю:
ld h,a,l,0
or a:srl h:rr l;A*128
выходит фигня

Верни "or a" на место. Перед "srl h" оно не нужно. :)
Если не поможет - смени ассемблер
Если и это не поможет - воспользуйся наконец дебагером. :)

denpopov
25.05.2014, 10:03
нет, все работает. Я на другом участке сделал неправильно.
дема на 3ВМ почти готова;)

denpopov
25.05.2014, 11:55
кстати, не нашел темы про скроллер на две точки. Если кто помнит, дайте линк плз, возникла идея.

Vitamin
25.05.2014, 12:24
rr h:rr l достаточно

Destr
25.05.2014, 12:29
Надо получить HL=A*128
делаю:
ld h,a,l,0
or a:srl h:rr l;A*128

выходит фигня
подскажите плз, что не так?
Должно всё работать.
(а OR A перед SRL H не нужен)

Alex Rider
25.05.2014, 15:03
Если кто помнит, дайте линк плз, возникла идея.
Как быстро сколлить память на 2 пиксела? (http://zx.pk.ru/showthread.php?t=22125)

denpopov
02.06.2014, 07:36
нашел описание алгоритма построения окружности:


This is the entire algorithm:

Y = Radius
X = 0
A = Radius/2
:loop
Plot4(x,y) ;Could just use Plot8
X = X + 1
A = A - X
if A<0 then A=A+Y : Y=Y-1
if X < Y then :loop

; Now more or less reverse the above to get the other eighth

A = -R/2 - 1
:loop2
Plot4(x,y)
A = A + Y
Y = Y - 1
if A<0 then X=X+1:A=A-X
if Y>=0 then :loop2

со второй половиной ваааще непонятно, ничего не вышло

Titus
02.06.2014, 12:20
A = -R/2 - 1
:loop2
Plot4(x,y)
A = A + Y
Y = Y - 1
if A<0 then X=X+1:A=A-X
if Y>=0 then :loop2


Здесь ошибочка, надо не A<0, а A>0.

jerri
02.06.2014, 12:24
denpopov, а что не понятно?
у тебя первая половина рисует 1/8 окружности (половину сектора)
а вторая половина рисует вторую 1/8 окружности

и на середине они должны встретиться

Titus
02.06.2014, 12:28
и на середине они должны встретиться

- Я буду есть сосиску с начала, а ты с конца.
- Встретимся на середине!

(c) Котенок по имени Гав.

denpopov
02.06.2014, 12:40
а вторая половина рисует вторую 1/8 окружности
не рисует, а выходит горизонтальная линия.

в текстовке есть ссылка на C9 hacking, взял процедуру там.Теперь интересно, прокатит ли EOR fill с заливкой окружности...

jerri
02.06.2014, 12:53
denpopov, если выходит горизонтальная линия значит там ошибка.

Titus
02.06.2014, 12:57
Ребятки, вы не заметили, что я уже несколькими постами выше написал, где там ошибка)

denpopov
02.06.2014, 13:09
Ребятки, вы не заметили, что я уже несколькими постами выше написал, где там ошибка)
верно, работает, спасибо!

Titus
02.06.2014, 13:37
Теперь интересно, прокатит ли EOR fill с заливкой окружности...

Конечно прокатит, почему нет? Окружность-то сплошная.

denpopov
02.06.2014, 13:43
Окружность-то сплошная.
ты пропустил Eor fill

Titus
02.06.2014, 13:57
ты пропустил Eor fill

А, ну тогда надо чуть модифицировать)

---------- Post added at 13:57 ---------- Previous post was at 13:51 ----------

Примерно вот так:


This is the entire algorithm:

Y = Radius
X = 0
A = Radius/2
:loop
X = X + 1
A = A - X
if A<0 then Plot4(x,y): A=A+Y : Y=Y-1
if X < Y then :loop

; Now more or less reverse the above to get the other eighth

A = -R/2 - 1
:loop2
Plot4(x,y)
A = A + Y
Y = Y - 1
if A>0 then X=X+1:A=A-X
if Y>=0 then :loop2

denpopov
02.06.2014, 14:02
А, ну тогда надо чуть модифицировать)

Ты меня потерял:v2_dizzy_facepalm:

Titus
02.06.2014, 14:25
Ты меня потерял:v2_dizzy_facepalm:

Хм... как я понял, ты хотел алгоритм круга, который потом можно залить по EOR Fill, т.е. чтобы на одной линии было только 2 пикселя - первый включающой заливку, второй выключающий. Вот такой модифицированный алгоритм я тебе и написал.

denpopov
02.06.2014, 14:30
Хм... как я понял, ты хотел алгоритм круга, который потом можно залить по EOR Fill,

Да, а что такое plot4()?процедура отрисовки линии для заливки?

Reobne
02.06.2014, 15:37
В первой половине "Radius", а во второй только "R"

alone
02.06.2014, 16:30
Моя процедура расчета адреса атрибутов или атрибутной карты из полных экранных координат (Х,Y):

Код:

; вх: L=X (0..255), H=Y (0..191)
; вых: HL=ATTR_ADR (адрес в области атрибутов)
...
Итого: 77 тактов. Кто быстрее?
ld c,h ;Y
ld h,'table
ld a,(hl) ;L(X)
inc h
ld l,c ;Y
add a,(hl) ;L(Y)
inc h
ld h,(hl) ;H(Y)
ld l,a
:48 t

denpopov
02.06.2014, 16:34
мне кажется, что если лукапы построить, то будет быстрее..

alone
02.06.2014, 16:38
Какие лукапы?

denpopov
02.06.2014, 17:03
Какие лукапы?


ld h,'table

как формируется таблица?

не, не быстрее, не так цитату прочитал.

alone
02.06.2014, 18:33
L(X) = X/8
L(Y) = (Y*4)&#e0
H(Y) = #58+Y/64 (или #D8+Y/64)

---------- Post added at 18:33 ---------- Previous post was at 17:05 ----------

ld hl,table
looplx:
ld a,l
rra
rra
rra
and 31
ld (hl),a
inc l
jnz looplx
inc h
looply:
ld a,l
add a,a
add a,a
and #e0
ld (hl),a
inc l
jnz looply
inc h
loophy:
ld a,l
rlca
rlca
and 3
add a,#58 ;#d8
ld (hl),a
inc l
jnz loophy

denpopov
02.06.2014, 18:36
ld a,l
rra
rra
rra
and 31
интересно.
а если сделать

ld a,l
and %11111000
.3 rra

то прокатит, наверное..

alone
02.06.2014, 18:37
(не проверял)

denpopov
02.06.2014, 18:39
L(Y) = (Y*4)&#e0
это вообще непонятно пока что.

Titus
02.06.2014, 18:39
Да, а что такое plot4()?процедура отрисовки линии для заливки?

Это рисование во всех четвертях.

Т.е. в твоем случае - plot 128+x, 88+y: plot 128-x, 88+y, plot 128+x, 88-y: plot 128-x, 88-y

denpopov
02.06.2014, 18:43
к заливке это все равно не относится..
ладно,буду с утра на свежую голову думать..

Titus
02.06.2014, 19:04
к заливке это все равно не относится..
ладно,буду с утра на свежую голову думать..

Ну как это не относится. Нарисовал сперва контур, потом залил все вместе) Или ты хочешь рисовать и заливать одновременно?

---------- Post added at 19:04 ---------- Previous post was at 18:55 ----------

Вот пример трех версий рисования круга на бейсике - простая, для EOR Fill и залитая сразу - http://sderni.ru/231329

alone
02.06.2014, 19:26
>Цитата:
>Сообщение от alone Посмотреть сообщение
>L(Y) = (Y*4)&#e0
>это вообще непонятно пока что.
Это всё равно что (Y&#f8)<<2

denpopov
02.06.2014, 19:40
для EOR Fill
убей меня, но это не похоже на технику.

alone
02.06.2014, 20:45
А что ты имеешь против EOR fill? Если фигур много, то в самый раз.

denpopov
02.06.2014, 20:52
А что ты имеешь против EOR fill? Если фигур много, то в самый раз.
ну ты же на speccy.info статью написал... для окружности не подходит алгоритм, с утра напишу другую заливку.

Titus
03.06.2014, 00:11
ну ты же на speccy.info статью написал... для окружности не подходит алгоритм, с утра напишу другую заливку.

Как это не подходит? Для всего подходит.

---------- Post added at 00:11 ---------- Previous post was at 00:10 ----------


Вот пример трех версий рисования круга на бейсике - простая, для EOR Fill и залитая сразу - http://sderni.ru/231329

Кстати, это именно твой алгоритм я привел, который ты описывал выше. Только в трех разных модификациях - оригинальный твой, он же, но с модификацией под EOR Fill и он же но сразу с заливкой горизонтальными линиями.

denpopov
03.06.2014, 06:16
но с модификацией под EOR Fill и он же но сразу с заливкой горизонтальными линиями.
а я читал про вертикальнгую заливку, и в Moving IT! на Forever применялся такой алгоритм.


Как это не подходит? Для всего подходит.
ну глянь на вертикальные столбики, по идее они сотрутся.

denpopov
03.06.2014, 07:28
написал на скорую руку, нажмите любую клавишу до заливки. Результат на экране.

камнями не кидать, знаю, что процедура неоптимизирована.

denpopov
03.06.2014, 09:02
с заливкой получилось только так..

Titus
03.06.2014, 09:18
а я читал про вертикальнгую заливку, и в Moving IT! на Forever применялся такой алгоритм.

ну глянь на вертикальные столбики, по идее они сотрутся.

Поменяй x и y местами, и круг нарисованный для горизонтальной заливки станет кругом нарисованным для вертикальной заливки)

denpopov
03.06.2014, 09:59
Поменяй x и y местами, и круг нарисованный для горизонтальной заливки станет кругом нарисованным для вертикальной заливки)

да разницы никакой тащемта.Я рисую в памяти, по идее картинка должна зациклиться на рамки по 31 пикселя, а по Х процедура почему-то не работает..



plot:
push bc
ld a,e:and 7:ld c,a,b,bw/256
ld a,e:and %11111000
rra:rra:rra

and 31

ld l,a
ld a,d
or $C0
ld h,a
ld a,(bc):or (hl):ld (hl),a
pop bc
ret



---------- Post added at 09:59 ---------- Previous post was at 09:40 ----------

а, всё разобрался. теперь вопрос о делении 16бит/16бит.

http://www.retroarchive.org/cpm/cdrom/SIMTEL/SIGM/VOLS100/VOL123/MATHLIB.Z80



;-------------------------------------------------------
;
DIVIDE: ;16 Bit by 16 Bit Integer Division
;
; dividend (BC)
; result (BC) = --------------- + remainder (HL)
; divisor (DE)
;
; The dividend is in BC, and the result returns in BC
; The divisor is in DE
; After the division HL contains the remainder
;
; The divisor is successively subtracted from the high
; order bits of the dividend. After each subtraction
; the result is used instead of the initial dividend
; The result is increased by 1 each time.
; When the result of the subtraction is negative the
; partial result is restored by adding the divisor
; back to it.
; The result is simulataneously decremented by 1
;
;First check if divisor is 0
LD A,D
OR E
JR Z,DIVIDE.BY.ZERO
; Dividend is in BC
;clear result
LD HL,0
;loop counter
LD A,16 ;DO NOT TRUNCATE
;
;Rotate Dividend left
;Carry has been zeroed by the OR E above
ZZDIV1: RL C ;Carry -> LSBit, MSBit -> Carry
RL B ;ditto
;Rotate Remainder left
ADC HL,HL ;Never sets carry,
; ie RESETS carry
;Trial subtraction of divisor from result
SBC HL,DE ;Carry -> 0 if no borrow
;Carry -> 1 if borrow
JR NC,ZZPOS
;otherwise negative
ADD HL,DE ;Restore dividend
ZZPOS: CCF ;Calc Result Bit, Z80 carry peculiar
DEC A ;Loop counter
JR NZ,ZZDIV1 ;Loop for 16 Bits
;
RL C ;Shift in last result bit
RL B
; The result is in BC, the remainder in HL
;
RET ; ***** DONE ****
;
DIVIDE.BY.ZERO: LD BC,0FFFFH ;Infinity
; Output a diagnostic message if desired
RET
;


в другом источнике есть беззнаковое деление:
http://baze.au.com/misc/z80bits.html#2.3


2.3 Restoring 16-bit / 16-bit Unsigned

Input: A:C = Dividend, DE = Divisor, HL = 0
Output: A:C = Quotient, HL = Remainder
slia c ; unroll 16 times
rla ; ...
adc hl,hl ; ...
sbc hl,de ; ...
jr nc,$+4 ; ...
add hl,de ; ...
dec c ; ...

We can use the forementioned trick with complementing the result also here but it's not that obvious how removed DEC C balances against additional overhead. In any case, this routine doesn't contain any "undocumented" instructions and might be preferable (?) for that reason.


простите моё невежество, но в чем разница?

Andrew771
03.06.2014, 11:03
Беззнаковое: делимое и делитель только положительные от 0 до 65535
Со знаком: делимое и делитель от -32767 до +32767

denpopov
03.06.2014, 11:21
Беззнаковое: делимое и делитель только положительные от 0 до 65535
Со знаком: делимое и делитель от -32767 до +32767

так какой лучше взять? хочу делить число без знака на 320.

Titus
03.06.2014, 11:25
так какой лучше взять? хочу делить число без знака на 320.

Беззнаковый)

А если делишь на константу, тем более такую простую - пиши деление на константу, оно будет гораздо быстрее.

Reobne
03.06.2014, 11:35
хочу делить число без знака на 320.
Вместо того чтобы делить на константу, лучше умножать на константу.

---------- Post added at 13:35 ---------- Previous post was at 13:33 ----------

Какой у тебя диапазон делимого? Отбрасывание дробной части или округление до ближайшего лучше?

denpopov
03.06.2014, 11:47
признаться говоря, я ничего не придумал для алгоритма, просто нужно делить число, которое изменяется от 0 до $FFFF, на 320.

Titus
03.06.2014, 11:51
признаться говоря, я ничего не придумал для алгоритма, просто нужно делить число, которое изменяется от 0 до $FFFF, на 320.

Лучше обрисовать цель деления.

---------- Post added at 11:51 ---------- Previous post was at 11:49 ----------


Вместо того чтобы делить на константу, лучше умножать на константу.

Через умножение можно не получить требуемой точности. Все зависит от задачи.

denpopov
03.06.2014, 12:00
Лучше обрисовать цель деления.
прям так палить эффект? это или на TS-Conf, или на Спектрум.

Reobne
03.06.2014, 12:21
Через умножение можно не получить требуемой точности. Все зависит от задачи.
Ну вот, например, умножаем на 205 и "делим на 65536" это эквивалентно делению примерно на 319.7
А если умножаем на 52429 и "делим на 2^24", то примерно 319.999.

---------- Post added at 14:21 ---------- Previous post was at 14:02 ----------


прям так палить эффект?
Так может тебе и калькулятор бейсика сгодится, а мы тут будем тратить силы на экономию одного такта. :)
Сколько раз за кадр нужно делить на 320?

denpopov
03.06.2014, 12:54
Так может тебе и калькулятор бейсика сгодится,
не уверен, я калькулятором не занимался.


Сколько раз за кадр нужно делить на 320?
Дело не в кадрах, я не знаю, как объяснить. Взял процедуру и влепил в интро, вышло немного тормозно, возможно из-за алгоритма.

Andrew771
03.06.2014, 12:58
x/32/10 :)

jerri
03.06.2014, 13:01
Andrew771, замени деление на 10 уможением

Andrew771
03.06.2014, 13:11
Andrew771, замени деление на 10 уможением
x*26/256

jerri
03.06.2014, 13:16
x*26/256

и получаем x/32*26/256

denpopov
03.06.2014, 13:21
математики, интересно, а как впихать 65535 значений повсюду?

jerri
03.06.2014, 13:31
denpopov, а что тебя смущает то?

65535/32=2047*26=53248/256=208

так что если посчитать то можно и в табличку все забить

Reobne
03.06.2014, 13:38
вышло немного тормозно
Попробуй резко и очень неточно, для проверки, это-ли место вносит основное торможение:

; HL - Вход
; A - выход ~(HL/320)
LD A,H
RLCA
AND 1
LD L,A
LD A,H
RLCA
RLCA
RLCA
RLCA
AND 15
ADD A,L
LD L,A
LD A,H
SUB L
SUB L
SUB L

denpopov
03.06.2014, 13:40
тогда нужен еще и остаток.

Reobne
03.06.2014, 13:47
тогда нужен еще и остаток.
Тогда забудь про моё предложение, раз у тебя такие барские требования. :)

Titus
03.06.2014, 13:49
Расплывчатость постановки задачи всегда ухудшает оптимальность ее решения)

denpopov
03.06.2014, 13:53
Тогда забудь про моё предложение, раз у тебя такие барские требования.
хорошо, папочка;)

Andrew771
03.06.2014, 13:54
тогда нужен еще и остаток.
умножь полученное при делении частное обратно на 320 и вычти его из первоначального числа :)

shurik-ua
03.06.2014, 14:06
Я так понял что нужно чтобы 16-тибитный параметр равномерно менял значение от min to max (0-65535) при количестве шагов (строк) 320.
65536 / 32 = 2048
2048 / 10 = 204.8
но так как необходимо целое значение, то нужно в пределах каждых 10 строк 8 раз прибавлять 205 и 2 раза 204, например так :

0-строка +205
1 +205
2 +205
3 +204
4 +205
5 +205
6 +205
7 +204
8 +205
9 +205

как-то так - и никаких делений не нужно.

но если нужно от номера строки получать параметр, то наверное только деление, но лучше таблицей - всего 640 байт

Andrew771
03.06.2014, 14:08
и получаем x/32*26/256
тогда лучше x/256*26/32

Vladson
03.06.2014, 14:49
на счёт кругов... почему не использовать "plot8" ???

Т.е не только

Это рисование во всех четвертях.

Т.е. в твоем случае - plot 128+x, 88+y: plot 128-x, 88+y, plot 128+x, 88-y: plot 128-x, 88-y
но ещё и 128+y, 88+x, итд ??? (зачем два цикла если один достаточно ?)

denpopov
03.06.2014, 14:56
какаято некошерная окружность вышла..

Andrew771
03.06.2014, 15:12
создай библиотеку спрайтов окружностей :)

Reobne
03.06.2014, 15:33
зачем два цикла если один достаточно ?
Если нужен EORFill, то:
В одном цикле рисуются верхушки и низушки окружностей, сплошняком. Каждая точка на своей вертикальной линии.
В другом цикле рисуются боковины, не сплошняком, а только ступеньки. Каждая ступенька на своей вертикальной линии.
А потом EORFill сверху вниз всё закрасит как надо.

Набросал иллюстрацию (http://zx.pk.ru/showpost.php?p=714675&postcount=238)на Обероне (http://zx.pk.ru/showthread.php?t=18472). Строит 20 случайных мишеней, любуемся "боковинками" и "крышками" окружностей, давим на кнопку, происходит EORFill.

Vladson
03.06.2014, 18:07
некошерная окружность вышла
Собственно на скорую руку, вот вторая версия (тоже неоптимальная, но смысл тот же)

Vladson
03.06.2014, 18:28
Ещё небольшой апдейт, в последней строчке лучше юзать не "x<y" a "x<=y" (иначе в некоторых случаях будет одного пикселя не хватать)

Reobne
03.06.2014, 18:47
Ещё небольшой апдейт, в последней строчке лучше юзать не "x<y" a "x<=y" (иначе в некоторых случаях будет одного пикселя не хватать)
А в режиме OVER 1, и так и так пикселя не хватать будет. :)
Хотя, конечно, в режиме OVER 0, незакрашенную окружность можно и 8-иточечно в одном цикле.

---------- Post added at 20:47 ---------- Previous post was at 20:45 ----------

Я-же не придираюсь, я пытаюсь дать объяснение, зачем нужно два цикла, и только.

denpopov
03.06.2014, 18:55
я пытаюсь дать объяснение, зачем нужно два цикла, и только.

наверное, можно обойтись и двумя циклами, хотя будет очень медленно.
по идее x^2+y^2=r^2.

Vladson
03.06.2014, 19:09
А в режиме OVER 1
Это также можно исправить проще и без второго цикла, либо без видимой потери качества либо даже совсем без оной, но вот в тонкостях не докопался пока.

denpopov
04.06.2014, 09:39
По поводу вчерашнего вопроса о делении - у меня так ничего и не вышло.

в архиве 049.rar - оригинал с пейси, снапшот для TS-Conf, часть кода не моя, я просто использовал как основу.
может, есть идеи по ускорению?

denpopov
07.06.2014, 10:31
Немного из раскопок на дисках:


;╔════════════════════════════════════════════════ ════════════╗
;║ ОТВЕТ НА ЗАДАЧУ ГН. КОЛОТОВА. ║▒
;║ ПРОЦЕДУРА ПЕЧАТИ СИМВОЛА АТРИБУТАМИ НА ЭКРАНЕ. ║▒
;║ ║▒
;║ CODING BY CARDINAL/PGC/BD. DATA: 31.12.1999г. ║▒
;╚════════════════════════════════════════════════ ════════════╝▒
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒

ORG #6000
LD A,127 ;СИМВОЛ
LD C,#38 ;ЦВЕТ

;---------------------------------------------------------------
SYM ADD A,A ;40 БАЙТОВ, РЕКОРД!!!
LD L,A
LD H,15
ADD HL,HL
ADD HL,HL
LD DE,#5800
L1 LD B,3
L2 PUSH BC
LD A,(HL)
LD B,8
L3 RLA
PUSH AF
SBC A,A
AND C
LD (DE),A
INC DE
LD (DE),A
INC DE
LD (DE),A
INC DE
LD (DE),A
INC DE
POP AF
DJNZ L3
POP BC
DJNZ L2
INC L
LD A,L
AND 7
JR NZ,L1
RET
;---------------------------------------------------------------




Заодно найдены две процедурки форматирования..

Destr
07.06.2014, 21:24
ОТВЕТ НА ЗАДАЧУ ГН. КОЛОТОВА. ║▒
;║ ПРОЦЕДУРА ПЕЧАТИ СИМВОЛА АТРИБУТАМИ НА ЭКРАНЕ.
А кто-нибудь пробовал эту процедуру запустить? :)

denpopov
08.06.2014, 05:12
А кто-нибудь пробовал эту процедуру запустить
с дополненым кодом я пробовал, мелкие буквы как-то криво печатаются.

drbars
08.06.2014, 22:39
А кто-нибудь пробовал эту процедуру запустить? :)

Разве глючная?

drbars
09.06.2014, 06:19
Получил письмо на электромыло :)

Процедура рисует букву атрибутами на ВЕСЬ (32*24) экран.




hi,

"ГН. КОЛОТОВ" негодуэ и шлет более короткий вариант

успехов,
SerzhSoft.

;
;fullscreen (32x24) symbol (c) SerzhSoft
;A=symbol, C=color, 36 bytes
;


add a,a
ld l,a
ld h,#0f
add hl,hl
add hl,hl
ld de,#5800
lpp4
ld b,#03
lpp3
push hl
ld h,(hl)
lpp2
add hl,hl
sbc a,a
and c
ld l,#04
lpp1
ld (de),a
inc de
dec l
jr nz,lpp1
ld a,e
and #1f
jr nz,lpp2
pop hl
djnz lpp3
inc l
or e
jr nz,lpp4
ret

drbars
09.06.2014, 15:55
Автор всё ещё негодуэ...



;
;fullscreen (32x24) symbol (c) SerzhSoft
;A=symbol, C=color, 33 bytes
;
add a,a
ld l,a
ld h,#0f
add hl,hl
add hl,hl
ld de,#5800
lps2
ld a,(hl)
ld b,#18
lps1
rlca
push af
sbc a,a
and c
ld (de),a
inc de
ld (de),a
inc de
ld (de),a
inc de
ld (de),a
inc de
pop af
djnz lps1
inc l
ld a,e
or a
jr nz,lps2
ret

denpopov
09.06.2014, 15:59
вот неугомонный:)

Shadow Maker
09.06.2014, 16:28
Предлагаю г-ну Колотову использовать это в грядущих демах :) Или 4k :)

denpopov
09.06.2014, 16:42
што, опять атрибутами?оО

drbars
09.06.2014, 21:25
Другая задачка: рисуем букву атрибутами (8х8 знакомест) :)

Никаких PUSH POP !!! :)



; ATTR symbol print by Dr.Bars (29 bytes)
; HL = ATTR_ADR (#5800)
; A = Letter_code
; E = Color_code (#57)

ATTR_SYM:
EXX
ADD A,A
LD L,A
LD H,#0F
ADD HL,HL
ADD HL,HL
LD B,#08
L2 LD A,(HL)
EXX
LD BC,#0818
L1 RLA
LD D,A
SBC A,A
AND E
LD (HL),A
LD A,D
INC L
DJNZ L1
ADD HL,BC
EXX
INC L
DJNZ L2
RET


Вариант 2 (изменяемый цвет фона):

Юзается push/pop :(



PRINT:
LD HL,#5800
LD A,#7F
LD D,#57-#07
LD E,#07

; ATTR symbol print by Dr.Bars (30 bytes)
; HL = ATTR_ADR (#5800)
; A = Letter_code
; D = Color_code - Background_code
; E = Background_code

ATTR_SYM:
ADD A,A
EXX
LD L,A
LD H,#0F
ADD HL,HL
ADD HL,HL
LD B,#08
L2 LD A,(HL)
EXX
LD BC,#0818
L1 RLA
PUSH AF
SBC A,A
AND D
ADD A,E
LD (HL),A
POP AF
INC L
DJNZ L1
ADD HL,BC
EXX
INC L
DJNZ L2
RET





---------- Post added at 00:25 ---------- Previous post was at 00:16 ----------

P.S моя процедурка вывода спрайта (http://zx.pk.ru/showthread.php?t=23544) никому не интересна?

Она ведь чуть медленее табличного варианта по скорости.

introspec
09.06.2014, 23:35
P.S моя процедурка вывода спрайта (http://zx.pk.ru/showthread.php?t=23544) никому не интересна?

Она ведь чуть медленее табличного варианта по скорости.Интересна, просто она непростая, а времени нет. Скачал сразу после выхода, обязательно прочту, когда чуть разгружусь.

Destr
09.06.2014, 23:51
Разве глючная?
В голове прокрутил - да.
Испробовать пока-что не с руки.
Да и ревюшники хоть и пыжились (мол мы тут все тру), но бывало что и ушами хлопали всякий бред печатая без проверки.
А уж что рассылали (причём за деньги) - про то вообще отдельная песня.
Сколько жалоб в прессе на их "дистрибутивы".
Хотя конечно понять можно: тогда это дело только зарождалось, конечно в те времена только методом проб и ошибок...

drbars
10.06.2014, 00:16
Интересна, просто она непростая, а времени нет. Скачал сразу после выхода, обязательно прочту, когда чуть разгружусь.
Писал для диззика, но в итоге реализовал табличный способ... более универсальный и компактный в быстрой памяти.

drbars
12.06.2014, 08:33
Ещё в дополнение рисования буквы атрибутами на весь экран, мой пример:

Он не самый короткий, но показывает насколько ассебмлер многогранен :)



; fullscreen (32x24) letter print by Dr.Bars
; A = symbol code - 1

ADD A,A
SBC HL,HL
ADD HL,SP
LD SP,#5B00
EXX
LD L,A
LD H,#0F
ADD HL,HL
ADD HL,HL
EX DE,HL
LD C,#08
L2 DEC DE
LD A,(DE)
LD B,#18
L1 RRCA
SBC HL,HL
PUSH HL
PUSH HL
DJNZ L1
DEC C
JR NZ,L2
EXX
LD SP,HL
RET

denpopov
12.06.2014, 08:41
LD L,A
LD H,#0F
ADD HL,HL
ADD HL,HL
EX DE,HL

не помню кто, вроде бы Vitamin предлагал: если использовать код символа*8, то часть байтов на процедуре можно съэкономить..

Destr
12.06.2014, 16:26
не помню кто, вроде бы Vitamin предлагал: если использовать код символа*8, то часть байтов на процедуре можно съэкономить..
А если хранить текст не кодами символов, а уже адресами литер - то можно и ещё сэкономить.
"Но, господа, это уже не физика!" (Это цитата. В данном случае она означает что экономия байтов уже начинает перетекать в абстрактную задачу. Хотя в частных случаях возможно это и пригодится.)

denpopov
12.06.2014, 16:31
А если хранить текст не кодами символов, а уже адресами литер - то можно и ещё сэкономить.

какая банальность:) в процедурах описано А=код символа.
если модифицировать код, то пуркуа ба не LD,A,"0"*N?

давно не проверял почту, нашел негодование господина Колотова. А почему бы ему на форум не прийти? есть же чему учиться..

Destr
12.06.2014, 19:48
какая банальность в процедурах описано А=код символа.
если модифицировать код, то пуркуа ба не LD,A,"0"*N?
А вот не банальность, а Ваша, т.denpopov, невнимательность.
Хранить адрес литеры в фонте в 8-ми битном регистре не получится.
(и к слову - код символа*8 тоже не выйдет передавать через A)

denpopov
12.06.2014, 19:53
не стоит придираться к словам, лучше продемонстрируйте, что ли..

jerri
13.06.2014, 03:03
denpopov, чего тут непонятно?

A=33="!"
если хранить код символа *8 то получится 33*8=264 а размерность А всего 8 бит
т.е под каждый символ - 2 байта

denpopov
13.06.2014, 09:49
т.е под каждый символ - 2 байта

а если *4?

jerri
13.06.2014, 10:14
а если *4?

тогда берем символ #7f который (c) и понимаем что больше чем *2 не сделать

но для чего эти телодвижения?
Ты можешь ответить внятно?

denpopov
13.06.2014, 10:37
но для чего эти телодвижения?
Ты можешь ответить внятно

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

jerri
13.06.2014, 12:13
просто была мысль сократить процедуру, для печати букв можно использовать...

"Экономия на туалетной бумаге"

Здесь ты упростил а в вызывающей процедуре может теперь понадобиться пара лишних телодвижений

denpopov
13.06.2014, 12:27
"Экономия на туалетной бумаге"
точно!http://sysadmins.ru/images/smiles/idea.gif

alone
18.06.2014, 13:11
Я где-то использовал текст, состоящий из младших байтов адреса букв (буквы высотой 5 пикселей).

denpopov
28.06.2014, 21:42
Народ, кто помнит в прессе генерацию квадратов чисел?
нужен способ получения A^2.

introspec
28.06.2014, 22:54
Народ, кто помнит в прессе генерацию квадратов чисел? нужен способ получения A^2.denpopov, я думаю, что тебе нужна таблица квадратов. На её основе можно ещё и умножение осилить.

denpopov
29.06.2014, 06:48
denpopov, я думаю, что тебе нужна таблица квадратов. На её основе можно ещё и умножение осилить.
много думаешь:)
где-то в журнале была генерация квадратов. Пойду искать..

---------- Post added at 06:48 ---------- Previous post was at 06:11 ----------

http://zxpress.ru/article.php?id=2352

не совсем то..

jerri
29.06.2014, 10:09
denpopov, а что тебя не устраивает то?

y=x*x так?
размер таблицы - 512 байт

denpopov
29.06.2014, 10:26
denpopov, а что тебя не устраивает то?
способ генерации мне не нравится. Да и не ясно, какое значение будет при (-1)^2?

rajdee
29.06.2014, 12:40
способ генерации мне не нравится. Да и не ясно, какое значение будет при (-1)^2?
Способ нормальный, правда инверсное расположение мне не нравится, и то, что квадрат хранится сразу словом, а не раскидан по сегментам. Я недавно вроде бы начал переделывать, правда не помню уже чем закончилось все )

denpopov
29.06.2014, 12:41
Способ нормальный, правда инверсное расположение мне не нравится, и то, что квадрат хранится сразу словом, а не раскидан по сегментам.

Куда я попал? это кружок начинающих кодеров?

Destr
29.06.2014, 13:15
http://zxpress.ru/article.php?id=1819

Destr
29.06.2014, 17:35
Ну что там, ДенПопов?
Помогло, не?

rajdee
29.06.2014, 17:43
Куда я попал? это кружок начинающих кодеров?
Не переживай denpopov, ты попал по адресу, все когда-то начинали, т.ч. мы тебе поможем.

denpopov
29.06.2014, 18:04
Ну что там, ДенПопов?
Помогло, не?

отпустило всего лишь навсего..

Destr
30.06.2014, 06:47
отпустило всего лишь навсего..
Тебя, браза, хрен поймёш...
То тебе квадрат вычислить надо (да не простой, а чтоб и -1 тоже), то тебя отпустило...
То вдруг простые алгоритмы не устраивают - подавай матричные исчисления, то блин - нефик разводить вышку-математику, давайте попроще.
Хоть обозначал задачу, что-ли...
И вообще: Прессу хоть читал?
Бумажки, там (да, то самое zx-ревю?)
Ну и электронщину.
С zxpress вижу знаком, но поверхностно...
(newart там до сих пор внятный поиск не заделал, но ведь и всякие гугли-яндексы с индексацией никто не отменял!)
Как-бы поиском учимся работать, не?

denpopov
30.06.2014, 08:04
Как-бы поиском учимся работать, не?


(newart там до сих пор внятный поиск не заделал, но ведь и всякие гугли-яндексы с индексацией никто не отменял!)

взаимоисключающие параграфы налицо.

вопрос закрыт, разобрался.

denpopov
01.07.2014, 08:39
http://i62.fastpic.ru/big/2014/0701/c6/fb7b1575e4c541f81dd48c8683b74cc6.gif
собственно, вот что получилось - 101 байт против 104.
естественно неоптимизировано. Как бы анимировать эту картинку?

Reobne
01.07.2014, 10:35
Как бы анимировать эту картинку?
Первое что приходит на ум, это как недавно Introspec (http://zx-pk.ru/showpost.php?p=721011&postcount=105) рассказывал. Чтобы оно ехало. Сделать в 7-й странице сдвинутую на четверть, и переключать с атрибутным инвертированием.

Второе что пришло на ум, переставлять местами случайные знакоместа. :)

jerri
01.07.2014, 10:49
denpopov, а еще можно инвертировать аттрибуты

denpopov
01.07.2014, 11:11
атрибуты - это не анимация.
не помню, где видел, вроде бы в наборе 128б, Алонекодер проводил компо..

alone
01.07.2014, 11:29
ZX-Guide #3. Этот эффект там так и называется "oboi".

denpopov
01.07.2014, 11:39
Этот эффект там так и называется "oboi".
oboi из ZXревю взято, наверное.

alone
01.07.2014, 11:46
Вот OBOI на бейсике: http://zxpress.ru/book_articles.php?id=416

denpopov
01.07.2014, 11:58
Вот OBOI на бейсике: http://zxpress.ru/book_articles.php?id=416
Кстати, а почему на zxpress текста нет до сих пор?

denpopov
03.07.2014, 12:48
Нужна идея - как построить данные(см.рис.):

http://i63.fastpic.ru/big/2014/0703/88/6cf6fd43748a1ff5e279ff5581eaf688.gif

Andrew771
03.07.2014, 12:54
какой график функции? От него и пляши.

denpopov
03.07.2014, 13:12
какой график функции?

на синусоиду разве не похоже?

esl
03.07.2014, 13:18
Не оно ?
https://www.dropbox.com/s/eyrfb4ikvv0p3sd/dots.html

denpopov
03.07.2014, 13:25
Не оно ?
по идее похоже, просто много вычислений..

Andrew771
03.07.2014, 15:15
на синусоиду разве не похоже?
вот это что: http://www.all-fizika.com/article/index.php?id_article=452
сложение двух синусоид.

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

математически называются "биения"

denpopov
03.07.2014, 15:53
что-то у меня нелады с тригонометрией:( получается пока что плохо..

Titus
03.07.2014, 15:56
что-то у меня нелады с тригонометрией:( получается пока что плохо..

Такую большую картинку следует убирать под спойлер.

Складываешь две синусоиды друг с другом, и получаешь искомое.

Например pi/10 и pi/11

denpopov
03.07.2014, 15:59
ага, примерно вот так(если целые числа юзать)


Dim s.b(256)

For i=0 To 255
s(i)=Int(127*Sin(i*#PI/128))
Next i


If InitSprite() And OpenWindow(0,0,0,640,480,"SineWave",#PB_Window_SystemMenu) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
Repeat
StartDrawing(ScreenOutput())

For i=0 To 255
t.a=i*4
y1.b=s(t)
y2.b=s(i>>1)
Plot(i,y1+128,RGB(0,255,0))
Plot(i,128-y2,RGB(255,0,0))

y3=Int(y2*y1/256)
Box(i,128+y3,1,1,RGB(255,255,255))
Next i
StopDrawing()
FlipBuffers()
Until WindowEvent()=#PB_Event_CloseWindow
EndIf

esl
03.07.2014, 17:16
помогает
http://www.wolframalpha.com/input/?i=plot+0.9*sin%28x%2F10%29*sin%28x%2F10%29*sin%28 x%29%2Csin%28x%2F10%29*sin%28x%29%2C+x%3D0+to+10+p i

---------- Post added at 16:16 ---------- Previous post was at 15:39 ----------


по идее похоже, просто много вычислений..

просто графики уж больно похожи на графики из 3200 sine dots ;)
моя релизация "по мотивам" - для Корвета
https://www.youtube.com/watch?v=qJERnLmQuC8&feature=youtu.be
http://zx-pk.ru/showpost.php?p=709161&postcount=27

denpopov
04.07.2014, 10:04
похоже, что у меня плохо с устным счетом:(

рассчитанные данные отличаются от того, что посчитал в программе.

Нужен зоркий глаз:v2_dizzy_coder:

Shadow Maker
05.07.2014, 10:44
Я чет ниче в этом коде не понял. Но судя по графику там какое-то переполнение, раз у тебя верхушка вылазит снизу, может 8 бит не хватает. Попробуй другие считалки синуса, http://www.andreadrian.de/oldcpu/Z80_number_cruncher.html http://z80-heaven.wikidot.com/advanced-math

denpopov
05.07.2014, 10:49
Попробуй другие считалки синуса,

Считалка работает ибо проверено. Построить таблицу можно с помощью готовой процедуры.

Shadow Maker
05.07.2014, 10:51
Где проверено, если значения не те? Сам же просишь. Таблицу можно и в пуребасике построить, как ты видимо и сделал.

denpopov
05.07.2014, 11:12
Где проверено, если значения не те? Сам же просишь

синус правильно строится, это легко проверить, если построить табличку.


Таблицу можно и в пуребасике построить, как ты видимо и сделал.
мне непонятно, какую я допустил ошибку при расчете графика.

jerri
05.07.2014, 11:56
denpopov, может переполнение? формула сложная и сумма нескольких слагаемых может быть больше чем твой экран

denpopov
05.07.2014, 12:00
denpopov, может переполнение? формула сложная и сумма нескольких слагаемых может быть больше чем твой экран

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

Shadow Maker
05.07.2014, 13:02
Ищи где у тебя умножается и происходит переполнение, или округляется неправильно. Замени на сложения для теста, например. Кстати начальная табличка идёт до 7d80, а ты уже с 7d00 её забиваешь, это ок?

denpopov
05.07.2014, 13:45
Кстати начальная табличка идёт до 7d80, а ты уже с 7d00 её забиваешь, это ок?

разве не с $7C00?

Shadow Maker
05.07.2014, 15:42
нет, у тебя же сначала создает какую-то табличку длиной #180 начиная с #7c00, а потом че-то умножается на что-то, и там такой код:


pop hl
inc h
ld (hl),a
dec h
inc l


Так что ты забиваешь в #7d00 и дальше, при это затирая половину данных, которые нагенерило в первом шаге. Я хз, это так задумано или что.

denpopov
05.07.2014, 15:47
Так что ты забиваешь в #7d00 и дальше, при это затирая половину данных, которые нагенерило в первом шаге.

с генерацией косяк, да. только при вычислении участвуют данные с $7C00 по $7CFF.
Ладно, буду думать позжее, я сомневаюсь с переполнением.

denpopov
07.07.2014, 09:31
я не зря попросил "зоркий глаз":)
поменял генерацию таблицы синуса:


loc_602D:
ld a, (hl)
add a,a
ld (hl),a
neg
ld (de), a
inc l;de
inc e;l
jr nz, loc_602D



Shadow Maker, спасибо за наводку!

погрешность вычислений есть все же..

denpopov
21.07.2014, 08:55
господа кодеры, ткните меня носом в процедуру печати текста 2х2 пожалуйста.

Alex Rider
21.07.2014, 13:05
Так оно ж несложно. Сдвигаешь в цикле байт из фонта, достаешь сдвинутый бит 2 раза, собираешь в регпару удвоенную по ширине линию буквы, и пихаешь ее в экран по два раза. Вот тут (http://zxpress.ru/book_articles.php?id=1027) принцип описан, но там отдельно 1x2 и 2x1.

denpopov
21.07.2014, 13:14
Так оно ж несложно.
Да, знаю.
просто табличка лукап строится медленно, придется на время самому текст нарисовать.

Andrew771
22.07.2014, 22:52
господа кодеры, ткните меня носом в процедуру печати текста 2х2 пожалуйста.
можь поможет - процедура вывода масштабированного в 2 раза спрайта: http://zx-pk.ru/showpost.php?p=371414&postcount=50

А мне вот сейчас понадобилась для будущего компилятора процедура ввода с клавиатуры чисел и строк, короче, аналог бейсиковского оператора INPUT. Ни у кого не завалялась? А то с нуля лень писать :)

Alex Rider
23.07.2014, 00:27
процедура ввода с клавиатуры чисел и строк
Можно позвать ПЗУшный если устроит. У меня есть свой редактор, но он черезчур сильно дружит с процедурой вывода символов 6x8.

---------- Post added at 00:27 ---------- Previous post was at 00:17 ----------

ПЗУшный примерно вот так звать:



; ROM routines
@chan_open equ #1601
@cl_lines equ #0e44
@set_min equ #16b0
@editor equ #0f2c
@break_key equ #1f54
@key_input equ #10a8

; System variables
@k_cur equ #5c5b
@err_sp equ #5c3d
@worksp equ #5c61
@curchl equ #5c51

input_file_name:
ld hl,Variables.input_buffer
ld de,Variables.input_buffer+1
ld bc,#0a
ld (hl),#20
ldir

xor a
call chan_open
ld b,#02
call cl_lines

input_line:
ld hl,flagx
set 7,(hl)
set 5,(hl)
call set_min

ld bc,#0001
rst #30
ld (hl),#0d
ld (k_cur),hl
ld hl,input_line_error
push hl
ld (err_sp),sp ;ERR-SP
ld bc,new_key_input
call set_key_input_routine
call editor
pop hl
ld hl,(worksp)
ld de,Variables.input_buffer
ld b,#08
input_line_copy:
ld a,(hl)
cp #0d
jr z,input_line_exit
ld (de),a
inc hl
inc de
djnz input_line_copy
jr input_line_exit

input_line_error:
ld de,Variables.input_buffer
ld a,(iy + #00)
cp #10
jr z,input_line_exit
ld a,#02
out (#0fe),a
input_line_exit:
ld bc,key_input
call set_key_input_routine
xor a
ld (de),a
ld a,2
call chan_open
jp set_min

set_key_input_routine:
ld hl,(curchl)
inc hl
inc hl
ld (hl),c
inc hl
ld (hl),b
ret

new_key_input:
call break_test
jp c,key_input
ld a,#0a
scf
ret

denpopov
23.07.2014, 10:21
есть древняя процедура опроса клавиатуры, дизассемблирована неизвестно откуда. Естественно, таблица недоделана.



device zxspectrum128
ORG #7000

begin
ld de,#4000
;ENTER CALL KEY:CP 255
; JR NZ,ENTER
E0 CALL KEY
CP 255:JR Z,E0
; CP 13:JR Z,ENDOF
; LD C,A:CP 8:JR Z,E2
ld l,a,h,0
add hl,hl
add hl,hl
add hl,hl
ld bc,#3C00:add hl,bc
push de
ld b,8
ei
halt
charlp: ld a,(hl),(de),a
inc hl,d
djnz charlp
pop de:inc de
jr E0
;
;--- K E Y B O A R D ---
;
KEY PUSH HL:PUSH DE
PUSH BC
LD HL,KEYS:LD D,#FE
K1 LD A,D:IN A,(254)
LD E,1:LD B,5
K2 RRCA:JR NC,K3
INC HL:SLA E:DJNZ K2
RLC D:JR C,K1
K3 LD A,(HL):POP BC
POP DE:POP HL:RET
KEYS DB 8,"zxcvasdfg"
DB "qwert1"
DB 124,96,126,91;|`~[
DB "0987",93;]
DB "poiuy"
DB 13,"lkjh ",8
DB "mnb",255

end
display /d,end-begin
savesna "!ants.sna",begin

denpopov
05.08.2014, 07:11
http://baze.au.com/misc/z80bits.html#2.1
Не знает ли кто-нибудь похожую процедуру, но попроще?
Нужно деление на 3 с получением остатка.

rasmer
05.08.2014, 10:19
есть древняя процедура опроса клавиатуры, дизассемблирована неизвестно откуда. Естественно, таблица недоделана.

За такой формат кода показываемый людям - руки отрывать надо.... ну пишите вы для себя хоть всё в одну строчку... Но уж для показывания людям причешите исходничек....

jerri
05.08.2014, 13:29
denpopov, не развивай флейм - исходник нечитабелен и оформлен не по ГОСТ.
пользоваться им неудобно.

Andrew771
05.08.2014, 22:22
В итоге я запилил-таки свою процедуру ввода с клавиатуры, неспешно пописывая то в поезде, то на природе (я щас в отпуске). Будет вставлена в библиотеку компилятора (там уже много интересного и моего, и не моего). Весь моск занят сейчас только им. :)

drbars
07.08.2014, 13:00
Andrew771, я тоже свою процедуру ввода текста писал для редактора.
Поддерживает почти все символы, без обращения к ПЗУ. Если нужна, могу скинуть пример.

Andrew771
11.08.2014, 10:29
Andrew771, я тоже свою процедуру ввода текста писал для редактора.
Поддерживает почти все символы, без обращения к ПЗУ. Если нужна, могу скинуть пример.
спасибо, у меня уже есть.

---------- Post added at 10:29 ---------- Previous post was at 10:28 ----------

Я кстати использую шрифт 4х8, чтоб поближе к PC (конвертить исходники Паскаля для PC было удобнее).

denpopov
15.09.2014, 07:24
Ломаю голову, как выполнить сложение 24бит+16бит, выходит вот что:
;D.HL +BC
ADD HL,BC
JR NC,M1
LD A,B
ADD A,D
LD D,A
M1: ....

это правильно, или нет?

Titus
15.09.2014, 09:16
Ломаю голову, как выполнить сложение 24бит+16бит, выходит вот что:
;D.HL +BC
ADD HL,BC
JR NC,M1
LD A,B
ADD A,D
LD D,A
M1: ....

это правильно, или нет?

Нет)
Что-нить типа того:



XOR A
ADD HL,BC
ADC A,D
LD D,A

denpopov
15.09.2014, 09:45
Нет)
Что-нить типа того:
а знак не учитывается?

Titus
15.09.2014, 09:54
а знак не учитывается?

При сложении и вычитании знак не имеет значения, если не требуется отследить арифметическое переполнение.

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

Например:

0x0A * 0x0F = 0x96

0xF6 (-0x0A) * 0xF1 (-0x0F) = 0x96

denpopov
15.09.2014, 10:09
D=0, HL=0
BC=-1/256

по идее при сложении выйдет не пойми что.

Titus
15.09.2014, 10:54
D=0, HL=0
BC=-1/256

по идее при сложении выйдет не пойми что.

Я не понял условие задачи)

Что такое -1/256?

Alex Rider
15.09.2014, 11:09
Может, так:


ADD HL,BC
SBC A,A
LD D,A

? Тогда при переполнении в D будет -1, а не 1.

denpopov
15.09.2014, 11:14
Я не понял условие задачи)

Что такое -1/256?

Попал мне в руки исходник эффекта Flora(есть в Heart MD). сам эффект заточен под Спектрумовский экран с кординатами 0..255.
Хотелось бы переделать под 0..319(это Амстрад или дендиконфа с 320х200).


? Тогда при переполнении в D будет -1, а не 1.
похоже, но не то. см.выше.

Titus
15.09.2014, 11:18
Попал мне в руки исходник эффекта Flora(есть в Heart MD). сам эффект заточен под Спектрумовский экран с кординатами 0..255.
Хотелось бы переделать под 0..319(это Амстрад или дендиконфа с 320х200).

А что не работает-то? Конкретно примеры в студию.

denpopov
15.09.2014, 11:21
А что не работает-то? Конкретно примеры в студию.


сам эффект заточен под Спектрумовский экран с кординатами 0..255.

исходники постить я не могу, пускай сам Trefi это делает. в чятике его не видно, Гоблин ему писал, он пока не ответил.

и да - скачай Heart MD и посмотри начало.

Titus
15.09.2014, 11:32
исходники постить я не могу, пускай сам Trefi это делает. в чятике его не видно, Гоблин ему писал, он пока не ответил.

и да - скачай Heart MD и посмотри начало.

Зачем мне куда-то лезть?

Ты сказал, что сложение 24 бита плюс 16 не работает, я попросил указать в примере, где и как не работает. А эффекты пусть кодеры пишут и ААА в zeppelinаторе.

denpopov
15.09.2014, 11:45
я попросил указать в примере, где и как не работает

А не говорил, что не работает, а просто спросил - правильно, или нет:

hl=0
bc=3 или 0.01 в формате 8.8
hl+bc=3

hl=0
-bc=FFFD
hl-bc=FFFFFFFD

Titus
15.09.2014, 11:53
hl=0
-bc=FFFD
hl-bc=FFFFFFFD

hl = 0
bc = FFFD (-3)
hl+bc = FFFD (-3)

0+(-3) = -3, что тебя смущает?

denpopov
15.09.2014, 12:10
0+(-3) = -3, что тебя смущает?
24 бита. я спросил - правильно, или нет, а решений - масса.


hl+bc = FFFD (-3)
и мой вариант, наверное правильный, в случае D.HL.
да и переполнения быть не должно..

Titus
15.09.2014, 12:13
24 бита. я спросил - правильно, или нет, а решений - масса.


и мой вариант, наверное правильный, в случае D.HL.
да и переполнения быть не должно..

По скольку операнды разноразрядные, и 16-битный искусственно дополняется до 24 бит (A = 0), то понятно, что 16-битный операнд должен быть беззнаковый, т.е. положительный. А 24-битный может быть любым.
Если же ты хочешь сложение 24 + 16, где 16 со знаком, то нужна другая формула, более громоздкая.

denpopov
15.09.2014, 12:26
то понятно, что 16-битный операнд должен быть беззнаковый, т.е. положительный.
мне нет, я привел пример, кмк.


Если же ты хочешь сложение 24 + 16, где 16 со знаком,
чур меня, чур!:)

rasmer
17.09.2014, 14:14
Ковыряю тут одну гамесу, наткнулся вот на такой код:
L_DF66 db #21 ;!
;
L_DF67 db #00
L_DF68 db #00
;
;#DF69
push hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
pop de
add hl,de
ld de,#0029
add hl,de
ld (L_DF67),hl
ld d,h
ld e,l
ld bc,#2492
or a
sbc hl,bc
jp nc,L_DF8B
ld a,#01
jp L_DFDD
;
L_DF8B ld h,d
ld l,e
ld bc,#4924
or a
sbc hl,bc
jp nc,L_DF9B
ld a,#02
jp L_DFDD
;
L_DF9B ld h,d
ld l,e
ld bc,#6DB6
or a
sbc hl,bc
jp nc,L_DFAB
ld a,#03
jp L_DFDD
;
L_DFAB ld h,d
ld l,e
ld bc,L_9248
or a
sbc hl,bc
jp nc,L_DFBB
ld a,#04
jp L_DFDD
;
L_DFBB ld h,d
ld l,e
ld bc,L_B6DA
or a
sbc hl,bc
jp nc,L_DFCB
ld a,#05
jp L_DFDD
;
L_DFCB ld h,d
ld l,e
ld bc,L_DB6C
or a
sbc hl,bc
jp nc,L_DFDB
ld a,#06
jp L_DFDD
;
L_DFDB ld a,#07
L_DFDD ld b,a
В DF67 u DF68 при инициализации заносятся значения регистра r
Единственное на что меня хватило - это вот на это:


table001: ;tablica 4astoti poyavleniya figurok
db #db,#b7,#92,#6e,#49,#25,#00
FindNewFigure:
db #21
L_DF67 db #00
L_DF68 db #00
push hl
pop de
ld h,l
add hl,de
ld a,r
ld e,a
add hl,de
ld (L_DF67),hl

ld a,h
ld b,7
ld hl,table001
finews001:
cp (hl)
jr nc,L_DFDD
inc hl
djnz finews001
L_DFDD ld a,b

drbars
19.09.2014, 06:06
Ковыряю тут одну гамесу, наткнулся вот на такой
Лютый индус код :v2_dizzy_roll:

rasmer
19.09.2014, 15:00
Лютый индус код :v2_dizzy_roll:
там и более интересные места есть.... :) которые уже в принципе не поддаются оптимизации по причине того что там легче всё переписать с нуля... :)
Это аммитрис.... могу исходник выложить.... поржёшь... :)

denpopov
19.09.2014, 15:12
Посмотрел на AgonyMD. как эти церти умудрились сделать такой полноэкранный скроллер?
тоже нужен для демы:)

jerri
19.09.2014, 15:26
denpopov, тут просто же

зануляем линию (они так делают)
потом рисуют 8 точек в соответсвии с искажением по горизонтали.
рисуют не все разумется линии а только те что изменились
потому как точки по высоте сильно отличаются

denpopov
19.09.2014, 15:35
jerri, вот мне и непонятно, как таблички строятся. и как рисовать буквы(

jerri
19.09.2014, 16:09
по адресу #F600 - #fdxx находится таблица раскранченных побитно символов для вывода.
E1хх - счетчик строк обновляется каждые 12 значений.
e2xx - указатель какую именно строчку из буфера строк брать
e3хх - e4хх - адрес строки на экране.

e5xx - левая граница маски точки 0
e6xx - ширина точки 0 в байтах
и тд по f4xx

f5xx - правая граница маски для последней точки (инвертированная).

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

jerri
19.09.2014, 19:36
jerri, вот мне и непонятно, как таблички строятся. и как рисовать буквы(

Таблички идут пререндеренные - рендера тут нет

вот этот код рисует буквы в буфере



;счетчик сдвига - каждые #48 рисуем букву
ld a, (byte_8137)
or a
jr nz, loc_8098
ld a, 48h ; 'H'
ld (byte_8137), a

loc_80AA:
ld hl, 0
ld a, (hl)
cp 0FFh
jr nz, loc_80B6
ld hl, unk_81F9 ; scroll text
ld a, (hl)
;берем букву
loc_80B6:
inc hl
ld (loc_80AA+1), hl

;вычисляем адрес буквы
;очень... криво

sub 20h ; ' '
ld d, 0
ld e, a
ld h, d
ld l, d
ld b, 8

loc_80C3:
add hl, de
djnz loc_80C3
ld de, unk_9C40 ; font data
add hl, de
;высота буквы кстати 6
ld b, 6
;вот здесь берем текущий указатель где рисовать очередную букву
;так как рисуем на экран из разных мест
ld a, (byte_8136)
ld e, a

loc_80D0:
ld d, 0F6h
ld a, (hl)
inc hl
push bc

;вот здесь размазываем букву в буфер делая каждую точку= #ff
ld b, 8

loc_80D7:
ld c, 0
add a, a
jr nc, loc_80DD
dec c

loc_80DD:
ex af, af'
ld a, c
ld (de), a
inc d
ex af, af'
djnz loc_80D7
inc e
pop bc
djnz loc_80D0
ld a, e
ld (byte_8136), a
jr loc_8098

drbars
19.09.2014, 20:21
rasmer, выложи, гляну. Ты с какой целью это ковыряешь?

denpopov
19.09.2014, 20:23
уж не знаю что плохого в этом методе - не подскажешь.
в унрыле интерфейс TurboVision?

Alex Rider
19.09.2014, 23:04
в унрыле интерфейс TurboVision?
Нет, он на C написал в MSVC. VurboVision - это от Borland.

rasmer
19.09.2014, 23:51
rasmer, выложи, гляну. Ты с какой целью это ковыряешь?С целью получения опыта, да и просто для поддержани своего чайника в рабочем состоянии.... :) В приложении - первоначальная декомпиляция.... потом уже ковырял и переделывал.... :)

denpopov
20.09.2014, 07:34
Оно тебе надо?
ну точно нет. я набалован Spectaculator'ом. Если в 9-й версии будет реализовано запланированное, тогда не оторвешь, наверное.


Нет, он на C написал в MSVC. VurboVision - это от Borland.
ну все равно стиль такой же.

---------- Post added at 07:34 ---------- Previous post was at 07:32 ----------


Ты с какой целью это ковыряешь?

просто по задумке демы нужен похожий скролл, пытаюсь разобраться, а не тупо рипнуть. Да и не подходит он;)

denpopov
20.09.2014, 11:13
я спектакулятором не пользовался, так как вечно было жалко деньгов на его покупку.

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


Но имхо отладчик в анрыле для разработки самый лучший... :-)

брал отладчик у tslabs.info, по идее все хорошо, но отладчик не понравился. Например, брякпойнты вылезли внезапно!

denpopov
20.09.2014, 13:13
Парни, кому не в западло, ближе к телу. По приведенному эффекту из AgonyMD меня интересует как сжать скроллер.

denpopov
20.09.2014, 16:27
давай сначала определимся, что значит 'сжать'?

сузить буквы по ширине для начала.

rasmer
20.09.2014, 19:24
сузить буквы по ширине для начала.тогда смотри - джерри тебе уже все расписал что там и где - запили как есть сейчас. Потом заменишь распаковку букв по ширине и выводилку - таблица какую строку брать там есть - её тебе менять ненадо.

denpopov
02.11.2014, 19:39
http://members.casema.nl/hhaydn/howel/Acorn/Atom/atap/sierpinski.png

Кривая Серпинского строится там:
http://members.casema.nl/hhaydn/howel/Acorn/Atom/atap/atap_11.htm

нигде не нашел, что такое PLOTS, поменял на DRAW, и ничего не вышло.
может, есть какие-то идеи?

Destr
06.11.2014, 03:03
нигде не нашел, что такое PLOTS, поменял на DRAW, и ничего не вышло.
может, есть какие-то идеи?
Эти гады пусть по-русски пишут.
А вообще там какой-то бейсик (одно из наречий), тупо копипастя в спек это не забить, выцыпляй алгоритм и всё получится (правда всё по-спековски - медлено и мучительно)

И будет тебе твоя кривая...

---------- Post added at 03:03 ---------- Previous post was at 02:59 ----------

Тут кстати (на форуме) где-то ААА мается, пинает народ на демки и прочее непотребство, вот и кинь им идею что мол эффект пропадает.
Если кодеры загорятся - они тебе в реалтайме эту кривулю вычислят, да под музыку всё, под музыку!
Только трудно их заставить, но уж если начнут - не удержишь!