PDA

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



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

rasmer
05.06.2005, 16:29
А ведь действительно почему бы не возродить ( как это предлагал breeze) такую тему как Этюды )

Так что выкладывайте сюда смело свои (не)удачные опыты в программировании и можетбыть вам кто нибудь поможет


хотелось бы увидеть аттач немного (много) оптимизированным и в 64 символа в строке - а там пропорциональный скролл "рисованным" из символов фонтом.

Sinus
14.06.2005, 02:26
Ахотелось бы увидеть аттач немного (много) оптимизированным и в 64 символа в строке - а там пропорциональный скролл "рисованным" из символов фонтом.
Ой давно я уже спека не видел ;)
Долго сдувал пыль с кая, но всё-таки запистил.
64 символа в строке, скролл, всё бенчит, даже фреймово. (а как же иначе?)

Запускать SCRL.B
исходник - SCROLL.H

P.S. Алясм заточен под 512 пент. Если у вас другая раскладка памяти, то... всё равно ничего менять не надо ;))))) Ибо всё будет бенчить.

rasmer
14.06.2005, 13:46
Ну чтож - за 11 дней 10 скачиваний, и только один ответ - Уже неплохо :)

rasmer
14.06.2005, 13:52
64 символа в строке, скролл, всё бенчит, даже фреймово. (а как же иначе?) Единственный справившийся с заданием... УРА!!!

Rubts0FF
14.06.2005, 22:35
А ведь действительно почему бы не возродить ( как это предлагал breeze) такую тему как Этюды ).
Идейка хороша. ТОЛЬКО не нужно делать привязки к конкретным асмкомпиляторам. Проблема не в перекодировке, а в том что некоторые асс-компиляторы стали использовать свой синтаксис. Тексты должны быть в тексте ;).

Sinus
14.06.2005, 23:59
Единственный справившийся с заданием... УРА!!!
Хех, надо ж было кай продуть :)
А вот скоро TargeT будет! (ДА! Он всё-таки будет!) так там оболочка вааще афигеть ;)

Sinus
15.06.2005, 00:10
Идейка хороша. ТОЛЬКО не нужно делать привязки к конкретным асмкомпиляторам. Проблема не в перекодировке, а в том что некоторые асс-компиляторы стали использовать свой синтаксис. Тексты должны быть в тексте ;).
Ни за что не откажусь от DUP и EDUP а так же переменных ;)
Оригинальный Zilog Z80 синтаксис конечно ничего так, но иногда намного удобнее написать

DUP 1024
LD A,(HL)
RRA
OR (HL)
LD (HL),A
INC HL
EDUP

чем тыщу раз копировать кусок кода

rasmer
15.06.2005, 01:01
Идейка хороша. ТОЛЬКО не нужно делать привязки к конкретным асмкомпиляторам. Проблема не в перекодировке, а в том что некоторые асс-компиляторы стали использовать свой синтаксис. Тексты должны быть в тексте ;).Ну во первых - никаких суперкоманд zxasm я не использовал...
а во вторых сконвертить всё в текст и записать на диск можно и в нем - File\Reimport....
а в снапшоте потому, чтобы сразу было видно, что это такое...

lvd
21.06.2005, 22:08
задачка - crc16 ccitt на Z80.

Алгоритм такой:


// Update the CRC for transmitted and received data using
// the CCITT 16bit algorithm (X^16 + X^12 + X^5 + 1).

unsigned char ser_data;
static unsigned int crc;

crc = (unsigned char)(crc >> 8) | (crc << 8);
crc ^= ser_data;
crc ^= (unsigned char)(crc & 0xff) >> 4;
crc ^= (crc << 8) << 4;
crc ^= ((crc & 0xff) << 4) << 1;


На асме у меня получилось такое:


;hl - from
;b - how many
;de - crc value

crc16:
ld de,#ffff
loop:
ld a,d
ld d,e
xor (hl)
inc hl
ld e,a
rrca
rrca
rrca
rrca
and #0f
xor e
ld e,a
rrca
rrca
rrca
ld c,a
rrca
and #f0
xor d
ld d,a
ld a,c
and #1f
xor d
ld d,a
ld a,c
and #e0
xor e
ld e,a
djnz loop
ret


Кто быстрее? Только чур без использования таблиц!... =)

набор тестовых векторов:


одна латинская буква "A"
0xB915

9 символов "123456789"
0x29B1

256 латинских букв "A" подряд
0xEA0B

lvd
21.06.2005, 22:56
Кто быстрее? Только чур без использования таблиц!... =)


Тьфу ты, в смысле, кто короче! =)

Alex/AT
22.06.2005, 09:50
Код вроде и так субоптимален. Можно чуть-чуть изворачиваться, но суть та же...

lvd
22.06.2005, 10:37
Код вроде и так субоптимален. Можно чуть-чуть изворачиваться, но суть та же...

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

Faster
22.06.2005, 10:59
Ваще конечно мне пришла потом в голову мысля, что можно побитово это сделать - получится ещё чуть короче...

напиши, а я посмотрю.. :)

GM BIT
12.12.2008, 19:00
С большим пробелом в общении со speccy возникают трудности по оптимизации кода, да и вообще написание уникальных процедур. Я на этюдах ZX Ревю вообще тогда сильно шагнул в написании коротких и быстрых процедур. Может вернем тему? Кто за?

psndcj
12.12.2008, 19:15
короткое и быстрое - это противоречие обычно... кодеров активных осталось немного, проще будет просто создавать тему наверно для каждой процедуры, которую требуется соптимизировать...

rasmer
12.12.2008, 20:21
смысла нет... уже были попыткинасколько я помню... так что идея бессмыслена....

demon_zx
13.12.2008, 00:45
осталось много пассивных кодеров)))

Shadow Maker
13.12.2008, 02:31
Ну да. Пассивных хоть отбавляй :)

GM BIT
13.12.2008, 06:39
Все ясно. Тема не рулит. Придется после стольких лет все искать в огромном количестве литературы и шурупить с оптимизацией.

Shadow Maker
13.12.2008, 07:04
Шурупь. Полезнее.

GriV
13.12.2008, 10:36
Вообще то тема уже несколько раз открывалась, посмотреть можно было повнимательнее ;-)
А посчёт этюдов есть такие вот зарисовки.
Есть такие замечательные команды как adc и sbc - используют флаг CY

Например типовая задача уменьшить значение аккумулятора не менее какого то (например 23).
обычно делают:
dec a
cp 23
jr nc,$+3
inc a
а можно вот так аккуратно:
sub 23
adc a,22
работает много элегантнее и что очень важно имеет всегда одну и ту же длительность (что особенно интересно демописателям где каждый раз приходиться пересчитывать такты).
Или обратная задача - увеличить значение но не более какого то (например 75)
В этом случае делаем так:
add a,-75
sbc a,-1-75
В этом случае выше 75 ну никак не поднимется с теми же преимуществами.
Кстати аналогичные вещи можно делать с HL используя те же команды.
Или задача: в зависимости от значения флага CY заполнить аккумулятор либо значением 23 либо 75:
sbc a,a
and 75-23
add a,23
В итоге - если включен флаг CY то в аккумуляторе будет 75, иначе будет 23.

GM BIT
13.12.2008, 11:37
Смотрел. Темы 2005, 06г :) Так же оставленны без внимания.
А sbc не каждый профи подумает таким образом использовать CY, а новички тем более.
Может начнем с процедуры вывода точки с использованием таблицы? Вроде была такая (Старых в голове).

Добавлено через 8 часов 10 минут
На входе B-y, C-x + 1024 таблица
LD L,C
LD H,ТАБЛ/256
LD A,(HL)
INC H
LD D,(HL)
INC H
LD L,C
ADD A,(HL)
LD E,A
INC H
LD A,(DE)
LD OR (HL)
LD (DE),A

Добавлено через 8 часов 11 минут
Кто быстрее?

axor
16.12.2008, 15:55
а можно вот так аккуратно:
sub 23
adc a,0
Поправлю малость.
sub X
adc a,X-1

Где X - число, меньше которого уменьшать аккумулятор нельзя.

Barmaley_m
17.12.2008, 23:48
Процедура деления 16/8 by Andrew Strikes Code

Вход: HL - делимое, A - делитель
Выход: HL - частное, A - остаток

DIV_21:
NEG
LD C,A
LD B,#11
XOR A
DIV210:
ADC A,A
ADD A,C
JR C,DIV211
SUB C
OR A
DIV211:
ADC HL,HL
DJNZ DIV210
RET

GM BIT
04.01.2009, 19:21
А кто подскажет.
просто:
EI
HALT

Добавлено через 12 минут
Неподумал.
Стабилизация эффектов на бордюре.
Если сделать
ORG 25000
EI
LD C,254
LD H,0
LD L,7
L1 HALT
LD DE,2000 : маленько задержим
L2 DEC DE
LD A,D
OR E
JR C,L2
OUT (C),L
OUT (C),H
LD A,127
IN A ,(254)
RRA
JR C,L1
RET
Почему эта полосочка на бодюре не стоит на месте а дергается, может IM 2 или как? Еще жмешь на клаву что-то меняется.
Помогите (раньше делал сейчас не могу вспомнить!).

Добавлено через 14 минут
Может VNN_KCS подскажет!

psndcj
04.01.2009, 20:01
потому что используется стандартный обработчик прерываний из ПЗУ - а там и кнопки опрашиваются и еще чтото делается... надо задавать табличку для своего обработчика и включать IM 2 типа так

di
ld hl,imtab:ld a,h,i,a
ld a,low int_jump
ld (hl),a:inc l:jr nz,$-2
inc h:ld (hl),a
ld l,h:ld (hl),#c3 //код команды JP #xxxx
ld de,ТВОЙ_ОБРАБОТЧИК
ld (hl),e:inc hl:ld (hl),d
im 2:ei

