diff --git a/src/platform/3do/ccbMap3.s b/src/platform/3do/ccbMap3.s new file mode 100644 index 0000000..28daf2a --- /dev/null +++ b/src/platform/3do/ccbMap3.s @@ -0,0 +1,73 @@ + AREA |C$$code|, CODE, READONLY +|x$codeseg| + + EXPORT ccbMap3_asm + +ccbMap3_asm + +face RN r0 +vp0 RN r1 +vp1 RN r2 +vp2 RN r3 + +vx0 RN vp0 +vy0 RN vp1 +xpos RN vx0 +ypos RN vy0 + +vx1 RN vp2 +vy1 RN r4 +hdx0 RN vx1 +hdy0 RN vy1 + +vx2 RN r5 +vy2 RN r6 +vdx0 RN vx2 +vdy0 RN vy2 + +ws RN r12 +hs RN lr +shift RN hs + +hddx RN ws +hddy RN hs + +FRAME_WIDTH EQU 320 +FRAME_HEIGHT EQU 240 + + stmfd sp!, {r4-r6, lr} + + add face, face, #16 ; offset to ccb_XPos + ldr shift, [sp, #16] ; skip 4 regs stored on the stack + ldmia vp2, {vx2, vy2} + ldmia vp1, {vx1, vy1} + ldmia vp0, {vx0, vy0} + + and ws, shift, #0xFF + mov hs, shift, lsr #8 + + sub hdx0, vx1, vx0 + sub hdy0, vy1, vy0 + mov hdx0, hdx0, lsl ws + mov hdy0, hdy0, lsl ws + + sub vdx0, vx2, vx0 + sub vdy0, vy2, vy0 + mov vdx0, vdx0, lsl hs + mov vdy0, vdy0, lsl hs + + rsb hs, hs, #16 + mov hddx, hdx0, asr hs + mov hddy, hdy0, asr hs + rsb hddx, hddx, #0 + rsb hddy, hddy, #0 + + mov xpos, vx0, lsl #16 + mov ypos, vy0, lsl #16 + add xpos, xpos, #(FRAME_WIDTH << 15) + add ypos, ypos, #(FRAME_HEIGHT << 15) + + stmia face, {xpos, ypos, hdx0, hdy0, vdx0, vdy0, hddx, hddy} + + ldmfd sp!, {r4-r6, pc} + END diff --git a/src/platform/3do/ccbMap4.s b/src/platform/3do/ccbMap4.s new file mode 100644 index 0000000..ff4a207 --- /dev/null +++ b/src/platform/3do/ccbMap4.s @@ -0,0 +1,85 @@ + AREA |C$$code|, CODE, READONLY +|x$codeseg| + + EXPORT ccbMap4_asm + +ccbMap4_asm + +face RN r0 +vp0 RN r1 +vp1 RN r2 +vp2 RN r3 +vp3 RN r4 + +vx0 RN vp0 +vy0 RN vp1 +xpos RN vx0 +ypos RN vy0 + +vx1 RN vp2 +vy1 RN vp3 +hdx0 RN vx1 +hdy0 RN vy1 + +vx3 RN r5 +vy3 RN r6 +vdx0 RN vx3 +vdy0 RN vy3 + +vx2 RN r7 +vy2 RN r8 +hdx1 RN vx2 +hdy1 RN vy2 +hddx RN hdx1 +hddy RN hdy1 + +ws RN r12 +hs RN lr +shift RN hs + +FRAME_WIDTH EQU 320 +FRAME_HEIGHT EQU 240 + + stmfd sp!, {r4-r8, lr} + + add face, face, #16 ; offset to ccb_XPos + add shift, sp, #24 ; skip 6 regs stored on the stack + ldmia shift, {vp3, shift} + ldmia vp3, {vx3, vy3} + ldmia vp2, {vx2, vy2} + ldmia vp1, {vx1, vy1} + ldmia vp0, {vx0, vy0} + + and ws, shift, #0xFF + mov hs, shift, lsr #8 + + sub hdx1, vx2, vx3 + sub hdy1, vy2, vy3 + mov hdx1, hdx1, lsl ws + mov hdy1, hdy1, lsl ws + + sub hdx0, vx1, vx0 + sub hdy0, vy1, vy0 + mov hdx0, hdx0, lsl ws + mov hdy0, hdy0, lsl ws + + sub vdx0, vx3, vx0 + sub vdy0, vy3, vy0 + mov vdx0, vdx0, lsl hs + mov vdy0, vdy0, lsl hs + + rsb hs, hs, #16 + sub hddx, hdx1, hdx0 + sub hddy, hdy1, hdy0 + mov hddx, hddx, asr hs + mov hddy, hddy, asr hs + + mov xpos, vx0, lsl #16 + mov ypos, vy0, lsl #16 + add xpos, xpos, #(FRAME_WIDTH << 15) + add ypos, ypos, #(FRAME_HEIGHT << 15) + + stmia face, {xpos, ypos, hdx0, hdy0, vdx0, vdy0, hddx, hddy} + + ldmfd sp!, {r4-r8, pc} + END diff --git a/src/platform/3do/render_cel.cpp b/src/platform/3do/render_cel.cpp index 5ddcb85..d0f6bff 100644 --- a/src/platform/3do/render_cel.cpp +++ b/src/platform/3do/render_cel.cpp @@ -185,14 +185,22 @@ enum ClipFlags { #define unpackRoom unpackRoom_asm #define unpackMesh unpackMesh_asm #define projectVertices projectVertices_asm + #define ccbMap4 ccbMap4_asm + #define ccbMap3 ccbMap3_asm - extern "C" void unpackRoom_asm(const RoomVertex* vertices, int32 vCount); - extern "C" void unpackMesh_asm(const MeshVertex* vertices, int32 vCount); - extern "C" void projectVertices_asm(int32 vCount); + extern "C" { + void unpackRoom_asm(const RoomVertex* vertices, int32 vCount); + void unpackMesh_asm(const MeshVertex* vertices, int32 vCount); + void projectVertices_asm(int32 vCount); + void ccbMap4_asm(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, const Vertex* v3, uint32 shift); + void ccbMap3_asm(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, uint32 shift); + } #else #define unpackRoom unpackRoom_c #define unpackMesh unpackMesh_c #define projectVertices projectVertices_c + #define ccbMap4 ccbMap4_c + #define ccbMap3 ccbMap3_c void unpackRoom_c(const RoomVertex* vertices, int32 vCount) { @@ -296,6 +304,79 @@ void projectVertices_c(int32 vCount) v++; } while (v < last); } + +void ccbMap4_c(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, const Vertex* v3, uint32 shift) +{ + int32 x1 = v1->x; + int32 y1 = v1->y; + int32 x3 = v3->x; + int32 y3 = v3->y; + int32 x2 = v2->x; + int32 y2 = v2->y; + int32 x0 = v0->x; + int32 y0 = v0->y; + + uint32 ws = shift & 0xFF; + uint32 hs = shift >> 8; + + int32 hdx0 = (x1 - x0) << ws; + int32 hdy0 = (y1 - y0) << ws; + int32 hdx1 = (x2 - x3) << ws; + int32 hdy1 = (y2 - y3) << ws; + int32 vdx0 = (x3 - x0) << hs; + int32 vdy0 = (y3 - y0) << hs; + + hs = 16 - hs; + int32 hddx = (hdx1 - hdx0) >> hs; + int32 hddy = (hdy1 - hdy0) >> hs; + + f->ccb_XPos = (x0 << 16) + (FRAME_WIDTH << 15); + f->ccb_YPos = (y0 << 16) + (FRAME_HEIGHT << 15); + + f->ccb_HDX = hdx0; + f->ccb_HDY = hdy0; + f->ccb_VDX = vdx0; + f->ccb_VDY = vdy0; + f->ccb_HDDX = hddx; + f->ccb_HDDY = hddy; + +#ifdef DEBUG_CLIPPING + f->ccb_PIXC = SHADE_SHADOW; +#endif +} + +void ccbMap3_c(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, uint32 shift) +{ + int32 x0 = v0->x; + int32 y0 = v0->y; + int32 x1 = v1->x; + int32 y1 = v1->y; + int32 x2 = v2->x; + int32 y2 = v2->y; + + uint32 ws = shift & 0xFF; + uint32 hs = shift >> 8; + + int32 hdx0 = (x1 - x0) << ws; + int32 hdy0 = (y1 - y0) << ws; + int32 vdx0 = (x2 - x0) << hs; + int32 vdy0 = (y2 - y0) << hs; + + f->ccb_XPos = (x0 << 16) + (FRAME_WIDTH << 15); + f->ccb_YPos = (y0 << 16) + (FRAME_HEIGHT << 15); + f->ccb_HDX = hdx0; + f->ccb_HDY = hdy0; + f->ccb_VDX = vdx0; + f->ccb_VDY = vdy0; + + hs = 16 - hs; + f->ccb_HDDX = -hdx0 >> hs; + f->ccb_HDDY = -hdy0 >> hs; + +#ifdef DEBUG_CLIPPING + f->ccb_PIXC = SHADE_SHADOW; +#endif +} #endif bool transformBoxRect(const AABBs* box, RectMinMax* rect) @@ -441,82 +522,6 @@ X_INLINE void ccbSetColor(uint32 flags, Face* face) face->ccb_SourcePtr = (CelData*)&gPalette[flags & 0xFF]; } -extern "C" void ccbMap4_asm(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, const Vertex* v3, uint32 shift); -//#define ccbMap4 ccbMap4_asm -#define ccbMap4 ccbMap4_c - -X_INLINE void ccbMap4_c(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, const Vertex* v3, uint32 shift) -{ - int32 x1 = v1->x; - int32 y1 = v1->y; - int32 x3 = v3->x; - int32 y3 = v3->y; - int32 x2 = v2->x; - int32 y2 = v2->y; - int32 x0 = v0->x; - int32 y0 = v0->y; - - uint32 ws = shift & 0xFF; - uint32 hs = shift >> 8; - - int32 hdx0 = (x1 - x0) << ws; - int32 hdy0 = (y1 - y0) << ws; - int32 hdx1 = (x2 - x3) << ws; - int32 hdy1 = (y2 - y3) << ws; - int32 vdx0 = (x3 - x0) << hs; - int32 vdy0 = (y3 - y0) << hs; - - hs = 16 - hs; - int32 hddx = (hdx1 - hdx0) >> hs; - int32 hddy = (hdy1 - hdy0) >> hs; - - f->ccb_XPos = (x0 << 16) + (((FRAME_WIDTH >> 1) << 16) + 32768); - f->ccb_YPos = (y0 << 16) + (((FRAME_HEIGHT >> 1) << 16) + 32768); - f->ccb_HDX = hdx0; - f->ccb_HDY = hdy0; - f->ccb_VDX = vdx0; - f->ccb_VDY = vdy0; - f->ccb_HDDX = hddx; - f->ccb_HDDY = hddy; - -#ifdef DEBUG_CLIPPING - f->ccb_PIXC = SHADE_SHADOW; -#endif -} - -X_INLINE void ccbMap3(Face* f, const Vertex* v0, const Vertex* v1, const Vertex* v2, uint32 shift) -{ - int32 x0 = v0->x; - int32 y0 = v0->y; - int32 x1 = v1->x; - int32 y1 = v1->y; - int32 x2 = v2->x; - int32 y2 = v2->y; - - uint32 ws = shift & 0xFF; - uint32 hs = shift >> 8; - - int32 hdx0 = (x1 - x0) << ws; - int32 hdy0 = (y1 - y0) << ws; - int32 vdx0 = (x2 - x0) << hs; - int32 vdy0 = (y2 - y0) << hs; - - f->ccb_XPos = (x0 << 16) + (((FRAME_WIDTH >> 1) << 16) + 32768); - f->ccb_YPos = (y0 << 16) + (((FRAME_HEIGHT >> 1) << 16) + 32768); - f->ccb_HDX = hdx0; - f->ccb_HDY = hdy0; - f->ccb_VDX = vdx0; - f->ccb_VDY = vdy0; - - hs = 16 - hs; - f->ccb_HDDX = -hdx0 >> hs; - f->ccb_HDDY = -hdy0 >> hs; - -#ifdef DEBUG_CLIPPING - f->ccb_PIXC = SHADE_SHADOW; -#endif -} - X_INLINE void faceAddRoomQuad(uint32 flags, const Index* indices) { uint32 i01 = ((uint32*)indices)[0]; diff --git a/src/platform/3do/sound.cpp b/src/platform/3do/sound.cpp index d411c65..5bde0db 100644 --- a/src/platform/3do/sound.cpp +++ b/src/platform/3do/sound.cpp @@ -133,9 +133,6 @@ void sndInit() ConnectInstruments(ch->sampler, "Output", sndMixer, InputName); } - if (ch->sampler < 0) - printf("FUCK!\n"); - ch->frequency = GrabKnob(ch->sampler, "Frequency"); ch->amplitude = GrabKnob(ch->sampler, "Amplitude"); ch->setVolume(0x7FFF);