PDA

Просмотр полной версии : Устанение "дрожания" бордера



VNN_KCS
16.09.2010, 13:14
Столкнулся с проблемой "дрожания" бордера по горизонтали. Обычно устраняю при помощи:
ld hl,0
ld de,0
ld bc,число(хватает от 1 до 4)
ldir
Только этот вариянт не прошёл после последующей прорисовки бордера.
Дрожание составило 4 такта, что равно 1 знакоместу.
Были тут варианты с выходом по флагам, но не нашёл.
Повторите, плз. Или ткните носом, где глянуть. "Горит" дема.

psb
16.09.2010, 13:45
дрожит-то между кадрами или в пределах одного кадра между строками?
если кадры - надо добивать код так, чтобы в итоге он был кратен 4 тактам за прерывание.

Firestarter
16.09.2010, 13:48
Простыми народними словами у тебя заканчиваются прерывания не кратные 4. из за этого следующие прерывание едет

VNN_KCS
16.09.2010, 14:19
Вышла такая байда - "нарисовал" бордюр ДО основного экрана. Всё "стоит" на месте, не смыкается. НО! если "прорисовать" ещё что либо, то это "что либо" уже дёргается. Пришёл к выводу, что всё в предыдущуй "прорисовке" Как устранить- ??? Столько бордюров сделал, а тут застрял как пацан.
Думаю, что надо с той процедурой, которую ищу, выходить их верхней "прорисовки", и из всех остальных. Главное, чтоб каждая получалась кратной 4-м.
P.S. Ну влом километр кода переписывать и такты контролироватью Кто пишет код меня поймут.


Простыми народними словами у тебя заканчиваются прерывания не кратные 4. из за этого следующие прерывание едет
А вот тут я вообще в шоке. Картинка на месте, а после неё "дрожит" Как так может быть?

Firestarter
16.09.2010, 14:35
ну допустим в пентагоне 71680 таков. у тебя кончилась программа на 2051 такте значит дойдя до halt процессор на самом деле ждет nop ами все это время по 4 такта из этого следует что в итоге у тебя будет например 71677 тактов в одном прерывании в другом на один такт дольше и тд

psb
16.09.2010, 14:42
кстати, речь-то о пентагоне хоть?
в эмуляторе тоже дергается? в унреале сразу же встроен счетчик тактов: если поставить точки останова на начало каждой расчетной строки, то потом просто нажимая esc будем видеть, 224 такта прошло или нет. если нет - сразу будет видно, где косяк.

VNN_KCS
16.09.2010, 15:57
ну допустим в пентагоне 71680 таков. у тебя кончилась программа на 2051 такте значит дойдя до halt процессор на самом деле ждет nop ами все это время по 4 такта из этого следует что в итоге у тебя будет например 71677 тактов в одном прерывании в другом на один такт дольше и тд
Ну добавлю я этот такт, точнее 9 тактов, чтоб было кратное 4-м. Так ведь ничего не меняется. Пробовал.

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


кстати, речь-то о пентагоне хоть?
в эмуляторе тоже дергается? в унреале сразу же встроен счетчик тактов: если поставить точки останова на начало каждой расчетной строки, то потом просто нажимая esc будем видеть, 224 такта прошло или нет. если нет - сразу будет видно, где косяк.
Делаю в эмуле, настроеном под Пентагон. Всё сходилось на Пентеве. Все мои проги, которые я когда-то делал на реале Пентагона, в этом эмуле идут отлично.
А вот с точками останова не дружу, к сожалению. Просто не пробовал.

---------- Post added at 14:57 ---------- Previous post was at 14:25 ----------

Народ, я просто просил то, что уже на форуме было. Только найти не могу. А было типа jp c, nc.... С вырвниваем до 4-х тактов. Никто не знает?

GM BIT
16.09.2010, 16:09
Давал когда-то ты мне прогу которая настраивается на первый такт инта. Поискал не нашел. Ты говорил ее откуда-то из CodeBuster'сов дернул.

psb
16.09.2010, 16:15
в общем, простого рецепта может и не быть, неизвестно что делается в коде. например, плеер pt3 какой-нить, там же много ветвлений, и остаток от деления на 4 может быть всегда разный, хрен такое просто выправишь.

VNN_KCS
16.09.2010, 16:17
Давал когда-то ты мне прогу которая настраивается на первый такт инта. Поискал не нашел. Ты говорил ее откуда-то из CodeBuster'сов дернул.
Дай ссылку на это пост. Помню, что именно там то, что мне надо. А тему ты поднимал вроде бы.

GM BIT
16.09.2010, 16:20
http://www.zx.pk.ru/showthread.php?t=9728&highlight=%F0%E8%F1%F3%E5%EC+border
Кстати сейчас его перечитал, нет там решения как убрать N+(0-3) такта

VNN_KCS
16.09.2010, 16:31
в общем, простого рецепта может и не быть, неизвестно что делается в коде. например, плеер pt3 какой-нить, там же много ветвлений, и остаток от деления на 4 может быть всегда разный, хрен такое просто выправишь.
Плеер проигрывает музыку, разложеную на OUT-ы. Работает ДО "прорисовки" верхней части бордюра. Его влияние исключено.

---------- Post added at 15:31 ---------- Previous post was at 15:26 ----------

Вот это я искал:
scf
ret nc
ret nc
ret nc
Только не пойму, с чем это связано? У меня в это время в А сидит значение цвета.
PSB, от тебя это было. Что проверяем -то?

Sinus
16.09.2010, 17:23
если условие не выполняется, то RET NC занимает 5 тактов.
SCF далает так, чтоб ни один RET NC не прошёл.
т.е. получается один RET NC поволяет сдвинуть на 1 такт.
при дрожании надо поставить от 1-го до 3-х ret-ов (подбирать)

кстати, интерестный метод, я то, дурак :), обычно ADD HL,HL или LD A,0 подтягивал (оба сдвигают 3 такта)

VNN_KCS
16.09.2010, 23:58
Нет, может я балбес, но scf - это с каким регистром работа? Вроде как с А? Так что там должно быть, чтоб выполнить условие? У меня, в моей проге, данные цвета, который мне нужен. Что в А надо загрузить? Вот что надо узнать. А PSB молчит.

goodboy
16.09.2010, 23:59
scf - это с каким регистром работа?
только c F, значение в A тут не причём.

VNN_KCS
17.09.2010, 00:18
кстати, интерестный метод, я то, дурак , обычно ADD HL,HL или LD A,0 подтягивал (оба сдвигают 3 такта)
Если так, то точно придётся по новой код писать. А ведь в нащем интро низ не дёргался, хотя иея построения та же.
А почему сразу на 3 пиксела? Можно сделать многое, чтоб сдвинуть на 1,2,3,4..... такта. Жаль только, что сдвиг 1 такт, а бордюр сдвигается на 2 экранных пиксела. А если бы на 1?.........

---------- Post added at 23:08 ---------- Previous post was at 23:03 ----------


только c F, значение в A тут не причём.
Ну не знаю. Может и я что-то недопонял. Попробую, завтра отпишусь. Просто хотел на выходе одной п.программы получить кратное 4-м и на выходе другой- то же. А таким макаром решить свою пробдему. Первый раз столкнулся с этим.
Всем спасибо за участие.

---------- Post added at 23:18 ---------- Previous post was at 23:08 ----------

Нихрена не помогло. Эффект тот же. Здесь что-то другое. Перепишу код по новой, но тот сохраню и после пати выложу. Будет за что меня поматерить :-)

Sinus
17.09.2010, 01:19
А почему сразу на 3 пиксела
ммм... я про такты говорил, а не пиксели.

ADD HL,HL - на сдвиг 3 такта
ADD HL,HL * 2 - на сдвиг 2 такта
ADD HL,HL * 3 - на сдвиг 1 такт

в случае с RET NC:

RET NC - сдвиг на 1 такт
RET NC * 2 - сдвиг на 2 такта
RET NC * 3 - сдвиг на 3 такта


Нихрена не помогло. Эффект тот же. Здесь что-то другое

скорее всего что-то плавает по тактам.

TmK
21.11.2010, 17:04
Так что? выход только один? пишем код кратный 4 тактам и по другому никак?

Sinus
21.11.2010, 17:18
Насколько я помню, автоподгонка от RST#7 сама по себе работает несколько интов, так что в первый раз автоподгонка, а потом писать код кратный 4м тактам.

TmK
21.11.2010, 17:33
deleted

GM BIT
21.11.2010, 18:23
На входе в прерывание младший байт адреса возврата содержит число, с помощью которого можно определить в какой момент было прерывание...
Разъясни? На стеке адрес следущей инструкции, после обработки прерывания. Или я не о том?
И еще на входе в преравание счетчик тактов показывает 19-22т
Да и наверное кратно четырем не обязательно кодить, главное как я понял всегда одинаково кратно + задержка

TmK
21.11.2010, 18:44
Не... это у меня бред был...

alone
18.06.2011, 15:15
ZX-Guide #3:

LD BC,#6FF
;не более 6 проходов! (и не менее 3)
;первые 2 прохода - холостые:
;1-й - для попадания на IMER во время INT,
;2-й - для оценки D.
DI
LD HL,IMER
LD (#BEFF),HL
LD A,#BE
LD I,A
IM 2
BACK XOR A
LD HL,LOOP ;+2t
EI
LOOP DEC A
JP (HL)
;-1t (INT=11t)
IMER POP HL ;+2t
LD E,(HL) ;-1t
RL E ;"JP (HL)">128
RLA
LD E,D
LD D,A
SUB E
SUB C ;не увеличилось ли D?
SBC A,A
OR 4 ;-1t 4=EXIT,#FF=NO EXIT
DEC B ;итого +1 такт за фрейм
AND B ;Для холостых NO EXIT:)
JR NZ,BACK
END ;всего 39 байт!