Skip to content

Commit

Permalink
Merge branch 'gfx-rdp' into test-fatfs-update-r0-15
Browse files Browse the repository at this point in the history
  • Loading branch information
networkfusion authored Jul 30, 2023
2 parents 28d297e + cf4576b commit dda4b90
Show file tree
Hide file tree
Showing 334 changed files with 90,181 additions and 5,788 deletions.
1 change: 0 additions & 1 deletion .github/workflows/build-tool-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ jobs:
with:
msystem: ${{matrix.sys}}
install: >-
mingw-w64-${{ matrix.arch }}-libpng
base-devel
mingw-w64-${{ matrix.arch }}-toolchain
update: true
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/build-toolchain-library-and-roms.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@ jobs:
# use from registry o/w
- name: Set up Docker Build
if: ${{ steps.path_diff.outputs.changed == 1 }}
uses: docker/setup-buildx-action@v1
uses: docker/setup-buildx-action@v2

- name: Docker meta
if: ${{ steps.path_diff.outputs.changed == 1 }}
id: meta
uses: docker/metadata-action@v3
uses: docker/metadata-action@v4
with:
images: ghcr.io/${{ steps.vars.outputs.repository_name }}
# latest tag is handled separately
Expand All @@ -65,15 +65,15 @@ jobs:
- name: Log in to the container registry
if: ${{ steps.path_diff.outputs.changed == 1 }}
uses: docker/login-action@v1
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push image
if: ${{ steps.path_diff.outputs.changed == 1}}
uses: docker/build-push-action@v2
uses: docker/build-push-action@v4
with:
# Only push image if this is a push event. Otherwise it will fail because
# of permission issues on PRs. Also see https://github.com/DragonMinded/libdragon/issues/230
Expand All @@ -91,7 +91,7 @@ jobs:
# cached, it should not take long to build.
- name: Load image for libdragon build
if: ${{ steps.path_diff.outputs.changed == 1}}
uses: docker/build-push-action@v2
uses: docker/build-push-action@v4
with:
# Do not push the image yet, we also want to make sure libdragon builds
# with the fresh image.
Expand Down Expand Up @@ -125,7 +125,7 @@ jobs:
# build with this freshly built image.
- name: Push latest image
if: ${{ steps.path_diff.outputs.changed == 1 && github.ref == steps.vars.outputs.default_ref }}
uses: docker/build-push-action@v2
uses: docker/build-push-action@v4
with:
push: true
tags: ghcr.io/${{ steps.vars.outputs.repository_name }}:latest
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-toolchain-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ jobs:
# required for newlib (as not the default?!)
export PATH="$PATH:${{ runner.temp }}/${{ env.Build_Directory }}"
cd ./tools/
sudo N64_INST=${{ runner.temp }}/${{ env.Build_Directory }} HOST=${{ matrix.host }} MAKE_V=${{ matrix.makefile-version }} ./build-toolchain.sh
sudo N64_INST=${{ runner.temp }}/${{ env.Build_Directory }} N64_HOST=${{ matrix.host }} MAKE_V=${{ matrix.makefile-version }} ./build-toolchain.sh
echo Remove un-necessary content
rm -rf ${N64_INST}/share/locale/*
Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,14 @@ tools/mkdfs/mkdfs
tools/mksprite/convtool
tools/mksprite/mksprite
tools/n64tool
tools/n64sym
tools/**/*.exe
website/ref/

