driveexist.c 1.82 KB

#include <ultra64.h>
#include "piint.h"
#include "leodrive.h"

#ifndef _LONGCMD
#include <leo.h>
#else
#include <leosp.h>
#endif

/*
 * ドライブロムのオフセット 0x1010 にアクセスし、既定値が書かれ
 * ているかどうかでドライブの有無を判定する
 *
 * osDriveRomInit を使用した場合、その時点のドライブの有無が確認
 * できない可能性があるため、使用せず、自分で読みに行く
 */
u32 LeoDriveExist(void)
{
    u32				data;
    u32				saveMask;
    register u32		stat;
    u32				latency, pulse, pageSize, relDuration;


    /*
     * リソーストークンをゲット
     * (ドライブロムにアクセスするため)
     */
    __osPiGetAccess();

    stat = IO_READ(PI_STATUS_REG);
    while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) {
	stat = IO_READ(PI_STATUS_REG);
    } 

    /*
     * アクセススピードを変更する前に、現在の値を保存しておく
     */
    latency = IO_READ(PI_BSD_DOM1_LAT_REG);
    pageSize = IO_READ(PI_BSD_DOM1_PGS_REG);
    relDuration = IO_READ(PI_BSD_DOM1_RLS_REG);
    pulse = IO_READ(PI_BSD_DOM1_PWD_REG);

    /*
     * アクセススピード値は分からないので、超低速な値に設定。
     */
    IO_WRITE(PI_BSD_DOM1_LAT_REG, (u8)0xff);
    IO_WRITE(PI_BSD_DOM1_PGS_REG, (u8)0x0);
    IO_WRITE(PI_BSD_DOM1_RLS_REG, (u8)0x3);
    IO_WRITE(PI_BSD_DOM1_PWD_REG, (u8)0xff);

    /*
     * IPLROM のオフセット 0x1010 をリード
     */
    data = IO_READ((u32)PHYS_TO_K1(PI_DOM1_ADDR1) + 0x1010);

    /*
     * PI バスの設定値を、変更前に戻しておく
     */
    IO_WRITE(PI_BSD_DOM1_LAT_REG, latency);
    IO_WRITE(PI_BSD_DOM1_PGS_REG, pageSize);
    IO_WRITE(PI_BSD_DOM1_RLS_REG, relDuration);
    IO_WRITE(PI_BSD_DOM1_PWD_REG, pulse);

    /* Return resource token */
    __osPiRelAccess();


    /*
     * 既定値(0x2129fff8) ならドライブは存在しているといえる
     */
    if ( data == 0x2129fff8 )
	return 1;	/* 存在する */
    else
	return 0;	/* 存在しない */

}