PlayStation 2 Linux
Display 200 cubes
SUMMARY
パッチ適用済kernelのPlayStation 2 Linuxで動作するキューブを約200個表示するプログラムです。 パッドでカメラの位置と角度を調整でき、SELECTで加算表示モードにできます。 ただし、PS2らしいことは何もやっておらず、 PS2の性能も出していませんから、本パッチの動作テスト以上の意味はありません。
/* DMAに先だって、キャッシュをフラッシュ */
struct ps2_genio_ioctl_wback_inv flushparam;
flushparam.addr = PS2_RESERVE_MEMORY_START;
flushparam.len = PS2_RESERVE_MEMORY_SIZE;
ioctl( fdgenio, PS2IOC_DMA_CACHE_WBACK_INV, &flushparam );
//ioctl( fdgenio, PS2IOC_FLUSH_CACHE_ALL, 0 );
A<- こちらだとキャッシュの内容をすべてフラッシュ
/* DMA転送開始 VPU1 */
*(unsigned int *)(genio_p+0x10009030-PS2_DEV_GENIO_OFFSET) =
vpu_ptr_adr - (unsigned int)dmamem_p + PS2_RESERVE_MEMORY_START;
*(unsigned int *)(genio_p+0x10009020-PS2_DEV_GENIO_OFFSET) = 0;
*(unsigned int *)(genio_p+0x10009000-PS2_DEV_GENIO_OFFSET) = 0x0145;
/* DMA転送開始 GS */
*(unsigned int *)(genio_p+0x1000a030-PS2_DEV_GENIO_OFFSET) =
gs_ptr_adr - (unsigned int)dmamem_p + PS2_RESERVE_MEMORY_START;
*(unsigned int *)(genio_p+0x1000a020-PS2_DEV_GENIO_OFFSET) = 0;
*(unsigned int *)(genio_p+0x1000a000-PS2_DEV_GENIO_OFFSET) = 0x0105;
以下のようなコードで初期化しておく必要があります。
int fdgenio = -1;
char *genio_p = MAP_FAILED;
int fddmamem;
char *dmamem_p;
fdgenio = open( PS2_DEV_GENIO, O_RDWR );
genio_p = mmap( 0, 0x4000000,
PROT_READ | PROT_WRITE, MAP_PRIVATE, fdgenio, 0 );
fddmamem = open( PS2_DEV_MEM, O_RDWR );
dmamem_p = mmap( 0, PS2_RESERVE_MEMORY_SIZE,
PROT_READ | PROT_WRITE, MAP_PRIVATE, fddmamem, 0 );
本格的に扱うためにはそれなりの仕組みが必要ですが、 以下のようにすることでDMAの終了待ちは実現できます。
while (*(unsigned int *)(genio_p+0x10009000-PS2_DEV_GENIO_OFFSET) & 0x0100)
usleep( 1000 );
while (*(unsigned int *)(genio_p+0x1000a000-PS2_DEV_GENIO_OFFSET) & 0x0100)
usleep( 1000 );
PROGRAM DOWNLOAD
上記のプログラムは、ソースを公開しませんので再利用は難しいと思いますが、再配布等は自由です。
cuben, cubedemoに同等のソースが含まれています。