Сообщение от
alone
Каким образом эта программа подстраивает HALT под нужный такт из 4? А может, она его вообще не подстраивает и результат рандомный?
У Яна Бобровского выложены все исходники:
http://wizard.ae.krakow.pl/~jb/qaop/tests.html
Код там грязненький (на мой вкус, конечно), но трюки хорошие тоже есть. Нужно только делать поправку, что его цель - не переносимость, а тестирование эмуляторов/клонов ULA на совместимость с классикой.
Вот его выравнивание (я разбирался для своей TimeChart):
Код:
ALIGNINT:
ld de, _align
push de
ld de, _try
push de
im 2
halt
rst 0 ; the interrupt handler never returns (it pops the last value off the stack)
_try ; 46T+
push de ; 57T+
ld bc,32677 ; 67T+
call DELAY ; 32744T+
ld bc,(FRAMET) ; 32764T+
call DELAY ; 69884T+
nop ; 69888T+ - the idea seems to be that if we run for exactly FRAME tacts, we are perfectly aligned
pop de
rst 0 ; really crazy way to handle timing errors (e.g. it crashes on Scorpion due to unaccounted M1 delays)
_align ; 55T
inc de
halt
rst 0
Я использую похожую схему для своей TimeChart. Если правильно подогнать такты - выравнивание не нужно.