From a311245b8157585bba44f1742a0263a101978cbc Mon Sep 17 00:00:00 2001 From: XProger Date: Sat, 26 Nov 2022 01:22:44 +0300 Subject: [PATCH] #368 GBA mul (8-bit for rooms), div, branch & loads optims --- src/fixed/camera.h | 18 +++- src/fixed/common.cpp | 5 +- src/fixed/common.h | 16 ++- src/fixed/draw.h | 12 +-- src/fixed/game.h | 7 +- src/fixed/inventory.h | 7 +- src/fixed/item.h | 57 +++++++++-- src/fixed/lara.h | 6 +- src/fixed/room.h | 36 ++++--- src/platform/gba/Makefile | 13 --- src/platform/gba/asm/common_asm.inc | 22 ++--- src/platform/gba/asm/faceAddMeshQuads.s | 3 +- src/platform/gba/asm/flush.s | 10 +- src/platform/gba/asm/matrixTranslate.s | 43 +++++--- src/platform/gba/asm/rasterizeF.s | 31 +++--- src/platform/gba/asm/rasterizeFT.s | 39 ++++---- src/platform/gba/asm/rasterizeFTA.s | 39 ++++---- src/platform/gba/asm/rasterizeGT.s | 70 +++++++------ src/platform/gba/asm/rasterizeGTA.s | 70 +++++++------ src/platform/gba/asm/rasterizeS.s | 30 +++--- src/platform/gba/asm/sphereIsVisible.s | 4 +- src/platform/gba/asm/transformRoom.s | 24 ++--- src/platform/gba/asm/transformRoomUW.s | 26 ++--- src/platform/gba/data/GYM.PKD | Bin 1463808 -> 1463808 bytes src/platform/gba/data/LEVEL1.PKD | Bin 2365360 -> 2365360 bytes src/platform/gba/data/LEVEL2.PKD | Bin 2624600 -> 2624600 bytes src/platform/gba/data/TITLE.PKD | Bin 313260 -> 313260 bytes src/platform/gba/rasterizer.h | 126 +----------------------- src/platform/gba/render.iwram.cpp | 67 +++++-------- 29 files changed, 353 insertions(+), 428 deletions(-) diff --git a/src/fixed/camera.h b/src/fixed/camera.h index 4761c412..fc4b271a 100644 --- a/src/fixed/camera.h +++ b/src/fixed/camera.h @@ -223,8 +223,20 @@ void Camera::move(Location &to, int32 speed) vec3i d = to.pos - view.pos; - if (speed > 1) { - d /= speed; + if (speed > 1) + { + if (speed == 8) + { + d.x >>= 3; + d.y >>= 3; + d.z >>= 3; + } + else + { + d.x /= speed; + d.y /= speed; + d.z /= speed; + } } view.pos += d; @@ -295,7 +307,7 @@ void Camera::updateFollow(ItemObj* item) Location best = getBestLocation(false); - move(best, lastFixed ? speed : 12); + move(best, lastFixed ? speed : 8); } void Camera::updateCombat(ItemObj* item) diff --git a/src/fixed/common.cpp b/src/fixed/common.cpp index 6b1d345c..84d104ab 100644 --- a/src/fixed/common.cpp +++ b/src/fixed/common.cpp @@ -1025,7 +1025,7 @@ int32 phd_atan(int32 x, int32 y) swap(x, y); } - return abs(atanTable[(y << 11) / x] + atanOctant[o]); + return abs(atanTable[(y << 11) / x] + atanOctant[o]); //@DIV } uint32 phd_sqrt(uint32 x) @@ -1552,7 +1552,8 @@ void palSet(const uint16* palette, int32 gamma, int32 bright) if (gamma || bright) { - uint16* tmp = (uint16*)&gSpheres; + //STATIC_ASSERT(sizeof(gSpheres) >= 512); + uint16* tmp = (uint16*)gSpheres; if (gamma) { palGamma(pal, tmp, gamma); diff --git a/src/fixed/common.h b/src/fixed/common.h index 5f469b0c..8119669e 100644 --- a/src/fixed/common.h +++ b/src/fixed/common.h @@ -336,8 +336,10 @@ X_INLINE int32 abs(int32 x) { #if defined(__WIN32__) || defined(__GBA_WIN__) #define ASSERT(x) { if (!(x)) { DebugBreak(); } } + #define STATIC_ASSERT(x) typedef char static_assert_##__COUNTER__[(x) ? 1 : -1] #else #define ASSERT(x) + #define STATIC_ASSERT(x) #endif #if defined(__GBA_WIN__) @@ -590,13 +592,11 @@ struct vec3i { X_INLINE vec3i operator + (const vec3i &v) const { return create(x + v.x, y + v.y, z + v.z); } X_INLINE vec3i operator - (const vec3i &v) const { return create(x - v.x, y - v.y, z - v.z); } X_INLINE vec3i operator * (int32 s) const { return create(x * s, y * s, z * s); } - X_INLINE vec3i operator / (int32 s) const { return create(x / s, y / s, z / s); } X_INLINE bool operator == (const vec3i &v) const { return x == v.x && y == v.y && z == v.z; } X_INLINE bool operator != (const vec3i &v) const { return x != v.x || y != v.y || z != v.z; } X_INLINE vec3i& operator += (const vec3i &v) { x += v.x; y += v.y; z += v.z; return *this; } X_INLINE vec3i& operator -= (const vec3i &v) { x -= v.x; y -= v.y; z -= v.z; return *this; } X_INLINE vec3i& operator *= (int32 s) { x *= s; y *= s; z *= s; return *this; } - X_INLINE vec3i& operator /= (int32 s) { x /= s; y /= s; z /= s; return *this; } }; #define _vec3i(x,y,z) vec3i::create(x, y, z) @@ -2774,11 +2774,20 @@ void matrixFrame(const void* pos, const void* angles); void matrixFrameLerp(const void* pos, const void* anglesA, const void* anglesB, int32 delta, int32 rate); void matrixSetView(const vec3i &pos, int32 angleX, int32 angleY); +#if defined(__GBA__) || defined(__GBA_WIN__) +#define renderInit() +#define renderFree() +#define renderSwap() +#define renderLevelInit() +#define renderLevelFree() +#else void renderInit(); void renderFree(); void renderSwap(); void renderLevelInit(); void renderLevelFree(); +#endif + void setViewport(const RectMinMax &vp); void setPaletteIndex(int32 index); void clear(); @@ -2787,7 +2796,8 @@ void renderMesh(const Mesh* mesh); void renderShadow(int32 x, int32 z, int32 sx, int32 sz); void renderSprite(int32 vx, int32 vy, int32 vz, int32 vg, int32 index); void renderGlyph(int32 vx, int32 vy, int32 index); -void renderBorder(int32 x, int32 y, int32 width, int32 height, int32 shade, int32 color1, int32 color2, int32 z); +void renderFill(int32 x, int32 y, int32 width, int32 height, int32 shade, int32 z); +void renderBorder(int32 x, int32 y, int32 width, int32 height, int32 color1, int32 color2, int32 z); void renderBar(int32 x, int32 y, int32 width, int32 value, BarType type); void renderBackground(const void* background); void* copyBackground(); diff --git a/src/fixed/draw.h b/src/fixed/draw.h index e526ed9a..75a23455 100644 --- a/src/fixed/draw.h +++ b/src/fixed/draw.h @@ -348,7 +348,7 @@ void drawNodesLerp(const ItemObj* item, const AnimFrame* frameA, const AnimFrame #define DEF_TORSO_ANGLE_Y -832 #define DEF_TORSO_ANGLE_Z -192 -const uint32 ZERO_POS[2] = { 0, 0 }; +uint32 ZERO_POS[2] = { 0, 0 }; void drawLaraNodes(const ItemObj* lara, const AnimFrame* frameA) { @@ -433,7 +433,7 @@ void drawLaraNodes(const ItemObj* lara, const AnimFrame* frameA) matrixSetBasis(matrixGet(), basis); matrixRotateYXZ(arm->angle.x, arm->angle.y, arm->angle.z); } - matrixFrame(&ZERO_POS, anglesArm[i]++); + matrixFrame(ZERO_POS, anglesArm[i]++); drawMesh(*mesh++); { // JOINT_ARM_2 @@ -571,9 +571,9 @@ void drawLaraNodesLerp(const ItemObj* lara, const AnimFrame* frameA, const AnimF bool useLerp = frameRateArm[i] > 1; // armed hands always use frameRate == 1 (i.e. useLerp == false) if (useLerp) { - matrixFrameLerp(&ZERO_POS, anglesArmA[i]++, anglesArmB[i]++, frameDelta, frameRate); + matrixFrameLerp(ZERO_POS, anglesArmA[i]++, anglesArmB[i]++, frameDelta, frameRate); } else { - matrixFrame(&ZERO_POS, anglesArmA[i]++); + matrixFrame(ZERO_POS, anglesArmA[i]++); } drawMesh(*mesh++); @@ -920,9 +920,9 @@ void drawFPS() drawText(2, 16, buf, TEXT_ALIGN_LEFT); } +#ifdef PROFILING void drawProfiling() { -#ifdef PROFILING for (int32 i = 0; i < CNT_MAX; i++) { char buf[32]; @@ -930,7 +930,7 @@ void drawProfiling() drawText(2, 16 + 32 + i * 16, buf, TEXT_ALIGN_LEFT); } flush(); -#endif } +#endif #endif diff --git a/src/fixed/game.h b/src/fixed/game.h index 135a691c..f7023f3a 100644 --- a/src/fixed/game.h +++ b/src/fixed/game.h @@ -356,10 +356,11 @@ void gameRender() flush(); } +#ifdef PROFILING drawProfiling(); - -#ifndef PROFILE_SOUNDTIME - PROFILE_CLEAR(); + #ifndef PROFILE_SOUNDTIME + PROFILE_CLEAR(); + #endif #endif } diff --git a/src/fixed/inventory.h b/src/fixed/inventory.h index 97687e56..46898091 100644 --- a/src/fixed/inventory.h +++ b/src/fixed/inventory.h @@ -283,6 +283,7 @@ struct Inventory case ITEM_SCION_PICKUP_QUALOPEC : case ITEM_SCION_PICKUP_DROP : case ITEM_SCION_PICKUP_HOLDER : return ITEM_INV_SCION; + default : ; } return type; } @@ -313,6 +314,7 @@ struct Inventory case ITEM_KEYHOLE_2 : return SLOT_KEY_ITEM_2; case ITEM_KEYHOLE_3 : return SLOT_KEY_ITEM_3; case ITEM_KEYHOLE_4 : return SLOT_KEY_ITEM_4; + default : ; } return SLOT_MAX; } @@ -1306,7 +1308,8 @@ struct Inventory int32 h = optionsHeight; int32 y = (FRAME_HEIGHT - h) / 2 - 12; - renderBorder((FRAME_WIDTH - w) / 2, y, w, h, 25, 14, 10, 2); + renderFill((FRAME_WIDTH - w) / 2 + 1, y + 1, w - 2, h - 2, 25, 2); + renderBorder((FRAME_WIDTH - w) / 2, y, w, h, 14, 10, 2); w -= 4; h = 18; @@ -1317,7 +1320,7 @@ struct Inventory const Option &opt = options[i]; if (optionIndex == i) { - renderBorder((FRAME_WIDTH - w) / 2, y, w, h, -1, 15, 15, 1); + renderBorder((FRAME_WIDTH - w) / 2, y, w, h, 15, 15, 1); } switch (opt.type) diff --git a/src/fixed/item.h b/src/fixed/item.h index a4d7b6da..3a104dd4 100644 --- a/src/fixed/item.h +++ b/src/fixed/item.h @@ -113,6 +113,13 @@ int32 ItemObj::getFrames(const AnimFrame* &frameA, const AnimFrame* &frameB, int { const Anim* anim = level.anims + animIndex; + if (anim->frameBegin == anim->frameEnd) + { + frameA = frameB = (AnimFrame*)(level.animFrames + (anim->frameOffset >> 1)); + animFrameRate = 1; + return 0; + } + animFrameRate = anim->frameRate; int32 frameSize = (sizeof(AnimFrame) >> 1) + (level.models[type].count << 1); @@ -122,9 +129,31 @@ int32 ItemObj::getFrames(const AnimFrame* &frameA, const AnimFrame* &frameB, int // int32 d = FixedInvU(animFrameRate); // int32 indexA = frame * d >> 16; - int32 indexA = frame / animFrameRate; - int32 frameDelta = frame - indexA * animFrameRate; - int32 indexB = indexA + 1; + int32 indexA, indexB; + int32 frameDelta; + + if (animFrameRate == 1) + { + indexA = frame; + frameDelta = frame - indexA; + } + else if (animFrameRate == 2) + { + indexA = frame >> 1; + frameDelta = frame - (indexA << 1); + } + else if (animFrameRate == 4) + { + indexA = frame >> 2; + frameDelta = frame - (indexA << 2); + } + else + { + indexA = frame / animFrameRate; + frameDelta = frame - (indexA * animFrameRate); + } + + indexB = indexA + 1; if (indexB * animFrameRate >= anim->frameEnd) { @@ -414,8 +443,9 @@ void ItemObj::animSkip(int32 stateBefore, int32 stateAfter, bool advance) goalState = stateAfter; } -#define ANIM_MOVE_LERP_POS (16) -#define ANIM_MOVE_LERP_ROT ANGLE(2) +#define ANIM_MOVE_LERP_POS_SHIFT 4 +#define ANIM_MOVE_LERP_POS (1 << ANIM_MOVE_LERP_POS_SHIFT) +#define ANIM_MOVE_LERP_ROT ANGLE(2) void ItemObj::animProcess(bool movement) { @@ -488,11 +518,20 @@ bool ItemObj::moveTo(const vec3i &point, ItemObj* item, bool lerp) vec3i posDelta = p - pos; - int32 dist = phd_sqrt(X_SQR(posDelta.x) + X_SQR(posDelta.y) + X_SQR(posDelta.z)); + int32 dist = X_SQR(posDelta.x) + X_SQR(posDelta.y) + X_SQR(posDelta.z); - if (dist > ANIM_MOVE_LERP_POS) { - pos += (posDelta * ANIM_MOVE_LERP_POS) / dist; - } else { + if (dist > ANIM_MOVE_LERP_POS * ANIM_MOVE_LERP_POS) + { + dist = phd_sqrt(dist) >> 1; + ASSERT(dist < DIV_TABLE_SIZE); + dist = FixedInvU(dist); + + pos.x += posDelta.x * dist >> (16 + 1 - ANIM_MOVE_LERP_POS_SHIFT); + pos.y += posDelta.y * dist >> (16 + 1 - ANIM_MOVE_LERP_POS_SHIFT); + pos.z += posDelta.z * dist >> (16 + 1 - ANIM_MOVE_LERP_POS_SHIFT); + } + else + { pos = p; } diff --git a/src/fixed/lara.h b/src/fixed/lara.h index a525abc0..846ca623 100644 --- a/src/fixed/lara.h +++ b/src/fixed/lara.h @@ -3293,8 +3293,8 @@ struct Lara : ItemObj if (frame) { if (anim == ANIM_PISTOLS_AIM) { - arm->angle.x -= arm->angle.x / frame; - arm->angle.y -= arm->angle.y / frame; + arm->angle.x -= arm->angle.x / frame; // @DIV + arm->angle.y -= arm->angle.y / frame; // @DIV } if (anim == ANIM_PISTOLS_FIRE) { @@ -3620,7 +3620,7 @@ struct Lara : ItemObj const AABBs &box = target->getBoundingBox(false); vec3i p; p.x = (box.minX + box.maxX) >> 1; - p.y = box.minY + (box.maxY - box.minY) / 3; + p.y = box.minY + (box.maxY - box.minY) / 3; // @DIV p.z = (box.minZ + box.maxZ) >> 1; int32 s, c; sincos(target->angle.y, s, c); diff --git a/src/fixed/room.h b/src/fixed/room.h index cb7d3d54..8ca07d36 100644 --- a/src/fixed/room.h +++ b/src/fixed/room.h @@ -667,8 +667,12 @@ bool traceX(const Location &from, Location &to, bool accurate) if (!d.x) return true; - d.y = (d.y << TRACE_SHIFT) / d.x; - d.z = (d.z << TRACE_SHIFT) / d.x; + int32 dx = abs(d.x) >> 3; + ASSERT(dx < DIV_TABLE_SIZE); + dx = FixedInvU(dx); + + d.y = (d.y * dx) >> (16 + 3 - TRACE_SHIFT); + d.z = (d.z * dx) >> (16 + 3 - TRACE_SHIFT); vec3i p = from.pos; @@ -676,10 +680,10 @@ bool traceX(const Location &from, Location &to, bool accurate) if (d.x < 0) { - d.x = 1024; + d.x = -1024; p.x &= ~1023; - p.y += d.y * (p.x - from.pos.x) >> TRACE_SHIFT; - p.z += d.z * (p.x - from.pos.x) >> TRACE_SHIFT; + p.y -= d.y * (p.x - from.pos.x) >> TRACE_SHIFT; + p.z -= d.z * (p.x - from.pos.x) >> TRACE_SHIFT; while (p.x > to.pos.x) { @@ -690,7 +694,7 @@ bool traceX(const Location &from, Location &to, bool accurate) TRACE_CHECK(nextRoom, p.x - 1, p.y, p.z); room = nextRoom; - p -= d; + p += d; } } else @@ -725,8 +729,12 @@ bool traceZ(const Location &from, Location &to, bool accurate) if (!d.z) return true; - d.x = (d.x << TRACE_SHIFT) / d.z; - d.y = (d.y << TRACE_SHIFT) / d.z; + int32 dz = abs(d.z) >> 3; + ASSERT(dz < DIV_TABLE_SIZE); + dz = FixedInvU(dz); + + d.x = (d.x * dz) >> (16 + 3 - TRACE_SHIFT); + d.y = (d.y * dz) >> (16 + 3 - TRACE_SHIFT); vec3i p = from.pos; @@ -734,10 +742,10 @@ bool traceZ(const Location &from, Location &to, bool accurate) if (d.z < 0) { - d.z = 1024; + d.z = -1024; p.z &= ~1023; - p.x += d.x * (p.z - from.pos.z) >> TRACE_SHIFT; - p.y += d.y * (p.z - from.pos.z) >> TRACE_SHIFT; + p.x -= d.x * (p.z - from.pos.z) >> TRACE_SHIFT; + p.y -= d.y * (p.z - from.pos.z) >> TRACE_SHIFT; while (p.z > to.pos.z) { @@ -748,7 +756,7 @@ bool traceZ(const Location &from, Location &to, bool accurate) TRACE_CHECK(nextRoom, p.x, p.y, p.z - 1); room = nextRoom; - p -= d; + p += d; } } else @@ -816,8 +824,8 @@ bool trace(const Location &from, Location &to, bool accurate) { to.pos.y = h; h -= from.pos.y; - to.pos.x = from.pos.x + (to.pos.x - from.pos.x) * h / dy; - to.pos.z = from.pos.z + (to.pos.z - from.pos.z) * h / dy; + to.pos.x = from.pos.x + (to.pos.x - from.pos.x) * h / dy; // @DIV + to.pos.z = from.pos.z + (to.pos.z - from.pos.z) * h / dy; // @DIV return false; } } diff --git a/src/platform/gba/Makefile b/src/platform/gba/Makefile index e8d4d583..01bc272c 100644 --- a/src/platform/gba/Makefile +++ b/src/platform/gba/Makefile @@ -25,7 +25,6 @@ BUILD := build SOURCES := ../../fixed . asm INCLUDES := include . ../../fixed DATA := data -MUSIC := LIBTONC := $(DEVKITPRO)/libtonc #--------------------------------------------------------------------------------- @@ -81,11 +80,6 @@ CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) -ifneq ($(strip $(MUSIC)),) - export AUDIOFILES := $(foreach dir,$(notdir $(wildcard $(MUSIC)/*.*)),$(CURDIR)/$(MUSIC)/$(dir)) - BINFILES += soundbank.bin -endif - #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C #--------------------------------------------------------------------------------- @@ -146,13 +140,6 @@ $(OFILES_SOURCES) : $(HFILES) # for each extension used in the data directories #--------------------------------------------------------------------------------- -#--------------------------------------------------------------------------------- -# rule to build soundbank from music files -#--------------------------------------------------------------------------------- -soundbank.bin soundbank.h : $(AUDIOFILES) -#--------------------------------------------------------------------------------- - @mmutil $^ -osoundbank.bin -hsoundbank.h - %.PKD.o %_PKD.h : %.PKD @echo $(notdir $<) @$(bin2o) diff --git a/src/platform/gba/asm/common_asm.inc b/src/platform/gba/asm/common_asm.inc index 984f8ce5..3ed7fbc3 100644 --- a/src/platform/gba/asm/common_asm.inc +++ b/src/platform/gba/asm/common_asm.inc @@ -107,32 +107,30 @@ // vx2 - vg2 // vy2 - vg2 .macro CCW skip - ldrsh vx0, [vp0, #VERTEX_X] - ldrsh vy0, [vp0, #VERTEX_Y] + ldr vy0, [vp0, #VERTEX_X] // yyxx + mov vx0, vy0, lsl #16 ldrsh vx2, [vp2, #VERTEX_X] ldrsh vy1, [vp1, #VERTEX_Y] - rsb vx2, vx2, vx0 // reverse order for mla - sub vy1, vy1, vy0 + rsb vx2, vx2, vx0, asr #16 // reverse order for mla + sub vy1, vy1, vy0, asr #16 mul vy1, vx2, vy1 ldrsh vx1, [vp1, #VERTEX_X] - sub vx0, vx1, vx0 + sub vx0, vx1, vx0, asr #16 ldrsh vy2, [vp2, #VERTEX_Y] - sub vy0, vy2, vy0 + sub vy0, vy2, vy0, asr #16 mlas vy1, vx0, vy0, vy1 ble \skip .endm -.macro scaleUV uv, tmp, f - asr \tmp, \uv, #16 - mul \tmp, \f // u = f * int16(uv >> 16) +.macro scaleUV uv, tmp, tmp2, f + smull \tmp2, \tmp, \uv, \f // u = (f * uv) >> 32 lsl \uv, #16 asr \uv, #16 mul \uv, \f // v = f * int16(uv) + lsr \uv, #16 - lsr \tmp, #16 - lsl \tmp, #16 - orr \uv, \tmp, \uv, lsr #16 // uv = (u & 0xFFFF0000) | (v >> 16) + orr \uv, \uv, \tmp, lsl #16 // uv = (u & 0xFFFF0000) | (v >> 16) .endm .macro tex index, uv diff --git a/src/platform/gba/asm/faceAddMeshQuads.s b/src/platform/gba/asm/faceAddMeshQuads.s index 54111411..a70d5818 100644 --- a/src/platform/gba/asm/faceAddMeshQuads.s +++ b/src/platform/gba/asm/faceAddMeshQuads.s @@ -58,10 +58,11 @@ faceAddMeshQuads_asm: add vp0, vp, vp0, lsl #3 add vp1, vp, vp1, lsl #3 add vp2, vp, vp2, lsl #3 - add vp3, vp, vp3, lsl #3 CCW .skip + add vp3, vp, vp3, lsl #3 + // fetch [c, g, zz] ldr vg0, [vp0, #VERTEX_Z] ldr vg1, [vp1, #VERTEX_Z] diff --git a/src/platform/gba/asm/flush.s b/src/platform/gba/asm/flush.s index 97ab1cc3..d5bb3c2b 100644 --- a/src/platform/gba/asm/flush.s +++ b/src/platform/gba/asm/flush.s @@ -106,9 +106,6 @@ flush_asm: cmp face, #0 beq .next_ot // list is empty, go next - mov zero, #0 - str zero, [list, #4] // reset the list pointer in OT - .loop_list: ldmia face, {flags, face, index01, index23} // read face params and next face @@ -178,7 +175,7 @@ flush_asm: // r1 = ptr tst face, face adrne lr, .loop_list - adreq lr, .next_ot + adreq lr, .next_ot_zero tst flags, #FACE_CLIPPED bne drawPoly @@ -213,7 +210,7 @@ flush_asm: // r1 = ptr tst face, face adrne lr, .loop_list - adreq lr, .next_ot + adreq lr, .next_ot_zero // gui cmp type, #FACE_TYPE_SPRITE @@ -231,6 +228,9 @@ flush_asm: str uv, [ptr, #(VERTEX_T + VERTEX_SIZEOF * 1)] b rasterize_asm +.next_ot_zero: + str face, [list, #4] // reset the list pointer in OT + .next_ot: cmp list, OT bge .loop_ot diff --git a/src/platform/gba/asm/matrixTranslate.s b/src/platform/gba/asm/matrixTranslate.s index 2ae2e1ea..f0366c65 100644 --- a/src/platform/gba/asm/matrixTranslate.s +++ b/src/platform/gba/asm/matrixTranslate.s @@ -8,7 +8,18 @@ m .req r3 e0 .req r8 e1 .req r9 e2 .req r10 -v .req r11 +vx .req r11 +e3 .req r12 +e4 .req r13 +e5 .req r14 + +v .req vx +vy .req e0 +vp .req e1 +e6 .req e2 +e7 .req vx +e8 .req e3 +vz .req e4 .global matrixTranslateRel_asm matrixTranslateRel_asm: @@ -18,25 +29,25 @@ matrixTranslateRel_asm: ldr m, [m] // x - ldmia m!, {e0, e1, e2, v} - mla v, e0, x, v - mla v, e1, y, v - mla v, e2, z, v - stmdb m, {v} + ldmia m!, {e0, e1, e2, vx, e3, e4, e5} + mla vx, e0, x, vx + mla vx, e1, y, vx + mla vx, e2, z, vx + str vx, [m, #-16] // y - ldmia m!, {e0, e1, e2, v} - mla v, e0, x, v - mla v, e1, y, v - mla v, e2, z, v - stmdb m, {v} + mul vy, e3, x + mla vy, e4, y, vy + mla vy, e5, z, vy + ldmia m, {vp, e6, e7, e8, vz} + add vy, vy, vp + str vy, [m] // z - ldmia m!, {e0, e1, e2, v} - mla v, e0, x, v - mla v, e1, y, v - mla v, e2, z, v - stmdb m, {v} + mla vz, e6, x, vz + mla vz, e7, y, vz + mla vz, e8, z, vz + str vz, [m, #16] fiq_off bx lr diff --git a/src/platform/gba/asm/rasterizeF.s b/src/platform/gba/asm/rasterizeF.s index d2b9016e..47b74879 100644 --- a/src/platform/gba/asm/rasterizeF.s +++ b/src/platform/gba/asm/rasterizeF.s @@ -7,6 +7,7 @@ index .req r3 Lh .req r4 Rh .req r5 Lx .req r6 + // FIQ regs Rx .req r8 Ldx .req r9 @@ -24,6 +25,8 @@ Lxy .req tmp Ly2 .req Lh LMAP .req Lx ptr .req tmp +Ltmp .req N +Rtmp .req N .global rasterizeF_asm rasterizeF_asm: @@ -36,13 +39,8 @@ rasterizeF_asm: mov R, L - mov Lh, #0 // Lh = 0 mov Rh, #0 // Rh = 0 -.loop: - cmp Lh, #0 - bne .calc_left_end // if (Lh != 0) end with left - .calc_left_start: ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x) ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev @@ -59,9 +57,9 @@ rasterizeF_asm: divLUT tmp, Lh // tmp = FixedInvU(Lh) - ldrsh Ldx, [L, #VERTEX_X] - sub Ldx, Lx, asr #16 - mul Ldx, tmp // Ldx = tmp * (N->v.x - L->v.x) + ldrsh Ltmp, [L, #VERTEX_X] + sub Ltmp, Lx, asr #16 + mul Ldx, tmp, Ltmp // Ldx = tmp * (N->v.x - L->v.x) .calc_left_end: cmp Rh, #0 @@ -83,9 +81,9 @@ rasterizeF_asm: divLUT tmp, Rh // tmp = FixedInvU(Rh) - ldrsh Rdx, [R, #VERTEX_X] - sub Rdx, Rx, asr #16 - mul Rdx, tmp // Rdx = tmp * (N->v.x - Rx) + ldrsh Rtmp, [R, #VERTEX_X] + sub Rtmp, Rx, asr #16 + mul Rdx, tmp, Rtmp // Rdx = tmp * (N->v.x - Rx) .calc_right_end: cmp Rh, Lh // if (Rh < Lh) @@ -126,13 +124,16 @@ rasterizeF_asm: bne .scanline_block_2px .scanline_end: - add Lx, Ldx // Lx += Ldx - add Rx, Rdx // Rx += Rdx - add pixel, #FRAME_WIDTH // pixel += FRAME_WIDTH (240) + add Lx, Ldx // Lx += Ldx + add Rx, Rdx // Rx += Rdx + add pixel, #FRAME_WIDTH // pixel += FRAME_WIDTH (240) subs h, #1 bne .scanline_start - b .loop + + cmp Lh, #0 + bne .calc_right_start + b .calc_left_start .exit: fiq_off diff --git a/src/platform/gba/asm/rasterizeFT.s b/src/platform/gba/asm/rasterizeFT.s index 8252eae7..0e89b0cb 100644 --- a/src/platform/gba/asm/rasterizeFT.s +++ b/src/platform/gba/asm/rasterizeFT.s @@ -44,9 +44,12 @@ Ly2 .req Lh inv .req indexA duv .req indexB dtmp .req t +dtmp2 .req indexB Ltmp .req N Rtmp .req N +Ltmp2 .req dtdx +Rtmp2 .req dtdx .macro PUT_PIXELS tex indexA, t @@ -72,15 +75,7 @@ rasterizeFT_asm: fiq_on mov L, arg_L mov R, arg_R - mov LRh, #0 // Lh = 0 - -.loop: - lsr Lh, LRh, #16 - lsl Rh, LRh, #16 - lsr Rh, Rh, #16 - - cmp Lh, #0 - bgt .calc_left_end // if (Lh != 0) end with left + mov Rh, #0 // Rh = 0 .calc_left_start: ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev @@ -100,13 +95,13 @@ rasterizeFT_asm: divLUT tmp, Lh // tmp = FixedInvU(Lh) - ldrsh Ldx, [L, #VERTEX_X] - sub Ldx, Lx, asr #16 - mul Ldx, tmp // Ldx = tmp * (N->v.x - Lx) + ldrsh Ltmp, [L, #VERTEX_X] + sub Ltmp, Lx, asr #16 + mul Ldx, tmp, Ltmp // Ldx = tmp * (N->v.x - Lx) ldr Ldt, [L, #VERTEX_T] sub Ldt, Lt // Ldt = N->v.t - Lt - scaleUV Ldt, Ltmp, tmp + scaleUV Ldt, Ltmp, Ltmp2, tmp .calc_left_end: cmp Rh, #0 @@ -130,13 +125,13 @@ rasterizeFT_asm: divLUT tmp, Rh // tmp = FixedInvU(Rh) - ldrsh Rdx, [R, #VERTEX_X] - sub Rdx, Rx, asr #16 - mul Rdx, tmp // Rdx = tmp * (N->v.x - Rx) + ldrsh Rtmp, [R, #VERTEX_X] + sub Rtmp, Rx, asr #16 + mul Rdx, tmp, Rtmp // Rdx = tmp * (N->v.x - Rx) ldr Rdt, [R, #VERTEX_T] sub Rdt, Rt // Rdt = N->v.t - Rt - scaleUV Rdt, Rtmp, tmp + scaleUV Rdt, Rtmp, Rtmp2, tmp .calc_right_end: cmp Rh, Lh // if (Rh < Lh) @@ -159,7 +154,7 @@ rasterizeFT_asm: divLUT inv, width // inv = FixedInvU(width) sub dtdx, Rt, Lt // duv = Rt - Lt - scaleUV dtdx, dtmp, inv + scaleUV dtdx, dtmp, dtmp2, inv mov t, Lt // t = Lt @@ -235,7 +230,13 @@ rasterizeFT_asm: fiq_off_ne bne .scanline_start - b .loop + lsr Lh, LRh, #16 + lsl Rh, LRh, #16 + lsr Rh, Rh, #16 + + cmp Lh, #0 + bne .calc_right_start + b .calc_left_start .exit: fiq_off diff --git a/src/platform/gba/asm/rasterizeFTA.s b/src/platform/gba/asm/rasterizeFTA.s index 0d83c6d3..96e492c8 100644 --- a/src/platform/gba/asm/rasterizeFTA.s +++ b/src/platform/gba/asm/rasterizeFTA.s @@ -44,9 +44,12 @@ Ly2 .req Lh inv .req indexA duv .req indexB dtmp .req t +dtmp2 .req indexB Ltmp .req N Rtmp .req N +Ltmp2 .req dtdx +Rtmp2 .req dtdx .macro PUT_PIXELS tex indexA, t @@ -73,15 +76,7 @@ rasterizeFTA_asm: fiq_on mov L, arg_L mov R, arg_R - mov LRh, #0 // Lh = 0 - -.loop: - lsr Lh, LRh, #16 - lsl Rh, LRh, #16 - lsr Rh, Rh, #16 - - cmp Lh, #0 - bgt .calc_left_end // if (Lh != 0) end with left + mov Rh, #0 // Rh = 0 .calc_left_start: ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev @@ -101,13 +96,13 @@ rasterizeFTA_asm: divLUT tmp, Lh // tmp = FixedInvU(Lh) - ldrsh Ldx, [L, #VERTEX_X] - sub Ldx, Lx, asr #16 - mul Ldx, tmp // Ldx = tmp * (N->v.x - Lx) + ldrsh Ltmp, [L, #VERTEX_X] + sub Ltmp, Lx, asr #16 + mul Ldx, tmp, Ltmp // Ldx = tmp * (N->v.x - Lx) ldr Ldt, [L, #VERTEX_T] sub Ldt, Lt // Ldt = N->v.t - Lt - scaleUV Ldt, Ltmp, tmp + scaleUV Ldt, Ltmp, Ltmp2, tmp .calc_left_end: cmp Rh, #0 @@ -131,13 +126,13 @@ rasterizeFTA_asm: divLUT tmp, Rh // tmp = FixedInvU(Rh) - ldrsh Rdx, [R, #VERTEX_X] - sub Rdx, Rx, asr #16 - mul Rdx, tmp // Rdx = tmp * (N->v.x - Rx) + ldrsh Rtmp, [R, #VERTEX_X] + sub Rtmp, Rx, asr #16 + mul Rdx, tmp, Rtmp // Rdx = tmp * (N->v.x - Rx) ldr Rdt, [R, #VERTEX_T] sub Rdt, Rt // Rdt = N->v.t - Rt - scaleUV Rdt, Rtmp, tmp + scaleUV Rdt, Rtmp, Rtmp2, tmp .calc_right_end: cmp Rh, Lh // if (Rh < Lh) @@ -160,7 +155,7 @@ rasterizeFTA_asm: divLUT inv, width // inv = FixedInvU(width) sub dtdx, Rt, Lt // duv = Rt - Lt - scaleUV dtdx, dtmp, inv + scaleUV dtdx, dtmp, dtmp2, inv mov t, Lt // t = Lt @@ -240,7 +235,13 @@ rasterizeFTA_asm: fiq_off_ne bne .scanline_start - b .loop + lsr Lh, LRh, #16 + lsl Rh, LRh, #16 + lsr Rh, Rh, #16 + + cmp Lh, #0 + bne .calc_right_start + b .calc_left_start .exit: fiq_off diff --git a/src/platform/gba/asm/rasterizeGT.s b/src/platform/gba/asm/rasterizeGT.s index 6594228d..f427f2a8 100644 --- a/src/platform/gba/asm/rasterizeGT.s +++ b/src/platform/gba/asm/rasterizeGT.s @@ -27,6 +27,7 @@ Ldg .req r10 Rdg .req r11 Ldt .req r12 Rdt .req r13 +spFIQ .req r14 h .req N @@ -46,17 +47,17 @@ ptr .req Lx width .req Rh g .req Lg -dgdx .req L +dgdx .req R t .req Lt -dtdx .req R -dtmp .req L +dtdx .req L +dtmp .req tmp +dtmp2 .req R -Ltmp .req N -Rtmp .req N - -SP_TILE = 0 -SP_SIZE = 4 +Ltmp .req spFIQ +Rtmp .req spFIQ +Ltmp2 .req N +Rtmp2 .req N G_EXTRA = 5 // extra bits of precision for gouraud shading (8 + G_EXTRA) @@ -74,22 +75,17 @@ G_EXTRA = 5 // extra bits of precision for gouraud shading (8 + G_EXTRA) .global rasterizeGT_asm rasterizeGT_asm: - ldr r3, =gTile - ldr r3, [r3] - stmfd sp!, {r3-r11, lr} + stmfd sp!, {r4-r11, lr} + + ldr TILE, =gTile + ldr TILE, [TILE] mov pixel, arg_pixel mov L, arg_L mov R, arg_R - mov Lh, #0 // Lh = 0 mov Rh, #0 // Rh = 0 -.loop: - - cmp Lh, #0 - bne .calc_left_end // if (Lh != 0) end with left - .calc_left_start: ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev add N, L, N, lsl #VERTEX_SIZEOF_SHIFT @@ -111,18 +107,18 @@ rasterizeGT_asm: divLUT tmp, Lh // tmp = FixedInvU(Lh) fiq_on - ldrsh Ldx, [N, #VERTEX_X] - sub Ldx, Lx, asr #16 - mul Ldx, tmp // Ldx = tmp * (N->v.x - Lx) + ldrsh Ltmp, [N, #VERTEX_X] + sub Ltmp, Lx, asr #16 + mul Ldx, tmp, Ltmp // Ldx = tmp * (N->v.x - Lx) - ldrb Ldg, [N, #VERTEX_G] - sub Ldg, Lg, lsr #(8 + G_EXTRA) - mul Ldg, tmp // Ldg = tmp * (N->v.g - Lg) + ldrb Ltmp, [N, #VERTEX_G] + sub Ltmp, Lg, lsr #(8 + G_EXTRA) + mul Ldg, tmp, Ltmp // Ldg = tmp * (N->v.g - Lg) asr Ldg, #(8 - G_EXTRA) // (8 + G_EXTRA)-bit for fractional part ldr Ldt, [N, #VERTEX_T] sub Ldt, Lt // Ldt = N->v.t - Lt - scaleUV Ldt, Ltmp, tmp + scaleUV Ldt, Ltmp, Ltmp2, tmp fiq_off .calc_left_end: @@ -150,18 +146,18 @@ rasterizeGT_asm: divLUT tmp, Rh // tmp = FixedInvU(Rh) fiq_on - ldrsh Rdx, [N, #VERTEX_X] - sub Rdx, Rx, asr #16 - mul Rdx, tmp // Rdx = tmp * (N->v.x - Rx) + ldrsh Rtmp, [N, #VERTEX_X] + sub Rtmp, Rx, asr #16 + mul Rdx, tmp, Rtmp // Rdx = tmp * (N->v.x - Rx) - ldrb Rdg, [N, #VERTEX_G] - sub Rdg, Rg, lsr #(8 + G_EXTRA) - mul Rdg, tmp // Rdg = tmp * (N->v.g - Rg) + ldrb Rtmp, [N, #VERTEX_G] + sub Rtmp, Rg, lsr #(8 + G_EXTRA) + mul Rdg, tmp, Rtmp // Rdg = tmp * (N->v.g - Rg) asr Rdg, #(8 - G_EXTRA) // (8 + G_EXTRA)-bit for fractional part ldr Rdt, [N, #VERTEX_T] sub Rdt, Rt // Rdt = N->v.t - Rt - scaleUV Rdt, Rtmp, tmp + scaleUV Rdt, Rtmp, Rtmp2, tmp fiq_off .calc_right_end: @@ -174,8 +170,6 @@ rasterizeGT_asm: sub Lh, h // Lh -= h sub Rh, h // Rh -= h - ldr TILE, [sp, #SP_TILE] - stmfd sp!, {L, R, Lh, Rh} .scanline_start: @@ -190,7 +184,7 @@ rasterizeGT_asm: divLUT inv, width // inv = FixedInvU(width) sub dtdx, Rt, Lt // dtdx = Rt - Lt - scaleUV dtdx, dtmp, inv + scaleUV dtdx, dtmp, dtmp2, inv // t == Lt (alias) sub dgdx, Rg, Lg // dgdx = Rg - Lg @@ -273,14 +267,16 @@ rasterizeGT_asm: add Rt, Rdt fiq_off - add pixel, #FRAME_WIDTH // pixel += FRAME_WIDTH (240) + add pixel, #FRAME_WIDTH // pixel += FRAME_WIDTH (240) subs h, #1 bne .scanline_start ldmfd sp!, {L, R, Lh, Rh} - b .loop + + cmp Lh, #0 + bne .calc_right_start + b .calc_left_start .exit: - add sp, #SP_SIZE // revert reserved space for [TILE] ldmfd sp!, {r4-r11, pc} diff --git a/src/platform/gba/asm/rasterizeGTA.s b/src/platform/gba/asm/rasterizeGTA.s index 4dcb3049..94587744 100644 --- a/src/platform/gba/asm/rasterizeGTA.s +++ b/src/platform/gba/asm/rasterizeGTA.s @@ -27,6 +27,7 @@ Ldg .req r10 Rdg .req r11 Ldt .req r12 Rdt .req r13 +spFIQ .req r14 h .req N @@ -46,17 +47,17 @@ ptr .req Lx width .req Rh g .req Lg -dgdx .req L +dgdx .req R t .req Lt -dtdx .req R -dtmp .req L +dtdx .req L +dtmp .req tmp +dtmp2 .req R -Ltmp .req N -Rtmp .req N - -SP_TILE = 0 -SP_SIZE = 4 +Ltmp .req spFIQ +Rtmp .req spFIQ +Ltmp2 .req N +Rtmp2 .req N .macro PUT_PIXELS bic LMAP, g, #255 @@ -73,22 +74,17 @@ SP_SIZE = 4 .global rasterizeGTA_asm rasterizeGTA_asm: - ldr r3, =gTile - ldr r3, [r3] - stmfd sp!, {r3-r11, lr} + stmfd sp!, {r4-r11, lr} + + ldr TILE, =gTile + ldr TILE, [TILE] mov pixel, arg_pixel mov L, arg_L mov R, arg_R - mov Lh, #0 // Lh = 0 mov Rh, #0 // Rh = 0 -.loop: - - cmp Lh, #0 - bne .calc_left_end // if (Lh != 0) end with left - .calc_left_start: ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev add N, L, N, lsl #VERTEX_SIZEOF_SHIFT @@ -110,18 +106,18 @@ rasterizeGTA_asm: divLUT tmp, Lh // tmp = FixedInvU(Lh) fiq_on - ldrsh Ldx, [N, #VERTEX_X] - sub Ldx, Lx, asr #16 - mul Ldx, tmp // Ldx = tmp * (N->v.x - Lx) + ldrsh Ltmp, [N, #VERTEX_X] + sub Ltmp, Lx, asr #16 + mul Ldx, tmp, Ltmp // Ldx = tmp * (N->v.x - Lx) - ldrb Ldg, [N, #VERTEX_G] - sub Ldg, Lg, lsr #8 - mul Ldg, tmp // Ldg = tmp * (N->v.g - Lg) + ldrb Ltmp, [N, #VERTEX_G] + sub Ltmp, Lg, lsr #8 + mul Ldg, tmp, Ltmp // Ldg = tmp * (N->v.g - Lg) asr Ldg, #8 // 8-bit for fractional part ldr Ldt, [N, #VERTEX_T] sub Ldt, Lt // Ldt = N->v.t - Lt - scaleUV Ldt, Ltmp, tmp + scaleUV Ldt, Ltmp, Ltmp2, tmp fiq_off .calc_left_end: @@ -149,18 +145,18 @@ rasterizeGTA_asm: divLUT tmp, Rh // tmp = FixedInvU(Rh) fiq_on - ldrsh Rdx, [N, #VERTEX_X] - sub Rdx, Rx, asr #16 - mul Rdx, tmp // Rdx = tmp * (N->v.x - Rx) + ldrsh Rtmp, [N, #VERTEX_X] + sub Rtmp, Rx, asr #16 + mul Rdx, tmp, Rtmp // Rdx = tmp * (N->v.x - Rx) - ldrb Rdg, [N, #VERTEX_G] - sub Rdg, Rg, lsr #8 - mul Rdg, tmp // Rdg = tmp * (N->v.g - Rg) + ldrb Rtmp, [N, #VERTEX_G] + sub Rtmp, Rg, lsr #8 + mul Rdg, tmp, Rtmp // Rdg = tmp * (N->v.g - Rg) asr Rdg, #8 // 8-bit for fractional part ldr Rdt, [N, #VERTEX_T] sub Rdt, Rt // Rdt = N->v.t - Rt - scaleUV Rdt, Rtmp, tmp + scaleUV Rdt, Rtmp, Rtmp2, tmp fiq_off .calc_right_end: @@ -173,8 +169,6 @@ rasterizeGTA_asm: sub Lh, h // Lh -= h sub Rh, h // Rh -= h - ldr TILE, [sp, #SP_TILE] - stmfd sp!, {L, R, Lh, Rh} .scanline_start: @@ -189,7 +183,7 @@ rasterizeGTA_asm: divLUT inv, width // inv = FixedInvU(width) sub dtdx, Rt, Lt // dtdx = Rt - Lt - scaleUV dtdx, dtmp, inv + scaleUV dtdx, dtmp, dtmp2, inv // t == Lt (alias) sub dgdx, Rg, Lg // dgdx = Rg - Lg @@ -285,14 +279,16 @@ rasterizeGTA_asm: add Rt, Rdt fiq_off - add pixel, #FRAME_WIDTH // pixel += FRAME_WIDTH (240) + add pixel, #FRAME_WIDTH // pixel += FRAME_WIDTH (240) subs h, #1 bne .scanline_start ldmfd sp!, {L, R, Lh, Rh} - b .loop + + cmp Lh, #0 + bne .calc_right_start + b .calc_left_start .exit: - add sp, #SP_SIZE // revert reserved space for [TILE] ldmfd sp!, {r4-r11, pc} diff --git a/src/platform/gba/asm/rasterizeS.s b/src/platform/gba/asm/rasterizeS.s index 9c8f9990..32e57d1f 100644 --- a/src/platform/gba/asm/rasterizeS.s +++ b/src/platform/gba/asm/rasterizeS.s @@ -23,6 +23,8 @@ Ry2 .req Rh Lxy .req tmp Ly2 .req Lh indexB .req pair +Ltmp .req N +Rtmp .req N .global rasterizeS_asm rasterizeS_asm: @@ -32,14 +34,8 @@ rasterizeS_asm: mov LMAP, #LMAP_ADDR add LMAP, #0x1A00 - mov Lh, #0 // Lh = 0 mov Rh, #0 // Rh = 0 -.loop: - - cmp Lh, #0 - bne .calc_left_end // if (Lh != 0) end with left - .calc_left_start: ldr Lxy, [L, #VERTEX_X] // Lxy = (L->v.y << 16) | (L->v.x) ldrsb N, [L, #VERTEX_PREV] // N = L + L->prev @@ -56,9 +52,9 @@ rasterizeS_asm: divLUT tmp, Lh // tmp = FixedInvU(Lh) - ldrsh Ldx, [L, #VERTEX_X] - sub Ldx, Lx, asr #16 - mul Ldx, tmp // Ldx = tmp * (N->v.x - Lx) + ldrsh Ltmp, [L, #VERTEX_X] + sub Ltmp, Lx, asr #16 + mul Ldx, tmp, Ltmp // Ldx = tmp * (N->v.x - Lx) .calc_left_end: cmp Rh, #0 @@ -80,9 +76,9 @@ rasterizeS_asm: divLUT tmp, Rh // tmp = FixedInvU(Rh) - ldrsh Rdx, [R, #VERTEX_X] - sub Rdx, Rx, asr #16 - mul Rdx, tmp // Rdx = tmp * (N->v.x - Rx) + ldrsh Rtmp, [R, #VERTEX_X] + sub Rtmp, Rx, asr #16 + mul Rdx, tmp, Rtmp // Rdx = tmp * (N->v.x - Rx) .calc_right_end: cmp Rh, Lh // if (Rh < Lh) @@ -136,14 +132,16 @@ rasterizeS_asm: bne .scanline .scanline_end: - add Lx, Ldx // Lx += Ldx - add Rx, Rdx // Rx += Rdx - add pixel, #FRAME_WIDTH // pixel += FRAME_WIDTH (240) + add Lx, Ldx // Lx += Ldx + add Rx, Rdx // Rx += Rdx + add pixel, #FRAME_WIDTH // pixel += FRAME_WIDTH (240) subs h, #1 bne .scanline_start - b .loop + cmp Lh, #0 + bne .calc_right_start + b .calc_left_start .exit: fiq_off diff --git a/src/platform/gba/asm/sphereIsVisible.s b/src/platform/gba/asm/sphereIsVisible.s index 71589ac0..1ca7a21c 100644 --- a/src/platform/gba/asm/sphereIsVisible.s +++ b/src/platform/gba/asm/sphereIsVisible.s @@ -48,8 +48,8 @@ sphereIsVisible_asm: mov x, vx, asr #FIXED_SHIFT mov y, vy, asr #FIXED_SHIFT - mov z, vz, lsr #(FIXED_SHIFT + 6) - add z, z, vz, lsr #(FIXED_SHIFT + 4) + mov z, vz, lsr #(FIXED_SHIFT + 4) + add z, vz, lsr #(FIXED_SHIFT + 6) divLUT tmp, z mul x, tmp, x mul y, tmp, y diff --git a/src/platform/gba/asm/transformRoom.s b/src/platform/gba/asm/transformRoom.s index 6b3b534f..4b46834a 100644 --- a/src/platform/gba/asm/transformRoom.s +++ b/src/platform/gba/asm/transformRoom.s @@ -55,7 +55,7 @@ transformRoom_asm: ldmia tmp, {minXY, maxXY} stmfd sp!, {minXY, maxXY} - mov mask, #(0xFF << 10) + mov mask, #0xFF ldr m, =gMatrixPtr ldr m, [m] @@ -71,15 +71,15 @@ transformRoom_asm: // unpack vertex ldmia vertices!, {v} - and vz, mask, v, lsr #6 - and vy, v, #0xFF00 - and vx, mask, v, lsl #10 + and vz, mask, v, lsr #16 + and vy, mask, v, lsr #8 + and vx, mask, v // transform z mul z, mx2, vx mla z, my2, vy, z mla z, mz2, vz, z - add z, mw2, z, asr #FIXED_SHIFT + add z, mw2, z, asr #(FIXED_SHIFT - 8) // skip if vertex is out of z-range add z, #VIEW_OFF @@ -87,7 +87,7 @@ transformRoom_asm: movhi vg, #(CLIP_NEAR + CLIP_FAR) bhi .skip - and vg, mask, v, lsr #14 + mov vg, v, lsr #24 sub z, #VIEW_OFF fiq_on @@ -95,20 +95,22 @@ transformRoom_asm: mul y, mx1, vx mla y, my1, vy, y mla y, mz1, vz, y - add y, mw1, y, asr #FIXED_SHIFT + add y, mw1, y, asr #(FIXED_SHIFT - 8) // transform x mul x, mx0, vx mla x, my0, vy, x mla x, mz0, vz, x - add x, mw0, x, asr #FIXED_SHIFT + add x, mw0, x, asr #(FIXED_SHIFT - 8) fiq_off // fog cmp z, #FOG_MIN subgt fog, z, #FOG_MIN - addgt vg, fog, lsl #6 - lsr vg, #13 + addgt vg, fog, lsr #4 + + // vg 0..255 -> 0..31 + lsr vg, #3 cmp vg, #31 movgt vg, #31 @@ -158,7 +160,7 @@ transformRoom_asm: strh y, [res, #-4] strh z, [res, #-2] - mov mask, #(0xFF << 10) + mov mask, #0xFF .skip: strh vg, [res], #8 diff --git a/src/platform/gba/asm/transformRoomUW.s b/src/platform/gba/asm/transformRoomUW.s index de6654b7..daef2450 100644 --- a/src/platform/gba/asm/transformRoomUW.s +++ b/src/platform/gba/asm/transformRoomUW.s @@ -75,7 +75,7 @@ transformRoomUW_asm: stmfd sp!, {spMinXY, spMaxXY, spRandLUT, spFrame, spCaustLUT} - mov mask, #(0xFF << 10) + mov mask, #0xFF ldr m, =gMatrixPtr ldr m, [m] @@ -91,15 +91,15 @@ transformRoomUW_asm: // unpack vertex ldmia vertices!, {v} - and vz, mask, v, lsr #6 - and vy, v, #0xFF00 - and vx, mask, v, lsl #10 + and vz, mask, v, lsr #16 + and vy, mask, v, lsr #8 + and vx, mask, v // transform z mul z, mx2, vx mla z, my2, vy, z mla z, mz2, vz, z - add z, mw2, z, asr #FIXED_SHIFT + add z, mw2, z, asr #(FIXED_SHIFT - 8) // skip if vertex is out of z-range add z, #VIEW_OFF @@ -107,7 +107,7 @@ transformRoomUW_asm: movhi vg, #(CLIP_NEAR + CLIP_FAR) bhi .skip - and vg, mask, v, lsr #14 + mov vg, v, lsr #24 sub z, #VIEW_OFF fiq_on @@ -115,13 +115,13 @@ transformRoomUW_asm: mul y, mx1, vx mla y, my1, vy, y mla y, mz1, vz, y - add y, mw1, y, asr #FIXED_SHIFT + add y, mw1, y, asr #(FIXED_SHIFT - 8) // transform x mul x, mx0, vx mla x, my0, vy, x mla x, mz0, vz, x - add x, mw0, x, asr #FIXED_SHIFT + add x, mw0, x, asr #(FIXED_SHIFT - 8) fiq_off // caustics @@ -133,13 +133,15 @@ transformRoomUW_asm: and rand, #(MAX_CAUSTICS - 1) ldr caust, [sp, #SP_CAUST] ldr caust, [caust, rand, lsl #2] - add vg, caust, lsl #5 + add vg, caust, asr #5 // fog cmp z, #FOG_MIN subgt fog, z, #FOG_MIN - addgt vg, fog, lsl #6 - lsr vg, #13 + addgt vg, fog, lsr #4 + + // vg 0..255 -> 0..31 + lsr vg, #3 cmp vg, #31 movgt vg, #31 @@ -189,7 +191,7 @@ transformRoomUW_asm: strh y, [res, #-4] strh z, [res, #-2] - mov mask, #(0xFF << 10) + mov mask, #0xFF .skip: strh vg, [res], #8 diff --git a/src/platform/gba/data/GYM.PKD b/src/platform/gba/data/GYM.PKD index 7f1aeb46019c5c607e95f1d250cfb2391390ee41..d96b742dbab82e933e43fb5a3534b00c0b7efa41 100644 GIT binary patch delta 9308 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 delta 9308 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 HTW9|VMDz%Q diff --git a/src/platform/gba/data/LEVEL2.PKD b/src/platform/gba/data/LEVEL2.PKD index 3074ca96ab1c78cbf106c512eecd1bc431faf564..228851ded9f3cfbb8b171da30e9476063dee5fd5 100644 GIT binary patch delta 34242 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 diff --git a/src/platform/gba/data/TITLE.PKD b/src/platform/gba/data/TITLE.PKD index 5bf0464cd3122a31129c2a450538ec0322dd1699..2c4015fee396ae246aa6619bf724565f86b5d2f5 100644 GIT binary patch delta 57 zcmZ3}FTAE-xS@ryg=q`3i?TciH%kKx7;`jmaC0=UFaY@sKsJ!(VBly^R%YIwtjyxM F1OSi<46gtH delta 57 zcmZ3}FTAE-xS@ryg=q`3i?TcuH)8`M7&A36aWgeAG64AuKsJzOVqj`dR%YIwtjyxM F1OSNk3}*lU diff --git a/src/platform/gba/rasterizer.h b/src/platform/gba/rasterizer.h index bc4500eb..e8643e27 100644 --- a/src/platform/gba/rasterizer.h +++ b/src/platform/gba/rasterizer.h @@ -261,130 +261,6 @@ void rasterizeF_c(uint16* pixel, const VertexLink* L, const VertexLink* R) } } -void rasterizeG_c(uint16* pixel, const VertexLink* L, const VertexLink* R, int32 index) -{ - int32 Lh = 0, Rh = 0; - int32 Lx, Rx, Ldx = 0, Rdx = 0; - int32 Lg, Rg, Ldg = 0, Rdg = 0; - - const uint8* ft_lightmap = gLightmap + index; - - while (1) - { - while (!Lh) - { - const VertexLink* N = L + L->prev; - - if (N->v.y < L->v.y) return; - - Lh = N->v.y - L->v.y; - Lx = L->v.x; - Lg = L->v.g; - - if (Lh > 1) - { - int32 tmp = FixedInvU(Lh); - Ldx = tmp * (N->v.x - Lx); - Ldg = tmp * (N->v.g - Lg); - } - - Lx <<= 16; - Lg <<= 16; - L = N; - } - - while (!Rh) - { - const VertexLink* N = R + R->next; - - if (N->v.y < R->v.y) return; - - Rh = N->v.y - R->v.y; - Rx = R->v.x; - Rg = R->v.g; - - if (Rh > 1) - { - int32 tmp = FixedInvU(Rh); - Rdx = tmp * (N->v.x - Rx); - Rdg = tmp * (N->v.g - Rg); - } - - Rx <<= 16; - Rg <<= 16; - R = N; - } - - int32 h = X_MIN(Lh, Rh); - Lh -= h; - Rh -= h; - - while (h--) - { - int32 x1 = Lx >> 16; - int32 x2 = Rx >> 16; - - int32 width = x2 - x1; - - if (width > 0) - { - int32 tmp = FixedInvU(width); - - int32 dgdx = tmp * ((Rg - Lg) >> 5) >> 10; - - int32 g = Lg; - - volatile uint8* ptr = (uint8*)pixel + x1; - - if (intptr_t(ptr) & 1) - { - ptr--; - *(uint16*)ptr = *ptr | (ft_lightmap[g >> 16 << 8] << 8); - g += dgdx >> 1; - ptr += 2; - width--; - } - - if (width & 1) - { - *(uint16*)(ptr + width - 1) = (ptr[width] << 8) | ft_lightmap[Rg >> 16 << 8]; - } - - if (width & 2) - { - uint8 p = ft_lightmap[g >> 16 << 8]; - g += dgdx; - *(uint16*)ptr = p | (p << 8); - ptr += 2; - } - - width >>= 2; - while (width--) - { - uint8 p; - - p = ft_lightmap[g >> 16 << 8]; - *(uint16*)ptr = p | (p << 8); - g += dgdx; - ptr += 2; - - p = ft_lightmap[g >> 16 << 8]; - *(uint16*)ptr = p | (p << 8); - g += dgdx; - ptr += 2; - } - } - - pixel += VRAM_WIDTH; - - Lx += Ldx; - Rx += Rdx; - Lg += Ldg; - Rg += Rdg; - } - } -} - void rasterizeFT_c(uint16* pixel, const VertexLink* L, const VertexLink* R) { const uint8* ft_lightmap = &gLightmap[L->v.g << 8]; @@ -536,7 +412,7 @@ void rasterizeGT_c(uint16* pixel, const VertexLink* L, const VertexLink* R) if (N->v.y < L->v.y) return; Lh = N->v.y - L->v.y; - Lx = L->v.x; + Lx = L->v.x; Lg = L->v.g; Lt = L->t.t; diff --git a/src/platform/gba/render.iwram.cpp b/src/platform/gba/render.iwram.cpp index 263444ba..03b16ac8 100644 --- a/src/platform/gba/render.iwram.cpp +++ b/src/platform/gba/render.iwram.cpp @@ -62,14 +62,14 @@ extern Level level; const uint8* gTile; -Vertex* gVerticesBase; -Face* gFacesBase; - EWRAM_DATA uint8 gBackgroundCopy[FRAME_WIDTH * FRAME_HEIGHT]; // EWRAM 37.5k EWRAM_DATA ALIGN8 Vertex gVertices[MAX_VERTICES]; // EWRAM 16k EWRAM_DATA Face gFaces[MAX_FACES]; // EWRAM 30k Face* gOT[OT_SIZE]; // IWRAM 2.5k +Vertex* gVerticesBase = gVertices; +Face* gFacesBase = gFaces; + enum ClipFlags { CLIP_LEFT = 1 << 0, CLIP_RIGHT = 1 << 1, @@ -163,10 +163,10 @@ void transformRoom_c(const RoomVertex* vertices, int32 count) { uint32 value = *(uint32*)(vertices++); - int32 vx = (value & (0xFF)) << 10; - int32 vy = (value & (0xFF << 8)); - int32 vz = (value & (0xFF << 16)) >> 6; - int32 vg = (value & (0xFF << 24)) >> (24 - 5); + int32 vx = (0xFF & (value)); + int32 vy = (0xFF & (value >> 8)); + int32 vz = (0xFF & (value >> 16)); + int32 vg = (0xFF & (value >> 24)) << 5; const Matrix &m = matrixGet(); int32 x = DP43(m.e00, m.e01, m.e02, m.e03, vx, vy, vz); @@ -177,17 +177,17 @@ void transformRoom_c(const RoomVertex* vertices, int32 count) if (z <= VIEW_MIN_F) { clip = CLIP_NEAR; - z = VIEW_MIN_F; + z = VIEW_MIN_F >> 8; } - if (z >= VIEW_MAX_F) { + if (z >= VIEW_MAX_F >> 8) { clip = CLIP_FAR; - z = VIEW_MAX_F; + z = VIEW_MAX_F >> 8; } - x >>= FIXED_SHIFT; - y >>= FIXED_SHIFT; - z >>= FIXED_SHIFT; + x >>= FIXED_SHIFT - 8; + y >>= FIXED_SHIFT - 8; + z >>= FIXED_SHIFT - 8; if (z > FOG_MIN) { @@ -684,30 +684,12 @@ void flush_c() } #endif -void renderInit() -{ - gVerticesBase = gVertices; - gFacesBase = gFaces; -} - -void renderFree() -{ -} - -void renderLevelInit() -{ -} - -void renderLevelFree() -{ -} - extern "C" X_NOINLINE void drawPoly(uint32 flags, VertexLink* v) { #define LERP_SHIFT 6 #define LERP(a,b,t) (b + ((a - b) * t >> LERP_SHIFT)) //#define LERP2(a,b,ta,tb) LERP(a,b,t) - #define LERP2(a,b,ta,tb) (b + (((a - b) * ta / tb) >> LERP_SHIFT) ) // less gaps between clipped polys, but slow + #define LERP2(a,b,ta,tb) (b + (((a - b) * ta / tb) >> LERP_SHIFT) ) // less gaps between clipped polys, but slow // @DIV #define CLIP_AXIS(X, Y, edge, output) {\ int32 ta = (edge - b->v.X) << LERP_SHIFT;\ @@ -1133,14 +1115,8 @@ const int32 BAR_COLORS[BAR_MAX][5] = { { 43, 44, 43, 42, 41 }, }; -X_NOINLINE void renderBorder(int32 x, int32 y, int32 width, int32 height, int32 shade, int32 color1, int32 color2, int32 z) +X_NOINLINE void renderBorder(int32 x, int32 y, int32 width, int32 height, int32 color1, int32 color2, int32 z) { - // background - if (shade >= 0) { - renderFill(x + 1, y + 1, width - 2, height - 2, shade, z); - } - - // frame renderLine(x + 1, y, width - 2, 1, color1, z); renderLine(x + 1, y + height - 1, width - 2, 1, color2, z); renderLine(x, y, 1, height, color1, z); @@ -1150,9 +1126,9 @@ X_NOINLINE void renderBorder(int32 x, int32 y, int32 width, int32 height, int32 void renderBar(int32 x, int32 y, int32 width, int32 value, BarType type) { // colored bar - int32 ix = x + 2; - int32 iy = y + 2; - int32 w = value * width >> 8; + int32 ix = x + 1; + int32 iy = y + 1; + int32 w = value* width >> 8; if (w > 0) { @@ -1162,7 +1138,12 @@ void renderBar(int32 x, int32 y, int32 width, int32 value, BarType type) } } - renderBorder(x, y, width + 4, BAR_HEIGHT + 4, 27, 19, 17, 0); + if (w < width) + { + renderFill(x + 1 + w, y + 1, width - w, BAR_HEIGHT, 27, 0); + } + + renderBorder(x, y, width + 2, BAR_HEIGHT + 2, 19, 17, 0); } void renderBackground(const void* background)