2000-01-04
�@���ւ̗��j��U�肩�������ł������s���őO�҂݂̂ɂȂ��Ă��܂��܂����B
���Ƃ������ق�B
���[�ƝA���ݎ嗬�� modchip�A�ؓ� mayumi ��̃��c���Ȃ�ŝЉ�Ȃ��̝H
���ă��[�����ꂽ�������܂������A���{�l�ɝr�炳�ꂽ�爫�����Ǝv����
�����N���ĂȂ���ł��B���ē��{��ŝ����Ă��ǂ߂܂����˝B
modchip �Ɋւ��Ă͑������ɝo���邱�Ƃ͂����Ȃ���ł͂Ȃ����Ǝv���܂��B
�Ă������O����o���ĂȂ���ł����ǝB
���W�A�i�����ĂȂ��Ǝ肪�o���Ȃ��̈�܂ŗ����Ⴂ�܂�������˝B
���Amodisasm �ł����o�O���P���o�Ă܂��B�Ђ����ɒ����Ă����܂��B
XPS �ŝG�ꂽ EDC/ECC �v�Z�����ł����AC �� ASM �ɒ��������̂��܂� C
�ɖ߂��Ă݂܂����B���͂���ς藝���ł��܂���i���j�B
�N������ŗǂ��c�[�������Ă��������܂��B
�ix86 �킩��Ȃ��̂ŝh�������ł��B�j
#ifndef _CDROMXAmode1_EDC_ECC_H_
#define _CDROMXAmode1_EDC_ECC_H_
/*
* EDC/ECC calculator programmed by Hanimar.
* This is what XPS patcher does, and I converted it into C.
* Therefore, I don't really know what it does=(
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*
* Calculates EDC.
* Usage:
* ISO-9660 Mode 1: CalcEDC(�or[0], 2064)
* CDROM-XA format 1: CalcEDC(�or[16], 2056)
*/
unsigned long CalcEDC(const unsigned char *from, int size);
/*
* Stores EDC into a sector image.
* This function copies edc to from in Little-Endian.
* Usage:
* ISO-9660 Mode 1: StoreEDC(�or[2064], edc)
* CDROM-XA format 1: StoreEDC(�or[2072], edc)
*/
void StoreEDC(unsigned char *from, unsigned long edc);
/*
* Calculates ECC (for CDROM XA form 1)
*/
void XaCalcECC(unsigned char *sector);
/* void ISO9660mode1CalcECC(const unsigned char *sector); */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _CDROMXAmode1_EDC_ECC_H_ */
#include "edcecc.h"
#define Multiply(a, b) do { \
int i, carry; \
b ^= a; \
for (i = 8 ; i > 0 ; i --) { \
carry = (b) & 1; b >>= 1; \
if (carry) b ^= 0xd8018001; \
} \
} while (0)
/*
* EDC �v�Z
*/
unsigned long CalcEDC(const unsigned char *from, int size)
{
int i;
unsigned long a, b = 0;
for (i = 0 ; i < size ; i ++) {
a = (unsigned long)from[i];
Multiply(a, b);
}
return b;
}
void StoreEDC(unsigned char *from, unsigned long edc)
{
from[0] = (unsigned char)(edc >> 0) & 0xff;
from[1] = (unsigned char)(edc >> 8) & 0xff;
from[2] = (unsigned char)(edc >> 16) & 0xff;
from[3] = (unsigned char)(edc >> 24) & 0xff;
return;
}
static void mkTable4ECC(unsigned char *table);
static void calcPParity(const unsigned char *from, unsigned char *dest,
const unsigned char *table);
static void calcQParity(const unsigned char *from, unsigned char *dest,
const unsigned char *table);
/*
* ECC �v�Z (XA form 1 ��p)
*
* �o�p���e�B
* �w�b�_�S�o�C�g�A�T�u�w�b�_�W�o�C�g�A�f�[�^�A�d�c�b���܂ނQ�O�U�S�o�C�g��
* ���Čv�Z���܂��B�������A�w�b�_�i�Z�N�^�A���[�h�������S�o�C�g�j�̓[����
* ���Čv�Z���܂��B
* 0x81c ���� 0x8c7 �܂ł̂P�V�Q�o�C�g���Z�o���܂��B
*
* �p�p���e�B
* �w�b�_�S�o�C�g�A�T�u�w�b�_�W�o�C�g�A�f�[�^�A�d�c�b�A�o�p���e�B��
* �Q�Q�R�U�o�C�g�ɑ��Čv�Z���܂��B�������A�w�b�_
* �i�Z�N�^�ԝ��������S�o�C�g�j�̓[���Ƃ��Čv�Z���܂��B
* 0x8c8 ����Ō�(0x92f)�܂ł̂P�O�S�o�C�g���Z�o���܂��B
*
* �����F
* sector:
* �Z�N�^�̝擪�ʒu�B�����M�����̝擪
* �v����� 00 FF FF FF FF FF FF FF FF FF FF 00 �ƂȂ��Ă���Ƃ���B
*
*/
void XaCalcECC(unsigned char *sector)
{
unsigned char table[256];
unsigned char tmp[4];
int i;
mkTable4ECC(table);
for (i = 0 ; i < 4 ; i ++) { // �w�b�_������[�N���A
tmp[i] = sector[12 + i]; sector[12 + i] = 0;
}
calcPParity(�or[0x0c], �or[0x81c], table);
calcQParity(�or[0x0c], �or[0x8c8], table);
for (i = 0 ; i < 4 ; i ++) { // �w�b�_����߂�
sector[12 + i] = tmp[i];
}
return;
}
/*
* ������ memmove() �ł��B
*/
#if 0
void StoreECC(unsigned char *sector, unsigned char *ecc)
{
unsigned char *src = �or[0x81c];
int i;
for (i = 0x114; i > 0 ; i --) *ecc ++ = *src ++;
return;
}
#endif
static void mkTable4ECC(unsigned char *table)
{
int i, c;
for (i = 0 ; i < 256 ; i ++) {
c = i << 1;
if (c >> 8) c ^= 0x11d; // if (carry) dl ^= 01dh
table[i ^ c] = i;
}
return;
}
static void calcPParity(const unsigned char *from, unsigned char *dest,
const unsigned char *table)
{
int i, j;
int a, b;
int index;
int c;
for (i = 0 ; i < 86 ; i ++) {
a = b = 0;
for (j = 0 ; j < 24 ; j ++) {
index = ((j * 43 + (i >> 1)) << 1) + (i & 1);
c = from[index];
a ^= c; b ^= c;
if ((a <<= 1) >> 8) a ^= 0x11d;
}
if ((a <<= 1) >> 8) a ^= 0x11d;
a ^= b;
*dest = table[a];
dest[86] = table[a] ^ b;
dest ++;
}
return;
}
static void calcQParity(const unsigned char *from, unsigned char *dest,
const unsigned char *table)
{
int i, j;
int a, b;
int index;
int c;
for (i = 0 ; i < 52 ; i ++) {
a = b = 0;
for (j = 0 ; j < 43 ; j ++) {
index = ((((j * 44) + (i >> 1) * 43) % 1118) << 1) + (i & 1);
c = from[index];
a ^= c; b ^= c;
if ((a <<= 1) >> 8) a ^= 0x11d;
}
if ((a <<= 1) >> 8) a ^= 0x11d;
a ^= b;
*dest = table[a];
dest[52] = table[a] ^ b;
dest ++;
}
return;
}
1f000000-1f01ffff ROM�B�o���N��ւ��ŕς��B 1f020000-1f03ffff ROM�B�o���N��ւ��ŕς��B 1f040000-1f05ffff �Ȃ�� RAM�B�g���邩���B 1f060000-1f06003f I/O�B�Ȍ� 1f07ffff �܂łЂ�����~���[�B�Ȃ��� ROM �� SST 28SF040 �Ă����A�S�l�̃^�C�v�ł����B ���Ȃ݂� PAR/XT �Ȃ� ROM �T�C�Y�̌��������͝A�^�Ԃ̝Ō�� 040 ���Ă����Ƃ���̝����ł킩��݂����ł��B 010 �Ȃ�P�l���Ă������Ƃł��B
| 1f060000 | ��M�p�B�i1f060000 �����g�p�B�j�S�o�C�g���������݂����B�Ȃɂ��q���Ȃ���Ԃł� 01h �ł��B |
| 1f060008 | ���M�p�B�i1f060008 �����g�p�B�j�Ȃɂ��q���Ȃ���Ԃł� ffh �ł��B |
| 1f060010 | �f�[�^��M���͝ʼn��ʃr�b�g�������܂��B���i�� fe �ł��B |
| 1f060018 | �v�b�V���{�^���̝�ԝB�����ĂȂ��� fefefefefefefefe �ŝA������ ffffffffffffffff �ɂȂ�܂��B |
| 1f060020 | ���g�p�Ǝv���Bffffffffffffffff �ł��B |
| 1f060028 | ���g�p�Ǝv���Bffffffffffffffff �ł��B |
| 1f060030 | �o���N��ւ��B1 ������Ǝ��s���̂q�n�l�A�R���ƋN�����̂q�n�l�ɕς��܂��B |
| 1f060038 | �Ȃ낤�H lbu ���Ă�B�r�b�g�O�ƂP�ɈӖ�������݂����Bfcfcfcfcfcfcfcfc �ł����B�o���N����݂��Ǝv���܂��B |
�yPSX Action Replay Version 2.6 (par26frn) NTSC patch�z 1f0041ec: 10 fc 24 ac sw a0,$8005fc10 --------> 10 fc 20 ac sw zero,$8005fc10 �^�C�g���� NTSC �ɂȂ����B 800a5c9c: a0 96 24 ac --------> a0 96 20 ac �ł�����͈��k����Ă�Ƃ���B �Ă��Ƃ� lui v0, $800a li v1, $20ac jr ra sh v1, $5c9e(v0) �� 16byte ���ǂ����ɝ��点��B 68b0 ��intr.c �� RCS ID �̝Ꝋ���g�����B���Ă��� SCE �̃��C�u�����g���Ă��B�ڋ����Ȃ��B 0a80023c ac200324 0800e003 9e5c43a4 jal $800468b0 -> 2c1a010c 80040134 �ɂ�������߂�B 10*4bytes ������ɂ��炵�ĝA���߂� �Ƃ����킯�ŝA 00001134: 10 -> 2c 00001135: 00 -> 1a 00001136: a4 -> 01 00001137: 27 -> 0c 00001138: 18 -> 10 00001139: 80 -> 00 0000113a: 05 -> a4 0000113b: 3c -> 27 0000113c: ca -> 18 0000113d: 0e -> 80 0000113e: 01 -> 05 0000113f: 0c -> 3c 00001140: 00 -> ca 00001141: 20 -> 0e 00001142: a5 -> 01 00001143: 34 -> 0c 00001144: 40 -> 00 00001145: 0e -> 20 00001146: 01 -> a5 00001147: 0c -> 34 00001148: 21 -> 40 00001149: 20 -> 0e 0000114a: 00 -> 01 0000114b: 00 -> 0c 0000114c: 34 -> 21 0000114d: 00 -> 20 0000114e: bf -> 00 0000114f: 8f -> 00 00001150: 38 -> 34 00001152: bd -> bf 00001153: 23 -> 8f 00001154: 09 -> 38 00001155: 80 -> 00 00001156: 08 -> bd 00001157: 3c -> 23 00001158: 08 -> 09 00001159: 00 -> 80 0000115a: 00 -> 08 0000115b: 01 -> 3c 0000115c: 00 -> 08 0000115f: 00 -> 01 000041ee: 24 -> 20 000078b0: 24 -> 0a 000078b1: 49 -> 80 000078b2: 64 -> 02 000078b3: 3a -> 3c 000078b4: 20 -> ac 000078b5: 69 -> 20 000078b6: 6e -> 03 000078b7: 74 -> 24 000078b8: 72 -> 08 000078b9: 2e -> 00 000078ba: 63 -> e0 000078bb: 2c -> 03 000078bc: 76 -> 9e 000078bd: 20 -> 5c 000078be: 31 -> 43 000078bf: 2e -> a4 �����A���Ђ�B hanimar
�yAction Replay Version 2.81 (ar281) NTSC patch�z 1f001800 ���� 1f01ffff �܂ł� 80010000 �ɓ]�������B �܂� 80010f80 c406043c 80010f84 40028434 li a0, $06c40240 (����) 80010f88 0407073c 80010f8c 3080e734 li a3, $07048030 (����) �� li a3, $07040010 �ɂ��܂��B 80010f8c: 1000e734 �ł��B 80011000 09008434 ori a0,a0, $0009 �� $0001 �ɕϝX�B #2800 09->01 ���� 80010000 ����̃R�[�h�ł͌Ă�ĂȂ��悤�����ǝA 800109b0 21308000 mov a2,a0 �� mov a2,zero �ɕϝX�B #21b0 21308000->25300000 �����R�[�h�� 800938c4 �ɂ����ĝA 800938c4 21308000 mov a2,a0�B ���� 80093ea0 �� 80093ea0: 3080e734 or a3, a3, $8030 (li a3,$07048030) ��L�͎g���ĂȂ���������Ȃ��B ����� 80093f14 �� 80093f14: 09008434 ori a0,a0, $0009 ���ꂩ�� View Video Image �ŕ\���� PAL �ɂȂ�̂ŝA 80094d50 21408000 mov t0,a0 �� or t0, zero,zero (25400000) �ɂ�����B ����͓W�J��Ƀp�b�`�����Ă܂��B 80010230 �� 80090000 �ɔ�Ԃ̂ŝA���̑O�B 8001022c �� lui t0,$8009 �Ǝ��� jalr t0 ���S�o�C�g���炵�� 8001022c �Ƀp�b�`�����Ă܂��B jal �ǂ��� lui t0, $8009 jalr t0 �ɂȂ�܂��B t0 �� 80090000 �̝�ԂŔ�Ԃ̂ŗ��p���܂��B ��ѝ�� li v0, $0010 sh v0, $3ea0(t0) nop li v0, $0001 sh v0, $3f14(t0) nop li v0, $3025 sw v0,$38c4(t0) nop li v0, $4025 jr ra sw v0, $4d50(t0) �����Ȃ��ǝA�g�������ɂȂ� syscall �̂Ƃ�����g�킹�ĖႨ���B a0_90 �ɂ��܂��B 8001412c�B �Ă��Ƃ� jal $8001412c -> 4b50000c 8001022c: 0980083c 09f80001 00000000 ------->: 4b50000c 0980083c 09f80001 8001412c: a0000a24 08004001 90000924 a0000a24 08004001 91000924 a0000a24 08004001 ------->: 10000224 a03e02a5 00000000 01000224 143f02a5 00000000 25300224 c43802ad : 92000924 a0000a24 08004001 93000924 ------->: 00000000 25400224 0800e003 504d02ad �Ƃ�����ŝA 00001a2c: 09 -> 4b 00001a2d: 80 -> 50 00001a2e: 08 -> 00 00001a2f: 3c -> 0c 00001a31: f8 -> 80 00001a32: 00 -> 08 00001a33: 01 -> 3c 00001a34: 00 -> 09 00001a35: 00 -> f8 00001a37: 00 -> 01 000021b0: 21 -> 25 000021b2: 80 -> 00 0000278c: 30 -> 10 0000278d: 80 -> 00 00002800: 09 -> 01 0000592c: a0 -> 10 0000592e: 0a -> 02 00005930: 08 -> a0 00005931: 00 -> 3e 00005932: 40 -> 02 00005933: 01 -> a5 00005934: 90 -> 00 00005936: 09 -> 00 00005937: 24 -> 00 00005938: a0 -> 01 0000593a: 0a -> 02 0000593c: 08 -> 14 0000593d: 00 -> 3f 0000593e: 40 -> 02 0000593f: 01 -> a5 00005940: 91 -> 00 00005942: 09 -> 00 00005943: 24 -> 00 00005944: a0 -> 25 00005945: 00 -> 30 00005946: 0a -> 02 00005948: 08 -> c4 00005949: 00 -> 38 0000594a: 40 -> 02 0000594b: 01 -> ad 0000594c: 92 -> 00 0000594e: 09 -> 00 0000594f: 24 -> 00 00005950: a0 -> 25 00005951: 00 -> 40 00005952: 0a -> 02 00005956: 40 -> e0 00005957: 01 -> 03 00005958: 93 -> 50 00005959: 00 -> 4d 0000595a: 09 -> 02 0000595b: 24 -> ad �ł����A���Ђ�B hanimar
�yPSX Game Buster Version 2.3 (gbust23) NTSC patch�z �Ȃ� PAR26 �u�ӂ�v�Ɠ����l���B 1f0041ec: 10 fc 24 ac sw a0,$8005fc10 --------> 10 fc 20 ac sw zero,$8005fc10 800a5afc e09524ac -> e09520ac ���̕ӂ̕ϝX�� kaja ����� PALPAR �ŒT���܂��B SCE �̃��C�u�������g�����v���O�������ƒT����悤�ł��B ���k���ꂽ�����̃R�[�h�I�ɕϝX�B lui v0, $800a li v1, $20ac jr ra sh v1, $5afe(v0) �Ȃ�� 0a80023c ac200324 0800e003 fe5a43a4 �t�����X�łƝ��������A�h���X���Ⴄ�B ...�Ƃ����킯�ŝA����͝������B ROM �̃A�h���X�F �� -> �ϝX��A�ł��B 00001146: 01 -> a5 00001147: 0c -> 34 00001148: 21 -> 40 00001149: 20 -> 0e a534400e��}�������B���Ƃ͂��炵�Ă邾���B 0000114a: 00 -> 01 0000114b: 00 -> 0c 0000114c: 34 -> 21 0000114d: 00 -> 20 0000114e: bf -> 00 0000114f: 8f -> 00 00001150: 38 -> 34 1151 �͕ϝX�Ȃ��B�C��t���ĝB 00001152: bd -> bf 00001153: 23 -> 8f 00001154: 09 -> 38 00001155: 80 -> 00 00001156: 08 -> bd 00001157: 3c -> 23 00001158: 08 -> 09 00001159: 00 -> 80 0000115a: 00 -> 08 0000115b: 01 -> 3c 0000115c: 00 -> 08 0000115f: 00 -> 01 �����܂ŝu���炵�v�B 000041ee: 24 -> 20 �^�C�g���� NTSC �ɂ���B 000078b0: 24 -> 0a ��L�̃A�Z���u�������B 000078b1: 49 -> 80 000078b2: 64 -> 02 000078b3: 3a -> 3c 000078b4: 20 -> ac 000078b5: 69 -> 20 000078b6: 6e -> 03 000078b7: 74 -> 24 000078b8: 72 -> 08 000078b9: 2e -> 00 000078ba: 63 -> e0 000078bb: 2c -> 03 000078bc: 76 -> fe 000078bd: 20 -> 5a 000078be: 31 -> 43 000078bf: 2e -> a4 �����܂��B hanimar
#include "syscall.h"
int doit(char *romAddr, long *dest);
int main(int argc, char **argv)
{
unsigned long sz;
char *p = (char *)0x80100000;
int fd;
char fname[128];
if (argc == 1) strcpy(fname, "pcdrv:a.out");
else {
strcpy(fname, "pcdrv:");
strcat(fname, argv[1]);
}
/* sz = doit((char *)0x1f01736c, (long *)0x80100000); FLASHER */
/* sz = doit((char *)0x1f001c20, (long *)0x80100000); EXECUTE */
/* sz = doit((char *)0x1f00a5a4, (long *)0x80100000); CHEAT CODE */
/* sz = doit((char *)0x1f00cb9c, (long *)0x80100000); MEMORY CARD */
/* sz = doit((char *)0x1f00ee70, (long *)0x80100000); FRAME BUFFER */
sz = doit((char *)0x1f0109a0, (long *)0x80100000); /* CDROM */
/* sz = doit((char *)0x1f016668, (long *)0x80100000); CONFIG */
printf("decoded from $80100000 to 0x%08x (%d bytes).\n",
(unsigned long)0x80100000 + sz - 1, sz);
printf("writing to %s\n", fname);
fd = open(fname, O_CREAT);
if (fd < 0) {
printf("Cannot open file %s\n", fname);
} else {
close(fd);
fd = open(fname, O_WRONLY);
write(fd, p, sz);
close(fd);
}
return 0;
}
# int doit(char *romAddr, long *dest);
#
# romAddr: �Ý����H���ꂽ�C���[�W�ւ̃|�C���^
# dest: �W�J��A�h���X
#
# �߂�l�F�W�J�����T�C�Y
#
.set reorder
.globl doit
.ent doit
doit:
addiu sp, sp, -36
sw s0, $0010(sp)
sw s1, $0014(sp)
sw ra, $0018(sp)
sw a0, $001c(sp)
sw a1, $0020(sp)
li s0, $1f006a20 # API 0B �����ǒ��ڌĂ�ł��܂����B0.34 ��p
jalr s0 # call API 0B
li t2, $00a0
li t1, $0044 # FlushCache() �������Ȃ����炢��Ȃ����ǝB
jalr t2
or v0, zero, a1
lw v1, $0020(sp)
subu v0, v0, v1
lw ra, $0018(sp)
lw s1, $0014(sp)
lw s0, $0010(sp)
addiu sp, sp, 36
jr ra
.end doit
���܂�ăR�i�~�̎����i���[�O�X�X�ׂ��Ƃ���A
�C�O�̂o�r�œ���������p��Œ��ւ��o��悤�ɂȂ��Ă��܂����B
800c0044-0041 800c0046-2403�ł݂�܂��B �����I�ɂ݂��悤�ɂ���킯�ł͂���܂���̂ŝA ���ւɈ����������b�܂ꂽ���ɂȂ��Ƃ݂�܂���B