2012-06-22 4 views
3

В настоящее время я изучаю C для своего следующего проекта эмуляции, точное число циклов 68000 (мой последний проект - это нециклический точный эмулятор Sega Master System, написанный на Java, который теперь находится на третьем выпуске). Мой вопрос касается точности на уровне циклов, так как принятие вещей на этот уровень для меня является новой вещью.Циклическая точная эмуляция

Чтобы разбить дело до степени зернистости 1 цикла процессора, по-видимому, мне нужно знать, сколько времени занимает доступ к памяти и т. Д., Но мой вопрос заключается в том, что для инструкций, которые занимают несколько циклов на этапах выборки/записи по памяти, что ЦП выполняет каждый цикл - например, x количество бит, скопированных за цикл.

С моим эмулятором SMS мне не нужно было слишком много беспокоиться о этапах M1 и т. Д., Поскольку он просто использовал количество циклов для каждой команды, другими словами, он точно соответствует уровню команды, а не уровню цикла. Я не ищу детали, специфичные для архитектуры, а просто идею о том, какие вещи я должен обратить внимание при переходе на этот уровень детализации.

68k подробности приветствуется однако. В основном мне интересно, что должно произойти, если видеочип читается из области памяти, в то время как ЦП все еще записывает данные в середине этой фазы инструкции и в других подобных ситуациях. Надеюсь, я прояснил ситуацию, спасибо.

+1

Я понимаю, что вы пытаетесь сделать, но я не знаю, каков ваш фактический вопрос. Создание действительно цикличного точного симулятора для любого физического ядра почти невозможно (есть слишком много переменных), поэтому реальный вопрос в том, каковы ваши цели? Насколько точны вы хотите быть? Если вы довольны 20%, то вы можете сделать это с помощью простой модели трубопровода и простой модели памяти. –

+0

Я думаю о тех же линиях, что и точность BSNES, так как мое ядро ​​68k в конечном итоге перейдет в эмулятор Megadrive/Genesis. В принципе, мне интересно, как точно моделировать многозадачные инструкции на уровне каждого цикла - на данный момент я просто выполняю всю инструкцию сразу в своем ядре Z80, а затем возвращаю количество циклов, которые он должен принимать на счетчик , Внутри инструкции нет смысла «что происходит и когда». – PhilPotter1987

ответ

1

Для правильной цикличной эмуляции вы должны сначала определиться с главными часами, которые вы хотите использовать в качестве ссылки. Это должны быть самые быстрые часы, при которых степень детализации программного обеспечения может обнаруживать различия в порядке появления. Это может быть по тактовой частоте процессора, но в большинстве случаев время цикла шины решает, какие события детализации могут быть различимы (и это часто является лишь частью процессорных часов).

Затем вам нужно узнать порядок предварительного контроля, который имеют различные устройства (IC), подключенные к этой шине (если имеется более одного ведущего устройства шины). Примером может быть, если (и как) видео DMA может задержать процессор.

Существует, как правило, в то же время событий. Либо CPU записывает до чтения DMA, либо наоборот (это все еще верно в случае устройств с двумя портами, вам просто нужно рассмотреть механизм встроенного предварительного механизма устройства).

Как только у вас есть четкое понимание того, какие часы эффективно контролируют зернистость различимых событий, вы можете подумать о том, как структурировать эмулятор, чтобы точно воспроизвести это поведение.

Таким образом, вы можете создать точную эмуляцию на 100%, учитывая, что у вас достаточно информации обо всех поведении устройств.

Извините, я не могу дать вам более подробную информацию, я ничего не знаю о специфике оборудования Sega.

1

Моя догадка заключается в том, что вам не нужно вдаваться в мучительную деталь, чтобы получить достаточно хорошие результаты для сроков такого рода вещей. Что вы не можете сделать в любом случае, вы не хотите вникать в специфику архитектуры.

Ваш главный вопрос, казалось, был «то, что должно произойти, если видеочип читает из области памяти, пока центральный процессор все еще записывает данные». Как правило, на этих старых чипах протоколы шины довольно просты (они не пакетируются), и обычно имеется вывод, который указывает, что шина занята. Поэтому, если процессор записывает в память, видеочип будет просто ждать, пока процессор не будет выполнен. Из-за такого рода ограничений, двойной порционированный RAM был популярен некоторое время, так что буфер кадра может быть одновременно записан процессором и считываться RAMDAC.