48static inline uint32_t cmdR5(uint8_t r5) {
49 return (uint32_t)(r5 & 0x1f) << 3;
54static inline void fillR(int16_t x, int16_t y, int16_t w, int16_t h,
56 uint16_t pixel = rasterVram555((uint8_t)(b5 & 0x1f), 0, 0);
57 rasterFillRect(x, y, w, h, pixel);
63static void drawAbrTri(uint8_t b5, uint8_t f5, uint8_t abr) {
65 fillR(0, 0, 32, 32, b5);
67 rasterFlatTriSemi(cmdR5(f5),
71 rasterFlushPrimitive();
75static void drawAbrQuad(uint8_t b5, uint8_t f5, uint8_t abr) {
77 fillR(0, 0, 32, 32, b5);
79 rasterFlatQuadSemi(cmdR5(f5),
84 rasterFlushPrimitive();
88static void drawAbrRect(uint8_t b5, uint8_t f5, uint8_t abr) {
90 fillR(0, 0, 32, 32, b5);
92 rasterFlatRectSemi(cmdR5(f5), 0, 0, 12, 12);
93 rasterFlushPrimitive();
97static void drawAbrLine(uint8_t b5, uint8_t f5, uint8_t abr) {
99 fillR(0, 0, 32, 8, b5);
101 rasterFlatLineSemi(cmdR5(f5), 0, 4, 11, 4);
102 rasterFlushPrimitive();
111static inline void rasterTexTriSemi(uint32_t cmdColor,
112 int16_t x0, int16_t y0, uint8_t
u0, uint8_t v0,
113 int16_t x1, int16_t y1, uint8_t
u1, uint8_t
v1,
114 int16_t x2, int16_t y2, uint8_t u2, uint8_t
v2,
115 uint16_t clut_field, uint16_t tpage_field) {
117 GPU_DATA = 0x26000000u | (cmdColor & 0x00ffffffu);
118 GPU_DATA = ((uint32_t)(uint16_t)y0 << 16) | (uint32_t)(uint16_t)x0;
119 GPU_DATA = ((uint32_t)clut_field << 16) |
120 ((uint32_t)v0 << 8) | (uint32_t)
u0;
121 GPU_DATA = ((uint32_t)(uint16_t)y1 << 16) | (uint32_t)(uint16_t)x1;
122 GPU_DATA = ((uint32_t)tpage_field << 16) |
123 ((uint32_t)
v1 << 8) | (uint32_t)
u1;
124 GPU_DATA = ((uint32_t)(uint16_t)y2 << 16) | (uint32_t)(uint16_t)x2;
125 GPU_DATA = (0u << 16) | ((uint32_t)
v2 << 8) | (uint32_t)u2;
131static void drawAbrTexTriMasked(uint8_t b5, uint8_t abr) {
133 fillR(0, 0, 32, 16, b5);
136 uint16_t tpage = (uint16_t)((
TEX4_TX & 0xf) | ((
TEX4_TY & 1) << 4)
137 | ((abr & 3) << 5) | (0u << 7));
140 setTextureWindow(0, 0, 0, 0);
146 rasterFlushPrimitive();
152static void drawAbrTriSetMask(uint8_t b5, uint8_t f5, uint8_t abr) {
154 fillR(0, 0, 32, 32, b5);
156 rasterSetMaskCtrl(1, 0);
157 rasterFlatTriSemi(cmdR5(f5),
159 rasterFlushPrimitive();
160 rasterSetMaskCtrl(0, 0);
167static void drawAbrTriCheckMask(uint8_t b5, uint8_t f5, uint8_t abr) {
170 uint16_t bg = (uint16_t)(rasterVram555((uint8_t)(b5 & 0x1f), 0, 0) | 0x8000u);
171 rasterFillRect(0, 0, 32, 32, bg);
173 rasterSetMaskCtrl(0, 1);
174 rasterFlatTriSemi(cmdR5(f5),
176 rasterFlushPrimitive();
177 rasterSetMaskCtrl(0, 0);
CESTER_TEST(cddaLevelHalf, test_instances, static const uint8_t atv[4]={0x40, 0x00, 0x40, 0x00};unsigned changes=0;int peak=cddaPeak(atv, 1, &changes);ramsyscall_printf("CD-DA level at half ATV: peak %i, %u sign changes\n", peak, changes);cester_assert_int_ge(peak, 11300);cester_assert_int_le(peak, 11800);cester_assert_uint_ge(changes, 4);) CESTER_TEST(cddaLevelClipped
CESTER_BODY(static uint16_t s_cddaCapture;static int cddaSpuDma(uint32_t spuAddr, void *buf, uint32_t bytes, int isRead) { const uint16_t tsa=spuAddr > > 3;const uint16_t mode=isRead ? 0x30 :0x20;SPU_RAM_DTA=tsa;for(int i=0;i< 0xf01 &&SPU_RAM_DTA !=tsa;i++);SPU_CTRL=(SPU_CTRL &~0x30)|mode;for(volatile int i=0;i< 60;i++);for(int i=0;i< 0xf01 &&(SPU_STATUS &0x30) !=mode;i++);CDDA_SPU_DELAY=(CDDA_SPU_DELAY &0xf0ffffff)|(isRead ? 0x22000000 :0x20000000);DMA_CTRL[DMA_SPU].MADR=(uint32_t) buf &0x1fffffff;DMA_CTRL[DMA_SPU].BCR=((bytes > > 6)<< 16)|0x10;DMA_CTRL[DMA_SPU].CHCR=isRead ? 0x01000200 :0x01000201;int ok=0;for(unsigned t=0;t< 4000000u;t++) { if((DMA_CTRL[DMA_SPU].CHCR &0x01000000)==0) { ok=1;break;} } SPU_CTRL=SPU_CTRL &~0x30;for(volatile int i=0;i< 60;i++);return ok;} static int cddaSimpleCmd(uint8_t cmd) { uint8_t response[16];CDROM_REG0=0;CDROM_REG1=cmd;uint32_t timeout=2000000;int ok=waitCDRomIRQWithTimeout(&timeout);ackCDRomCause();readResponse(response);return ok;} static void cddaWaitPauseComplete() { initializeTime();uint32_t elapsed=0;while(elapsed< 5000000u) { uint32_t budget=200000u;int ok=waitCDRomIRQWithTimeout(&budget);elapsed=budget;if(!ok) continue;uint8_t cause=ackCDRomCause();uint8_t response[16];readResponse(response);if(cause==2) return;} } static int cddaAudioSetup(const uint8_t atv[4], int demute) { if(!resetCDRom()) return 0;DPCR|=0x000b0000;SPU_CTRL=0;for(volatile int i=0;i< 20000;i++);SPU_VOL_MAIN_LEFT=0;SPU_VOL_MAIN_RIGHT=0;SPU_KEY_OFF_LOW=0xffff;SPU_KEY_OFF_HIGH=0xffff;SPU_RAM_DTC=4;SPU_CTRL=0x8001;for(volatile int i=0;i< 20000;i++);for(int i=0;i< 0x400;i++) s_cddaCapture[i]=CDDA_MARKER;if(!cddaSpuDma(0x000, s_cddaCapture, 0x800, 0)) return 0;if(!cddaSimpleCmd(demute ? CDL_DEMUTE :CDL_MUTE)) return 0;CDROM_REG0=2;CDROM_REG2=atv[0];CDROM_REG3=atv[1];CDROM_REG0=3;CDROM_REG1=atv[2];CDROM_REG2=atv[3];CDROM_REG0=3;CDROM_REG3=0x20;CDROM_REG0=0;SPU_VOL_CD_LEFT=0x7fff;SPU_VOL_CD_RIGHT=0x7fff;SPU_CTRL=SPU_CTRL|0x8001;return 1;} static int cddaBufferPeak(unsigned *signChanges) { int peak=0;unsigned changes=0;int prev=0;for(int i=0;i< 0x200;i++) { int v=(int16_t) s_cddaCapture[i];int a=v< 0 ? -v :v;if(a > peak) peak=a;int sign=v >=0 ? 1 :-1;if(i &&sign !=prev) changes++;prev=sign;} *signChanges=changes;return peak;} static int cddaCapturePeak(unsigned *signChanges) { int peak=0;for(unsigned attempt=0;attempt< 8;attempt++) { if(attempt) { initializeTime();while(updateTime()< 250000u);} if(!cddaSpuDma(0x000, s_cddaCapture, 0x800, 1)) return -1;peak=cddaBufferPeak(signChanges);if(peak) { if(attempt) ramsyscall_printf("capture was empty %u time(s) before audio\n", attempt);break;} } return peak;} static int cddaPeak(const uint8_t atv[4], int demute, unsigned *signChanges) { if(!cddaAudioSetup(atv, demute)) return -1;if(!setMode(0)) return -1;CDROM_REG0=0;CDROM_REG2=0x02;if(!cddaSimpleCmd(CDL_PLAY)) return -1;initializeTime();while(updateTime()< 1500000u);int peak=cddaCapturePeak(signChanges);CDROM_REG0=0;CDROM_REG1=CDL_PAUSE;cddaWaitPauseComplete();CDROM_REG0=0;CDROM_REG2=0x00;CDROM_REG2=0x02;CDROM_REG2=0x16;if(cddaSimpleCmd(CDL_SETLOC) &&cddaSimpleCmd(CDL_SEEKL)) cddaWaitPauseComplete();return peak;}[0x400])
Definition cdda.c:37
#define GPU_DATA
Definition hwregs.h:52
volatile void * u0
Definition load-timings.c:875
volatile void * u1
Definition load-timings.c:876
#define ABR0_PRIM_LINE
Definition raster-expected-phase12.h:118
#define ABR3_B16_F31
Definition raster-expected-phase12.h:99
#define ABR1_B16_F16
Definition raster-expected-phase12.h:70
#define ABR2_TEX_MASKED
Definition raster-expected-phase12.h:153
#define ABR0_B16_F31
Definition raster-expected-phase12.h:57
#define ABR1_NOMASK_F0
Definition raster-expected-phase12.h:170
#define ABR3_SETMASK
Definition raster-expected-phase12.h:164
#define ABR1_B16_F00
Definition raster-expected-phase12.h:69
#define ABR3_PRIM_LINE
Definition raster-expected-phase12.h:121
#define ABR0_PRIM_QUAD
Definition raster-expected-phase12.h:108
#define ABR2_B00_F00
Definition raster-expected-phase12.h:80
#define ABR2_B00_F31
Definition raster-expected-phase12.h:82
#define ABR1_SETMASK
Definition raster-expected-phase12.h:162
#define ABR0_B00_F16
Definition raster-expected-phase12.h:53
#define ABR0_B16_F16
Definition raster-expected-phase12.h:56
#define ABR0_B31_F31
Definition raster-expected-phase12.h:60
#define ABR1_B16_F31
Definition raster-expected-phase12.h:71
#define ABR1_B00_F00
Definition raster-expected-phase12.h:66
#define ABR0_B16_F00
Definition raster-expected-phase12.h:55
#define ABR3_CHECKMASK
Definition raster-expected-phase12.h:180
#define ABR1_PRIM_LINE
Definition raster-expected-phase12.h:119
#define ABR2_PRIM_LINE
Definition raster-expected-phase12.h:120
#define ABR1_B31_F31
Definition raster-expected-phase12.h:74
#define ABR3_TEX_MASKED
Definition raster-expected-phase12.h:154
#define ABR0_B31_F16
Definition raster-expected-phase12.h:59
#define ABR3_B16_F16
Definition raster-expected-phase12.h:98
#define ABR2_B31_F16
Definition raster-expected-phase12.h:87
#define ABR0_PRIM_RECT
Definition raster-expected-phase12.h:113
#define ABR3_B00_F00
Definition raster-expected-phase12.h:94
#define ABR3_B31_F31
Definition raster-expected-phase12.h:102
#define ABR2_B16_F31
Definition raster-expected-phase12.h:85
#define ABR3_B00_F16
Definition raster-expected-phase12.h:95
#define ABR2_B31_F31
Definition raster-expected-phase12.h:88
#define ABR3_B31_F16
Definition raster-expected-phase12.h:101
#define ABR0_B00_F00
Definition raster-expected-phase12.h:52
#define ABR2_CHECKMASK
Definition raster-expected-phase12.h:179
#define ABR1_B00_F16
Definition raster-expected-phase12.h:67
#define ABR0_B00_F31
Definition raster-expected-phase12.h:54
#define ABR1_PRIM_QUAD
Definition raster-expected-phase12.h:109
#define ABR3_PRIM_RECT
Definition raster-expected-phase12.h:116
#define ABR0_CHECKMASK
Definition raster-expected-phase12.h:177
#define ABR2_B16_F00
Definition raster-expected-phase12.h:83
#define ABR2_B00_F16
Definition raster-expected-phase12.h:81
#define ABR2_B31_F00
Definition raster-expected-phase12.h:86
#define ABR2_B16_F16
Definition raster-expected-phase12.h:84
#define ABR3_B31_F00
Definition raster-expected-phase12.h:100
#define ABR3_B16_F00
Definition raster-expected-phase12.h:97
#define ABR1_B31_F16
Definition raster-expected-phase12.h:73
#define ABR1_CHECKMASK
Definition raster-expected-phase12.h:178
#define ABR1_B00_F31
Definition raster-expected-phase12.h:68
#define ABR2_PRIM_QUAD
Definition raster-expected-phase12.h:110
#define ABR0_B31_F00
Definition raster-expected-phase12.h:58
#define ABR0_SETMASK
Definition raster-expected-phase12.h:161
#define ABR2_SETMASK
Definition raster-expected-phase12.h:163
#define ABR1_SETMASK_F0
Definition raster-expected-phase12.h:169
#define ABR1_PRIM_RECT
Definition raster-expected-phase12.h:114
#define ABR3_PRIM_QUAD
Definition raster-expected-phase12.h:111
#define ABR3_B00_F31
Definition raster-expected-phase12.h:96
#define ABR1_TEX_MASKED
Definition raster-expected-phase12.h:152
#define ABR0_TEX_MASKED
Definition raster-expected-phase12.h:151
#define ABR2_PRIM_RECT
Definition raster-expected-phase12.h:115
#define ABR1_B31_F00
Definition raster-expected-phase12.h:72
#define ASSERT_PIXEL_EQ(expected, x_, y_)
Definition raster-helpers.h:473
#define CLUT4_FIELD
Definition texture-fixtures.h:83
#define TEX_MOD_NEUTRAL
Definition texture-fixtures.h:308
#define TEX4_TY
Definition texture-fixtures.h:56
#define TEX4_TX
Definition texture-fixtures.h:55
uint16_t v2
Definition timers.c:262
uint16_t v1
Definition timers.c:260