Просмотр полной версии : ЭТЮДЫ
если использовать set'ы - 700*15=10 500т
+ inc h - 700*4=2800т
итого 12800, а есть около 18000 свободных
Помогите с оптимизацией построения вертикальной линии. То, что надумал я не устраивает по скорости
Дело в том, что на входе желательно только иметь адрес и кол-во точек
До начала построения основного экрана строится линия примерно из 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
по идее не помешало бы развернуть такой цикл.
там два 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 сколько надо
было бы идеально
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
А начало и конец дорисовывать отдельно.
GM BIT, там не 16384
там 192*2 байта таблица
Как правильно организовать кольцевой счетчик на 6 (цветов)?
естьhttp://savepic.org/5257679.gifнадоhttp://savepic.org/5252559.gif
Только надо "ровный", без условных переходов, ибо бордюр, а у мну только на 8 получился, и то криво((
В шесть регистров надо 6 чисел записывать. Можно конечно в памяти сделать 6 ячеек и LDIR-ом их сдвигать по кругу, но тогда я не придумаю как задержку регулировать а5 же ровно.
Как правильно организовать кольцевой счетчик на 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?
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.
Это вся процедура. Номер цвета в 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.
А без таблиц ? :)
А без таблиц ? :)
а без таблиц
;0 1 2 3 4 5
ld a,0
counter equ $-1
inc a
cp 6
jr nz,$+3
xor a
ld (counter),a
а без таблиц
;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
denpopov, а по мне так удобнее
denpopov
05.04.2014, 15:03
denpopov, а по мне так удобнее
не буду спорить, просто мой пример все же читаемый.
осталось подойти к лукапам:)
не буду спорить, просто мой пример все же читаемый.
А через месяц забыл,что там код модифицируется и сделал так:
counter: push af
ld a,0
Зато "ровная"
Надо по хорошемуу только цвета 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
А альтернативный набор занят совсем?
Свободен совсем, с ним конечно да, наверное проще.
Вопрос остается в том, что моя процедура сразу со счетчиком тактов, причем ровным. Если его реализовать отдельно - то можно любую из вышеприведенных реализовать, даже мой вариант с LDIR-ом. Вообщем чтобы не объяснять третий раз - исходник с некоторыми комментариями и снапшотом.
вряд ли.
открой свой код трех летней давности и скажи что ты видишь.
---------- 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
А я так:
;======================
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
Отлично)) Вариант от drbars работает так, как задумано))
Правда против часовой стрелки, я хотел по)) Не суть. Как скорость менять - не понял)
Вариант от jerri тоже отлично работает, задумка интересная со стеком, но вот цвета путает(( Видимо надо как то таблицу перестроить. Суть в том, чтобы по часовой стрелке менялись A>B>D>E>H>L и снова >A
denpopov
05.04.2014, 22:49
открой свой код трех летней давности и скажи что ты видишь.
а вот древнего кода у меня и не осталось :(
Отлично)) Вариант от drbars работает так, как задумано))
Правда против часовой стрелки, я хотел по)) Не суть. Как скорость менять - не понял)
Упс.
AND #07 ; speed
AND %00001111 - медленее
AND %00000011 - быстрее
а вот древнего кода у меня и не осталось :(
воооот :) а у меня есть...
так что поверь старому сенсею
метки надо задавать так, чтобы не было потом головной боли
---------- 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, да
Это хорошо)
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:
out (c),0 - команда нестабильная.
Кстати, а что за флаговое безобразие после BIT n,(HL), которое на WOS'е трут?
Вроде как похоже на смену цветов..
Похоже)) Но пример - маленький..
Дорисовал картинку))
тут же надо будет менять все 768 байт атрибутов. Я правильно понимаю??
Сделать такой же фокус - атрибуты цвета менять по кругу, или сложно и тактов не хватит??
В аттаче - статический экран, но с картинойю..
http://savepic.net/5159201m.png (http://savepic.net/5159201.htm)
тут же надо будет менять все 768 байт атрибутов.[/IMG][/URL]
768 байт? :rolleyes:
drbars, да легко
ld e,(hl)
ld a,(de)
ld (hl),a
inc l(hl)
вот 768 таких конструкций разместить там, где место по тактам есть
denpopov
08.04.2014, 19:09
Похоже)) Но пример - маленький..
Дорисовал картинку))
тут же надо будет менять все 768 байт атрибутов. Я правильно понимаю??
Сделать такой же фокус - атрибуты цвета менять по кругу, или сложно и тактов не хватит??
В аттаче - статический экран, но с картинойю..
я намедни занят, погляжу потом.
все сводится к построению лукапа и смены 768 байт.
zebest, А потому что у тебя еще бордюр вертится.
HL должен указывать на начало области аттрибутов (#5800)
DE на таблицу изменения цвета (тут все сложно)
А потому что у тебя еще бордюр вертится.
а если пока абстрагироваться от бордюра?? Сперва без него сделать?
Ну а если с бордюром - то условные переходы тоже можно же выравнивать.
Понятно, что в за один фрейм не выйдет все перерисовать, но теоретически можно же разделить подготовку экрана на несколько прерываний, бордюр как бы тоже не каждое прерывание перекрашивается..
Эт так, теоретизирование)
denpopov
09.04.2014, 07:53
Выявлем прелести конвертирования картинки)
denpopov
09.04.2014, 07:55
Ну а если с бордюром - то условные переходы тоже можно же выравнивать.
можно и проще сделать. Сколько переменных для бордера?
Выявлем прелести конвертирования картинки)
ну я то ее сперва нарисовал, а потом конвертил. Это прелести ограничения цветов на знакоместо, тут ничего не попишешь.
Но в целом да, так как задумано работает)
Сколько переменных для бордера?
Все регистРы) Исходники же выше были неск.раз.
Если тактов не особо много - то можно попробовать совместить с бордюром.
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
и потом выходит полный трэшак, если реализовать такое быстрое умножение..
а на потом есть еще один интересный алгоритм, на котором я залип:(
Попалось мне быстрое умножение:
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)
это достойно, я считаю.
Наткнулся на вот такое:
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 делал фрактальчик атрибутный
эти ужасные треугольники? бред.
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
выходит фигня:(
подскажите плз, что не так?
делаю:
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
кстати, не нашел темы про скроллер на две точки. Если кто помнит, дайте линк плз, возникла идея.
Надо получить 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
со второй половиной ваааще непонятно, ничего не вышло
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.
denpopov, а что не понятно?
у тебя первая половина рисует 1/8 окружности (половину сектора)
а вторая половина рисует вторую 1/8 окружности
и на середине они должны встретиться
и на середине они должны встретиться
- Я буду есть сосиску с начала, а ты с конца.
- Встретимся на середине!
(c) Котенок по имени Гав.
denpopov
02.06.2014, 12:40
а вторая половина рисует вторую 1/8 окружности
не рисует, а выходит горизонтальная линия.
в текстовке есть ссылка на C9 hacking, взял процедуру там.Теперь интересно, прокатит ли EOR fill с заливкой окружности...
denpopov, если выходит горизонтальная линия значит там ошибка.
Ребятки, вы не заметили, что я уже несколькими постами выше написал, где там ошибка)
denpopov
02.06.2014, 13:09
Ребятки, вы не заметили, что я уже несколькими постами выше написал, где там ошибка)
верно, работает, спасибо!
Теперь интересно, прокатит ли EOR fill с заливкой окружности...
Конечно прокатит, почему нет? Окружность-то сплошная.
denpopov
02.06.2014, 13:43
Окружность-то сплошная.
ты пропустил Eor fill
ты пропустил 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:
Ты меня потерял:v2_dizzy_facepalm:
Хм... как я понял, ты хотел алгоритм круга, который потом можно залить по EOR Fill, т.е. чтобы на одной линии было только 2 пикселя - первый включающой заливку, второй выключающий. Вот такой модифицированный алгоритм я тебе и написал.
denpopov
02.06.2014, 14:30
Хм... как я понял, ты хотел алгоритм круга, который потом можно залить по EOR Fill,
Да, а что такое plot4()?процедура отрисовки линии для заливки?
В первой половине "Radius", а во второй только "R"
Моя процедура расчета адреса атрибутов или атрибутной карты из полных экранных координат (Х,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
мне кажется, что если лукапы построить, то будет быстрее..
denpopov
02.06.2014, 17:03
Какие лукапы?
ld h,'table
как формируется таблица?
не, не быстрее, не так цитату прочитал.
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
то прокатит, наверное..
denpopov
02.06.2014, 18:39
L(Y) = (Y*4)&#e0
это вообще непонятно пока что.
Да, а что такое 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
к заливке это все равно не относится..
ладно,буду с утра на свежую голову думать..
к заливке это все равно не относится..
ладно,буду с утра на свежую голову думать..
Ну как это не относится. Нарисовал сперва контур, потом залил все вместе) Или ты хочешь рисовать и заливать одновременно?
---------- Post added at 19:04 ---------- Previous post was at 18:55 ----------
Вот пример трех версий рисования круга на бейсике - простая, для EOR Fill и залитая сразу - http://sderni.ru/231329
>Цитата:
>Сообщение от alone Посмотреть сообщение
>L(Y) = (Y*4)&#e0
>это вообще непонятно пока что.
Это всё равно что (Y&#f8)<<2
denpopov
02.06.2014, 19:40
для EOR Fill
убей меня, но это не похоже на технику.
А что ты имеешь против EOR fill? Если фигур много, то в самый раз.
denpopov
02.06.2014, 20:52
А что ты имеешь против EOR fill? Если фигур много, то в самый раз.
ну ты же на speccy.info статью написал... для окружности не подходит алгоритм, с утра напишу другую заливку.
ну ты же на 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
с заливкой получилось только так..
а я читал про вертикальнгую заливку, и в 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.
так какой лучше взять? хочу делить число без знака на 320.
Беззнаковый)
А если делишь на константу, тем более такую простую - пиши деление на константу, оно будет гораздо быстрее.
хочу делить число без знака на 320.
Вместо того чтобы делить на константу, лучше умножать на константу.
---------- Post added at 13:35 ---------- Previous post was at 13:33 ----------
Какой у тебя диапазон делимого? Отбрасывание дробной части или округление до ближайшего лучше?
denpopov
03.06.2014, 11:47
признаться говоря, я ничего не придумал для алгоритма, просто нужно делить число, которое изменяется от 0 до $FFFF, на 320.
признаться говоря, я ничего не придумал для алгоритма, просто нужно делить число, которое изменяется от 0 до $FFFF, на 320.
Лучше обрисовать цель деления.
---------- Post added at 11:51 ---------- Previous post was at 11:49 ----------
Вместо того чтобы делить на константу, лучше умножать на константу.
Через умножение можно не получить требуемой точности. Все зависит от задачи.
denpopov
03.06.2014, 12:00
Лучше обрисовать цель деления.
прям так палить эффект? это или на TS-Conf, или на Спектрум.
Через умножение можно не получить требуемой точности. Все зависит от задачи.
Ну вот, например, умножаем на 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 :)
Andrew771, замени деление на 10 уможением
Andrew771
03.06.2014, 13:11
Andrew771, замени деление на 10 уможением
x*26/256
x*26/256
и получаем x/32*26/256
denpopov
03.06.2014, 13:21
математики, интересно, а как впихать 65535 значений повсюду?
denpopov, а что тебя смущает то?
65535/32=2047*26=53248/256=208
так что если посчитать то можно и в табличку все забить
вышло немного тормозно
Попробуй резко и очень неточно, для проверки, это-ли место вносит основное торможение:
; 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
тогда нужен еще и остаток.
тогда нужен еще и остаток.
Тогда забудь про моё предложение, раз у тебя такие барские требования. :)
Расплывчатость постановки задачи всегда ухудшает оптимальность ее решения)
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
на счёт кругов... почему не использовать "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
создай библиотеку спрайтов окружностей :)
зачем два цикла если один достаточно ?
Если нужен EORFill, то:
В одном цикле рисуются верхушки и низушки окружностей, сплошняком. Каждая точка на своей вертикальной линии.
В другом цикле рисуются боковины, не сплошняком, а только ступеньки. Каждая ступенька на своей вертикальной линии.
А потом EORFill сверху вниз всё закрасит как надо.
Набросал иллюстрацию (http://zx.pk.ru/showpost.php?p=714675&postcount=238)на Обероне (http://zx.pk.ru/showthread.php?t=18472). Строит 20 случайных мишеней, любуемся "боковинками" и "крышками" окружностей, давим на кнопку, происходит EORFill.
некошерная окружность вышла
Собственно на скорую руку, вот вторая версия (тоже неоптимальная, но смысл тот же)
Ещё небольшой апдейт, в последней строчке лучше юзать не "x<y" a "x<=y" (иначе в некоторых случаях будет одного пикселя не хватать)
Ещё небольшой апдейт, в последней строчке лучше юзать не "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.
А в режиме 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
;---------------------------------------------------------------
Заодно найдены две процедурки форматирования..
ОТВЕТ НА ЗАДАЧУ ГН. КОЛОТОВА. ║▒
;║ ПРОЦЕДУРА ПЕЧАТИ СИМВОЛА АТРИБУТАМИ НА ЭКРАНЕ.
А кто-нибудь пробовал эту процедуру запустить? :)
denpopov
08.06.2014, 05:12
А кто-нибудь пробовал эту процедуру запустить
с дополненым кодом я пробовал, мелкие буквы как-то криво печатаются.
А кто-нибудь пробовал эту процедуру запустить? :)
Разве глючная?
Получил письмо на электромыло :)
Процедура рисует букву атрибутами на ВЕСЬ (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
Автор всё ещё негодуэ...
;
;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
што, опять атрибутами?оО
Другая задачка: рисуем букву атрибутами (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) никому не интересна?
Она ведь чуть медленее табличного варианта по скорости.Интересна, просто она непростая, а времени нет. Скачал сразу после выхода, обязательно прочту, когда чуть разгружусь.
Разве глючная?
В голове прокрутил - да.
Испробовать пока-что не с руки.
Да и ревюшники хоть и пыжились (мол мы тут все тру), но бывало что и ушами хлопали всякий бред печатая без проверки.
А уж что рассылали (причём за деньги) - про то вообще отдельная песня.
Сколько жалоб в прессе на их "дистрибутивы".
Хотя конечно понять можно: тогда это дело только зарождалось, конечно в те времена только методом проб и ошибок...
Интересна, просто она непростая, а времени нет. Скачал сразу после выхода, обязательно прочту, когда чуть разгружусь.
Писал для диззика, но в итоге реализовал табличный способ... более универсальный и компактный в быстрой памяти.
Ещё в дополнение рисования буквы атрибутами на весь экран, мой пример:
Он не самый короткий, но показывает насколько ассебмлер многогранен :)
; 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, то часть байтов на процедуре можно съэкономить..
не помню кто, вроде бы Vitamin предлагал: если использовать код символа*8, то часть байтов на процедуре можно съэкономить..
А если хранить текст не кодами символов, а уже адресами литер - то можно и ещё сэкономить.
"Но, господа, это уже не физика!" (Это цитата. В данном случае она означает что экономия байтов уже начинает перетекать в абстрактную задачу. Хотя в частных случаях возможно это и пригодится.)
denpopov
12.06.2014, 16:31
А если хранить текст не кодами символов, а уже адресами литер - то можно и ещё сэкономить.
какая банальность:) в процедурах описано А=код символа.
если модифицировать код, то пуркуа ба не LD,A,"0"*N?
давно не проверял почту, нашел негодование господина Колотова. А почему бы ему на форум не прийти? есть же чему учиться..
какая банальность в процедурах описано А=код символа.
если модифицировать код, то пуркуа ба не LD,A,"0"*N?
А вот не банальность, а Ваша, т.denpopov, невнимательность.
Хранить адрес литеры в фонте в 8-ми битном регистре не получится.
(и к слову - код символа*8 тоже не выйдет передавать через A)
denpopov
12.06.2014, 19:53
не стоит придираться к словам, лучше продемонстрируйте, что ли..
denpopov, чего тут непонятно?
A=33="!"
если хранить код символа *8 то получится 33*8=264 а размерность А всего 8 бит
т.е под каждый символ - 2 байта
denpopov
13.06.2014, 09:49
т.е под каждый символ - 2 байта
а если *4?
а если *4?
тогда берем символ #7f который (c) и понимаем что больше чем *2 не сделать
но для чего эти телодвижения?
Ты можешь ответить внятно?
denpopov
13.06.2014, 10:37
но для чего эти телодвижения?
Ты можешь ответить внятно
просто была мысль сократить процедуру, для печати букв можно использовать...
просто была мысль сократить процедуру, для печати букв можно использовать...
"Экономия на туалетной бумаге"
Здесь ты упростил а в вызывающей процедуре может теперь понадобиться пара лишних телодвижений
denpopov
13.06.2014, 12:27
"Экономия на туалетной бумаге"
точно!http://sysadmins.ru/images/smiles/idea.gif
Я где-то использовал текст, состоящий из младших байтов адреса букв (буквы высотой 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
не совсем то..
denpopov, а что тебя не устраивает то?
y=x*x так?
размер таблицы - 512 байт
denpopov
29.06.2014, 10:26
denpopov, а что тебя не устраивает то?
способ генерации мне не нравится. Да и не ясно, какое значение будет при (-1)^2?
способ генерации мне не нравится. Да и не ясно, какое значение будет при (-1)^2?
Способ нормальный, правда инверсное расположение мне не нравится, и то, что квадрат хранится сразу словом, а не раскидан по сегментам. Я недавно вроде бы начал переделывать, правда не помню уже чем закончилось все )
denpopov
29.06.2014, 12:41
Способ нормальный, правда инверсное расположение мне не нравится, и то, что квадрат хранится сразу словом, а не раскидан по сегментам.
Куда я попал? это кружок начинающих кодеров?
http://zxpress.ru/article.php?id=1819
Ну что там, ДенПопов?
Помогло, не?
Куда я попал? это кружок начинающих кодеров?
Не переживай denpopov, ты попал по адресу, все когда-то начинали, т.ч. мы тебе поможем.
denpopov
29.06.2014, 18:04
Ну что там, ДенПопов?
Помогло, не?
отпустило всего лишь навсего..
отпустило всего лишь навсего..
Тебя, браза, хрен поймёш...
То тебе квадрат вычислить надо (да не простой, а чтоб и -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.
естественно неоптимизировано. Как бы анимировать эту картинку?
Как бы анимировать эту картинку?
Первое что приходит на ум, это как недавно Introspec (http://zx-pk.ru/showpost.php?p=721011&postcount=105) рассказывал. Чтобы оно ехало. Сделать в 7-й странице сдвинутую на четверть, и переключать с атрибутным инвертированием.
Второе что пришло на ум, переставлять местами случайные знакоместа. :)
denpopov, а еще можно инвертировать аттрибуты
denpopov
01.07.2014, 11:11
атрибуты - это не анимация.
не помню, где видел, вроде бы в наборе 128б, Алонекодер проводил компо..
ZX-Guide #3. Этот эффект там так и называется "oboi".
denpopov
01.07.2014, 11:39
Этот эффект там так и называется "oboi".
oboi из ZXревю взято, наверное.
Вот 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
какой график функции?
на синусоиду разве не похоже?
Не оно ?
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
что-то у меня нелады с тригонометрией:( получается пока что плохо..
что-то у меня нелады с тригонометрией:( получается пока что плохо..
Такую большую картинку следует убирать под спойлер.
Складываешь две синусоиды друг с другом, и получаешь искомое.
Например 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
помогает
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
Где проверено, если значения не те? Сам же просишь
синус правильно строится, это легко проверить, если построить табличку.
Таблицу можно и в пуребасике построить, как ты видимо и сделал.
мне непонятно, какую я допустил ошибку при расчете графика.
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 с получением остатка.
есть древняя процедура опроса клавиатуры, дизассемблирована неизвестно откуда. Естественно, таблица недоделана.
За такой формат кода показываемый людям - руки отрывать надо.... ну пишите вы для себя хоть всё в одну строчку... Но уж для показывания людям причешите исходничек....
denpopov, не развивай флейм - исходник нечитабелен и оформлен не по ГОСТ.
пользоваться им неудобно.
Andrew771
05.08.2014, 22:22
В итоге я запилил-таки свою процедуру ввода с клавиатуры, неспешно пописывая то в поезде, то на природе (я щас в отпуске). Будет вставлена в библиотеку компилятора (там уже много интересного и моего, и не моего). Весь моск занят сейчас только им. :)
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: ....
это правильно, или нет?
Ломаю голову, как выполнить сложение 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
Нет)
Что-нить типа того:
а знак не учитывается?
а знак не учитывается?
При сложении и вычитании знак не имеет значения, если не требуется отследить арифметическое переполнение.
Мало того, даже при умножении знак не имет значения, если умножаются равноразрядные операнды, и результат той же разрядности.
Например:
0x0A * 0x0F = 0x96
0xF6 (-0x0A) * 0xF1 (-0x0F) = 0x96
denpopov
15.09.2014, 10:09
D=0, HL=0
BC=-1/256
по идее при сложении выйдет не пойми что.
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.
похоже, но не то. см.выше.
Попал мне в руки исходник эффекта Flora(есть в Heart MD). сам эффект заточен под Спектрумовский экран с кординатами 0..255.
Хотелось бы переделать под 0..319(это Амстрад или дендиконфа с 320х200).
А что не работает-то? Конкретно примеры в студию.
denpopov
15.09.2014, 11:21
А что не работает-то? Конкретно примеры в студию.
сам эффект заточен под Спектрумовский экран с кординатами 0..255.
исходники постить я не могу, пускай сам Trefi это делает. в чятике его не видно, Гоблин ему писал, он пока не ответил.
и да - скачай Heart MD и посмотри начало.
исходники постить я не могу, пускай сам 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
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.
да и переполнения быть не должно..
24 бита. я спросил - правильно, или нет, а решений - масса.
и мой вариант, наверное правильный, в случае D.HL.
да и переполнения быть не должно..
По скольку операнды разноразрядные, и 16-битный искусственно дополняется до 24 бит (A = 0), то понятно, что 16-битный операнд должен быть беззнаковый, т.е. положительный. А 24-битный может быть любым.
Если же ты хочешь сложение 24 + 16, где 16 со знаком, то нужна другая формула, более громоздкая.
denpopov
15.09.2014, 12:26
то понятно, что 16-битный операнд должен быть беззнаковый, т.е. положительный.
мне нет, я привел пример, кмк.
Если же ты хочешь сложение 24 + 16, где 16 со знаком,
чур меня, чур!:)
Ковыряю тут одну гамесу, наткнулся вот на такой код:
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
Ковыряю тут одну гамесу, наткнулся вот на такой
Лютый индус код :v2_dizzy_roll:
Лютый индус код :v2_dizzy_roll:
там и более интересные места есть.... :) которые уже в принципе не поддаются оптимизации по причине того что там легче всё переписать с нуля... :)
Это аммитрис.... могу исходник выложить.... поржёшь... :)
denpopov
19.09.2014, 15:12
Посмотрел на AgonyMD. как эти церти умудрились сделать такой полноэкранный скроллер?
тоже нужен для демы:)
denpopov, тут просто же
зануляем линию (они так делают)
потом рисуют 8 точек в соответсвии с искажением по горизонтали.
рисуют не все разумется линии а только те что изменились
потому как точки по высоте сильно отличаются
denpopov
19.09.2014, 15:35
jerri, вот мне и непонятно, как таблички строятся. и как рисовать буквы(
по адресу #F600 - #fdxx находится таблица раскранченных побитно символов для вывода.
E1хх - счетчик строк обновляется каждые 12 значений.
e2xx - указатель какую именно строчку из буфера строк брать
e3хх - e4хх - адрес строки на экране.
e5xx - левая граница маски точки 0
e6xx - ширина точки 0 в байтах
и тд по f4xx
f5xx - правая граница маски для последней точки (инвертированная).
таблицы явно предрассчитанные. как считать - хз сам смотри
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
rasmer, выложи, гляну. Ты с какой целью это ковыряешь?
denpopov
19.09.2014, 20:23
уж не знаю что плохого в этом методе - не подскажешь.
в унрыле интерфейс TurboVision?
Alex Rider
19.09.2014, 23:04
в унрыле интерфейс TurboVision?
Нет, он на C написал в MSVC. VurboVision - это от Borland.
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
давай сначала определимся, что значит 'сжать'?
сузить буквы по ширине для начала.
сузить буквы по ширине для начала.тогда смотри - джерри тебе уже все расписал что там и где - запили как есть сейчас. Потом заменишь распаковку букв по ширине и выводилку - таблица какую строку брать там есть - её тебе менять ненадо.
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, и ничего не вышло.
может, есть какие-то идеи?
нигде не нашел, что такое PLOTS, поменял на DRAW, и ничего не вышло.
может, есть какие-то идеи?
Эти гады пусть по-русски пишут.
А вообще там какой-то бейсик (одно из наречий), тупо копипастя в спек это не забить, выцыпляй алгоритм и всё получится (правда всё по-спековски - медлено и мучительно)
И будет тебе твоя кривая...
---------- Post added at 03:03 ---------- Previous post was at 02:59 ----------
Тут кстати (на форуме) где-то ААА мается, пинает народ на демки и прочее непотребство, вот и кинь им идею что мол эффект пропадает.
Если кодеры загорятся - они тебе в реалтайме эту кривулю вычислят, да под музыку всё, под музыку!
Только трудно их заставить, но уж если начнут - не удержишь!
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot