35 static void hexdump(
const void* data_,
unsigned size) {
36 const uint8_t* data = (
const uint8_t*)data_;
39 for (
unsigned i = 0;
i <
size;
i++) {
42 ascii[
i % 16] = data[
i] >=
' ' && data[
i] <=
'~' ? data[
i] :
'.';
44 if ((j % 8 == 0) || (j ==
size)) {
48 }
else if (j ==
size) {
60 static uint32_t s_lastHSyncCounter = 0;
63 static const unsigned US_PER_HBLANK = 64;
66 uint8_t track, index,
m,
s, f, am, as, af;
70 static uint8_t
btoi(uint8_t
b) {
71 return (
b >> 4) * 10 + (
b & 0xf);
74 static uint8_t
itob(uint8_t
i) {
75 return (
i / 10) * 16 + (
i % 10);
78 static int isValidBCD(uint8_t
b) {
79 return (
b & 0xf) < 10 && (
b >> 4) < 10;
82 static uint32_t MSF2LBA(uint8_t m, uint8_t
s, uint8_t f) {
83 return (m * 60 +
s) * 75 + f;
94 static uint8_t discardResponse() {
105 s_lastHSyncCounter = counter;
111 static inline uint32_t updateTime() {
112 uint32_t lastHSyncCounter = s_lastHSyncCounter;
119 if (hsyncCounter < lastHSyncCounter) {
120 hsyncCounter += 0x10000;
122 uint32_t currentTime = s_currentTime = s_currentTime + (hsyncCounter - lastHSyncCounter) * US_PER_HBLANK;
123 s_lastHSyncCounter = hsyncCounter;
136 static inline int waitCDRomIRQWithTimeout(
uint32_t* timeoutp) {
162 int setMode(uint8_t
mode) {
170 if (
cause != 3)
return 0;
174 static inline int resetCDRom() {
186 if (
cause != 3)
return 0;
190 if (
cause != 2)
return 0;
194 while (updateTime() < 10000);
198 static int setLoc(uint8_t minute, uint8_t second, uint8_t frame) {
209 if (
cause != 3)
return 0;
214 static int seekPTo(uint8_t minute, uint8_t second, uint8_t frame) {
225 if (
cause != 3)
return 0;
232 if (
cause != 3)
return 0;
236 if (
cause != 2)
return 0;
240 static int seekLTo(uint8_t minute, uint8_t second, uint8_t frame) {
251 if (
cause != 3)
return 0;
258 if (
cause != 3)
return 0;
262 if (
cause != 2)
return 0;
uint8_t response[16]
Definition cdlgetlocl.c:84
uint8_t responseSize
Definition cdlgetlocl.c:85
CESTER_BODY(static void hexdump(const void *data_, unsigned size) { const uint8_t *data=(const uint8_t *) data_;char ascii[17];ascii[16]=0;for(unsigned i=0;i< size;i++) { if(i % 16==0) ramsyscall_printf("%08x |", i);ramsyscall_printf("%02X ", data[i]);ascii[i % 16]=data[i] >=' ' &&data[i]<='~' ? data[i] :'.';unsigned j=i+1;if((j % 8==0)||(j==size)) { ramsyscall_printf(" ");if(j % 16==0) { ramsyscall_printf("| %s \n", ascii);} else if(j==size) { ascii[j % 16]=0;if(j % 16<=8) ramsyscall_printf(" ");for(j %=16;j< 16;j++) ramsyscall_printf(" ");ramsyscall_printf("| %s \n", ascii);} } } } static int s_interruptsWereEnabled=0;static uint16_t s_oldMode=0;static uint32_t s_lastHSyncCounter=0;static uint32_t s_currentTime=0;static uint32_t s_oldIMASK=0;static const unsigned US_PER_HBLANK=64;struct LocPResult { uint8_t track, index, m, s, f, am, as, af;uint8_t padding[8];};static uint8_t btoi(uint8_t b) { return(b > > 4) *10+(b &0xf);} static uint8_t itob(uint8_t i) { return(i/10) *16+(i % 10);} static int isValidBCD(uint8_t b) { return(b &0xf)< 10 &&(b > > 4)< 10;} static uint32_t MSF2LBA(uint8_t m, uint8_t s, uint8_t f) { return(m *60+s) *75+f;} static uint8_t readResponse(uint8_t response[16]) { uint8_t responseSize=0;while((CDROM_REG0 &0x20) &&(responseSize< 16)) { response[responseSize++]=CDROM_REG1;} return responseSize;} static uint8_t discardResponse() { uint8_t response[16];return readResponse(response);} static inline void initializeTime() { while(1) { uint32_t init=COUNTERS[1].value;uint32_t counter;while((counter=COUNTERS[1].value)==init);if(counter !=COUNTERS[1].value) continue;s_lastHSyncCounter=counter;break;} s_currentTime=0;} static inline uint32_t updateTime() { uint32_t lastHSyncCounter=s_lastHSyncCounter;uint32_t hsyncCounter;while(1) { hsyncCounter=COUNTERS[1].value;if(hsyncCounter !=COUNTERS[1].value) continue;break;} if(hsyncCounter< lastHSyncCounter) { hsyncCounter+=0x10000;} uint32_t currentTime=s_currentTime=s_currentTime+(hsyncCounter - lastHSyncCounter) *US_PER_HBLANK;s_lastHSyncCounter=hsyncCounter;return currentTime;} static inline uint32_t waitCDRomIRQ() { uint32_t time;do { time=updateTime();} while((IREG &IRQ_CDROM)==0);IREG &=~IRQ_CDROM;return time;} static inline int waitCDRomIRQWithTimeout(uint32_t *timeoutp) { uint32_t time=updateTime();uint32_t timeout= *timeoutp+time;do { time=updateTime();} while(((IREG &IRQ_CDROM)==0) &&(time<=timeout));int ret=(IREG &IRQ_CDROM) !=0; *timeoutp=time;IREG &=~IRQ_CDROM;return ret;} static inline uint8_t ackCDRomCause() { CDROM_REG0=1;uint8_t cause=CDROM_REG3_UC;if(cause &7) { CDROM_REG0=1;CDROM_REG3=7;} if(cause &0x18) { CDROM_REG0=1;CDROM_REG3=cause &0x18;} return cause &7;} int setMode(uint8_t mode) { uint8_t cause;CDROM_REG0=0;CDROM_REG2=mode;CDROM_REG1=CDL_SETMODE;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=3) return 0;return 1;} static inline int resetCDRom() { uint8_t cause;CDROM_REG0=1;CDROM_REG3=0x1f;CDROM_REG0=1;CDROM_REG2=0x1f;CDROM_REG0=0;CDROM_REG1=CDL_INIT;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=3) return 0;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=2) return 0;initializeTime();while(updateTime()< 10000);return setMode(0);} static int setLoc(uint8_t minute, uint8_t second, uint8_t frame) { uint8_t cause;CDROM_REG0=0;CDROM_REG2=minute;CDROM_REG2=second;CDROM_REG2=frame;CDROM_REG1=CDL_SETLOC;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=3) return 0;return 1;} static int seekPTo(uint8_t minute, uint8_t second, uint8_t frame) { uint8_t cause;CDROM_REG0=0;CDROM_REG2=minute;CDROM_REG2=second;CDROM_REG2=frame;CDROM_REG1=CDL_SETLOC;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=3) return 0;CDROM_REG0=0;CDROM_REG1=CDL_SEEKP;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=3) return 0;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=2) return 0;return 1;} static int seekLTo(uint8_t minute, uint8_t second, uint8_t frame) { uint8_t cause;CDROM_REG0=0;CDROM_REG2=minute;CDROM_REG2=second;CDROM_REG2=frame;CDROM_REG1=CDL_SETLOC;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=3) return 0;CDROM_REG0=0;CDROM_REG1=CDL_SEEKL;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=3) return 0;waitCDRomIRQ();cause=ackCDRomCause();CDROM_REG1;if(cause !=2) return 0;return 1;} uint8_t getCtrl() { uint8_t cause;CDROM_REG0=0;CDROM_REG1=CDL_NOP;waitCDRomIRQ();ackCDRomCause();uint8_t ctrl=CDROM_REG1;return ctrl;}) CESTER_BEFORE_ALL(cpu_tests
COUNTERS[1] mode
Definition cester-hw.c:283
s_oldMode
Definition cester-hw.c:282
s_interruptsWereEnabled
Definition cester-hw.c:281
SBUS_COM_CTRL
Definition cester-hw.c:285
IMASK
Definition cester-hw.c:287
SBUS_DEV5_CTRL
Definition cester-hw.c:284
s_oldIMASK
Definition cester-hw.c:286
@ CDL_SETMODE
Definition cdrom.h:56
@ CDL_NOP
Definition cdrom.h:43
@ CDL_SEEKL
Definition cdrom.h:63
@ CDL_SEEKP
Definition cdrom.h:64
@ CDL_SETLOC
Definition cdrom.h:44
@ CDL_INIT
Definition cdrom.h:52
#define CDROM_REG3_UC
Definition cdrom.h:39
#define CDROM_REG0
Definition cdrom.h:31
#define CDROM_REG3
Definition cdrom.h:34
#define CDROM_REG1
Definition cdrom.h:32
#define CDROM_REG2
Definition cdrom.h:33
static int size
Definition string.h:142
cpu_tests
Definition cop0.c:78
#define COUNTERS
Definition counters.h:40
ramsyscall_printf("=== e01_kseg1_reads_no_fill ===\n")
uint8_t b
Definition gte-depthcue.c:39
CESTER_BEFORE_ALL(CESTER_TEST(gte_latency_tests, gte_enable();)
Definition gte-latency.c:115
int i
Definition gte-regio.c:297
#define IREG
Definition hwregs.h:46
@ IRQ_CDROM
Definition irq.h:37
m
Definition gentable.py:52
constexpr uint8_t itob(uint8_t i)
Definition msf.hh:36
constexpr uint8_t btoi(uint8_t b)
Definition msf.hh:35
uint32_t timeout
Definition race.c:103
uint8_t cause
Definition reading.c:707
char * s
Definition string.c:48
static int value
Definition syscalls.h:535
static int ret
Definition syscalls.h:73
void uint32_t(classId, spec)