imtab - табличка 257 байт с ровного адреса (#xx00), inter - джампер на обработчик (младший и старший байты равны) - к примеру в наших демах используется #be00 и #bfbf соответственно.

а и важно - чтобы работало везде - надо ставить в памяти в пределах #8000-#bfff

GM BIT
04.01.2009, 21:17
А IM 2 шагает сразу по INT или с задержкой?

psndcj
04.01.2009, 22:35
когда приходит прерывания процессор читает из адреса I*256+#ff (но на самом деле младший байт может плавать на многих клонах, для этого и делается табличка 257 байт) - и переходит на этот адрес. при этом выполняется предыдущая команда до конца - поэтому даже если если процесор выполнял HALT - наш обработчик будет работать сначала фрейма +0.3 такта... это как-то можно устранить программно - но тут уж я не помощник - помню в ZX-Ревю каком-то было полное описание работы бордюрных и мультиколорных эффектов.

VNN_KCS
29.03.2009, 14:55
Может VNN_KCS подскажет!
psndcj всё правильно тебе обьяснил. В твоем варианте прога работает с 1-м видом прерываний, а надо 2-й, чтоб обработчик отрабатывал одни и те-же такты ВСЕГДА. Я тут повторил твой вариант(правда немного подрихтовал), попробуй первый. Там есть точки на экране для оценки расположения полоски. Нажми any key, кроме пробела, потом отпусти и оцени результат.
Во втором варианте я добавил IM 2, там хоть жми, хоть не жми - результат один.
З.Ы. Ну а скролл запустил? Если что - пиши в личку.

GM BIT
30.03.2009, 10:20
Я уже в принципе все понял. Скрол бегать не хотить :(
А вот кстати про одни и те-же такты не согласен. Откомпилил мелодию в ProTrackere и тупо вставил play после вывода на бордюр в im 2 - на экране ничего не поменялось, стоит все на месте!

VNN_KCS
30.03.2009, 10:52
Скрол бегать не хотить
Ну, блин, не знаю. У меня в 3-х эмулях всё пашет. Если юзаешь унреал - какие у тебя настройки. Может свои скинуть?

GM BIT
30.03.2009, 12:26
Я в Spectaculator'е.
Разобрался.
Загрузил в ALASM 5.05 - все пучком побежала :)
А тот что на диске компилил (без ошибок) вот что:

psndcj
30.03.2009, 15:26
эмулятор? в анрыле надо ставить COMPLETE border - на SMALL не видно просто много довольно...

VNN_KCS
30.03.2009, 23:44
А тот что на диске компилил (без ошибок) вот что:
Ты чё блин! Спектрумист или ибм-щик? Тебе Спектрумовским ассемблером влом работать?
З.Ы. Я использую Border=wide

Добавлено через 11 часов 40 минут
GM BIT извини, вчера не разобрался что ты в дизассемлере смотрел. Откуда взялось call #0000? Там совсем другое call #621c должно быть.

GM BIT
31.03.2009, 16:01
Я просто проверял дизасемблером почему сбрасывается бегучка, а там вообще где идут ссылки на метки везде стоит 0000

VNN_KCS
01.04.2009, 09:29
Я просто проверял дизасемблером почему сбрасывается бегучка, а там вообще где идут ссылки на метки везде стоит 0000
Странный глюк. И чего Аласм так отдизассемблир - не понятно.

GM BIT
10.04.2011, 18:59
Есть у кого процедура построения окружности? Покороче, и которая рисуется НЕ посекторно.

Jukov
10.04.2011, 20:05
Как то в ревю за 94-95год предлаги сократить гасилку экрана из второго терминатора. Люди упростив алгоритм добились некоторых успехов. А мы вот с товарищем подумали и сократили без ущерба для работоспособности

ORG 25000
LD B,7
L0 LD C,SPEED
L1 HALT
DEC C
JR NZ,L1
LD HL,23295
L2 LD A,(HL)
AND 56
JR Z,L3
SUB 8
L3 LD C,A
LD A,(HL)
AND 7
JR Z,L4
DEC A
L4 OR C
LD (HL),A
DEC HL
BIT 3,H
JR NZ,L2
DJNZ L0
RET

;35 байт проти 39 в оригинале

GM BIT
10.04.2011, 20:17
В тему топика конечно! Но по моему случаю, есть чего?

Jukov
14.04.2011, 11:13
Есть у кого процедура построения окружности? Покороче, и которая рисуется НЕ посекторно.

Есть только процедура для построения клиппированной окружности из 8 секторов

Titus
14.04.2011, 12:50
В тему топика конечно! Но по моему случаю, есть чего?
В журнале "Моделист-Конструктор" за какой-то типа 87-90 год была описана процедура быстрого рисования окружности для компьютера Специалист. Я ее тогда разбирал - очень быстрая и красивая окружность получалась)

doorsfan
17.04.2011, 23:50
у Бармалея в его Бого-бейсике очень быстрая процедура, рисующая сразу с нескольких точек.

GM BIT
03.08.2011, 19:40
Есть у кого процедура построения окружности? Покороче, и которая рисуется НЕ посекторно.

goblinish
05.08.2011, 01:20
Есть у кого процедура построения окружности? Покороче, и которая рисуется НЕ посекторно.
алгоритм Брезенхема, но у меня пока нет, увы.

---------- Post added at 01:20 ---------- Previous post was at 00:36 ----------

вот, пойдет, пожалуй из раскопок:
;--------точка,построение по de(y,x)--------------------------

PLOTTBL EQU #A000

call FORMER

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

GM BIT
05.08.2011, 04:29
алгоритм Брезенхема
это рисование посекторно.

Вообще я уже из него переделал от 0-360 по точкам

goblinish
05.08.2011, 10:27
это рисование посекторно.

в смысле - "посекторно"?

GM BIT
05.08.2011, 10:38
http://democoder.ru/article/12 - там ниже чуть, как нарисовать окружность без тригонометрии

Brez.sna - сделано замедленно, чтоб увидеть как рисует Брезенхем

GM BIT
05.08.2011, 10:52
А вот так нужно было мне. Тот же Брезенхем. Так же замедленно

Перезалил

goblinish
05.08.2011, 18:07
А вот так нужно было мне. Тот же Брезенхем. Так же замедленно
Перезалил

угу. надо раскопками заниматься..

goblinish
05.08.2011, 21:23
допилил таки. старею, блин просидел неизвестно сколько(
пришлось в свою дему лезть...
вроде не очень уж и медленная, правда по всем параметрам не тестировал:v2_dizzy_sleep2:

GM BIT
06.08.2011, 08:37
вроде не очень уж и медленная
Это не важно, просто нужна была таблица координат точек на окружности от 0 до 360

goblinish
06.08.2011, 09:16
Это не важно, просто нужна была таблица координат точек на окружности от 0 до 360

т.е. подходит?

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

AndTorp
06.09.2011, 01:13
Подскажите, пожалуста, вот такое можно организовать без использования перехода (JR $+):

ld de, число1
ld hl, число2
or a
sbc hl,de
jr nc,m1
ld de, число2
m1
Т.е. Если DE>HL, то DE=HL.

Titus
06.09.2011, 01:34
Подскажите, пожалуста, вот такое можно организовать без использования перехода (JR $+):

ld de, число1
ld hl, число2
or a
sbc hl,de
jr nc,m1
ld de, число2
m1
Т.е. Если DE>HL, то DE=HL.
Будет проще, если ты скажешь зачем без перехода, и где это используется.

Destr
06.09.2011, 02:06
1: Можно оформить в виде подпрограммы. Тогда вызов CALL m1, и:
m1 ld de, число1
ld hl, число2
or a
sbc hl,de
ret nc
ld de, число2
ret

2: Или юзать самоизменяющийся код.
ld de, число1
ld hl, число2
or a
sbc hl,de
sbc a,a
and #EB; (#EB = ex de,hl)
ld (m1),a
ld hl, число2
m1 nop

3: Или такой изврат (вообще без привязки к адресу, но зато с предварительно рассчитанной разностью чисел 1 и 2)
ld de, число1
ld hl, число2
or a
sbc hl,de
sbc hl,hl
ld a,l
and МЛАДШИЙ разряд выражения (число2-число1)
ld l,a
ld a,h
and СТАРШИЙ разряд выражения (число2-число1)
ld h,a
add hl,de
ex de,hl

Это только идеи на вскидку, вполне может я где-то и лажанулся, сильно не бить :)

AndTorp
06.09.2011, 20:46
Будет проще, если ты скажешь зачем без перехода, и где это используется.
Используется для ограничения некоторого параметра (числа 1 и 2 могут быть некратными 256). Без перехода потому, что интересна сама возможность написания такого без ветвления (в общем что-то типа алгоритмической головоломки).




1: Можно оформить в виде подпрограммы. Тогда вызов CALL m1, и:
m1 ld de, число1
ld hl, число2
or a
sbc hl,de
ret nc
ld de, число2
ret
Спасибо. Там как раз подпрограмма. Если ничего не придумаю, буду делать как-то так.

Destr
06.09.2011, 21:22
Спасибо. Там как раз подпрограмма. Если ничего не придумаю, буду делать как-то так.
Ну раз подпрограмма то наверное так и получится:
На входе HL=число1, DE=число2

or a
sbc hl,de
ret nc
add hl,de
ex de,hl
ret

AAA
06.09.2011, 21:23
Если кто то из этюдников скодит красивый эффект, киньте мне его в почту для демы.

Titus
06.09.2011, 23:28
Ну раз подпрограмма то наверное так и получится:
На входе HL=число1, DE=число2

or a
sbc hl,de
ret nc
adc hl,de
ex de,hl
ret

Зачем adc hl,de?

Destr
07.09.2011, 01:43
Зачем adc hl,de?
Ну чтоб напрямую число2 в DE не загружать, а восстановить его в HL и потом в DE запихать (ex de,hl)

Titus
07.09.2011, 02:12
Ну чтоб напрямую число2 в DE не загружать, а восстановить его в HL и потом в DE запихать (ex de,hl)
тогда уж add, а не adc, иначе это число будет на 1 больше.

Destr
07.09.2011, 03:18
тогда уж add, а не adc, иначе это число будет на 1 больше.
Так вроде туда попадаем только в результате "заёма" (флаг С) - значит надо и его учитывать (что и делает команда ADC).
Я уже писал что это не проверялось, это просто голые идеи которые надо тестить (чем топикстартер вроде и занят).

Хотя да, ты прав, вместо ADC надо ADD (ведь OR A сначала сделали).

Titus
07.09.2011, 03:27
Так вроде туда попадаем только в результате "заёма" (флаг С) - значит надо и его учитывать (что и делает команда ADC).
Хотя я уже писал что это не проверялось, это просто голые идеи которые надо тестить (чем топикстартер вроде и занят).
Хотя да, ты прав, вместо ADC надо ADD (ведь OR A сначала сделали).
or a мы сделали для младшего бита, чтобы получить HL = HL - DE - 0,
тогда как к моменту условного перехода в бит C попадает заём для старшего бита. Чтобы вернуть HL обратно, нам вообще не важно, был ли заем, или его не было. Мы должны обратно сложить HL = HL + DE.

goblinish
08.09.2011, 22:53
пардон, что отвлекаю. никто не постил переход в 48-й с открытым портом(аля usr0)?
что-то у меня в исходниках сомнительный вариант:

