Разработка и ромхакинг > Ромхакинг
Запуск и инициализация в эмуляторе Nintendo 64
smalcom:
Пытаюсь эмулировать N64. Застрял на одном месте - инициализация. Как делаю: бут-код картриджа(4032байта) копирую в SP_DMEM и начинаю оттуда выполнять, через несколько успешных команд появляется LW, результатом которой становится TLB refill exception тк процессор только запущен и TLB пустые. Копал mupen64, смотрю в доке по r4300 и r4000... непонятно. Подскажите как верно запускать код на N64 тс от включения питания - стартовый PC, значения регистров, есть ли нет стартовый загрузчик на самой приставке и тп
angrylion:
--- Цитата: smalcom от 15 Мая 2009, 19:29:13 ---есть ли нет стартовый загрузчик на самой приставке
--- Конец цитаты ---
Pifrom он называется. Вот NTSC-U версия:
http://www.crazynation.org/N64/files/pifdata.bin
Стартовый PC - 0xBFC00000. Советую почитать исходники MAME/MESS. И вот это (впрочем это ты, может быть, читал):
http://www.yntproject.net/docs/R4400_Uman_book_Ed2.pdf
smalcom:
спасибо, пробую.
--- Цитировать ---R4400
--- Конец цитаты ---
да, это одна из двух книг, которыми пользуюсь.
angrylion:
Ты планируешь поддерживать систему плагинов по Zilmar's spec или будешь писать собственную эмуляцию RSP и RDP?
smalcom:
планирую делать без видео плагинов тк ориентируюсь только на OpenGL, но это не окончательный вердикт - время покажет. А вот звук и ввод скорей всего надо делать с плагинами. Но первую реализацию RSP, RDP все равно буду сам писать.
ЗЫ. сейчас еще поищу, что из себя представляет эта система плагинов.
ЗЗЫ. пишу на D - помимо эмуляции еще и новый язык приходится изучать.
angrylion:
--- Цитата: smalcom от 16 Мая 2009, 01:24:15 ---Но первую реализацию RSP, RDP все равно буду сам писать.
--- Конец цитаты ---
Успехов. Сам работал немного над реализацией RDP. А у тебя будет HLE или LLE?
smalcom:
--- Цитировать ---А у тебя будет HLE или LLE?
--- Конец цитаты ---
RDP будет HLE... RSP наверное будет дитем компромиссов. В любом случае буду стараться все возможные вычисления отдать OpenGL.
Спасибки.
Добавлено позже:
посмотрел pifrom - команд TLBx не обнаружил. получается если я получил исключение то иду по адресу 0x800... или 0xbfc0..., но что там за код находится, если кроме бута картриджа ничего еще не отображено в память... чтото я упустил
smalcom:
смотрел исходники MAME... создается по умолчанию два элемента в TLB. пробую копировать 1-й мегабайт
картриджа(0x001000 - 0x101000) в RDRAM начиная с адреса 0x200000, потом прыгаю туда. и все равно находятся интересные такие адреса которые дают TLB refill исключение.
angrylion:
--- Цитата: smalcom от 18 Мая 2009, 02:09:08 ---смотрел исходники MAME... создается по умолчанию два элемента в TLB
--- Конец цитаты ---
Не могу найти... Не ткнёшь ли носом в это место в исходниках?
Жалко в дебаггере MESS не посмотришь элементы tlb (по крайней мере, я не знаю, как)...
smalcom:
--- Код: --- /* load the fixed TLB range */
vtlb_load(mips->vtlb, 2 * MIPS3_TLB_ENTRIES + 0, (0xa0000000 - 0x80000000) >> MIPS3_MIN_PAGE_SHIFT, 0x80000000, 0x00000000 | VTLB_READ_ALLOWED | VTLB_WRITE_ALLOWED | VTLB_FETCH_ALLOWED | VTLB_FLAG_VALID);
vtlb_load(mips->vtlb, 2 * MIPS3_TLB_ENTRIES + 1, (0xc0000000 - 0xa0000000) >> MIPS3_MIN_PAGE_SHIFT, 0xa0000000, 0x00000000 | VTLB_READ_ALLOWED | VTLB_WRITE_ALLOWED | VTLB_FETCH_ALLOWED | VTLB_FLAG_VALID);
--- Конец кода ---
вотб mips3com.c:160.
angrylion:
Разве это не (мелкий) хак в MAME?
Во-первых, не нашёл нигде сведений про preset tlb entries.
Во-вторых, в r4300 32 элемента, а не 48.
В-третьих,
There are virtual-to-physical address translations that occur outside of the TLB. For
example, addresses in the kseg0 and kseg1 spaces are unmapped translations. In these
spaces the physical address is derived by subtracting the base address of the space from
the virtual address.
С каким виртуальным адресом у тебя происходит tlb refill исключение?
smalcom:
--- Цитировать ---Во-вторых, в r4300 32 элемента, а не 48
--- Конец цитаты ---
ага, 48 в R3000, а нековский 4300i который в нинтендо порезан.
--- Цитировать ---Разве это не (мелкий) хак в MAME?
Во-первых, не нашёл нигде сведений про preset tlb entries.
--- Конец цитаты ---
вот-вот. и я смотрю исходники эмулей и наблюдаю что для запуска всех ромов используются мелкие и нет хаки. вот собственно у меня и встала с этим проблема - хотелось все сделать без хаков.
--- Цитировать ---В-третьих,
--- Конец цитаты ---
да-да, часть режимами проца я реализовал и адреса конвертяца верно. сам TLB я упростил - без even,odd(в том же mupen можно наблюдать старый код с правильной работой железа TLB и более поздний оптимизированый алгоритм в котором выборка из TLB происходит следующим образом pfn = tlb[VPN], если pfn != 0, то страница верная)
--- Цитировать ---С каким виртуальным адресом у тебя происходит tlb refill исключение?
--- Конец цитаты ---
обычно когда в 0 обращается - RDRAM. я вот подумываю, а не добавить ли еще одну страницу в TLB... но это теоретически не верно. Раз оно лезет к 0 значит там чтото должно быть.
Возможно я просто неверно точку входа выбираю, тк один из ромов обратился 0xA46... : видимо пошел запрос к ДМА на копировани части картриджа в RDRAM. Хочу еще mupen пересобрать в VS6(потому что в студии хотябы дебагер нормальный есть)
angrylion:
--- Цитата: smalcom от 18 Мая 2009, 13:57:55 ---вот собственно у меня и встала с этим проблема - хотелось все сделать без хаков.
--- Конец цитаты ---
Однако ж, HLE один сплошной хак, по-моему.
--- Цитировать ---обычно когда в 0 обращается - RDRAM. я вот подумываю, а не добавить ли еще одну страницу в TLB... но это теоретически не верно.
--- Конец цитаты ---
Извини, если туплю, но что насчёт этого:
When ERL = 1 in the Status register, the user address region becomes a
2^31-byte unmapped (that is, mapped directly to physical addresses)
uncached address space. <...> The contents of this register are undefined after a reset,
except for TS, which is zero; ERL and BEV, which are one...
--- Цитировать ---Возможно я просто неверно точку входа выбираю, тк один из ромов обратился 0xA46... : видимо пошел запрос к ДМА на копировани части картриджа в RDRAM.
--- Конец цитаты ---
А первоначальный DMA transfer и передачу управления на код не pifrom осуществляет (согласно п. 6.10 N64 Programming manual)?
smalcom:
--- Цитировать ---А первоначальный DMA transfer и передачу управления на код не pifrom осуществляет
--- Конец цитаты ---
честно, по этой части не глянул. просто просмотрел не инициализирует ли он TLB. Сегодня разберу его подробней.
--- Цитировать ---When ERL = 1 in the Status register
--- Конец цитаты ---
хм. у меня со старта Kernel mode с чистыми ERL и BEV, и получается, что первые 2Гб мапятся через TLB.
--- Цитировать ---Однако ж, HLE один сплошной хак, по-моему.
--- Конец цитаты ---
согласен, но всеже интересно почему так, а не по другому, разобраться хочется.
Добавлено позже:
--- Цитировать ---N64 Programming manual
--- Конец цитаты ---
опаньки, а как это я мимо него пролетел - листаю
angrylion:
--- Цитировать ---согласен, но всеже интересно почему так, а не по другому, разобраться хочется.
--- Конец цитаты ---
Хм, поясни. Хочется разобраться, почему большинство эмуляторов используют HLE? Потому что быстрей на порядок.
--- Цитировать ---у меня со старта Kernel mode с чистыми ERL и BEV
--- Конец цитаты ---
В MAME/MESS ERL=1 на старте (SR=0x00400004)
И в доках написано, что он 1 после ресета
Почему тогда 0 на старте?
smalcom:
--- Цитировать ---Хочется разобраться, почему большинство эмуляторов используют HLE?
--- Конец цитаты ---
не, это я понимаю. параллельно с реализацией HLE хочется разобраться как на самом деле работает консоль.
--- Цитировать ---Почему тогда 0 на старте?
--- Конец цитаты ---
очевидно, что я ошибся.
angrylion:
Вот тут кое-какие доки перечислены насчёт того как всё на самом деле :)
http://forum.emu-russia.net/viewtopic.php?f=13&t=83#p4846
smalcom:
ОФФ:
я сейчас немного на работе, а вечером все обсуждение изолью в код
sergi:
dextrose.com всем поможет - там и демки и коды и сорсы и доки - все есть ;)
собственно сам тоже хочу для N64 код писать ^_^
Вроде там типа OpenGL используется поэтому вроде несложно все это дело
а так вообще интересен вопрос - можно ли портировать игры с DS на N64
ну без тач скрина разумеется, но векторную графику
В частности кстати интересует эмуляция редких кансолей на N64, собственно она есть, но ограниченная
Пример - эмулятор MSX от Марата Файзулина, сам он правда отказался это делать
angrylion:
Никакой OpenGL там не используется
Навигация
Перейти к полной версии