From 73428f90b1efc059dffe372d91f6f842f2739a07 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Tue, 3 Sep 2024 02:10:42 -0500 Subject: [PATCH] examples: add triangle --- Makefile | 27 ++++--- arm9/Makefile | 11 ++- arm9/examples/triangle.c | 123 +++++++++++++++++++++++++++++ cartridge.lds | 4 +- include/bits.h | 3 + registers/graphics_engine_bits.csv | 4 + registers/graphics_engine_bits.ods | Bin 24262 -> 24298 bytes 7 files changed, 158 insertions(+), 14 deletions(-) create mode 100644 arm9/examples/triangle.c diff --git a/Makefile b/Makefile index 918c5d9..8cf8989 100644 --- a/Makefile +++ b/Makefile @@ -1,24 +1,31 @@ OPT = -Os +all: cartridge.bin + +phony: + +arm9/%.bin: phony + make -C arm9/ $(notdir $@) + +arm7/%.bin: phony + make -C arm7/ $(notdir $@) + OBJ = \ header.o \ arm9/arm9.bin.o \ arm7/arm7.bin.o - -all: cartridge.bin - -arm9/arm9.bin: - make -C arm9/ - -arm7/arm7.bin: - make -C arm7/ - cartridge.elf: $(OBJ) +TRIANGLE_OBJ = \ + header.o \ + arm9/triangle.bin.o \ + arm7/arm7.bin.o +triangle.elf: $(TRIANGLE_OBJ) + TARGET = arm-none-eabi- AARCH = -march=armv4t -mlittle-endian OBJARCH = -O elf32-littlearm -B armv4t LDSCRIPT = cartridge.lds include common.mk -.PHONY: arm9/arm9.bin arm7/arm7.bin +.PHONY: phony diff --git a/arm9/Makefile b/arm9/Makefile index 85797a7..1c37242 100644 --- a/arm9/Makefile +++ b/arm9/Makefile @@ -1,5 +1,11 @@ OPT = -Os +ALL = \ + arm9.bin \ + triangle.bin + +all: arm9.bin + OBJ = \ start.o \ main.o \ @@ -8,10 +14,11 @@ OBJ = \ ../res/bowser.data.o \ ../res/bowser.data.pal.o -all: arm9.bin - arm9.elf: $(OBJ) +foo = start.o examples/triangle.o +triangle.elf: $(foo) + CFLAGS += -I../include include arm9.mk diff --git a/arm9/examples/triangle.c b/arm9/examples/triangle.c new file mode 100644 index 0000000..ddc2ce2 --- /dev/null +++ b/arm9/examples/triangle.c @@ -0,0 +1,123 @@ +#include "io_registers.h" +#include "bits.h" + +void main() +{ + // power control + io_registers.a.POWCNT = 0 + | POWCNT__lcd_output_destination__a_to_upper__b_to_lower + | POWCNT__geometry_engine__enable + | POWCNT__rendering_engine__enable + | POWCNT__lcd__enable; + + // enable bg0 and 3d graphics + io_registers.a.DISPCNT = 0 + | DISPCNT__display_mode__graphics_display + | DISPCNT__bg0__enable + | DISPCNT__display_selection_for_bg0__3d_graphics + ; + + // clear matrix stack status + io_registers.a.GXSTAT |= GXSTAT__matrix_stack_status__overflow_or_underflow; + + // load identity matrices + io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__projection; + io_registers.a.MTX_IDENTITY = 0; + + io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position; + io_registers.a.MTX_IDENTITY = 0; + + io_registers.a.MTX_MODE = MTX_MODE__matrix_mode__position_and_vector; + io_registers.a.MTX_IDENTITY = 0; + + // disable all 3d effects + io_registers.a.DISP3DCNT = 0 + | DISP3DCNT__clear_image__disable + | DISP3DCNT__fog_master__disable + | DISP3DCNT__edge_marking__disable + | DISP3DCNT__anti_aliasing__disable + | DISP3DCNT__alpha_blending__disable + | DISP3DCNT__alpha_test__disable + | DISP3DCNT__texture_mapping__disable; + + // set the 3d clear color to a dark red + io_registers.a.CLEAR_COLOR = 0 + | CLEAR_COLOR__clear_polygon_id(31) + | CLEAR_COLOR__alpha_value(31) + | CLEAR_COLOR__blue(1) + | CLEAR_COLOR__green(1) + | CLEAR_COLOR__red(10); + + // set the depth buffer clear value to the maximum value + io_registers.a.CLEAR_DEPTH = CLEAR_DEPTH__value(0x7fff); + + // the following polygons are fully opaque and are not + // backface-culled + io_registers.a.POLYGON_ATTR = 0 + | POLYGON_ATTR__alpha_value(31) + | POLYGON_ATTR__render_front_surface__enable + | POLYGON_ATTR__render_back_surface__enable; + + // the 3d viewport is the entire display area + io_registers.a.VIEWPORT = 0 + | VIEWPORT__y2(191) + | VIEWPORT__x2(255) + | VIEWPORT__y1(0) + | VIEWPORT__x1(0); + + // VTX_10 uses signed 4.6 floating point (10 bit) + // | 9 | 8 7 6 | 5 4 3 2 1 0 | + // | s | int | decimal | + int fixed_point_divisor = 64; // == 2⁶ + + // equilateral triangle; centered around the display origin in NDC + /* + A + / \ + B---C + + */ + + // fixed point constants; these are converted from floating-point to + // integer at compile-time + int ax = 0.0 * fixed_point_divisor; + int ay = 1.0 * fixed_point_divisor; + + int bx = -0.86602540378 * fixed_point_divisor; // - sqrt(3) / 2 + int by = -0.5 * fixed_point_divisor; + + int cx = 0.86602540378 * fixed_point_divisor; // + sqrt(3) / 2 + int cy = -0.5 * fixed_point_divisor; + + int z = 1.0 * fixed_point_divisor; + + // the following vertices are a triangle + io_registers.a.BEGIN_VTXS = BEGIN_VTXS__type__triangle; + + io_registers.a.COLOR = COLOR__blue(31); + io_registers.a.VTX_10 = 0 + | VTX_10__z_coordinate(z) + | VTX_10__y_coordinate(ay) + | VTX_10__x_coordinate(ax); + + io_registers.a.COLOR = COLOR__green(31); + io_registers.a.VTX_10 = 0 + | VTX_10__z_coordinate(z) + | VTX_10__y_coordinate(by) + | VTX_10__x_coordinate(bx); + + io_registers.a.COLOR = COLOR__red(31); + io_registers.a.VTX_10 = 0 + | VTX_10__z_coordinate(z) + | VTX_10__y_coordinate(cy) + | VTX_10__x_coordinate(cx); + + // end of the triangle + io_registers.a.END_VTXS = 0; + + // wait for the geometry engine + while (io_registers.a.GXSTAT & GXSTAT__geometry_engine_busy); + + // swap buffers + io_registers.a.SWAP_BUFFERS = 0; +} diff --git a/cartridge.lds b/cartridge.lds index ec36204..559990a 100644 --- a/cartridge.lds +++ b/cartridge.lds @@ -21,7 +21,7 @@ SECTIONS .text.arm9 ALIGN(4) : { - KEEP(*(.data.arm9/arm9.bin)) + KEEP(*(.data.arm9*.bin)) } AT>rom . = 0x02000000 + 0x8000; @@ -30,7 +30,7 @@ SECTIONS .text.arm7 ALIGN(4) : { - KEEP(*(.data.arm7/arm7.bin)) + KEEP(*(.data.arm7*.bin)) } AT>rom /DISCARD/ : diff --git a/include/bits.h b/include/bits.h index adcab53..68085ee 100644 --- a/include/bits.h +++ b/include/bits.h @@ -164,6 +164,9 @@ #define MTX_POP__number_of_pops(v) (((v) & 0x3f) << 0) #define MTX_STORE__index(v) (((v) & 0x1f) << 0) #define MTX_RESTORE__position(v) (((v) & 0x1f) << 0) +#define COLOR__blue(v) (((v) & 0x1f) << 10) +#define COLOR__green(v) (((v) & 0x1f) << 5) +#define COLOR__red(v) (((v) & 0x1f) << 0) #define NORMAL__z_component(v) (((v) & 0x3ff) << 20) #define NORMAL__y_component(v) (((v) & 0x3ff) << 10) #define NORMAL__x_component(v) (((v) & 0x3ff) << 0) diff --git a/registers/graphics_engine_bits.csv b/registers/graphics_engine_bits.csv index 1844aa1..139d2dc 100644 --- a/registers/graphics_engine_bits.csv +++ b/registers/graphics_engine_bits.csv @@ -183,6 +183,10 @@ ,,,,,, "MTX_RESTORE",,"4-0","position",,"0b11111", ,,,,,, +"COLOR",,"14-10","blue",,"0b11111", +"COLOR",,"9-5","green",,"0b11111", +"COLOR",,"4-0","red",,"0b11111", +,,,,,, "NORMAL",,"29-20","z_component",,"0x7ff", "NORMAL",,"19-10","y_component",,"0x7ff", "NORMAL",,"9-0","x_component",,"0x7ff", diff --git a/registers/graphics_engine_bits.ods b/registers/graphics_engine_bits.ods index fec6c1734776fd46b7bb165ab8e470d909b0b0fa..d6ace6e04c3b611c36e930a9dd3ec07b6b1f6db9 100644 GIT binary patch delta 11698 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
47?d;RiW5Yik%3e(G={XhOHI-H{pldZ3u8 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 delta 11675 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 Y(?2}_zFesP!4nG}Fd;`&H291BFD@JX@Bjb+