ORG #5D40,#6000
DI
LD SP,(#5C3D)
POP HL
LD HL,#1303
PUSH HL
LD HL,#1B76
PUSH HL
LD HL,(#5C45)
LD (#5C42),HL
LD A,(#5C47)
INC A
LD (#5C44),A
LD DE,#15BE
LD A,(#5C3B)
AND #EF
LD (#5C3B),A
LD HL,(#5C4F)
LD BC,15
ADD HL,BC
EX DE,HL
LD C,4
LDIR

goblinish
12.09.2011, 10:17
не помню, откуда позаимствовал по старой привычке. интересная вариация для цветов. интересно, как он работает?

tiboh
12.09.2011, 15:52
пардон, что отвлекаю. никто не постил переход в 48-й с открытым портом(аля usr0)?
что-то у меня в исходниках сомнительный вариант:


Процедура Robusa:

DI
LD HL,10072
LD IY,23610
EXX
LD A,63
LD I,A
IM 1
LD SP,(23613)
LD A,16
OUT (253),A
RES 4,(IY+1)
CALL 81
CALL 7030
JP 4867

Процедура Wlodek Blacka:

CALL usr0
usr0 DI
LD SP,(23613)
POP HL
LD HL,4867
PUSH HL
LD HL,7030
PUSH HL
RES 4,(IY+1)
LD DE,5566
LD HL,(23631)
LD BC,15
ADD HL,BC
EX DE,HL
LD C,4
LDIR
EI
RET

jerri
12.09.2011, 15:59
А зачем делать call из которого нет возврата?

tiboh
12.09.2011, 16:16
Подправил...

goblinish
12.09.2011, 16:17
А зачем делать call из которого нет возврата?

по идее я в код впихивал. наткнулся, что call не отрабатывает.

jerri
12.09.2011, 23:01
tiboh,
оно у тебя куда вернется?
ты же стек переставляешь
можно вообще call убрать

goblinish
13.09.2011, 08:01
tiboh,
оно у тебя куда вернется?
ты же стек переставляешь
можно вообще call убрать

в никуда, в бейсик уйдет. сам столкнулся, долго въезжал.

jerri
13.09.2011, 13:24
блин

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

goblinish
13.09.2011, 13:33
блин

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

Да пофиг, как он отрабатывает. в процедуре на 48-й переходит.

jerri
13.09.2011, 15:02
Да пофиг, как он отрабатывает. в процедуре на 48-й переходит.

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

VNN_KCS
13.09.2011, 22:17
Да пофиг, как он отрабатывает. в процедуре на 48-й переходит.
А если ты из проги хочешь перейти, то тогда как? Ну, типа переключился и поехали дальше. Так можно?

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


а в бейсик он вообще по принуждению уходит
Ну и нафига это надо? Если из программы юзать.

goblinish
13.09.2011, 22:21
А если ты из проги хочешь перейти, то тогда как? Ну, типа переключился и поехали дальше. Так можно?

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


Ну и нафига это надо? Если из программы юзать.
а никак. либо в лоадер пихал переход на 48, либо в код без заморочег с вызовом CALL.

jerri
13.09.2011, 23:03
А если ты из проги хочешь перейти, то тогда как? Ну, типа переключился и поехали дальше. Так можно?

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


Ну и нафига это надо? Если из программы юзать.

1 переключиться можно но не так (как не помню)

2 это не ко мне вопрос

Killer
14.09.2011, 18:35
Переключиться можно, и не только из бейсика. Лень чтоли с портами играть?

alone
14.09.2011, 22:42
Если не выходить в бейсик, то достаточно LD (IY+1),#CC.

goodboy
14.09.2011, 23:39
Если не выходить в бейсик, то достаточно LD (IY+1),#CC.а почему именно #CC ? обычно сбрасывают только 4ый бит в этой переменной.

; FLAGS $5C3B 1 IY+$01 Various flags to control the BASIC system:

; Bit 0: 1=Suppress leading space.
; Bit 1: 1=Using printer, 0=Using screen.
; Bit 2: 1=Print in L-Mode, 0=Print in K-Mode.
; Bit 3: 1=L-Mode, 0=K-Mode.
; Bit 4: 1=128K Mode, 0=48K Mode. [Always 0 on 48K Spectrum]
; Bit 5: 1=New key press code available in LAST_K.
; Bit 6: 1=Numeric variable, 0=String variable.
; Bit 7: 1=Line execution, 0=Syntax checking.

AndTorp
24.09.2011, 22:44
Подскажите, чем хорош режим basic 48+port 7ffd?
И чем плох стандартный 128 режим?

Titus
24.09.2011, 22:55
Подскажите, чем хорош режим basic 48+port 7ffd?
И чем плох стандартный 128 режим?
Совместимостью с теми программами, которые написаны под 48кб.

mishutka
28.10.2011, 02:17
ld hl,5800h
ld de,5801h
xor a
push af
label
pop af
ld bc,32; (или 31 (не помню тонкостей ldir) и еще увеличить hl и de)
ld (hl),a
ldir
add a,8
and 38h
push af
ld a,d
cp 5bh
jr nz,label
pop af

естественно что можно процедуру оптимизировать

GM BIT
28.10.2011, 08:28
ld hl,5800h
ld de,5801h
xor a
push af
label
pop af
ld bc,32; (или 31 (не помню тонкостей ldir) и еще увеличить hl и de)
ld (hl),a
ldir
add a,8
and 38h
push af
ld a,d
cp 5bh
jr nz,label
pop af

естественно что можно процедуру оптимизировать

25 байт



ld hl,22528
ld a,56
ld c,24
loop ld b,32: ld (hl),a: inc hl: djnz $-2 ;столбцы
sub 8: and 56
dec c: jr nz,loop ;строки


20 байт, два цикла (естественно можно оптимизировать)

goblinish
05.11.2011, 23:29
набрел на интересную статеечку:
http://baze.au.com/misc/z80bits.html#3

любопытно.

AER
06.11.2011, 19:38
а на бордере эфектик напишите,на него прерывание будет дергать в плеере

mishutka
07.11.2011, 02:14
на него прерывание будет дергать в плеере - не совсем понятно

goblinish
07.11.2011, 07:37
а на бордере эфектик напишите,на него прерывание будет дергать в плеере

а корабля с матросами не надо?

VNN_KCS
07.11.2011, 11:15
а на бордере эфектик напишите,на него прерывание будет дергать в плеере
Если цикл начинать с HALT, а музыку проигрывать в конце цикла, то не будет. Разве что лево-право.

AER
09.11.2011, 08:18
а halt перед плеером + какойто код, замедлит же все?

GM BIT
18.11.2011, 21:42
Сообщение от dimasy:
Заполним экран решеткой:
device zxspectrum128
ORG #61a8
begin
ld hl, #4000,a,#aa,b,#18
m0 ld (hl),a:inc l:jr nz,m0
cpl
inc h:djnz m0
br2 jr br2
end
display /d,end-begin
savesna "test.sna",begin

Кто сообразит короче?
LD HL,#3faa
LD A,L
и увеличение цикла по b, не считается (это очевидно)

---------- Post added at 20:42 ---------- Previous post was at 20:36 ----------

Итого 14 байт без зацикливания в конце

goblinish
19.11.2011, 07:04
Сообщение от dimasy:
Заполним экран решеткой:
device zxspectrum128
ORG #61a8
begin
ld hl, #4000,a,#aa,b,#18
m0 ld (hl),a:inc l:jr nz,m0
cpl
inc h:djnz m0
br2 jr br2
end
display /d,end-begin
savesna "test.sna",begin

Кто сообразит короче?
LD HL,#3faa
ld a,l
и увеличение цикла по b, не считается (это очевидно)

Итого 14 байт без зацикливания в конце

угу. а как на экране лучше будет выглядеть при заполнениии с #aa и с #18?
и какие в регистрах будут при запуске данные?

GM BIT
19.11.2011, 09:56
угу. а как на экране лучше будет выглядеть при заполнениии с #aa и с #18?
и какие в регистрах будут при запуске данные?
Теперь переведите на русский

---------- Post added at 08:56 ---------- Previous post was at 07:27 ----------

Заполнение экрана сеткой
13 байт


ld hl,#5700
ld a,#aa
loop dec l
ld (hl),a
jr nz,loop
cpl
dec h
jr nz,loop

goblinish
19.11.2011, 10:33
Теперь переведите на русский

в моем примере - где начальный адрес-#40aa или #4018?
и теперь - какие регистры будут при USR 25e3?


Заполнение экрана сеткой
13 байт


ld hl,#5700
ld a,#aa
loop dec l
ld (hl),a
jr nz,loop
cpl
dec h
jr nz,loop


отлично! правда, без учета ROM покатит.

GM BIT
19.11.2011, 12:12
в моем примере - где начальный адрес-#40aa или #4018?
заполняем начиная с #3faa

goblinish
19.11.2011, 15:22
заполняем начиная с #3faa
я мыслил от #4018, ну фиг с ним, наделали этюдов.
теперь осталось классическую XOR-текстуру сделать наверх.

GriV
03.01.2012, 11:20
Джерри попросил процедурку вычисления адреса в экране.
Суть следующая:
есть DE - адрес в экране
C - количество пиксельных линий которые надо пропустить вниз
Надо сделать п/п, которая получит в DE адрес новой пиксельной линии

Что получилось:


ld a,d 4 берём уже имеющееся смещение по пикселям вниз
and %00000111 7 маскируем
add a,c 4 добавляем к смещению, т.к. можем перейти через треть или з/м
ld c,a 4 сохранили полученное значение
and %00111000 7 выделили часть, отвечающую за положение внутри трети экрана
rlca 4 смещаем её в старшие биты
rlca 4
add a,e 4 добавляем к младшему адресу
ld e,a 4 сохраняем
sbc a,a 4 если у нас появился CY, значит надо будет делать переход в другую треть
and %01000000 7 заполнили флагом переноса шестой бит аккумулятора
add a,c 4 добавили значения по третям из исходных данных
and %11000000 7 выделили
rrca 4 смещаем в 4-5 бит для адреса экрана
rrca 4 обращаю внимание что полученные трети никуда не сохраняем!
rrca 4
xor c 4 нам надо ещё младшие 3 бита, адрес пиксельной линии
and %11111000 7 по хитрому без промежуточного регистра выделяем её
xor c 4 получили в аккумуляторе
ld b,a 4 спрятали
ld a,d 4 из регистра D забираем треть и сам адрес
and %11111000 4 маскируем их
add a,b 4 добавляем спрятанное значение, младшие 3 бита учтены вначале
ld d,a 4 готово!

итого 111 тактов. Кто короче? :-)



---------- Post added at 10:20 ---------- Previous post was at 09:53 ----------



Ещё один перл.
Пересчёт из атрибутной области в адресную.
Там фактически надо переместить биты из младших 0-1 в более старшие 3-4, плюс сохранить адрес. Универсальность процедуры в применимости и по отношению к теневому (#c000-#daff) экрану.



ld a,h ; 4
; and %00000011 ; 7 0 - так и хочется замаскировать эти биты, но эта операция не нужна,
add a,a ; 4 8 - т.к. старшие биты уйдут по дальнейшей маске %00011111, а
add a,a ; 4 12 - младшие биты забиты нулями по add a,a
add a,a ; 4 16
xor h ; 4 20
and %00011111 ; 7 27 - сохраним нужные биты и обнулим ненужные 0-2
xor h ; 4 31 - вытащили исходный адрес расположения
ld h,a ; 4 35

итого 35 тактов :-) кто быстрее?

NovaStorm
03.01.2012, 14:49
Думаю спрошу в тему - а табличный(разумного размера) DOWN_HL быстрее обычных вариантов есть?

GriV
03.01.2012, 15:03
[/COLOR]
Думаю спрошу в тему - а табличный(разумного размера) DOWN_HL быстрее обычных вариантов есть?
Нет. Табличные значение для двухбайтовых элементов - это не для ZX.
Типа:
если есть HL, который надо сделать DOWN HL сделаю две таблицы, одна будет ссылаться на старший байт, вторая на младший. Отличаться будут битами в регистре адресах расположения. Тогда ультрабыстрый DOWN HL будет такой:
SET 7,H ; #С000-#ВB00 - младшие байты
LD E,(HL)
SET 5,H ; #E000-#FB00 - старшие байты
LD D,(HL)
EX DE.HL

получилось 8+7+8+7+4=34 такта и невероятные две таблицы. Быстрее нельзя.

Теперь классика:

inc h
ld a,h
and 7
jr nz,exit
ld a,l
add a,32
ld l,a
jr c,exit
ld a,h
sub 8
ld h,a

exit:


наиболее типичный цикл, это просто inc h и выход, будет 4+4+7+12 = 27 тактов, т.е. даже быстрее чем в табличной методе! Так что не городите огород :-)

Andrew771
03.01.2012, 15:20
192 строки * 2 байта = 384 байта - вся таблица. Приемлемо.

NovaStorm
03.01.2012, 15:33
GriV, вот я тоже так считал!
А вот тут http://zxdn.narod.ru/coding/n105sprd.txt


5.По табличке (192*2=384 байт), содержащей по два байта, означа-
ющих начало каждой следующей линии. В глубоком детстве мне ка-
залось, что это очень расточительно для памяти. :/

POP DE
LD A,E
ADD A,C
LD E,A

Итого по тактам: на каждую следующую линию = 22 такта.

Да и Andrew771 про такую же таблицу наверное говорит. Как это подробнее?

GriV
03.01.2012, 16:02
192 строки * 2 байта = 384 байта - вся таблица. Приемлемо.
звучит как наезд! А вы из какой группировки? :-)
Код хочу, это всё слова.


POP DE
LD A,E
ADD A,C
LD E,A
Это нечестное сравнение. Мою п/п вы вызовете в любое время и она вам пересчитает. А этот код предполагает что вы следите (заряженными данными на стеке), какая у вас текущая строчка, на шага влево, ни шага вправо. Недостатков тут хватает, кстати, и работа с прерываниями уже исключена.
Если же вы захотите стек перед рассчётом установить, то рассчёт у вас будет по времени больше занимать, чем прямой рассчёт down hl в лоб, да и сам стек ещё надо восстанавливать после использования.
Если же использовать таки ту технологию, что тут была предложена - слежением за текущей строчкой - то я предложу вариант ещё короче

условие: hl - указывает на текущую строчку/символ
pop de
add hl,de
; данные на стеке содержат разницу в адресах при переходе с указанной пиксельной линии на следующую
получилось короче на 1 такт и в байтах основного тела - 2 байта вместо 4х.
Имхо узкоприкладной способ этот. Да и разница - 21 такт вместо типичных 27 - не так уж велика, часто ли приходиться переходить с одной пиксельной полоски на другую?

Andrew771
03.01.2012, 17:40
В регистре DE при вызове процедуры содержать координаты точки на экране, а не адрес. Тогда всё намного проще.

Destr
04.01.2012, 01:46
1. Down HL:
INC H
LD A,H
AND 7
RET NZ
LD A,L
SUB #E0
LD L,A
SBC A,A
AND #F8
ADD A,H
LD H,A

2. Самый быстрый адрес:
POP HL
(стек конечно на табличку экранных адресов указывает)

3. Вывод спрайта:

Формируем в памяти массив вида
[вывод 1-й строчки]
[вывод 2-й строчки]
[вывод 3-й строчки]
[вывод 4-й строчки]
[вывод 5-й строчки]
[вывод 6-й строчки]
[вывод 7-й строчки]
[вывод 8-й строчки]
переход на строку ниже (к L прибавляем #20, H - восстанавливаем любым методом)
Дальше тоже-самое.
[печать следующего знакоместа, снова вывод 8 строчек]
Дальше всё так-же + переход на другой сегмент.

Обращатся с этим извратом так: Рассчитываем КУДА прыгать (с какой строки рисовать начинаем), потом рассчитываем ГДЕ заканчивать (ловушку ставим прямо в код, RET или какой другой выход, JP например).
Кидаемся в подпрогу.
Она отрисовывает и вылетает где надо.
Восстанавливаем код (который ловушками зафаршмачили).
Делаем дальнейшие дела (ну там инт ловим, или музыку-ноту брякаем в общем что там ещё...)
Быстрей по-видимому никак...

GriV
04.01.2012, 02:52
В регистре DE при вызове процедуры содержать координаты точки на экране, а не адрес. Тогда всё намного проще.
Не понял я. Ещё раз прошу, код с пояснениями можно увидеть? Если я правильно понял, то предлагается одну задачу заменить другой. Это неправильно. Стояла задача быстрого DOWN HL, табличного. Да и как можно в 384 байта уложить весь экран со всеми его замороками?

---------- Post added at 01:39 ---------- Previous post was at 01:38 ----------


1. Down HL:
INC H
LD A,H
AND 7
RET NZ
LD A,L
SUB #E0
LD L,A
SBC A,A
AND #F8
ADD A,H
LD H,A
ну его я и привёл, фактически. Разница там незначительна на некоторых вариантов. Хотя пруф засчитан, но это не табличное решение.
В конце RET отсуствует.



---------- Post added at 01:40 ---------- Previous post was at 01:39 ----------


2. Самый быстрый адрес:
POP HL
(стек конечно на табличку экранных адресов указывает)
Стоп. А стек как устанавливать и где? И как учитывается смещение по X в этом методе?

---------- Post added at 01:41 ---------- Previous post was at 01:40 ----------


3. Вывод спрайта:

Формируем в памяти массив вида
[вывод 1-й строчки]
[вывод 2-й строчки]
[вывод 3-й строчки]
[вывод 4-й строчки]
[вывод 5-й строчки]
[вывод 6-й строчки]
[вывод 7-й строчки]
[вывод 8-й строчки]
переход на строку ниже (к L прибавляем #20, H - восстанавливаем любым методом)
Дальше тоже-самое.
[печать следующего знакоместа, снова вывод 8 строчек]
Дальше всё так-же + переход на другой сегмент.

Обращатся с этим извратом так: Рассчитываем КУДА прыгать (с какой строки рисовать начинаем), потом рассчитываем ГДЕ заканчивать (ловушку ставим прямо в код, RET или какой другой выход, JP например).
Кидаемся в подпрогу.
Она отрисовывает и вылетает где надо.
Восстанавливаем код (который ловушками зафаршмачили).
Делаем дальнейшие дела (ну там инт ловим, или музыку-ноту брякаем в общем что там ещё...)
Быстрей по-видимому никак...
+1. Но собственно с этим я не спорю. Но это не табличный или не совсем табличный метод. Это скорее раскрытые циклы с учётом вхождения по пиксельным линиям, пример качественного кода.

---------- Post added at 01:52 ---------- Previous post was at 01:41 ----------

Ага вот ещё как можно. Строится таблица всех переходов начиная с адреса #8000. Логика такая. Умножаем на 2 адрес, указывающий на экран. Получаем адрес #8000-#B600, в которых содержится адрес следующей ячейки.
Логика такая:
add hl,hl
ld sp,hl
pop hl
Итого 11+6+10= опять 27 тактов но железно всегда, даже если переходы через трети/знакоместа. Плюс портится стек, который где-то восстанавливать надо.
Резюмирую так же: не стоит оно того.

psb
04.01.2012, 04:15
GriV, ограниченные штуки со стеком и таблицей, выигрывающие несколько тактов, решают в демах. там эти такты многократно потом вылазят, а прерывания в такие моменты просто не придут и стек перенастраивать только 1 раз на почти 200 линий:) так что всему свое время и место. это просто говорит о том, что стандартный down hl - не всегда идеал.

Destr
04.01.2012, 04:54
2 GriV:
Ты всё правильно понимаешь.
Либо скорость, либо плотный код.
На современном железе это всё теряет значение, но на тупорылом спеке - конечно нужно чем-то жертвовать.
Или памятью, или скоростью...
(конечно обидно! а выхода нет...)

---------- Post added at 03:24 ---------- Previous post was at 03:17 ----------


Стоп. А стек как устанавливать и где? И как учитывается смещение по X в этом методе?
Стековая таблица тут получается для каждого столбца (32 экранных знакомест) и на всю высоту (тоже для каждого, т.е. (192х32)*2 ибо целый ворд (слово, 2 байта) на адрес)
Ну и ещё прескролловую табличку (размером в #1000) нужно где-то разместить, это и будет твой X.

---------- Post added at 03:29 ---------- Previous post was at 03:24 ----------

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

---------- Post added at 03:40 ---------- Previous post was at 03:29 ----------


В конце RET отсуствует.
А, ну да.
Это оттого что только на процессе отладки CALL делают, а вообще эти все DOWNHL втыкают сразу в тело кода (да ещё с учётом сегмента) чтоб значит не жрало лишних тактов по 50 раз во фрейм.

---------- Post added at 03:54 ---------- Previous post was at 03:40 ----------

Вообще сказать - это позорище и ламота, этого делать никогда (на Speccy) нельзя, эти ревюшные процедуры (на которых мы росли, учились и т.д.) - страшный расход процессорного времени (ибо Z80 есть не что иное как медленный кусок кремня, жутко неоптимизированный и просто законеченная в себе вещь, как результат триумфа своего времени.)
Но вот вытащить из него максимум - это подвиг!
(ребята какие-то General Sound придумали, а получился у них паскудный звук и второй спектрум впридачу, который якобы УСТРОЙСТВО!)
Вот тот-же AloneCoder, на пару с ShiruOtaku (которого я тоже как и с Titus`ом путал что думал мол, Митника поймал) - пошли другим путём:
Ширу - написал винрарную статью (по которой я сделал-таки себе немножко doom`а,).
А АлонКодер - всех поимел, написал позорный вольф, подождал (несколько лет), а когда я решил что уже крут - макнул мордой мня в грязь выложив сорцы свои.
Я и притух...

А ведь действительно, чего я там с тангенсами бился???

GriV
04.01.2012, 13:12
GriV, ограниченные штуки со стеком и таблицей, выигрывающие несколько тактов, решают в демах. там эти такты многократно потом вылазят, а прерывания в такие моменты просто не придут и стек перенастраивать только 1 раз на почти 200 линий так что всему свое время и место. это просто говорит о том, что стандартный down hl - не всегда идеал.
Да я спорю что ли? Просто тут люди говорят про 384 байта, я вот думаю как они туда весь экран засунули?

---------- Post added at 11:53 ---------- Previous post was at 11:29 ----------


Ты всё правильно понимаешь.
спс :-)


Стековая таблица тут получается для каждого столбца
Т.е. при переходе на другую координату X надо пересчитывать таблицу и адрес вхождения? Т.е. на единичной операции - непроизводительно? и 384 байта - это только для 1ной координаты X? А всего 384*32=12288 байт? Ну тогда вы далеки от оптимальности :-) И произвольная смена координаты X|Y поставит ваш алгоритм в тупик :-)


только раскрытие циклов
Не всегда эффективно, только на упрощаемых операциях. Не всю логику можно упростить.


Алонкодер в этом хорошо разбирается, но он ни с кем не делится своими знаниями.
За базар ответишь? :-) зря человека обижаешь, очень отзывчивый он.


только на процессе отладки CALL делаю
ок :-)


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

---------- Post added at 12:05 ---------- Previous post was at 11:53 ----------









Возвращаясь в наши баранам - кто нить даст универсальный быстрый табличный код down hl? :-)

Подведу промежуточные итоги:
- Самый быстрый универсальный пока предложен мной - 27 тактов на тело + 12288 байт таблица + недостаток используется стек + не используются другие регистры


add hl,hl
ld sp,hl
pop hl

- Самый быстрый с слежением - 10 тактов на тело + 12288 байт таблица + недостаток используется стек + не используются другие регистры


pop hl

- Медленнее, но с приемлей по размерам таблицей - 21 такт на тело + всего-то 384 байт таблица + недостаток используется стек + недостаток используется DE


pop de
add hl,de


Из табличных пока ничего другого нет.

---------- Post added at 12:12 ---------- Previous post was at 12:05 ----------


На современном железе это всё теряет значение
Просьба больше по теме писать :-)