## Generated assets
examples/fontdemo/filesystem/*.font64
tests/filesystem/*.sprite

## OSX junk
.DS_Store
.Trashes
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,6 @@ ENV PATH="${N64_INST}/bin:$PATH"

COPY --from=0 ${N64_INST} ${N64_INST}
RUN apt-get update && \
apt-get install -yq gcc g++ make libpng-dev git && \
apt-get install -yq gcc g++ make git && \
apt-get clean && \
apt autoremove -yq
107 changes: 86 additions & 21 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,56 +6,79 @@ BUILD_DIR = build
include n64.mk
INSTALLDIR = $(N64_INST)

# N64_INCLUDEDIR is normally (when building roms) a path to the installed include files
# (e.g. /opt/libdragon/mips64-elf/include), set in n64.mk
# When building libdragon, override it to use the source include files instead (./include)
N64_INCLUDEDIR = $(CURDIR)/include

LIBDRAGON_CFLAGS = -I$(CURDIR)/src -ffile-prefix-map=$(CURDIR)=libdragon

# Activate N64 toolchain for libdragon build
libdragon: CC=$(N64_CC)
libdragon: CXX=$(N64_CXX)
libdragon: AS=$(N64_AS)
libdragon: LD=$(N64_LD)
libdragon: CFLAGS+=$(N64_CFLAGS) -I$(CURDIR)/src -I$(CURDIR)/include
libdragon: ASFLAGS+=$(N64_ASFLAGS) -I$(CURDIR)/src -I$(CURDIR)/include
libdragon: RSPASFLAGS+=$(N64_RSPASFLAGS) -I$(CURDIR)/src -I$(CURDIR)/include
libdragon: CFLAGS+=$(N64_CFLAGS) $(LIBDRAGON_CFLAGS)
libdragon: CXXFLAGS+=$(N64_CXXFLAGS) $(LIBDRAGON_CFLAGS)
libdragon: ASFLAGS+=$(N64_ASFLAGS) $(LIBDRAGON_CFLAGS)
libdragon: RSPASFLAGS+=$(N64_RSPASFLAGS) $(LIBDRAGON_CFLAGS)
libdragon: LDFLAGS+=$(N64_LDFLAGS)
libdragon: libdragon.a libdragonsys.a

libdragonsys.a: $(BUILD_DIR)/system.o
@echo " [AR] $@"
$(N64_AR) -rcs -o $@ $^

libdragon.a: $(BUILD_DIR)/n64sys.o $(BUILD_DIR)/interrupt.o \
$(BUILD_DIR)/inthandler.o $(BUILD_DIR)/entrypoint.o \
$(BUILD_DIR)/debug.o $(BUILD_DIR)/usb.o $(BUILD_DIR)/fatfs/ff.o \
$(BUILD_DIR)/fatfs/ffunicode.o $(BUILD_DIR)/dragonfs.o \
libdragon.a: $(BUILD_DIR)/n64sys.o $(BUILD_DIR)/interrupt.o $(BUILD_DIR)/backtrace.o \
$(BUILD_DIR)/fmath.o $(BUILD_DIR)/inthandler.o $(BUILD_DIR)/entrypoint.o \
$(BUILD_DIR)/debug.o $(BUILD_DIR)/debugcpp.o $(BUILD_DIR)/usb.o $(BUILD_DIR)/libcart/cart.o $(BUILD_DIR)/fatfs/ff.o \
$(BUILD_DIR)/fatfs/ffunicode.o $(BUILD_DIR)/rompak.o $(BUILD_DIR)/dragonfs.o \
$(BUILD_DIR)/audio.o $(BUILD_DIR)/display.o $(BUILD_DIR)/surface.o \
$(BUILD_DIR)/console.o $(BUILD_DIR)/joybus.o \
$(BUILD_DIR)/console.o $(BUILD_DIR)/joybus.o $(BUILD_DIR)/asset.o \
$(BUILD_DIR)/compress/lzh5.o $(BUILD_DIR)/compress/lz4_dec.o $(BUILD_DIR)/compress/ringbuf.o \
$(BUILD_DIR)/controller.o $(BUILD_DIR)/rtc.o \
$(BUILD_DIR)/eeprom.o $(BUILD_DIR)/eepromfs.o $(BUILD_DIR)/mempak.o \
$(BUILD_DIR)/tpak.o $(BUILD_DIR)/graphics.o $(BUILD_DIR)/rdp.o \
$(BUILD_DIR)/rsp.o $(BUILD_DIR)/rsp_crash.o \
$(BUILD_DIR)/inspector.o $(BUILD_DIR)/sprite.o \
$(BUILD_DIR)/dma.o $(BUILD_DIR)/timer.o \
$(BUILD_DIR)/exception.o $(BUILD_DIR)/do_ctors.o \
$(BUILD_DIR)/video/mpeg2.o $(BUILD_DIR)/video/yuv.o \
$(BUILD_DIR)/video/profile.o $(BUILD_DIR)/video/throttle.o \
$(BUILD_DIR)/video/rsp_yuv.o $(BUILD_DIR)/video/rsp_mpeg1.o \
$(BUILD_DIR)/audio/mixer.o $(BUILD_DIR)/audio/samplebuffer.o \
$(BUILD_DIR)/audio/rsp_mixer.o $(BUILD_DIR)/audio/wav64.o \
$(BUILD_DIR)/audio/xm64.o $(BUILD_DIR)/audio/libxm/play.o \
$(BUILD_DIR)/audio/libxm/context.o $(BUILD_DIR)/audio/libxm/load.o \
$(BUILD_DIR)/audio/ym64.o $(BUILD_DIR)/audio/ay8910.o \
$(BUILD_DIR)/rspq/rspq.o $(BUILD_DIR)/rspq/rsp_queue.o
$(BUILD_DIR)/rspq/rspq.o $(BUILD_DIR)/rspq/rsp_queue.o \
$(BUILD_DIR)/rdpq/rdpq.o $(BUILD_DIR)/rdpq/rsp_rdpq.o \
$(BUILD_DIR)/rdpq/rdpq_debug.o $(BUILD_DIR)/rdpq/rdpq_tri.o \
$(BUILD_DIR)/rdpq/rdpq_rect.o $(BUILD_DIR)/rdpq/rdpq_mode.o \
$(BUILD_DIR)/rdpq/rdpq_sprite.o $(BUILD_DIR)/rdpq/rdpq_tex.o \
$(BUILD_DIR)/rdpq/rdpq_attach.o $(BUILD_DIR)/rdpq/rdpq_font.o \
$(BUILD_DIR)/surface.o $(BUILD_DIR)/GL/gl.o \
$(BUILD_DIR)/GL/lighting.o $(BUILD_DIR)/GL/matrix.o \
$(BUILD_DIR)/GL/primitive.o $(BUILD_DIR)/GL/query.o \
$(BUILD_DIR)/GL/rendermode.o $(BUILD_DIR)/GL/texture.o \
$(BUILD_DIR)/GL/array.o $(BUILD_DIR)/GL/pixelrect.o \
$(BUILD_DIR)/GL/obj_map.o $(BUILD_DIR)/GL/list.o \
$(BUILD_DIR)/GL/buffer.o $(BUILD_DIR)/GL/rsp_gl.o \
$(BUILD_DIR)/GL/rsp_gl_pipeline.o $(BUILD_DIR)/GL/glu.o \
$(BUILD_DIR)/GL/cpu_pipeline.o $(BUILD_DIR)/GL/rsp_pipeline.o \
$(BUILD_DIR)/dlfcn.o $(BUILD_DIR)/model64.o
@echo " [AR] $@"
$(N64_AR) -rcs -o $@ $^

examples:
$(MAKE) -C examples
# We are unable to clean examples built with n64.mk unless we
# install it first
examples-clean: install-mk
examples-clean: $(INSTALLDIR)/include/n64.mk
$(MAKE) -C examples clean

doxygen: doxygen.conf
mkdir -p doxygen/
doxygen doxygen.conf
doxygen-api: doxygen-public.conf
mkdir -p doxygen/
doxygen doxygen-public.conf
doxygen-clean:
rm -rf $(CURDIR)/doxygen

tools:
$(MAKE) -C tools
Expand All @@ -64,26 +87,39 @@ tools-install:
tools-clean:
$(MAKE) -C tools clean

install-mk: n64.mk
install -Cv -m 0644 n64.mk $(INSTALLDIR)/include/n64.mk
install-mk: $(INSTALLDIR)/include/n64.mk

$(INSTALLDIR)/include/n64.mk: n64.mk
# Always update timestamp of n64.mk. This make sure that further targets
# depending on install-mk won't always try to re-install it.
mkdir -p $(INSTALLDIR)/include
install -cv -m 0644 n64.mk $(INSTALLDIR)/include/n64.mk

install: install-mk libdragon
mkdir -p $(INSTALLDIR)/mips64-elf/lib
mkdir -p $(INSTALLDIR)/mips64-elf/include/GL
install -Cv -m 0644 libdragon.a $(INSTALLDIR)/mips64-elf/lib/libdragon.a
install -Cv -m 0644 n64.ld $(INSTALLDIR)/mips64-elf/lib/n64.ld
install -Cv -m 0644 dso.ld $(INSTALLDIR)/mips64-elf/lib/dso.ld
install -Cv -m 0644 rsp.ld $(INSTALLDIR)/mips64-elf/lib/rsp.ld
install -Cv -m 0644 header $(INSTALLDIR)/mips64-elf/lib/header
install -Cv -m 0644 libdragonsys.a $(INSTALLDIR)/mips64-elf/lib/libdragonsys.a
install -Cv -m 0644 include/n64types.h $(INSTALLDIR)/mips64-elf/include/n64types.h
install -Cv -m 0644 include/pputils.h $(INSTALLDIR)/mips64-elf/include/pputils.h
install -Cv -m 0644 include/n64sys.h $(INSTALLDIR)/mips64-elf/include/n64sys.h
install -Cv -m 0644 include/fmath.h $(INSTALLDIR)/mips64-elf/include/fmath.h
install -Cv -m 0644 include/backtrace.h $(INSTALLDIR)/mips64-elf/include/backtrace.h
install -Cv -m 0644 include/cop0.h $(INSTALLDIR)/mips64-elf/include/cop0.h
install -Cv -m 0644 include/cop1.h $(INSTALLDIR)/mips64-elf/include/cop1.h
install -Cv -m 0644 include/interrupt.h $(INSTALLDIR)/mips64-elf/include/interrupt.h
install -Cv -m 0644 include/dma.h $(INSTALLDIR)/mips64-elf/include/dma.h
install -Cv -m 0644 include/dragonfs.h $(INSTALLDIR)/mips64-elf/include/dragonfs.h
install -Cv -m 0644 include/asset.h $(INSTALLDIR)/mips64-elf/include/asset.h
install -Cv -m 0644 include/audio.h $(INSTALLDIR)/mips64-elf/include/audio.h
install -Cv -m 0644 include/surface.h $(INSTALLDIR)/mips64-elf/include/surface.h
install -Cv -m 0644 include/display.h $(INSTALLDIR)/mips64-elf/include/display.h
install -Cv -m 0644 include/debug.h $(INSTALLDIR)/mips64-elf/include/debug.h
install -Cv -m 0644 include/debugcpp.h $(INSTALLDIR)/mips64-elf/include/debugcpp.h
install -Cv -m 0644 include/usb.h $(INSTALLDIR)/mips64-elf/include/usb.h
install -Cv -m 0644 include/console.h $(INSTALLDIR)/mips64-elf/include/console.h
install -Cv -m 0644 include/joybus.h $(INSTALLDIR)/mips64-elf/include/joybus.h
Expand All @@ -93,6 +129,7 @@ install: install-mk libdragon
install -Cv -m 0644 include/eeprom.h $(INSTALLDIR)/mips64-elf/include/eeprom.h
install -Cv -m 0644 include/eepromfs.h $(INSTALLDIR)/mips64-elf/include/eepromfs.h
install -Cv -m 0644 include/tpak.h $(INSTALLDIR)/mips64-elf/include/tpak.h
install -Cv -m 0644 include/sprite.h $(INSTALLDIR)/mips64-elf/include/sprite.h
install -Cv -m 0644 include/graphics.h $(INSTALLDIR)/mips64-elf/include/graphics.h
install -Cv -m 0644 include/rdp.h $(INSTALLDIR)/mips64-elf/include/rdp.h
install -Cv -m 0644 include/rsp.h $(INSTALLDIR)/mips64-elf/include/rsp.h
Expand All @@ -105,6 +142,9 @@ install: install-mk libdragon
install -Cv -m 0644 include/rsp.inc $(INSTALLDIR)/mips64-elf/include/rsp.inc
install -Cv -m 0644 include/rsp_dma.inc $(INSTALLDIR)/mips64-elf/include/rsp_dma.inc
install -Cv -m 0644 include/rsp_assert.inc $(INSTALLDIR)/mips64-elf/include/rsp_assert.inc
install -Cv -m 0644 include/mpeg2.h $(INSTALLDIR)/mips64-elf/include/mpeg2.h
install -Cv -m 0644 include/yuv.h $(INSTALLDIR)/mips64-elf/include/yuv.h
install -Cv -m 0644 include/throttle.h $(INSTALLDIR)/mips64-elf/include/throttle.h
install -Cv -m 0644 include/mixer.h $(INSTALLDIR)/mips64-elf/include/mixer.h
install -Cv -m 0644 include/samplebuffer.h $(INSTALLDIR)/mips64-elf/include/samplebuffer.h
install -Cv -m 0644 include/wav64.h $(INSTALLDIR)/mips64-elf/include/wav64.h
Expand All @@ -114,7 +154,32 @@ install: install-mk libdragon
install -Cv -m 0644 include/rspq.h $(INSTALLDIR)/mips64-elf/include/rspq.h
install -Cv -m 0644 include/rspq_constants.h $(INSTALLDIR)/mips64-elf/include/rspq_constants.h
install -Cv -m 0644 include/rsp_queue.inc $(INSTALLDIR)/mips64-elf/include/rsp_queue.inc

install -Cv -m 0644 include/rdpq.h $(INSTALLDIR)/mips64-elf/include/rdpq.h
install -Cv -m 0644 include/rdpq_tri.h $(INSTALLDIR)/mips64-elf/include/rdpq_tri.h
install -Cv -m 0644 include/rdpq_rect.h $(INSTALLDIR)/mips64-elf/include/rdpq_rect.h
install -Cv -m 0644 include/rdpq_attach.h $(INSTALLDIR)/mips64-elf/include/rdpq_attach.h
install -Cv -m 0644 include/rdpq_mode.h $(INSTALLDIR)/mips64-elf/include/rdpq_mode.h
install -Cv -m 0644 include/rdpq_tex.h $(INSTALLDIR)/mips64-elf/include/rdpq_tex.h
install -Cv -m 0644 include/rdpq_sprite.h $(INSTALLDIR)/mips64-elf/include/rdpq_sprite.h
install -Cv -m 0644 include/rdpq_font.h $(INSTALLDIR)/mips64-elf/include/rdpq_font.h
install -Cv -m 0644 include/rdpq_debug.h $(INSTALLDIR)/mips64-elf/include/rdpq_debug.h
install -Cv -m 0644 include/rdpq_macros.h $(INSTALLDIR)/mips64-elf/include/rdpq_macros.h
install -Cv -m 0644 include/rdpq_constants.h $(INSTALLDIR)/mips64-elf/include/rdpq_constants.h
install -Cv -m 0644 include/rsp_rdpq.inc $(INSTALLDIR)/mips64-elf/include/rsp_rdpq.inc
install -Cv -m 0644 include/surface.h $(INSTALLDIR)/mips64-elf/include/surface.h
install -Cv -m 0644 include/GL/gl.h $(INSTALLDIR)/mips64-elf/include/GL/gl.h
install -Cv -m 0644 include/GL/gl_enums.h $(INSTALLDIR)/mips64-elf/include/GL/gl_enums.h
install -Cv -m 0644 include/GL/gl_integration.h $(INSTALLDIR)/mips64-elf/include/GL/gl_integration.h
install -Cv -m 0644 include/GL/glu.h $(INSTALLDIR)/mips64-elf/include/GL/glu.h
install -Cv -m 0644 include/dlfcn.h $(INSTALLDIR)/mips64-elf/include/dlfcn.h
install -Cv -m 0644 include/model64.h $(INSTALLDIR)/mips64-elf/include/model64.h
mkdir -p $(INSTALLDIR)/mips64-elf/include/libcart
install -Cv -m 0644 src/libcart/cart.h $(INSTALLDIR)/mips64-elf/include/libcart/cart.h
mkdir -p $(INSTALLDIR)/mips64-elf/include/fatfs
install -Cv -m 0644 src/fatfs/diskio.h $(INSTALLDIR)/mips64-elf/include/fatfs/diskio.h
install -Cv -m 0644 src/fatfs/ff.h $(INSTALLDIR)/mips64-elf/include/fatfs/ff.h
install -Cv -m 0644 src/fatfs/ffconf.h $(INSTALLDIR)/mips64-elf/include/fatfs/ffconf.h


clean:
rm -f *.o *.a
Expand All @@ -126,9 +191,9 @@ test:
test-clean: install-mk
$(MAKE) -C tests clean

clobber: clean doxygen-clean examples-clean tools-clean test-clean
clobber: clean examples-clean tools-clean test-clean

.PHONY : clobber clean doxygen-clean doxygen doxygen-api examples examples-clean tools tools-clean tools-install test test-clean
.PHONY : clobber clean doxygen-api examples examples-clean tools tools-clean tools-install test test-clean install-mk

# Automatic dependency tracking
-include $(wildcard $(BUILD_DIR)/*.d) $(wildcard $(BUILD_DIR)/*/*.d)
25 changes: 17 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ Libdragon is an open-source SDK for Nintendo 64. It aims for a complete N64
programming experience while providing programmers with modern approach to
programming and debugging. These are the main features:

