PDA

Просмотр полной версии : Расчет длины INT или ЧЯДНТ



SoftLight
15.02.2013, 17:23
Как всем известно, каноническая длина INT составляет 71680 тактов для Pentagon и 69888 тактов для Scorpion и оригинального Spectrum. Я написал следующий позорный код, печатающий при вызове из Basic число, пропорциональное кол.-ву тактов:



di
ld hl, $8000
push hl: pop de: inc de
ld bc, 257
ld a, $c3
ld (hl), a
ldir
ld hl, INT
ld de, $c3c3
ld bc, INTLEN
ldir
ld a, $80
ld i, a
im 2
ei
ld bc, 0
ld a, 1
halt
.loop
inc bc ; 6
jr .loop ; 12
INT
or a ; 4
jr z, .exit1 ; 7
dec a ; 4
.exit2
ei ; 4
ret ; 10
.exit1
pop hl
im 1
jr .exit2
INTLEN = $ - INT


Запускаю в Unreal с моделью ULA = Pentagon. Получаю 3980. Где-то еще я слышал, что на уход в прерывание z80 тратит 19 таков.
Начинаем считать длину INT: 3980 x (6+12) + (4+7+4+4+10) + 19 = 3980x18+29+19 =71688 вместо 71680.

Вопрос к гуру мультиколоров: Что я делаю не так? :v2_dizzy_facepalm:

GM BIT
15.02.2013, 20:14
http://www.zxpress.ru/article.php?id=1195
http://www.zxpress.ru/article.php?id=12404&lng=eng

Titus
22.02.2013, 12:56
Что вы в трех соснах заблудились) Цикл inc bc, jr - это аж 18 тактов дискретности (т.е. ошибки). Какая тут може быть точность?
Забей 20 килобайт нопов, начинающихся с HALT, затем вычисли на каком адресе прийдет прерывание, да вычти адрес с HALT'ом, вот тебе и точность в 4 такта.

Blade
22.02.2013, 14:26
а разве halt не стоит не ждет пока не придет прерывание? Соотв., сразу после прихода прерывание z80 уходит по вектору
В halt'е z80 не останавливается. Грубо говоря, halt работает как четырехтактовый jr $. Поэтому в прерывание он уходит не сразу, а как отработает цикл M1.

VNN_KCS
23.02.2013, 00:28
Обратитесь к Alone. Этот парень вам всё обьяснит.
Стоко раз пользовался его п/программой настройки на 1-й такт INT-a!

GM BIT
23.02.2013, 00:37
Расчет длины INT или ЧЯДНТ
Как всем известно, каноническая длина INT составляет 71680 тактов для Pentagon и 69888 тактов для Scorpion и оригинального Spectrum. Я написал следующий позорный код, печатающий при вызове из Basic число, пропорциональное кол.-ву тактов:
А в чём вопрос?

---------- Post added at 23:37 ---------- Previous post was at 23:36 ----------


Вопрос к гуру мультиколоров: Что я делаю не так?
Смотря, что хочешь узнать!

Titus
23.02.2013, 22:14
Titus справедливо отметил, что нет средств чтобы с точностью до такта подсчитать программно длину INT просто потому, что inc bc - jr дают разброс точности в 18 тактов и предложил оригинальный альтернативный вариант подсчета, хотя и не с точностью до такта.
Да нет, можно и с точностью посчитать. Учитывая, что в любом спектруме число тактов в кадре уж явно кратно 4, то имея дискретность команды 4 такта (NOP), мы посчитаем точно.
Но даже если бы тактов в кадре было какое-то неделимое на 4 число, все равно можно было бы подсчитать точно, но не за один INT.

goodboy
24.02.2013, 00:02
есть ещё вариант подсчёта через системную бейсик переменную (frames).
подобным образом определяется тип машины 48/128 в играх Sentinel и BubbleBobble

shurik-ua
19.03.2013, 01:41
Вот мои скромные изыски по данному вопросу )

файл загрузить в Unreal вместо ROM 48k и сброситься в 48 режим )
проверено в эмуле от 2000 до 1 млн тактов показывает правильно )

в Jemmini Commander'e сделан подсчёт с точностью до 32 тактов, здесь с точностью до 16 ( можно и до 10).