jerri
04.01.2012, 14:45
Andrew771, это дорого - тратить целую пару регистров на координаты при отсутствии жесткой необходимости

psb
04.01.2012, 19:20
- Медленнее, но с приемлей по размерам таблицей - 21 такт на тело + всего-то 384 байт таблица + недостаток используется стек + недостаток используется DE

pop de
add hl,deстранный какой-то код... как минимум он не реюзабельный - кто будет hl каждый раз перезагружать?
вот приводился нормальный реюзабельный код:

POP DE
LD A,E
ADD A,C
LD E,A
здесь рег.С=Х, одна табличка 384 байта, 22 такта.

Titus
04.01.2012, 19:25
странный какой-то код... как минимум он не реюзабельный - кто будет hl каждый раз перезагружать?
Очевидно, там имелось ввиду:
pop hl
add hl,de

GriV
04.01.2012, 20:12
странный какой-то код... как минимум он не реюзабельный - кто будет hl каждый раз перезагружать?
вот приводился нормальный реюзабельный код:
смотрите внимательно, в HL текущий адрес, в DE грузится разница между пиксельными линиями (обычно 256, иногда [32-8*256]), разница добавляется и поехали.


вот приводился нормальный реюзабельный код:


POP DE
LD A,E
ADD A,C
LD E,A

