Просмотр полной версии : Устанение "дрожания" бордера
Столкнулся с проблемой "дрожания" бордера по горизонтали. Обычно устраняю при помощи:
ld hl,0
ld de,0
ld bc,число(хватает от 1 до 4)
ldir
Только этот вариянт не прошёл после последующей прорисовки бордера.
Дрожание составило 4 такта, что равно 1 знакоместу.
Были тут варианты с выходом по флагам, но не нашёл.
Повторите, плз. Или ткните носом, где глянуть. "Горит" дема.
дрожит-то между кадрами или в пределах одного кадра между строками?
если кадры - надо добивать код так, чтобы в итоге он был кратен 4 тактам за прерывание.
Firestarter
16.09.2010, 13:48
Простыми народними словами у тебя заканчиваются прерывания не кратные 4. из за этого следующие прерывание едет
Вышла такая байда - "нарисовал" бордюр ДО основного экрана. Всё "стоит" на месте, не смыкается. НО! если "прорисовать" ещё что либо, то это "что либо" уже дёргается. Пришёл к выводу, что всё в предыдущуй "прорисовке" Как устранить- ??? Столько бордюров сделал, а тут застрял как пацан.
Думаю, что надо с той процедурой, которую ищу, выходить их верхней "прорисовки", и из всех остальных. Главное, чтоб каждая получалась кратной 4-м.
P.S. Ну влом километр кода переписывать и такты контролироватью Кто пишет код меня поймут.
Простыми народними словами у тебя заканчиваются прерывания не кратные 4. из за этого следующие прерывание едет
А вот тут я вообще в шоке. Картинка на месте, а после неё "дрожит" Как так может быть?
Firestarter
16.09.2010, 14:35
ну допустим в пентагоне 71680 таков. у тебя кончилась программа на 2051 такте значит дойдя до halt процессор на самом деле ждет nop ами все это время по 4 такта из этого следует что в итоге у тебя будет например 71677 тактов в одном прерывании в другом на один такт дольше и тд
кстати, речь-то о пентагоне хоть?
в эмуляторе тоже дергается? в унреале сразу же встроен счетчик тактов: если поставить точки останова на начало каждой расчетной строки, то потом просто нажимая esc будем видеть, 224 такта прошло или нет. если нет - сразу будет видно, где косяк.
ну допустим в пентагоне 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-х тактов. Никто не знает?
Давал когда-то ты мне прогу которая настраивается на первый такт инта. Поискал не нашел. Ты говорил ее откуда-то из CodeBuster'сов дернул.
в общем, простого рецепта может и не быть, неизвестно что делается в коде. например, плеер pt3 какой-нить, там же много ветвлений, и остаток от деления на 4 может быть всегда разный, хрен такое просто выправишь.
Давал когда-то ты мне прогу которая настраивается на первый такт инта. Поискал не нашел. Ты говорил ее откуда-то из CodeBuster'сов дернул.
Дай ссылку на это пост. Помню, что именно там то, что мне надо. А тему ты поднимал вроде бы.
http://www.zx.pk.ru/showthread.php?t=9728&highlight=%F0%E8%F1%F3%E5%EC+border
Кстати сейчас его перечитал, нет там решения как убрать N+(0-3) такта
в общем, простого рецепта может и не быть, неизвестно что делается в коде. например, плеер pt3 какой-нить, там же много ветвлений, и остаток от деления на 4 может быть всегда разный, хрен такое просто выправишь.
Плеер проигрывает музыку, разложеную на OUT-ы. Работает ДО "прорисовки" верхней части бордюра. Его влияние исключено.
---------- Post added at 15:31 ---------- Previous post was at 15:26 ----------
Вот это я искал:
scf
ret nc
ret nc
ret nc
Только не пойму, с чем это связано? У меня в это время в А сидит значение цвета.
PSB, от тебя это было. Что проверяем -то?
если условие не выполняется, то RET NC занимает 5 тактов.
SCF далает так, чтоб ни один RET NC не прошёл.
т.е. получается один RET NC поволяет сдвинуть на 1 такт.
при дрожании надо поставить от 1-го до 3-х ret-ов (подбирать)
кстати, интерестный метод, я то, дурак :), обычно ADD HL,HL или LD A,0 подтягивал (оба сдвигают 3 такта)
Нет, может я балбес, но scf - это с каким регистром работа? Вроде как с А? Так что там должно быть, чтоб выполнить условие? У меня, в моей проге, данные цвета, который мне нужен. Что в А надо загрузить? Вот что надо узнать. А PSB молчит.
scf - это с каким регистром работа?
только c F, значение в A тут не причём.
кстати, интерестный метод, я то, дурак , обычно 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 ----------
Нихрена не помогло. Эффект тот же. Здесь что-то другое. Перепишу код по новой, но тот сохраню и после пати выложу. Будет за что меня поматерить :-)
А почему сразу на 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 такта
Нихрена не помогло. Эффект тот же. Здесь что-то другое
скорее всего что-то плавает по тактам.
Так что? выход только один? пишем код кратный 4 тактам и по другому никак?
Насколько я помню, автоподгонка от RST#7 сама по себе работает несколько интов, так что в первый раз автоподгонка, а потом писать код кратный 4м тактам.
На входе в прерывание младший байт адреса возврата содержит число, с помощью которого можно определить в какой момент было прерывание...
Разъясни? На стеке адрес следущей инструкции, после обработки прерывания. Или я не о том?
И еще на входе в преравание счетчик тактов показывает 19-22т
Да и наверное кратно четырем не обязательно кодить, главное как я понял всегда одинаково кратно + задержка
Не... это у меня бред был...
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 байт!
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot