Skip to content

Commit 2989bb6

Browse files
committed
Implement IER IRQ blocking
Fixes a lot of games (Strider 2, Crash Bash, Tokimeki Memorial 2, Rockman games, and many more)
1 parent 2c6a5a4 commit 2989bb6

File tree

3 files changed

+48
-46
lines changed

3 files changed

+48
-46
lines changed

frontend/main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ int main(int argc, const char* argv[]) {
4242

4343
psx_cdrom_t* cdrom = psx_get_cdrom(psx);
4444

45+
// To-do: Set CDROM firmware version and region based
46+
// on CLI options
47+
4548
if (cfg->cd_path)
4649
psx_cdrom_open(cdrom, cfg->cd_path);
4750

psx/dev/cdrom/cdrom.c

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -503,55 +503,54 @@ void psx_cdrom_update(psx_cdrom_t* cdrom, int cycles) {
503503
return;
504504
}
505505

506-
psx_ic_irq(cdrom->ic, IC_CDROM);
507-
508-
if (cdrom->state == CD_STATE_TX_RESP1) {
509-
cdrom_handle_resp1(cdrom);
510-
511-
switch (cdrom->pending_command) {
512-
case CDL_READN:
513-
case CDL_READS:
514-
return;
515-
}
516-
517-
// Switching to read mode after executing a command
518-
// has a 500ms penalty
519-
if (cdrom->state == CD_STATE_READ) {
520-
cdrom_process_setloc(cdrom);
506+
switch (cdrom->state) {
507+
case CD_STATE_TX_RESP1: {
508+
cdrom_handle_resp1(cdrom);
509+
510+
switch (cdrom->pending_command) {
511+
case CDL_READN:
512+
case CDL_READS:
513+
break;
514+
}
521515

522-
int ts = psx_disc_query(cdrom->disc, cdrom->lba);
523-
524-
cdrom->state = CD_STATE_READ;
525-
cdrom->prev_state = CD_STATE_READ;
526-
cdrom->delay = CD_DELAY_ONGOING_READ;
527-
}
516+
// Switching to read mode after executing a command
517+
// has a 500ms penalty
518+
if (cdrom->state == CD_STATE_READ) {
519+
cdrom_process_setloc(cdrom);
528520

529-
return;
530-
}
521+
int ts = psx_disc_query(cdrom->disc, cdrom->lba);
522+
523+
cdrom->state = CD_STATE_READ;
524+
cdrom->prev_state = CD_STATE_READ;
525+
cdrom->delay = CD_DELAY_ONGOING_READ;
526+
}
527+
} break;
531528

532-
if (cdrom->state == CD_STATE_TX_RESP2) {
533-
cdrom_cmd_table[cdrom->pending_command](cdrom);
529+
case CD_STATE_TX_RESP2: {
530+
cdrom_cmd_table[cdrom->pending_command](cdrom);
534531

535-
// Switching to read mode after executing a command
536-
// has a 500ms penalty
537-
if (cdrom->state == CD_STATE_READ) {
538-
cdrom_process_setloc(cdrom);
532+
// Switching to read mode after executing a command
533+
// has a 500ms penalty
534+
if (cdrom->state == CD_STATE_READ) {
535+
cdrom_process_setloc(cdrom);
539536

540-
int ts = psx_disc_query(cdrom->disc, cdrom->lba);
541-
542-
cdrom->state = CD_STATE_READ;
543-
cdrom->prev_state = CD_STATE_READ;
544-
cdrom->delay = CD_DELAY_ONGOING_READ;
545-
}
537+
int ts = psx_disc_query(cdrom->disc, cdrom->lba);
538+
539+
cdrom->state = CD_STATE_READ;
540+
cdrom->prev_state = CD_STATE_READ;
541+
cdrom->delay = CD_DELAY_ONGOING_READ;
542+
}
543+
} break;
546544

547-
return;
545+
case CD_STATE_READ: {
546+
cdrom_handle_read(cdrom);
547+
} break;
548548
}
549549

550-
if (cdrom->state == CD_STATE_READ) {
551-
cdrom_handle_read(cdrom);
552-
550+
if ((cdrom->ifr & cdrom->ier) == 0)
553551
return;
554-
}
552+
553+
psx_ic_irq(cdrom->ic, IC_CDROM);
555554
}
556555

557556
uint8_t cdrom_read_status(psx_cdrom_t* cdrom) {

psx/dev/cdrom/impl.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -480,13 +480,11 @@ void cdrom_cmd_gettn(psx_cdrom_t* cdrom) {
480480

481481
int tn = psx_disc_get_track_count(cdrom->disc);
482482

483-
printf("getstat=%02x\n", cdrom_get_stat(cdrom));
484-
485483
queue_push(cdrom->response, cdrom_get_stat(cdrom));
486484
queue_push(cdrom->response, 1);
487485
queue_push(cdrom->response, ITOB(tn));
488486

489-
cdrom_restore_state(cdrom);
487+
cdrom_pause(cdrom);
490488
}
491489

492490
void cdrom_cmd_gettd(psx_cdrom_t* cdrom) {
@@ -721,15 +719,17 @@ void cdrom_cmd_getq(psx_cdrom_t* cdrom) {
721719
void cdrom_cmd_readtoc(psx_cdrom_t* cdrom) {
722720
if (cdrom->state == CD_STATE_TX_RESP1) {
723721
cdrom_set_int(cdrom, 3);
722+
724723
queue_push(cdrom->response, cdrom_get_stat(cdrom));
725724

726-
cdrom->delay = PSX_CPU_CPS / 2;
725+
cdrom->delay = CD_DELAY_1MS * 500;
727726
cdrom->state = CD_STATE_TX_RESP2;
728727
} else {
729728
cdrom_set_int(cdrom, 2);
730-
queue_push(cdrom->response, cdrom_get_stat(cdrom));
731729

732-
cdrom_restore_state(cdrom);
730+
queue_push(cdrom->response, CD_STAT_SPINDLE);
731+
732+
cdrom_pause(cdrom);
733733
}
734734
}
735735

0 commit comments

Comments
 (0)