здесь рег.С=Х, одна табличка 384 байта, 22 такта.
Ну уж разберись что у тебя к чему, и почему тут лучше, если оно длиннее в тактах и в коде. Тут ещё и регистр C (или любой другой) надо постоянно удерживать значением X. А в моём случае нет. Хотя в процессе портится DE.


Очевидно, там имелось ввиду:
pop hl
add hl,de
Нет нет :) читайте код внимательнее :) DE добавлялось к HL, получаем down hl.
Если я возьму со стека HL, то это будет не down hl, потому что я его потру. А если это down de, тогда надо ещё установить DE. :) в общем не смущайте общественность.

Titus
04.01.2012, 20:20
Нет нет :) читайте код внимательнее :) DE добавлялось к HL, получаем down hl.
Если я возьму со стека HL, то это будет не down hl, потому что я его потру. А если это down de, тогда надо ещё установить DE. :) в общем не смущайте общественность.
Практически одно и то же. Только в одном случае со стека снимаем смещение и прибавляем его к hl, а в другом, снимаем новый hl, и прибавляем к нему смещение в строке de. Преимущество первого способа, что он не првязан к конкретным адресам, и можно портить de.

psb
04.01.2012, 20:28
Ну уж разберись что у тебя к чему, и почему тут лучше, если оно длиннее в тактах и в коде.
+один свободный регистр;)
но в целом вполне себе веселая тема:)

GriV
04.01.2012, 20:31
Практически одно и то же. Только в одном случае со стека снимаем смещение и прибавляем его к hl, а в другом, снимаем новый hl, и прибавляем к нему смещение в строке de. Преимущество первого способа, что он не првязан к конкретным адресам, и можно портить de.
Не одно и тоже. если у тебя ведущий регистр DE, то ты должен будешь в него переместить содержимое, хотя бы с помощью ex de,hl. А это уже доп. 4 такта. За что боролись? :)


но в целом вполне себе веселая тема
Ну так то да :)

psb
04.01.2012, 21:00
Не одно и тоже.
одно и то же;) не надо ex de,hl.

Destr
05.01.2012, 04:31
За базар ответишь? :-) зря человека обижаешь, очень отзывчивый он.
Пожалуй я невнятно выразился.
Совсем не собирался никого обижать.
Имел в виду не делится ПОНЯТНЫМ ДЛЯ НЕОТЕСАНОЙ ДЕРЕВНИ ОБРАЗОМ.
Ничерта я не понимаю в его сорцах.
Для образованных людей возможно всё ясно и понятно.

GriV
05.01.2012, 10:17
Пожалуй я невнятно выразился.
Совсем не собирался никого обижать.
Имел в виду не делится ПОНЯТНЫМ ДЛЯ НЕОТЕСАНОЙ ДЕРЕВНИ ОБРАЗОМ.
Ничерта я не понимаю в его сорцах.
Для образованных людей возможно всё ясно и понятно.
А ну это да :) но тут как говорится - кесарю кесарево :) Я тоже не понимаю :) Но на вопросы он так-то отвечает :)

Andrew771
20.03.2012, 21:15
Вот задачка из реальной жизни, в "Эрудите" понадобилась:

Необходимо скопировать от 2 до 8 байт, заранее количество неизвестно (находится в аккумуляторе), из области начинаемой по адресу addr1 в область по адресу addr2, но так, чтобы в области addr2 байты шли в обратном порядке. Например, было с адреса addr1: 1 2 3 4 5 6. Нужно сделать с адреса addr2: 6 5 4 3 2 1. Оптимизировать по быстродействию.
Сейчас кроме банального ld a,(hl); ld (de),a ничего оптимальнее не придумал. Но чую, что можно как-то быстрее, через стек или регистры (благо немного значений).

jerri
20.03.2012, 22:50
а тут и нечего делать :) особенно изза разворота

Andrew771
20.03.2012, 23:34
чё-нить в стиле


ld hl,addr1-1
ld e,a
ld d,0
add hl,de
ld de,addr2
ldd
inc de
inc de
ldd
inc de
inc de
...
:)

jerri
21.03.2012, 00:49
это же ересь


ld b,a
ld a,(hl)
ld (de),a
inc hl
dec de
djnz $-4

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

кстати по слогам не пробовал паковать?

alone
21.03.2012, 08:24
Паковать надо хаффманом. ZXRar позволяет.

Andrew771
21.03.2012, 10:17
это же ересь
Вот так у меня сейчас сделано.


кстати по слогам не пробовал паковать?

Паковать надо хаффманом. ZXRar позволяет.
Да плохо эти методы жмут словарь, они для обычных текстов подходят, а тут все слова разные. Буквосочетания тоже смотрел, плохая статистика для сжатия. Поэтому я выбрал алгоритм, который фиксирует только изменившиеся буквы от предыдущего слова. Теперь сделал, как ты предложил, слова задом наперед кодировать, так еще больше жмется.
Здесь в этюде я спрашиваю про распаковку уже, слово-то распаковал из последовательности битов, а теперь надо в прямой вид привести.

---------- Post added at 10:08 ---------- Previous post was at 09:45 ----------

Вот хорошая статья по сжатию словаря: http://compression.ru/download/articles/text/shelwien_task.html

---------- Post added at 10:17 ---------- Previous post was at 10:08 ----------

Еще: http://compression.graphicon.ru/sh/2003-10-24.htm

alone
21.03.2012, 11:25
Поэтому я выбрал алгоритм, который фиксирует только изменившиеся буквы от предыдущего слова. Теперь сделал, как ты предложил, слова задом наперед кодировать, так еще больше жмется.
Хаффман нужно использовать поверх этого метода.

Andrew771
21.03.2012, 11:51
Хаффман нужно использовать поверх этого метода.
Возможно и сожмет еще. Но это уже лишнее, очень долгая распаковка будет, да и место под сам алгоритм :)

alone
21.03.2012, 12:53
Распаковка - 10 килобайт в секунду. А сколько у тебя сейчас?
Памяти нужно 200 байт под код, 100 байт под дерево.

GriV
21.03.2012, 13:13
a - уже установлено
ld hl,addr1
ld de,addr2
cpm
add a,8
add a,a
add a,a
ld (__jmp+1),a
jmp jr 0
dup 8
ld a,(hl)
ld (de),a
inc hl
dec de
edup
ret

Andrew771
21.03.2012, 13:34
Понятно, без ld a,(hl); ld (de),a никуда :)


Распаковка - 10 килобайт в секунду. А сколько у тебя сейчас?
А распаковывать куда? У меня сейчас по одному слову читается. По одному слову распаковка? Учти, что всё кодируется по 5 бит, а не по байту, одной последовательностью без границ байтов. Короче, не стоит игра свеч.

alone
21.03.2012, 15:11
По одному слову распаковка?
По одному байту. Байты друг от друга не зависят. Единственный контекст, который надо помнить - текущий адрес и текущий сдвинутый байт.


Учти, что всё кодируется по 5 бит, а не по байту, одной последовательностью без границ байтов.
Хаффман тоже без границ байтов. Разница только в том, что там длина символа плавающая. Чем символ чаще, тем он короче.

В ZX-Guide вообще была фреймовая листалка с текстом по Хаффману. В самом длинном тексте было 140К (на 128К машине).

goblinish
01.07.2012, 11:54
нашел случайно, давно видел на атари:

100 REM ARCHIMEDES SPIRAL
110 REM
120 REM
130 REM
140 GRAPHICS 8+16:SETCOLOR 2,0,0
150 XP=144:XR=4.71238905:XF=XR/XP
160 FOR ZI=-64 TO 64
170 ZT=ZI*2.25:ZS=ZT*ZT
180 XL=INT(SQR(20736-ZS)+0.5)
190 FOR XI=0-XL TO XL
200 XT=SQR(XI*XI+ZS)*XF
210 YY=(SIN(XT)+SIN(XT*3)*0.4)*56
220 X1=XI+ZI+160:Y1=90-YY+ZI
230 TRAP 250:COLOR 1:PLOT X1,Y1
240 COLOR 0:PLOT X1,Y1+1:DRAWTO X1,191
250 NEXT XI:NEXT ZI
260 GOTO 260

интересно, как реализовать на спеке? больно медленно строится..

goodboy
01.07.2012, 12:16
интересно, как реализовать на спеке? больно медленно строится.. а на атари быстрее ?
как вариант для демонстрации можно использовать `компилятор` TOBOS
или почитать Инфоркомовскую книжку `прикладная графика`
со стр.140 http://vtrdos.ru/book/PRIKGRAF.ZIP

goblinish
01.07.2012, 12:47
а на атари быстрее ?
если только эмуль включить пошибче, то да.


Инфоркомовскую книжку `прикладная графика`
графика тут неуместна, проекции нет, вычисления упираются в SQR и SIN.

goodboy
01.07.2012, 13:25
графика тут неуместна, проекции нет, вычисления упираются в SQR и SIN. ты сначала почитай, а потом говори (там подробно рассматривается применение `калькулятора`), как вариант можно использовать таблицы, предварительно рассчитав значения для них хоть на том-же бейсике.

goblinish
01.07.2012, 13:30
ты сначала почитай, а потом говори
ты сначала исходник покури, потом за графику поговорим

doorsfan
07.07.2012, 11:58
goblinish, 230 TRAP 250 это что?

Mick
07.07.2012, 12:01
интересно, как реализовать на спеке?

Табличным методом.

goblinish
07.07.2012, 12:28
goblinish, 230 TRAP 250 это что?

перехват в на строку 250 в случае ошибки, чтобы plot за пределы экрана не улетал.

---------- Post added at 12:28 ---------- Previous post was at 12:26 ----------


Табличным методом.

да и так ясно уже. а арифметика в 16 бит прокатит, или нет?

Destr
07.07.2012, 16:36
да и так ясно уже. а арифметика в 16 бит прокатит, или нет?
Только заранее просчитаная.
Т.е. гибкости не будет, формулу просто так не поменяешь.
Можно ещё сделать по-другому (через таблицу логарифмов, вроде), тогда можно будет строить разные картинки играя формулами, но это страшный матан, в этом только AloneCoder шарит, остальные читерят (заранее просчитаными данными)

goblinish
07.07.2012, 17:57
но это страшный матан, в этом только AloneCoder шарит, остальные читерят (заранее просчитаными данными)

вот то-то и оно, я порядком подзабыл про расчеты, 1ddkit писали ранее.

Destr
08.07.2012, 15:14
вот то-то и оно, я порядком подзабыл про расчеты, 1ddkit писали ранее.
В общем получается надо вспоминать высшую математику и злобно перебирать алгоритмы (на предмет прикрутить к спеку).
С такими кривулями (ну шляпа эта) вроде как хорошо юзать комплексные числа (ненастоящие конечно, а их табличный образ).
А вообще у алонекодера лучше спросить напрямки, ибо все остальные только "на глазок" подскажут, а Дима на таких приколах не одну собаку съел, он точно скажет (если конечно поймаешь его...)

P.S. А вообще алгоритм прикольный. Я тут потихоньку компилятор бэйсика шлепаю, вот когда он сумеет эту прогу выполнить - буду считать что компиль готов! Сенкс за образец!

goblinish
22.07.2012, 08:54
Построение ifs-фрактала - папоротник.
всю голову сломал:v2_dizzy_facepalm:

