Автор Тема: Запуск и инициализация в эмуляторе Nintendo 64  (Прочитано 7277 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
Пытаюсь эмулировать N64. Застрял на одном месте - инициализация. Как делаю: бут-код картриджа(4032байта) копирую в SP_DMEM и начинаю оттуда выполнять, через несколько успешных команд появляется LW, результатом которой становится TLB refill exception тк процессор только запущен и TLB пустые. Копал mupen64, смотрю в доке по r4300 и r4000... непонятно. Подскажите как верно запускать код на N64 тс от включения питания - стартовый PC, значения регистров, есть ли нет стартовый загрузчик на самой приставке и тп

Оффлайн angrylion

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
есть ли нет стартовый загрузчик на самой приставке

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

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
спасибо, пробую.

Цитата
R4400
да, это одна из двух книг, которыми пользуюсь.

Оффлайн angrylion

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
Ты планируешь поддерживать систему плагинов по Zilmar's spec или будешь писать собственную эмуляцию RSP и RDP?

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
планирую делать без видео плагинов тк ориентируюсь только на OpenGL, но это не окончательный вердикт - время покажет. А вот звук и ввод скорей всего надо делать с плагинами. Но первую реализацию RSP, RDP все равно буду сам писать.

ЗЫ. сейчас еще поищу, что из себя представляет эта система плагинов.
ЗЗЫ. пишу на D - помимо эмуляции еще и новый язык приходится изучать.

Оффлайн angrylion

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
Но первую реализацию RSP, RDP все равно буду сам писать.

Успехов. Сам работал немного над реализацией RDP. А у тебя будет HLE или LLE?

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
Цитата
А у тебя будет HLE или LLE?
RDP будет HLE... RSP наверное будет дитем компромиссов. В любом случае буду стараться все возможные вычисления отдать OpenGL.

Спасибки.

Добавлено позже:
посмотрел pifrom - команд TLBx не обнаружил. получается если я получил исключение то иду по адресу 0x800... или 0xbfc0..., но что там за код находится, если кроме бута картриджа ничего еще не отображено в память... чтото я упустил

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
смотрел исходники MAME... создается по умолчанию два элемента в TLB. пробую копировать 1-й мегабайт
картриджа(0x001000 - 0x101000) в RDRAM начиная с адреса 0x200000, потом прыгаю туда. и все равно находятся интересные такие адреса которые дают TLB refill исключение.

Оффлайн angrylion

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
смотрел исходники MAME... создается по умолчанию два элемента в TLB

Не могу найти... Не ткнёшь ли носом в это место в исходниках?

Жалко в дебаггере MESS не посмотришь элементы tlb (по крайней мере, я не знаю, как)...

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
/* 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

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
Разве это не (мелкий) хак в 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 исключение?
« Последнее редактирование: 18 Май 2009, 13:37:44 от angrylion »

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
Цитата
Во-вторых, в 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

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
вот собственно у меня и встала с этим проблема - хотелось все сделать без хаков.
Однако ж, 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)?
« Последнее редактирование: 18 Май 2009, 14:29:04 от angrylion »

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
Цитата
А первоначальный DMA transfer и передачу управления на код не pifrom осуществляет
честно, по этой части не глянул. просто просмотрел не инициализирует ли он TLB. Сегодня разберу его подробней.

Цитата
When ERL = 1 in the Status register
хм. у меня со старта Kernel mode с чистыми ERL и BEV, и получается, что первые 2Гб мапятся через TLB.

Цитата
Однако ж, HLE один сплошной хак, по-моему.
согласен, но всеже интересно почему так, а не по другому, разобраться хочется.

Добавлено позже:
Цитата
N64 Programming manual
опаньки, а как это я мимо него пролетел - листаю

Оффлайн angrylion

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
Цитата
согласен, но всеже интересно почему так, а не по другому, разобраться хочется.
Хм, поясни. Хочется разобраться, почему большинство эмуляторов используют HLE? Потому что быстрей на порядок.

Цитата
у меня со старта Kernel mode с чистыми ERL и BEV

В MAME/MESS ERL=1 на старте (SR=0x00400004)
И в доках написано, что он 1 после ресета
Почему тогда 0 на старте?
« Последнее редактирование: 18 Май 2009, 15:14:26 от angrylion »

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
Цитата
Хочется разобраться, почему большинство эмуляторов используют HLE?
не, это я понимаю. параллельно с реализацией HLE хочется разобраться как на самом деле работает консоль.

Цитата
Почему тогда 0 на старте?
очевидно, что я ошибся.

Оффлайн angrylion

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
Вот тут кое-какие доки перечислены насчёт того как всё на самом деле :)

http://forum.emu-russia.net/viewtopic.php?f=13&t=83#p4846

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
ОФФ:
я сейчас немного на работе, а вечером все обсуждение изолью в код

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
dextrose.com всем поможет - там и демки и коды и сорсы и доки - все есть ;)

собственно сам тоже хочу для N64 код писать ^_^

Вроде там типа OpenGL используется поэтому вроде несложно все это дело

а так вообще интересен вопрос - можно ли портировать игры с DS на N64
ну без тач скрина разумеется, но векторную графику

В частности кстати интересует эмуляция редких кансолей на N64, собственно она есть, но ограниченная
Пример - эмулятор MSX от Марата Файзулина, сам он правда отказался это делать
« Последнее редактирование: 18 Май 2009, 17:39:08 от sergi »

Оффлайн angrylion

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
Никакой OpenGL там не используется

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Ну я точно не знаю т.к. не вникал, но чтото похожее на OpenGL точно т.к. об этом читал гдето :-\

Оффлайн Yaranga

  • Администратор
  • Сообщений: 13672
  • Пол: Мужской
    • Просмотр профиля
Ну я точно не знаю т.к. не вникал, но чтото похожее на OpenGL точно т.к. об этом читал гдето :-\
Скорей что-то очень похожее на Glide. :)

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
выполнил код стартового загрузчика нинтендо - действительно инитит железо(то, которое есть)) ) и копирует загрузочный код картриджа в DMEM и потом оттуда выполняет. отлично, идем дальше.

Оффлайн angrylion

  • Пользователь
  • Сообщений: 141
  • Пол: Мужской
    • Просмотр профиля
Обычно после этого пытаются запустить Fire Demo by Lac (PD) как самую простую программу.

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
ага, буду держать на примете. в настоящий момент пробую запустить (по совету sergi) Metal_Gear_MSX_(U).zip

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
скидай тогда если не сложно типа Hallo world

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

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
до такого уровня реализации еще не дошел. покачто память, основной проц и минимальный набор всяких спецрегистров(в основном это хаки(пока что)). реализую по принципу выскочило исключение на доступ к несуществующей памяти/периферии/etc - делаем.

Оффлайн smalcom

  • Пользователь
  • Сообщений: 14
    • Просмотр профиля
долго вожусь с Firedemo - просто в стенку уперся и все. Происходит установка видеорежима, потом оно входит в какойто цикл и все - на экране пусто. Смотрел как TrueReality ее играет - после установки видеорежима чтото происходит, а потом когда отрисовывается все то еще и начало фреймбуфера меняется, те все работает.

может там секрет какой есть известный(я уже трассы выполнения просматриваю - с ума сойти можно) или исходники Firedemo?
PS. думаю еще одну демку поковырять, которая с исходниками, но это наверно не совсем верный выход

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
когда зацикливается код, значит ждет аппаратное прерывание

ну допустим обновление кадра

т.е. цикл идет по кругу, потом ее прям берут и тычут в другое место - вот нужно место найти это
попробуй другие демки, честно говоря демки к сожалению не работают на реальном железе почемуто - возьми того же Mario 64 или Charly Blast - у них правильно все сделано

в сущности чтобы код писать тебе нужно не столько разобратся в инициализации сколько найти выход на код чтобы его уже исполнять без проблем ;)