Просмотр полной версии : Расчет длины 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:
http://www.zxpress.ru/article.php?id=1195
http://www.zxpress.ru/article.php?id=12404&lng=eng
Что вы в трех соснах заблудились) Цикл inc bc, jr - это аж 18 тактов дискретности (т.е. ошибки). Какая тут може быть точность?
Забей 20 килобайт нопов, начинающихся с HALT, затем вычисли на каком адресе прийдет прерывание, да вычти адрес с HALT'ом, вот тебе и точность в 4 такта.
а разве halt не стоит не ждет пока не придет прерывание? Соотв., сразу после прихода прерывание z80 уходит по вектору
В halt'е z80 не останавливается. Грубо говоря, halt работает как четырехтактовый jr $. Поэтому в прерывание он уходит не сразу, а как отработает цикл M1.
Обратитесь к Alone. Этот парень вам всё обьяснит.
Стоко раз пользовался его п/программой настройки на 1-й такт INT-a!
Расчет длины INT или ЧЯДНТ
Как всем известно, каноническая длина INT составляет 71680 тактов для Pentagon и 69888 тактов для Scorpion и оригинального Spectrum. Я написал следующий позорный код, печатающий при вызове из Basic число, пропорциональное кол.-ву тактов:
А в чём вопрос?
---------- Post added at 23:37 ---------- Previous post was at 23:36 ----------
Вопрос к гуру мультиколоров: Что я делаю не так?
Смотря, что хочешь узнать!
Titus справедливо отметил, что нет средств чтобы с точностью до такта подсчитать программно длину INT просто потому, что inc bc - jr дают разброс точности в 18 тактов и предложил оригинальный альтернативный вариант подсчета, хотя и не с точностью до такта.
Да нет, можно и с точностью посчитать. Учитывая, что в любом спектруме число тактов в кадре уж явно кратно 4, то имея дискретность команды 4 такта (NOP), мы посчитаем точно.
Но даже если бы тактов в кадре было какое-то неделимое на 4 число, все равно можно было бы подсчитать точно, но не за один INT.
есть ещё вариант подсчёта через системную бейсик переменную (frames).
подобным образом определяется тип машины 48/128 в играх Sentinel и BubbleBobble
shurik-ua
19.03.2013, 01:41
Вот мои скромные изыски по данному вопросу )
файл загрузить в Unreal вместо ROM 48k и сброситься в 48 режим )
проверено в эмуле от 2000 до 1 млн тактов показывает правильно )
в Jemmini Commander'e сделан подсчёт с точностью до 32 тактов, здесь с точностью до 16 ( можно и до 10).
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot