Несколько слов о защитной схеме картриджей аркадной системы 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 слов расшифрованных данных,
. ; внутренний указатель буфера увеличивается автоматически
. ; после каждого чтения
Понравилось это:
Нравится Загрузка...
2 Comments
Будем надеятся, что твои труды не пропадут даром.
гага… они уже не пропали, потому что работают в демуле лол…