From 43dc3d542bff27beca66e39338acaba35a17e14d Mon Sep 17 00:00:00 2001 From: XProger Date: Sat, 22 Jan 2022 00:17:12 +0300 Subject: [PATCH] #368 code cleanup, move asm files to the separate folder, separate gba, tns and dos platform code, fix DOS build, fix GBA title and game code "OPLA", add thumbnail for Ez-Flash carts --- src/fixed/common.h | 12 +- src/platform/dos/DOS4GW.exe | Bin 0 -> 265396 bytes src/platform/dos/deploy.bat | 4 + src/platform/dos/dosbox.conf | 10 + src/platform/dos/main.cpp | 267 ++++ .../rasterizer_mode13.h => dos/rasterizer.h} | 26 +- src/platform/dos/sound.cpp | 51 + src/platform/gba/IMGS/O/P/OPLA.bmp | Bin 0 -> 19256 bytes src/platform/gba/Makefile | 3 +- src/platform/gba/Makefile_tns | 49 - src/platform/gba/OpenLara.vcxproj | 3 +- src/platform/gba/{ => asm}/boxIsVisible.s | 0 src/platform/gba/{ => asm}/boxRotateYQ.s | 0 src/platform/gba/{ => asm}/boxTranslate.s | 0 src/platform/gba/{ => asm}/common_asm.inc | 0 src/platform/gba/{ => asm}/faceAddMeshQuads.s | 0 .../gba/{ => asm}/faceAddMeshTriangles.s | 0 src/platform/gba/{ => asm}/faceAddRoomQuads.s | 0 .../gba/{ => asm}/faceAddRoomTriangles.s | 0 src/platform/gba/{ => asm}/matrixLerp.s | 0 src/platform/gba/{ => asm}/matrixPush.s | 0 src/platform/gba/{ => asm}/matrixRotate.s | 0 src/platform/gba/{ => asm}/matrixSetBasis.s | 0 .../gba/{ => asm}/matrixSetIdentity.s | 0 src/platform/gba/{ => asm}/matrixTranslate.s | 0 src/platform/gba/{ => asm}/rasterizeF.s | 0 src/platform/gba/{ => asm}/rasterizeFT.s | 0 src/platform/gba/{ => asm}/rasterizeFTA.s | 0 src/platform/gba/{ => asm}/rasterizeFillS.s | 0 src/platform/gba/{ => asm}/rasterizeGT.s | 0 src/platform/gba/{ => asm}/rasterizeGTA.s | 0 src/platform/gba/{ => asm}/rasterizeLineH.s | 2 +- src/platform/gba/{ => asm}/rasterizeLineV.s | 0 src/platform/gba/{ => asm}/rasterizeS.s | 0 src/platform/gba/{ => asm}/rasterize_dummy.s | 0 src/platform/gba/{ => asm}/sdiv32.s | 0 src/platform/gba/{ => asm}/sndIMA.s | 0 src/platform/gba/{ => asm}/sndPCM.s | 0 src/platform/gba/{ => asm}/sndWrite.s | 0 src/platform/gba/{ => asm}/sphereIsVisible.s | 0 src/platform/gba/{ => asm}/transformMesh.s | 0 src/platform/gba/{ => asm}/transformRoom.s | 0 src/platform/gba/{ => asm}/transformRoomUW.s | 0 src/platform/gba/{ => asm}/udiv32.s | 0 src/platform/gba/deploy_dos.bat | 3 - src/platform/gba/main.cpp | 1143 ++++++----------- .../gba/{rasterizer_mode4.h => rasterizer.h} | 0 src/platform/gba/render.iwram.cpp | 42 +- src/platform/tns/Makefile | 7 +- src/platform/tns/main.cpp | 201 +-- src/platform/tns/sound.cpp | 51 + 51 files changed, 955 insertions(+), 919 deletions(-) create mode 100644 src/platform/dos/DOS4GW.exe create mode 100644 src/platform/dos/deploy.bat create mode 100644 src/platform/dos/dosbox.conf create mode 100644 src/platform/dos/main.cpp rename src/platform/{gba/rasterizer_mode13.h => dos/rasterizer.h} (97%) create mode 100644 src/platform/dos/sound.cpp create mode 100644 src/platform/gba/IMGS/O/P/OPLA.bmp delete mode 100644 src/platform/gba/Makefile_tns rename src/platform/gba/{ => asm}/boxIsVisible.s (100%) rename src/platform/gba/{ => asm}/boxRotateYQ.s (100%) rename src/platform/gba/{ => asm}/boxTranslate.s (100%) rename src/platform/gba/{ => asm}/common_asm.inc (100%) rename src/platform/gba/{ => asm}/faceAddMeshQuads.s (100%) rename src/platform/gba/{ => asm}/faceAddMeshTriangles.s (100%) rename src/platform/gba/{ => asm}/faceAddRoomQuads.s (100%) rename src/platform/gba/{ => asm}/faceAddRoomTriangles.s (100%) rename src/platform/gba/{ => asm}/matrixLerp.s (100%) rename src/platform/gba/{ => asm}/matrixPush.s (100%) rename src/platform/gba/{ => asm}/matrixRotate.s (100%) rename src/platform/gba/{ => asm}/matrixSetBasis.s (100%) rename src/platform/gba/{ => asm}/matrixSetIdentity.s (100%) rename src/platform/gba/{ => asm}/matrixTranslate.s (100%) rename src/platform/gba/{ => asm}/rasterizeF.s (100%) rename src/platform/gba/{ => asm}/rasterizeFT.s (100%) rename src/platform/gba/{ => asm}/rasterizeFTA.s (100%) rename src/platform/gba/{ => asm}/rasterizeFillS.s (100%) rename src/platform/gba/{ => asm}/rasterizeGT.s (100%) rename src/platform/gba/{ => asm}/rasterizeGTA.s (100%) rename src/platform/gba/{ => asm}/rasterizeLineH.s (98%) rename src/platform/gba/{ => asm}/rasterizeLineV.s (100%) rename src/platform/gba/{ => asm}/rasterizeS.s (100%) rename src/platform/gba/{ => asm}/rasterize_dummy.s (100%) rename src/platform/gba/{ => asm}/sdiv32.s (100%) rename src/platform/gba/{ => asm}/sndIMA.s (100%) rename src/platform/gba/{ => asm}/sndPCM.s (100%) rename src/platform/gba/{ => asm}/sndWrite.s (100%) rename src/platform/gba/{ => asm}/sphereIsVisible.s (100%) rename src/platform/gba/{ => asm}/transformMesh.s (100%) rename src/platform/gba/{ => asm}/transformRoom.s (100%) rename src/platform/gba/{ => asm}/transformRoomUW.s (100%) rename src/platform/gba/{ => asm}/udiv32.s (100%) delete mode 100644 src/platform/gba/deploy_dos.bat rename src/platform/gba/{rasterizer_mode4.h => rasterizer.h} (100%) create mode 100644 src/platform/tns/sound.cpp diff --git a/src/fixed/common.h b/src/fixed/common.h index af49687..699ba71 100644 --- a/src/fixed/common.h +++ b/src/fixed/common.h @@ -149,7 +149,7 @@ #define ALIGN16 __declspec(align(16)) #elif defined(__WATCOMC__) || defined(__3DO__) #define X_INLINE inline - #define X_NOINLINE __declspec(noinline) + #define X_NOINLINE #define ALIGN4 #define ALIGN16 #else @@ -2050,7 +2050,7 @@ struct IMA_STATE int32 idx; }; -#if defined(MODEHW) +#if defined(MODEHW) || defined(MODE13) #define PROJ_SHIFT 4 #define PERSPECTIVE_DZ(z) (z >> PROJ_SHIFT) @@ -2062,14 +2062,6 @@ struct IMA_STATE x = (x * d) >> (16 - PROJ_SHIFT);\ y = (y * d) >> (16 - PROJ_SHIFT);\ } -#elif defined(MODE13) - #define PERSPECTIVE(x, y, z) {\ - int32 dz = (z >> (FIXED_SHIFT + FOV_SHIFT - 1)) / 3;\ - if (dz >= DIV_TABLE_SIZE) dz = DIV_TABLE_SIZE - 1;\ - int32 d = FixedInvU(dz);\ - x = d * (x >> 14) >> 12;\ - y = d * (y >> 14) >> 12;\ - } #elif defined(MODE4) #define PERSPECTIVE_DZ(z) ((z >> 4) + (z >> 6)) diff --git a/src/platform/dos/DOS4GW.exe b/src/platform/dos/DOS4GW.exe new file mode 100644 index 0000000000000000000000000000000000000000..79f04ac2e912e502b5a12c8d392784087dba3a45 GIT binary patch literal 265396 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 z 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ⅅ3`ur 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 J1q}iA{{Sq> 5) & 0x1F) << 1); + outp(0x03C9, ((c >> 10) & 0x1F) << 1); + } +} + +void DOS_ISR timerISR() +{ + frameIndex++; + + outp(0x20, 0x20); +} + +void videoAcquire() +{ + setVideoMode(); + + old_timerISR = _dos_getvect(PIT_TIMER); + _dos_setvect(PIT_TIMER, timerISR); + + uint32 divisor = 1193182 / 60; + outp(0x43, 0x36); + outp(0x40, divisor & 0xFF); + outp(0x40, divisor >> 8); +} + +void videoRelease() +{ + _dos_setvect(PIT_TIMER, old_timerISR); + setTextMode(); +} + +void waitVBlank() +{ + while ((inp(0x03DA) & 0x08)); + while (!(inp(0x03DA) & 0x08)); +} + +void blit() +{ + memcpy((uint8*)0xA0000, fb, VRAM_WIDTH * FRAME_HEIGHT * 2); +} + +void DOS_ISR keyISR() +{ + uint32 scancode = inp(0x60); + + if (scancode != 0xE0) { + keyState[scancode & 0x7F] = ((scancode & 0x80) == 0); + } + + outp(0x20, 0x20); +} + +void inputAcquire() +{ + old_keyISR = _dos_getvect(PIT_KEYBOARD); + _dos_setvect(PIT_KEYBOARD, keyISR); +} + +void inputRelease() +{ + _dos_setvect(PIT_KEYBOARD, old_keyISR); +} + +void inputUpdate() +{ + keys = 0; + if (keyState[KB_UP]) keys |= IK_UP; + if (keyState[KB_RIGHT]) keys |= IK_RIGHT; + if (keyState[KB_DOWN]) keys |= IK_DOWN; + if (keyState[KB_LEFT]) keys |= IK_LEFT; + if (keyState[KB_X]) keys |= IK_A; + if (keyState[KB_Z]) keys |= IK_B; + if (keyState[KB_A]) keys |= IK_L; + if (keyState[KB_S]) keys |= IK_R; + if (keyState[KB_ENTER]) keys |= IK_START; + if (keyState[KB_TAB]) keys |= IK_SELECT; +} + +int32 osGetSystemTimeMS() +{ + return 0; +} + +bool osSaveSettings() +{ + return false; +} + +bool osLoadSettings() +{ + return false; +} + +bool osCheckSave() +{ + return false; +} + +bool osSaveGame() +{ + return false; +} + +bool osLoadGame() +{ + return false; +} + +void osJoyVibrate(int32 index, int32 L, int32 R) {} + +void* osLoadLevel(const char* name) +{ + sndStop(); + +// level1 + char buf[32]; + + delete[] levelData; + + sprintf(buf, "data/%s.PKD", name); + + FILE *f = fopen(buf, "rb"); + + if (!f) + return NULL; + + { + fseek(f, 0, SEEK_END); + int32 size = ftell(f); + fseek(f, 0, SEEK_SET); + uint8* data = new uint8[size]; + fread(data, 1, size, f); + fclose(f); + + levelData = data; + } + +// tracks + if (!TRACKS_IMA) + { + FILE *f = fopen("data/TRACKS.IMA", "rb"); + if (!f) + return NULL; + + fseek(f, 0, SEEK_END); + int32 size = ftell(f); + fseek(f, 0, SEEK_SET); + uint8* data = new uint8[size]; + fread(data, 1, size, f); + fclose(f); + + TRACKS_IMA = data; + } + + if (!TITLE_SCR) + { + FILE *f = fopen("data/TITLE.SCR", "rb"); + if (!f) + return NULL; + + fseek(f, 0, SEEK_END); + int32 size = ftell(f); + fseek(f, 0, SEEK_SET); + uint8* data = new uint8[size]; + fread(data, 1, size, f); + fclose(f); + + TITLE_SCR = data; + } + + return (void*)levelData; +} + +int main(void) +{ + videoAcquire(); + inputAcquire(); + + gameInit(gLevelInfo[gLevelID].name); + + int32 lastFrameIndex = -1; + + //int extraFrame = 0; + + while (1) + { + inputUpdate(); + + if (keyState[KB_ESC]) + break; + + int32 frame = frameIndex / 2; + gameUpdate(frame - lastFrameIndex); + lastFrameIndex = frame; + + gameRender(); + + fpsCounter++; + if (frameIndex >= 60) { + frameIndex -= 60; + lastFrameIndex -= 30; + + fps = fpsCounter; + + fpsCounter = 0; + } + + blit(); + } + + inputRelease(); + videoRelease(); + + return 0; +} diff --git a/src/platform/gba/rasterizer_mode13.h b/src/platform/dos/rasterizer.h similarity index 97% rename from src/platform/gba/rasterizer_mode13.h rename to src/platform/dos/rasterizer.h index dc8e054..e83d07f 100644 --- a/src/platform/gba/rasterizer_mode13.h +++ b/src/platform/dos/rasterizer.h @@ -14,6 +14,9 @@ extern const uint8* tile; #define rasterizeFTA rasterizeFTA_c #define rasterizeGTA rasterizeGTA_c #define rasterizeSprite rasterizeSprite_c +#define rasterizeLineH rasterizeLineH_c +#define rasterizeLineV rasterizeLineV_c +#define rasterizeFillS rasterizeFillS_c void rasterizeS_c(uint16* pixel, const VertexLink* L, const VertexLink* R) { @@ -123,9 +126,9 @@ void rasterizeS_c(uint16* pixel, const VertexLink* L, const VertexLink* R) } } -void rasterizeF_c(uint16* pixel, const VertexLink* L, const VertexLink* R, int32 index) +void rasterizeF_c(uint16* pixel, const VertexLink* L, const VertexLink* R) { - uint16 color = lightmap[(L->v.g << 8) | index]; + uint16 color = lightmap[(L->v.g << 8) | L->t.t]; color |= (color << 8); int32 Lh = 0; @@ -228,13 +231,13 @@ void rasterizeF_c(uint16* pixel, const VertexLink* L, const VertexLink* R, int32 } } -void rasterizeG_c(uint16* pixel, const VertexLink* L, const VertexLink* R, int32 index) +void rasterizeG_c(uint16* pixel, const VertexLink* L, const VertexLink* R) { int32 Lh = 0, Rh = 0; int32 Lx, Rx, Ldx = 0, Rdx = 0; int32 Lg, Rg, Ldg = 0, Rdg = 0; - const uint8* ft_lightmap = lightmap + index; + const uint8* ft_lightmap = lightmap + L->t.t; while (1) { @@ -794,4 +797,19 @@ void rasterizeSprite_c(uint16* pixel, const VertexLink* L, const VertexLink* R) // TODO } +void rasterizeLineH_c(uint16* pixel, const VertexLink* L, const VertexLink* R) +{ + // TODO +} + +void rasterizeLineV_c(uint16* pixel, const VertexLink* L, const VertexLink* R) +{ + // TODO +} + +void rasterizeFillS_c(uint16* pixel, const VertexLink* L, const VertexLink* R) +{ + // TODO +} + #endif diff --git a/src/platform/dos/sound.cpp b/src/platform/dos/sound.cpp new file mode 100644 index 0000000..2512df5 --- /dev/null +++ b/src/platform/dos/sound.cpp @@ -0,0 +1,51 @@ +#include "common.h" + +void sndInit() +{ + // TODO +} + +void sndInitSamples() +{ + // TODO +} + +void sndFreeSamples() +{ + // TODO +} + +void* sndPlaySample(int32 index, int32 volume, int32 pitch, int32 mode) +{ + return NULL; // TODO +} + +void sndPlayTrack(int32 track) +{ + // TODO +} + +void sndStopTrack() +{ + // TODO +} + +bool sndTrackIsPlaying() +{ + return false; // TODO +} + +void sndStopSample(int32 index) +{ + // TODO +} + +void sndStop() +{ + // TODO +} + +void sndFill(uint8* buffer, int32 count) +{ + // TODO +} diff --git a/src/platform/gba/IMGS/O/P/OPLA.bmp b/src/platform/gba/IMGS/O/P/OPLA.bmp new file mode 100644 index 0000000000000000000000000000000000000000..732c4a2038623142e1f01e2c073c9b6f41fbf746 GIT binary patch literal 19256 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 NQLot6p*>2a{{#CB@zMYQ literal 0 HcmV?d00001 diff --git a/src/platform/gba/Makefile b/src/platform/gba/Makefile index 7e3b792..1d9aa9b 100644 --- a/src/platform/gba/Makefile +++ b/src/platform/gba/Makefile @@ -22,7 +22,7 @@ include $(DEVKITARM)/gba_rules #--------------------------------------------------------------------------------- TARGET := OpenLara BUILD := build -SOURCES := ../../fixed . +SOURCES := ../../fixed . asm INCLUDES := include . ../../fixed DATA := data MUSIC := @@ -120,6 +120,7 @@ export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) $(BUILD): @[ -d $@ ] || mkdir -p $@ @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + gbafix $(TARGET).gba -tOpenLara -cOPLA #--------------------------------------------------------------------------------- clean: diff --git a/src/platform/gba/Makefile_tns b/src/platform/gba/Makefile_tns deleted file mode 100644 index e60cf91..0000000 --- a/src/platform/gba/Makefile_tns +++ /dev/null @@ -1,49 +0,0 @@ -DEBUG = FALSE - -GCC = nspire-gcc -AS = nspire-as -GXX = nspire-g++ -LD = nspire-ld -GENZEHN = genzehn - -GCCFLAGS = -marm -march=armv5te -mtune=arm926ej-s -std=c++11 -flto -ffast-math -fomit-frame-pointer -fno-exceptions -fno-rtti -ffunction-sections -fdata-sections -D__TNS__ -I../../ -LDFLAGS = -Wl,--gc-sections -Wl,--as-needed -flto -Wno-alloc-size-larger-than -ZEHNFLAGS = --name "OpenLara" - -ifeq ($(DEBUG),FALSE) - GCCFLAGS += -Ofast -else - GCCFLAGS += -O0 -g -endif - -OBJS = $(patsubst %.c, %.o, $(shell find . -name \*.c)) -OBJS += $(patsubst %.cpp, %.o, $(shell find . -name \*.cpp)) -OBJS += $(patsubst %.s, %.o, $(shell find . -name \*.s)) -EXE = OpenLara -DISTDIR = . -vpath %.tns $(DISTDIR) -vpath %.elf $(DISTDIR) - -all: $(EXE).prg.tns - -%.o: %.c - $(GCC) $(GCCFLAGS) -c $< - -%.o: %.cpp - $(GXX) $(GCCFLAGS) -c $< - -%.o: %.s - $(AS) -c $< - -$(EXE).elf: $(OBJS) - mkdir -p $(DISTDIR) - $(LD) $^ -o $(DISTDIR)/$@ $(LDFLAGS) - -$(EXE).tns: $(EXE).elf - $(GENZEHN) --input $(DISTDIR)/$^ --output $(DISTDIR)/$@ $(ZEHNFLAGS) - -$(EXE).prg.tns: $(EXE).tns - make-prg $(DISTDIR)/$^ $(DISTDIR)/$@ - -clean: - rm -f *.o $(DISTDIR)/$(EXE).tns $(DISTDIR)/$(EXE).elf $(DISTDIR)/$(EXE).prg.tns diff --git a/src/platform/gba/OpenLara.vcxproj b/src/platform/gba/OpenLara.vcxproj index f304485..26297ce 100644 --- a/src/platform/gba/OpenLara.vcxproj +++ b/src/platform/gba/OpenLara.vcxproj @@ -38,8 +38,7 @@ - - + 15.0 diff --git a/src/platform/gba/boxIsVisible.s b/src/platform/gba/asm/boxIsVisible.s similarity index 100% rename from src/platform/gba/boxIsVisible.s rename to src/platform/gba/asm/boxIsVisible.s diff --git a/src/platform/gba/boxRotateYQ.s b/src/platform/gba/asm/boxRotateYQ.s similarity index 100% rename from src/platform/gba/boxRotateYQ.s rename to src/platform/gba/asm/boxRotateYQ.s diff --git a/src/platform/gba/boxTranslate.s b/src/platform/gba/asm/boxTranslate.s similarity index 100% rename from src/platform/gba/boxTranslate.s rename to src/platform/gba/asm/boxTranslate.s diff --git a/src/platform/gba/common_asm.inc b/src/platform/gba/asm/common_asm.inc similarity index 100% rename from src/platform/gba/common_asm.inc rename to src/platform/gba/asm/common_asm.inc diff --git a/src/platform/gba/faceAddMeshQuads.s b/src/platform/gba/asm/faceAddMeshQuads.s similarity index 100% rename from src/platform/gba/faceAddMeshQuads.s rename to src/platform/gba/asm/faceAddMeshQuads.s diff --git a/src/platform/gba/faceAddMeshTriangles.s b/src/platform/gba/asm/faceAddMeshTriangles.s similarity index 100% rename from src/platform/gba/faceAddMeshTriangles.s rename to src/platform/gba/asm/faceAddMeshTriangles.s diff --git a/src/platform/gba/faceAddRoomQuads.s b/src/platform/gba/asm/faceAddRoomQuads.s similarity index 100% rename from src/platform/gba/faceAddRoomQuads.s rename to src/platform/gba/asm/faceAddRoomQuads.s diff --git a/src/platform/gba/faceAddRoomTriangles.s b/src/platform/gba/asm/faceAddRoomTriangles.s similarity index 100% rename from src/platform/gba/faceAddRoomTriangles.s rename to src/platform/gba/asm/faceAddRoomTriangles.s diff --git a/src/platform/gba/matrixLerp.s b/src/platform/gba/asm/matrixLerp.s similarity index 100% rename from src/platform/gba/matrixLerp.s rename to src/platform/gba/asm/matrixLerp.s diff --git a/src/platform/gba/matrixPush.s b/src/platform/gba/asm/matrixPush.s similarity index 100% rename from src/platform/gba/matrixPush.s rename to src/platform/gba/asm/matrixPush.s diff --git a/src/platform/gba/matrixRotate.s b/src/platform/gba/asm/matrixRotate.s similarity index 100% rename from src/platform/gba/matrixRotate.s rename to src/platform/gba/asm/matrixRotate.s diff --git a/src/platform/gba/matrixSetBasis.s b/src/platform/gba/asm/matrixSetBasis.s similarity index 100% rename from src/platform/gba/matrixSetBasis.s rename to src/platform/gba/asm/matrixSetBasis.s diff --git a/src/platform/gba/matrixSetIdentity.s b/src/platform/gba/asm/matrixSetIdentity.s similarity index 100% rename from src/platform/gba/matrixSetIdentity.s rename to src/platform/gba/asm/matrixSetIdentity.s diff --git a/src/platform/gba/matrixTranslate.s b/src/platform/gba/asm/matrixTranslate.s similarity index 100% rename from src/platform/gba/matrixTranslate.s rename to src/platform/gba/asm/matrixTranslate.s diff --git a/src/platform/gba/rasterizeF.s b/src/platform/gba/asm/rasterizeF.s similarity index 100% rename from src/platform/gba/rasterizeF.s rename to src/platform/gba/asm/rasterizeF.s diff --git a/src/platform/gba/rasterizeFT.s b/src/platform/gba/asm/rasterizeFT.s similarity index 100% rename from src/platform/gba/rasterizeFT.s rename to src/platform/gba/asm/rasterizeFT.s diff --git a/src/platform/gba/rasterizeFTA.s b/src/platform/gba/asm/rasterizeFTA.s similarity index 100% rename from src/platform/gba/rasterizeFTA.s rename to src/platform/gba/asm/rasterizeFTA.s diff --git a/src/platform/gba/rasterizeFillS.s b/src/platform/gba/asm/rasterizeFillS.s similarity index 100% rename from src/platform/gba/rasterizeFillS.s rename to src/platform/gba/asm/rasterizeFillS.s diff --git a/src/platform/gba/rasterizeGT.s b/src/platform/gba/asm/rasterizeGT.s similarity index 100% rename from src/platform/gba/rasterizeGT.s rename to src/platform/gba/asm/rasterizeGT.s diff --git a/src/platform/gba/rasterizeGTA.s b/src/platform/gba/asm/rasterizeGTA.s similarity index 100% rename from src/platform/gba/rasterizeGTA.s rename to src/platform/gba/asm/rasterizeGTA.s diff --git a/src/platform/gba/rasterizeLineH.s b/src/platform/gba/asm/rasterizeLineH.s similarity index 98% rename from src/platform/gba/rasterizeLineH.s rename to src/platform/gba/asm/rasterizeLineH.s index fab7a0f..667b708 100644 --- a/src/platform/gba/rasterizeLineH.s +++ b/src/platform/gba/asm/rasterizeLineH.s @@ -24,7 +24,7 @@ rasterizeLineH_asm: strh tmp, [pixel], #2 subs width, #1 beq .scanline_end - + mov pc, lr .align_right: tst width, #1 beq .scanline_block_2px diff --git a/src/platform/gba/rasterizeLineV.s b/src/platform/gba/asm/rasterizeLineV.s similarity index 100% rename from src/platform/gba/rasterizeLineV.s rename to src/platform/gba/asm/rasterizeLineV.s diff --git a/src/platform/gba/rasterizeS.s b/src/platform/gba/asm/rasterizeS.s similarity index 100% rename from src/platform/gba/rasterizeS.s rename to src/platform/gba/asm/rasterizeS.s diff --git a/src/platform/gba/rasterize_dummy.s b/src/platform/gba/asm/rasterize_dummy.s similarity index 100% rename from src/platform/gba/rasterize_dummy.s rename to src/platform/gba/asm/rasterize_dummy.s diff --git a/src/platform/gba/sdiv32.s b/src/platform/gba/asm/sdiv32.s similarity index 100% rename from src/platform/gba/sdiv32.s rename to src/platform/gba/asm/sdiv32.s diff --git a/src/platform/gba/sndIMA.s b/src/platform/gba/asm/sndIMA.s similarity index 100% rename from src/platform/gba/sndIMA.s rename to src/platform/gba/asm/sndIMA.s diff --git a/src/platform/gba/sndPCM.s b/src/platform/gba/asm/sndPCM.s similarity index 100% rename from src/platform/gba/sndPCM.s rename to src/platform/gba/asm/sndPCM.s diff --git a/src/platform/gba/sndWrite.s b/src/platform/gba/asm/sndWrite.s similarity index 100% rename from src/platform/gba/sndWrite.s rename to src/platform/gba/asm/sndWrite.s diff --git a/src/platform/gba/sphereIsVisible.s b/src/platform/gba/asm/sphereIsVisible.s similarity index 100% rename from src/platform/gba/sphereIsVisible.s rename to src/platform/gba/asm/sphereIsVisible.s diff --git a/src/platform/gba/transformMesh.s b/src/platform/gba/asm/transformMesh.s similarity index 100% rename from src/platform/gba/transformMesh.s rename to src/platform/gba/asm/transformMesh.s diff --git a/src/platform/gba/transformRoom.s b/src/platform/gba/asm/transformRoom.s similarity index 100% rename from src/platform/gba/transformRoom.s rename to src/platform/gba/asm/transformRoom.s diff --git a/src/platform/gba/transformRoomUW.s b/src/platform/gba/asm/transformRoomUW.s similarity index 100% rename from src/platform/gba/transformRoomUW.s rename to src/platform/gba/asm/transformRoomUW.s diff --git a/src/platform/gba/udiv32.s b/src/platform/gba/asm/udiv32.s similarity index 100% rename from src/platform/gba/udiv32.s rename to src/platform/gba/asm/udiv32.s diff --git a/src/platform/gba/deploy_dos.bat b/src/platform/gba/deploy_dos.bat deleted file mode 100644 index e6a87f0..0000000 --- a/src/platform/gba/deploy_dos.bat +++ /dev/null @@ -1,3 +0,0 @@ -rm *.obj -wcl386.exe *.cpp -fe=OpenLara.exe -i="C:\WATCOM/h" -wcd726 -w4 -e25 -zq -ox -d2 -6r -bt=dos -fo=.obj -zmf -xd -l=pmodew -C:\Dosbox\dosbox -conf dosbox.conf OpenLara.exe \ No newline at end of file diff --git a/src/platform/gba/main.cpp b/src/platform/gba/main.cpp index 18f79fd..9aaea30 100644 --- a/src/platform/gba/main.cpp +++ b/src/platform/gba/main.cpp @@ -1,513 +1,100 @@ -#if defined(_WIN32) || defined(__DOS__) - const void* TRACKS_IMA; - const void* TITLE_SCR; - const void* levelData; -#endif - #include "game.h" EWRAM_DATA int32 fps; EWRAM_DATA int32 frameIndex = 0; EWRAM_DATA int32 fpsCounter = 0; - -#if defined(_WIN32) - uint32 SCREEN[FRAME_WIDTH * FRAME_HEIGHT]; - - HWND hWnd; - - LARGE_INTEGER g_timer; - LARGE_INTEGER g_current; - - #define WND_WIDTH 240*4 - #define WND_HEIGHT 160*4 - - uint16 MEM_PAL_BG[256]; - - void osSetPalette(const uint16* palette) - { - memcpy(MEM_PAL_BG, palette, 256 * 2); - } - - int32 osGetSystemTimeMS() - { - return GetTickCount(); - } - - bool osSaveSettings() - { - FILE* f = fopen("settings.dat", "wb"); - if (!f) return false; - fwrite(&gSettings, sizeof(gSettings), 1, f); - fclose(f); - return true; - } - - bool osLoadSettings() - { - FILE* f = fopen("settings.dat", "rb"); - if (!f) return false; - uint8 version; - fread(&version, 1, 1, f); - if (version != gSettings.version) { - fclose(f); - return false; - } - fread((uint8*)&gSettings + 1, sizeof(gSettings) - 1, 1, f); - fclose(f); - return true; - } - - bool osCheckSave() - { - FILE* f = fopen("savegame.dat", "rb"); - if (!f) return false; - fclose(f); - return true; - } - - bool osSaveGame() - { - FILE* f = fopen("savegame.dat", "wb"); - if (!f) return false; - fwrite(&gSaveGame, sizeof(gSaveGame), 1, f); - fwrite(&gSaveData, gSaveGame.dataSize, 1, f); - fclose(f); - return true; - } - - bool osLoadGame() - { - FILE* f = fopen("savegame.dat", "rb"); - if (!f) return false; - - uint32 version; - fread(&version, sizeof(version), 1, f); - - if (SAVEGAME_VER != version) - { - fclose(f); - return false; - } - - fread(&gSaveGame.dataSize, sizeof(gSaveGame) - sizeof(version), 1, f); - fread(&gSaveData, gSaveGame.dataSize, 1, f); - fclose(f); - return true; - } - - void osJoyVibrate(int32 index, int32 L, int32 R) {} - -#elif defined(__GBA__) - void osSetPalette(const uint16* palette) - { - memcpy((uint16*)MEM_PAL_BG, palette, 256 * 2); - } - - int32 osGetSystemTimeMS() - { - return 0; // TODO - } - - const uint8 SRAM_MAGIC[4] = { 14, 02, 19, 68 }; - - int32 byteCopy(volatile uint8* dst, const volatile uint8* src, uint32 count) - { - for (uint32 i = 0; i < count; i++) - { - *dst++ = *src++; - } - return count; - } - - bool checkSRAM(volatile uint8* src) - { - for (uint32 i = 0; i < sizeof(SRAM_MAGIC); i++) - { - if (SRAM_MAGIC[i] != *src++) - return false; - } - return true; - } - - bool osSaveSettings() - { - volatile uint8* ptr = (uint8*)MEM_SRAM; - - byteCopy(ptr, SRAM_MAGIC, 4); - if (!checkSRAM(ptr)) - return false; - ptr += 4; - - volatile uint8* data = (uint8*)&gSettings; - byteCopy(ptr, data, sizeof(gSettings)); - - return true; - } - - bool osLoadSettings() - { - volatile uint8* ptr = (uint8*)MEM_SRAM; - - if (!checkSRAM(ptr)) - return false; - ptr += 4; - - if (SETTINGS_VER != *ptr) - return false; - - volatile uint8* data = (uint8*)&gSettings; - byteCopy(data, ptr, sizeof(gSettings)); - - return true; - } - - bool osCheckSave() - { - volatile uint8* ptr = (uint8*)MEM_SRAM + SETTINGS_SIZE; - - if (!checkSRAM(ptr)) - return false; - ptr += 4; - - uint32 version; - byteCopy((uint8*)&version, ptr, sizeof(version)); - - return (SAVEGAME_VER == version); - } - - bool osSaveGame() - { - volatile uint8* ptr = (uint8*)MEM_SRAM + SETTINGS_SIZE; - - byteCopy(ptr, SRAM_MAGIC, 4); - if (!checkSRAM(ptr)) - return false; - - ptr += 4; - ptr += byteCopy(ptr, (uint8*)&gSaveGame, sizeof(gSaveGame)); - byteCopy(ptr, (uint8*)&gSaveData, gSaveGame.dataSize); - return true; - } - - bool osLoadGame() - { - if (!osCheckSave()) - return false; - - volatile uint8* ptr = (uint8*)MEM_SRAM + SETTINGS_SIZE + 4; // skip magic - - ptr += byteCopy((uint8*)&gSaveGame, ptr, sizeof(gSaveGame)); - byteCopy((uint8*)&gSaveData, ptr, gSaveGame.dataSize); - - return true; - } - - #define GPIO_RUMBLE_DATA (*(vu16*)0x80000C4) - #define GPIO_RUMBLE_DIRECTION (*(vu16*)0x80000C6) - #define GPIO_RUMBLE_CONTROL (*(vu16*)0x80000C8) - #define GPIO_RUMBLE_MASK (1 << 3) - - #define CART_RUMBLE_TICKS 6 - - EWRAM_DATA int32 cartRumbleTick = 0; - - void rumbleInit() - { - GPIO_RUMBLE_DIRECTION = GPIO_RUMBLE_MASK; - GPIO_RUMBLE_CONTROL = 1; - } - - void rumbleSet(bool enable) - { - if (enable) { - GPIO_RUMBLE_DATA |= GPIO_RUMBLE_MASK; - cartRumbleTick = CART_RUMBLE_TICKS; - } else { - GPIO_RUMBLE_DATA &= ~GPIO_RUMBLE_MASK; - cartRumbleTick = 0; - } - } - - void rumbleUpdate(int32 frames) - { - if (!cartRumbleTick) - return; - - cartRumbleTick -= frames; - - if (cartRumbleTick <= 0) { - rumbleSet(false); - } - } - - void osJoyVibrate(int32 index, int32 L, int32 R) - { - if (!gSettings.controls_vibration) - return; - rumbleSet(X_MAX(L, R) > 0); - } -#elif defined(__TNS__) - unsigned int osTime; - volatile unsigned int *timerBUS; - volatile unsigned int *timerCLK; - volatile unsigned int *timerCTR; - volatile unsigned int *timerDIV; - - void timerInit() - { - timerBUS = (unsigned int*)0x900B0018; - timerCLK = (unsigned int*)0x900C0004; - timerCTR = (unsigned int*)0x900C0008; - timerDIV = (unsigned int*)0x900C0080; - - *timerBUS &= ~(1 << 11); - *timerDIV = 0x0A; - *timerCTR = 0x82; - - osTime = *timerCLK; - } - - int32 GetTickCount() - { - return (osTime - *timerCLK) / 33; - } - - int32 osGetSystemTimeMS() - { - return *timerCLK / 33; - } - - bool osSaveSettings() - { - return false; - } - - bool osLoadSettings() - { - return false; - } - - bool osCheckSave() - { - return false; - } - - bool osSaveGame() - { - return false; - } - - bool osLoadGame() - { - return false; - } - - void osJoyVibrate(int32 index, int32 L, int32 R) {} - - void osSetPalette(const uint16* palette) - { - memcpy((uint16*)0xC0000200, palette, 256 * 2); - } - - touchpad_info_t* touchInfo; - touchpad_report_t touchReport; - uint8 inputData[0x20]; - - bool keyDown(const t_key &key) - { - return (*(short*)(inputData + key.tpad_row)) & key.tpad_col; - } - - void inputInit() - { - touchInfo = is_touchpad ? touchpad_getinfo() : NULL; - } - - void inputUpdate() - { - keys = 0; - - if (touchInfo) - { - touchpad_scan(&touchReport); - } - - memcpy(inputData, (void*)0x900E0000, 0x20); - - if (touchInfo && touchReport.contact) - { - float tx = float(touchReport.x) / float(touchInfo->width) * 2.0f - 1.0f; - float ty = float(touchReport.y) / float(touchInfo->height) * 2.0f - 1.0f; - - if (tx < -0.5f) keys |= IK_LEFT; - if (tx > 0.5f) keys |= IK_RIGHT; - if (ty > 0.5f) keys |= IK_UP; - if (ty < -0.5f) keys |= IK_DOWN]; - } - - if (keyDown(KEY_NSPIRE_2)) keys |= IK_A; - if (keyDown(KEY_NSPIRE_3)) keys |= IK_B; - if (keyDown(KEY_NSPIRE_7)) keys |= IK_L; - if (keyDown(KEY_NSPIRE_9)) keys |= IK_R; - if (keyDown(KEY_NSPIRE_ENTER)) keys |= IK_START; - if (keyDown(KEY_NSPIRE_SPACE)) keys |= IK_SELECT; - } -#elif defined(__DOS__) - #define KB_ESC 1 - #define KB_A 30 - #define KB_S 31 - #define KB_Z 44 - #define KB_X 45 - #define KB_UP 72 - #define KB_LEFT 75 - #define KB_RIGHT 77 - #define KB_DOWN 80 - #define KB_ENTER 20 - #define KB_TAB 15 - - #define DOS_ISR __interrupt __far - - #define PIT_TIMER 0x08 - #define PIT_KEYBOARD 0x09 - - - void (DOS_ISR *old_timerISR)(); - void (DOS_ISR *old_keyISR)(); - - bool keyState[128]; - - void setVideoMode(); - #pragma aux setVideoMode = \ - "mov ax,13h" \ - "int 10h"; - - void setTextMode(); - #pragma aux setTextMode = \ - "mov ax,03h" \ - "int 10h"; - - void osSetPalette(const uint16* palette) - { - outp(0x03C8, 0); - for (int32 i = 0; i < 256; i++) - { - uint16 c = *palette++; - outp(0x03C9, (c & 0x1F) << 1); - outp(0x03C9, ((c >> 5) & 0x1F) << 1); - outp(0x03C9, ((c >> 10) & 0x1F) << 1); - } - } - - void DOS_ISR timerISR() - { - frameIndex++; - - outp(0x20, 0x20); - } - - void videoAcquire() - { - setVideoMode(); - - old_timerISR = _dos_getvect(PIT_TIMER); - _dos_setvect(PIT_TIMER, timerISR); - - uint32 divisor = 1193182 / 60; - outp(0x43, 0x36); - outp(0x40, divisor & 0xFF); - outp(0x40, divisor >> 8); - } - - void videoRelease() - { - _dos_setvect(PIT_TIMER, old_timerISR); - setTextMode(); - } - - void waitVBlank() - { - while ((inp(0x03DA) & 0x08)); - while (!(inp(0x03DA) & 0x08)); - } - - void blit() - { - memcpy((uint8*)0xA0000, fb, VRAM_WIDTH * FRAME_HEIGHT * 2); - } - - void DOS_ISR keyISR() - { - uint32 scancode = inp(0x60); - - if (scancode != 0xE0) { - keyState[scancode & 0x7F] = ((scancode & 0x80) == 0); - } - - outp(0x20, 0x20); - } - - void inputAcquire() - { - old_keyISR = _dos_getvect(PIT_KEYBOARD); - _dos_setvect(PIT_KEYBOARD, keyISR); - } - - void inputRelease() - { - _dos_setvect(PIT_KEYBOARD, old_keyISR); - } - - void inputUpdate() - { - keys = 0; - if (keyState[KB_UP]) keys |= IK_UP; - if (keyState[KB_RIGHT]) keys |= IK_RIGHT; - if (keyState[KB_DOWN]) keys |= IK_DOWN; - if (keyState[KB_LEFT]) keys |= IK_LEFT; - if (keyState[KB_X]) keys |= IK_A; - if (keyState[KB_Z]) keys |= IK_B; - if (keyState[KB_A]) keys |= IK_L; - if (keyState[KB_S]) keys |= IK_R; - if (keyState[KB_ENTER]) keys |= IK_START; - if (keyState[KB_TAB]) keys |= IK_SELECT; - } - - int32 osGetSystemTimeMS() - { - return 0; - } - - bool osSaveSettings() - { - return false; - } - - bool osLoadSettings() - { - return false; - } - - bool osCheckSave() - { - return false; - } - - bool osSaveGame() - { - return false; - } - - bool osLoadGame() - { - return false; - } - - void osJoyVibrate(int32 index, int32 L, int32 R) {} -#endif - EWRAM_DATA uint32 curSoundBuffer = 0; -#if defined(_WIN32) +#ifdef _WIN32 +const void* TRACKS_IMA; +const void* TITLE_SCR; +const void* levelData; + +HWND hWnd; + +LARGE_INTEGER g_timer; +LARGE_INTEGER g_current; + +#define WND_WIDTH 240*4 +#define WND_HEIGHT 160*4 + +uint16 MEM_PAL_BG[256]; +uint32 SCREEN[FRAME_WIDTH * FRAME_HEIGHT]; + +void osSetPalette(const uint16* palette) +{ + memcpy(MEM_PAL_BG, palette, 256 * 2); +} + +int32 osGetSystemTimeMS() +{ + return GetTickCount(); +} + +bool osSaveSettings() +{ + FILE* f = fopen("settings.dat", "wb"); + if (!f) return false; + fwrite(&gSettings, sizeof(gSettings), 1, f); + fclose(f); + return true; +} + +bool osLoadSettings() +{ + FILE* f = fopen("settings.dat", "rb"); + if (!f) return false; + uint8 version; + fread(&version, 1, 1, f); + if (version != gSettings.version) { + fclose(f); + return false; + } + fread((uint8*)&gSettings + 1, sizeof(gSettings) - 1, 1, f); + fclose(f); + return true; +} + +bool osCheckSave() +{ + FILE* f = fopen("savegame.dat", "rb"); + if (!f) return false; + fclose(f); + return true; +} + +bool osSaveGame() +{ + FILE* f = fopen("savegame.dat", "wb"); + if (!f) return false; + fwrite(&gSaveGame, sizeof(gSaveGame), 1, f); + fwrite(&gSaveData, gSaveGame.dataSize, 1, f); + fclose(f); + return true; +} + +bool osLoadGame() +{ + FILE* f = fopen("savegame.dat", "rb"); + if (!f) return false; + + uint32 version; + fread(&version, sizeof(version), 1, f); + + if (SAVEGAME_VER != version) + { + fclose(f); + return false; + } + + fread(&gSaveGame.dataSize, sizeof(gSaveGame) - sizeof(version), 1, f); + fread(&gSaveData, gSaveGame.dataSize, 1, f); + fclose(f); + return true; +} + +void osJoyVibrate(int32 index, int32 L, int32 R) {} + extern uint8 soundBuffer[2 * SND_SAMPLES + 32]; // 32 bytes of silence for DMA overrun while interrupt HWAVEOUT waveOut; @@ -541,34 +128,7 @@ void soundFill() waveOutWrite(waveOut, waveHdr, sizeof(WAVEHDR)); curSoundBuffer ^= 1; } -#elif defined(__GBA__) -extern uint8* soundBuffer; -void soundInit() -{ - sndInit(); - - REG_SOUNDCNT_X = SSTAT_ENABLE; - REG_SOUNDCNT_H = SDS_ATMR0 | SDS_AL | SDS_AR | SDS_ARESET | SDS_A100; - REG_TM0D = 65536 - (16777216 / SND_OUTPUT_FREQ); - REG_TM0CNT = TM_ENABLE; - REG_DMA1DAD = (u32)®_FIFO_A; -} - -void soundFill() -{ - if (curSoundBuffer == 1) { - REG_DMA1CNT = 0; - REG_DMA1SAD = (u32)soundBuffer; - REG_DMA1CNT = DMA_DST_FIXED | DMA_REPEAT | DMA_16 | DMA_AT_FIFO | DMA_ENABLE; - } - - sndFill(soundBuffer + curSoundBuffer * SND_SAMPLES, SND_SAMPLES); - curSoundBuffer ^= 1; -} -#endif - -#if defined(_WIN32) HDC hDC; void blit() @@ -642,9 +202,304 @@ LRESULT CALLBACK wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) return 0; } -#elif defined(__GBA__) +void* osLoadLevel(const char* name) +{ + // level1 + char buf[32]; -void vblank() { + delete[] levelData; + + sprintf(buf, "data/%s.PKD", name); + + FILE *f = fopen(buf, "rb"); + + if (!f) + return NULL; + + { + fseek(f, 0, SEEK_END); + int32 size = ftell(f); + fseek(f, 0, SEEK_SET); + uint8* data = new uint8[size]; + fread(data, 1, size, f); + fclose(f); + + levelData = data; + } + +// tracks + if (!TRACKS_IMA) + { + FILE *f = fopen("data/TRACKS.IMA", "rb"); + if (!f) + return NULL; + + fseek(f, 0, SEEK_END); + int32 size = ftell(f); + fseek(f, 0, SEEK_SET); + uint8* data = new uint8[size]; + fread(data, 1, size, f); + fclose(f); + + TRACKS_IMA = data; + } + + if (!TITLE_SCR) + { + FILE *f = fopen("data/TITLE.SCR", "rb"); + if (!f) + return NULL; + + fseek(f, 0, SEEK_END); + int32 size = ftell(f); + fseek(f, 0, SEEK_SET); + uint8* data = new uint8[size]; + fread(data, 1, size, f); + fclose(f); + + TITLE_SCR = data; + } + + return (void*)levelData; +} + +int main(void) +{ + RECT r = { 0, 0, WND_WIDTH, WND_HEIGHT }; + + AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, false); + int wx = (GetSystemMetrics(SM_CXSCREEN) - (r.right - r.left)) / 2; + int wy = (GetSystemMetrics(SM_CYSCREEN) - (r.bottom - r.top)) / 2; + + hWnd = CreateWindow("static", "OpenLara GBA", WS_OVERLAPPEDWINDOW, wx + r.left, wy + r.top, r.right - r.left, r.bottom - r.top, 0, 0, 0, 0); + hDC = GetDC(hWnd); + + SetWindowLong(hWnd, GWL_WNDPROC, (LONG)&wndProc); + ShowWindow(hWnd, SW_SHOWDEFAULT); + + soundInit(); + + gameInit(gLevelInfo[gLevelID].name); + + MSG msg; + + int32 startTime = GetTickCount() - 33; + int32 lastFrame = 0; + + do { + if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } else { + int32 frame = (GetTickCount() - startTime) / 33; + if (GetAsyncKeyState('R')) frame /= 10; + + int32 count = frame - lastFrame; + if (GetAsyncKeyState('T')) count *= 10; + gameUpdate(count); + lastFrame = frame; + + gameRender(); + + blit(); + } + } while (msg.message != WM_QUIT); + + return 0; +} +#else +void osSetPalette(const uint16* palette) +{ + memcpy((uint16*)MEM_PAL_BG, palette, 256 * 2); +} + +int32 osGetSystemTimeMS() +{ + return 0; // TODO +} + +const uint8 SRAM_MAGIC[4] = { 14, 02, 19, 68 }; + +int32 byteCopy(volatile uint8* dst, const volatile uint8* src, uint32 count) +{ + for (uint32 i = 0; i < count; i++) + { + *dst++ = *src++; + } + return count; +} + +bool checkSRAM(volatile uint8* src) +{ + for (uint32 i = 0; i < sizeof(SRAM_MAGIC); i++) + { + if (SRAM_MAGIC[i] != *src++) + return false; + } + return true; +} + +bool osSaveSettings() +{ + volatile uint8* ptr = (uint8*)MEM_SRAM; + + byteCopy(ptr, SRAM_MAGIC, 4); + if (!checkSRAM(ptr)) + return false; + ptr += 4; + + volatile uint8* data = (uint8*)&gSettings; + byteCopy(ptr, data, sizeof(gSettings)); + + return true; +} + +bool osLoadSettings() +{ + volatile uint8* ptr = (uint8*)MEM_SRAM; + + if (!checkSRAM(ptr)) + return false; + ptr += 4; + + if (SETTINGS_VER != *ptr) + return false; + + volatile uint8* data = (uint8*)&gSettings; + byteCopy(data, ptr, sizeof(gSettings)); + + return true; +} + +bool osCheckSave() +{ + volatile uint8* ptr = (uint8*)MEM_SRAM + SETTINGS_SIZE; + + if (!checkSRAM(ptr)) + return false; + ptr += 4; + + uint32 version; + byteCopy((uint8*)&version, ptr, sizeof(version)); + + return (SAVEGAME_VER == version); +} + +bool osSaveGame() +{ + volatile uint8* ptr = (uint8*)MEM_SRAM + SETTINGS_SIZE; + + byteCopy(ptr, SRAM_MAGIC, 4); + if (!checkSRAM(ptr)) + return false; + + ptr += 4; + ptr += byteCopy(ptr, (uint8*)&gSaveGame, sizeof(gSaveGame)); + byteCopy(ptr, (uint8*)&gSaveData, gSaveGame.dataSize); + return true; +} + +bool osLoadGame() +{ + if (!osCheckSave()) + return false; + + volatile uint8* ptr = (uint8*)MEM_SRAM + SETTINGS_SIZE + 4; // skip magic + + ptr += byteCopy((uint8*)&gSaveGame, ptr, sizeof(gSaveGame)); + byteCopy((uint8*)&gSaveData, ptr, gSaveGame.dataSize); + + return true; +} + +#define GPIO_RUMBLE_DATA (*(vu16*)0x80000C4) +#define GPIO_RUMBLE_DIRECTION (*(vu16*)0x80000C6) +#define GPIO_RUMBLE_CONTROL (*(vu16*)0x80000C8) +#define GPIO_RUMBLE_MASK (1 << 3) + +#define CART_RUMBLE_TICKS 6 + +EWRAM_DATA int32 cartRumbleTick = 0; + +void rumbleInit() +{ + GPIO_RUMBLE_DIRECTION = GPIO_RUMBLE_MASK; + GPIO_RUMBLE_CONTROL = 1; +} + +void rumbleSet(bool enable) +{ + if (enable) { + GPIO_RUMBLE_DATA |= GPIO_RUMBLE_MASK; + cartRumbleTick = CART_RUMBLE_TICKS; + } else { + GPIO_RUMBLE_DATA &= ~GPIO_RUMBLE_MASK; + cartRumbleTick = 0; + } +} + +void rumbleUpdate(int32 frames) +{ + if (!cartRumbleTick) + return; + + cartRumbleTick -= frames; + + if (cartRumbleTick <= 0) { + rumbleSet(false); + } +} + +void osJoyVibrate(int32 index, int32 L, int32 R) +{ + if (!gSettings.controls_vibration) + return; + rumbleSet(X_MAX(L, R) > 0); +} + +void updateInput() +{ + keys = 0; + key_poll(); + if (key_is_down(KEY_UP)) keys |= IK_UP; + if (key_is_down(KEY_RIGHT)) keys |= IK_RIGHT; + if (key_is_down(KEY_DOWN)) keys |= IK_DOWN; + if (key_is_down(KEY_LEFT)) keys |= IK_LEFT; + if (key_is_down(KEY_A)) keys |= IK_A; + if (key_is_down(KEY_B)) keys |= IK_B; + if (key_is_down(KEY_L)) keys |= IK_L; + if (key_is_down(KEY_R)) keys |= IK_R; + if (key_is_down(KEY_START)) keys |= IK_START; + if (key_is_down(KEY_SELECT)) keys |= IK_SELECT; +} + +extern uint8* soundBuffer; + +void soundInit() +{ + sndInit(); + + REG_SOUNDCNT_X = SSTAT_ENABLE; + REG_SOUNDCNT_H = SDS_ATMR0 | SDS_AL | SDS_AR | SDS_ARESET | SDS_A100; + REG_TM0D = 65536 - (16777216 / SND_OUTPUT_FREQ); + REG_TM0CNT = TM_ENABLE; + REG_DMA1DAD = (u32)®_FIFO_A; +} + +void soundFill() +{ + if (curSoundBuffer == 1) { + REG_DMA1CNT = 0; + REG_DMA1SAD = (u32)soundBuffer; + REG_DMA1CNT = DMA_DST_FIXED | DMA_REPEAT | DMA_16 | DMA_AT_FIFO | DMA_ENABLE; + } + + sndFill(soundBuffer + curSoundBuffer * SND_SAMPLES, SND_SAMPLES); + curSoundBuffer ^= 1; +} + +void vblank() +{ frameIndex++; soundFill(); } @@ -691,81 +546,8 @@ void boostEWRAM() } } -#endif - void* osLoadLevel(const char* name) { - sndStop(); - -#if defined(_WIN32) || defined(__TNS__) || defined(__DOS__) - { - // level1 - char buf[32]; - - delete[] levelData; - - #if defined(_WIN32) || defined(__DOS__) - sprintf(buf, "data/%s.PKD", name); - #elif defined(__TNS__) - sprintf(buf, "/documents/OpenLara/%s.PKD.tns", name); - #else - #error - #endif - - FILE *f = fopen(buf, "rb"); - - if (!f) - return NULL; - - { - fseek(f, 0, SEEK_END); - int32 size = ftell(f); - fseek(f, 0, SEEK_SET); - uint8* data = new uint8[size]; - fread(data, 1, size, f); - fclose(f); - - levelData = data; - } - - // track 13 - #if defined(_WIN32) || defined(__DOS__) - if (!TRACKS_IMA) - { - FILE *f = fopen("data/TRACKS.IMA", "rb"); - if (!f) - return NULL; - - fseek(f, 0, SEEK_END); - int32 size = ftell(f); - fseek(f, 0, SEEK_SET); - uint8* data = new uint8[size]; - fread(data, 1, size, f); - fclose(f); - - TRACKS_IMA = data; - } - - if (!TITLE_SCR) - { - FILE *f = fopen("data/TITLE.SCR", "rb"); - if (!f) - return NULL; - - fseek(f, 0, SEEK_END); - int32 size = ftell(f); - fseek(f, 0, SEEK_SET); - uint8* data = new uint8[size]; - fread(data, 1, size, f); - fclose(f); - - TITLE_SCR = data; - } - #endif - } - - return (void*)levelData; -#elif defined(__GBA__) for (int32 i = 0; i < LVL_MAX; i++) { if (strcmp(name, gLevelInfo[i].name) == 0) @@ -774,52 +556,10 @@ void* osLoadLevel(const char* name) gLevelID = LVL_TR1_TITLE; return (void*)gLevelInfo[gLevelID].data; -#endif } -int main(void) { -#if defined(_WIN32) - RECT r = { 0, 0, WND_WIDTH, WND_HEIGHT }; - - AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, false); - int wx = (GetSystemMetrics(SM_CXSCREEN) - (r.right - r.left)) / 2; - int wy = (GetSystemMetrics(SM_CYSCREEN) - (r.bottom - r.top)) / 2; - - hWnd = CreateWindow("static", "OpenLara GBA", WS_OVERLAPPEDWINDOW, wx + r.left, wy + r.top, r.right - r.left, r.bottom - r.top, 0, 0, 0, 0); - hDC = GetDC(hWnd); - - SetWindowLong(hWnd, GWL_WNDPROC, (LONG)&wndProc); - ShowWindow(hWnd, SW_SHOWDEFAULT); - - soundInit(); - - gameInit(gLevelInfo[gLevelID].name); - - MSG msg; - - int32 startTime = GetTickCount() - 33; - int32 lastFrame = 0; - - do { - if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } else { - int32 frame = (GetTickCount() - startTime) / 33; - if (GetAsyncKeyState('R')) frame /= 10; - - int32 count = frame - lastFrame; - if (GetAsyncKeyState('T')) count *= 10; - gameUpdate(count); - lastFrame = frame; - - gameRender(); - - blit(); - } - } while (msg.message != WM_QUIT); - -#elif defined(__GBA__) +int main(void) +{ if (intptr_t(divTable) != MEM_EWRAM) return 0; if (intptr_t(lightmap) != MEM_IWRAM) return 0; @@ -841,33 +581,17 @@ int main(void) { while (1) { - { // input - keys = 0; - key_poll(); - if (key_is_down(KEY_UP)) keys |= IK_UP; - if (key_is_down(KEY_RIGHT)) keys |= IK_RIGHT; - if (key_is_down(KEY_DOWN)) keys |= IK_DOWN; - if (key_is_down(KEY_LEFT)) keys |= IK_LEFT; - if (key_is_down(KEY_A)) keys |= IK_A; - if (key_is_down(KEY_B)) keys |= IK_B; - if (key_is_down(KEY_L)) keys |= IK_L; - if (key_is_down(KEY_R)) keys |= IK_R; - if (key_is_down(KEY_START)) keys |= IK_START; - if (key_is_down(KEY_SELECT)) keys |= IK_SELECT; - } - + updateInput(); int32 frame = frameIndex / 2; int32 delta = frame - lastFrameIndex; - if (!delta) { + if (!delta) continue; - } + lastFrameIndex = frame; rumbleUpdate(delta); - lastFrameIndex = frame; - gameUpdate(delta); #ifdef PROFILING @@ -879,7 +603,8 @@ int main(void) { gameRender(); fpsCounter++; - if (frameIndex >= 60) { + if (frameIndex >= 60) + { frameIndex -= 60; lastFrameIndex -= 30; @@ -888,85 +613,7 @@ int main(void) { fpsCounter = 0; } } -#elif defined(__TNS__) - if (!has_colors) - return 0; - lcd_init(SCR_320x240_8); - - timerInit(); - inputInit(); - - gameInit(gLevelInfo[gLevelID].name); - - int startTime = GetTickCount(); - int lastTime = -16; - int fpsTime = startTime; - - while (1) - { - inputUpdate(); - - if (keyDown(KEY_NSPIRE_ESC)) - { - break; - } - - int time = GetTickCount() - startTime; - gameUpdate((time - lastTime) / 16); - lastTime = time; - - gameRender(); - - lcd_blit(fb, SCR_320x240_8); - //msleep(16); - - fpsCounter++; - if (lastTime - fpsTime >= 1000) - { - fps = fpsCounter; - fpsCounter = 0; - fpsTime = lastTime - ((lastTime - fpsTime) - 1000); - } - } -#elif defined(__DOS__) - videoAcquire(); - inputAcquire(); - - gameInit(gLevelInfo[gLevelID].name); - - int32 lastFrameIndex = -1; - - //int extraFrame = 0; - - while (1) - { - inputUpdate(); - - if (keyState[KB_ESC]) - break; - - int32 frame = frameIndex / 2; - gameUpdate(frame - lastFrameIndex); - lastFrameIndex = frame; - - gameRender(); - - fpsCounter++; - if (frameIndex >= 60) { - frameIndex -= 60; - lastFrameIndex -= 30; - - fps = fpsCounter; - - fpsCounter = 0; - } - - blit(); - } - - inputRelease(); - videoRelease(); -#endif return 0; } +#endif diff --git a/src/platform/gba/rasterizer_mode4.h b/src/platform/gba/rasterizer.h similarity index 100% rename from src/platform/gba/rasterizer_mode4.h rename to src/platform/gba/rasterizer.h diff --git a/src/platform/gba/render.iwram.cpp b/src/platform/gba/render.iwram.cpp index dd4b9eb..719cbd2 100644 --- a/src/platform/gba/render.iwram.cpp +++ b/src/platform/gba/render.iwram.cpp @@ -60,13 +60,7 @@ enum FaceType { #define ALIGNED_LIGHTMAP #endif -#if defined(MODE4) - #include "rasterizer_mode4.h" -#elif defined(MODE13) - #include "rasterizer_mode13.h" -#else - #error no supported video mode set -#endif +#include "rasterizer.h" extern uint8 lightmap[256 * 32]; extern Level level; @@ -507,16 +501,15 @@ bool transformBoxRect(const AABBs* box, RectMinMax* rect) if ((m.e23 < VIEW_MIN_F) || (m.e23 >= VIEW_MAX_F)) return false; - const vec3i v[8] = { - _vec3i( box->minX, box->minY, box->minZ ), - _vec3i( box->maxX, box->minY, box->minZ ), - _vec3i( box->minX, box->maxY, box->minZ ), - _vec3i( box->maxX, box->maxY, box->minZ ), - _vec3i( box->minX, box->minY, box->maxZ ), - _vec3i( box->maxX, box->minY, box->maxZ ), - _vec3i( box->minX, box->maxY, box->maxZ ), - _vec3i( box->maxX, box->maxY, box->maxZ ) - }; + vec3i v[8]; + v[0] = _vec3i( box->minX, box->minY, box->minZ ), + v[1] = _vec3i( box->maxX, box->minY, box->minZ ), + v[2] = _vec3i( box->minX, box->maxY, box->minZ ), + v[3] = _vec3i( box->maxX, box->maxY, box->minZ ), + v[4] = _vec3i( box->minX, box->minY, box->maxZ ), + v[5] = _vec3i( box->maxX, box->minY, box->maxZ ), + v[6] = _vec3i( box->minX, box->maxY, box->maxZ ), + v[7] = _vec3i( box->maxX, box->maxY, box->maxZ ); *rect = RectMinMax( INT_MAX, INT_MAX, INT_MIN, INT_MIN ); @@ -1112,6 +1105,8 @@ X_NOINLINE void renderLine(int32 x, int32 y, int32 width, int32 height, int32 in } ASSERT(width == 1 || height == 1); + ASSERT(width > 0); + ASSERT(height > 0); gVerticesBase[0].x = x; gVerticesBase[0].y = y; @@ -1120,10 +1115,12 @@ X_NOINLINE void renderLine(int32 x, int32 y, int32 width, int32 height, int32 in gVerticesBase[1].x = width; gVerticesBase[1].y = height; + int32 idx = gVerticesBase - gVertices; + Face* f = faceAdd(z); f->flags = (height == 1) ? (FACE_TYPE_LINE_H << FACE_TYPE_SHIFT) : (FACE_TYPE_LINE_V << FACE_TYPE_SHIFT); - f->indices[0] = gVerticesBase - gVertices; - f->indices[1] = f->indices[0] + 1; + f->indices[0] = idx; + f->indices[1] = idx + 1; gVerticesBase += 2; } @@ -1294,9 +1291,12 @@ void renderBar(int32 x, int32 y, int32 width, int32 value, BarType type) int32 iy = y + 2; int32 w = value * width >> 8; - for (int32 i = 0; i < 5; i++) + if (w > 0) { - renderLine(ix, iy++, w, 1, BAR_COLORS[type][i], 0); + for (int32 i = 0; i < 5; i++) + { + renderLine(ix, iy++, w, 1, BAR_COLORS[type][i], 0); + } } renderBorder(x, y, width + 4, BAR_HEIGHT + 4, 27, 19, 17, 0); diff --git a/src/platform/tns/Makefile b/src/platform/tns/Makefile index b4b9d14..df8aa6f 100644 --- a/src/platform/tns/Makefile +++ b/src/platform/tns/Makefile @@ -6,7 +6,7 @@ GXX = nspire-g++ LD = nspire-ld GENZEHN = genzehn -GCCFLAGS = -marm -march=armv5te -mtune=arm926ej-s -std=c++11 -flto -fomit-frame-pointer -fno-exceptions -fno-rtti -ffunction-sections -fdata-sections -D__NDLESS__ -I../../ +GCCFLAGS = -marm -march=armv5te -mtune=arm926ej-s -std=c++11 -flto -ffast-math -fomit-frame-pointer -fno-exceptions -fno-rtti -ffunction-sections -fdata-sections -D__TNS__ -I../../ LDFLAGS = -Wl,--gc-sections -Wl,--as-needed -flto -Wno-alloc-size-larger-than ZEHNFLAGS = --name "OpenLara" @@ -18,7 +18,7 @@ endif OBJS = $(patsubst %.c, %.o, $(shell find . -name \*.c)) OBJS += $(patsubst %.cpp, %.o, $(shell find . -name \*.cpp)) -OBJS += $(patsubst %.S, %.o, $(shell find . -name \*.S)) +OBJS += $(patsubst %.s, %.o, $(shell find . -name \*.s)) EXE = OpenLara DISTDIR = . vpath %.tns $(DISTDIR) @@ -32,10 +32,11 @@ all: $(EXE).prg.tns %.o: %.cpp $(GXX) $(GCCFLAGS) -c $< -%.o: %.S +%.o: %.s $(AS) -c $< $(EXE).elf: $(OBJS) + copy ../gba/render.iwram.cpp render.cpp /Y mkdir -p $(DISTDIR) $(LD) $^ -o $(DISTDIR)/$@ $(LDFLAGS) diff --git a/src/platform/tns/main.cpp b/src/platform/tns/main.cpp index 61fa789..879b66e 100644 --- a/src/platform/tns/main.cpp +++ b/src/platform/tns/main.cpp @@ -1,15 +1,16 @@ -#include +#if defined(_WIN32) || defined(__DOS__) + const void* TRACKS_IMA; + const void* TITLE_SCR; + const void* levelData; +#endif -#include +#include "game.h" -// multi-threading (no sound - no problem) -void* osMutexInit() { return NULL; } -void osMutexFree(void *obj) {} -void osMutexLock(void *obj) {} -void osMutexUnlock(void *obj) {} +int32 fps; +int32 frameIndex = 0; +int32 fpsCounter = 0; +uint32 curSoundBuffer = 0; - -// timing unsigned int osTime; volatile unsigned int *timerBUS; volatile unsigned int *timerCLK; @@ -22,76 +23,126 @@ void timerInit() timerCLK = (unsigned int*)0x900C0004; timerCTR = (unsigned int*)0x900C0008; timerDIV = (unsigned int*)0x900C0080; - + *timerBUS &= ~(1 << 11); *timerDIV = 0x0A; *timerCTR = 0x82; - + osTime = *timerCLK; } -int osGetTimeMS() +int32 GetTickCount() { return (osTime - *timerCLK) / 33; } +int32 osGetSystemTimeMS() +{ + return *timerCLK / 33; +} + +bool osSaveSettings() +{ + return false; +} + +bool osLoadSettings() +{ + return false; +} + +bool osCheckSave() +{ + return false; +} + +bool osSaveGame() +{ + return false; +} + +bool osLoadGame() +{ + return false; +} + +void osJoyVibrate(int32 index, int32 L, int32 R) {} + +void osSetPalette(const uint16* palette) +{ + memcpy((uint16*)0xC0000200, palette, 256 * 2); +} -// input touchpad_info_t* touchInfo; touchpad_report_t touchReport; +uint8 inputData[0x20]; -void touchInit() +bool keyDown(const t_key &key) +{ + return (*(short*)(inputData + key.tpad_row)) & key.tpad_col; +} + +void inputInit() { touchInfo = is_touchpad ? touchpad_getinfo() : NULL; } -bool osJoyReady(int index) +void inputUpdate() { - return (index == 0); -} + keys = 0; -void osJoyVibrate(int index, float L, float R) {} - -bool inputUpdate() -{ - Input::setJoyPos(0, jkL, vec2(0.0f, 0.0f)); - Input::setJoyPos(0, jkR, vec2(0.0f, 0.0f)); - Input::setJoyPos(0, jkLT, vec2(0.0f, 0.0f)); - Input::setJoyPos(0, jkRT, vec2(0.0f, 0.0f)); - if (touchInfo) { touchpad_scan(&touchReport); - if (touchReport.contact) - { - float tx = float(touchReport.x) / float(touchInfo->width) * 2.0f - 1.0f; - float ty = float(touchReport.y) / float(touchInfo->height) * 2.0f - 1.0f; - Input::setJoyPos(0, jkL, vec2(tx, -ty)); - } } - - uint8 inputData[0x20]; + memcpy(inputData, (void*)0x900E0000, 0x20); - #define IS_KEY_DOWN(key) ((*(short*)(inputData + key.tpad_row)) & key.tpad_col) + if (touchInfo && touchReport.contact) + { + float tx = float(touchReport.x) / float(touchInfo->width) * 2.0f - 1.0f; + float ty = float(touchReport.y) / float(touchInfo->height) * 2.0f - 1.0f; - Input::setJoyDown(0, jkA, IS_KEY_DOWN(KEY_NSPIRE_2)); - Input::setJoyDown(0, jkB, IS_KEY_DOWN(KEY_NSPIRE_3)); - Input::setJoyDown(0, jkX, IS_KEY_DOWN(KEY_NSPIRE_5)); - Input::setJoyDown(0, jkY, IS_KEY_DOWN(KEY_NSPIRE_6)); - Input::setJoyDown(0, jkLB, IS_KEY_DOWN(KEY_NSPIRE_7)); - Input::setJoyDown(0, jkRB, IS_KEY_DOWN(KEY_NSPIRE_9)); - Input::setJoyDown(0, jkL, false); - Input::setJoyDown(0, jkR, false); - Input::setJoyDown(0, jkStart, IS_KEY_DOWN(KEY_NSPIRE_ENTER)); - Input::setJoyDown(0, jkSelect, IS_KEY_DOWN(KEY_NSPIRE_MENU)); + if (tx < -0.5f) keys |= IK_LEFT; + if (tx > 0.5f) keys |= IK_RIGHT; + if (ty > 0.5f) keys |= IK_UP; + if (ty < -0.5f) keys |= IK_DOWN]; + } - return !IS_KEY_DOWN(KEY_NSPIRE_ESC); + if (keyDown(KEY_NSPIRE_2)) keys |= IK_A; + if (keyDown(KEY_NSPIRE_3)) keys |= IK_B; + if (keyDown(KEY_NSPIRE_7)) keys |= IK_L; + if (keyDown(KEY_NSPIRE_9)) keys |= IK_R; + if (keyDown(KEY_NSPIRE_ENTER)) keys |= IK_START; + if (keyDown(KEY_NSPIRE_SPACE)) keys |= IK_SELECT; } -unsigned short* osPalette() +void* osLoadLevel(const char* name) { - return (unsigned short*)0xC0000200; +// level1 + char buf[32]; + + delete[] levelData; + + sprintf(buf, "/documents/OpenLara/%s.PKD.tns", name); + + FILE *f = fopen(buf, "rb"); + + if (!f) + return NULL; + + { + fseek(f, 0, SEEK_END); + int32 size = ftell(f); + fseek(f, 0, SEEK_SET); + uint8* data = new uint8[size]; + fread(data, 1, size, f); + fclose(f); + + levelData = data; + } + + return (void*)levelData; } int main(void) @@ -99,47 +150,43 @@ int main(void) if (!has_colors) return 0; - lcd_init(SCR_320x240_565); + lcd_init(SCR_320x240_8); timerInit(); - touchInit(); + inputInit(); - contentDir[0] = saveDir[0] = cacheDir[0] = 0; + gameInit(gLevelInfo[gLevelID].name); - strcpy(contentDir, "/documents/Games/OpenLara/"); - strcpy(saveDir, contentDir); - strcpy(cacheDir, contentDir); + int startTime = GetTickCount(); + int lastTime = -16; + int fpsTime = startTime; - Stream::addPack("content.tns"); - - Core::width = SCREEN_WIDTH; - Core::height = SCREEN_HEIGHT; - - GAPI::swColor = new GAPI::ColorSW[Core::width * Core::height]; - GAPI::resize(); - - Sound::channelsCount = 0; - - Game::init("DATA/LEVEL1.PHD"); - - while (!Core::isQuit) + while (1) { - if (!inputUpdate()) + inputUpdate(); + + if (keyDown(KEY_NSPIRE_ESC)) { - Core::quit(); + break; } - if (Game::update()) + int time = GetTickCount() - startTime; + gameUpdate((time - lastTime) / 16); + lastTime = time; + + gameRender(); + + lcd_blit(fb, SCR_320x240_8); + //msleep(16); + + fpsCounter++; + if (lastTime - fpsTime >= 1000) { - Game::render(); - - lcd_blit(GAPI::swColor, SCR_320x240_565); + fps = fpsCounter; + fpsCounter = 0; + fpsTime = lastTime - ((lastTime - fpsTime) - 1000); } } - delete[] GAPI::swColor; - - //Game::deinit(); - return 0; } diff --git a/src/platform/tns/sound.cpp b/src/platform/tns/sound.cpp new file mode 100644 index 0000000..2512df5 --- /dev/null +++ b/src/platform/tns/sound.cpp @@ -0,0 +1,51 @@ +#include "common.h" + +void sndInit() +{ + // TODO +} + +void sndInitSamples() +{ + // TODO +} + +void sndFreeSamples() +{ + // TODO +} + +void* sndPlaySample(int32 index, int32 volume, int32 pitch, int32 mode) +{ + return NULL; // TODO +} + +void sndPlayTrack(int32 track) +{ + // TODO +} + +void sndStopTrack() +{ + // TODO +} + +bool sndTrackIsPlaying() +{ + return false; // TODO +} + +void sndStopSample(int32 index) +{ + // TODO +} + +void sndStop() +{ + // TODO +} + +void sndFill(uint8* buffer, int32 count) +{ + // TODO +}