* Based on modern GCC (12.2) and Newlib, for a full C11 programming experience.
* Based on modern GCC (13) and Newlib, for a full C11 programming experience.
A Docker container is available to quickly set up the programming environment.
* The GCC toolchain is 64 bit capable to be able to use the full R4300 capabilities
(commercial games and libultra are based on a 32-bit ABI and is not possible
to use 64-bit registers and opcodes with it)
* Can be developed with newer-generation emulators (ares, cen64, Dillonb's n64,
simple64) or development cartridges (64drive, EverDrive64).
* Support both vanilla N64 and iQue Player (chinese variant). The support is
simple64) or development cartridges (64drive, EverDrive64, SummerCart64).
* Support both vanilla N64 and iQue Player (Chinese variant). The support is
experimental and done fully at runtime, so it is possible to run ROMs built
with libdragon on iQue without modifying the source code.
* In-ROM filesystem implementation for assets. Assets can be loaded with
Expand All @@ -35,7 +35,7 @@ programming and debugging. These are the main features:
asserts (so that you get a nice error screen instead of a console lockup),
`fprintf(stderr)` calls are redirected to your PC console in emulators
and to USB via compatible tools (UNFLoader, g64drive).
* Support to read/write to SD cards in development kits (64drive, EverDrive64),
* Support to read/write to SD cards in development kits (64drive, EverDrive64, SummerCart64),
simply with `fopen("sd://sdata.dat")`
* Simple and powerful Makefile-based build system for your ROMs and assets
(n64.mk)
Expand Down Expand Up @@ -93,18 +93,27 @@ Currently, there are two main libragon versions:
that will impede existing applications to successfully compile and work
against a newer libdragon version. We feel this is important because otherwise
we would fragment the homebrew ecosystem too much, and we would leave a trail
of libdragon-based applications that can't be compiled anymore. See also the
wiki for [common hurdles in upgrading libdragon](https://github.com/DragonMinded/libdragon/wiki/Upgrade-troubleshooting).
of libdragon-based applications that can't be compiled anymore.
* The **unstable** version is the one in the `unstable` branch. This is where most
development happens first. In fact, features are developed, evolved and
battle-tested here, before the APIs are stabilized and they are finally
merged on the trunk. Applications that use the unstable branch need to be aware
that the APIs can break at any time (though we try to avoid *gratuitous* breakage).

## Documentation
## Upgrading libdragon

If you are upgrade the stable version, check the [ChangeLog](https://github.com/DragonMinded/libdragon/wiki/Stable-branch--Changelog)
in the wiki to see latest changes that were merged into the stable version of libdragon.
Also check the wiki page for [common hurdles in upgrading libdragon](https://github.com/DragonMinded/libdragon/wiki/Upgrade-troubleshooting).

If you are upgrading the unstable version, instead, remember that some breaking
changes are expected. We do not keep track of those though, so you will have
to check the relevant header files yourself to check what is changed.

## Resources

* [API reference](https://dragonminded.github.io/libdragon/ref/modules.html)
* [Examples](https://github.com/DragonMinded/libdragon/tree/trunk/examples)
* [Wiki](https://github.com/DragonMinded/libdragon/wiki) (contains tutorials
and troubleshooting guides)

* [Discord n64brew](https://discord.gg/WqFgNWf)
Loading

0 comments on commit dda4b90

Please sign in to comment.