нашел. почему-то исхдник был без комментария
http://zxpress.ru/article.php?id=7933&lng=eng

AAA
22.07.2012, 13:58
Построение ifs-фрактала - папоротник.
всю голову сломал

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

Папартников кучу насоздавали, это не красиво, а вот нормальный фрактал на спеки не делали:

http://zxaaa.untergrund.net/GLOBALC.html

Fractalz

goblinish
22.07.2012, 14:34
Папартников кучу насоздавали, это не красиво, а вот нормальный фрактал на спеки не делали:

http://zxaaa.untergrund.net/GLOBALC.html

Fractalz

Gemba строит ifs - дракон, коралл, спираль и другие извраты. тебе видней, нормальные или нет.
в общем, сунулся в исходник, ерунда получается, не строит по параметрам. то ли посчитал неправильно, то ли еще что..

AAA
22.07.2012, 18:59
Вот красива:

http://foontik.ru/wp-content/uploads/2010/08/fraktal-0.jpg

http://math.rice.edu/~lanius/images/manme.gif

http://t0.gstatic.com/images?q=tbn:ANd9GcRzw3CfVW03ztnl78oRB77e6FIKEI48c w8cTSkhxZzNye_NY_qK


А вот некрасиво:

http://docs.gimp.org/2.6/ru/images/filters/examples/render-taj-ifscompose.jpg

http://sprott.physics.wisc.edu/fractals/chaos/fern.gif


Вот фрактал перехода картинки который можно реализовать на спеки:
http://t0.gstatic.com/images?q=tbn:ANd9GcQ8mj5RVEk0_VPc5Zc7X94Psc6qLKQZj tAY01nJ9j1OPge9uDavMQ

goblinish
22.07.2012, 19:01
те IFS,в которые я уперся - красиво:
http://local.wasp.uwa.edu.au/~pbourke/fractals/ifs_spiral/0.gif

alone
22.07.2012, 19:30
Вот фрактал перехода картинки который можно реализовать на спеки:
Было же!

goblinish
22.07.2012, 19:34
Было же!
АА категориями мыслит:v2_dizzy_botan:

goblinish
23.07.2012, 07:40
http://www.sulaco.co.za/opengl_project_runtime_textures.htm
уфф, нашел приличный алгоритм, там и фракталы все...

goblinish
29.07.2012, 11:09
интересная процедура гашения надписи, печать текста написал сам.

;Cannonball (19xx)(Hooy).tap demo
device zxspectrum128
ORG #61a8
begin

ld hl,#5800;адрес атрибутов экрана
;--------заполним черным цветом
m0:
ld(hl),0:inc hl
ld a,h:cp #5b:jr nz,m0
;---печать текста
ld hl, #5800,ix,message
m1:
ld a,(ix):or a:jr z,begfade; если код сообщения 0, то переходим к гашению
inc ix
push hl:ld l,a,h,0
add hl,hl:add hl,hl:add hl,hl; каждый символ состоит из 8 байт, умножим код на 8
ld de,#3C00:add hl,de;#3C00 - адрес, где хранятся символы
ld de,hl
pop hl:push hl
ld a,8
m3: ld b,#80
exa
m2: ld a,(de):and b:jr z, writeatr
ld a,56; атрибут paper= белый(7)*8
writeatr:
ld (hl),a:inc hl
rrc b:jr nc, m2
ld bc,24:add hl,bc; 24=32-8, отрисовали 8 знаков, перейдем к следующей линии
inc de
exa:dec a:jr nz,m3
pop hl:ld bc,8:add hl,bc; символ нарисован, переход на 8
jp m1
;----------------------------------гашение
begfade:
;---------------------------------- ждем нажатия пробел
waitkey:
LD A,#7F:IN A,(#FE)
RRA:JR C,waitkey

LD B ,$32
L9D78:
PUSH BC
CALL L9DCD
POP BC
DJNZ L9D78

stu jr stu; заглушка
message: db "TEXT",0
L9DCD:
LD IX ,$5800;9DCD
LD B ,$16
L9DD3:
PUSH BC;9DD3
LD B ,$1F
L9DD6:
PUSH BC;9DD6
LD HL ,$0000
LD D ,$00
LD E ,(IX-$20 )
ADD HL ,DE
LD E ,(IX+$01 )
ADD HL ,DE
LD E ,(IX-$01 )
ADD HL ,DE
LD E ,(IX+$20 )
ADD HL ,DE
SRL L
SRL H
SRL L
SRL H
LD A ,L
LD ( IX+$00), A
INC IX
POP BC
DJNZ L9DD6

INC IX
POP BC
DJNZ L9DD3

ei:HALT
RET

end
display /d,end-begin
savesna "test.sna",begin

GM BIT
19.12.2012, 20:50
А может кто придумать сдвиг на 1 байт куска памяти быстрее LDI?

допустим:
ld hl,#8001
ld de,#8000
dup 200
ldi
edup

jerri
19.12.2012, 20:58
А может кто придумать сдвиг на 1 байт куска памяти быстрее LDI?

допустим:
ld hl,#8001
ld de,#8000
dup 200
ldi
edup


adr=#8001
dup 100
ld hl,(adr)
ld (adr-1),hl
adr+2
edup




ld sp,#8001
adr=#8000
dup 100
pop hl
ld (adr),hl
adr+2
edup

GM BIT
19.12.2012, 21:08
Код:
adr=#8001
dup 100
ld hl,(adr)
ld (adr-1),hl
adr+2
edup
__________

Это не быстрее, 32 такта на байт вместо 16

---------- Post added at 20:06 ---------- Previous post was at 20:01 ----------


Код:
ld sp,#8001
adr=#8000
dup 100
pop hl
ld (adr),hl
adr+2
edup
__________________
И это не быстрее, 26 тактов на байт вместо 16

---------- Post added at 20:08 ---------- Previous post was at 20:06 ----------

Или погоди

jerri
19.12.2012, 21:11
GM BIT, ldi кидает по 1 байту push кидает по 2 байта
итого 16 вс 16
и 13 вс 16

GM BIT
19.12.2012, 21:12
13 тактов на байт? я правильно понимаю?

Все дошло

jerri
19.12.2012, 21:13
13 тактов на байт? я правильно понимаю?

Все дошло

там еще будет восстановление стека
ld (store),sp
ld sp,(store)


еще вариант


ld sp,#8001
pop hl,de,bc,af
exx
ex af,af
pop hl,de,bc,af

ld sp,#8010
push af,bc,de,hl
exx
ex af,af
push af,bc,de,hl

GM BIT
19.12.2012, 21:17
там еще будет восстановление стека
ld (store),sp
ld sp,(store)
Ну при освободившихся 600 тактах это мелочь

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


еще вариант
У меня голова кипит :) я уже не посчитаю сколько на байт

jerri
19.12.2012, 21:21
Ну при освободившихся 600 тактах это мелочь

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


У меня голова кипит :) я уже не посчитаю сколько на байт

а чо там считать?

10
40
8
40

10
44
8
44

12,75 на байт
так что тот вариант с 13 тактами проще

NovaStorm
20.12.2012, 09:32
jerri, если не использовать af' и exa, то будет 12.5 тактов на байт.

jerri
20.12.2012, 10:37
NovaStorm, ну да это дополнительные 50 тактов

NovaStorm
20.12.2012, 11:24
Это кстати самая быстрая переброска блоков, что мне известна.

Andrew771
20.12.2012, 12:35
jerri, если не использовать af' и exa, то будет 12.5 тактов на байт.
Не 12.5, а 13, т.е. медленнее.

(10+40+10+44) / 8 = 13

Так что, вариант Jerri самый быстрый.

NovaStorm
20.12.2012, 13:19
Andrew771, ты неправильно считаешь.


ld sp,#src
pop af
pop bc
pop de
pop hl
exx
pop bc
pop de
pop hl
ld sp,#dest
push hl
push de
push bc
exx
push hl
push de
push bc
push af

10+40+4+30+10+33+4+44=175/14=12.5t/byte

Andrew771
20.12.2012, 14:42
а всё, дошло. Выкидываем только ex af',af :)

Vitamin
20.12.2012, 15:33
AFAIK, самая быстрая переброска памяти- это


pop hl
ld (xxxx),hl


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

AFAIK, самая быстрая переброска памяти- это


pop hl
ld (xxxx),hl

alone
20.12.2012, 18:09
А можно не перебрасывать, а прямо хранить данные в ld de,...:push de. Так делаются фреймовые листалки в газетах.

jerri
20.12.2012, 18:22
AFAIK, самая быстрая переброска памяти- это


pop hl 10 тактов
ld (xxxx),hl 16 тактов


26/2=13
итого 13 тактов на байт




ld sp,adr 10
pop hl,de,bc,af 40
exx 4
pop hl,de,bc 30
ld sp,adr 10
push bc,de,hl 33
exx 4
push af,bc,de,hl 44

175/14=12.5
итого 12.5 тактов на байт
чего сказать то хотел?

---------- Post added at 18:22 ---------- Previous post was at 18:13 ----------


А можно не перебрасывать, а прямо хранить данные в ld de,...:push de. Так делаются фреймовые листалки в газетах.

ld de,#nnnn ;10
push de ;11
21
итого 10.5 байт
но нам надо двигать кусок памяти

GM BIT
20.12.2012, 18:27
При переносе при помощи POP и PUSH на 1 байт не обязательно переустанавливать стек, его достаточно сдвинуть либо DEC SP либо INC SP (постоянно путаю) это чуть быстрее

jerri
20.12.2012, 18:37
GM BIT, really?


pop hl 10
dec sp 6
push hl 11
inc sp 6

или как?

GM BIT
20.12.2012, 18:48
Да не! берем 20 байт dec sp ложим 20 байт. взамен второго ld sp,adr

jerri
20.12.2012, 19:30
молодец :)

GM BIT
08.02.2013, 07:30
Киньте ссылку на коллекцию математических процедур

Vitamin
08.02.2013, 09:55
Киньте ссылку на коллекцию математических процедур
http://zxdocs.fatal.ru/coding/coding.htm
http://graphics.stanford.edu/~seander/bithacks.html

Vladson
20.02.2013, 03:22
Я тут побаловаться решил... Написал такую штуку... (64 битный ГПСЧ на LFSR) не знаю зачем понадобилось бы такое, но оно вроде работает даже...

SEED1 LD HL,#1234
SRL H
RR L
LD (SEED1+1),HL
SEED2 LD HL,#5678
RR H
RR L
LD (SEED2+1),HL
SEED3 LD HL,#90AB
RR H
RR L
LD (SEED3+1),HL
SEED4 LD HL,#CDEF
RR H
RR L
LD (SEED4+1),HL
RET NC
LD A,(SEED1+2)
XOR #D8
LD (SEED1+2),A
RET

Vitamin
20.02.2013, 07:28
64 битный ГПСЧ на LFSR
Не. Это три 16-битных генератора и одно черт-те что:)

Vladson
20.02.2013, 07:31
Нет, это именно 64 битный, сдвигаются все 4 пары сообща (не три их а 4, и из первого младший идёт в старший ко второму итд) и XOR-ятся нужные биты...
http://en.wikipedia.org/wiki/LFSR#Galois_LFSRs

Vitamin
20.02.2013, 07:37
Нет, это именно 64 битный, сдвигаются все 4 пары сообща (не три их а 4, и из первого младший идёт в старший ко второму итд) и XOR-ятся нужные биты...
http://en.wikipedia.org/wiki/LFSR#Galois_LFSRs
Если ты про алгоритм:


