diff --git a/Makefile b/Makefile index bc22140..dc19cae 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,8 @@ MAPSRC=maps MAPBIN=data/maps FOLDERS=$(CODEDEFS) $(BIN) $(IR) $(MAPBIN) -CFLAGS += -O2 -g -lm +CFLAGS += -O2 -g -c +LFLAGS += -O2 -g -lm GDCC_TARGET=--bc-target=Doominati GDCC_LFLAGS += $(GDCC_TARGET) @@ -34,15 +35,31 @@ MISC_SOURCES=$(wildcard $(SRC)/m_*.c) MISC_HEADERS=$(wildcard $(SRC)/m_*.h) MISC_OUTPUTS=$(MISC_SOURCES:$(SRC)/m_%.c=$(IR)/m_%.ir) MISC_BINARYS=$(CODEDEFS)/eikyo-misc.bin +MISC_LIBOUTS=$(MISC_SOURCES:$(SRC)/%.c=$(BIN)/%.o) +MISC_LIBRARY=$(BIN)/eikyo-misc.o RNDR_SOURCES=$(wildcard $(SRC)/r_*.c) RNDR_HEADERS=$(wildcard $(SRC)/r_*.h) RNDR_OUTPUTS=$(RNDR_SOURCES:$(SRC)/r_%.c=$(IR)/r_%.ir) RNDR_BINARYS=$(CODEDEFS)/eikyo-render.bin +GOL5_SOURCES=$(SRC)/golan5.c +GOL5_OUTPUTS=$(GOL5_SOURCES:$(SRC)/%.c=$(BIN)/%.o) +GOL5_BINARYS=$(BIN)/golan5 + +LIBC_OUTPUTS=$(IR)/libc.ir $(IR)/libGDCC.ir +LIBC_BINARYS=$(CODEDEFS)/stdlib.bin + .PHONY: clean -all: $(FOLDERS) $(CODEDEFS)/stdlib.bin $(GAME_BINARYS) $(MAIN_BINARYS) $(MISC_BINARYS) $(RNDR_BINARYS) $(MAPS_OUTPUTS) +all: $(FOLDERS) $(LIBC_BINARYS) $(GAME_BINARYS) $(MAIN_BINARYS) $(MISC_BINARYS) $(RNDR_BINARYS) $(MAPS_OUTPUTS) + +$(GOL5_BINARYS): $(GOL5_OUTPUTS) $(MISC_LIBOUTS) +$(GAME_BINARYS): $(GAME_OUTPUTS) +$(MAIN_BINARYS): $(MAIN_OUTPUTS) +$(MISC_BINARYS): $(MISC_OUTPUTS) +$(RNDR_BINARYS): $(RNDR_OUTPUTS) +$(LIBC_BINARYS): $(LIBC_OUTPUTS) $(FOLDERS): mkdir -p $@ @@ -50,25 +67,22 @@ $(FOLDERS): clean: rm -f $(addsuffix /*,$(FOLDERS)) -$(MAPBIN)/%.gmf0: $(MAPSRC)/%.gmf9 $(BIN)/golan5 - $(BIN)/golan5 $< $@ +$(MAPBIN)/%.gmf0: $(MAPSRC)/%.gmf9 $(GOL5_BINARYS) + $(GOL5_BINARYS) $< $@ -$(BIN)/golan5: $(SRC)/golan5.c $(SRC)/m_binio.c $(SRC)/m_token.c $(SRC)/m_tokbuf.c $(BIN)/%: - $(CC) $(CFLAGS) $(LFLAGS) -o $@ $^ + $(CC) $(LFLAGS) -o $@ $^ + +$(BIN)/%.o: $(SRC)/%.c + $(CC) $(CFLAGS) -o $@ $< -$(CODEDEFS)/stdlib.bin: $(IR)/libc.ir $(IR)/libGDCC.ir -$(GAME_BINARYS): $(GAME_OUTPUTS) -$(MAIN_BINARYS): $(MAIN_OUTPUTS) -$(MISC_BINARYS): $(MISC_OUTPUTS) -$(RNDR_BINARYS): $(RNDR_OUTPUTS) $(CODEDEFS)/%.bin: $(GDCC_LD) $(GDCC_LFLAGS) -o $@ $^ $(IR)/%.ir: $(SRC)/%.c $(GAME_HEADERS) $(MISC_HEADERS) $(RNDR_HEADERS) $(GDCC_CC) $(GDCC_CFLAGS) -o $@ $< -$(IR)/libc.ir $(IR)/libGDCC.ir: +$(LIBC_OUTPUTS): $(GDCC_MAKELIB) $(GDCC_CFLAGS) -o $@ $(basename $(@F)) ## EOF diff --git a/src/m_binio.c b/src/m_binio.c index fdc21db..58a7c7a 100644 --- a/src/m_binio.c +++ b/src/m_binio.c @@ -20,13 +20,44 @@ void M_IO_WriteLE4u(FILE *fp, mword v) // // M_IO_WriteLE4k // -void M_IO_WriteLE4k(FILE *fp, float v) +void M_IO_WriteLE4k(FILE *fp, fixed v) { +#if __GDCC__ + M_IO_WriteLE4u(fp, *(mword *)&v); +#else float a = fabsf(v); mword k = ((mword)a << 7) & 0x7FFFFF80; k |= (mword)(fmod(a, 1) * 0x7F) & 0x7F; if(v < 0) k |= 0x80000000; M_IO_WriteLE4u(fp, k); +#endif +} + +// +// M_IO_ReadLE4u +// +mword M_IO_ReadLE4u(FILE *fp) +{ + mbyte data[4]; + fread(data, 1, 4, fp); + return ((mword)data[0] << 0) | ((mword)data[1] << 8) | + ((mword)data[2] << 16) | ((mword)data[3] << 24); +} + +// +// M_IO_ReadLE4k +// +fixed M_IO_ReadLE4k(FILE *fp) +{ +#if __GDCC__ + return (union {mword u; fixed k;}){M_IO_ReadLE4u(fp)}.k; +#else + mword u = M_IO_ReadLE4u(fp); + float res = (u & 0x7FFFFF80) >> 7; + res += (u & 0x7F) / 127.f; + if(u & 0x80000000) res *= -1; + return res; +#endif } // EOF diff --git a/src/m_binio.h b/src/m_binio.h index 52c9661..de2e5da 100644 --- a/src/m_binio.h +++ b/src/m_binio.h @@ -9,6 +9,8 @@ // Extern Functions ----------------------------------------------------------| void M_IO_WriteLE4u(FILE *fp, mword v); -void M_IO_WriteLE4k(FILE *fp, float v); +void M_IO_WriteLE4k(FILE *fp, fixed v); +mword M_IO_ReadLE4u(FILE *fp); +fixed M_IO_ReadLE4k(FILE *fp); #endif diff --git a/src/m_str.c b/src/m_str.c index 56dc7c6..90db549 100644 --- a/src/m_str.c +++ b/src/m_str.c @@ -2,7 +2,9 @@ #include "m_str.h" #include "m_types.h" +#if __GDCC__ #include +#endif #include #include @@ -15,7 +17,9 @@ // char *M_StrFmt(char const *fmt, ...) { +#if __GDCC__ [[__no_init]] +#endif static char bufs[3][0x2800]; static int idx; @@ -41,6 +45,7 @@ mword M_StrHash(char const *s) return h; } +#if __GDCC__ // // M_StrCreate // @@ -48,5 +53,6 @@ __str M_StrCreate(char const *s) { return DGE_String_Create(s, strlen(s)); } +#endif // EOF diff --git a/src/m_str.h b/src/m_str.h index e2ee497..2de1b92 100644 --- a/src/m_str.h +++ b/src/m_str.h @@ -10,7 +10,9 @@ char *M_StrFmt(char const *fmt, ...); mword M_StrHash(char const *s); + +#if __GDCC__ __str M_StrCreate(char const *s); -char *M_StrDup(char const *s); +#endif #endif diff --git a/src/m_types.h b/src/m_types.h index 828ff79..ac3573b 100644 --- a/src/m_types.h +++ b/src/m_types.h @@ -15,27 +15,33 @@ // Types ---------------------------------------------------------------------| +typedef size_t msize; // Machine Size +typedef ptrdiff_t mpdif; // Machine Pointer Difference +typedef uint8_t mbyte; // Machine Byte +typedef uint16_t hword; // Half Word +typedef uint32_t mword; // Machine Word +typedef uint64_t dword; // Double Word #if __GDCC__ -typedef unsigned long fract ulfra; -typedef short accum fixed; // Fixed -typedef long fract lfrac; // Long Fractional +typedef uint96_t tword; // Triple Word #endif -typedef size_t msize; // Machine Size -typedef ptrdiff_t mpdif; // Machine Pointer Difference -typedef uint8_t mbyte; // Machine Byte -typedef uint16_t hword; // Half Word -typedef uint32_t mword; // Machine Word -typedef uint64_t dword; // Double Word +typedef int8_t chara; // Character +typedef int16_t int16; // Integer (16 bits) +typedef int32_t integ; // Integer (Machine) +typedef int64_t int64; // Integer (64 bits) #if __GDCC__ -typedef uint96_t tword; // Triple Word +typedef int96_t int96; // Integer (96 bits) #endif -typedef int8_t chara; // Character -typedef int16_t int16; // Integer (16 bits) -typedef int32_t integ; // Integer (Machine) -typedef int64_t int64; // Integer (64 bits) + #if __GDCC__ -typedef int96_t int96; // Integer (96 bits) +typedef short accum fixed; // Fixed +typedef unsigned long fract ulfra; // Unsigned Long Fractional +typedef long fract lfrac; // Long Fractional +#else +typedef float fixed; #endif -typedef unsigned M_texid; // Texture ID + +typedef unsigned M_texid; // Texture ID +typedef unsigned M_shdid; // Shader ID +typedef unsigned M_fntid; // Font ID #endif