У меня эмулятор Atari 2600 с открытым исходным кодом (Z26), и я хотел бы добавить поддержку картриджей, содержащих встроенный процессор ARM (семейство NXP 21xx).Идея состояла бы в том, чтобы моделировать 6507, пока он не попытается прочитать или записать байт памяти (что он будет делать каждые 841 нс).Если 6507 выполняет запись, поместите адрес и данные на некоторые из портов ввода-вывода ARM и дайте коду ARM выполнить 20 циклов, убедитесь, что ARM перемещает свою шину данных, и дайте ARM работать еще 38 циклов.Если 6507 выполняет чтение, поместите адрес на порты ввода-вывода ARM, дайте ARM выполнить 38 циклов, извлеките данные из порта ввода-вывода ARM (надеюсь, программное обеспечение ARM поместит их туда), и дайтеARM выполняет еще 20 циклов.
ARM7 кажется довольно простым в реализации;Мне не нужно моделировать множество аппаратных функций.Есть мысли?
Редактировать Я имею в виду подпрограмму, которая будет принимать в качестве параметра структуру, содержащую состояние машины и указатели на подпрограмму доступа к памяти.При вызове подпрограмма будет эмулировать механизм команд ARM, генерируя соответствующие операции чтения, записи и выборки кода.Затем я мог бы написать процедуру доступа к памяти, чтобы рассматривать соответствующие области как флэш-память (с приблизительно аппроксимированными состояниями ожидания), ОЗУ, порты ввода-вывода и регистры таймера.Некоторые другие области будут помечены как неосторожные, а доступ к любым другим областям будет отмечать ошибку и останавливать эмулятор.
Возможно, QEMU использует такую вещь внутренне.Поскольку эмуляция ARM будет интегрирована в уже существующий механизм эмуляции (который я не писал и не до конца понимаю - единственными частями исправленного мною Z26 была логика чтения / записи памяти), мне понадобитсячто-то с довольно маленькой занимаемой площадью.
Есть идеи, как работает QEMU внутри?Любая идея, что потребуется для лицензии GPL, если я просто использую 2% кода в QEMU - придется ли мне связывать код целиком, или только часть, которую я использую, или что?