Files
SergObsidian/PERSONAL PROJECTS/PS1 DOCS/CD_Execute_Reading.md
2025-04-21 22:24:44 +05:00

2.6 KiB
Raw Permalink Blame History

void CD_ExecuteReading(int param_1) 
{
    // Проверка статуса чтения CD
    if ((DAT_CD_READ_STATUS < 3) && (DAT_CD_READ_STATUS >= 0)) {
        return;
    }

    // Проверка глобального состояния системы
    if ((DWORD_80083938 == 6) || (DWORD_80083938 == 3)) {
        return;
    }

    // Проверка изменения состояния
    if (DWORD_800838b8 != DWORD_80083718) {
        DWORD_800838b8 = DWORD_80083718;
        FUN_EMPTY(); // Какая-то инициализация/сброс

        // Основная логика обработки состояний
        switch (DAT_CD_READ_STATUS) {
            case 3:
            case 5:
            case 8:
            case 10:
                // Проверка статуса привода
                byte driveStatus = DsStatus();
                
                // Условие для смены статуса
                if ((driveStatus & 0x60) == 0 && (DWORD_80083718 - DWORD_800838b4) >= 0xB5) {
                    DAT_CD_READ_STATUS = 2;
                    FUN_8004a19c(); // Какая-то функция обработки
                    
                    // Дополнительные проверки статуса
                    if (DAT_CD_READ_STATUS != 5) {
                        if (DAT_CD_READ_STATUS < 6) {
                            if (DAT_CD_READ_STATUS == 3) {
                                FUN_80026d58(); // Обработка состояния 3
                            }
                        } else {
                            if (DAT_CD_READ_STATUS == 10) {
                                DsSectorSeek(); // Поиск сектора
                            } else if (DAT_CD_READ_STATUS == 12) {
                                readCD_XA(); // Чтение XA-аудио
                            }
                        }
                    }
                }
                break;

            case 5:
                // Специальная обработка для состояния 5
                if (DsSystemStatus() == 1) {
                    FUN_80026eec(); // Функция завершения
                }
                break;

            default:
                // Ничего не делаем для других состояний
                break;
        }
    }

    // Чтение сектора, если статус в диапазоне 0xC-0xF
    if ((DAT_CD_READ_STATUS >= 0xC) && (DAT_CD_READ_STATUS < 0x10)) {
        CD_SectorRead(param_1);
    }
}