Some notes about Naomi protected ROM-board

 Несколько слов о защитной схеме картриджей аркадной системы Naomi1/Naomi2.

 Схема защиты является надстройкой над стандартным режимом чтения данных ROM-платы
 управляется через одни и те же системные регистры: 0x5f7000, 0x5f7004, 0x5f7008 для
 PIO режима и 0x5f700с, 0x5f7010 для DMA режима.
 Непосредственно схема защиты осуществляет расшифрование предварительно зашифрованных
 секретных данных с заданным ключом и, возможно, зашитым внутри уникальным ключом.
 Частично ключ передается через специальный внутренний регистр схемы защиты, частично
 вместе с зашифрованными данным. Последнее слово зашифрованных данных также представляет
 собой служебное значение, предположительно признак конца зашифрованных данных.
 Также схема защиты может осуществлять перестановку битов заданного смещения, для
 получения нового значащего адреса начала данных в ROM-плате.

 Выбор между управлением функциями ROM-платы и схемы защиты осуществляется путем установки
 специальных флагов регистра 0x5f7000.

 NAOMI_ROM_OFFSETH		                          Адрес регистра: 0x5f7000
 NAOMI_DMA_OFFSETH		                          Адрес регистра: 0x5f700c
 +----+----+----+-----+----------------------------------------------------------+
 | 15 | 14 | 13 |  12 |                       bit11-0                            |
 +---------+----+-----+----------------------------------------------------------+
 | AA | SE | SC | res |              ROM board offset hi bits                    |
 +---------+----+-----+----------------------------------------------------------+

  Используется для установки старшей части смещения данных ROM-платы для чтения в
  PIO режиме или старшей части адреса внутреннего регистра схемы защиты в зависимости
  от установленных флагов:
 
        +-----+----------------------------------------------------+ 
        |Flags| Description                                        |
        +-----+----------------------------------------------------+ 
	| AA  | Автоинкремент смещения при операциях чтения или    |
        |     | записи на ROM-плате.                               |
        +-----+----------------------------------------------------+
	| SE  | Выбор адресного пространства схемы защиты          |
        +-----+----------------------------------------------------+
	| SC  | Режим перемешивания битов, если установлен, адреса |
        |     | работают в нормальном режиме. Если очищен, любое   |
        |     | смещение при доступе к данным подвергается         |
        |     | перестановке битов.                                |
        +-----+----------------------------------------------------+


 NAOMI_ROM_OFFSETL		                          Адрес регистра: 0x5f7004
 NAOMI_DMA_OFFSETL		                          Адрес регистра: 0x5f7010
 +-------------------------------------------------------------------------------+
 |                                  bit15-0                                      |
 +-------------------------------------------------------------------------------+
 |                        ROM board offset low word                              |
 +-------------------------------------------------------------------------------+

  Используется для установки младшей части смещения данных ROM-платы для чтения в
  PIO режиме или младшей части адреса внутреннего регистра схемы защиты в зависимости
  от установленных флагов. Как правило устанавливается первым.
                 

 NAOMI_ROM_DATA			                          Адрес регистра: 0x5f7008
 +-------------------------------------------------------------------------------+
 |                                  bit15-0                                      |
 +-------------------------------------------------------------------------------+
 |                                 Data word                                     |
 +-------------------------------------------------------------------------------+

  В зависимости от вышеперечисленных флагов используется как для получения данных по
  заданному смещению в ROM-плате, так и для передачи данных во внутренние регистры и
  буфер схемы защиты, а также чтения данных из этого буфера.
 
 Схема может работать в двух различных режимах:

 - Непосредственное чтение данных ROMа через схему защиты с осуществлением
   декодирования на лету. В данном режиме схеме защиты доступны только первые 16
   мегабайт пространства ROM-платы, содержащие программный код. Вне этого объема
   непосредственное чтение невозможно. Используется достаточно редко (Dead or
   Alive 2, Dead or Alive 2 Millenium, Guilty Gear X).
 
 - Передача во внутренний буфер схемы защиты объемом 64 килобайта набора данных для
   расшифрования с последующим считыванием в расшифрованном виде. Так как
   используется внутренний буфер, место хранения зашифрованных данных не имеет
   значения. Блок может считываться из ROM-платы обычным способом в промежуточный
   буфер, а потом передаваться на схему защиты. Наиболее распространенная схема.

 В обоих режимах используется один и тот же алгоритм шифрования и структура подаваемых
 и считываемых данных.
 
 Схема шифрования имеет несколько внутренних регистров, доступ к которым осуществляется
 путем установки специальных смещений в регистры NAOMI_ROM_OFFSETH и NAOMI_ROM_OFFSETL.
 Все внутренние регистры также являются 16-битными, присвоение значения которым
 осуществляется путем записи данных в регистр NAOMI_ROM_DATA после выбора соответствующего
 смещения.
 
 Далее следует описание внутренних регистров схемы защиты.

 PROT_ROM_OFFSETL		                                Offset: 0x4001fff8
 +-------------------------------------------------------------------------------+
 |                                  bit15-0                                      |
 +-------------------------------------------------------------------------------+
 |                      Prot ROM board word offset low word                      |
 +-------------------------------------------------------------------------------+
 
 PROT_ROM_OFFSETH		                                Offset: 0x4001fffa
 +-------------------------------------------------------------------------------+
 |                                  bit15-0                                      |
 +-------------------------------------------------------------------------------+
 |                      Prot ROM board word offset hi word                       |
 +-------------------------------------------------------------------------------+

  В режиме прямого расшифрования получают смещение зашифрованных данных в ROM-плате,
  заданное индексом первого 16-битного слова, другими словами - это значение смещения
  данных в ROM-плате в байтах, сдвинутое на 1 бит вправо.
  
  В режиме расшифрования данных через внутренний буфер схемы защиты (максимальный
  размер данных - 64 килобайта), в эти регистры записывается специальное смещение,
  переключающее ROM-плату на чтение из внутреннего буфера: 0х01000000.
  
 PROT_ROM_KEY		                                        Offset: 0x4001fffc
 +-------------------------------------------------------------------------------+
 |                                  bit15-0                                      |
 +-------------------------------------------------------------------------------+
 |                                Key data bits                                  |
 +-------------------------------------------------------------------------------+

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

 PROT_ROM_DATA		                                        Offset: 0x4001fffe
 +-------------------------------------------------------------------------------+
 |                                  bit15-0                                      |
 +-------------------------------------------------------------------------------+
 |                            Unprotected data word                              |
 +-------------------------------------------------------------------------------+

  Установка данного смещения переключает схему шифрования в режим расшифрования
  и чтения открытых данных. Считывание данных производится путем чтения из регистра
  NAOMI_ROM_DATA, формат выходных данных - big-endian.

 PROT_ROM_DATA		                                        Offset: 0xс2020000
 +-------------------------------------------------------------------------------+
 |                                  bit15-0                                      |
 +-------------------------------------------------------------------------------+
 |                             Protected data word                               |
 +-------------------------------------------------------------------------------+

  Установка данного смещения переключает схему шифрования в режим записи зашифрованных
  данных во внутренний буфер схемы защиты. Данные записываются последовательно через
  порт NAOMI_ROM_DATA ROM-платы, указатель данных фнутреннего буфера увеличивается
  после каждой записи.


 Примеры различных вариантов схемы декодирования

 
 Раскодирование данных через внутренний буфер:
 
 Write: 0x005f7004, 0x0000	; младшее слово специального смещения внутреннего
                                ; буфера на запись (0хс2020000)
 Write: 0x005f7000, 0xc202	; старшее слово специального смещения внутреннего
                                ; буфера на запись (0хс2020000)
                                ; выбран внутренний буфер для записи данных
 Write: 0x005f7008, 0xKKKK	; первое 16-битное слово являются служебным
				; возможно вторая часть 32-битного ключа
 Write: 0x005f7008, 0xNNNN	; запись N слов зашифрованных данных, внутренний
 	.			; указатель буфера увеличивается автоматически
 	.			; после каждой записи
 Write: 0x005f7008, 0xKKKK	; последнее слово зашифрованных данных, таким образом
				; размер передаваемых данных равен N+2 слов
 
 Write: 0x005f7004, 0xfff8	; младшее слово специального смещения внутреннего
                                ; регистра PROT_ROM_OFFSETL
 Write: 0x005f7000, 0x4001	; старшее слово специального смещения внутреннего
                                ; регистра PROT_ROM_OFFSETL
 Write: 0x005f7008, 0x0000	; младшее слово специального смещения внутреннего
                                ; буфера на чтение (0х01000000)
 Write: 0x005f7004, 0xfffa      ; младшее слово специального смещения внутреннего
                                ; регистра PROT_ROM_OFFSETH
 Write: 0x005f7000, 0x4001	; старшее слово специального смещения внутреннего
                                ; регистра PROT_ROM_OFFSETH
 Write: 0x005f7008, 0x0100	; старшее слово специального смещения внутреннего
                                ; буфера на чтение (0х01000000)
 Write: 0x005f7004, 0xfffc	; младшее слово специального смещения внутреннего
 				; регистра PROT_ROM_KEY
 Write: 0x005f7000, 0x4001	; младшее слово специального смещения внутреннего
 				; регистра PROT_ROM_KEY
 Write: 0x005f7008, 0xKKKK	; ключ расшифрования
 Write: 0x005f7004, 0xfffe	; младшее слово специального смещения внутреннего
 				; регистра PROT_ROM_DATA
 Write: 0x005f7000, 0x4001	; старшее слово специального смещения внутреннего
 				; регистра PROT_ROM_DATA
 				; схема защиты в режиме раскодирования
 Read:  0x005f7008, 0xNNNN	; последовательное чтение N слов расшифрованных данных,
  	.			; внутренний указатель буфера увеличивается автоматически
   	.			; после каждого чтения
  				
 Раскодирование данных непосредственно из ROM-платы:
 
 
 Write: 0x005f7004, 0xfff8	; младшее слово специального смещения внутреннего
                                ; регистра PROT_ROM_OFFSETL
 Write: 0x005f7000, 0x4001	; старшее слово специального смещения внутреннего
                                ; регистра PROT_ROM_OFFSETL
 Write: 0x005f7008, 0xLLLL	; младшее слово смещения данных в ROMе
  				; сдвинутого на один бит вправо
 Write: 0x005f7004, 0xfffa      ; младшее слово специального смещения внутреннего
                                ; регистра PROT_ROM_OFFSETH
 Write: 0x005f7000, 0x4001	; старшее слово специального смещения внутреннего
                                ; регистра PROT_ROM_OFFSETH
 Write: 0x005f7008, 0xHHHH	; старшее слово смещения данных в ROMе
  				; сдвинутого на один бит вправо
 Write: 0x005f7004, 0xfffc	; младшее слово специального смещения внутреннего
 				; регистра PROT_ROM_KEY
 Write: 0x005f7000, 0x4001	; старшее слово специального смещения внутреннего
 				; регистра PROT_ROM_KEY
 Write: 0x005f7008, 0xKKKK	; ключ расшифрования
 Write: 0x005f7004, 0xfffe	; младшее слово специального смещения внутреннего
 				; регистра PROT_ROM_DATA
 Write: 0x005f7000, 0x4001	; старшее слово специального смещения внутреннего
 				; регистра PROT_ROM_DATA
 				; схема защиты в режиме раскодирования
 Read:  0x005f7008, 0xNNNN	; последовательное чтение N слов расшифрованных данных,
  	.			; внутренний указатель буфера увеличивается автоматически
  	.			; после каждого чтения
Advertisements

2 Comments

  1. ajax16384
    Posted 07/26/2009 at 23:27 | Permalink

    Будем надеятся, что твои труды не пропадут даром.

  2. cah4e3
    Posted 07/27/2009 at 00:16 | Permalink

    гага… они уже не пропали, потому что работают в демуле лол…

Прокомментировать

Required fields are marked *

*
*

%d такие блоггеры, как: