Я вот думал и пришел к выводу что можно сделать разумно компромиссную архитектуру - некий секвенсер кучи параллельно работающих устройств с разными циклами длительности
скажем есть текущее время в каких то условных тиках которые мельче любых устройств в машине
обычно это как минимум пиксель клок который раза в 2 чаще чем такты CPU ну или даже еще мельче
clock = 0
while emulationOn {
next_clock = 0
foreach chip in chips[] {
if chip.local_clock <= clock { chip.local_clock += chip.execute() }
if (next_clock == 0) || (next_clock > chip.local_clock) { next_clock = chip.local_clock }
}
clock = next_clock
}
chip.execute() возвращает количество проэмулированных тиков и мы плюсуем их к локальному времени устройства
соответственно эмуляция это куча устройств (вывод на экран тоже становится устройством и можно реально попиксельно обновлять / сканировать наш виртуальный телек соотв с эмуляцией всей фигни типа динамической смены палитр по ходу сканирования и бордера от звука в спектруме и тд) так вот устройства тут все - и клавиатура и сканер картинки и видео процессор если надо и дма и все что угодно - и каждое после атомарной операции сообщает на сколько тиков вперед оно просчиталось и соответственно мы не трогаем его раньше времени.
теперь можно сделать что CPU будет не покомандно работать а по своим там внутренним циклам или просто потактно а можно и по старинке покомандно - это не меняет сути самого секвенсера и спрятано внутри объекта цпу или иного устройства
вот как то так видится
а внутри того же CPU в .execute() просто меняются стейты FETCH / DECODE / EXECUTE / RD / WR
так же внутри DMA и прочих устройств
ticks cpu::execute()
{
switch(.state) {
case FETCH: ... .state = DECODE; return 4;
case DECODE:
case RD:
case EXECUTE:
case WR:
}





Ответить с цитированием