unsigned lsb = lfsr & 1;
lfsr >>= 1;
if (lsb == 1)
lfsr ^= 0xB400u;

то у тебя вроде как константы не те.

Vladson
20.02.2013, 07:48
Но, с тем что это извращение, я не спорю =)

---------- Post added at 05:40 ---------- Previous post was at 05:38 ----------


константы не те
Начальное значение может быть любым (главное не 0)
А биты которые хорить надо разные для разных разрядностей 0xB400u это для 16-ти вроде бит, у меня их 64 (там 64-й 63-й 61-й и 60-й биты хорить надо, т.е %11011000 т.е #D8 в самом старшем если сдвиг в самом младшем дал перенос)

---------- Post added at 05:48 ---------- Previous post was at 05:40 ----------

собственно вот 16 бит с теми самыми константами (использовал BC а не HL чтоб можно было в BASIC писать типа PRINT USR xxx)

LFSR16 LD BC,#0001
SRL B
RR C
JR NC,_SKIP
LD A,#B4
XOR B
LD B,A
_SKIP
LD (LFSR16+1),BC
RET

drbars
13.08.2013, 22:26
Моя процедура расчета адреса атрибутов или атрибутной карты из полных экранных координат (Х,Y):



; вх: L=X (0..255), H=Y (0..191)
; вых: HL=ATTR_ADR (адрес в области атрибутов)

LD A,H ; 4
RLCA ; 4
RLCA ; 4
LD H,A ; 4
AND #E0 ; 7
SRL L ; 8
SRL L ; 8
SRL L ; 8
OR L ; 4
LD L,A ; 4
LD A,H ; 4
AND #03 ; 7
OR #58 ; 7
LD H,A ; 4


Итого: 77 тактов. Кто быстрее? :v2_dizzy_roll:

introspec
13.08.2013, 22:45
Моя процедура расчета адреса атрибутов или атрибутной карты из полных экранных координат (Х,Y):
Итого: 77 тактов. Кто быстрее? :v2_dizzy_roll:

Могу 77 без порчи регистров. Нужно? :)

drbars
13.08.2013, 22:56
Могу 77 без порчи регистров. Нужно? :)
Давай конечно :) Только область атрибутов изменяемую сделай.
Хотя моя только регистр А юзает, HL пересчитывается.

introspec
13.08.2013, 23:11
ld h, (16384+6144)/4
ld a, Y
rlca
rl h
rlca
rl h
and %11100000
ld l, a
ld a, X
rra
rra
rra
and 31
or l
ld l, a
Сорри, проверить не могу, возможны тупые глюки. Но идея ОК. Привет #z80 :)

drbars
13.08.2013, 23:24
Сорри, проверить не могу, возможны тупые глюки. Но идея ОК. Привет #z80 :)
В регистре H что? ну или например надо из DE в DE расчёт сделать)

introspec
13.08.2013, 23:27
В регистре H что? ну или например надо из DE в DE расчёт сделать)
Я имел в виду, что XY - это BC или DE. Они не портятся. В HL - результат. Не то?

drbars
13.08.2013, 23:29
Не то?
не совсем, хотя я пока не запустил... чтобы проверить...

Destr
14.08.2013, 07:27
Итого: 77 тактов. Кто быстрее?
Не тестил, но если не глючит должно быть пошустрей.
In: H=Y, L=X
Out: HL=адрес в файле атрибутов.


RLC H ; 8
RLC H ; 8
LD A,L ; 4
RRCA ; 4
RRCA ; 4
RRCA ; 4
XOR H ; 4
AND #1F ; 7
XOR H ; 4
LD L,A ; 4
LD A,H ; 4
AND 3 ; 7
OR #58 ; 7
LD H,A ; 4
; 73

drbars
14.08.2013, 07:58
Не тестил, но если не глючит должно быть пошустрей.
In: H=Y, L=X
Out: HL=адрес в файле атрибутов.


RLC H ; 8
RLC H ; 8
LD A,L ; 4
RRCA ; 4
RRCA ; 4
RRCA ; 4
XOR H ; 4
AND #1F ; 7
XOR H ; 4
LD L,A ; 4
LD A,H ; 4
AND 3 ; 7
OR #58 ; 7
LD H,A ; 4
; 73


Вроде работает. 4 такта, круто! :v2_thumb:

jerri
14.08.2013, 10:15
Не тестил, но если не глючит должно быть пошустрей.
In: H=Y, L=X
Out: HL=адрес в файле атрибутов.


RLC H ; 8
RLC H ; 8
LD A,L ; 4
RRCA ; 4
RRCA ; 4
RRCA ; 4
XOR H ; 4
AND #1F ; 7
XOR H ; 4
LD L,A ; 4
LD A,H ; 4
AND 3 ; 7
OR #58 ; 7
LD H,A ; 4
; 73


Круто, а для пикселов такую?

drbars
14.08.2013, 10:41
Круто, а для пикселов такую?



LD A,H
AND #C0
RRA
SCF
RRA
RRCA
XOR H
AND #F8
XOR H
LD C,A
LD A,L
RLCA
RLCA
RLCA
XOR H
AND #C7
XOR H
RLCA
RLCA
LD L,A
LD H,C


93 такта :v2_dizzy_roll:

Titus
14.08.2013, 11:47
Не тестил, но если не глючит должно быть пошустрей.
In: H=Y, L=X
Out: HL=адрес в файле атрибутов.


RLC H ; 8
RLC H ; 8
LD A,L ; 4
RRCA ; 4
RRCA ; 4
RRCA ; 4
XOR H ; 4
AND #1F ; 7
XOR H ; 4
LD L,A ; 4
LD A,H ; 4
AND 3 ; 7
OR #58 ; 7
LD H,A ; 4
; 73


Проверьте мою, плиз.

LD A,H ;4
RRCA ;4
RRCA ;4
RRCA ;4
RRA ;4
RR L ;8
RRA ;4
RR L ;8
RRA ;4
RR L ;8
AND 0x03 ;7
ADD 0x58 ;7
LD H,A ;4

Итого 70 тактов

drbars
14.08.2013, 12:16
Проверьте мою, плиз.
Работает :v2_dizzy_roll:

jerri
14.08.2013, 12:44
Работает :v2_dizzy_roll:

а как это работает? :)

drbars
14.08.2013, 14:21
а как это работает? :)
Быстро :rolleyes:

GM BIT
14.08.2013, 19:57
Проверьте мою, плиз.
Мож чего ещё завалялось?

Titus
15.08.2013, 00:07
Мож чего ещё завалялось?

Не валялось. Придумано только что.

psb
15.08.2013, 01:03
Не валялось. Придумано только что.
мож еще что придумается? %)

Titus
15.08.2013, 01:24
мож еще что придумается? %)

Неконкретные вещи придумываться не умеют.

drbars
15.08.2013, 07:35
мож еще что придумается? %)
Чтобы что-то придумалось, поставь задачу. Реализуй, потом оптимизируй.

jerri
15.08.2013, 10:02
Не валялось. Придумано только что.

А придумай плиз пересчет из координат в адрес

вот как эта
младшие 3 бита по X можно игнорировать.


LD A,H
AND #C0
RRA
SCF
RRA
RRCA
XOR H
AND #F8
XOR H
LD C,A
LD A,L
RLCA
RLCA
RLCA
XOR H
AND #C7
XOR H
RLCA
RLCA
LD L,A
LD H,C
;93 такта

introspec
15.08.2013, 14:11
А придумай плиз пересчет из координат в адрес
Вот чуть более эффективный вариант:

ld a, h
and %11111000
rra
scf
rra
rrca
ld c, a ; 6*4+7=31
xor l
and %00000111 ; <- ВОТ ЗДЕСЬ РАНЬШЕ ЛЕЖАЛО НЕ ТО
xor l ; 15
rrca
rrca
rrca
ld l, a ; 4*4=16
ld a, c
xor h
and %11111000
xor h
ld h, a

; 31+15+16+23=85 тактов
Народ, вы вообще смотрите код? ошибка же была. Сейчас - верно.

psb
15.08.2013, 15:29
Неконкретные вещи придумываться не умеют.


Чтобы что-то придумалось, поставь задачу. Реализуй, потом оптимизируй.
тяжко у вас с юмором...

Titus
15.08.2013, 16:07
А придумай плиз пересчет из координат в адрес

вот как эта
младшие 3 бита по X можно игнорировать.

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

jerri
15.08.2013, 17:16
Такие вычисления уже контрпродуктивны. Эти вещи следует по таблицам считать.

т.е пересчет в атрибуты на 70 тактов это нормально а пересчет в пикселя уже нет?

Titus
15.08.2013, 18:18
т.е пересчет в атрибуты на 70 тактов это нормально а пересчет в пикселя уже нет?
Зависит от ситуации.

jerri
15.08.2013, 19:04
Titus, дык нормальная ситуация, но да уговорил табличко адресов рулит

drbars
21.08.2013, 11:44
Titus, дык нормальная ситуация, но да уговорил табличко адресов рулит
Не всегда рулит, чуть быстрее да.



LD A,CORD_Y
ADD A,A
LD L,A
LD H,high SCREEN_TAB
LD SP,HL
POP HL
LD A,CORD_X
RRCA
RRCA
RRCA
AND #1F
OR L
LD L,A

Titus
21.08.2013, 13:32
Не всегда рулит, чуть быстрее да.



LD A,CORD_Y
ADD A,A
LD L,A


Че это за фигня? У тебя что, 128 строк только?)

drbars
21.08.2013, 13:38
Че это за фигня? У тебя что, 128 строк только?)
На самом деле 144 :) Но вершина спрайта всегда < 128. А сам спрайт при выводе делает дальше POP DE вынимая из таблицы строки :)

Titus
21.08.2013, 13:54
Я бы вот так сделал:


L - XCoord

LD H,TAB
LD A,(HL)
INC H
LD L,YCoord
ADD A,(HL)
INC H
LD H,(HL)
LD L,A

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

introspec
21.08.2013, 14:01
Исправил ошибку в своём варианте без таблиц. Теперь точно работает.

drbars
21.08.2013, 14:18
Я бы вот так сделал:


L - XCoord

LD H,TAB
LD A,(HL)
INC H
LD L,YCoord
ADD A,(HL)
INC H
LD H,(HL)
LD L,A

Тактов на 20 быстрее, чем у тебя, и в два раза быстрее, чем вычислять без таблицы.
Да, но сколько драгоценной памяти уйдёт под таблицы? :)

Titus
21.08.2013, 20:01
Да, но сколько драгоценной памяти уйдёт под таблицы? :)

256*3 байт. Это копейки против 256*2.

drbars
22.08.2013, 08:50
Народ, вы вообще смотрите код? ошибка же была. Сейчас - верно.
Я смотрю, достойный вариант получился.

Вот накидал ещё вариант без регистра C.



LD A,H ; 4
AND #38 ; 7
RLCA ; 4
RLCA ; 4
SRL L ; 8
SRL L ; 8
SRL L ; 8
OR L ; 4
LD L,A ; 4
LD A,H ; 4
AND #C0 ; 7
RRA ; 4
SCF ; 4
RRA ; 4
RRCA ; 4
XOR H ; 4
AND #F8 ; 7
XOR H ; 4
LD H,A ; 4
; 97t

Vladson
03.09.2013, 04:08
Интересно, а существуют конкурсы по демкам до 20-ти байт :) (шутка)

Написал такую вот фигнюшку (просто колбасит экран, типа "ТВ-статика") никакого преимущества в ней нету, просто после того как написал обычным способом (LD HL,xxx DE,yyy) решил допилить до какого-то другого вида (сначала компактно хотел сделать, потом передумал и захотел избавиться от непечатных кодов, правда так и не получилось, по этому увы в таком виде её в REM увы не вставить без последствий, и я ещё начал так или иначе извращаться) короче мутузил-мутузил и вот что получилось...

XOR A
LD C,A
LD E,A
LD H,#18
S1 LD B,H
LD H,E
LD D,#40
LD L,A
ADD A
ADD A
ADD L
INC A
LDIR
JR S1


Update
А вот и версия для встраивания в бейсик REM подоспела (выкладываю скрином, ибо там нет ни одного непечатного символа или пробела, можно вбивать прямо в бейсике и всё заработает) :)

Update #4
Вот версия получше, вообще всё чисто, даже курсор G используется только на цифрах

Destr
03.09.2013, 20:46
Vladson, прилепляйте sna что-ли, а то компилить не всегда с руки...

Vladson
03.09.2013, 22:04
У вас эмулятор какой ? (я пользуюсь EmuZWin и там это делается дай боже в 3 клика)

Destr
03.09.2013, 22:15
У вас эмулятор какой ? (я пользуюсь EmuZWin и там это делается дай боже в 3 клика)
Unreal 0.26

jerri
02.10.2013, 00:06
Sprite collision
;__________________

есть 2 прямоугольника
их координаты
DE ху верхний левый угол
BC ху нижний правый угол


сначала HL хх координаты

потом HL yy координаты

кто подскажет быструю процедуру определения пересечения этих объектов?

NovaStorm
02.10.2013, 09:28
Если подходить разумно, без табличек =), то в 2D для AABB
collision = (1.left<2.right) and (1.top<2.bottom) and (2.left<1.right) and (2.top<1.bottom);
А для быстродействия учесть в JR, что столкновения реже случаются, чем нет. В лоб как-то так, потому что сохранение результатов подусловий и последствующий AND будет скорее всего тормознее.

jerri
02.10.2013, 14:50
collision_jean
;de left up corner
;bc right down corner
ld hl,(jean_xx) ;х координата левого края и правого края
;d b
ld a,b
cp h
jr c,no_coll0 ;too left
ld a,d
cp l
jr nc,no_coll0 ;too right
;left or between

no_coll1
ld hl,(jean_yy) ;у координата верха и низа.
;e c
ld a,c
cp h
jr c,no_coll0 ;too high
ld a,e
cp l
jr nc,no_coll0 ;too down
jp (ix)

;no collision_jean
no_coll0
or a
jp (ix)
вроде работает
как то так, может кому пригодится

NovaStorm
02.10.2013, 15:32
Если в CF результат, IX адрес возврата, то может так(проверить-то не на чем)?
Или если будет хреново при равных координатах, поставить где надо CCF. Так избавились от OR A и выходим по JR быстрее. Надо, правда, посчитать все пути графа, может в результате тактов и больше, но из-за большей вероятности выхода без коллизии будет лучше.


ld hl,(jean_xx)
;d b
ld a,h
cp b
jr c,1f
jp (ix)
1
ld a,d
cp l
jr c,2f
jp (ix)
2
ld hl,(jean_yy)
;e c
ld a,h
cp c
jr c,3f
jp (ix)
3
ld a,e
cp l
jp (ix)

drbars
03.10.2013, 14:12
SBC HL,DE (BC) не?

jerri
03.10.2013, 15:52
drbars, не

drbars
03.10.2013, 18:58
drbars, не

Может так?


collision_jean
;de left up corner
;bc right down corner
ld hl,ret_
push hl

ld hl,(jean_xx) ;х координата левого края и правого края
;d b
ld a,b
cp h
ret c
ld a,d
cp l
ret nc
;left or between

no_coll1
ld hl,(jean_yy) ;у координата верха и низа.
;e c
ld a,c
cp h
ret c
ld a,e
cp l
ret nc
pop hl
ret

;no collision_jean
ret_
or a
ret

Blade
03.10.2013, 19:25
Размеры прямоугольников фиксированные или переменные?

GM BIT
03.10.2013, 19:34
jerri, подумал бы если понял, твое ТЗ

jerri
03.10.2013, 21:39
drbars, ret нельзя
на стеке структура.

Blade, переменные, а какая разница?

GM BIT, да в принципе пофиг - первый вариант вполне фурычит.

drbars
04.10.2013, 17:01
drbars, ret нельзя
на стеке структура.

Стек на экране в этот момент? Стеком пишется или читается?

jerri
04.10.2013, 17:54
drbars, на стеке структура объекта. беру данные сравниваю, провожу обработку.
что то вроде


p_item
pop de
ld (sta_koor),de
ld a,d
add a,a
add a,a
ld d,a
add a,8
ld b,a
ld a,e
add a,a
add a,a
ld e,a
add a,8
ld c,a
ld ix,p_heart0
jp collision_jean
p_heart0
;collision checked
;c=collision detected
;здесь переход на подпрограмму обработки
ret

pick_heart
;heart_collided_jean
pop hl
jp nc,p_heart1
ld (hl),#ff
ld hl,draw_lives
ld (hl),#00
ld hl,tot_lives
ld a,(hl)
cp 9
adc a,0
ld (hl),a
;picked up heart, lives incremented
pick_h0
ld hl,-6
add hl,sp
ld sp,hl
ld hl,0
push hl
ld hl,obj_lenght
add hl,sp
jp anim_items0

drbars
04.10.2013, 22:05
Так, попробуй.

sta_koor (H or L) =< #3f, так я понял?

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



p_item
LD HL,ret_
EX (SP),HL
LD (sta_koor),HL
ADD HL,HL
ADD HL,HL
EX DE,HL
LD A,D
ADD A,#08
LD B,A
LD A,E
ADD A,#08
LD C,A
JP collision_jean
p_heart0
;collision checked
;c=collision detected
;здесь переход на подпрограмму обработки
ret

collision_jean
;de left up corner
;bc right down corner
ld hl,(jean_xx) ;х координата левого края и правого края
;d b
ld a,b
cp h
ret c
ld a,d
cp l
ret nc
;left or between

no_coll1
ld hl,(jean_yy) ;у координата верха и низа.
;e c
ld a,c
cp h
ret c
ld a,e
cp l
ret nc
pop hl
inc hl
jp (hl)

;no collision_jean
ret_
or a
JP p_heart0

jerri
04.10.2013, 22:23
не не
на стеке ничего не запарывается.
данные со стека снимаются, а потом

но здравые идеи есть :) обязательно воспользуюсь
de используется из-за старых концепций, сейчас то уже можно использовать и hl


pop hl
ld (sta_koor),hl
add hl,hl
add hl,hl
ex de,hl
ld hl,#0808
add hl,de
ld b,h
ld c,l

drbars
04.10.2013, 22:38
Тогда уж так:


pop hl
ld (sta_koor),hl
ld de,#0808
add hl,hl
add hl,hl
ex de,hl
add hl,de
ld b,h
ld c,l

denpopov
14.02.2014, 22:08
бампну утонувший трэд. Есть ли у кого-то процедуры для воспроизведения звука?
интересны бипер и AY.

Alex Rider
14.02.2014, 23:29
интересны бипер и AY.
Бульбоплеер и #03b5. А поточнее?

denpopov
14.02.2014, 23:50
Бульбоплеер и #03b5. А поточнее?
а поподробнее можно?

jerri
15.02.2014, 10:47
denpopov, еще вот тут почитай (http://zx.pk.ru/showthread.php?t=21954) это для бипера

drbars
14.03.2014, 20:18
Можно ли увеличить аккумулятор на 1 за исключением нуля, не используя JR Z и быстре чем с ним?

Придумал тока так:

SUB #01
CCF
ADC A,#01

SAM style
14.03.2014, 20:36
Можно ли увеличить аккумулятор на 1 за исключением нуля, не используя JR Z и быстре чем с ним?

Придумал тока так:

SUB #01
CCF
ADC A,#01
7 + 4 + 7 = 18 тактов и 5 байт
с JR Z:

AND A
JR Z,...
INC A
уже 4 байта и 4 + 7 + 4 = 15 тактов для NZ
и 4 + 12 = 16 тактов для Z
То есть по любому быстрее

introspec
14.03.2014, 20:41
ADD 255
ADC 1

drbars
14.03.2014, 21:41
ADD 255
ADC 1

Но в цилке это всё таки мне кажется быстрее, при свободном регистре конечно

SUB C
CCF
ADC A,C

где С=1, 12 тактов! :)

introspec
14.03.2014, 21:51
Но в цилке это всё таки мне кажется быстрее, при свободном регистре конечно

SUB C
CCF
ADC A,C

где С=1, 12 тактов! :)
Мне нужно писать комментарий про то, что будет с моим решением, если есть один (или два) свободных регистра?! :)))))))))))))))))))))

drbars
14.03.2014, 21:58
Мне нужно писать комментарий про то, что будет с моим решением, если есть один (или два) свободных регистра?! :)))))))))))))))))))))
не, просто когда думал... сразу под один свободный регистр предполагал.
Два регистра у меня в цикле — роскошь. :)

---
upd. Чёрт!! :) один такт!!! :) introspec wins!

alone
14.03.2014, 23:17
А то ещё можно сделать такой инкремент одной командой ld l,(hl) :)

introspec
14.03.2014, 23:33
А то ещё можно сделать такой инкремент одной командой ld l,(hl) :)РЖУНИМАГУ :)

---------- Post added at 19:33 ---------- Previous post was at 19:19 ----------

Но вообще ты жулик! Потому что сначала нужно аккумулятор в l положить!

alone
14.03.2014, 23:39
А у меня счётчик в L, а не в аккумуляторе :)

drbars
15.03.2014, 10:33
А у меня совсем нет счетчика, во дела))

Titus
15.03.2014, 15:50
ADD 255
ADC 1

А если все равно, в какую сторону считать (в обратную), то еще быстрее будет:

ADD A,255
SBC A,255

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

ADD A,C
SBC A,C

denpopov
30.03.2014, 20:00
раньше не сталкивался, но пригодилась и такая процедура:

расчет адреса экрана по координатам знакомест


; Get screen address
; D = Y character position
; E = X character position
; Returns address in DE
;
Get_Char_Address: LD A,D
AND %00000111
RRA
RRA
RRA
RRA
OR E
LD E,A
LD A,D
AND %00011000
OR %01000000
LD D,A
RET ; Returns screen address in DE

оттуда (http://wordpress.animatez.co.uk/programming/assembly-language/z80/z80-library-routines/output-asm/)

GM BIT
31.03.2014, 11:47
Помогите с оптимизацией построения вертикальной линии. То, что я надумал не устраивает по скорости
Дело в том, что на входе желательно только иметь адрес и кол-во точек, и до начала построения основного экрана строится линия примерно из 350 точек, хочется выйти на 700 :)



/// вход hl,adr, b - длина, а - сколько попадает на первое знакоместо (128-1 точка, 64-2точки ... 1-8точек)

line ld hl,16384 ;начало линии
ld b,85
ld a,1
///

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

denpopov
31.03.2014, 11:52
sc0 set 2,(hl) ;рисуем в одном знакоместе
inc h ;
rlca ;
jr c,sc1 ;
djnz sc0 ;

по идее не помешало бы развернуть такой цикл.


sc1 ex af,af ;переходим на знакоместо ниже
ld a,l
add a,32
ld l,a
jr c,sc3
ld a,h
sub 8
если позволит, то можно попробовать de=#0820, тогда
add a,e;add a,32 - 7 тактов против 4х
sub d;то же самое.

или pop hl