ref: eac209e87ad4d1ad323c9302cb5493498cc61fca
parent: 643a196441b37b1c3dcb0a33645294b3840d0f35
author: allkern <lisandroaalarcon@gmail.com>
date: Sat Sep 2 19:50:08 EDT 2023
Start reimplementing CDROM backend
--- a/frontend/main.c
+++ b/frontend/main.c
@@ -73,8 +73,8 @@
log_fatal("pc=%08x hi=%08x lo=%08x ep=%08x", cpu->pc, cpu->hi, cpu->lo, cpu->cop0_r[COP0_EPC]);if (cfg->cd_path)
- psx_cdrom_close(cdrom);
-
+ psx_cdrom_destroy(cdrom);
+
psx_input_destroy(input);
psx_destroy(psx);
psxi_sda_destroy(controller);
--- a/psx/dev/cdrom.c
+++ b/psx/dev/cdrom.c
@@ -163,8 +163,6 @@
SET_BITS(ifr, IFR_INT, IFR_INT3);
RESP_PUSH(GETSTAT_MOTOR);
- fseek(cdrom->disc, cdrom->seek_offset, 0);
-
int double_speed = cdrom->mode & MODE_SPEED;
cdrom->irq_delay = double_speed ? READ_DOUBLE_DELAY : READ_SINGLE_DELAY;
@@ -184,14 +182,18 @@
SET_BITS(ifr, IFR_INT, IFR_INT1);
RESP_PUSH(GETSTAT_MOTOR | GETSTAT_READ);
-
// Account for 2 second gap
- uint16_t m = BTOI(cdrom->seek_mm) * 60 * 75;
- uint16_t s = BTOI(cdrom->seek_ss) * 75;
- uint16_t f = BTOI(cdrom->seek_ff);
- uint32_t t = m + s + f - 150;
+ msf_t msf;
+ log_fatal("CDROM seek %02x:%02x:%02x", cdrom->seek_mm, cdrom->seek_ss, cdrom->seek_ff);+
+ msf.m = BTOI(cdrom->seek_mm);
+ msf.s = BTOI(cdrom->seek_ss);
+ msf.f = BTOI(cdrom->seek_ff);
+
+ psx_disc_seek(cdrom->disc, msf);
+
// log_fatal("Reading data from disc. offset=%02x:%02x:%02x (%08x, tellg=%08x)",// cdrom->seek_mm, cdrom->seek_ss, cdrom->seek_ff,
// cdrom->seek_offset, ftell(cdrom->disc)
@@ -199,8 +201,7 @@
cdrom->dfifo_index = 0;
- fseek(cdrom->disc, t * CD_SECTOR_SIZE, SEEK_SET);
- fread(cdrom->dfifo, 1, CD_SECTOR_SIZE, cdrom->disc);
+ psx_disc_read_sector(cdrom->disc, cdrom->dfifo);
cdrom->seek_ff++;
@@ -409,8 +410,12 @@
} break;
case CD_STATE_SEND_RESP1: {+ int tn;
+
+ psx_disc_get_track_count(cdrom->disc, &tn);
+
SET_BITS(ifr, IFR_INT, IFR_INT3);
- RESP_PUSH(0x14);
+ RESP_PUSH(tn);
RESP_PUSH(0x01);
RESP_PUSH(GETSTAT_MOTOR);
@@ -436,7 +441,7 @@
return;
}
- int track = PFIFO_POP;
+ cdrom->gettd_track = PFIFO_POP;
cdrom->irq_delay = DELAY_1MS;
cdrom->delayed_command = CDL_GETTD;
@@ -444,9 +449,13 @@
} break;
case CD_STATE_SEND_RESP1: {+ msf_t td;
+
+ psx_disc_get_track_addr(cdrom->disc, &td, cdrom->gettd_track);
+
SET_BITS(ifr, IFR_INT, IFR_INT3);
- RESP_PUSH(0x00);
- RESP_PUSH(0x00);
+ RESP_PUSH(td.m);
+ RESP_PUSH(td.s);
RESP_PUSH(GETSTAT_MOTOR);
cdrom->delayed_command = CDL_NONE;
@@ -462,10 +471,6 @@
cdrom->irq_delay = DELAY_1MS;
cdrom->state = CD_STATE_SEND_RESP1;
cdrom->delayed_command = CDL_SEEKL;
-
- log_fatal("seekl: Seeking to address %08x", cdrom->seek_offset);-
- fseek(cdrom->disc, cdrom->seek_offset, 0);
} break;
case CD_STATE_SEND_RESP1: {@@ -593,6 +598,10 @@
}
}
void cdrom_cmd_reads(psx_cdrom_t* cdrom) {+ log_fatal("reads: Unimplemented");+
+ exit(1);
+
cdrom->delayed_command = CDL_NONE;
switch (cdrom->state) {@@ -609,8 +618,6 @@
SET_BITS(ifr, IFR_INT, 3);
RESP_PUSH(GETSTAT_MOTOR);
- fseek(cdrom->disc, cdrom->seek_offset, 0);
-
int double_speed = cdrom->mode & MODE_SPEED;
cdrom->irq_delay = double_speed ? READ_DOUBLE_DELAY : READ_SINGLE_DELAY;
@@ -629,10 +636,10 @@
SET_BITS(ifr, IFR_INT, 1);
RESP_PUSH(GETSTAT_MOTOR | GETSTAT_READ);
- log_fatal("Reading data from disc. offset=%02x:%02x:%02x (%08x, tellg=%08x)",- cdrom->seek_mm, cdrom->seek_ss, cdrom->seek_ff,
- cdrom->seek_offset, ftell(cdrom->disc)
- );
+ // log_fatal("Reading data from disc. offset=%02x:%02x:%02x (%08x, tellg=%08x)",+ // cdrom->seek_mm, cdrom->seek_ss, cdrom->seek_ff,
+ // cdrom->seek_offset, ftell(cdrom->disc)
+ // );
cdrom->dfifo_index = 0;
@@ -774,7 +781,7 @@
}
void cdrom_write_cmd(psx_cdrom_t* cdrom, uint8_t value) {- log_set_quiet(0);
+ //log_set_quiet(0);
log_fatal("%s(%02x) %u params=[%02x, %02x, %02x, %02x, %02x, %02x]",g_psx_cdrom_command_names[value],
value,
@@ -786,7 +793,7 @@
cdrom->pfifo[4],
cdrom->pfifo[5]
);
- log_set_quiet(1);
+ //log_set_quiet(1);
cdrom->command = value;
cdrom->state = CD_STATE_RECV_CMD;
@@ -981,7 +988,8 @@
}
void psx_cdrom_destroy(psx_cdrom_t* cdrom) {- psx_disc_destroy(cdrom->disc);
+ if (cdrom->disc)
+ psx_disc_destroy(cdrom->disc);
free(cdrom);
}
\ No newline at end of file
--- a/psx/dev/cdrom.h
+++ b/psx/dev/cdrom.h
@@ -184,6 +184,7 @@
uint8_t error;
uint8_t error_flags;
int read_ongoing;
+ int gettd_track;
const char* path;
psx_disc_t* disc;
--- a/psx/dev/dma.c
+++ b/psx/dev/dma.c
@@ -369,14 +369,14 @@
void psx_dma_do_otc(psx_dma_t* dma) {if ((!(dma->dpcr & DPCR_DMA6EN)) || (!CHCR_TRIG(otc)) || (!CHCR_BUSY(otc)))
return;
-
- log_fatal("OTC DMA transfer: madr=%08x, dir=%s, sync=%s, step=%s, size=%x",- dma->otc.madr,
- CHCR_TDIR(otc) ? "to device" : "to RAM",
- CHCR_SYNC(otc) ? "other" : "burst",
- CHCR_STEP(otc) ? "decrementing" : "incrementing",
- BCR_SIZE(otc)
- );
+
+ // log_fatal("OTC DMA transfer: madr=%08x, dir=%s, sync=%s, step=%s, size=%x",+ // dma->otc.madr,
+ // CHCR_TDIR(otc) ? "to device" : "to RAM",
+ // CHCR_SYNC(otc) ? "other" : "burst",
+ // CHCR_STEP(otc) ? "decrementing" : "incrementing",
+ // BCR_SIZE(otc)
+ // );
uint32_t size = BCR_SIZE(otc);
--- a/psx/disc.c
+++ b/psx/disc.c
@@ -6,6 +6,7 @@
#include "disc.h"
+
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
@@ -24,6 +25,7 @@
}
int psx_disc_seek(psx_disc_t* disc, msf_t msf) {+ log_fatal("DISC seek %02u:%02u:%02u", msf.m, msf.s, msf.f);return disc->seek_func(disc->udata, msf);
}
--- a/psx/disc.h
+++ b/psx/disc.h
@@ -11,6 +11,8 @@
#include <stdlib.h>
#include <stdio.h>
+#include "log.h"
+
enum {DISC_ERR_TRACK_OUT_OF_BOUNDS = 1,
DISC_ERR_ADDR_OUT_OF_BOUNDS
--- a/psx/disc/cue.c
+++ b/psx/disc/cue.c
@@ -296,6 +296,8 @@
// the CUE struct.
void psxd_cue_load(psxd_cue_t* cue) {+ log_fatal("Loading CD image...");+
size_t offset = 0;
void* buf = NULL;
@@ -310,6 +312,8 @@
track->size = ftell(file);
+ cue->buf_size += track->size;
+
// Calculate track MS(F)
track->disc_offset.f = offset / CUE_SECTOR_SIZE;
track->disc_offset.s = track->disc_offset.f / CUE_SECTORS_PER_SECOND;
@@ -328,15 +332,24 @@
cue->end.s = cue->end.f / CUE_SECTORS_PER_SECOND;
cue->end.m = cue->end.s / 60;
cue->end.s -= cue->end.m * 60;
- cue->end.f -= (cue->end.m * 60) + (cue->end.s * CUE_SECTORS_PER_SECOND);
+ cue->end.f -= ((cue->end.m * 60) + cue->end.s) * CUE_SECTORS_PER_SECOND;
+
+ log_fatal("Loaded CUE image, size=%08x, end=%02u:%02u:%02u",+ cue->buf_size,
+ cue->end.m,
+ cue->end.s,
+ cue->end.f
+ );
}
int psxd_cue_seek(void* udata, msf_t msf) {psxd_cue_t* cue = udata;
+ log_fatal("CUE seek to %02u:%02u:%02u", msf.m, msf.s, msf.f);+
// To-do: Check for OOB seeks
- uint32_t sectors = (((msf.m * 60) + msf.s) * CUE_SECTORS_PER_SECOND) + msf.f;
+ uint32_t sectors = (((msf.m * 60) + (msf.s - 2)) * CUE_SECTORS_PER_SECOND) + msf.f;
cue->seek_offset = sectors * CUE_SECTOR_SIZE;
@@ -346,7 +359,7 @@
int psxd_cue_read_sector(void* udata, void* buf) {psxd_cue_t* cue = udata;
- memcpy(buf, &cue->buf[cue->seek_offset], CUE_SECTOR_SIZE);
+ memcpy(buf, cue->buf + cue->seek_offset, CUE_SECTOR_SIZE);
return 0;
}
--- a/psx/disc/cue.h
+++ b/psx/disc/cue.h
@@ -78,6 +78,7 @@
cue_track_t** track;
char* current_file;
uint32_t seek_offset;
+ uint32_t buf_size;
msf_t end;
} psxd_cue_t;
--
⑨