/*************************************************************************** * au88x0_a3d.c * * Fri Jul 18 14:16:22 2003 * Copyright 2003 mjander * mjander@users.sourceforge.net * * A3D. You may think i'm crazy, but this may work someday. Who knows... ****************************************************************************/ /* CA3dSourceHw */ void CA3dSourceHw::CA3dSourceHw(CAsp4HwIO *hwio, int a,int b) { CA3dSourceHw->this00 = hwio; CA3dSourceHw->this04 = a; CA3dSourceHw->this08 = b; } void CA3dSourceHw::Initialize(int a, int b) { CA3dSourceHw->this04 = a; CA3dSourceHw->this08 = b; CA3dSourceHw::ZeroState(void); } #define addr(a,b,c) (a + (c << 0xd) + (d*(1 + (8*4 - 3)*8))*4) void CA3dSourceHw::SetTimeConsts(short a, short b, short c, short d) { hwwrite(vortex->mmio, addr(0x1837C, this04, this08), a); hwwrite(vortex->mmio, addr(0x18388, this04, this08), b); hwwrite(vortex->mmio, addr(0x18380, this04, this08), c); hwwrite(vortex->mmio, addr(0x18384, this04, this08), d); } void CA3dSourceHw::GetTimeConsts(short a, short b, short c, short d) { } void CA3dSourceHw::SetAtmosTarget(short a,short b,short c,short d,short e) { hwwrite(vortex->mmio, addr(0x190Ec, this04, this08), (e << 0x10) | d); hwwrite(vortex->mmio, addr(0x190F4, this04, this08), (b << 0x10) | a); hwwrite(vortex->mmio, addr(0x190FC, this04, this08), c); } void CA3dSourceHw::SetAtmosTarget(short *a,short *b,short *c,short *d,short *e) { } void CA3dSourceHw::SetAtmosCurrent(short a,short b,short c,short d,short e) { hwwrite(vortex->mmio, addr(0x190E8, this04, this08), (e << 0x10) | d); hwwrite(vortex->mmio, addr(0x190f0, this04, this08), (b << 0x10) | a); hwwrite(vortex->mmio, addr(0x190f8, this04, this08), c); } void CA3dSourceHw::GetAtmosCurrent(short *a,short *b,short *c,short *d,short *e) { *d = hwread(vortex->mmio, addr(0x180e8, this04, this08)); *e = hwread(vortex->mmio, addr(0x190e8, this04, this08)); *b = hwread(vortex->mmio, addr(0x180f0, this04, this08)); *a = hwread(vortex->mmio, addr(0x190f0, this04, this08)); *c = hwread(vortex->mmio, addr(0x180f8, this04, this08)); } void CA3dSourceHw::SetAtmosState(short a,short b,short c,short d) { hwwrite(vortex->mmio, addr(0x1838C, this04, this08), a); hwwrite(vortex->mmio, addr(0x18390, this04, this08), b); hwwrite(vortex->mmio, addr(0x18394, this04, this08), c); hwwrite(vortex->mmio, addr(0x18398, this04, this08), d); } void CA3dSourceHw::GetAtmosState(short a,short b,short c,short d) { } #define addr2(a,b,c, i) (a + (((this08<<0xb)+i)<<2) + (this04*(5*9*2 - 1)*4*2)) void CA3dSourceHw::SetHrtfTarget(short const *a,short const *b) { int i; for (i=0; i<0x38; i++) hwwrite(vortex->mmio, addr2(0x19100, this04, this08, i), (b[i]<<0x10) | a[i]); } void CA3dSourceHw::GetHrtfTarget(short const *a,short const *b) { } void CA3dSourceHw::SetHrtfCurrent(short const *a,short const *b) { int i; for (i=0; i<0x38; i++) hwwrite(vortex->mmio, addr2(0x19000, this04, this08, i), (b[i]<<0x10) | a[i]); } void CA3dSourceHw::GetHrtfCurrent(short const *a,short const *b) { int i; // FIXME: verify this! for (i=0; i<0x38; i++) a[i] = hwread(vortex->mmio, addr2(0, this04+0xc, this08, i)); for (i=0; i<0x38; i++) b[i] = hwread(vortex->mmio, addr2(0x19000, this04, this08, i)); } void CA3dSourceHw::SetHrtfState(short const *a,short const *b) { int i; for (i=0; i<0x38; i++) hwwrite(vortex->mmio, addr2(0x191e8, this04, this08, i), (b[i]<<0x10) | a[i]); } void CA3dSourceHw::GetHrtfState(short const *a,short const *b) { int i; // FIXME: verify this! for (i=0; i<0x38; i++) a[i] = hwread(vortex->mmio, addr2(0, this04+0x6a, this08, i)); for (i=0; i<0x38; i++) b[i] = hwread(vortex->mmio, addr2(0x191e8, this04, this08, i)); } void CA3dSourceHw::SetItdTarget(short litd,short ritd) { if (litd < 0) litd = 0; if (litd > 0x57FF) litd = 0x57FF; if (ritd < 0) ritd = 0; if (ritd > 0x57FF) ritd = 0x57FF; hwwrite(vortex->mmio, addr(0x191DF+5, this04, this08), (ritd<<0x10)|litd); } void CA3dSourceHw::GetItdTarget(short *litd, short *ritd) { *ritd = hwread(vortex->mmio, addr(0x181E4, this04, this08)); *litd = hwread(vortex->mmio, addr(0x191E4, this04, this08)); } void CA3dSourceHw::SetItdCurrent(short litd, short ritd) { litd = 0; if (litd > 0x57FF) litd = 0x57FF; if (ritd < 0) ritd = 0; if (ritd > 0x57FF) ritd = 0x57FF; hwwrite(vortex->mmio, addr(0x191DF+1, this04, this08), (ritd<<0x10)|litd); } void CA3dSourceHw::GetItdCurrent(short *litd,short *ritd) { *ritd = hwread(vortex->mmio, addr(0x181E0, this04, this08)); *litd = hwread(vortex->mmio, addr(0x191E0, this04, this08)); } void CA3dSourceHw::SetItdDline(short const *dline) { int i; for (i=0; i<0x28; i++) hwwrite(vortex->mmio, addr2(0x182C8, this04, this08, i), dline[i]) } void CA3dSourceHw::GetItdDline(short *dline) { int i; for (i=0; i<0x28; i++) dline[i] = hwwrite(vortex->mmio, addr2(0x182C8, this04, this08, i)); } void CA3dSourceHw::SetGainTarget(short a,short b) { hwwrite(vortex->mmio, addr(0x190E4, this04, this08), (b<<0x10)|a); } void CA3dSourceHw::GetGainTarget(short *,short *) { *b = hwread(vortex->mmio, addr(0x180e4, this04, this08)); *a = hwread(vortex->mmio, addr(0x190e4, this04, this08)); } void CA3dSourceHw::SetGainCurrent(short a,short b) { hwwrite(vortex->mmio, addr(0x190DC+4, this04, this08), (b<<0x10)|a); } void CA3dSourceHw::GetGainCurrent(short *a,short *b) { *b = hwread(vortex->mmio, addr(0x180e0, this04, this08)); *a = hwread(vortex->mmio, addr(0x190e0, this04, this08)); } void CA3dSourceHw::GetHrtfOutput(short *left,short *right) { *left = hwread(vortex->mmio, addr(0x1839C, this04, this08)); *right = hwread(vortex->mmio, addr(0x183A0, this04, this08)); } void CA3dSourceHw::SetHrtfOutput(short left,short right) { hwwrite(vortex->mmio, addr(0x1839C, this04, this08), left); hwwrite(vortex->mmio, addr(0x183a0, this04, this08), right); } void CA3dSourceHw::SetA3DSampleRate(int sr) { int esp0 = 0; esp0 = (((esp0 & 0x7fffffff)|0xB8000000)&0x7) | ((sr&0x1f)<<3); hwwrite(vortex->mmio, 0x19C38 + (this08<<0xd), esp0); } void CA3dSourceHw::GetA3DSampleRate(int *sr) { *sr = ((hwread(vortex->mmio, 0x19C38 + (this08<<0xd))>>3)&0x1f); } void CA3dSourceHw::EnableA3D(void) { hwwrite(vortex->mmio, 19C38 + (this08<<0xd), 0xF0000001); } void CA3dSourceHw::DisableA3D(void) { hwwrite(vortex->mmio, 19C38 + (this08<<0xd), 0xF0000000); } void CA3dSourceHw::SetA3DControlReg(unsigned long ctrl) { hwwrite(vortex->mmio, 19C38 + (this08<<0xd), ctrl); } void CA3dSourceHw::GetA3DControlReg(unsigned long *ctrl) { *ctrl = hwread(vortex->mmio, 19C38 + (this08<<0xd)); } void CA3dSourceHw::SetA3DPointerReg(unsigned long ptr) { hwwrite(vortex->mmio, 19c40 + (this08<<0xd), ctrl); } void CA3dSourceHw::GetA3DPointerReg(unsigned long *ptr) { *ptr = hwread(vortex->mmio, 19C40 + (this08<<0xd)); } void CA3dSourceHw::ZeroSliceIO(void) { int i; for (i=0; i<8; i++) hwwrite(vortex->mmio, 0x19C00 + (((this08<<0xb)+i)*4), 0); for (i=0; i<4; i++) hwwrite(vortex->mmio, 0x19C20 + (((this08<<0xb)+i)*4), 0); } void CA3dSourceHw::ZeroState(void) { int i; CA3dSourceHw::SetAtmosState(0,0,0,0); CA3dSourceHw::SetHrtfState(A3dHrirZeros, A3dHrirZeros); CA3dSourceHw::SetItdDline(A3dItdDlineZeros, A3dItdDlineZeros); CA3dSourceHw::SetHrtfOutput(0, 0); CA3dSourceHw::SetTimeConsts(0,0,0,0); CA3dSourceHw::SetAtmosCurrent(0,0,0,0,0); CA3dSourceHw::SetAtmosTarget(0,0,0,0,0); CA3dSourceHw::SetItdCurrent(0,0); CA3dSourceHw::SetItdTarget(0,0); CA3dSourceHw::SetGainCurrent(0,0); // The guy who originally wrote this surely was smoking crack... CA3dIO::WriteReg(190E4 + (this08<<0xd) + (this04*5*9*2 - this04)*8,0,0); CA3dSourceHw::SetHrtfCurrent(A3dHrirZeros, A3dHrirZeros); CA3dSourceHw::SetHrtfTarget(A3dHrirZeros, A3dHrirZeros) } void CA3dSourceHw::ZeroStateA3D(void) { int i, ii, var, var2; CA3dSourceHw::SetA3DControlReg(0); CA3dSourceHw::SetA3DPointerReg(0); var = this08; var2 = this04; // ?? for (ii=0; ii<4; ii++) { this08 = ii; CA3dSourceHw::ZeroSliceIO(void); CA3dSourceHw::ZeroState(void); } this04 = var2; this08 = var; } void CA3dSourceHw::ProgramPipe(void) { CA3dSourceHw::SetTimeConsts(0,0,0,0); CA3dSourceHw::SetAtmosCurrent(0, 0x4000, 0,0,0); CA3dSourceHw::SetAtmosTarget(0x4000,0,0,0,0); CA3dSourceHw::SetItdCurrent(0,0); CA3dSourceHw::SetItdTarget(0,0); CA3dSourceHw::SetGainCurrent(0x7fff,0x7fff); CA3dSourceHw::SetGainTarget(0x7fff,0x7fff); CA3dSourceHw::SetHrtfCurrent(A3dHrirImpulse, A3dHrirImpulse); CA3dSourceHw::SetHrtfTarget(A3dHrirImpulse, A3dHrirImpulse); } void CA3dSourceHw::ClearVDBData(unsigned long a) { hwwrite(vortex->mmio, 0x19c00 + (((a>>2)*255*4)+a)*8, 0); hwwrite(vortex->mmio, 0x19c04 + (((a>>2)*255*4)+a)*8, 0); } /*CA3dIO*/ void CA3dIO::WriteReg(unsigned long addr, short a, short b) { hwwrite(vortex->mmio, addr, (a<<0x10)|b); } /* CVort3dRend */ void CVort3DRend::CVort3DRend(class CAsp4Core *core,class CAsp4HwIO *hwio) { this00 = core; this04 = hwio; this08 = 0; } void CVort3DRend::~CVort3DRend(void) { if (this08) operator delete(this08); } int CVort3DRend::Initialize(unsigned short a) { if (this00 == 0) return -1; this14 = a; CXtalkHw = operator new(4); CXtalkHw::CXtalkHw(this04); CXtalkHw::SetGains(XtalkGainsAllChan); if (this14) { if (this08==0xffff) CXtalkHw::ProgramXtalkNarrow(void); else CXtalkHw::ProgramXtalkWide(void) } else { CXtalkHw::ProgramPipe(void); } CXtalkHw::SetSampleRate(0x11); CXtalkHw::Enable(void); } int CVort3DRend::SetGlobalControl(struct _XTALKctrl *xtctrl) { if (xtctrl==0) return 0; this0c->this04 = xtctrl->this04; this0c->this08 = xtctrl->this08; this0c->this0c = xtctrl->this0c; this0c = xtctrl->this00; CXtalkHw = this08; if (this14) { if (this08==0xffff) CXtalkHw::ProgramXtalkNarrow(void); else CXtalkHw::ProgramXtalkWide(void) } else { CXtalkHw::ProgramPipe(void); } } int CVort3DRend::GetGlobalControl(struct _XTALKctrl *xtctrl) { } int CVort3DRend::AddBuffer(class CVort3dWave *a) { return 0; } int CVort3DRend::RemoveBuffer(class CVort3dWave *a) { return 0; } /* CVort3dWave */ void CVort3dWave::CVort3dWave(class CAsp4Core *,class CAsp4HwIO *,class CHrtfMgr *) { } //174743 void CVort3DWave::SetLRGains(void) { } int CVort3dWave::Set3dParms(unsigned long offset, unsigned long arg4, void * arg8) { if (offset) return 80070057; if (arg4 == 0xf6) { CVort3dWave::Anzio3dToSuperCtrl((Anzio3d *) arg8, (A3DCTRL_SRC_SUPER *) this_370); CVort3dWave::Set3dParms((A3DCTRL_SRC_SUPER *) this_370); return 0; } if (arg4 == 0x40) { CVort3dWave::Set3dParms((A3DCTRL_SRC_SUPER *) arg8) } } int CVort3dWave::Set3dParms(struct A3DCTRL_SRC_SUPER *) { int var14; struct var0 { int a; short b; char c; }; CAsp4Core = this_318; CAsp4Core::GetProperty((COREPROPERTY) 4, (void *) &var14, (ulong) 4); CAsp4Core::GetProperty((COREPROPERTY) 1, (void *) &var0+0x10, (ulong) 0x10); if ((var0.b != this_354)||(var14 != this_350)) { this_354 = var0.b; this_350 = var14; CHrtfMgr = this_344; if (var14 == 1) { if (var0.b) CHrtfMgr::Initialize((ulong) 0BB80, (ulong) 0x3a, (ulong) 0x102) else CHrtfMgr::Initialize((ulong) 0BB80, (ulong) 2, (ulong) 0x101); } else CHrtfMgr::Initialize((ulong) 0BB80, (ulong) 0x38, (ulong) 0); } if (var14 == 1) { if (var0.b == 0) CVort3dWave::RenderQuadPan((A3DCTRL_SRC_SUPER *) arg0); else CVort3dWave::RenderSuperQuad((A3DCTRL_SRC_SUPER *) arg0); return 0; } eax = CAdbTopology::GetA3DSource(void); if (eax >= 0) CVort3dWave::Render3d((A3DCTRL_SRC_SUPER *) arg0); else CVort3dWave::Render2d((A3DCTRL_SRC_SUPER *) arg0); return 0; } void CVort3dWave::Render2d(struct A3DCTRL_SRC_SUPER *) { CVort3dWave::Calc2d(A3DCTRL_EAR *,A3DCTRL_EAR *,float,ulong *,_ASPVOLUME *); CVort3dWave::SetLRGains(void); CAdbTopology::SetFilter(ulong); } void CVort3dWave::Render3d(struct A3DCTRL_SRC_SUPER *) { CA3dSourceHw::SetAtmosTarget(short,short,short,short,short); CA3dSourceHw::SetAtmosCurrent(short,short,short,short,short); CVort3dWave::SetLRGains(void); CA3dSourceHw::SetHrtfTarget(short const *,short const *); CA3dSourceHw::SetHrtfCurrent(short const *,short const *) CA3dSourceHw::SetItdTarget(short,short); } void CVort3dWave::RenderQuadPan(struct A3DCTRL_SRC_SUPER *) { } void CAdbTopology::SetFilter(unsigned long) { //line 101587 }