From 9ec2190f34b7accafab7cdef115d02900bd56496 Mon Sep 17 00:00:00 2001 From: jun <83899451+zeichensystem@users.noreply.github.com> Date: Tue, 29 Jun 2021 03:36:24 +0200 Subject: [PATCH] Integrate "Apex Audio System" for audio playback. (This necessitated the removal of the TIMER_PERFORMANCE timer type, as timer 0 and timer 1 are reserved for AAS; we now only have the regular timer type left, which is completly sufficient.) Fix Makefile structure (so we don't have to invoke "make models" before invoking make). --- .DS_Store | Bin 8196 -> 0 bytes .gitignore | 8 - .vscode/c_cpp_properties.json | 30 - .vscode/launch.json | 43 - .vscode/settings.json | 26 - .vscode/tasks.json | 70 -- Makefile | 38 +- TODO.md | 14 +- assets/Makefile-Models | 4 + assets/Makefile-Music | 7 + assets/music/BuxWV250.mod | Bin 0 -> 52582 bytes assets/music/aaa.mod | Bin 0 -> 98956 bytes lib/.DS_Store | Bin 6148 -> 0 bytes lib/apex-audio-system | 1 - lib/apex-audio-system/.gitignore | 10 + lib/apex-audio-system/LICENSE | 18 + lib/apex-audio-system/Makefile | 93 ++ lib/apex-audio-system/README.md | 48 + lib/apex-audio-system/docs/api_general.html | 323 +++++ lib/apex-audio-system/docs/api_index.html | 274 +++++ lib/apex-audio-system/docs/api_misc.html | 163 +++ lib/apex-audio-system/docs/api_mixer.html | 366 ++++++ lib/apex-audio-system/docs/api_mod.html | 649 ++++++++++ lib/apex-audio-system/docs/api_sfx.html | 598 ++++++++++ lib/apex-audio-system/docs/conv2aas.html | 139 +++ lib/apex-audio-system/docs/example.html | 232 ++++ lib/apex-audio-system/docs/faq.html | 70 ++ .../docs/getting_started.html | 132 +++ .../docs/images/aas_logo.gif | Bin 0 -> 3093 bytes lib/apex-audio-system/docs/index.html | 149 +++ .../examples/AASExample/AASExample.c | 69 ++ .../AASExample/AAS_Data/Ambulance.wav | Bin 0 -> 15608 bytes .../examples/AASExample/AAS_Data/Boom.raw | Bin 0 -> 7300 bytes .../AASExample/AAS_Data/FlatOutLies.mod | Bin 0 -> 158578 bytes .../examples/AASExample/Makefile | 8 + .../examples/AASExample/crt0.s | 781 ++++++++++++ .../examples/AASExample/lnkscript | 297 +++++ .../examples/AASExample2/AASExample.c | 87 ++ .../AASExample2/AAS_Data/Ambulance.wav | Bin 0 -> 15608 bytes .../examples/AASExample2/AAS_Data/Boom.raw | Bin 0 -> 7300 bytes .../AASExample2/AAS_Data/CreamOfTheEarth.mod | Bin 0 -> 130382 bytes .../examples/AASExample2/Makefile | 8 + .../examples/AASExample2/crt0.s | 781 ++++++++++++ .../examples/AASExample2/lnkscript | 297 +++++ .../examples/AASExample_c++/AASExample.cpp | 69 ++ .../AASExample_c++/AAS_Data/Ambulance.wav | Bin 0 -> 15608 bytes .../examples/AASExample_c++/AAS_Data/Boom.raw | Bin 0 -> 7300 bytes .../AAS_Data/its_just_sonorous.mod | Bin 0 -> 173404 bytes .../examples/AASExample_c++/Makefile | 8 + .../examples/AASExample_c++/crt0.s | 781 ++++++++++++ .../examples/AASExample_c++/lnkscript | 462 ++++++++ lib/apex-audio-system/make/common.make | 75 ++ lib/apex-audio-system/make/example.make | 39 + lib/apex-audio-system/src/aas/AAS.h | 121 ++ lib/apex-audio-system/src/aas/AAS_ASM.s | 299 +++++ lib/apex-audio-system/src/aas/AAS_Logo.c | 153 +++ lib/apex-audio-system/src/aas/AAS_MOD.c | 1047 +++++++++++++++++ lib/apex-audio-system/src/aas/AAS_Main.c | 802 +++++++++++++ lib/apex-audio-system/src/aas/AAS_Mixer.h | 62 + lib/apex-audio-system/src/aas/AAS_Mixer.s | 632 ++++++++++ lib/apex-audio-system/src/aas/AAS_SFX.c | 284 +++++ lib/apex-audio-system/src/aas/AAS_Shared.c | 126 ++ lib/apex-audio-system/src/aas/AAS_Shared.h | 83 ++ lib/apex-audio-system/src/aas/Makefile | 23 + lutcalc/Makefile | 9 - lutcalc/lutcalc.c | 73 -- source/main.c | 21 +- source/math.c | 8 +- source/render/draw.c | 19 +- source/scenes/benchmarkScene.c | 2 +- source/scenes/gbaScene.c | 2 +- source/scenes/testbedScene.c | 2 +- source/scenes/twisterScene.c | 7 +- source/timer.c | 30 +- tools/obj2model.py | 4 +- tools/rgb2rgb15.py | 21 - tools/sceneCodegen.py | 3 +- 77 files changed, 10766 insertions(+), 334 deletions(-) delete mode 100644 .DS_Store delete mode 100644 .gitignore delete mode 100644 .vscode/c_cpp_properties.json delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json create mode 100644 assets/Makefile-Models create mode 100644 assets/Makefile-Music create mode 100644 assets/music/BuxWV250.mod create mode 100644 assets/music/aaa.mod delete mode 100644 lib/.DS_Store delete mode 160000 lib/apex-audio-system create mode 100644 lib/apex-audio-system/.gitignore create mode 100644 lib/apex-audio-system/LICENSE create mode 100644 lib/apex-audio-system/Makefile create mode 100644 lib/apex-audio-system/README.md create mode 100644 lib/apex-audio-system/docs/api_general.html create mode 100644 lib/apex-audio-system/docs/api_index.html create mode 100644 lib/apex-audio-system/docs/api_misc.html create mode 100644 lib/apex-audio-system/docs/api_mixer.html create mode 100644 lib/apex-audio-system/docs/api_mod.html create mode 100644 lib/apex-audio-system/docs/api_sfx.html create mode 100644 lib/apex-audio-system/docs/conv2aas.html create mode 100644 lib/apex-audio-system/docs/example.html create mode 100644 lib/apex-audio-system/docs/faq.html create mode 100644 lib/apex-audio-system/docs/getting_started.html create mode 100644 lib/apex-audio-system/docs/images/aas_logo.gif create mode 100644 lib/apex-audio-system/docs/index.html create mode 100644 lib/apex-audio-system/examples/AASExample/AASExample.c create mode 100644 lib/apex-audio-system/examples/AASExample/AAS_Data/Ambulance.wav create mode 100644 lib/apex-audio-system/examples/AASExample/AAS_Data/Boom.raw create mode 100644 lib/apex-audio-system/examples/AASExample/AAS_Data/FlatOutLies.mod create mode 100644 lib/apex-audio-system/examples/AASExample/Makefile create mode 100644 lib/apex-audio-system/examples/AASExample/crt0.s create mode 100644 lib/apex-audio-system/examples/AASExample/lnkscript create mode 100644 lib/apex-audio-system/examples/AASExample2/AASExample.c create mode 100644 lib/apex-audio-system/examples/AASExample2/AAS_Data/Ambulance.wav create mode 100644 lib/apex-audio-system/examples/AASExample2/AAS_Data/Boom.raw create mode 100644 lib/apex-audio-system/examples/AASExample2/AAS_Data/CreamOfTheEarth.mod create mode 100644 lib/apex-audio-system/examples/AASExample2/Makefile create mode 100644 lib/apex-audio-system/examples/AASExample2/crt0.s create mode 100644 lib/apex-audio-system/examples/AASExample2/lnkscript create mode 100644 lib/apex-audio-system/examples/AASExample_c++/AASExample.cpp create mode 100644 lib/apex-audio-system/examples/AASExample_c++/AAS_Data/Ambulance.wav create mode 100644 lib/apex-audio-system/examples/AASExample_c++/AAS_Data/Boom.raw create mode 100644 lib/apex-audio-system/examples/AASExample_c++/AAS_Data/its_just_sonorous.mod create mode 100644 lib/apex-audio-system/examples/AASExample_c++/Makefile create mode 100644 lib/apex-audio-system/examples/AASExample_c++/crt0.s create mode 100644 lib/apex-audio-system/examples/AASExample_c++/lnkscript create mode 100644 lib/apex-audio-system/make/common.make create mode 100644 lib/apex-audio-system/make/example.make create mode 100644 lib/apex-audio-system/src/aas/AAS.h create mode 100644 lib/apex-audio-system/src/aas/AAS_ASM.s create mode 100644 lib/apex-audio-system/src/aas/AAS_Logo.c create mode 100644 lib/apex-audio-system/src/aas/AAS_MOD.c create mode 100644 lib/apex-audio-system/src/aas/AAS_Main.c create mode 100644 lib/apex-audio-system/src/aas/AAS_Mixer.h create mode 100644 lib/apex-audio-system/src/aas/AAS_Mixer.s create mode 100644 lib/apex-audio-system/src/aas/AAS_SFX.c create mode 100644 lib/apex-audio-system/src/aas/AAS_Shared.c create mode 100644 lib/apex-audio-system/src/aas/AAS_Shared.h create mode 100644 lib/apex-audio-system/src/aas/Makefile delete mode 100644 lutcalc/Makefile delete mode 100644 lutcalc/lutcalc.c delete mode 100644 tools/rgb2rgb15.py diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 2b9a090dc263f29159a3f994a6a5e9a2a879f7ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMO=uHA6n@)mnhm1nAT}3a5$dT*QtIEK5@STYRaO+N((ZOcy0XcHWYeHA63^2@n$PCQ9$-MXGd-J{7OlAWBM!Dk`0rCJ~ zVWl#62%7^6)zg|NGh*Z)7RHtzS?8>!cWFcYE?WsDWt)J z4)Pv?uV7lcLscu|zPbDEvy)-mOa3zU!4?XB_9w+Rk#!d$a20g(^m|z+V}Ct=>iC2G zybE6$`5?W5YYLu2T(zg59$8*R)D&`o8X5EXFtbi z>}`16c2n%+k6tqj+EJnK#h6K%>Di2x&05*R+565W={k`cb=qaOwMsv&xY4F3`nL!P zM}6139aOt(xnoyIBXWaAwZ)tRzltXJ?gR~=bjzgE@Y`%2hbtJ+S}xz~6)zMP?8URi z{({}RxQP9wb4&ex)|#6yF5g(MKYY}C+<&r7^M$9HIQ`%#|2%46U@x{zg za-5TFlqd}rB|_<<8JI=}Qhd>QdjG#V`ThSiQlr+b#5c{^!m4qB{i5e{b{6)a%4@!Ohvjpg7DjE0#ek(p> diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a7e2c67..0000000 --- a/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -build -data -*.gba -*.sav -*.elf - -*.pnproj -.DS_Store \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json deleted file mode 100644 index f49bd29..0000000 --- a/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "configurations": [ - { - "name": "Mac", - "includePath": [ - "/usr/local/include", - "${workspaceFolder}/**", - "/opt/devkitPro/libtonc/include", - "${workspaceFolder}/source/", - "/opt/devkitPro/devkitARM/arm-none-eabi/include" - ], - "defines": [], - // "intelliSenseMode": "", - "browse": { - "path": [ - // "/usr/local/include", - "${workspaceFolder}/**", - "/opt/devkitPro/devkitARM/arm-none-eabi/include" - ], - "limitSymbolsToIncludedHeaders": true, - "databaseFilename": "" - }, - "macFrameworkPath": [ - "/System/Library/Frameworks", - "/Library/Frameworks" - ] - } - ], - "version": 4 -} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 83c2633..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,43 +0,0 @@ - -{ - // cf. https://github.com/JamieDStewart/GBA_VSCode_Basic/blob/master/.vscode/launch.json - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "2.0.0", - "configurations": [ - { - "name": "(gdb) Launch", - "type": "cppdbg", - "request": "launch", - "preLaunchTask": "gdb-debug", - "postDebugTask": "stop emulation", - "serverLaunchTimeout": 10000, - "stopAtEntry": true, - "program": "${workspaceFolder}/${workspaceFolderBasename}.elf", - "MIMode": "gdb", - "externalConsole": true, - "cwd": "${workspaceFolder}", - "targetArchitecture": "arm", - "miDebuggerServerAddress": "localhost:2345", - "windows": { - "miDebuggerPath": "C:/devkitPro/devkitARM/bin/arm-none-eabi-gdb.exe", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "ignoreFailures": true, - "text": "file ${workspaceFolder}/${workspaceFolderBasename}.elf -enable-pretty-printing" - }] - }, - "osx":{ - "miDebuggerPath": "/opt/devkitPro/devkitARM/bin/arm-none-eabi-gdb", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "ignoreFailures": true, - "text": "file ${workspaceFolder}/${workspaceFolderBasename}.elf -enable-pretty-printing" - }] - }, - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 54827bb..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "files.associations": { - "tonc_types.h": "c", - "tonc_tte.h": "c", - "tonc_video.h": "c", - "tonc_memdef.h": "c", - "camera.h": "c", - "memory.h": "c", - "algorithm": "c", - "stdlib.h": "c", - "math.h": "c", - "draw.h": "c", - "tonc_math.h": "c", - "logutils.h": "c", - "typeinfo": "c", - "__locale": "c", - "tonc_memmap.h": "c", - "tonc_input.h": "c", - "scene.h": "c", - "chrono": "c", - "random": "c", - "iterator": "c", - "timer.h": "c", - "thread": "c" - } -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 87948ef..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "label": "stop emulation", - "type":"shell", - "windows": { - "command":"taskkill /im mGBA.exe /F" - }, - "osx": { - "command": "killall mGBA" - } - }, - { - "label": "make debug", - "type": "process", - "command": "make", - "args": ["DEBUG=1"], - "problemMatcher": [] - }, - { - "label": "make release", - "type": "process", - "command": "make", - "args": ["DEBUG=0"], - "problemMatcher": [] - }, - { - //"dependsOn":"stop emulation", - "label": "clean", - "type": "shell", - "command": "make clean" - }, - { - "label": "gdb-debug", - "type": "shell", - "dependsOn": ["make debug"], - "isBackground": false, - "windows": { - "command": "C:/mGBA/mGBA.exe -g ${workspaceFolder}/${workspaceFolderBasename}.gba;sleep 5;echo debuggerReady" - }, - "osx":{ - "command": "/Users/joni/Documents/Creative/programming/gba/mGBA-0.8.4-osx/Applications/mGBA.app/Contents/MacOS/mGBA", - "args": ["-g", "${workspaceFolder}/${workspaceFolderBasename}.gba", "-l", "15"] - }, - "presentation": { - "clear": true, - "reveal": "always", - "panel": "new" - }, - "command": "debuggerReady", - "problemMatcher": { - "background": { - "activeOnStart": true, - "beginsPattern": "^.*debuggerReady.*$", - "endsPattern": "^.*debuggerReady.*$" - }, - } - }, - { - "label": "run", - "type": "shell", - "isBackground": true, - "command": "C:/NO$GBADebugger/NO$GBA.exe ${workspaceFolder}/${workspaceFolderBasename}.elf", - "problemMatcher": [] - } - ] -} \ No newline at end of file diff --git a/Makefile b/Makefile index cf24df5..26878c1 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,8 @@ endif include $(DEVKITARM)/gba_rules -MGBA := /Applications/mGBA.app/Contents/MacOS/mGBA # for "make run" +# The mGBA binary "make run": +MGBA := /Applications/mGBA.app/Contents/MacOS/mGBA #--------------------------------------------------------------------------------- # TARGET is the name of the output @@ -24,8 +25,8 @@ MGBA := /Applications/mGBA.app/Contents/MacOS/mGBA # for "make run" #--------------------------------------------------------------------------------- TARGET := $(notdir $(CURDIR)) BUILD := build -SOURCES := source source/scenes source/render asm data -INCLUDES := include $(DEVKITPRO)/libtonc/include/ +SOURCES := source source/scenes source/render asm data-models data-audio +INCLUDES := include $(DEVKITPRO)/libtonc/include/ $(CURDIR)/lib/apex-audio-system/build/aas/include/ DATA := MUSIC := @@ -61,14 +62,14 @@ LDFLAGS = -g $(ARCH) -Wl,-Map,$(notdir $*.map) #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -ltonc -lm - +LIBS := -ltonc -lm -lAAS #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib #--------------------------------------------------------------------------------- -LIBDIRS := $(DEVKITPRO)/libtonc/ $(LIBGBA) #$(CURDIR)/lib/libtonc/ +LIBDIRS := $(DEVKITPRO)/libtonc/ $(CURDIR)/lib/apex-audio-system/build/aas/ +#$(CURDIR)/lib/libtonc/ $(LIBGBA) #--------------------------------------------------------------------------------- # no real need to edit anything past this point unless you need to add additional @@ -125,26 +126,31 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-iquote$(CURDIR)/$(dir)) \ export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) -.PHONY: $(BUILD) clean run +.PHONY: $(BUILD) clean run all + +# Oh my... We have to $(MAKE) $(BUILD), i.e. make the build target with a new invocation of "make", to "recompute" the SOURCE variable (and everything that depends on it) because +# sourcefiles are generated in data-audio and data-models by the invocations of "Makefile-Music" and "Makefile-Models" if applicable. +# If we don't do this, we get linker errors when we "make" after "make clean" (as the newly generated source files in data-audio and data-models won't be considered then until the next "make" invocation). +all: + @$(MAKE) -f $(CURDIR)/assets/Makefile-Music + @$(MAKE) -f $(CURDIR)/assets/Makefile-Models + + @$(MAKE) $(BUILD) #--------------------------------------------------------------------------------- -$(BUILD): + +$(BUILD): @[ -d $@ ] || mkdir -p $@ - # $(MAKE) -C $(CURDIR)/lutcalc -f Makefile @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile - -models: $(CURDIR)/assets/models/*.obj - python3 $(CURDIR)/tools/obj2model.py - #--------------------------------------------------------------------------------- clean: @echo clean ... @rm -fr $(BUILD) $(TARGET).elf $(TARGET).gba - @rm -f $(CURDIR)/lutcalc/lutcalc - @rm -f $(CURDIR)/data/* + @rm -f $(CURDIR)/data-models/* + @rm -f $(CURDIR)/data-audio/* -run: $(BUILD) Makefile +run: all Makefile $(MGBA) -2 -l 15 $(OUTPUT).gba #--------------------------------------------------------------------------------- else diff --git a/TODO.md b/TODO.md index 91c3378..6de7fb9 100644 --- a/TODO.md +++ b/TODO.md @@ -1,11 +1,11 @@ # TODO ## Important Features -- [ ] Integration of 'apex audio' for .mod support - [ ] Camera paths (splines?) - [ ] Animations (and "native" wireframe model support (only edges, not faces; maybe even 2d)) - [ ] Particle systems - [ ] Affine texture mapping (cf. fatmap.txt) +- [ ] Subpixel-accuracy (cf. fatmap2.txt) ## Implementation details and Bugfixes - [ ] Proper near-plane clipping @@ -17,6 +17,9 @@ - [ ] Option to calculate the actual centroid of a face for sorting - [ ] Better handling of lookAt singularity (looking completely down/up) +## Misc +- [ ] Create a Readme/How to use + ## Done - [x] Change model-instance draw options to be properties of the model-instances themselves (so we can have different draw styles for different model-instances and don't have to draw all instances the same) - [x] Fix broken performance measurement (calculate proper averages etc.) @@ -25,10 +28,9 @@ - [x] Basic .obj support - [x] Simplify perspective calculations - [x] Don't recalculate vertex projections for each face! -- [x] Better polygon sorting (ordering table) +- [x] Alternative to naive polygon sorting (ordering table) - [x] Mode switching - [x] Backface culling winding order/normal problem -- [x] Key chording for scene switching - -- [x] Handle .obj colours on import (so far, we just set all colours to a default one). -- [x] Use libtonc qran instead of rand +- [x] Key chording/sequences for scene switching +- [x] Handle .obj colours (.mtl) on import +- [x] Integration of 'apex audio system' for .mod support \ No newline at end of file diff --git a/assets/Makefile-Models b/assets/Makefile-Models new file mode 100644 index 0000000..815f9ee --- /dev/null +++ b/assets/Makefile-Models @@ -0,0 +1,4 @@ +# Assumes to be invoked from the project's top-level directory (namely where the top-level devkitarm-based Makefile is located). + +data-models/*.c data-models/*.h &: assets/models/*.obj + python3 tools/obj2model.py \ No newline at end of file diff --git a/assets/Makefile-Music b/assets/Makefile-Music new file mode 100644 index 0000000..c2f60ba --- /dev/null +++ b/assets/Makefile-Music @@ -0,0 +1,7 @@ +# Assumes to be invoked from the project's top-level directory (namely where the top-level devkitarm-based Makefile is located). + +CONV2AAS := lib/apex-audio-system/build/conv2aas/conv2aas + +data-audio/*.s data-audio/*.h &: assets/music + @ $(CONV2AAS) assets/music + @ mv AAS_Data.s AAS_Data.h data-audio \ No newline at end of file diff --git a/assets/music/BuxWV250.mod b/assets/music/BuxWV250.mod new file mode 100644 index 0000000000000000000000000000000000000000..fde782b46233bf41d4a5bc08e1450b49477540da GIT binary patch literal 52582 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 wPj0_FKH3cwn+a literal 0 HcmV?d00001 diff --git a/assets/music/aaa.mod b/assets/music/aaa.mod new file mode 100644 index 0000000000000000000000000000000000000000..e3a5b4d54a0789246b77e862157bf1a545b0c676 GIT binary patch literal 98956 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

Ug2ihFAcinT{t_LZ*!a+h>RY8jZ}8&ts0T^u3{(

nMZeJfl6Mg?JI5wc9IT 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 literal 0 HcmV?d00001 diff --git a/lib/.DS_Store b/lib/.DS_Store deleted file mode 100644 index 04d71712c287606d6f2c6a529e09450f7f42fd4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}N6?5T4P33xf2fC&|SJ=o_SEeS#jm%C=yIZMO$|4?cm9;yd_ae)FTaGzTw= z$P8q@NoFR=ey~Y~hs_VpqCqULY2HMf8f0!*-LuI1BI3#;N zqn;kAqbK^Z|LtD4dvSAj9I+kRw(Exup5}V<{PN0g^IFvU8&Ug>u;r^=>YAZ~fnXpQ z2nK?IpJV`cwn%es7&;gT27-Z42IPE5XoA_X80yghr6mARp3y3>rIwJK/docs/index.html + + +## History + +Apex Audio System was made by James Daniels of Apex Systems back in 2003 for the +GBA version of Payback. The library underwent several revisions, the latest of +which was v1.11. At the beginning of 2021, James was so kind to donate the +sources to the community, hence this Git repo. + + +## Latest release + +The current release is v1.12. See the documentation for a list of changes. + + +## Contact + +Github project page: https://github.com/stuij/apex-audio-system + +Pull requests are welcome, as are forks of course. If you want to report issues, +open an issue on the Github project issue tracker. + +For a more realtime interactive experience, join gbadev on Discord. There's a +good chance there's one or two people there that have used AAS before. + + +## License + +AAS is now distributed under the MIT license. For licensing terms, see the +LICENSE file in the root of this repo or go to +http://opensource.org/licenses/MIT + +James only had one request when handing over the sources: that users of the +library include a credit to Apex Designs. In essence this is now covered by the +MIT license. It's up to you how you want to fill this in, but please be +respectful of this requirement. diff --git a/lib/apex-audio-system/docs/api_general.html b/lib/apex-audio-system/docs/api_general.html new file mode 100644 index 0000000..ee26868 --- /dev/null +++ b/lib/apex-audio-system/docs/api_general.html @@ -0,0 +1,323 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: AAS_SetConfig +

+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_SetConfig( int config_mix, int config_chans, int config_spatial, int config_dynamic );
FUNCTIONSets the effective mixing rate, number of channels, volume boost, mono/stereo output and switches dynamic mixing on or off. Must be called before using any other AAS functions.
PARAMETERS + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValid valuesMeaning
config_mix +AAS_CONFIG_MIX_32KHZ
+AAS_CONFIG_MIX_28KHZ
+AAS_CONFIG_MIX_24KHZ
+AAS_CONFIG_MIX_20KHZ
+AAS_CONFIG_MIX_16KHZ
+AAS_CONFIG_MIX_12KHZ
+AAS_CONFIG_MIX_8KHZ +
Specifies the effective mixing rate
config_chans +AAS_CONFIG_CHANS_16
+AAS_CONFIG_CHANS_8
+AAS_CONFIG_CHANS_4
+AAS_CONFIG_CHANS_16_LOUD
+AAS_CONFIG_CHANS_8_LOUD
+AAS_CONFIG_CHANS_4_LOUD +
Specifies the maximum number of channels and whether the output should be volume boosted and clipped
config_spatial +AAS_CONFIG_SPATIAL_STEREO
+AAS_CONFIG_SPATIAL_MONO +
Specifies mono/stereo output
config_dynamic +AAS_CONFIG_DYNAMIC_OFF
+AAS_CONFIG_DYNAMIC_ON
Specifies dynamic mixing on/off (see NOTES)
RETURNS + + + + + + + + + + +
AAS_OK:Function executed correctly.
AAS_ERROR_INVALID_CONFIG:Invalid configuration requested.
NOTES +

This function should be called at least once before calling any other AAS functions. It can also be used to change the audio settings, although doing so will stop any sounds that are currently playing. The recommended configuration is 24KHz AAS_CONFIG_CHANS_8 mono with dynamic mixing disabled.

+

The AAS_CONFIG_CHANS_x_LOUD modes increase the volume of the output but take ~10% more CPU time and can cause the sound to distort in some cases. They are not recommended for use with the 4 channel modes but are strongly encouraged when using 16 channels.

+

Dynamic mixing automatically adjusts the mixing rate depending on the frequency of the sounds being played, up to a maximum of the mixing rate you specified. Disabling it will cause AAS to always use the mixing rate you chose. Dynamic mixing is still somewhat experimental, but it often yields a significant performance boost for only a very small drop in quality.

+

If stereo mode is used the SFX channels are arranged as follows:

+
    +
  • SFX Channel 0 : Left
  • +
  • SFX Channel 1 : Right
  • +
  • SFX Channel 2 : Right
  • +
  • SFX Channel 3 : Left
  • +
  • SFX Channel 4 : Left
  • +
  • SFX Channel 5 : Right
  • +
  • SFX Channel 6 : Right
  • +
  • SFX Channel 7 : Left
  • +
  • SFX Channel 8 : Left
  • +
  • SFX Channel 9 : Right
  • +
  • SFX Channel 10 : Right
  • +
  • SFX Channel 11 : Left
  • +
  • SFX Channel 12 : Left
  • +
  • SFX Channel 13 : Right
  • +
  • SFX Channel 14 : Right
  • +
  • SFX Channel 15 : Left
  • +
+

In mono mode, all sounds come out both speakers.

+

The number of channels you can access is limited by the number that are already being used to play a MOD. So, if you're playing a 3 channel MOD in AAS_CONFIG_CHANS_4 mode then only the first channel (channel 0) will be available for playing sound effects. If AAS_CONFIG_CHANS_8 were used in the same situation then the first 5 channels (channels 0-4) would be available.

+
+
+ +
:: AAS_Timer1InterruptHandler +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_Timer1InterruptHandler();
FUNCTIONEither this or AAS_FastTimer1InterruptHandler must be quickly called when a Timer 1 interrupt occurs.
PARAMETERSNone
RETURNSNothing
NOTES +

The Timer 1 interrupt occurs roughly 50 times per second and this routine must be called by the user's interrupt handler each time the appropriate interrupt occurs. For more information about this please read the getting started section and, for example interrupt handling code, please read the example section.

+

This routine also mixes the next batch of audio so it can take a long time to return. This may cause problems if you have other CPU-intensive interrupts in your code. In these cases, AAS_FastTimer1InterruptHandler, AAS_DoWork and the special "__AAS_MultipleInterrupts" mode in the crt0.s file used in AASExample2 should be used instead of the normal interrupt handling modes.

+
+
+ +
:: AAS_FastTimer1InterruptHandler +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_FastTimer1InterruptHandler();
FUNCTIONEither this or AAS_Timer1InterruptHandler must be quickly called when a Timer 1 interrupt occurs. AAS_DoWork must also be called 50 times per second if AAS_FastTimer1InterruptHandler is used.
PARAMETERSNone
RETURNSNothing
NOTES +

This function also requires a seperate (less time-sensitive) call to AAS_DoWork at least 50 times a second. This function is called automatically if the special "AAS_MultipleInterrupts" mode in the custom crt0.s file included with the SDK is used.

+

The Timer 1 interrupt occurs roughly 50 times per second and this routine must be called by the user's interrupt handler each time the appropriate interrupt occurs. For more information about this please read the getting started section and, for example interrupt handling code, please read the example section.

+

This routine starts the next piece of audio playing, but does not mix the batch of audio that will be played after that. This means that this routine returns very quickly but a seperate call to AAS_DoWork is also required within the next 50th of a second. The ideal place to call AAS_DoWork is during VBlank. To prevent AAS_FastTimer1InterruptHandler() being halted by another interrupt, the special "__AAS_MultipleInterrupts" mode in the crt0.s file used in AASExample2 should also be used.

+

Alternatively, if your code does not use other CPU-intensive interrupts then you can use a normal interrupt handler and AAS_Timer1InterruptHandler. In this case there is no need for a seperate call to AAS_DoWork. An example of this method of handling interrupts is shown in AASExample.

+
+
+ +
:: AAS_DoWork +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_DoWork();
FUNCTIONMixes the next batch of audio. Should only be used in conjunction with AAS_FastTimer1InterruptHandler.
PARAMETERSNone
RETURNSNothing
NOTES +

This function should be called at least 50 times a second (during VBlank, for example) if you're using AAS_FastTimer1InterruptHandler. If you're using AAS_Timer1InterruptHandler instead then AAS_DoWork should not be called at all.

+

Should only be used in conjunction with AAS_FastTimer1InterruptHandler and the special "__AAS_MultipleInterrupts" mode in the crt0.s file used in AASExample2. Alternatively, AAS_Timer1InterruptHandler can be used with the standard interrupt handlers but this will not work correctly if there are other CPU-intensive interrupts in your code.

+
+
+ +
:: AAS_DoDMA3 +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_DoDMA3( void* source, void* dest, AAS_u32 flags_and_length );
FUNCTIONAllows DMA3 to be used safely.
PARAMETERS + + + + + + + + + + + + + + + + + + + + +
NameValid valuesMeaning
source +Depends on flags_and_length +Specifies source address
dest +Depends on flags_and_length +Specifies dest address
flags_and_length +See GBA docs +See GBA docs
RETURNSNothing
NOTES +

The mixer uses DMA3 internally, which means it is no longer safe to use DMA3 in your code in the usual way since the mixer might interrupt it halfway through and corrupt the parameters. To fix this you should either use AAS_DoDMA3 or the stmia assembler instruction to write all parameters with a single instruction.

+
+
+ +
:: AAS_ShowLogo +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_ShowLogo();
FUNCTIONDisplays the AAS splash screen.
PARAMETERSNone
RETURNSNothing
NOTES +

It is entirely optional for projects to use this splash-screen on startup from v1.12 onwards, now that this is an open-source project. This is a change from the v1.11 release back in 2008 and earlier. Although the creator does still appreciate attribution. Please read about licensing here.

+
+
+ + + diff --git a/lib/apex-audio-system/docs/api_index.html b/lib/apex-audio-system/docs/api_index.html new file mode 100644 index 0000000..d6faebf --- /dev/null +++ b/lib/apex-audio-system/docs/api_index.html @@ -0,0 +1,274 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: General Functions +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AAS_SetConfig:Sets the effective mixing rate, number of channels, volume boost, mono/stereo output and switches dynamic mixing on or off. Must be called before using any other AAS functions.
AAS_Timer1InterruptHandler:Either this or AAS_FastTimer1InterruptHandler must be quickly called when a Timer 1 interrupt occurs.
AAS_FastTimer1InterruptHandler:Either this or AAS_Timer1InterruptHandler must be quickly called when a Timer 1 interrupt occurs. AAS_DoWork must also be called 50 times per second if AAS_FastTimer1InterruptHandler is used.
AAS_DoWork:Mixes the next batch of audio. Should only be used in conjunction with AAS_FastTimer1InterruptHandler.
AAS_DoDMA3:Allows DMA3 to be used safely.
AAS_ShowLogo:Displays the AAS splash screen.
+ +
+
:: SFX Functions +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AAS_SFX_Play:Starts playing the specified sample.
AAS_SFX_ChannelExists:Returns AAS_TRUE only if AAS_SFX_Play will succeed for this channel, otherwise returns AAS_FALSE.
AAS_SFX_IsActive:Returns AAS_TRUE if channel is valid and active, AAS_FALSE otherwise.
AAS_SFX_EndLoop:If a looping sample was playing in this channel, it will not loop again at end of the current iteration.
AAS_SFX_SetFrequency:Changes the frequency of the sample playing in the specified channel.
AAS_SFX_SetVolume:Changes the volume of the sample playing in the specified channel.
AAS_SFX_Stop:Stops the sample currently playing in the specified channel.
AAS_SFX_Resume:Resumes a channel that has been previously stopped.
AAS_SFX_GetNumChannels:Returns the number of SFX channels that are currently available.
+ +
+
:: MOD Functions +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AAS_MOD_Play:Starts playing the specified MOD file.
AAS_MOD_SetLoop:Specifies whether the current MOD will loop. All MODs loop by default.
AAS_MOD_Stop:Stops playing current MOD.
AAS_MOD_Pause:Pauses the current MOD. It can be continued later using AAS_MOD_Resume.
AAS_MOD_Resume:Resumes a MOD that was previously paused using AAS_MOD_Pause.
AAS_MOD_IsPlaying:Checks whether a MOD is currently playing.
AAS_MOD_HasLooped:Checks whether or not the current MOD has looped.
AAS_MOD_GetVolume:Returns the current volume for MOD tunes. 0 = silent, 256 = max.
AAS_MOD_SetVolume:Sets the current volume for MOD tunes. 0 = silent, 256 = max.
AAS_MOD_GetSongPos:Returns the current song position of the playing MOD.
AAS_MOD_SetSongPos:Immediately jumps to the specified song position.
AAS_MOD_QueueSongPos:Jumps to the specified song position when the current pattern finishes.
AAS_MOD_GetLineNum:Returns the current line number of the playing MOD.
AAS_MOD_GetLastFilterValue:Returns the value specified by the most recent "E0: Set Filter" effect. Can be used to sychronise code with the music.
AAS_MOD_GetNumChannels:Returns the number of channels that are currently being reserved by the MOD.
+ +
+
:: Misc Functions +
+ + + + + + + + + + + + + + + + + +
AAS_GetOutputBufferAddress:Gets the address of the specified mixing buffer. Can be used to make oscilliscope displays of the current output.
AAS_GetOutputBufferLength:Gets the current length of the mixing buffer in bytes.
AAS_GetActualMixRate:Returns the current mixing rate in hertz.
+ +
+
:: Mixer Functions +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AAS_MixAudio:Mixes multiple sounds into a single mixing buffer. This function is in IWRAM and so it must be called using AAS_INIT_BRANCH and AAS_BRANCH() as described in "AAS_Mixer.h". This function should not normally be directly called.
AAS_MixAudio_NoChange:Mixes multiple sounds into a single mixing buffer. This function should only be called if there are no changes to chans[] since a previous call to AAS_MixAudio. Do not call twice in a row. This function is in IWRAM and so it must be called using AAS_INIT_BRANCH and AAS_BRANCH() as described in "AAS_Mixer.h". This function should not normally be directly called - see AAS_MixAudio.
AAS_MixAudio_SetMode:Enable/disable volume boost and (optional) clipping. This function should only be called if you can be 100% sure that AAS_MixAudio and AAS_MixAudio_NoChange won't interrupt it. This function should not normally be directly called - see AAS_MixAudio.
AAS_MixAudio_SetMaxChans_2:Sets the maximum number of channels in the set to 2. This function should only be called if you can be 100% sure that AAS_MixAudio and AAS_MixAudio_NoChange won't interrupt it. This function should not normally be directly called - see AAS_MixAudio.
AAS_MixAudio_SetMaxChans_4:Sets the maximum number of channels in the set to 4 (the default). This function should only be called if you can be 100% sure that AAS_MixAudio and AAS_MixAudio_NoChange won't interrupt it. This function should not normally be directly called - see AAS_MixAudio.
AAS_MixAudio_SetMaxChans_8:Sets the maximum number of channels in the set to 8. This function should only be called if you can be 100% sure that AAS_MixAudio and AAS_MixAudio_NoChange won't interrupt it. This function should not normally be directly called - see AAS_MixAudio.
+ +
+ + + diff --git a/lib/apex-audio-system/docs/api_misc.html b/lib/apex-audio-system/docs/api_misc.html new file mode 100644 index 0000000..b65b864 --- /dev/null +++ b/lib/apex-audio-system/docs/api_misc.html @@ -0,0 +1,163 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: AAS_GetOutputBufferAddress +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEconst AAS_s8* AAS_GetOutputBufferAddress( int buffer );
FUNCTIONGets the address of the specified mixing buffer. Can be used to make oscilliscope displays of the current output.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
buffer +0 or 1 +Specifies direct sound channel you want to get the mixing buffer for. 0 = Direct Sound A, 1 = Direct Sound B.
RETURNS + + + + + + + + + + +
AAS_NULL:The buffer you requested does not exist or is currently not being used (during a period of silence, for example).
Any valid address:The address of the start of the mixing buffer currently being used for the specified buffer.
NOTES +

Altering the values found in the mixing buffer may corrupt the sound output.

+
+
+ +
:: AAS_GetOutputBufferLength +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_GetOutputBufferLength();
FUNCTIONGets the current length of the mixing buffer in bytes.
PARAMETERSNone
RETURNS + + + + + +
Any integer:The current length of the mixing buffer in bytes.
NOTES +

Altering the values found in the mixing buffer may corrupt the sound output.

+
+
+ +
:: AAS_GetActualMixRate +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_GetActualMixRate();
FUNCTIONReturns the current mixing rate in hertz.
PARAMETERSNone
RETURNS + + + + + +
800-32000:The current mixing rate in hertz.
NOTES +

This function will always return the mixing rate you specified when you called AAS_SetConfig if you disabled dynamic mixing. With dynamic mixing enabled this value may be less than the rate you specified.

+
+
+ + + diff --git a/lib/apex-audio-system/docs/api_mixer.html b/lib/apex-audio-system/docs/api_mixer.html new file mode 100644 index 0000000..c6b8690 --- /dev/null +++ b/lib/apex-audio-system/docs/api_mixer.html @@ -0,0 +1,366 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: AAS_MixAudio +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_MixAudio( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations );
FUNCTIONMixes multiple sounds into a single mixing buffer. This function is in IWRAM and so it must be called using AAS_INIT_BRANCH and AAS_BRANCH() as described in "AAS_Mixer.h". This function should not normally be directly called.
PARAMETERS + + + + + + + + + + + + + + + + + + + + +
NameValid valuesMeaning
mix_buffer +Any writeable word-aligned address at least iterations*16 bytes in size +Specifies the address of the mixing buffer you wish to use
chans +Any writeable word-aligned address pointing to valid channel data +The start address of an array of 8 AAS_Channel structures
iterations +1-127 +The number of 16 byte chunks you wish the function to write to mix_buffer
RETURNSNothing
NOTES +

This function (and the others in this section of the documentation) should only be used if you've got a strong reason for needing to access the mixing routine directly. Because of this, it isn't included in the usual "AAS.h" header file - you'll need to include "AAS_Mixer.h" instead, which is in the "aas/" folder of either the release or the ‹root›/build file when building from source. A good understanding of the GBA's sound hardware is required to use this routine directly.

+ +

The AAS_Channel structure is defined in the header file as follows:

+ +
+struct AAS_Channel
+{
+	AAS_u8 effective_volume;
+	AAS_BOOL active;
+	AAS_u8 volume;
+	AAS_u8 pos_fraction;
+	AAS_u16 frequency;
+	AAS_u16 delta;
+	const AAS_s8* pos;
+	const AAS_s8* end;
+	AAS_u32 loop_length;
+};
+ +

The meaning of these elements is shown below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValid valuesMeaning
effective_volume +0-255 (see below) +Specifies the volume of this channel. Channels with an effective_volume of zero will not be processed. This should usually be set to (active?volume:0) before calling AAS_MixAudio. Zero will be written here by the mixer when a non-looping sample finishes.
active +AAS_TRUE or AAS_FALSE +AAS_MixAudio does not read this value but it does write AAS_FALSE here when a non-looping sample finishes. (See effective_volume.)
volume +0-255 +Not directly used by AAS_MixAudio. (See effective_volume.)
pos_fraction +Any +The fractional component of the sample position. This value should be reset to zero when a sample is started, but other than that it should only be changed by AAS_MixAudio.
frequency +1-65535 +Not directly used by AAS_MixAudio. (See delta.)
delta +1-4095 +Specifies how much to add on to the sample position per byte in 2.10 fixed point format. Usually set to ((frequency<<10)/mixing_frequency) before calling AAS_MixAudio.
pos +Any valid address +The address of the current sample position. The fractional component is stored in pos_fraction.
end +Any valid address +The address of the end of the sample.
loop_length +Any +The number of bytes from the end of the sample back to the loop restart point. Zero indicates that the sample should not loop.
+ +

AAS_MixAudio expects to be passed a pointer to an array of 8 AAS_Channels - this is referred to as a channel set. An array containing 16 AAS_Channels is provided and is called AAS_channels[]. This can effectively be used as two seperate arrays of 8 AAS_Channels by calling using either &AAS_channels[0] or &AAS_channels[8] as a parameter. This allows a total of 16 channels - 8 per Direct Sound output. (The maximum number of channels per set is specified using the AAS_MixAudio_SetMaxChans_x functions - the default is 4.)

+ +

Also note that the total volume (i.e. the sum of the effective_volumes for all the channels in the set) must not exceed 256 (except if AAS_MIXAUDIO_MODE_BOOST is used (see AAS_MixAudio_SetMode), in which case the total must not exceed 128). If it does, the sound output will be distorted. This means that, despite 255 (127 with AAS_MIXAUDIO_MODE_BOOST) being a valid volume for a channel as indicated above, it is only safe to set a volume this high if the total effective_volume of the remaining channels in the channel set is 0 or 1. This means that if you intend to use all 8 channels in the set then you should generally use volumes in the range 0-32 (0-16 with AAS_MIXAUDIO_MODE_BOOST).

+ +

A few other things worth noting about this routine:

+
    +
  • It doesn't increment pos if a channel's effective_volume is 0. You'll need to increment it yourself if you want this to happen.
  • +
  • Do not call AAS_MixAudio if there are no active channels in the set. Use a seperate routine to write out zeroes to the buffer or use a pre-calculated buffer full of zeroes instead.
  • +
  • The dynamic mixing rate feature is also handled by a different routine so you cannot use this feature if you are accessing AAS_MixAudio directly without implimenting your own code to change the mixing rate.
  • +
  • All sample data should be 8-bit signed and clipped to the range -127 to 127. (Rather than the usual range of -128 to 127.) If this extra bit of clipping is not done then the sound may occasionally distort. Conv2AAS does this automatically, but if you're using a different program to import your sample data (not recommended) then you will need to preprocess the data to avoid this problem.
  • +
  • The mixer does not sanity check the input parameters. The result of passing illegal parameters is undefined.
  • +
  • AAS_MixAudio uses DMA 3, which may cause problems if it is called via an interrupt whilst another bit of code is halfway through initialising a DMA 3 transfer. AAS_DoDMA3 should be used to prevent this problem. This routine works by writing all the values required to start a DMA transfer with a single stmia instruction. You can do this in your own code as an alternative to calling AAS_DoDMA3.
  • +
  • You will need to set up your own sound handling routines and interrupts around the mixer to get it work usefully. This is normally handled by AAS but this is not possible when AAS_MixAudio is directly accessed. It should not be used in conjunction with any of the standard AAS commands with the exception of AAS_ShowLogo and AAS_DoDMA3.
  • +
  • Also bare in mind that the API for this routine is more likely to change in future versions of AAS than those for the other routines. [Last changed in v1.11]
  • +
+ +
+
+ +
:: AAS_MixAudio_NoChange +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_MixAudio_NoChange( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations );
FUNCTIONMixes multiple sounds into a single mixing buffer. This function should only be called if there are no changes to chans[] since a previous call to AAS_MixAudio. Do not call twice in a row. This function is in IWRAM and so it must be called using AAS_INIT_BRANCH and AAS_BRANCH() as described in "AAS_Mixer.h". This function should not normally be directly called - see AAS_MixAudio.
PARAMETERSSee AAS_MixAudio.
RETURNSNothing
NOTES +

This function works in the same way as AAS_MixAudio, except that it is slightly faster but should only be called if there are no changes to chans[] since a previous call to AAS_MixAudio. It should also not be called twice in a row.

+
+
+ +
:: AAS_MixAudio_SetMode +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_MixAudio_SetMode( int mode );
FUNCTIONEnable/disable volume boost and (optional) clipping. This function should only be called if you can be 100% sure that AAS_MixAudio and AAS_MixAudio_NoChange won't interrupt it. This function should not normally be directly called - see AAS_MixAudio.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
mode +AAS_MIXAUDIO_MODE_NORMAL
+AAS_MIXAUDIO_MODE_BOOST
+AAS_MIXAUDIO_MODE_BOOSTANDCLIP +
Specifies whether the volume should be boosted and (optionally) clipped
RETURNSNothing
NOTES +

The three mixing modes work as follows:

+ +
    +
  • AAS_MIXAUDIO_MODE_NORMAL. No volume boosting. The total volume of the channel set must be <= 256. This is the default setting.
  • +
  • AAS_MIXAUDIO_MODE_BOOST. All volumes are doubled. The output is not clipped so the total volume of the channel set must be <= 128 otherwise severe distortion will occur.
  • +
  • AAS_MIXAUDIO_MODE_BOOSTANDCLIP. All volumes are doubled. The output is clipped so the total volume of the channel set must be <= 256.
  • +
+
+
+ +
:: AAS_MixAudio_SetMaxChans_2 +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_MixAudio_SetMaxChans_2();
FUNCTIONSets the maximum number of channels in the set to 2. This function should only be called if you can be 100% sure that AAS_MixAudio and AAS_MixAudio_NoChange won't interrupt it. This function should not normally be directly called - see AAS_MixAudio.
PARAMETERSNone
RETURNSNothing
NOTES +

For best performance, the maximum number of channels in the set should be set to the lowest number that is >= the actual number of channels in the set.

+
+
+ +
:: AAS_MixAudio_SetMaxChans_4 +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_MixAudio_SetMaxChans_4();
FUNCTIONSets the maximum number of channels in the set to 4 (the default). This function should only be called if you can be 100% sure that AAS_MixAudio and AAS_MixAudio_NoChange won't interrupt it. This function should not normally be directly called - see AAS_MixAudio.
PARAMETERSNone
RETURNSNothing
NOTES +

For best performance, the maximum number of channels in the set should be set to the lowest number that is >= the actual number of channels in the set.

+
+
+ +
:: AAS_MixAudio_SetMaxChans_8 +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_MixAudio_SetMaxChans_8();
FUNCTIONSets the maximum number of channels in the set to 8. This function should only be called if you can be 100% sure that AAS_MixAudio and AAS_MixAudio_NoChange won't interrupt it. This function should not normally be directly called - see AAS_MixAudio.
PARAMETERSNone
RETURNSNothing
NOTES +

For best performance, the maximum number of channels in the set should be set to the lowest number that is >= the actual number of channels in the set.

+
+
+ + + diff --git a/lib/apex-audio-system/docs/api_mod.html b/lib/apex-audio-system/docs/api_mod.html new file mode 100644 index 0000000..03fa1bf --- /dev/null +++ b/lib/apex-audio-system/docs/api_mod.html @@ -0,0 +1,649 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: AAS_MOD_Play +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_Play( int song_num );
FUNCTIONStarts playing the specified MOD file.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
song_num +AAS_DATA_MOD_???, where ??? is the name of the MOD you wish to play (see your project's AAS_Data.h file for a complete list of all available MODs) +Specifies the MOD you want to start playing
RETURNS + + + + + + + + + + + + + + + + + + + + +
AAS_OK:The function executed correctly.
AAS_ERROR_MOD_DOES_NOT_EXIST:The MOD you requested does not exist.
AAS_ERROR_CALL_SET_CONFIG_FIRST:AAS_SetConfig has not been successfully called yet. It must be successfully called at least once before calling this function.
AAS_ERROR_NOT_ENOUGH_CHANNELS:The MOD you requested needs more channels than you have available.
NOTES +

If an existing MOD file is already playing it will be replaced by the new selection. AAS_SetConfig must be called at least once before calling this function. Any sound effects that are playing in the MOD channels will be stopped.

+
+
+ +
:: AAS_MOD_SetLoop +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_SetLoop( AAS_BOOL loop );
FUNCTIONSpecifies whether the current MOD will loop. All MODs loop by default.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
loop +AAS_TRUE or AAS_FALSE +Specifies whether the current MOD will loop
RETURNS + + + + + + + + + + + + + + + +
AAS_OK:The MOD has been set to loop as requested.
AAS_ERROR_NO_MOD_PLAYING:The command failed because no MOD is currently playing.
AAS_ERROR_CALL_SET_CONFIG_FIRST:AAS_SetConfig has not been successfully called yet. It must be successfully called at least once before calling this function.
NOTESAll MODs loop by default. This means that if you want your MODs not to loop, you must call "AAS_MOD_SetLoop( AAS_FALSE );" immediately after the AAS_MOD_Play command.
+
+ +
:: AAS_MOD_Stop +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_MOD_Stop();
FUNCTIONStops playing current MOD.
PARAMETERSNone
RETURNSNothing
NOTES +

If a MOD is currently playing it will be stopped. Any sound effects that are playing in the MOD channels will be stopped - see AAS_SetConfig.

+
+
+ +
:: AAS_MOD_Pause +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_MOD_Pause();
FUNCTIONPauses the current MOD. It can be continued later using AAS_MOD_Resume.
PARAMETERSNone
RETURNSNothing
NOTES +

Unlike AAS_MOD_Stop, the channels used by the MOD player are not returned for use as SFX channels when AAS_MOD_Pause is called.

+
+
+ +
:: AAS_MOD_Resume +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEvoid AAS_MOD_Resume();
FUNCTIONResumes a MOD that was previously paused using AAS_MOD_Pause.
PARAMETERSNone
RETURNSNothing
NOTES +

Calling AAS_MOD_Resume without pausing a MOD beforehand using AAS_MOD_Pause will have no effect. Resuming a MOD that is already playing also has no effect.

+
+
+ +
:: AAS_MOD_IsPlaying +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEAAS_BOOL AAS_MOD_IsPlaying();
FUNCTIONChecks whether a MOD is currently playing.
PARAMETERSNone
RETURNS + + + + + + + + + + +
AAS_FALSE:No MOD is currently playing.
AAS_TRUE:A MOD is currently playing.
NOTESNone
+
+ +
:: AAS_MOD_HasLooped +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEAAS_BOOL AAS_MOD_HasLooped();
FUNCTIONChecks whether or not the current MOD has looped.
PARAMETERSNone
RETURNS + + + + + + + + + + +
AAS_FALSE:The MOD has not yet looped.
AAS_TRUE:The MOD has looped.
NOTESAlways returns AAS_FALSE if no MOD is playing or if AAS has not yet been initialised.
+
+ +
:: AAS_MOD_GetVolume +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_GetVolume();
FUNCTIONReturns the current volume for MOD tunes. 0 = silent, 256 = max.
PARAMETERSNone
RETURNS + + + + + +
0-256:The current MOD volume. 0 = silent, 256 = max.
NOTESNone
+
+ +
:: AAS_MOD_SetVolume +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_SetVolume( int vol );
FUNCTIONSets the current volume for MOD tunes. 0 = silent, 256 = max.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
vol +0-256 +Specifies the new volume you want MODs to be played at
RETURNS + + + + + + + + + + +
AAS_OK:The volume was successfully changed as requested.
AAS_ERROR_VOLUME_OUT_OF_RANGE:The volume was not in the range 0-256. The MOD volume has not been adjusted.
NOTESNone
+
+ +
:: AAS_MOD_GetSongPos +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_GetSongPos();
FUNCTIONReturns the current song position of the playing MOD.
PARAMETERSNone
RETURNS + + + + + + + + + + +
0-127:The current song position.
AAS_ERROR_NO_MOD_PLAYING:There is no MOD currently playing.
NOTESNone
+
+ +
:: AAS_MOD_SetSongPos +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_SetSongPos( int song_pos );
FUNCTIONImmediately jumps to the specified song position.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
song_pos +0-127 +Specifies the new song position
RETURNS + + + + + + + + + + + + + + + +
AAS_OK:The function executed correctly.
AAS_ERROR_INVALID_SONG_POS:The specified song position does not exist.
AAS_ERROR_NO_MOD_PLAYING:There is no MOD currently playing.
NOTESNone
+
+ +
:: AAS_MOD_QueueSongPos +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_QueueSongPos( int song_pos );
FUNCTIONJumps to the specified song position when the current pattern finishes.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
song_pos +0-127 +Specifies the new song position
RETURNS + + + + + + + + + + + + + + + +
AAS_OK:The function executed correctly.
AAS_ERROR_INVALID_SONG_POS:The specified song position does not exist.
AAS_ERROR_NO_MOD_PLAYING:There is no MOD currently playing.
NOTESNone
+
+ +
:: AAS_MOD_GetLineNum +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_GetLineNum();
FUNCTIONReturns the current line number of the playing MOD.
PARAMETERSNone
RETURNS + + + + + + + + + + +
0-63:The current line number.
AAS_ERROR_NO_MOD_PLAYING:There is no MOD currently playing.
NOTESNone
+
+ +
:: AAS_MOD_GetLastFilterValue +
+ + + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_GetLastFilterValue();
FUNCTIONReturns the value specified by the most recent "E0: Set Filter" effect. Can be used to sychronise code with the music.
PARAMETERSNone
RETURNS + + + + + +
0-15:The most recent value specified by an "E0: Set Filter" effect.
NOTESWill return 0 if no "E0: Set Filter" effect has yet been found, if no MOD is playing or if AAS has not been initialised. The "E0: Set Filter" effect makes no difference to the sound output of AAS as the GBA has no hardware filter so it is safe to change whilst a piece of music is playing.
+
+ +
:: AAS_MOD_GetNumChannels +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_MOD_GetNumChannels();
FUNCTIONReturns the number of channels that are currently being reserved by the MOD.
PARAMETERSNone
RETURNS + + + + + +
0-16:The number of channels that are currently being reserved by the MOD.
NOTES +

None

+
+
+ + + diff --git a/lib/apex-audio-system/docs/api_sfx.html b/lib/apex-audio-system/docs/api_sfx.html new file mode 100644 index 0000000..7af6e27 --- /dev/null +++ b/lib/apex-audio-system/docs/api_sfx.html @@ -0,0 +1,598 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: AAS_SFX_Play +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_SFX_Play( int channel, int sample_volume, int sample_frequency, const AAS_s8* sample_start, const AAS_s8* sample_end, const AAS_s8* sample_restart );
FUNCTIONStarts playing the specified sample.
PARAMETERS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValid valuesMeaning
channel +Depends on how AAS has been configured - see AAS_SetConfig +Specifies the channel you wish to use
sample_volume +0-64 +Specifies the volume you wish to play the sample at
sample_frequency +1-65535 +Specifies the frequency you wish to play the sample at
sample_start +AAS_DATA_SFX_START_???, where ??? is the name of the sample you wish to play (see your project's AAS_Data.h file for a complete list of all available samples) +Specifies the start address of the sample you wish to play
sample_end +AAS_DATA_SFX_END_???, where ??? is the name of the sample you wish to play (see your project's AAS_Data.h file for a complete list of all available samples) +Specifies the end address if the sample you wish to play
sample_restart +AAS_NULL or any address between AAS_DATA_SFX_START_??? (inclusive) and AAS_DATA_SFX_END_??? (exclusive), where ??? is the name of the sample you wish to play (see your project's AAS_Data.h file for a complete list of all available samples) +Specifies the address the sample will loop to when it gets to the end. NULL indicates that the sample should not loop.
RETURNS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AAS_OK:Function executed correctly.
AAS_ERROR_INVALID_SAMPLE_ADDRESS:The sample_start, sample_end or sample_restart addresses specified are not valid.
AAS_ERROR_VOLUME_OUT_OF_RANGE:The volume specified is not in the range 0-64.
AAS_ERROR_FREQUENCY_OUT_OF_RANGE:The frequency specified is not in the range 1-65535.
AAS_ERROR_CHANNEL_NOT_AVAILABLE:The channel you specified is not available to play a sample - see AAS_SetConfig.
AAS_ERROR_CALL_SET_CONFIG_FIRST:AAS_SetConfig has not been successfully called yet. It must be successfully called at least once before calling this function.
NOTES +

Sample frequency is capped at 4 times the mixing rate specified when calling AAS_SetConfig.

+
+
+ +
:: AAS_SFX_ChannelExists +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEAAS_BOOL AAS_SFX_ChannelExists( int channel );
FUNCTIONReturns AAS_TRUE only if AAS_SFX_Play will succeed for this channel, otherwise returns AAS_FALSE.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
channel +Depends on how AAS has been configured - see AAS_SetConfig +Specifies the channel you wish to test
RETURNS + + + + + + + + + + +
AAS_FALSE:This channel is not currently a valid sound effect channel.
AAS_TRUE:This channel is currently a valid sound effect channel.
NOTES +

Whether a channel is available or not depends on how many channels were specified when calling AAS_SetConfig and also on whether or not a MOD is currently playing. See AAS_SetConfig for more information.

+
+
+ +
:: AAS_SFX_IsActive +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEAAS_BOOL AAS_SFX_IsActive( int channel );
FUNCTIONReturns AAS_TRUE if channel is valid and active, AAS_FALSE otherwise.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
channel +Depends on how AAS has been configured - see AAS_SetConfig +Specifies the channel you wish to test
RETURNS + + + + + + + + + + +
AAS_FALSE:This is an invalid channel for sound effects, or it is valid but currently in use.
AAS_TRUE:This is a valid sound effect channel and it currently has a sound effect playing.
NOTES +

Whether or not a channel is valid depends on how many channels were specified when calling AAS_SetConfig and also on whether or not a MOD is currently playing. See AAS_SetConfig for more information. Provided the channel specified is valid, this function will return AAS_TRUE if there is another sound effect playing on this channel, and AAS_FALSE if there is not. It will always return AAS_FALSE if the channel is invalid.

+
+
+ +
:: AAS_SFX_EndLoop +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_SFX_EndLoop( int channel );
FUNCTIONIf a looping sample was playing in this channel, it will not loop again at end of the current iteration.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
channel +Depends on how AAS has been configured - see AAS_SetConfig +Specifies the channel you wish to change
RETURNS + + + + + + + + + + + + + + + +
AAS_OK:The function suceeded.
AAS_ERROR_CHANNEL_NOT_AVAILABLE:The channel specified is invalid.
AAS_ERROR_CALL_SET_CONFIG_FIRST:AAS_SetConfig should be successfully called at least once before calling this function.
NOTES +

None

+
+
+ +
:: AAS_SFX_SetFrequency +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_SFX_SetFrequency( int channel, int sample_frequency );
FUNCTIONChanges the frequency of the sample playing in the specified channel.
PARAMETERS + + + + + + + + + + + + + + + +
NameValid valuesMeaning
channel +Depends on how AAS has been configured - see AAS_SetConfig +Specifies the channel you wish to change
sample_frequency +1-65535 +Specifies the new frequency you wish to play the sample at
RETURNS + + + + + + + + + + + + + + + + + + + + +
AAS_OK:The function suceeded.
AAS_ERROR_FREQUENCY_OUT_OF_RANGE:The frequency specified in not in the range 1-65535.
AAS_ERROR_CHANNEL_NOT_AVAILABLE:The channel specified is invalid.
AAS_ERROR_CALL_SET_CONFIG_FIRST:AAS_SetConfig should be successfully called at least once before calling this function.
NOTES +

Sample frequency is capped at four times the mixing rate specified when calling AAS_SetConfig. If no sample is playing in the specified channel then this function has no effect.

+
+
+ +
:: AAS_SFX_SetVolume +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_SFX_SetVolume( int channel, int sample_volume );
FUNCTIONChanges the volume of the sample playing in the specified channel.
PARAMETERS + + + + + + + + + + + + + + + +
NameValid valuesMeaning
channel +Depends on how AAS has been configured - see AAS_SetConfig +Specifies the channel you wish to change
sample_volume +0-64 +Specifies the new volume you wish to play the sample at
RETURNS + + + + + + + + + + + + + + + + + + + + +
AAS_OK:The function suceeded.
AAS_ERROR_VOLUME_OUT_OF_RANGE:The frequency specified in not in the range 0-64.
AAS_ERROR_CHANNEL_NOT_AVAILABLE:The channel specified is invalid.
AAS_ERROR_CALL_SET_CONFIG_FIRST:AAS_SetConfig should be successfully called at least once before calling this function.
NOTES +

If no sample is playing in the specified channel then this function has no effect.

+
+
+ +
:: AAS_SFX_Stop +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_SFX_Stop( int channel );
FUNCTIONStops the sample currently playing in the specified channel.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
channel +Depends on how AAS has been configured - see AAS_SetConfig +Specifies the channel you wish to stop
RETURNS + + + + + + + + + + + + + + + +
AAS_OK:The function suceeded.
AAS_ERROR_CHANNEL_NOT_AVAILABLE:The channel specified is invalid.
AAS_ERROR_CALL_SET_CONFIG_FIRST:AAS_SetConfig should be successfully called at least once before calling this function.
NOTES +

If no sample is playing in the specified channel then this function has no effect.

+
+
+ +
:: AAS_SFX_Resume +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_SFX_Resume( int channel );
FUNCTIONResumes a channel that has been previously stopped.
PARAMETERS + + + + + + + + + + +
NameValid valuesMeaning
channel +Depends on how AAS has been configured - see AAS_SetConfig +Specifies the channel you wish to resume
RETURNS + + + + + + + + + + + + + + + + + + + + + + + + + +
AAS_OK:The function suceeded.
AAS_ERROR_CHANNEL_NOT_AVAILABLE:The channel specified is invalid.
AAS_ERROR_CALL_SET_CONFIG_FIRST:AAS_SetConfig should be successfully called at least once before calling this function.
AAS_ERROR_CHANNEL_ACTIVE:The channel is already active so it cannot be resumed.
AAS_ERROR_CHANNEL_UNRESUMEABLE:This channel has either never been used or is inactive because the sample finished.
NOTES +

None

+
+
+ +
:: AAS_SFX_GetNumChannels +
+ + + + + + + + + + + + + + + + + + + + +
PROTOTYPEint AAS_SFX_GetNumChannels();
FUNCTIONReturns the number of SFX channels that are currently available.
PARAMETERSNone
RETURNS + + + + + +
0-16:The number of SFX channels that are currently available.
NOTES +

None

+
+
+ + + diff --git a/lib/apex-audio-system/docs/conv2aas.html b/lib/apex-audio-system/docs/conv2aas.html new file mode 100644 index 0000000..dd2b617 --- /dev/null +++ b/lib/apex-audio-system/docs/conv2aas.html @@ -0,0 +1,139 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: What Is Conv2AAS? +
+ +

Conv2AAS is a simple tool that reads in all the files in a specified directory and converts them into a single data file (with an associated header file) which can then be used in your project. Any redundancy in the data will be removed. For example, if two MODs in your project use the same samples then those samples will only be included once to save space.

+ +
+
:: What File Formats Are Supported? +
+ +

Currently, Conv2AAS supports the following file formats:

+ + + + + + + + + + + + + + + + + + + + + + +
FormatExtensionRestrictions
MOD +.mod +Protracker/Noisetracker/FastTracker/Falcon/TakeTracker 1-16 channel MODs are supported. The following effects are implemented:
+
+0: Arpeggio
+1: Slide Up
+2: Slide Down
+3: Tone Portamento
+4: Vibrato
+5: Tone Portamento + Volume Slide
+6: Vibrato + Volume Slide
+7: Tremolo
+9: Set Sample Offset
+A: Volume Slide
+B: Position Jump
+C: Set Volume
+D: Pattern Break
+E0: Set Filter (*)
+E1: Fine Slide Up
+E2: Fine Slide Down
+E6: Set/Jump to Loop
+E9: Retrigger Note
+EA: Fine Volume Slide Up
+EB: Fine Volume Slide Down
+EC: Note Cut
+ED: Note Delay
+EE: Pattern Delay
+F: Set Speed
+
+(*) The GBA has no hardware filter so this effect does not change the audio output. However, the most recent value set by this effect can be read in your code via the AAS_MOD_GetLastFilterValue function. This can be used to sychronise your code with the music.
+
+Conv2AAS will produce warnings if a MOD uses unsupported effects, is in the wrong format or if it has too many channels. However, even if a MOD does use unsupported effects, it will often still play almost perfectly.
RAW +.raw +Data must be 8-bit signed mono PCM with no header.
WAV +.wav +Must be in 8-bit unsigned mono PCM format. (Automatically converted to signed format by Conv2AAS.)
+ +
+
:: Creating Sound Files +
+ +

Probably the best MOD editor out there is ModPlug. It can convert from other formats and has the added advantage of being free. For converting samples into the appropriate RAW and WAV formats, I recommend SoX, which is also free.

+ +

To convert to the appropriate formats using sox, use the following command:

+ +
+sox [source_filename] -s -b -c 1 [destination_filename]
+ +

[source_filename] is the name of the sound you wish to convert (e.g. "source.wav"). [destination_filename] is the name of the file you wish to create (e.g. "dest.raw") - it should end with ".wav" or ".raw" to be compatible with Conv2AAS. Note that sox will give a warning when converting to .wav format that it has converted the data to unsigned - this is normal. Also make sure that [source_filename] and [destination_filename] are different. It is even possible to use sox to automatically convert all your sound files as part of your project's makefile.

+ +
+
:: Calling Conv2AAS +
+ +

Conv2AAS includes versions compiled for DOS/Windows and Linux. Both are named conv2aas. It should be called from the command line and only needs one parameter, which is the name of the folder that contains the data files. All the files in that folder will be processed so it is recommended that you create a subfolder for your project that contains all the sound files. Conv2AAS always creates two files in the current directory:

+ +

AAS_Data.h : This is the header file that you should include in your main code whenever you want access the AAS sound data.

+ +

AAS_Data.s : This is the raw data itself, stored as an assembly file suitable for the GBA. It should be assembled to produce an object file that can then be linked with your project.

+ +

The example code included with AAS comes with a makefile that will automatically run Conv2AAS each time your program is compiled. It is highly recommended that you use a similar system in your project.

+ +
+ + + diff --git a/lib/apex-audio-system/docs/example.html b/lib/apex-audio-system/docs/example.html new file mode 100644 index 0000000..82a35a0 --- /dev/null +++ b/lib/apex-audio-system/docs/example.html @@ -0,0 +1,232 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: Introduction +
+ +

Three simple examples of how to use AAS are included in the "AASExample", "AASExample2" and "AASExample_c++" folders that come with the SDK. "AASExample" and "AASExample_c++" work using the standard interrupt system, although this does mean that sound quality may suffer if it used in conjunction with other CPU-intensive interrupts. "AASExample2" uses a modified interrupt system that will work in all cases, although it does require more care to set up correctly. Feel free to modify the example code for use in your own projects.

+ +

The suggested structure for your project folder is as follows:

+ +
    +
  • AAS_Data : Folder. Contents: +
      +
    • Your .mod, .raw and .wav files : In these examples there are three files here: Ambulance.wav, Boom.raw and one of FlatOutLies.mod, CALIBRA.MOD or its_just_sonorous.mod
    • +
    +
  • +
  • aas : Folder. Contents: +
      +
    • lib : Folder. Contents: +
        +
      • LibAAS.a : Main AAS Library.
      • +
      +
    • +
    • include : Folder. Contents: +
        +
      • AAS.h : Main AAS header file. Should always be included in your projects.
      • +
      • AAS_Mixer.h : Optional AAS header file. Should only be included if you intend to access the mixer directly (not recommended).
      • +
      + +
    +
  • +
  • Makefile : Your makefile. See below for suggestions on how to set it up to use AAS.
  • +
  • crt0.s : GBA startup code. AASExample2 requires the use of specially modified version. See below for suggestions on how to set it up to use AAS.
  • +
  • lnkscript : Standard GBA linkerscript.
  • +
  • conv2aas : The AAS conversion tool. Use Windows or Linux version depending on your system.
  • +
  • Your .s, .c, .cpp, .h and other files : In this example, there is just one file here: AASExample.c (or, in "AASExample_c++", AASExample.cpp).
  • +
+ +
+
:: Makefile And Includes +
+ +

In order for your programs to compile successfully they must be linked to the AAS library. To do this, the following options should be passed to the linker:

+ +

-Laas/lib : Adds the "aas/lib" subfolder to the list of folders that will be searched for library files.

+

-lAAS : Links the AAS library ("libAAS.a") to your project.

+ +

In order for the compiler to be able to find AAS's include files, the follow option needs to be specified at the compilation stage:

+ +

-Iaas/include : Adds the specified subfolder ("aas/include") to the list of folders that will be searched for include files.

+ +

Both of these options are specified in the Makefile included in the project. It may also be necessary to change the "CROSS =" line in the Makefile depending on the location and file names of the GBA tools on your system.

+ +

NOTE: the Makefiles in the individual example directories aren't selfcontaining for maintainability reasons. They include example.make which includes common.make. Both are found in ‹root›/make. To make a single makefile out of these, just recursively replace the include directive with the actual content of the included file.

+ +

Once the Makefile has been configured appropriately, it is safe to include the AAS header files in your project, as shown in the example code:

+ +
+#include "AAS.h"
+#include "AAS_Data.h"
+ +

The "AAS_Data.h" header file contains information specific to your project and is generated by the Conv2AAS program. The makefile included with the example code automatically calls Conv2AAS each time the program is compiled so that your project will always have an up-to-date header file and will be linked to the most recent version of the files in the "AAS_Data" folder.

+ + +
+
:: Interrupt Handling And crt0.s +
+ +

A crt0.s or similar file is required for any GBA project and, amongst other things, it specifies how hardware interrupts will be handled. AAS can be made to work with all these different methods, provided that a Timer 1 interrupt results in a call to AAS_Timer1InterruptHandler.

+ +

In "AASExample" and "AASExample_c++", the crt0.s file has been configured to use "Fast Interrupts", which means that any interrupt will automatically call a function named InterruptProcess() and it is then up to the user to implement this routine. In order for this work with AAS, your InterruptProcess() code must automatically call "AAS_Timer1InterruptHandler()" when a Timer 1 interrupt occurs. The C code to do this is shown below. The C++ code used in "AASExample_c++" is much the same except InterruptProcess() has to be declared "extern "C"" to prevent name mangling.

+ +
+#define REG_IE (*(volatile AAS_u16 *)0x4000200)
+#define REG_IF (*(volatile AAS_u16 *)0x4000202) 
+
+void InterruptProcess()
+{
+  AAS_u16 intr_bits = REG_IE & REG_IF;
+
+  // It's best to test for AAS's Timer 1 interrupt first
+  if ( intr_bits & 0x10 ) // Timer 1
+    AAS_Timer1InterruptHandler();
+	
+  // Process other interrupts here by testing appropriate bits of "intr_bits"
+
+  // Clear the interrupt flags
+  REG_IF |= REG_IF;
+}
+ +

This routine simply creates a bit mask (intr_bits) that indicates which interrupts have occurred (there may be more than one) and then tests for the Timer 1 interrupt that is used by AAS. If it occured then it calls AAS_Timer1InterruptHandler. You can add additional code to service any other interrupts you may be using in your project. Once all interrupts have been serviced, it is necessary to clear the interrupt flags as the last action before returning from the function.

+ +
+
:: Using AAS With Other CPU-Intensive Interrupts +
+ +

A complication not mentioned in the explanation above is that AAS requires that its interrupt be processed very quickly to avoid audible gaps in the sound. This may cause problems if your code uses other CPU-intensive interrupts. In this situation, you should use the special "AAS_MultipleInterrupts" mode that has been added to the custom crt0.s included with the SDK. In this mode, a Timer 1 interrupt automatically calls AAS_FastTimer1InterruptHandler, which is a simple routine that is designed to return quickly so as not to interfere with your own code. However, unlike AAS_Timer1InterruptHandler, AAS_FastTimer1InterruptHandler does not mix the next batch of audio so a seperate call to AAS_DoWork is also required. This must be done at least 50 times per second, although it is safe to do it more often than that. Doing it at the beginning of each VBlank is ideal. This method is demonstrated in "AASExample2". The code used in this case is shown below:

+ +
+void VBlankInterruptHandler()
+{
+  AAS_DoWork();
+  
+  // Insert your own VBlank code here
+}
+
+void UnusedInterruptHandler()
+{
+};
+
+void (*AAS_IntrTable[13])(void) =
+{
+  VBlankInterruptHandler,      // VBlank Interrupt
+  UnusedInterruptHandler,      // HBlank Interrupt
+  UnusedInterruptHandler,      // V Counter Interrupt
+  UnusedInterruptHandler,      // Timer 0 Interrupt
+  UnusedInterruptHandler,      // Timer 2 Interrupt
+  UnusedInterruptHandler,      // Timer 3 Interrupt
+  UnusedInterruptHandler,      // Serial Communication Interrupt
+  UnusedInterruptHandler,      // DMA0 Interrupt
+  UnusedInterruptHandler,      // DMA1 Interrupt
+  UnusedInterruptHandler,      // DMA2 Interrupt
+  UnusedInterruptHandler,      // DMA3 Interrupt
+  UnusedInterruptHandler,      // Key Interrupt
+  UnusedInterruptHandler       // Cart Interrupt
+};
+ +

Notice that there is not a "Timer 1 Interrupt" entry in the definition of AAS_IntrTable[] as this interrupt always results in a call to AAS_FastTimer1InterruptHandler. Also note that it is necessary to initialise the VBlank interrupt so that AAS_DoWork() will be called at least 50 times per second. To achieve this, the code below needs to be included somewhere in your setup routines:

+ +
+// Define registers
+#define REG_IE (*(volatile AAS_u16 *)0x4000200)
+#define	REG_DISPSTAT (*(volatile AAS_u16*)0x04000004)
+
+// Enable VBlank interrupt
+REG_DISPSTAT |= 0x8;
+REG_IE |= 0x1;
+ +
+
:: Using AAS +
+ +

Once all the tricky stuff described above is working, actually using AAS is remarkably simple. The code from "AASExample" is shown below. The code for "AASExample2" is identical apart from the fact that it plays a different MOD and includes the VBlank initialisation code mentioned above. The code for "AASExample_c++" is also very similar except AgbMain() is declared with "extern "C"" and again a different MOD is used.

+ +
+// Registers for GBA keys
+#define	REG_KEY (*(volatile AAS_u16 *)0x04000130)
+#define REG_KEY_A 0x0001
+#define REG_KEY_B 0x0002
+
+void AgbMain() 
+{
+  int keys, keys_changed;
+  int prev_keys = 0;
+	
+  // Initialise AAS
+  AAS_SetConfig( AAS_CONFIG_MIX_32KHZ, AAS_CONFIG_CHANS_8, AAS_CONFIG_SPATIAL_STEREO, AAS_CONFIG_DYNAMIC_OFF );
+	
+  // Start playing MOD
+  AAS_MOD_Play( AAS_DATA_MOD_FlatOutLies );
+	
+  // Show AAS Logo (required for non-commercial projects)
+  AAS_ShowLogo();
+	
+  // Main loop
+  do
+  {
+    // Work out which keys have just been pressed
+    keys = ~REG_KEY;
+    keys_changed = keys ^ prev_keys;
+    prev_keys = keys;
+		
+    // Play looping ambulance sound effect out of left speaker if A button is pressed, stop when released
+    if ( keys_changed & REG_KEY_A )
+    {
+      if ( keys & REG_KEY_A )
+        AAS_SFX_Play( 0, 64, 16000, AAS_DATA_SFX_START_Ambulance, AAS_DATA_SFX_END_Ambulance, AAS_DATA_SFX_START_Ambulance );
+      else
+        AAS_SFX_Stop( 0 );
+    }
+		
+    // Play explosion sound effect out of right speaker if B button is pressed
+    if ( keys_changed & keys & REG_KEY_B )
+      AAS_SFX_Play( 1, 64, 8000, AAS_DATA_SFX_START_Boom, AAS_DATA_SFX_END_Boom, AAS_NULL );
+  }
+  while( 1 );
+}
+ +

This code initialises AAS, starts playing FlatOutLies.mod, shows the AAS logo and then goes into an infinite loop whilst the MOD continues to play. Pressing A or B starts the Ambulance.wav or Boom.raw samples. It is important that AAS_SetConfig is called before AAS_MOD_Play, although AAS_ShowLogo can be safely called at any time. For more information about how these functions work, please read the API section of this documentation.

+ +
+ + + diff --git a/lib/apex-audio-system/docs/faq.html b/lib/apex-audio-system/docs/faq.html new file mode 100644 index 0000000..5fc2e36 --- /dev/null +++ b/lib/apex-audio-system/docs/faq.html @@ -0,0 +1,70 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: How do I reference AAS sounds with numbers? +
+ +

All the sounds in your project are given a unique variable name based on their filename in the header file (AAS_Data.h) generated by Conv2AAS. In some cases you may want to use a number to refer to the data instead. To do this, create a const array that is pre-defined to list all the sounds in your project and use the array in your code instead. For example, with samples called "mysample1.wav" and "mysample2.wav":

+ +
+struct AAS_Samp
+{
+  const AAS_s8* const start;
+  const AAS_s8* const end;
+};
+
+const struct AAS_Samp AAS_samples[] =
+{
+  { AAS_DATA_SFX_START_mysample1, AAS_DATA_SFX_END_mysample1 },
+  { AAS_DATA_SFX_START_mysample2, AAS_DATA_SFX_END_mysample2 }
+};
+ +

These samples can then be referred to using numbers as follows:

+ +
+AAS_SFX_Play( 0, 64, 16000, AAS_samples[0].start, AAS_samples[0].end, AAS_NULL );
+ +

This code could easily be extended to also store loop, volume and frequency data as well.

+ +
+ + + diff --git a/lib/apex-audio-system/docs/getting_started.html b/lib/apex-audio-system/docs/getting_started.html new file mode 100644 index 0000000..92f3ba8 --- /dev/null +++ b/lib/apex-audio-system/docs/getting_started.html @@ -0,0 +1,132 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: Building AAS components +
+ +

We use a makefile in the root of the repo to build the library, conversion tool and examples. It is expected that you have a cross-compiler and a host compiler installed on your system. The paths to these need to be configured at the top of the makefile:

+
    +
  • $(CROSS): The directory path and prefix of the cross-compilation tools. For example, if you have installed devkitPro to the default location, and the tools aren't visible in your PATH, the line would be: +
      +
    • export CROSS = /opt/devkitpro/devkitARM/bin/arm-none-eabi-
    • +
    +
  • +
  • $(PREFIX): The directory path and prefix of the host compiler. This can normally be left as is, but for example it could have been installed in user/local: +
      +
    • export PREFIX = /usr/local/
    • +
    +
  • +
+ +

Run make without arguments in the root of the repo to build aas, conv2aas and the examples

. The files can be found in ‹root›/build:

+
    +
  • aas : Folder. Contents: +
      +
    • lib : Folder. Contents: +
        +
      • LibAAS.a : Main AAS Library.
      • +
      +
    • +
    • include : Folder. Contents: +
        +
      • AAS.h : Main AAS header file. Should always be included in your projects.
      • +
      • AAS_Mixer.h : Optional AAS header file. Should only be included if you intend to access the mixer directly (not recommended).
      • +
      + +
    +
  • +
  • conv2aas : Folder. Contents: +
      +
    • conv2aas
    • +
    +
  • +
  • examples : Folder. Contents: +
      +
    • AASExample.gba: AAS Example for projects with no other CPU intensive interrupts
    • +
    • AASExample2.gba: AAS Example for projects with other CPU intensive interrupts
    • +
    • AASExamplePlusPlus: AAS C++ Example for projects with no other CPU intensive interrupts
    • +
    +
  • +
+ +

To build one or more individual components, add their name as argument to the makefile:

+
    +
  • aas
  • +
  • conv2aas
  • +
  • example
  • +
  • example2
  • +
  • example_cpp
  • +
+ +
+
:: First Steps +
+ +

Once the library and conv2aas are built, the user must include the AAS header files ("AAS.h" and, optionally, "AAS_Mixer.h") and link "libAAS.a" with their project. Next, the interrupt handling routines must be set up so that a Timer 1 interrupt results in a call to AAS_Timer1InterruptHandler (or AAS_FastTimer1InterruptHandler with a seperate call to AAS_DoWork later if "AAS_MultipleInterrupts" are being used). The example code included with AAS demonstrates how to do this, and users are encouraged to reuse the code shown in their own projects.

+ +

It is also recommended that the project's makefile be modified so that Conv2AAS is automatically called when the project is compiled, and its output is assembled and linked with the main code. The makefile included with the example code shows how to do this.

+ +

It is also important that none of the following resources are used in your code as they are required by AAS: +

    +
  • DMA1 and DMA2. These are used to transfer the sound data.
  • +
  • Timer 0 and Timer 1. These are used to syncronise the sound output.
  • +
+

+ +

Also note that DMA3 can be used, but only via the AAS_DoDMA3 function call or with a single stmia instruction. Once these steps have been successfully completed AAS should be ready for use. A detailed description of AAS's API can be found here and some example code can be found here.

+ +
+
:: Things To Look Out For +
+ +

Whilst every effort has been made to make AAS as easy to use as possible, there are a few things to look out for:

+ +
    +
  • Be careful when using DMA3. AAS's mixer uses DMA3 for extra speed, which means that if you're using it in your code you must take precautions to prevent clashes. All DMA3's parameters must be written out with a single stmia instruction. The AAS_DoDMA3 function has been provided to do this for you.
  • +
  • Do not use DMA1, DMA2, Timer 0 or Timer 1. They are reserved for use by AAS.
  • +
  • Always call AAS_SetConfig before calling any other sound functions. AAS_SetConfig must be called before any other AAS function, with the exception of AAS_DoDMA3 and AAS_ShowLogo.
  • +
  • Make sure that Conv2AAS's output is assembled and linked with your project. Conv2AAS is a tool for including data files in your project so that they can be used by AAS. It produces a header file (which should be included in your project) and an assembler file (which must be assembled and linked with your project). It is important to call Conv2AAS in your makefile before any other files are compiled so that the header file it produces is up-to-date.
  • +
+ +
+ + + diff --git a/lib/apex-audio-system/docs/images/aas_logo.gif b/lib/apex-audio-system/docs/images/aas_logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..02c4a8ca7fa213a4495ebfc5157da2aac166739d GIT binary patch literal 3093 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 D!~|&t literal 0 HcmV?d00001 diff --git a/lib/apex-audio-system/docs/index.html b/lib/apex-audio-system/docs/index.html new file mode 100644 index 0000000..ba6956c --- /dev/null +++ b/lib/apex-audio-system/docs/index.html @@ -0,0 +1,149 @@ + + + +AAS Instructions + + + + + + + + +
+ + + + + +
+[Image]  + +APEX AUDIO SYSTEM
+Instruction Manual +
+
+
+
+intro | getting started | conv2aas | example | faq
+api : index | general | sfx | mod | misc | mixer +
+ +
+ +
:: What Is It? +
+ +

The Apex Audio System (AAS) is a sound library for the GBA. It includes a highly efficient mixer, MOD playing routines and support for up to 16 channels. It is designed for developers using a GCC-based development environment.

+ + + + + + + + + + + + + + + + + + +
MIXING RATE8-32 KHz, optionally dynamic.
NUMBER OF CHANNELSUp to 16.
FEATURES (PER CHANNEL)Looping, pitch and volume control.
MEMORY USAGE~3.2K IWRAM, ~3.3K EWRAM (includes code and all buffers).
+ +
+
:: History +
+ +

Apex Audio System was made by James Daniels of Apex Systems back in 2003 for his GBA game Payback. The library underwent several revisions, the latest of which was v1.11. At the beginning of 2021, James was so kind to donate the sources to the community.

+ +

The current release is v1.12.

+

Changes since v1.11:

+
    +
  • AAS is now open source under a MIT license and is hosted on Github
  • +
  • code was updated to work with current devkitPro
  • +
  • examples and code are driven by toplevel makefile
  • +
  • library and example roms are to be found under ‹root›/build
  • +
  • updated documentation
  • +
+ +
+
:: How Fast Is It? +
+ +

AAS includes easily the fastest audio system yet made for the GBA, using an average of only ~1% CPU per active channel at 32 KHz. (Most GBA mixers use at least twice as much CPU power mixing at just 16 KHz!) AAS also supports up 16 channels and a dynamic mixing rate that adjusts automatically depending on the pitch of the sounds being played.

+ +

The exact CPU usage varies depending on the configuration, but the average CPU usage for CreamOfTheEarth.mod in different situations is shown below:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mixing modeMonoStereo
32 KHz3.6%4.1%
32 KHz, dynamic3.0%3.2%
24 KHz3.2%3.5%
24 KHz, dynamic3.0%3.2%
16 KHz2.7%3.0%
16 KHz, dynamic2.7%3.0%
+ +
+
:: Licensing +
+ +

AAS is now distributed under the MIT license. For licensing terms, see the LICENSE file in the root of this repo or go to http://opensource.org/licenses/MIT

+ +

James only had one request when handing over the sources: that users of the library include a credit to Apex Designs. In essence this is now covered by the MIT license. It's up to you how you want to fill this in, but please be respectful of this requirement.

+ +
+
:: Contact +
+ +

The sources are hosted on Github: https://github.com/stuij/apex-audio-system

+ +

Pull requests are welcome, as are forks of course. If you want to report issues, open an issue on the Github project issue tracker.

+ +

For a more realtime interactive experience, join gbadev on Discord. There's a good chance there's one or two people there that have used AAS before.

+ +
+ + + diff --git a/lib/apex-audio-system/examples/AASExample/AASExample.c b/lib/apex-audio-system/examples/AASExample/AASExample.c new file mode 100644 index 0000000..5279063 --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample/AASExample.c @@ -0,0 +1,69 @@ +// AAS Example for projects with no other CPU intensive interrupts +// Notes: +// + crt0.s file included with the example should be set to use __FastInterrupts. +// + Can also be made to work with __SingleInterrupts and __MultipleInterrupts. +// + Use __AAS_MultipleInterrupts when there are other CPU intensive interrupts - see AASExample2. + +#include "AAS.h" +#include "AAS_Data.h" + +// Registers for interrupt handler +#define REG_IE (*(volatile AAS_u16 *)0x4000200) +#define REG_IF (*(volatile AAS_u16 *)0x4000202) + +void InterruptProcess() +{ + AAS_u16 intr_bits = REG_IE & REG_IF; + + // It's best to test for AAS's Timer 1 interrupt first + if ( intr_bits & 0x10 ) // Timer 1 + AAS_Timer1InterruptHandler(); + + // Process other interrupts here by testing appropriate bits of "intr_bits" + + // Clear the interrupt flags + REG_IF |= REG_IF; +} + +// Registers for GBA keys +#define REG_KEY (*(volatile AAS_u16 *)0x04000130) +#define REG_KEY_A 0x0001 +#define REG_KEY_B 0x0002 + +void AgbMain() +{ + int keys, keys_changed; + int prev_keys = 0; + + // Initialise AAS + AAS_SetConfig( AAS_CONFIG_MIX_32KHZ, AAS_CONFIG_CHANS_8, AAS_CONFIG_SPATIAL_STEREO, AAS_CONFIG_DYNAMIC_OFF ); + + // Start playing MOD + AAS_MOD_Play( AAS_DATA_MOD_FlatOutLies ); + + // Show AAS Logo (not required) + // AAS_ShowLogo(); + + // Main loop + do + { + // Work out which keys have just been pressed + keys = ~REG_KEY; + keys_changed = keys ^ prev_keys; + prev_keys = keys; + + // Play looping ambulance sound effect out of left speaker if A button is pressed, stop when released + if ( keys_changed & REG_KEY_A ) + { + if ( keys & REG_KEY_A ) + AAS_SFX_Play( 0, 64, 16000, AAS_DATA_SFX_START_Ambulance, AAS_DATA_SFX_END_Ambulance, AAS_DATA_SFX_START_Ambulance ); + else + AAS_SFX_Stop( 0 ); + } + + // Play explosion sound effect out of right speaker if B button is pressed + if ( keys_changed & keys & REG_KEY_B ) + AAS_SFX_Play( 1, 64, 8000, AAS_DATA_SFX_START_Boom, AAS_DATA_SFX_END_Boom, AAS_NULL ); + } + while( 1 ); +} diff --git a/lib/apex-audio-system/examples/AASExample/AAS_Data/Ambulance.wav b/lib/apex-audio-system/examples/AASExample/AAS_Data/Ambulance.wav new file mode 100644 index 0000000000000000000000000000000000000000..94d9d62152c8f61af4b2d40f4ca3eb55523ba03d GIT binary patch literal 15608 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 literal 0 HcmV?d00001 diff --git a/lib/apex-audio-system/examples/AASExample/AAS_Data/Boom.raw b/lib/apex-audio-system/examples/AASExample/AAS_Data/Boom.raw new file mode 100644 index 0000000000000000000000000000000000000000..753762467aab9f6802738f3f8e015d31eb93a003 GIT binary patch literal 7300 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 literal 0 HcmV?d00001 diff --git a/lib/apex-audio-system/examples/AASExample/AAS_Data/FlatOutLies.mod b/lib/apex-audio-system/examples/AASExample/AAS_Data/FlatOutLies.mod new file mode 100644 index 0000000000000000000000000000000000000000..7b06f97a855209858e1fb1e9fc3ff8a0711f7267 GIT binary patch literal 158578 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

{j_tH=+&eE$9q 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�)&Mtt+dMx%GLB5r2^}Gg_4>Et;c=BIPRs@) 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 n5pkb_i$>ROP)`G#sa`b66Z3o%3N3 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 literal 0 HcmV?d00001 diff --git a/lib/apex-audio-system/examples/AASExample/Makefile b/lib/apex-audio-system/examples/AASExample/Makefile new file mode 100644 index 0000000..01e03b4 --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample/Makefile @@ -0,0 +1,8 @@ +# AAS Example Makefile +EXAMPLE_PREFIX ?= AASExample +SHORTNAME = $(EXAMPLE_PREFIX) + +CROSS = arm-none-eabi- +LD = $(CROSS)gcc + +include ../../make/example.make diff --git a/lib/apex-audio-system/examples/AASExample/crt0.s b/lib/apex-audio-system/examples/AASExample/crt0.s new file mode 100644 index 0000000..a4a092b --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample/crt0.s @@ -0,0 +1,781 @@ +@******************************************************************** +@* crt0.S v1.26 by Jeff Frohwein * +@******************************************************************** + +@ - Modified by James Daniels/Apex Designs to give AAS interrupts higher priority in special +@ "AAS_MultipleInterrupts" mode + +@ v1.0 - Original release +@ v1.1 - Added proper .data section support +@ v1.2 - Added support for c++, overlays, interrupts, and +@ far calls (__FarFunction & __FarProcedure). +@ - Some ideas from Jason Wilkins & Mike Heckenbach. +@ v1.21- Killed the dumb test bug left in the code. +@ v1.22- Killed dumb bug "numero dos" in multiple interrupts routine. Thanks Mike H. :) +@ v1.23- Now correctly handles zero length .bss section. +@ v1.24- Loop back to start_vector now works if main {} exits. +@ v1.25- __FarProcedure now works. It was missing a .thumb_func directive. +@ v1.26- Added missing Serial Interrupt processing to __MultipleInterrupts section. +@ Added __FastInterrupt option for minimal interrupt processing. +@ Optimized __MultipleInterrupts section to save 4 bytes of stack space. +@ Added __ISRinIWRAM option that puts interrupt processing in IWRAM by default. +@ Options passed to main() or AgbMain() are now set to 0. (Thanks to DarkFader) +@ +@ This file is released into the public domain for commercial +@ or non-commercial usage with no restrictions placed upon it. + + .TEXT + +@ Comment out the next line ONLY if you plan to never support +@ multiboot mode and want to save a few bytes by removing +@ multiboot support code. Otherwise, leave it alone. It wont +@ disturb code designed to run only on flash carts. +@ +@ The normal way to enable generating code that works with +@ both multiboot and flash carts is to add the following to +@ your C code in your main project file AS A GLOBAL VARIABLE: +@ +@ #define MULTIBOOT int __gba_multiboot; +@ Then use it like this : MULTIBOOT +@ +@ IT MUST BE A GLOBAL VARIABLE OR IT WILL NOT WORK! +@ If this variable is not defined somewhere in your project +@ then code will be generated to run out of ROM instead of +@ EXRAM. The value of this variable is not important. + + .equ __MultiBootInclude, 1 + +@ If you are compiling for multiboot dedicated (will not +@ run in a cart) code then uncomment the following. Normally +@ you should leave this commented out so that a multiboot +@ image will run in a cart as well (by copying from ROM to RAM). +@ +@ This sets the maker code to "MB " which is a key that +@ some emulators look for to know to load the rom image +@ at 0x2000000 instead of the standard 0x8000000. + +@ .equ __MultibootDedicated, 1 + +@ There are two methods for clearing memory and +@ copying appropriate setup data. The fast & bulky +@ method is GBA DMA copy/clear but some emulators +@ do not accurately do DMA. If you have an inaccurate +@ emulator or want to conserve ROM space then comment +@ out the following line. There is not much advantage +@ gained by doing DMA copy/clear. + +@ .equ __DMACopyClear, 1 + +@ Uncomment the following line to support C++ development. +@ You also need to name your main C function the following: +@ int main (void) ...instead of... int AgbMain (void) +@ Doing so will cause ~5500 bytes of c++ support code to be +@ linked in with your project so do not enable c++ support +@ unless you plan to use it. + +@ .equ __CPPSupport, 1 + +@ Comment out the following line to disable interrupt support +@ in your code and to save some space in this file. + + .equ __InterruptSupport, 1 + + +@ Comment out the following line to put interrupt support in +@ ROM instead of IWRAM. Interrupt support in ROM will slow +@ down interrupt execution and has no advantage other than +@ saving a little bit of IWRAM. + + .equ __ISRinIWRAM, 1 + +@ NOTE: Only ONE of the following 3 interrupt options may be +@ uncommented. Also, __InterruptSupport above must be uncommented +@ for any of the following to have an effect. +@ +@ __FastInterrupts +@ Uncomment this line for minimal interrupt processing. +@ +@ __SingleInterrupts +@ Uncomment this line if you wish to use a table of function +@ pointers to process specific interrupts. +@ +@ __MultipleInterrupts +@ Uncomment this line to allow multiple-interrupts-at-once +@ support. If you have several interrupts where one can +@ occur while another is being serviced then you need to +@ enable this option. +@ +@ __AAS_MultipleInterrupts +@ Uncomment this line to allow multiple-interrupts-at-once +@ support, giving the AAS interrupt higher priority. If +@ you have several interrupts where one can occur while +@ another is being serviced then you need to enable this +@ option. Only for use with AAS! Added by James Daniels. + +.equ __FastInterrupts, 1 +@ .equ __SingleInterrupts, 1 +@ .equ __MultipleInterrupts, 1 +@ .equ __AAS_MultipleInterrupts, 1 + + +@ Uncomment the following line to disable sound and enter an +@ infinite loop if cart is removed during game play. You +@ must have the cart interrupt enabled for this to work and +@ __ISRinIWRAM, above, must be enabled (not commented out.) + +@ .equ __HandleCartInterrupt, 1 + +@ The following prevents IRQ stack overflow by switching to +@ System mode (User stack) when handling multiple interrupts. +@ To force use of IRQ stack only, comment out the following line. + + .equ __SwitchToUserStack, 1 + +@ !!!! NOTE: THE COPY ROUTINES IN THIS FILE WORK ON 4 BYTE +@ BOUNDARIES. YOUR LINKER SCRIPT MUST ALIGN SECTION STARTS +@ AND SECTION ENDS FOR SECTIONS THAT GET COPIED TO RAM WITH +@ ALIGN(4) !!!! + + .GLOBAL _start +_start: + .ALIGN + .CODE 32 + @ Start Vector + + b rom_header_end + + @ Nintendo Logo Character Data (8000004h) + .fill 156,1,0 + + @ Game Title (80000A0h) + .ascii "AAS Example" + .byte 0x00 + + .ifdef __MultibootDedicated + @ Game Code (80000ACh) + .ascii "MB " + .else + @ Game Code (80000ACh) + .byte 0x00,0x00,0x00,0x00 + .endif + + @ Maker Code (80000B0h) + .byte 0x30,0x31 + + @ Fixed Value (80000B2h) + .byte 0x96 + + @ Main Unit Code (80000B3h) + .byte 0x00 + + @ Device Type (80000B4h) + .byte 0x00 + + @ Unused Data (7Byte) (80000B5h) + .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00 + + @ Software Version No (80000BCh) + .byte 0x00 + + @ Complement Check (80000BDh) + .byte 0xf0 + + @ Checksum (80000BEh) + .byte 0x00,0x00 + + .ALIGN + .ARM @ ..or you can use CODE 32 here + +rom_header_end: + b start_vector @ This branch must be here for proper + @ positioning of the following header. + @ DO NOT REMOVE IT. + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ The following reserved bytes are used if the code is compiled for @ +@ multiboot mode. It does not hurt anything to leave this header in +@ even if the code is not compiled for multiboot. The GBA BIOS will +@ auto-patch the first two bytes with 0x03 and 0x01, respectively, +@ before running any code if it is executed as multiboot. +@ + +@ The following two bytes are included even for non-multiboot supporting +@ builds to guarantee that any generic library code that depends on them +@ will still be functional. + + .GLOBAL __boot_method, __slave_number + +__boot_method: + .byte 0 @ boot method (0=ROM boot, 3=Multiplay boot) +__slave_number: + .byte 0 @ slave # (1=slave#1, 2=slave#2, 3=slave#3) + + .ifdef __MultiBootInclude + + .byte 0 @ reserved + .byte 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .endif +@ @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + +@@@@@@@@@@@@@@@@@@@@@@ +@ Reset @ +@@@@@@@@@@@@@@@@@@@@@@ + + .GLOBAL start_vector + .ALIGN + .ARM @ ..or you can use CODE 32 here +start_vector: + mov r0, #0x12 @ Switch to IRQ Mode + msr cpsr, r0 + ldr sp,=__sp_irq @ Set SP_irq + mov r0, #0x1f @ Switch to System Mode + msr cpsr, r0 + ldr sp,=__sp_usr @ Set SP_usr + +@ Enter Thumb mode + adr r0,1f + 1 @ add r0,pc,#1 also works here + @ for those that want to conserve labels. + bx r0 + + .THUMB @ ..or you can use .CODE 16 here +1: + + .ifdef __InterruptSupport + ldr r1, =__intr_vector_buf @ Set Interrupt Address + ldr r0, =intr_main + str r0, [r1] + .endif + + .ifdef __MultiBootInclude + +@ *** Multiboot Copy Routine *** +@ Check the Program Counter to see if code is running +@ at 0x2000000 or 0x8000000. If it is running at 0x8000000 +@ then copy 256K bytes of it to 0x2000000 and then branch +@ to 0x2000000. +@ The reason for all this is to allow a program to be used +@ "as is" with an flash cart/emulator or with an MBV2-style +@ multiboot cable. +@ NOTE: You can also detect if this ROM is running from +@ 0x2000000 by checking the multiboot header above. + + ldr r0,=__text_start + lsl r0,#5 @ Was code compiled at 0x08000000 or higher? + bcs DoEWRAMClear @ yes, you can not run it in external WRAM + +@ Make sure we're in ExWRAM + + mov r0,pc + lsl r0,#5 @ Are we running from ROM (0x8000000 or higher) ? + bcc SkipEWRAMClear @ No, so no need to do a copy. + +@ We were started in ROM, silly emulators. :P +@ So we need to copy to ExWRAM. + + mov r3,#0x40 + lsl r3,#12 @ r3 = 0x40000 + lsl r2,r3,#7 @ r2 = 0x2000000 + mov r6,r2 @ r6 = 0x2000000 + lsl r1,r2,#2 @ r1 = 0x8000000 + + bl CopyMem + +@ Jump to the code to execute + + bx r6 + .endif + +DoEWRAMClear: +@ Clear External WRAM to 0x00 + + mov r1,#0x40 + lsl r1,#12 @ r1 = 0x40000 + lsl r0,r1,#7 @ r0 = 0x2000000 + bl ClearMem + +SkipEWRAMClear: +@ ldr r0,=AgbMain +@ bx r0 + +@ Clear Internal WRAM to 0x00 + mov r0,#3 + lsl r0,#24 @ r0 = 0x3000000 + ldr r1,=__sp_usr_offset - 16 + bl ClearMem + + .ifdef __MultiBootInclude +@ Clear BSS section to 0x00 +@ (Sometimes BSS may be in External WRAM) + ldr r0,=__bss_start + ldr r1,=__bss_end + sub r1,r0 + bl ClearMem + .endif + +@ Copy initialized data (data section) from LMA to VMA (ROM to RAM) + ldr r1,=__data_lma + ldr r2,=__data_start + ldr r4,=__data_end + bl CopyMemChk + +@ Copy internal work ram (iwram section) from LMA to VMA (ROM to RAM) + ldr r1,=__iwram_lma + ldr r2,=__iwram_start + ldr r4,=__iwram_end + bl CopyMemChk + +@ Copy internal work ram overlay 0 (iwram0 section) from LMA to VMA (ROM to RAM) + ldr r2,=__load_stop_iwram0 + ldr r1,=__load_start_iwram0 + sub r3,r2,r1 @ Is there any data to copy? + beq CIW0Skip @ no + + ldr r2,=__iwram_overlay_start + bl CopyMem +CIW0Skip: + +@ Copy external work ram (ewram section) from LMA to VMA (ROM to RAM) + ldr r1,=__ewram_lma + ldr r2,=__ewram_start + ldr r4,=__ewram_end + bl CopyMemChk + +@ Copy external work ram overlay 0 (ewram0 section) from LMA to VMA (ROM to RAM) + ldr r2,=__load_stop_ewram0 + ldr r1,=__load_start_ewram0 + sub r3,r2,r1 @ Is there any data to copy? + beq CEW0Skip @ no + + ldr r2,=__ewram_overlay_start + bl CopyMem +CEW0Skip: + +@ Jump to user code + + mov r0,#0 @ int argc + mov r1,#0 @ char *argv[] + + ldr r3,=start_vector + mov lr,r3 @ Set start_vector as return address + +.ifdef __CPPSupport + ldr r3,=main +.else + ldr r3,=AgbMain +.endif + bx r3 + + + .GLOBAL __FarFunction,__FarProcedure + .THUMB_FUNC +__FarFunction: + .THUMB_FUNC +__FarProcedure: + bx r0 + nop + nop @ This nop is here to allow unmapped memory to be used as + @ as a delay of almost 1 sec with a 1 cycle resolution. + @ Read this for technical info: + @ http://www.devrs.com/gba/files/gbadevfaqs.php#RepeatUses + +@ Clear memory to 0x00 if length != 0 +@ r0 = Start Address +@ r1 = Length + +ClearMem: + cmp r1,#0 @ Is length zero? + beq ClearMX @ yes, exit + +.ifdef __DMACopyClear + ldr r2,reg_base + lsr r1,#2 @ r1 = (length/4) & 0xffff + + adr r3,fill_val + str r3,[r2,#0x4] @ Set source address (fill value) + str r0,[r2,#0x8] @ Set destination address (fill dest address) + strh r1,[r2,#0xc] @ Set DMA length + ldr r1,=0x8500 @ dma_clrb + strh r1,[r2,#0xe] @ Start DMA +.else + mov r2,#0 +ClrLoop: + stmia r0!,{r2} + sub r1,#4 + bne ClrLoop +.endif +ClearMX: + bx lr + +@ Copy memory if length != 0 +@ r1 = Source Address +@ r2 = Dest Address +@ r4 = Dest Address + Length + +CopyMemChk: + sub r3,r4,r2 @ Is there any data to copy? + beq CIDExit @ no + +@ Copy memory +@ r1 = Source Address +@ r2 = Dest Address +@ r3 = Length + +CopyMem: +.ifdef __DMACopyClear + ldr r0,reg_base + lsr r3,#2 @ r3 = (length/4) & 0xffff + + str r1,[r0,#0x4] @ Set source address + str r2,[r0,#0x8] @ Set destination address + strh r3,[r0,#0xc] @ Set DMA length + ldr r3,=0x8400 @ dma_copy + strh r3,[r0,#0xe] @ Start DMA +.else +CIDLoop: + ldmia r1!,{r0} + stmia r2!,{r0} + sub r3,#4 + bne CIDLoop +.endif +CIDExit: +If_Undefined_Reference__rename_main_or_AgbMain_to_each_other_in_your_C_file: + bx lr + + .ALIGN + +.ifdef __DMACopyClear +fill_val: .word 0 +reg_base: .word 0x040000d0 +.endif + + .ALIGN + .POOL + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Interrupt Processing @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .ifdef __ISRinIWRAM + .SECTION .iwram + .endif + + .EXTERN IntrTable + .EXTERN InterruptProcess + .GLOBAL intr_main + .ALIGN + .ARM + +@ NOTE: Ifyou copy the following code (start: intr_main - +@ end: intr_main_end) to internal WRAM then do not forget +@ to copy everything between these two labels. The .POOL +@ data must be copied since it is used by intr_main. + +@ NOTE2: If __ISRinIWRAM is defined then the copy to +@ IWRAM is done automatically for you. + + .ifdef __InterruptSupport + + .ifdef __FastInterrupts +intr_main: + ldr r0,=InterruptProcess + bx r0 + .endif + + .ifdef __SingleInterrupts +intr_main: + @ Single interrupts support + mov r3, #0x4000000 @ REG_BASE + ldr r2, [r3,#0x200]! @ Read REG_IE + and r1, r2, r2, lsr #16 @ r1 = IE & IF + ldr r2, =IntrTable + + ands r0, r1, #1 @ V-Blank Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #2 @ H-Blank Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #4 @ V Counter Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #8 @ Timer 0 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x10 @ Timer 1 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x20 @ Timer 2 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x40 @ Timer 3 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x80 @ Serial Communication Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x100 @ DMA0 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x200 @ DMA1 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x400 @ DMA2 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x800 @ DMA3 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x1000 @ Key Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x2000 @ Cart Interrupt + + .ifdef __HandleCartInterrupt + strneb r0, [r3, #0x84 - 0x200] @ Stop sound if cart removed (REG_SOUNDCNT_X) +loop: bne loop @ Infinite loop if cart removed + .endif + +jump_intr: + strh r0, [r3, #2] @ IF Clear + ldr r0, [r2] @ Jump to user IRQ process + bx r0 + .endif + + .ifdef __MultipleInterrupts +intr_main: + @ Multiple interrupts support + mov r2, #0x4000000 @ REG_BASE + ldr r3, [r2,#0x200]! @ r2 = IE : r3 = IF|IE + ldrh r1, [r2, #0x8] @ r1 = IME + mrs r0, spsr + stmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} // IF|IE + + mov r0, #1 @ IME = 1 (To permit multiple interrupts if + @ an interrupt occurs) + strh r0, [r2, #0x8] + and r1, r3, r3, lsr #16 @ r1 = IE & IF + ldr r12, =IntrTable + + ands r0, r1, #1 @ V-blank interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #2 @ H-blank interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #4 @ V-counter interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #8 @ Timer 0 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x10 @ Timer 1 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x20 @ Timer 2 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x40 @ Timer 3 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x80 @ Serial Communication Interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x100 @ DMA 0 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x200 @ DMA 1 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x400 @ DMA 2 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x800 @ DMA 3 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x1000 @ Key interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x2000 @ Cart interrupt + + .ifdef __HandleCartInterrupt + strneb r0, [r2, #0x84 - 0x200] @ Stop sound if cart removed (REG_SOUNDCNT_X) +loop: bne loop @ Infinite loop if cart removed + .endif + +jump_intr: + strh r0, [r2, #2] @ Clear IF + +@ Enable multiple interrupts & switch to system +@ mode if __SwitchToUserStack is defined. + + mrs r3, cpsr + .ifdef __SwitchToUserStack + bic r3, r3, #0xdf @ \__ + orr r3, r3, #0x1f @ / --> Enable IRQ & FIQ. Set CPU mode to System. + .else + bic r3, r3, #0xc0 @ Enable IRQ & FIQ + .endif + msr cpsr, r3 + + ldr r0, [r12] + + stmfd sp!, {lr} + adr lr, IntrRet + bx r0 +IntrRet: + ldmfd sp!, {lr} + +@ Disable multiple interrupts & switch to IRQ Mode +@ if __SwitchToUserStack is defined. + + mrs r3, cpsr + .ifdef __SwitchToUserStack + bic r3, r3, #0xdf @ \__ + orr r3, r3, #0x92 @ / --> Disable IRQ. Enable FIQ. Set CPU mode to IRQ. + .else + orr r3, r3, #0x80 @ Disable IRQ. + .endif + msr cpsr, r3 + + ldmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} //IF|IE +@ strh r3, [r2] @ set IE + strh r1, [r2, #0x8] @ restore REG_IME + msr spsr, r0 @ restore spsr + bx lr + + .endif + + .ifdef __AAS_MultipleInterrupts +intr_main: + @ Multiple interrupts support + mov r2, #0x4000000 @ REG_BASE + ldr r3, [r2,#0x200]! @ r2 = IE : r3 = IF|IE + ldrh r1, [r2, #0x8] @ r1 = IME + mrs r0, spsr + stmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} // IF|IE + + and r1, r3, r3, lsr #16 @ r1 = IE & IF + + ands r0, r1, #0x10 @ Timer 1 interrupt + bne jump_intr_AAS + + mov r0, #1 @ IME = 1 (To permit multiple interrupts if + @ an interrupt occurs) + strh r0, [r2, #0x8] + +AAS_intr_start: + ands r0, r1, #1 @ V-blank interrupt + blne jump_intr + ands r0, r1, #2 @ H-blank interrupt + blne jump_intr + ands r0, r1, #4 @ V-counter interrupt + blne jump_intr + ands r0, r1, #8 @ Timer 0 interrupt + blne jump_intr + ands r0, r1, #0x20 @ Timer 2 interrupt + blne jump_intr + ands r0, r1, #0x40 @ Timer 3 interrupt + blne jump_intr + ands r0, r1, #0x80 @ Serial Communication Interrupt + blne jump_intr + ands r0, r1, #0x100 @ DMA 0 interrupt + blne jump_intr + ands r0, r1, #0x200 @ DMA 1 interrupt + blne jump_intr + ands r0, r1, #0x400 @ DMA 2 interrupt + blne jump_intr + ands r0, r1, #0x800 @ DMA 3 interrupt + blne jump_intr + ands r0, r1, #0x1000 @ Key interrupt + blne jump_intr + ands r0, r1, #0x2000 @ Cart interrupt + + .ifdef __HandleCartInterrupt + strneb r0, [r2, #0x84 - 0x200] @ Stop sound if cart removed (REG_SOUNDCNT_X) +loop: bne loop @ Infinite loop if cart removed + .endif + +jump_intr: + strh r0, [r2, #2] @ Clear IF + +@ Enable multiple interrupts & switch to system +@ mode if __SwitchToUserStack is defined. + + ldr r12, =AAS_IntrTable + adr r0, AAS_intr_start+8 + sub r14, r14, r0 + mov r14, r14, lsr #3 + ldr r0, [r12, r14, lsl #2] + + mrs r3, cpsr + bic r3, r3, #0xc0 @ Enable IRQ & FIQ + .ifdef __SwitchToUserStack + orr r3, r3, #0x1f @ Set CPU mode to System. + .endif + msr cpsr, r3 + + stmfd sp!, {lr} + adr lr, IntrRet + bx r0 + +IntrRet: + ldmfd sp!, {lr} + +@ Disable multiple interrupts & switch to IRQ Mode +@ if __SwitchToUserStack is defined. + + mrs r3, cpsr + .ifdef __SwitchToUserStack + bic r3, r3, #0xdf @ \__ + orr r3, r3, #0x92 @ / --> Disable IRQ. Enable FIQ. Set CPU mode to IRQ. + .else + orr r3, r3, #0x80 @ Disable IRQ. + .endif + msr cpsr, r3 + + ldmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} //IF|IE + strh r1, [r2, #0x8] @ restore REG_IME + msr spsr, r0 @ restore spsr + bx lr + +jump_intr_AAS: + strh r0, [r2, #2] @ Clear IF + +@ Switch to system mode if __SwitchToUserStack is defined. + + .ifdef __SwitchToUserStack + mrs r3, cpsr + orr r3, r3, #0x1f @ Set CPU mode to System. + msr cpsr, r3 + .endif + + ldr r0, =AAS_FastTimer1InterruptHandler + + stmfd sp!, {lr} + adr lr, IntrRet + bx r0 + + .endif + + .ALIGN + .POOL @ If you copy the intr_main routine, above, to internal + @ RAM then copy the pool data as well because IntrTable + @ address is stored here. Use intr_main_end as last address+1. +intr_main_end: + .endif + + .ALIGN + .POOL + + + .END + + diff --git a/lib/apex-audio-system/examples/AASExample/lnkscript b/lib/apex-audio-system/examples/AASExample/lnkscript new file mode 100644 index 0000000..30cb9c0 --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample/lnkscript @@ -0,0 +1,297 @@ +/* Linker Script v1.3 by Jeff Frohwein */ +/* v1.0 - Original release */ +/* v1.1 - Added proper .data section support */ +/* v1.2 - Added support for c++ & iwram overlays */ +/* - Major contributions by Jason Wilkins. */ +/* v1.3 - .ewram section now can be used when */ +/* compiling for MULTIBOOT mode. This fixes */ +/* malloc() in DevKitAdvance which depends */ +/* on __eheap_start instead of end to define*/ +/* the starting location of heap space. */ +/* External global variable __gba_iwram_heap*/ +/* support added to allow labels end, _end, */ +/* & __end__ to point to end of iwram or */ +/* the end of ewram. */ + +/* This file is released into the public domain */ +/* for commercial or non-commercial use with no */ +/* restrictions placed upon it. */ + +/* NOTE!!!: This linker script defines the RAM & */ +/* ROM start addresses. In order for it to work */ +/* properly, remove -Ttext and -Tbss linker */ +/* options from your makefile if they are */ +/* present. */ + +/* You can use the following to view section */ +/* addresses in your .elf file: */ +/* objdump -h file.elf */ +/* Please note that empty sections may incorrectly*/ +/* list the lma address as the vma address for */ +/* some versions of objdump. */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_start) +/* SEARCH_DIR(/bin/arm); */ + +/* By default this linker script will generate code */ +/* for flash carts located at 0x8000000. In order to */ +/* generate code that is compiled at 0x2000000 that */ +/* will run on flash carts or in multiboot mode then */ +/* you need to add the following variable to your main */ +/* project file. It's value is NOT important but */ +/* IT MUST BE A GLOBAL VARIABLE OR IT WILL NOT WORK: */ + +/* #define MULTIBOOT int __gba_multiboot; */ +/* Then use it like this: MULTIBOOT */ + +/* By default this linker script will set the labels */ +/* end, _end, & __end__ at the end of ewram. To force */ +/* them to be set to the end of iwram then you need to */ +/* add the following variable to your main */ +/* project file. It's value is NOT important but */ +/* IT MUST BE A GLOBAL VARIABLE OR IT WILL NOT WORK: */ + +/* #define IWRAMHEAP int __gba_iwram_heap; */ +/* Then use it like this: IWRAMHEAP */ + +/* The linker script function "var1 += var2;" sometimes */ +/* reports incorrect values in the *.map file but the */ +/* actual value it calculates is usually, if not always, */ +/* correct. If you leave out the ". = ALIGN(4);" at the */ +/* end of each section then the return value of SIZEOF() */ +/* is sometimes incorrect and "var1 += var2;" appears to */ +/* not work as well. "var1 += var2" style functions are */ +/* avoided below as a result. */ + +/* The linker script MEMORY directive is not used here due */ +/* to the fact that __text_start is not always a fixed value. */ + +__text_start = DEFINED (__gba_multiboot) ? 0x2000000 : 0x8000000; +/* __ewram_start = 0x2000000; */ /* Removed in v1.3 */ +__eheap_end = 0x2040000; +__iwram_start = 0x3000000; +__iheap_end = 0x3008000 - 0x400; +__sp_usr = 0x3008000 - 0x100; +__sp_irq = 0x3008000 - 0x60; +__intr_vector_buf = 0x3008000 - 4; +__sp_usr_offset = __sp_usr - __iwram_start; +__intr_vect_offset = __intr_vector_buf - __sp_usr; + +SECTIONS +{ + .text __text_start : /* ALIGN (4): */ + { + *(EXCLUDE_FILE (*text.iwram*) .text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7) + *(.glue_7t) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr = ADDR(.text) + SIZEOF(.text); */ + __text_end = .; + + .rodata : + { + *(.rodata) + *all.rodata*(*) + *(.roda) + *(.rodata.*) + *(.gnu.linkonce.r*) + SORT(CONSTRUCTORS) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr += SIZEOF(.rodata); */ + + .ctors : + { + /* gcc uses crtbegin.o to find the start of the constructors, so + we make sure it is first. Because this is a wildcard, it + doesn't matter if the user does not actually link against + crtbegin.o; the linker won't look for a file to match a + wildcard. The wildcard also means that it doesn't matter which + directory crtbegin.o is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0 +/* laddr += SIZEOF(.ctors); */ + laddr = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors); + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0 +/* laddr += SIZEOF(.dtors); */ + laddr = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors); + + .eh_frame : + { + KEEP (*(.eh_frame)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0 +/* laddr += SIZEOF(.eh_frame); */ + + .gcc_except_table : + { + *(.gcc_except_table) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0 +/* laddr += (SIZEOF(.gcc_except_table) + 3) & ~ 3; */ +/* __iwram_lma = laddr; */ + __iwram_lma = (ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + 3) & ~ 3; + + .iwram __iwram_start : AT (__iwram_lma) + { + __iwram_start = ABSOLUTE(.) ; + *(.iwram) + *iwram.*(.text) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr += SIZEOF(.iwram); */ +/* __data_lma = laddr; */ + __data_lma = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + SIZEOF(.iwram); + + __iwram_end = . ; + + .bss ALIGN(4) : + { + __bss_start = ABSOLUTE(.); + __bss_start__ = ABSOLUTE(.); + *(.dynbss) + *(.gnu.linkonce.b*) + *(COMMON) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } + + __bss_end = . ; + __bss_end__ = . ; + + .data ALIGN(4) : AT (__data_lma) + { + __data_start = ABSOLUTE(.); + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + CONSTRUCTORS + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr += SIZEOF(.data); */ +/* __iwram_overlay_lma = laddr; */ + __iwram_overlay_lma = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + SIZEOF(.iwram) + SIZEOF(.data); + + __data_end = .; + PROVIDE (edata = .); +/* __data_lma = LOADADDR(.data); */ + __iwram_overlay_start = . ; + + OVERLAY : NOCROSSREFS AT (__iwram_overlay_lma) + { + .iwram0 { *(.iwram0) . = ALIGN(4);} + .iwram1 { *(.iwram1) . = ALIGN(4);} + .iwram2 { *(.iwram2) . = ALIGN(4);} + .iwram3 { *(.iwram3) . = ALIGN(4);} + .iwram4 { *(.iwram4) . = ALIGN(4);} + .iwram5 { *(.iwram5) . = ALIGN(4);} + .iwram6 { *(.iwram6) . = ALIGN(4);} + .iwram7 { *(.iwram7) . = ALIGN(4);} + .iwram8 { *(.iwram8) . = ALIGN(4);} + .iwram9 { *(.iwram9) . = ALIGN(4);} + } = 0xff +/* laddr += (SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9)); */ +/* __ewram_lma = laddr; */ + __ewram_lma = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + SIZEOF(.iwram) + SIZEOF(.data) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9); + +/* __iwram_overlay_lma = LOADADDR (.iwram0); */ + __iwram_overlay_end = . ; +/* _end = . ; */ +/* __end__ = . ; */ +/* PROVIDE (end = .); */ + __iheap_start = . ; + + /* v1.3 */ + __ewram_start = DEFINED (__gba_multiboot) ? __ewram_lma : 0x2000000; + + .ewram __ewram_start : AT (__ewram_lma) + { +/* __ewram_start = ABSOLUTE(.); */ + *(.ewram) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr += SIZEOF(.ewram); */ +/* __ewram_overlay_lma = laddr; */ + __ewram_overlay_lma = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + SIZEOF(.iwram) + SIZEOF(.data) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9) + SIZEOF(.ewram); + +/* __ewram_lma = LOADADDR(.ewram); */ + __ewram_end = . ; + __ewram_overlay_start = . ; + + OVERLAY ALIGN(4): NOCROSSREFS AT (__ewram_overlay_lma) + { + .ewram0 { *(.ewram0) . = ALIGN(4);} + .ewram1 { *(.ewram1) . = ALIGN(4);} + .ewram2 { *(.ewram2) . = ALIGN(4);} + .ewram3 { *(.ewram3) . = ALIGN(4);} + .ewram4 { *(.ewram4) . = ALIGN(4);} + .ewram5 { *(.ewram5) . = ALIGN(4);} + .ewram6 { *(.ewram6) . = ALIGN(4);} + .ewram7 { *(.ewram7) . = ALIGN(4);} + .ewram8 { *(.ewram8) . = ALIGN(4);} + .ewram9 { *(.ewram9) . = ALIGN(4);} + } = 0xff + + __ewram_overlay_end = . ; + + __eheap_start = . ; + + _end = DEFINED (__gba_iwram_heap) ? __iheap_start : .; /* v1.3 */ + __end__ = _end ; /* v1.3 */ + PROVIDE (end = _end); /* v1.3 */ + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .stack 0x80000 : { _stack = .; *(.stack) } + /* These must appear regardless of . */ +} diff --git a/lib/apex-audio-system/examples/AASExample2/AASExample.c b/lib/apex-audio-system/examples/AASExample2/AASExample.c new file mode 100644 index 0000000..747ff99 --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample2/AASExample.c @@ -0,0 +1,87 @@ +// AAS Example for projects with other CPU intensive interrupts +// Notes: +// + Specially modified crt0.s file included with the example must be set to use __AAS_MultipleInterrupts +// + AAS_DoWork() must be called at least 50 times/sec. In this example, it's being called during VBlank. + +#include "AAS.h" +#include "AAS_Data.h" + +// Registers for interrupt handler +#define REG_IE (*(volatile AAS_u16 *)0x4000200) +#define REG_IME (*(volatile AAS_u16 *)0x4000208) +#define REG_DISPSTAT (*(volatile AAS_u16*)0x04000004) + +void VBlankInterruptHandler() +{ + AAS_DoWork(); + + // Insert your own VBlank code here +} + +void UnusedInterruptHandler() +{ +}; + +void (*AAS_IntrTable[13])(void) = +{ + VBlankInterruptHandler, // VBlank Interrupt + UnusedInterruptHandler, // HBlank Interrupt + UnusedInterruptHandler, // V Counter Interrupt + UnusedInterruptHandler, // Timer 0 Interrupt + UnusedInterruptHandler, // Timer 2 Interrupt + UnusedInterruptHandler, // Timer 3 Interrupt + UnusedInterruptHandler, // Serial Communication Interrupt + UnusedInterruptHandler, // DMA0 Interrupt + UnusedInterruptHandler, // DMA1 Interrupt + UnusedInterruptHandler, // DMA2 Interrupt + UnusedInterruptHandler, // DMA3 Interrupt + UnusedInterruptHandler, // Key Interrupt + UnusedInterruptHandler // Cart Interrupt +}; + +// Registers for GBA keys +#define REG_KEY (*(volatile AAS_u16 *)0x04000130) +#define REG_KEY_A 0x0001 +#define REG_KEY_B 0x0002 + +void AgbMain() +{ + int keys, keys_changed; + int prev_keys = 0; + + // Enable vblank interrupt + REG_DISPSTAT |= 0x8; + REG_IE |= 0x1; + + // Initialise AAS + AAS_SetConfig( AAS_CONFIG_MIX_32KHZ, AAS_CONFIG_CHANS_8, AAS_CONFIG_SPATIAL_STEREO, AAS_CONFIG_DYNAMIC_OFF ); + + // Start playing MOD + AAS_MOD_Play( AAS_DATA_MOD_CreamOfTheEarth ); + + // Show AAS Logo (not required) + AAS_ShowLogo(); + + // Main loop + do + { + // Work out which keys have just been pressed + keys = ~REG_KEY; + keys_changed = keys ^ prev_keys; + prev_keys = keys; + + // Play looping ambulance sound effect out of left speaker if A button is pressed, stop when released + if ( keys_changed & REG_KEY_A ) + { + if ( keys & REG_KEY_A ) + AAS_SFX_Play( 0, 64, 16000, AAS_DATA_SFX_START_Ambulance, AAS_DATA_SFX_END_Ambulance, AAS_DATA_SFX_START_Ambulance ); + else + AAS_SFX_Stop( 0 ); + } + + // Play explosion sound effect out of right speaker if B button is pressed + if ( keys_changed & keys & REG_KEY_B ) + AAS_SFX_Play( 1, 64, 8000, AAS_DATA_SFX_START_Boom, AAS_DATA_SFX_END_Boom, AAS_NULL ); + } + while( 1 ); +} diff --git a/lib/apex-audio-system/examples/AASExample2/AAS_Data/Ambulance.wav b/lib/apex-audio-system/examples/AASExample2/AAS_Data/Ambulance.wav new file mode 100644 index 0000000000000000000000000000000000000000..94d9d62152c8f61af4b2d40f4ca3eb55523ba03d GIT binary patch literal 15608 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 literal 0 HcmV?d00001 diff --git a/lib/apex-audio-system/examples/AASExample2/AAS_Data/Boom.raw b/lib/apex-audio-system/examples/AASExample2/AAS_Data/Boom.raw new file mode 100644 index 0000000000000000000000000000000000000000..753762467aab9f6802738f3f8e015d31eb93a003 GIT binary patch literal 7300 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 literal 0 HcmV?d00001 diff --git a/lib/apex-audio-system/examples/AASExample2/AAS_Data/CreamOfTheEarth.mod b/lib/apex-audio-system/examples/AASExample2/AAS_Data/CreamOfTheEarth.mod new file mode 100644 index 0000000000000000000000000000000000000000..13cbe1a52834c36ca0a200440fd9baf6a7563a10 GIT binary patch literal 130382 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 Enable IRQ & FIQ. Set CPU mode to System. + .else + bic r3, r3, #0xc0 @ Enable IRQ & FIQ + .endif + msr cpsr, r3 + + ldr r0, [r12] + + stmfd sp!, {lr} + adr lr, IntrRet + bx r0 +IntrRet: + ldmfd sp!, {lr} + +@ Disable multiple interrupts & switch to IRQ Mode +@ if __SwitchToUserStack is defined. + + mrs r3, cpsr + .ifdef __SwitchToUserStack + bic r3, r3, #0xdf @ \__ + orr r3, r3, #0x92 @ / --> Disable IRQ. Enable FIQ. Set CPU mode to IRQ. + .else + orr r3, r3, #0x80 @ Disable IRQ. + .endif + msr cpsr, r3 + + ldmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} //IF|IE +@ strh r3, [r2] @ set IE + strh r1, [r2, #0x8] @ restore REG_IME + msr spsr, r0 @ restore spsr + bx lr + + .endif + + .ifdef __AAS_MultipleInterrupts +intr_main: + @ Multiple interrupts support + mov r2, #0x4000000 @ REG_BASE + ldr r3, [r2,#0x200]! @ r2 = IE : r3 = IF|IE + ldrh r1, [r2, #0x8] @ r1 = IME + mrs r0, spsr + stmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} // IF|IE + + and r1, r3, r3, lsr #16 @ r1 = IE & IF + + ands r0, r1, #0x10 @ Timer 1 interrupt + bne jump_intr_AAS + + mov r0, #1 @ IME = 1 (To permit multiple interrupts if + @ an interrupt occurs) + strh r0, [r2, #0x8] + +AAS_intr_start: + ands r0, r1, #1 @ V-blank interrupt + blne jump_intr + ands r0, r1, #2 @ H-blank interrupt + blne jump_intr + ands r0, r1, #4 @ V-counter interrupt + blne jump_intr + ands r0, r1, #8 @ Timer 0 interrupt + blne jump_intr + ands r0, r1, #0x20 @ Timer 2 interrupt + blne jump_intr + ands r0, r1, #0x40 @ Timer 3 interrupt + blne jump_intr + ands r0, r1, #0x80 @ Serial Communication Interrupt + blne jump_intr + ands r0, r1, #0x100 @ DMA 0 interrupt + blne jump_intr + ands r0, r1, #0x200 @ DMA 1 interrupt + blne jump_intr + ands r0, r1, #0x400 @ DMA 2 interrupt + blne jump_intr + ands r0, r1, #0x800 @ DMA 3 interrupt + blne jump_intr + ands r0, r1, #0x1000 @ Key interrupt + blne jump_intr + ands r0, r1, #0x2000 @ Cart interrupt + + .ifdef __HandleCartInterrupt + strneb r0, [r2, #0x84 - 0x200] @ Stop sound if cart removed (REG_SOUNDCNT_X) +loop: bne loop @ Infinite loop if cart removed + .endif + +jump_intr: + strh r0, [r2, #2] @ Clear IF + +@ Enable multiple interrupts & switch to system +@ mode if __SwitchToUserStack is defined. + + ldr r12, =AAS_IntrTable + adr r0, AAS_intr_start+8 + sub r14, r14, r0 + mov r14, r14, lsr #3 + ldr r0, [r12, r14, lsl #2] + + mrs r3, cpsr + bic r3, r3, #0xc0 @ Enable IRQ & FIQ + .ifdef __SwitchToUserStack + orr r3, r3, #0x1f @ Set CPU mode to System. + .endif + msr cpsr, r3 + + stmfd sp!, {lr} + adr lr, IntrRet + bx r0 + +IntrRet: + ldmfd sp!, {lr} + +@ Disable multiple interrupts & switch to IRQ Mode +@ if __SwitchToUserStack is defined. + + mrs r3, cpsr + .ifdef __SwitchToUserStack + bic r3, r3, #0xdf @ \__ + orr r3, r3, #0x92 @ / --> Disable IRQ. Enable FIQ. Set CPU mode to IRQ. + .else + orr r3, r3, #0x80 @ Disable IRQ. + .endif + msr cpsr, r3 + + ldmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} //IF|IE + strh r1, [r2, #0x8] @ restore REG_IME + msr spsr, r0 @ restore spsr + bx lr + +jump_intr_AAS: + strh r0, [r2, #2] @ Clear IF + +@ Switch to system mode if __SwitchToUserStack is defined. + + .ifdef __SwitchToUserStack + mrs r3, cpsr + orr r3, r3, #0x1f @ Set CPU mode to System. + msr cpsr, r3 + .endif + + ldr r0, =AAS_FastTimer1InterruptHandler + + stmfd sp!, {lr} + adr lr, IntrRet + bx r0 + + .endif + + .ALIGN + .POOL @ If you copy the intr_main routine, above, to internal + @ RAM then copy the pool data as well because IntrTable + @ address is stored here. Use intr_main_end as last address+1. +intr_main_end: + .endif + + .ALIGN + .POOL + + + .END + + diff --git a/lib/apex-audio-system/examples/AASExample2/lnkscript b/lib/apex-audio-system/examples/AASExample2/lnkscript new file mode 100644 index 0000000..30cb9c0 --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample2/lnkscript @@ -0,0 +1,297 @@ +/* Linker Script v1.3 by Jeff Frohwein */ +/* v1.0 - Original release */ +/* v1.1 - Added proper .data section support */ +/* v1.2 - Added support for c++ & iwram overlays */ +/* - Major contributions by Jason Wilkins. */ +/* v1.3 - .ewram section now can be used when */ +/* compiling for MULTIBOOT mode. This fixes */ +/* malloc() in DevKitAdvance which depends */ +/* on __eheap_start instead of end to define*/ +/* the starting location of heap space. */ +/* External global variable __gba_iwram_heap*/ +/* support added to allow labels end, _end, */ +/* & __end__ to point to end of iwram or */ +/* the end of ewram. */ + +/* This file is released into the public domain */ +/* for commercial or non-commercial use with no */ +/* restrictions placed upon it. */ + +/* NOTE!!!: This linker script defines the RAM & */ +/* ROM start addresses. In order for it to work */ +/* properly, remove -Ttext and -Tbss linker */ +/* options from your makefile if they are */ +/* present. */ + +/* You can use the following to view section */ +/* addresses in your .elf file: */ +/* objdump -h file.elf */ +/* Please note that empty sections may incorrectly*/ +/* list the lma address as the vma address for */ +/* some versions of objdump. */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_start) +/* SEARCH_DIR(/bin/arm); */ + +/* By default this linker script will generate code */ +/* for flash carts located at 0x8000000. In order to */ +/* generate code that is compiled at 0x2000000 that */ +/* will run on flash carts or in multiboot mode then */ +/* you need to add the following variable to your main */ +/* project file. It's value is NOT important but */ +/* IT MUST BE A GLOBAL VARIABLE OR IT WILL NOT WORK: */ + +/* #define MULTIBOOT int __gba_multiboot; */ +/* Then use it like this: MULTIBOOT */ + +/* By default this linker script will set the labels */ +/* end, _end, & __end__ at the end of ewram. To force */ +/* them to be set to the end of iwram then you need to */ +/* add the following variable to your main */ +/* project file. It's value is NOT important but */ +/* IT MUST BE A GLOBAL VARIABLE OR IT WILL NOT WORK: */ + +/* #define IWRAMHEAP int __gba_iwram_heap; */ +/* Then use it like this: IWRAMHEAP */ + +/* The linker script function "var1 += var2;" sometimes */ +/* reports incorrect values in the *.map file but the */ +/* actual value it calculates is usually, if not always, */ +/* correct. If you leave out the ". = ALIGN(4);" at the */ +/* end of each section then the return value of SIZEOF() */ +/* is sometimes incorrect and "var1 += var2;" appears to */ +/* not work as well. "var1 += var2" style functions are */ +/* avoided below as a result. */ + +/* The linker script MEMORY directive is not used here due */ +/* to the fact that __text_start is not always a fixed value. */ + +__text_start = DEFINED (__gba_multiboot) ? 0x2000000 : 0x8000000; +/* __ewram_start = 0x2000000; */ /* Removed in v1.3 */ +__eheap_end = 0x2040000; +__iwram_start = 0x3000000; +__iheap_end = 0x3008000 - 0x400; +__sp_usr = 0x3008000 - 0x100; +__sp_irq = 0x3008000 - 0x60; +__intr_vector_buf = 0x3008000 - 4; +__sp_usr_offset = __sp_usr - __iwram_start; +__intr_vect_offset = __intr_vector_buf - __sp_usr; + +SECTIONS +{ + .text __text_start : /* ALIGN (4): */ + { + *(EXCLUDE_FILE (*text.iwram*) .text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7) + *(.glue_7t) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr = ADDR(.text) + SIZEOF(.text); */ + __text_end = .; + + .rodata : + { + *(.rodata) + *all.rodata*(*) + *(.roda) + *(.rodata.*) + *(.gnu.linkonce.r*) + SORT(CONSTRUCTORS) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr += SIZEOF(.rodata); */ + + .ctors : + { + /* gcc uses crtbegin.o to find the start of the constructors, so + we make sure it is first. Because this is a wildcard, it + doesn't matter if the user does not actually link against + crtbegin.o; the linker won't look for a file to match a + wildcard. The wildcard also means that it doesn't matter which + directory crtbegin.o is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0 +/* laddr += SIZEOF(.ctors); */ + laddr = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors); + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0 +/* laddr += SIZEOF(.dtors); */ + laddr = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors); + + .eh_frame : + { + KEEP (*(.eh_frame)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0 +/* laddr += SIZEOF(.eh_frame); */ + + .gcc_except_table : + { + *(.gcc_except_table) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0 +/* laddr += (SIZEOF(.gcc_except_table) + 3) & ~ 3; */ +/* __iwram_lma = laddr; */ + __iwram_lma = (ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + 3) & ~ 3; + + .iwram __iwram_start : AT (__iwram_lma) + { + __iwram_start = ABSOLUTE(.) ; + *(.iwram) + *iwram.*(.text) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr += SIZEOF(.iwram); */ +/* __data_lma = laddr; */ + __data_lma = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + SIZEOF(.iwram); + + __iwram_end = . ; + + .bss ALIGN(4) : + { + __bss_start = ABSOLUTE(.); + __bss_start__ = ABSOLUTE(.); + *(.dynbss) + *(.gnu.linkonce.b*) + *(COMMON) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } + + __bss_end = . ; + __bss_end__ = . ; + + .data ALIGN(4) : AT (__data_lma) + { + __data_start = ABSOLUTE(.); + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + CONSTRUCTORS + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr += SIZEOF(.data); */ +/* __iwram_overlay_lma = laddr; */ + __iwram_overlay_lma = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + SIZEOF(.iwram) + SIZEOF(.data); + + __data_end = .; + PROVIDE (edata = .); +/* __data_lma = LOADADDR(.data); */ + __iwram_overlay_start = . ; + + OVERLAY : NOCROSSREFS AT (__iwram_overlay_lma) + { + .iwram0 { *(.iwram0) . = ALIGN(4);} + .iwram1 { *(.iwram1) . = ALIGN(4);} + .iwram2 { *(.iwram2) . = ALIGN(4);} + .iwram3 { *(.iwram3) . = ALIGN(4);} + .iwram4 { *(.iwram4) . = ALIGN(4);} + .iwram5 { *(.iwram5) . = ALIGN(4);} + .iwram6 { *(.iwram6) . = ALIGN(4);} + .iwram7 { *(.iwram7) . = ALIGN(4);} + .iwram8 { *(.iwram8) . = ALIGN(4);} + .iwram9 { *(.iwram9) . = ALIGN(4);} + } = 0xff +/* laddr += (SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9)); */ +/* __ewram_lma = laddr; */ + __ewram_lma = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + SIZEOF(.iwram) + SIZEOF(.data) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9); + +/* __iwram_overlay_lma = LOADADDR (.iwram0); */ + __iwram_overlay_end = . ; +/* _end = . ; */ +/* __end__ = . ; */ +/* PROVIDE (end = .); */ + __iheap_start = . ; + + /* v1.3 */ + __ewram_start = DEFINED (__gba_multiboot) ? __ewram_lma : 0x2000000; + + .ewram __ewram_start : AT (__ewram_lma) + { +/* __ewram_start = ABSOLUTE(.); */ + *(.ewram) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } = 0xff +/* laddr += SIZEOF(.ewram); */ +/* __ewram_overlay_lma = laddr; */ + __ewram_overlay_lma = ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors) + SIZEOF(.eh_frame) + SIZEOF(.gcc_except_table) + SIZEOF(.iwram) + SIZEOF(.data) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9) + SIZEOF(.ewram); + +/* __ewram_lma = LOADADDR(.ewram); */ + __ewram_end = . ; + __ewram_overlay_start = . ; + + OVERLAY ALIGN(4): NOCROSSREFS AT (__ewram_overlay_lma) + { + .ewram0 { *(.ewram0) . = ALIGN(4);} + .ewram1 { *(.ewram1) . = ALIGN(4);} + .ewram2 { *(.ewram2) . = ALIGN(4);} + .ewram3 { *(.ewram3) . = ALIGN(4);} + .ewram4 { *(.ewram4) . = ALIGN(4);} + .ewram5 { *(.ewram5) . = ALIGN(4);} + .ewram6 { *(.ewram6) . = ALIGN(4);} + .ewram7 { *(.ewram7) . = ALIGN(4);} + .ewram8 { *(.ewram8) . = ALIGN(4);} + .ewram9 { *(.ewram9) . = ALIGN(4);} + } = 0xff + + __ewram_overlay_end = . ; + + __eheap_start = . ; + + _end = DEFINED (__gba_iwram_heap) ? __iheap_start : .; /* v1.3 */ + __end__ = _end ; /* v1.3 */ + PROVIDE (end = _end); /* v1.3 */ + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .stack 0x80000 : { _stack = .; *(.stack) } + /* These must appear regardless of . */ +} diff --git a/lib/apex-audio-system/examples/AASExample_c++/AASExample.cpp b/lib/apex-audio-system/examples/AASExample_c++/AASExample.cpp new file mode 100644 index 0000000..6fb841c --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample_c++/AASExample.cpp @@ -0,0 +1,69 @@ +// AAS C++ Example for projects with no other CPU intensive interrupts +// Notes: +// + crt0.s file included with the example should be set to use __FastInterrupts. +// + Can also be made to work with __SingleInterrupts and __MultipleInterrupts. +// + Use __AAS_MultipleInterrupts when there are other CPU intensive interrupts - see AASExample2. + +#include "AAS.h" +#include "AAS_Data.h" + +// Registers for interrupt handler +#define REG_IE (*(volatile AAS_u16 *)0x4000200) +#define REG_IF (*(volatile AAS_u16 *)0x4000202) + +extern "C" void InterruptProcess() +{ + AAS_u16 intr_bits = REG_IE & REG_IF; + + // It's best to test for AAS's Timer 1 interrupt first + if ( intr_bits & 0x10 ) // Timer 1 + AAS_Timer1InterruptHandler(); + + // Process other interrupts here by testing appropriate bits of "intr_bits" + + // Clear the interrupt flags + REG_IF |= REG_IF; +} + +// Registers for GBA keys +#define REG_KEY (*(volatile AAS_u16 *)0x04000130) +#define REG_KEY_A 0x0001 +#define REG_KEY_B 0x0002 + +extern "C" void AgbMain() +{ + int keys, keys_changed; + int prev_keys = 0; + + // Initialise AAS + AAS_SetConfig( AAS_CONFIG_MIX_32KHZ, AAS_CONFIG_CHANS_8, AAS_CONFIG_SPATIAL_STEREO, AAS_CONFIG_DYNAMIC_OFF ); + + // Start playing MOD + AAS_MOD_Play( AAS_DATA_MOD_its_just_sonorous ); + + // Show AAS Logo (not required) + // AAS_ShowLogo(); + + // Main loop + do + { + // Work out which keys have just been pressed + keys = ~REG_KEY; + keys_changed = keys ^ prev_keys; + prev_keys = keys; + + // Play looping ambulance sound effect out of left speaker if A button is pressed, stop when released + if ( keys_changed & REG_KEY_A ) + { + if ( keys & REG_KEY_A ) + AAS_SFX_Play( 0, 64, 16000, AAS_DATA_SFX_START_Ambulance, AAS_DATA_SFX_END_Ambulance, AAS_DATA_SFX_START_Ambulance ); + else + AAS_SFX_Stop( 0 ); + } + + // Play explosion sound effect out of right speaker if B button is pressed + if ( keys_changed & keys & REG_KEY_B ) + AAS_SFX_Play( 1, 64, 8000, AAS_DATA_SFX_START_Boom, AAS_DATA_SFX_END_Boom, AAS_NULL ); + } + while( 1 ); +} diff --git a/lib/apex-audio-system/examples/AASExample_c++/AAS_Data/Ambulance.wav b/lib/apex-audio-system/examples/AASExample_c++/AAS_Data/Ambulance.wav new file mode 100644 index 0000000000000000000000000000000000000000..94d9d62152c8f61af4b2d40f4ca3eb55523ba03d GIT binary patch literal 15608 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 literal 0 HcmV?d00001 diff --git a/lib/apex-audio-system/examples/AASExample_c++/AAS_Data/Boom.raw b/lib/apex-audio-system/examples/AASExample_c++/AAS_Data/Boom.raw new file mode 100644 index 0000000000000000000000000000000000000000..753762467aab9f6802738f3f8e015d31eb93a003 GIT binary patch literal 7300 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 literal 0 HcmV?d00001 diff --git a/lib/apex-audio-system/examples/AASExample_c++/AAS_Data/its_just_sonorous.mod b/lib/apex-audio-system/examples/AASExample_c++/AAS_Data/its_just_sonorous.mod new file mode 100644 index 0000000000000000000000000000000000000000..9dab7971bf29cd7ebb7813b08989848bf5a93fa9 GIT binary patch literal 173404 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�GU_S+CgpZmsA4db*hEk8rlhg z;V!^XfIaEZx9jyZbfgBeC-`h2c&z}5?(L%?vHHZ`1l<4{)U2!c4KQX}!|rQeXfT2U zQVCS8`>l4UG^MtX0)nFJzDwxvkkW%Qv8lG8|CB+mKd7s%R#T<)dP+~!!@2_4bViR+ z5men^{)A4dm~oMYR_gtF9gF3v_L)`{^-ygYfZ7YBOrrrHC??p~wjV&V4w~>SZbQyQ ztt)66(x%pHaFZu(G&z7rHfdq41XDT92Z-P$_LyfR8n`HDj~Q2+Cyqh_w#TumWDG2 z!GQp;O%LPcwl-6T-lVsh^c`?Khk}945FHCq4-mLb>oWU*0%$hdb&wA_Ce*y6O;g*$ zLnu1XqqQc6lz`LPY~jCy+96N?+V$F;pl?GST5_l=l5T6)iVE(-L)iK@H38L?!$ym= zG+Ot@As|-T+ggZ?dJw?hw$p8`HVolJ<2P;r!Amo{M>Dq_wgF=es8@RJ{b8$hNbm`I z2~S=qIkLkmU{m20bOQYjVuWU)%i%#Ef+aD=J)kEw&`S>v@gG31ph#^P!mxS($*2JZ zf0ri|Tdx%!*`fFlP#e@4`N2hBLli^22Ig%5yWwM_g#>hxkix*GwG}}-VsJsKNI^v@ z;9n2%>9km=5@I4AKykEuw1pDf=HI@BOb=Uc5g00X0G^R%6Aa+m5DR8|Kn`fBXvhO7 zo+dvOy7{*C7RA+3ExZM*rIx0qs}ur*4!8vwf~X#E5De>jEh0i-c-2xOh=l#tTTKoa ztJC|Vt0^5mwV{ZJhtq>L3ZEfp^k)PB02ain<duQqWt(B@;n6hB;@fHnv0?|k+4>2 z6btf1zFKSGD?;NzT*TATXrf^>&BcSiZ{JdyNRd$smCypeeT%{D@GT0Vg=oFSKkXBc z1)3@{MKE-jL(D`F*jrQqh%x_64Ij~yP-cXG7X_6@hNys+f>sIye^(++Q#Jj7z}|&K zmS{~as)j#<{~+OiJzCKa5n;7Nw6xw88}CrvcRd$Fo))jAqRe>vu4ifug24YQCyJ$_ z#uzM-G{U|shgKqdMkSFgq_0&KBGB3giQpR~rgwfReX{wY;W zK3dLNDDB_>9~cGIYW=V0-6zDsD59wWrHv*Ci;VGTm4$X8jemyzpV5%?yL$gmdAuvT zrc&=z4uAhSI%pApM&O?j_h<6<=N9lqe+FCfyZ2gp6dF_OzVG5|Z=tgwA4XvOhk%F( z{2FMKR*iSRzAMeYlF%Y(X=rKxGiB`u#DA-0s6F`pKa&1ea;TH`R(mXF#Xor?>>g&= zM@lg|GkZslCRBwH441E7yM8reO)NfLNGwDmwS|VtPgpm9-{8VyA{||wjwq3*@zx^MxSFaW z@YvNMWi?`*5!3ghB(_Qgyz?Y{(H6dJD=dlAOZmGIsWhFmv-Vmj9QrCeX^yWXh3I-@ zp%{Opu+>E+JjsT?9ub(S#DelPl9PWFIeRQ|E4n{~cw;^>_l-dAL^GlMw0(TyWH`(eC0R_Ukr}HzTcn(clz9kYhnVX6 zdO|Nm+ThAH;3Ip7qd>XTbS z4Lw18!l4)=Bb1_dx1{N4WO_Emxy4)5*!cPJfHltX1tpgfBEq!Qn@Z%_>)~+Vl+Wr? zs`AuQ7y;6%z3-jOkP!kVAmjNFQ>FjVSE zd182+C+heY<*GLw6P|v1Po-An1?EQhQa>E#t!Y(RoQZsQE2a|VrZPT$nfDroz9KD4 z@lh=D=xIYyR${ix;V{pBF>$h7+?;o=}`J;7fe%G8R} zkw~N^CM4l|*B%e)dIBkq81SL=e84aZZFThQA&=7rsaeu}64K3ODaX;-kJ(BjM|lS8tp*XVACq zrPznFk#B<+tP|lY*T=(`d1V%1?+^ullaprl#$b&6{I2;Up?Vb594oR;^A`hdH+!gI@_~i9-xo;mmx)XUQN2Ut13I4{#kI;xi z=loORCIUZ=M5b@wTm3u?JwO*f7he>n9%>`gLh_;H`#N|v9RBL$1u8*SR?sey$oJpg zOb4&yEpiORV~MGS$h|ueA^Nb)4f8kfcEUwchGgvVw+Q?w@=zJR^sXzPvWc6yn* zZhkkvG+ST;BbO2SBGby)Qb}Q63;o^Wynj?nILz0?l=xIw6c-}*qcNFqd=TQlW><@h zEQ!%61fE(F9TV?T9;aie%xpZCk|L2O`BZk$!J~&y`bk+|+>Eb85qL&S&?C^@aCqDv zO^B-t0)hA+r?Xi%r3Jn`>QXXFZayI*@MA$H!xLInE?F8eA+`8~$_tV2S_>W6bMM=y(N|ll+$~_kTeB#=W zTaG@Qo)zaKw_*yd_fBHQ85|k1*@fvvQAwn3t}JY35@qKXHztQ~e8rR5sk^a9k0STQ z6k%Aj>~&w@(mB_nFrQCFWA~$pc`251Up_xRd?7sPj^2J0o4$AV$COm2=)lG6A>K6{ zb~I*V>RdvYiir!tT!z0G2!0m892NUMn)vqN%yd$&=1J({uy>dZhDR7-Qx%>HGmCTb zv{3U;knxESgqoR63XyN(PhyHeBB9X$Gs=a+L*^7IPTyZh+!QcFS$QuLyo_Gpl;g_% z$SrYpjv^^)oM+h}7n&T$p@Mqz-hA|%>Bi#~>rjiCI5%|ThO0!#{m4UMUQnqdKkTEt z6PDnGVVdKL-$b5HM}*Xr$a6W@`H{elD}mZX<5uL`h1pG|yzUEC)l(skz0BLk&!-;V zd@yx0Hv4@lU|!_E2n>JrnVr2xZlPDKHh>`D^@-)nBQ}173tYb;-TdzR$b#_Tev!*O z8vH6Wa)~Dwzw&((d3;My3!>t*&Xq5Zao#I*DEt)_xqB-zGk0&X$O;cnO-_uBbJi*`PL|c_sQdC~S3*o^JnWB0Zas*m-JQMQ4=$ zQ7NS;7Cz`ua4M9_v(nt-mFW_%#>7&C9rRMfiZh_$06{2acwA1)c_qj@!19^STb#xD znZ+eF&|1u-71GZVVpl1CjL#~?qJ3mgNl6m%2h1Xs7m1%M3DZwRo3jCk8Qj^IOYV&y<96M?#;BEDs3x&bBk#yytkZJlX*o=%{GPtzF<&EdPAPzIj6#q zB}IvS_Y_Ch4s-F|f{GE7Q}RqaO4PVOEYAK*e2dup{Ln-|wYO$djU^0zGBJC>)t*u< zezT=$jV}iG=n$_`r?8MDtt_od4!~BStp^zH)M1VS=2V1h0p`rop0{7S|0yRajU^G}P2% z#sB%ZH?f+C&o8BTZ%&jIN57LYhc1V2@cB(C7EiLgvif*QZYi-SagBe(DMEZ{ZdUEL zXHw8jAEOTpoey6hEhb|^EamqXlCuI@SI7`YD8$nX3qQ_0B|MYOWN6+^8F+sD`s6qx zPR+z*&Z}-NNCkCuMQPdnfq*ylI5M9gtfibQI^7^~agjLav>{c_+`Nzlj&{!?<EtIG3)O-4>8v-ohMER5+5e z1}N2kGQf`wIR;17Z+^_C8Wtwqpz;qTqA09eAp!GDB#{$qZbCS&Q9U`t^Ov!-IH}Cc z%2EoKkBmP0Fb`}Mk9%FSw235A3kplvlT=YX85}x!#jfyya%?6QPco|F*FS!O!H4E8 zBC+OU!cufzH4y)pnqr5z;KX@rgJZH~A+aPg3NxhMTf)7yW6+#wG*;rJ>A5KG5=KX= z(jadgJvRy{?jno{=7cgSI);mnB)gmmxM-yzEy`qSD$WpkWGt%;^^@SFKfq8+8A5(c zROzCVug2IU<8;u=pfRht7No-i$D%*3FsD=dHMq?(MS%8Ifn+5uII66k**kbL;*im3LVw%07Jg#)w`i zD;#F1h3Og5&8fwrVh>&(Wz=jkUCgdL`tkOZGR!fS1_FQ0v!qsaGmTZ@(L=%O(ypT% zCoi95iISGo_{`MYokwbj#dVQ$^+V?` zpK`k`j$vy{m=>m|V>ke7LHXd4jX)H9xs?7C^bZYbQ)cmbQ$!5(L`OiY* zL$cC8Og(xs{oUioQ#rd|QS6_OcrVz>fg2a;1kOhu-I+>rRHhZY7#bVOv`+Er%+$;` z3y*(Xcey2nA3w!Un2QtF2Z$eJ5#i#t88! zBljpKDi4kgj`W-L+&QuW&5$zF_p>A$vkdb?0k3s@@**x$rf2g{BQyH^d?7S4Ji=0r zVXnB6TDmXir{_~jG{y$8Lo|D?U*rw2%bPAweoGS)6%$XAGxM@CJ4J?u&yUs2d@!Gv973Zd^=2Igf zmusw**o2|gV; zkfkyyI>6P+;3@$2haEShL>0alV^7kqLBGd0IX+@;s7fLxO8J=7$meZtJ1MmM9;ZS( zSiO=f3iH$Pd6ngOzi0f~2%9q~`MB^Tv%V=RDraRVrG_<@$~fIjIWZewy+4~YIL%l) zjN^z4rU8x3nfp;iS}Hm?hN6pVC`3`L({EFrL~y)!uWV*X(C_^`+^;eaXnr=bpe?dk zR|~5!{rMq6`^Tx7d64K}hHd`w1Kkswzxy`!_{U6DBEuNbZ%q1l zENxij;TqE{aoVV{rRaGsStOJn90!9k>CiIQLXaSg18b(D`GLI zmsH4UV!}@R=IH#))Vv_A#=RdA!{E@+*rYe3>cuC?#Hy6eMpd3p5jT74>LklJl~{ak z8aw@`87@fMc{~64Wp9-zD@z$s%9I3wcu9sfo5ycl;w)CISkNstmu5-RJ>51Cz>UXX~xqLj^pyq6#2 z3^76VGD+wcb`NQ(#s~Sp#IQ@97a4o;!9A?6SaVr%_XpTO2+K!7f0A9jdta1EE0w0P znBs?dn-Y`!{`~!$LLTNFdD_jnS>DHhw2mFN#_rz2`KOZ1JKbJSAn2ybnKJK{rf$y^ zEtrv5&S_`;UZ$9>1wz={eJ`l3V!Y*d*}WX^EN_;utCAM)&Xz4C+u-^wR@T9hM20;z zsESV?#u^PNNd?>%r^n+hEHPueB`G{vs8OX1_B>VwyF(I721mU$^fgJz#$|@{nC))X zl8rHwK9Y(pCd*im7`#3=VQfrM%nzQUR4FPJN(n(`Tz+gBy|tw5zUVDy;wwr?UdmA3 z08eO+7DYNRtSC~Vq=;fvqMSo^;`9|)D1O*nO(lv{3WINh4PpTuAh8U~2O8C+OsTWU ztkCeBv?^}brs&{#eJz)I43j-^;Og`rz4Qp#!r=E+V7`@-wQb;VOxUv3Zz)Yq{veVkKyUZ%7#$+pzN_vbb zic|>rX{(RL2pz*LP{`wVijh+#AJuR>&3ZbOQ0c~|LUJuq+${UtlpadS$ng}W$~@bk z^h`dbT2gH6QRVfL3L8wd*kH}5iQ8$&CW>k+pCPcmpjtAa)P|koENU{Vz|&d6 z9{|yS-HfI&T#;-N#mY+xOXE*Jpx-pJ_X8Et*Oaqu2yX^w8h>c=E0MctmHN^TSzkIIdCpm)sn)FIF&*v18`3% zzL_iN&6E}P)OIMEl22tYxXN<2L0DSvAyvv5auFHFL@jw!ien*-rD}i>A0IH3bCO8Z zd{IuITq+YVm+3&iv$a`X&$rU4jIe5Gm585b=)fRn%VRa6sQI!KrCB9o_j^^QA8Yw^ zPL>PU>IqmJONx(oS$y80wU{d@G7eEzl9ah9Q=FSIc!NU#=~Hsad`iUVgr$Ss?+4ez zc{ZO>lx)71iKA@!24(ly%+9f35rNaIc`1=0B^eYv7*Oo)&&;)~qKIWh!WJSU>uK6< zwYV?wc{!gG#e8ywka!AbC1y8EpSr{-)nab5oKGrxOlH_4(8S=s=ESmFjAb(MEJII; z+6ZA$ZC5980h7mZK{CTou?MQ%>?ATZegnHS<*6V`34@{bFlI43eN^5Zp2Tg494{AF zS{8ctZiB&gTq0MmTNPTFk7c82zj^)p1jBH=k{k}7QYot}D#=xgQ~q(LNLx87X$W7| z;{r)Yhzr$#^T~|ZqWoMjGZE%+VVF)AVaFr<0UEg*JCgNlH%*JSu8g0MxiuO3BMrI*0=Y0+HjktmBlKkgJHs}r#vG=RN}$? zbu(LBmr7QwdI5 zXo#r_GjUk8VLg&G*eIMG5$Bi|_{n@)Ethk-b;j*AxNv|K9Pu&5ShR?n-m(x|0pT5* zk@Am^^wZK(QckC8h4d!nG_!8C#+^E8vlqmSs^n`$A)ZhgMYF1y$HoQ&`gKXk$C9cn zcO(){t-Vx*?8NbZ&=Uhp`F(oB4EjGl5DViegbAEGxuc?DUw}XyN zOVP-8LL$dpyvPraJ7gTh5R&{}YAxN9w6S#D%ME!6mfC(VHUC(`<=Bi^W+pxgO^h&# z*#cc%#lmCmA(V!A``v*Nr`{jrd5#FPFbjH$LzaQurgrsZb9=_W2F<(bE^90EJM zp;0%@2SWjGS(w*O-@i{2S0Fffb;O1d01GK>7sQz$HZofy6npa0wIFK^40CE$ zOeW_a-jC4+3<(e2JT#tao-4E@iMhp?Vj-N zYH3r&V*H9%4P5=q*-$faVfx;Jg2PjV;wN~<_jUL>$28_~3mSPM#>ECVboDb9n}A8D zw%%R5^?gD~$Kq9MV4Sz$BJDa)H-zsHScor(3O9UdgtY-!-w&cCapop&#a0)iMF&6R z^-q2szQ$8>9AP8E(qdd;FN_3O{=(#_ABV}}!&|XjURV^$u0fAu_=_7bV4#Y)FOGaW zGqZ%0F9xh!@Z9-xehg$Q_om|cm8cLc`*_-Y?u+XvGf}n6xo@Xt5(zah?xll66PG6a zjD^hI)h2<&LX>bWDlmy#-K$=jyc6>sL5!0iZ?{eio%-ye-{w}Q?b1p~Yo>t~aOpG%p9fThr8oWI2aralJaV+sb$jpi$3iDi=#I}?>hlzZPqS-HFP07j>GcJsi_%UgT|vpXJa!E9=4yq;B<{~$+WT^AbRTd)iNg<);V$78rV-pwL97iYS zVo-izHQFHS#o+Z3Y&bZ65Ua21k+=Q ztD9wQMlCd!Y1>=U#)h=DEm!I-4L;EZ8-ExWDm!xBas0Rk%$_z|r)%K2AIx1l+mZ+@ z#`TRYkii#r>)55i|HH^=M9cfTyG;u>aIBB(>9Tb7xPTfcZ>_H^y?C*_y1rFzw3}=W z4qSEJ9rdmGpI-NV`H89C;qT*2t&Y%_7foBGw$jS%eDuZQ;>sI&OIC=H(ObY{+-1?L zJFAN#{lO=Fde`ZYx2@$0g&gVlmK>jcFtfP$Vq>@6W^(j~LVW;B-+lgv|3~>x|G8hT zbDWoD^sbMu^woFtWb66t(&GHW;wlg%W%yDuM($WI5+^0$-cR)pz6|Nuvmg3(^>)v( zKC-dBCoetx>Dm0Vm94tI!^VY9ABUR=*|`0OzlHwuZ`x!d=jR+u*O^cG`kQ*&&hp~& zKNg<}s~hX0R5x~6Y~JI%2V}*irEed!KK)IIxGr5hPIlWo$Gp31TXp##)3c~&T!IS> z<2oKX&bhkUwjTcBf$Km2)*-k2y?tD#EA;X4`i5NJi3>pHUtC^8xwq;@w%frS<9j+g zl&$GM{LS@mADfy3U;gG8sT=!3UF*x+^(|rM+4A!jt6Oy#&O=bgAweR2|A(JkUtclF zEe;LIa;L}p>f)9nFTYs+$MePbYe|yi7RV<(1CXJO$k9LEZC(DdXQ%zrfBLwmPCRG) z^7B_H%KWqV@={!q>$)~$@9`6T@MTltfBeI0=(nSF+2})Ntnc(0+g4oO-FP7^FAK}- z($>~i!`RvF={s?}r>niRbo*{){A>RfM1G}TC9V(n9U-nD>BW^*0O-pKtnXdNjw5LY z*?RJazp=l$(zU(s34OqKxlW96JJF5u7K#n9{ns1YvJ7c=_V`X5_dwXs|M)}e^3|RV zCG_QQc%tLZ_H8{Am7QfR=`~T3_hCBc=!1fKy2#f2cRv}geA=~D!BOIIhvV2;|Bmpw zw1t+8FM&(|-9hc>a(I2mk7Jv(^W>fUbgT8#SFZGt_G1^gjrooG*3zsHUlm_(X~^WX zvlny&UYjaSf4kWAtB*}m#ee4PfXx{?+q1R!x+F!PFRw0((v~bM&_5T~i%OdI(d^5; zzx`Md+fV=clOv=vG;Ug6+}_<-{M%Aod@aeP10XoN{Cxv{uc^NA9F;1XDu z9G_oUUKTgDOA7kC&ExAE@bz@;t=+pTfAE`-yw-mF!kMlPZsK(P#j?Bw;l<;t8*d5~ zcxxCv{=U9m&ZcfXy8XKM${FQ#YvALvo(|Usqxyd=Z|}T%z6g}>4HO!^*XZDU1AQE{ zY5w-I>(`&Oy{d2@j`wx2r^mZqz1S*kJfDB@kJSxny96r4jxI0P*T;2{o#^ca4=Sgx^lxn#k9~Zm$I>?*s=tVr(#y}D$5+;* zt%6o)i^tzP(CabQrAN1=fh%X~8?C$2~I z@jlvgV!UVL`NppFVsUvDJ#lNNRHx03qg-FVzem3tzxPvX{8Nu4IZuoqH`$JV+$S%J zyIav`ORN7_eZ2*TMPlsqa459bq=*lGP(HZQxBc39d_2@;#0q=&dAub5&o9OQ0d9&t6uQHqQHpRLlk(3R_H1mqPJet{Z#@3Vae00f9r0Ndf|jO0B2NQ{qUgv;g#cClJWS*S`EiT%HoPF$Db{(EU&_;9IjmLMo(`aC__yo z{nxv%Py9Nx6K@>9H0o$~jZY9^acgI7;aPl5+>lDUN<*hdIeLBI%1u8(4Zoad6Dz&r zXO7TlLsNY54aBh+Ut3w*fSVg?$O2e+01Ylje^|79`iV*0(uQf1?ZhV@bn%^6&rriS zdbk4jsdlgr_k+PhkFNEX*7y~Vgc@GxZ|^wvX=rOf+)Xddplf09*o6yEI~1>v@71*Q z!2{*PD}B(?fzjh#oyRVO_Jq}nyfi((g5I))H9!mF0q29_nd@7qq1J|?dhC-kj&{d~ zXWN#eXhW1^S!))p({^b6knhumyxXh(FDJ;F(mNW0!}!FNuC>K2W#if3pr#l+G?yxU z7Y2_$zoUI8`u!q{K@4Z3csAoH&%Zg~DG+3y&n;J&R6L{ld-hXn{a1hOfpasr{io-Z z{hb%{J=9TLe6@}ImjP7hO!bGmx!0A)vpb-3l-`uRXRmQRy(fBJ{(FqPjz51rVD3EJ zu3CcECkF?;AJlLDx0kE&KfgHauc$kjrq}nsoE_x*_*egZZhz@TOzj^i=;{hPaQ1)w zxVO{a^~3+Z5TE^H+|s|BtEO_S>FTwK-tM6O_dkJ_;05snGZa;~oa+DGZzpX2;NO4$ z!{YNlE#PW1y8lY-B3J&m^Zm?N?|=Ub2zs8k^-t7k-~QnT-M{_$eJ%kkvb zzw-4Q{p!{4AMb9=W{w8WW>{VGU7`)Ytacl6fpZ!bK*^}JL6YN_zJ?9qMtS?^KH zSBL+{t?lKtoFzE6ZS$!7C;s34o6j?Ndgk{JGIKvHQO*3HQ_nLDed1HUOZQpZ-TzZs z+s^4eI9;)M_fL%Z{>yc~zyCt~zx{dV!QWv#K|xJ zjUPGsRdw#0orQ&^`TEYSwfGA#c?La9Pw;5wUXHAmD<)2tH$*ykvb#v{f=Z~Xm6|}s>HQ1rx zRIW_zDh}N79{LA^=TG_0OpbNbUz459%*@Nx#TQdcI~A&9U-k5pN(w$|;IF2^yxBb3 zADjsKPJbSxaR`~OZZ9lH#ia+)%r0qGnjY?;P|-E%ww*$i?%t=kzB8x${iB!sG!8R& z4>R*~3vZTxif``MvxP&pv$9LUW08Pi$I{cJ*}gLauD-Kl9%Auhjs9loFLPyae)aW! z{Z)ln^gH`Di_Q#$!x-I7F{Xi2J)OaGgPo?n6BZydy!g{!w_nBLtA(97Og;8@2C%L(xo^ z#W8rY+tM{~?wsGU|M$5E@#bdq`HR=D^9PkIQa&5>bmTEXb#e?{Cu~oTzuVJ2aOt}3 zA1r4xYdeR42$?wNrFM5xxu&E0@O8!FqG>+Dem zp4}Fm3!E%!o*Zbk_VVXGKWU;Vi{=-(orx`NF5HEpwsnODU8=6FivdHs4o8)ACcZ;l z{?k`Z+u*-R?%~)6=zwZvpR$;GJUuS@@L+!jo9KPe4rVq}xRKX^+oTf? znZTTZixFJ1k@2C$%z7NIPPn)4Xe9xw@lNW^_C7^vJ7!dIAAoTPOaWD)Ql~987l8LQ zMhkGJDErleGKd=rZL}G?UyL_E0sw0iylwW&yH&XCgHNN&q|K$B&BL}snr#O=JN)^W z!cVXGfP*>hPS(vi+KL$;t!t#H{#rqj@Je`tU=R{Jkb z>}GT=aQHddo!!@|Mw4S1dQ+{m^t#+j+nxnzK%|rFAGPiZYK5uw+A! z7>K27?FF+N4!eE+P@gTAuS$7hgI6=OxyREAs(Wx~&(`);m!16tuqJ!N{ia|$s8;rx zzib_XCz^iyVT}fhhx;odd`9K<&UV#&sJgCOcGElA^_Ob)$=}yyo$LKybPVh%?Sy@m zRdp1rV|HnZ^S)1MKFvlPz7;ZZzGdw=($mp)U~&1IS)!I+)wUk5x9zE%`^}mq8Oy$@ zWDhrf4qQ2F@%7PfExPrm%ZC(qoHH8fpJ5JSg5l$vpL5`-f3+huySlt4mht*O>&xXK z+giP%qy7EEzoc^+=B?G@r|d3w=isRUaGzBQh7Q2pZ0d(O-Q)V9q8w4z{-$(v8oNDp zX8T~*IIwHA*4|i*uF7FCn^F&fr{i`Ho_EO`*|NI(M%t?|M!SRCk6Kt=LI3BUZe#GL zI&*7AvO&F9+bq?bBcs-}l-2Bb-)Gv{pc_a0V-}zd?CJf__V<5&|41-YTU*K(j3;z& z;|AB!GZ%jYcl`>SviEjyrDb;6{_zIG+n8eFeILDlcH{$ajOJj<9@+-SHdu_-vbiFF zVqX8@fw0#zFkIf<((m=G<0!`Pb35nD7EI+ruhE=SdFp7Jqt)CqnDwlIart^o#?Jhj zY^jtV!9tq6od4TezM9$=%4;CWw%7;hZ>VY4)s`qy4 zYppGycAgtORg}92ai?ic{vG#;wZ2Z5w~y#kFJH@DTn|}G=o#11U-o_xG^$n~+`p>@ zc)({phe_XY&Et1t=2`ZL?!CrZho8%-xmT;(lxni%g-RQ7AMHH&g}d9j{qtI};^+nz zRbh9p)!ljeXuGG^5r6u}zdZi)!-aJWNe5l-?e&&%uhrpg8*i@5=I$e&U+&NR-&3jw z!XkYvux*TGos)@nWY?Okuh-|+yNA5a3TMRxYBamOwo*aLN-mr4m;BIjWxb*|Rm@Dk ztFyh;b-K$qO4bgT>`_x|r?YifD5-De1zpxz>tug5)TVpu+9#?t*S2%;60O>9f6sT~ zp!K(Aw()+jRerL(Q?T3Va%Y?O_<7^YH%}Mx^WWbSio%|;_Dscz?fF56uftN-tCVUr znT$K@f6ui}boIHrItse>0NZk#^{v5~{}a#H#I+MxK5~IRBfxs#Pk6Xq-YDc^pcj;~Z`PQbzOewD ztLCOSi^o)al{Wg$+xC*%g@>Hb`ukuQ`i5aU^41@4BdxYhX;>- zcrZ`9M@@%{uEF_E`CPtysz$xtCkMVk-Ymq||6X$(J?o~o%kshgUi0VO_xgFVzD}fE zuAIw?Q_Fjmyo3(K_MKH~Z<7_XVXtJ;^MT{8=BxGfEmC>2Su^`DeRkI8ZN0(#+?Cnd z>KOcR@J(rd1vf{Re?53&kQ~^y-?Wx95s!iG^jLQE z6`jLi>m#I8slF6$uT-U)tI_NF@RKhGY^_ucC^d$yLZi?6OKC%00gFZNSjdivPpMKr zS2}!bd+p`Rb>N+lS}yX#(%h5jr*rFStE0`RTO*8#?WW&$z0ZH>Yi-{ba{0BI#mt@k zD0nfzm8yGxFIE5rFf@F!RU!XqwQ!*gwXEqH29r;(ckRMl0TlI%o z#`WHi0TWH?&_W$OEbQf)o*Ml&*)kSwJx03RunlzezBe#<8aD{<5yL*|E37?v{+H#< zE2XgA(RuPL=j!WeZNK>$s9SK(w^VeVbR*rS?&A7R=RL+@m-oQM2{vWS$_4eHSgTLIKX|ab!|B#vbxpROI`a-?G$O^c!i{~n_zZY8; z$0>{ZJ(tcH;%t=BqO^>iT!7uL8+$rE1BPv?pR*bP%6Pabt(RNG=s8qUbg$m!HWvVp zV!Lw2clPts1MeOA|0sI1;5P0wPcQ)_5{X16kT?@J2#_E_f`>?olw{Gi%9dsMD%V|G z)l*en-96R4z0=*ZJG(ovu@CdSFT0N$F%dKS&@oe8Q`J3H<+96VOSW!`qDb)q2m&Ag z;yx0{1QJL92_$kqM%WRSLxRA}|M7jl?{`=gHRW{LQ@{PEUw!`7!Pj3rVHule(L5Us z&IJQDwb&U!0V`t&FLo`#tr-$;AX>zXcCp&wS6?S{2!YC_?Div(7-=*QK6#Kxfqe%; zuli|&8>7v>h3Q@@_E~Xv|1f^gfb2{^{CrKYKpYcxL(snaf6m}dY7?i zNMjo%_IIl=iL+u75Oe`b1}flVC)P_>Oh4UUz~d42cEqtmCmzx(WdOqL-JxT^_oefY*=gtQ{=m3gAg^D5fz zbPzx^h=f&MGp%W!XUapqg@_j?X+eS#$~A8qKrJ=5w6Pqx_S%hQKf}zw`;Ca4{ja~> zeew9|XP@uvvZ@eGE2gEDpxNnlShT4B;v}b^+PF3!9BKMkI5-?~a_s(gE+vZTnjk(t zth7c}-Q?iKlcQ`!&C5*<6__Ci4eEC|z$PyikMBR*-#KdvmokKWOkAAX*t&6TZq7LS zwsoL(FN=DA03k_@X9Z%8DNUXgq#W0TuCY*Qu{7a^nFvat4a^)|oVy-gTf73#eswD{ z>HqOpf4T>};iri>H*hNbylC;MM>af%L{4mw0+CrVr z!tiB?i89?RC!VBg@p2JtZ9Ji62COx@Mkb2EL_A%1@Vm!JVS;sr7ujNi2HJ~n%k6X7 zuK6kV3WUwOLsp5jkYkP?;)o*REvYXHLIq^*oePbXCSZ0<@S-ue;<>T431P`AH`XGX zOuM|h9lQV4Nug2zJGg!vt`tm5_?O+`DfgWCuxk6}hu;FKvJt8fMyeIhfBV^!tPax{ z!5uPtEJ}^j;>DxwM~8B+Rj)xs21hDJIKnzD%?M{lvHjB*hb)3>2(k9hzj?%3NZRF| zomspRof*o^&9w!)-EH!3t}eQ9ibe{BQtHJ%kGKgba{;^{iIyi`Kd5y$X=82m_J-f? z-MI7Kt&MBi%>JXZ?5jta*lAnVYV-Tx;@RY66K$r$Y8Nk9Z+-vPRiDfcJa61sN1FK; z4tU|Ml;$y+-t9u~cO1e7((>Fj72Am1+WtOu!KhEL&RQ z%r#I}&RC|m=2oVHYB0EJ<#YQxsiTZUqopVDC&{v?hd&pb3#eEYAb|T>D`^KSSupg!>;UG2w5?V8soH|O4n1nUp)9?J0)lX zOQypI`};Ze(ugb=0Y-~ZqnPNOH)j}me(T3~-j5POW!%-(;=AX(PJsN0v!Y_K>2#nk zV(Sti(Hn2SvmAm7#IH?8j^SEqd&W) z>oHgEeDhWmNpJ6@lkwv`FBGx@M2)1%`Q77-RJoZiw0egpG8OSMPE=*_t*p=Rhl$-^ z{@3UGjV=NNF707#=h;EU=8#m(%#shBRIDp^esU*j46MHU?t354A+7wlbRJJ;vwU~x zR+lqHQM@!HLV7J+9vY&rzcv?HjE2qOm5p~JlGMm=A69bdBJgm0LT>M?_;X&!p9?{| zS!eJrz5V{y)fvpbdHc@R4QK_Avhi0CbCMDyC8Y149#!t|WE-PiJ8_y#bP(EOvCT%o zZPGRqBxCnKz5lDNJtn$c1MPpW{>Gi3`bd6pufmCc)TD2fQ_Sp2NcHpY|>Epxm{Tc_z%Cx_K^yJ>}9-bYY*SSJb z;PP$83FjTjSS?md2umeTceY>bKTeeSPM^>xVu^fO5FccFwAXLoSoG-P3Jme;s*KUMoqB9GO-*21_@?dEO)|0g| zjFHrO?B$aO+b5~wtC&dJffF+wH4SBn^1u1LfBlyqZ7t`@^~$InJ4(RP0ML#T(%F24 zWoyR|_Z~tv1}hq^dhhbW-0a$%LHPW)pS;TDa+SQOxF@m_-`zbcX4A3fd5N+yi~exH zzp`+3>!W}5lOMkwad(6c7*C4eUpVG_t-(b(ep&=`w@x;XIA{-HBK-3-199Msckj;4 zjfdbg*{ZNG?a}mLjTU3PJZbKK@-#IxGdIHXe%BT6m3Kb+@%P{Nj{0ZGCKx6PWnPvs z$U#W&e*MKxegIW$rZzgS@sg?|H`m;4fPDKCLk7+3Nm1Yj0ok^^jWHS_|^U)PnbN>S%_M9 zF@R4KX5S*y;m7*mvHR0#4$!)HJE zGM?sHNH;Buw1_hm_?T5$OJ2GU1redilkt&(q2L1%$iSz?g@UyTS;JNNJiOG{Dqu6nfwtC4qncPVBT% ziNAcFE$6cZLEyW>30nI9LI{dV{Uc%H5(x%&Z+~RJ&&Dc zWBI1a5wyY3cJ0cXi_+-8Y7DWs!&mG&S!fLiS!kT4673pW6OfTYXiY%_rZt+F<+pF& z`Qe?L%q90#t?h$B9xHS%lEu?necUN!lLu$1lVYac;5kvpz|RAG)m{&p53q3@R$vEK zM6Obd?L5B!`00b)R6#KMZKN{np#Ifw|K(r(_5bkU9MV-t5ACs;!jZ6@7=lG=g6${+ zq0|PmGf_e%Q4|%O-{xOf_Ivzx!ejvFrZ(FbIN54cMP6kwP;#!V7RzuYLT{ zU;gy{*8@^H-Px4uhFt3y4Ys_zQZxtP*%x!ps0X z%e8zqAA9)e&S5rnx_eaN#}qxN9Hnbm^y9z&hyUeozH=+6v>^4==LJ7s!ZrglbI)iZ z3Hjr%o*x$m1_xsiyIdO$I6_mG1-c3Ah+0Zd>oFb1OIj{-a-PXHI^cyalEEb}h4j1Q z;LWY~KmO5oZd@e<@Bk*lPL;@)vkd|<4LeP~b+Ny@bC7M1>)FGzvWOU=E5cDhNX1_z z3oQ|60!Eb2^0mah-QyRr?A{ljJv-I~{q6xTWAxVTcfS48Z@&rIIRv6m7MIUWTeRe2 zWWfQB#J$wf{%(SW8*y@eUM!cW@IrKUdL;^QIfAsi7=?+F(8A3qGRa+?Vp z#AB^wEOwHr3{`Gi1T0-16w1Z(r`z}MfBE2*rl)3Hf}(tEXFC>4v(ixPjAc=faRYMn^?&>1%V%F7pB5$0f?F?WJXbev-?~2I zch3bJZXjxV{o$Y+hxt&q)Ts4wx0^wF;z%n?LbuEb6Vis8nT6?)(`IUOExxM~KzZC4 zQnVh-$?N%S_M(MQHa`Zy*p&}I`r!}mhAbw+%6M!Zz2%a&KJF??GhfM8J3}6hyV^jj zU<$@oYJ9oXs}_6ZY_3^LH(9A&hds#lTRo`^Qu-IivGZ&JE;)@J>*@k?8`oct0?A?R zYA|G`2m&=wxXK)~q8RuiYf+^lC^Dr7-@Hk!23i5nY}jtL0=fPD>+pyXi3tFZ-aCbW1M z%O{d&HOUCX4L4~d=GQkimZD5x+V622<+08knf5UnVbm?vp;0CbEME|yPY3(caz549 zPQ+RT!luh$Mq0}zc3&p;<27hxhe9cniY4|>_hZ?rDB~7PgS&#EMJI$Xh26f8n*c<3 zA!;RzVBQU$vkFFxxlvCxXfV=A%L;1Aktw5AK-Y8l*VH5$@@qH-&r*gb6Y zM3kU#e~=u}(YNlr74do?!P-6TH9|PGA!t)!6Y!e7^ybC8*;bREK*#B3;K_^NQ_0n; zZ1MDEx|m3uogOyWQnOaCW!X3omtx0dh_m2FI*bMbS`XmX7Q*J8Vyv@sGj7IUo{m_I zYMcb)R22w?5bY&IG>{bVs6>oL3t=!tTr|?;hJAi8)`I7@x&h2pty*rj&JI!yh}D%z zlJT3J%WKzGXDO%2KzqXe0BjMnFB)>nO21gjHan`m(na;AzR>Ea3>tX2Fn5)4E^+ko zAW=L_R{55YFDK*AW2toUJh8vOf7XP=0F}*Y!w0fL&`x_0tj7Irx65d?xx@3ba}+h~ zl$ztQ(PA(KJx-~WsP$B!3G{ir48^#p0o1*tAuEhf4G2<^N()>;v+>dK-;#pYtkn#c+~KLMDymoL}5sBK~d^H2oprFz-hCMp>e{jHG8IKOp;1Z1jAl;IJ&kPG^+ZwRH-|H zff9f?4q9mojlP;-Xe(i{PR+wKq6y*vp;pb;WWr;|2H)kTu-pby$Fz0>cuLZ-v)t=DFKUd=%4 z2`mrgrb-P?*5D3pFgj64?fGU##T9IThv)8GH+|Ma`^*tv3T4j3CwY^2s8Mnz|^0k11MHyxdi%+ApcVk`i4 z8>+=gEyY(jfo%XMU}6ZYE`~OuK@*`G3zeE60ObPMwPp$(73;a!(N~X;p^pr{w(;8Q zudgrq0)E=A8B>=#+F*9iZQOwPCB~+0H3hMn$)(bJ$+HHEL3V*gMhrA1qdIk8Z1w7A z=eca`$-`tOb&)T3YqeZ*|C8VT@{9evX4+|U2bbo945QcdM=*!7`}|ImEx7smJL_Sy zjnK(_t5j~bPE%*)u9@}*2n|L7Z`tPd5tP=Vhh2%QRl)$yXmlcXirK{8{yqd)kh3?h z%zCGyk-1=GIpPAb6GRDseKcX4yS4?em<)Xs3WnvH*1*Y(ZBzygcXklaj2qxQ#lU#W;WC z*5>tSBoYDZjB@M@l6rC%)ovRIx7tezf!i7M(1aegn$Xcumw7Hwr_0c|l#lO!^3|(U z8*@V+W-(J!3oGllHW%DxlXq#+-b!CoRpI%o8ygX)#qOkJHgkIT@X_Pr1`msHgc+Fd zjjLC%R{kt?UP>j-OZm!qDp}?V7qvQk@@Id#|J8Ovpo|6+rB`cF9bpAu~N?EV<+2RKTl*J;6fNvQ)@T3uB`^axZ7w1 zQ*hGb4^A&eg0r(TAx7e>MWNdkI~Vz08&Gir&A9y*fL#Yrb@8Is9a-|~p+9Kx zmRSkrePCofYBV_=ERi=}n}LPuh%9&z0m6b@A^U99MF*yr!Zv+71DEvEqw|AgvC3&| z&V_3mL9>)Q&z9Nq3WS{SY&Ks_yegEc`4=bqU+o_sByufb%$Lq8LkV7s$EXG2-Npu7 zwl3Jg2Dd9Y^B}1y7f?t83S;&CmmJLb)x3(d-Vbu15R}t%W~DjzNtg3i;Z3_9C5aun1`d zQW1drLQh8-`-LKVkv)sWV=s3=>pQIEQpfv;C#h_<0{@vfA5IAW+7&;h(7?N8D4^E( z;2QIXm!k`dL3!90I^7mnNaa~@QXhb*#X!^4unP%FGzL|wp7JuFWRu4VI>{8PwYC8E z+u~ROU#*eJO7lI#SUTxSr)a{@RZk} zkvkA{qd`TsQAooD&L;NvlI4ro?)L7hbfYV9Wze})Dm>rrfg%0?b+26Aym2FFrRd<4 zjmA)ee`V1H(FLIE9LZ9xQ0(xvO50$copSp?j}3T%)Dg-pVj5WU5bJ`AwQRKkIE^q? zf#b8D0w^9-F$}~!Xd!K9dUkr+Ie+8!N`x_x1dVsf`AWSm^ku0MOXh_xFLYt_0O&m` z3`by_j&*_W0cZZ>=b3E&FqO(4B&tHIQ;eOa3iWosFXEV3>|()<&8;Y)TZB8jIJFpt zELn#^qp0|1O&n2JZ-^)(xc^2vvrDf54{I=5*V^^{q1M6p^)fhlv?>C;7O=)2gV8mC zn$%z+j~NkBv4f;z1tcGKw}0j8)#ZrOK%z*y(%`G*GTVVsUmYSr`X;NMwp;Xay8|t} znzT%c^MhOB09cylEhnX;1v zK}--rCk?p1Vt__#)F`u13Ytg~QUw6ngE1ITCWeSgvH2Ozq}S;PBTN?CEiKTlK+%L< z)?j*NLU?_Ssfe4R+)Fp!efPCDq7mxBK37{s~<{Us3;azHrKZ1p&8O?`+&ub zATUfE>j~0mb`XRc#$K#Y2lACT9Cq3gMwkHxvZD|^(Jr=7gDiD$+iZjeP9LIZ2rVYb zJC>|^Bw6&w z8ugGbrC)q@|Ey7lM7kUcTen%svm-?rh;?>IIDIa+JK&yPy1Mz+Ti0ieu$EhmdKq5f z2r)5JE(<}!$~EXG?OLM??(iev*uf|OXv1!BSdt*$1%(w^YY2$V9|WWW&KaXg4N(pR zw1X7Icp1-fbp6_uwV=nKG-~P7SHP!F@qoIS^aumH2Do$kV|~g&tJKPnD`oQ+ZNg_` zd=7_u%1KNB=dJR!0f0t*1w#N@c7?pO9)aoymxU4!qYZa37=|__=(A{$e4>mP9e&0W zoL*SJvb6@SvQ;zg^;>N=dk}kZSkqcu&_n6G?Fa!QufFX5wL*V=1pV>W2_c;})`HqTB4Kx6Y8vAF%+NmLm+1@>Sv3X=fw`;i zzO}g$bW_@4C7Y{5v&VKs7&}uA=tQ;cj>MJff>6v}lyc=-rZN;qIP4(4oZLCc?d`_O z;B(Pwj$oRKsq?v}G=VIt%OH`mps~%|ef!qt@|xSmkmV|y$cd2r77V-W9v5&1ph#@tq;Bt z4F)w6xyLrk`7$d5EkGjx-3jtk>LLV(3?wm|Xb9zMp-`@f@<^rWD--_w5FDtsFM6gsEB`YUs(R+2U)BR-u;K-#;#2Tw=Z`PN1ru z*eHUsLk8PP@U5^}tv*1%*RF;Q5OUChoEV7p(gmC})St9+i7a&tMmMc)36(OhBQ~&3}RVWC$+BD3MYvm4I#jStJWk9 z*rX69L~9Ez1Q%vEX95oOK!Dd`!bei2rA*y;@A`~I4-Ww?1da(%EHIEG0HCEq0XUX*ZW@*egt1gE0F;E8+Z>b* z2G0D+tVTohZES7L!BNlwCi8FvU6sohv_aq)&o`S8NvM(A(7`9z zu?9Dc>g8$=os`&Cvvz&}+F^bq^j^TZ@HI{lTJ^D-k_VVCFypeBZ~!we zimcW%A6@}EYJUtWS(vIz6ISX^WF3jq78hd_l)g%anr;MC(_A{2QCn6(W$HB;?9nTc zki|`C1`{)hUPvQkZ=#^Lj z(@y%LP){ZD*=ja*!S+NR0r(M&Xdv~c$CvZTaxqgzo!%*j+vT)a)R;~Z>y;d@HF-nP zwE%FK5kjTtv~s;z5Qc=$@Aoh+Gdj5h8lke`Yar$VO2q)d!5k{;atEUe(Qt^?L2#W$ z)8!B5`sUgE>2& zElCD2F6mFScF_B2D!F_e!q&ig9E5BD%Z3)NxKKW|mnb!*v6-|jz5O;AKWGM0hs`(3 z4M7HmyWI^6Simvh_|apUVHV`PdA^J5G26=4)>=5^wwv7$D+TmHCu4>Mq_>$NdClby z%tx(*;z9Dfc1hUKGj6w&q>PY}!$Q~`5aA=a9GEtPgkGaD`lfwW9H%LW zjT+XoFxtLs5G-~pjT<1*hpSb1VBV>L#b8yJOZj-U#`1%{1|Vkk;NEAy+m0vmlglFb zayt>`fU%uSm*6vm+PSEuVNf(3nQ>yhT5LaCE&}zBVy5R|d3yAk4&3D}_&=7w#@e#m z4NwuV>LBh9H=t}H_IwvSnQZ>qrJ0$i-xZ8RHkUx%Fo5XCK{YQy6rtY%58vl9D789Y z$z{9a0SsrX4B$hIt}F5^FLWR>3?5~-#X^YK07j8;R-~VAfA;uPz)e<&z7)k`SyU0U z5eOlrJ~HW-i(ngLb2w=&TLwXi!WEg|e zMgo%u6S)m#v<5Ti&5-vBseIKEbfe{JsR^@>^2OP4xmBydf=}fdV+97Svw+O-m2ACP ziyah1t!;h-Tv;IPPGngg`1)|V5P`V`Fv^4YF&^aSW1*)2M{gmrIYkpBriQknSp)Sw za75wy02-f%W`Y3j%q?%O_!wdYL-t9x3`uB|k#S#6Yc0^dkD!6XmBtCybg5 zg|R`oCZQS!)HhE5oEa5T=ZR#712VgN^EXyCsXy| za385LFJsngF$(8-h~I;3JS}1Hdsdei0App!7_>rpS}DZ#_7k}_HTzmL=ym(nwpQ2H z0(0O7-)#5fz8d;Y#1dSJxXhrxg25H|qyy+b&=Qn>f}skVueBvO=d?PKc0}f^T0v;D zJp4W$geRB&yO|blcKR?0ih;}UJSfVQLAA%Tt#YNwcTn06gbtfoH=z(d1Cz!c%#Gme z(^Ce82Uj z?b$$Bsk1RwSd}nEh0~3zHpDK3eu2PGQAs^eo+IJ}r~$aqx;SkfwE@l(hme-U77F>} zClB{4T^)!dY_N`G*gSlDO9r#W3_dTEy2ExGr7~g( z!5r5)7XnOu&>z4(1~Ju{z5NVNz)dKfhInw>5XZUFkU&|VK? zR3uc}n}}Vp-R$%QQAJLNgG=ix&Kd9A{Pb+t1=-_}G}>uG_h<1jM*RfhBNY^ZRM%#= zkj&TFz8aGi3^OX40Zcwc73H8!CJ<7vrMjq}3^?{8aglFvUaG3azqU*Ynlx)knI3j&}M_(*7JqRZxw6GdLuXdMoS zo9n}NX@a;9q=!>h9O9#EsVu7|`t7ceE3_5$gaw2OZbGdQLIOvnLKcW*K)x3Wi3$|B zF#ghDMjEH>IzVsF(#Zx?W@Zg-H$k(dh9Mja3Ntm$IB6R8CLI5WwhwHsZhNFgFLiw| zqMlw^S)RMLa0&X-xML~m)`H|qx@<$Br-h#t3M2r2QYR^vgV8DU5|lwj0ImfD6HqM@ zW>Nzas64A6>V6k)Ev_ZO#}7d!s&&pdC``_tK7Uma3Ze?`heRC?CoLodO7NWwDAy`v zE8Q_h0m~SZxelbK88Eruk|@0e_NiOl2g$93;CjGuRU~d1-15+8{9KcmCER6a2Y;&Y$S%2 z^wCkChnIhu3_0p6sLJhw)3;ETR4$ik+)CAXso#eY8q`?QWO6Bfg(KQxV(j>Ut2N+> zD~;2mWRmNOiUjzMFj6KWBKO&18~_LKM0HSFy#df|3icXgL5o7S2P7z)gMy6j@u4-v(VvUo!zfxmrw}@|FHXf)qb3W^>wY z8t~pO+9i01eY*CdL+QBc!3232B;i5DEvGwhYOlkoG=*)Ri{la1a>3RT0@-rPG&tQeUki09^s(kiv(>6c9x~h_5o69sbDL(hUeP znO$Ci5)9Ro)J_z430+8qOHNH9ms>4t)xV@1#ZY<6K^sU0+IvboldGchZ(3`0GP*Mv$HdD?XA0`T= z#+V?d!gEWTYip}f_xKcQW|$8_t-A=tjF6xW(a|!15D3_-!H}ZH_r+Q!pQ}m$phFewFd~%(-0hQID-%oQQzERJ zX`kJQNbRv;X@c;_w z06MWV9)sTn7QGS1=Y(l#!LRS6TxF#@{mRe?qIa4TbR##Sw#|NF7D7V1w>}9Y9tm0GME& zFby{|gcpny+^+8ECY%}p51?^Ntr@r5q>RjI8*O}I2`P1`Jye1DscNzzlF+vdFN1** zhGRP_+t@%>D}n{ZuMQf7eFVI|QPI#t?e@XgSVDLmo0)_tL=^y$lzu9R$iPhpmu$QV zoRA4-37{2T7;($9RiukbT^t9E2Cp$A4R+8f!j=1^+pV}~UE7l(W3i>^kcF*pj2}so z)(kD*nB}$jjKxNCAP7-~I|@MBB;+*DQI@fOkc>n5G_%nKTzW7av;+3tuZE317f^C< z%q^=d-K-NFiIYb|N4KMux$ZEG2uFLFBG(xp8O- z^lHS4RT`wxzbNLjTt-xxQXDtNt+&*6HP_I&he};5*dtr@fhlOV4Uh>5FaWhkyG>fx z^1@xwiVnR-XYKrc6M?>E8bb=G)Bdt|nVF!Y9Cb`F&7k^bqacpVUI`WWiP(-=VAWi zM1~Oj?nhW(B@VE)%Lk+L?)19jZkmT#Cw^l*I>p1DO?x9&+k@&yHEG2w&EZ??mg`HK z@7%CYSxn1z&+79-;3|DLIoWaSpzyj&hj$EXx+=bu^UA55hY`t~MNtLu31z7F1JYfmWhZ$5O=%+QMMz_z! z`M7Lw;jp&bT~NQ>lY9OuQ*(bt#0h)Kj%%($efBtG=pACs@S}a zUPdc}F-rpt*)5Cuak6}zoPTr6cz$q^cKS>cH9)O{)LC(F=j)?`r{%Brk*L@r3yRri z4Vnhyp<&4B>|K>~-0HcQ^|4&)l77Zu>Y(daBLX37>WZGibe-Ue5lLPg(Qm$cE#5e9 zNTd%$@?d!1C~@VTCsn66;0(R<-H(<5QE?mXW0OmojE#0`w$wQLG!1;^qe=mhP1Csg zj2~E?xQf1w4SF~-LUB(()jiye_uOycAV({dF_+JQTQQSepOycg|LcnZlHVz2`x0M6 z#(2w97l_J5UeU{TpV>MgTcIPlEs zNj-u#R5#zEqm3>OvVIgGGKs0Akf){KOlZvS4K#tfKfS$BxJY;XE8tCoyOy2O>jU=U z+5WT79=uEy%pv@y?d0Tox}gO8?T(l8{p;bUN^_HgM;zH!rG17G%SiL0>0V>+>5J2(sFg`<<94Xule&`$=~eT?9=P(c-B?C3T%A$O<9eYoa9#V} zx+imTnrG3P3gQ0nWukD9*}wP4QaoWd!zh&l;=Xy#I}6?pirO$5R*rM&3U&3Hum9^e z$v&XIW4p-(I_B=oY}8k4AbLA(uF-ylRvdx#(CkI|q#@|np(;Z%&vO_%9vx-uH?5(t zS)_d=x!{{s2eCLJC|o7C{nf#PCwVXr_d3Zof%CjEu4?kPJFEb_SY7YnQAXcReEsC>M`)&_!@!-Dts6+P*LBwgyT`2M3z^-Que!SV zsQJ2$>td2QZ1mz}B(yX=UqAfx)IP6M@|+p-hNBPylBn>a%Y=ITq-m1mH2M+oq;Sz# z_Iam54*l4*c57vW>MWzckD~@`W@q=1>x*dZuqg?!O%`v=hseGk9hgDsnLz#X8gi$= z70}gNv#%i+XE1sa!15OB7VBb#?e6^c>A@ag!(cy^yO2oFaBdIW>t*-m)}mt!%}_0o zu{2;)s!*K+2jUz-Z7r?8O#{S8n!}`cl2i|`y}#+xB#tJSGw4F?aMkmpK@F{a4Z=|} zG;Iq0Yr`bi=*Qg`{d#_iA# zUp+5SuB{KQbkBQ6J!%1ZFUJ)8GFg-)M9jkM@B6k2owwGn=pW9LC_n{1por z#+Cb{+Ho!28FD?S1x3Xf@~+-=!SL5bTGwU+$li9|gU{Y|$sN*d!59!yIlF+I)wzSy zc--V8E$(*3Zl1dNv!7n`n?+Y3fH)jx0}O~>Jb01){r2-u&NxzI_i4r`H9NENW({1i zEM}`GG(Fro?s{M}(LC=BaEMhC#}h0+={M^aU;JVF=|kQ!CMu7POM{^$&@C2Oun)7i zK#XS#(_J?6>fy0)km^o2g3(s`2)*>tT`y^Mx~@cK!eLXUDa>oV-L{Ib5Yt}VfQ_wc z^C*+}{L$ld_NcF?fn`biR<7Lr*)na=+5>mp(;r zYmq>aArwTneC_HKcJE)l{<4_QoM)tRM>PhEo_Wu^-`w=s&Bl#Ys}@`nOp6OSFy?jm z{fN`99`r-=2Bz>IAMD4f2o62E0m?JRwdNxOv(yB<3x9rh8uzcvg_!vN`|Is{M}wC; z$NN3Sj1GARJ`S(AEH+XmtZJ>*r5nifsud6`86UTSY;H;lgQCXnAHM*p)cN=?~*}vRu62Di8#FboTT(%a>!r zajmVhu;qO5{^t*>W0xzm;Io5i6XDzNaog!sp%@2YbuH7afSdF2Q6F(cXT3`wu1)!( zzNLk`(}WR`43No#!i#lzo#uu5)6=JCwL-I@3|P$Rg`oxtzJE}`Ti?2Ub?d{(wbdDy zeN?!pR#NefwDaODbCHfe`#d>tEM0eubj++}IZT)$^MM5z8hh4f{gChz&*V@8I*J1; zxRhx%@~up!(P5AGzRH{=*?u2!PA$yNKpGO>MbOh^zF6t-gJQ1PZ=Was@xT135t_fc zgqcn5rRg_kflIf#w76o>xRyf>P}dnO1{*)v-vbU1Hz?EwYS}X7t?;Pct{rQA!G(9e z{n7jDi;E7JC)pKAY`4!&UOwC5hMMxL-#;!%Hs8{?(n0L{=rlR7F5i6b9hcELI<0?50Y%9 z%#n7_`nUf2AO6+GIu6uly8|C;+vy5WG2;T(JUYIA53(~Y?m-vqvq;DCxM98f_dk9& z#Gp7cyRd3#^!J{|Bu(Mhhp7rrj@mk1dsun!$%{<(2)gk@x7O+ zKFmT!9G}Y+a(hk8q0uTP7}uDPCTsoC|NQe?VN&CI|JKK=K_mlqohDo3>3#+pC9JQC z1QCr?$Ty%l1^-O%*7v^oqj!}q#Aq!rBr04w0%7sL?mE3ul8w@n$1W2T~#MKAx zyTACwx36eP*Nt0mEjgN>eRZ7alG6DO7(a8sDkZu*NhP;`@c4K?l_?JNSFe9~4YWWm zayYJ+PhK76dwBW$*)jOImB8B|*}|us-msbBF8V|B^}qQ0@7|`&!J9w&?wgU$Q4S?d zuED{lpFe%o!0mRcPR3liVGYa%@?G4y@WD?%cy}@E2*H%lr-A&LfnipYe7464<68Xr z!{j-u8i9i#qJnB%Sut99@obMeTpNbq(*m()9S+9{idGHr{=91{rPz{xA$eCO@Ecfa$k@4pW|k?_frnvj0>@OgzV z%foyDyjnZWCtrPf|JlPVFM5Oa(0kv0Z9&C1p6+~oFFmGgLiS1gELY1EGe_kvAkr|N z0Vd?Ar|s(Ok+<)D^yk0$(U0G<>I`Z%Ng`&fl1hUnken0+)TP!b@sqt&ri^(s*VnJS z^@AU-hpcFytMlW);+q@(aW#GN;KflTpUO5Av0aVF3ll9$+9n43#_b>e2OYO)V@!J%>D1yg@R zXyfh&-~Y+a-q|#PvvR+yB?m+Bc{r_Sa^Q0+RN9AUnPeteebpVD#Ovmn;NWbm`GCQC;KNNOt?bjs z4}quC9Sc_AyE#qD0IAlC+(^<55etdplV*J9Rs1}82KMV`nS8R4e0Ki;r~xh6^X5c*0sE-K*LRLVWXYRp=mb3<{^Cd9|J%QPV~ObJssj|WxWGxFe9;H) zMfpjxGpW4X`Sh3fcAjz;J8rj3bhxGs+`gJviRV!g^GDELeE&s?0~a*FObf66_~qlz zx6c9P9BZdP{_DT}+kgM(?=8C|wx@UcoId}oM@OwJFGt8io~tCcU!0x+Prd1;^#-SL ze)HB8bt&ByI%8+R9$K`I!56n|_kuB?Q0-joKY8{nH#WOygDQOOn}6|lfAO8oB~!1E zsY|qX<&9abSet0j31Gh6el5PUv-|5m?qf zn#wqJluR7$J^Gj5{Q8SC-eAIU=r@1;ed_Mn=l}T2 zXT`DXS`IG|rNVh>G6wO)tL=Ng{PN5HcJDP**$SI(zJPLPlgVjw_-$U&fhf>ohfwYJ*Uj#WQr+t#VhwjKAh(`yb_ zXYb^i?#@iFPCM;P`_;DNSf|z6+Cj%rM~ie&0f7R_DL@F}5J(6~$T=h-f$v_}cKUta z{`d9o{r^i1F(fPRde-xvp69vmn@=P}e4#dj!W#v?@B8i|k z;Q&MKJQ1>YeO`aDrPn>1@VKHhZdO@^#BaKB>5rea&oBjiT|qk7kx}W(jg7S5`0RRn z%e5=lnjCxuHzCune`N3eNA9iEXN#5=Nm9TqUb{xaB>?&pDODm36RI7J*UgRuTft=@ z`>C#dq!8K9@!=6qN?xW!sY?N+t1ZY)Q_wuK7KdZfHZouW$T=Md3H_#R|Kq966$P10 zY=5G3Sz*Phyam^UcP_?Vif3>fUp8L(_}m?Pn9Dt{duQ`;0n4aZ%*amypSHk4Fk%9KbDFACIZb@mFSmJ(xxiXO%E z>o=LquFwL(6r+tLg)5LPu#Zm!#7YHEfK5KCL+K(VBCNBc0|VopVc;YqOUf+OisDV* zJ^1XySp9fG^~+3yf`L4pwiFIAL^Mv)>o5&m@4D678zvSbQLmpNO5w}mzKPrC|8%i; zc0QJ1M%jL+4^liVc66%avrpcBZK^d zJVTSoV{)PkY=+Y_W=8gy2Z-?k7kFvCio;8wRy2v+9Wu1wUtp#2rK})*&g~c<9_t;v z)901u7FOtszw^ZQ9W}*Dk{M0#5wDkJ$aG4HloW6l?G6*5|C7^Zx6k1V&A7b5xFnsQ z5}595y4un`?VFu(21jkyxj6QBKsY!|xFc6TzjU?TLG4du+6{Z3+FM&JTe5|NY_SH^ z1^RrgUMb5}bHl!%%a@GJI-*DibBSa)Hp^I%Q+SV7l7vzUcNS8O^w>NN`f^g4kRK$x zL$;}|-pk#SY+Wvh)>m#k`ol+dt>Q%|!_ioRD@e&MEUL~|YLKx23S!bZ7qtuzFCoJU z-}X$$Qc{^oi>dwZLli%b=?+L_+(8l&N%V-v*7Eniw>C6=*3#=j*h`|$-S++O?YdXK z=yNP7bEK&vmPEI@eAPXLnpAWapU>r^1?*laDNH3pvmqZh>z?v*og_H7fV$IpQ0IiA z5hjaGDzjIJL&GiIgMB@HF2r%vT%N3S>r*cr+No!{Y%vad0Tov(*Q}|iUL{88+~!Wi zJVC#6aKh!l&=zvcA%YKdr+@X1FC8oQsG_K^w+NriG%Np*RlUX!Mja8qUC1d}Vx(3ce>$&2_*40TuxrUV+NiN!EJ8)Ih`>ry#X zkQf_Y=sk|ij+o5g=TK_XRcaAGW^3skoAgYNyF+A7);+a5YS*pB`?1STvKi_e5I1G3 zWhC|sVdUH9=Ah_BaB1Lx8FxWkNx(+sq+Aqi?=o43!SZHBeQ$%wi{%I{=C^nK<>HkV z2orixVV0ShTcA|PHA;n&m4MWTOj%QXUx_vq+L4o!VIoCV2sjEe30CE>J4_=*>J&Z+ zG)18(9*Mf_voZh7pxr}Hl>rIFWO3tG6IL_S@;EiGdd=2N<+*YxCxv7%p#rm_pg^53 zPm==OOW3-HuzF*%7rBdpc+_SZ03Wz4RVkGL#caQAnQ&O9=SSPlo@+7%mJ&fXAWJ2mozGAy?x`$YU0#&N)GWQ#U) z=jDc8;MZ?;SeYP&6+$8^7A+-&V_ z?!0BQSk2SJ-KODzzAvr}PZAO(kg6I*4!IC@Pmj;i6xy1~%IdA_DmJby%3ub@dfmtd z3;1d!nMk;%JXRa9*kZ{_-D-V)Ze}KlA{l#Pe!(3Al%BZ&=^M+SYj|*ABE}^1^()It zb=p-KsY)5iKxHVkG}o6GX!A5`HK-&aL6qNnT-ZD=MJMg{+rzVqNfHaRe6^HD3yx1r z_I6pUU~(Mo9iATTv04Xv`)_qMwYK!m0ggcY1H^_e{35J9RlYBp8q3$;on;dRA5ULWWP_}sA9Wg8tDfj_&v^U!QA zD#}tLD$n653#;?f6-tRLO_mLAfpl#)s&A9T(xTswuwEkK8tu8(V6p}1q(YIS2ixf) zG#-#*pBT0b4Wdh1dsai{IWa{#b8_U%K0gFjb7jZa{6Ywn}NB|O;v0lsUoXZa$ zOHwJ5OHo@wa+H;I>npRkf>cEsFC#Nsf-q!pfn1bEaDgHLu+``2>gnogZ5fLKvtC|S z0eNkY#pVW#H83-312gbQ`=zs|&s`t!c)i}SzB?Eo-CzUZC+V_WU4Fido2t}RmgN`g zSL6y45)x z0!w90d43Mz7;y!W@3&hgW-M;Ubl>d{-~01z0I^*&=04N7YiY{vb%5eoDbcRNk~ueP zb-8wh0#$Sfp%q}m0-81@!e|R~C?s|{%|jDYaasDx)w!z`3n4nHpV=Hn43*~~eo!z+ zOfILxJLU4Cbex?c13j7-eyuOo7i(n@$I4%+RtxYONuFMxEnWiYM>=ky=@we!unk$J zZA>WwS6Ur68V2+r3Sv8_W4x!Yp`o^rY&grQMkJ*BKOaHLLM};$ZDy1@0 z2f>*vi9$xE@a1Y5hc8c;t<1>~ArXn$c8L*jxI#b{LM<{?#7z(q1n2n53@&X+EKK-4 z9{*etzos!0(NJjCHttObmDxpE84_idHeI)-OskNJQy@rItXH#^7Gg9d%Bl%(|1>C* zr{+*15oM8FfWcA0vVeIANE{^dTbr&m-1@w^z1QJz%($=y1WDYTFFT-5A7w*`Kp^6a z6qV)Wm8;ZJE}xXEkUmj}kS67Dp+bRQvje_J#P34ghbO`$#WE&|<%dEny1r`}JQh+Txih-?@ zvvDSm%S#acS!hx-SxChynTxYiz3siNt)DmEXt#LgDd40#=`|0wUB5ms8=^6ZxX&F5 zOEYrsd+>oOokqfwV0aQqBqH>9Av^#s!HBxR=*3tHMfd~-v`Sfm;x({c5^gZbUqn^$ zyf4C&K*}Qk#9uTCmX!r2U7*gAOHi$pjlox&tb2znv*t*7N|lPcNU{h(1R1Opesm5j2TM_Sdk}DMP~32tSnYASOc7Vi;<9~# z>Dd^nFc3hav0_nY5;7sE0}_hZViBNP>f-!T6uc@|mQ}9SYBMGA*{MmlJAoQPcFfjg zMj>`AMV7&GgWD=W#JmBp8762XF>f2180u(g>1-Yvo1>)C0tMOyeMN0#}|p zo>>f0*?aF(S*{ncIZ=np z>-EI>wA6HNj27_v7!1CEw=mB|h6lF_jB6DeOHr;?T3NRyQ!a=GqBg6|9pa=iU6V7@ zRv(YMi1fWG6#~>=EVCd3Aq`%kZCIm#( zH6Ik`ZK&C}ZjHX`-Xg6cWswFn7z)aGN*=Z;^T5*qp+wNcY8fM9w^)7Hu+gyw(5%vB z09t2rcxPR6q+BB=zzYw~Es{lFAQnX{P+ZDlOEkK|{DR_w)%UF})qw$$QopfH`_U0y zPE4l>CJo_Fg0EzQC($;8B%8U&7L$+34UhKr^w}&9OP|>~&604J z=0jeFa%FL0`Rc5^iqiFKi&9BOG!Th~ylfGRK$;KgaZ)g^(Md7%)Et(vS*r3zBo)h0 z&II+?FcAudBQb%DT<~Hgn#FKDlxKn(V!;~;x}47W zfOEnX1XUM{5%PFLC?IFxG$_D=s%$Wn?x_(d$KDwjaCrUJuHG-lCIT)uNG`&p zT!cY5#*)avE2c@$uiCg_ZGlq8iY4aekv3t*60{|uNTbjoGK<1&i1Rq+u|SGN7a@Nu z5vQg?r6jr##FmXjX}>oZ#>|~Tk`kI|MPa^#jsapZ1rCD3(eit1Dsm8~V@8nAo$(;x zfeZ__5v<7k94LTzgw3}ENU#f(uK^FFg+d9R!|yZoOiXx(%)MRhT~<##4AwhafTqx- z5n+ejO|YaHDJ#_4H2|e+<*8}HXv7`xVu2JTC2HL&y<9LK0jXeOCg7b*(2@WNp&l74 zaFT}D3eY)=5_U4?2#08>juT3hQeF1S)lyE}VRIy~4N~S6mp`~^=O(QfBl*mP*)i)) z%()YO>={7g;SMB8K@vNRK*A4h94A0Aglhs6P;>JERJXcp);p~|7V~VtIWXnt2qhX7 zd&zA>(Q1^*r3+-*(oK(SU#%7jXjsa4ec=Ry5O9^+Je69;ON0_jA@83h%^mFu=`Em6v3F^6fe zZ)7IPB0*|S_c)@7Kxl!Cdtz1|6%6}Pa0+__y zaB(@wPgg=&!Z9)KV$#_pSC*%i00%7Bl!u< zO~<1&sZ6G1hdkEt=@~BzC~{D~1s#382;9SAW( zRKX(z1#Au$CvK#S*x(L9TtK%{PG7(*M5b{BfHmf*SCC2$&5f>t1v^*^7UD}$Hf_N- z3n+v%Q^EAPM%{Lhb1)YLDX1OJEKujBDfLPrJw7$%497^3MktjiEACs94SJGD$g>cL zGZvQ;T%m$Q9B>S^>;xMa=)mMOENf@R0gRZ9EzxLE`<>wd`{)=r*?KK={$Lbj%N!cP z^?5@c%MipznTshvOejj$Bef+Aa+pDvSS>Geu_$m>ojWf>AC z4Fe{Zxd31q@MlB-_zjRrjdhI7fQUAY&ESL_LjyBro81ONyWV!YCyHTp$|cDxF4ZdH z=9?GW`&6sVh$~4_cB>RY|zz(Y9;WXAzo2-zG}fWH0DI@yf@BNX^QnE zBN2;Y) zDy$P{TLcfr!x);iEXlOSbkm4M5mNtJR^2zAFmk_luKLBts9Ri#j8P=f3-ifBpi z=*WyvrCYbDyf{lq^LwWPfvK)e^U$b07^F!{%GTU>PgVJ9y}lx!=9z}92c0XF^JR!n zQ7gW55|H`%$RaC5L_(oxsz`>7c_xNZ-uyt<`SX`=x}zw)VN2x_I&i#J^H5VWSf(Ab z;JU!-id^C{Q#jZ|FnxW0@3NT3@oup^OR3CKLI8xxp@rsrSaPHMn4PaHD$#3lvK3+p zbJo_<(lX9W*OZl4R+O)laJ@4qPaHN`Oal&=2TJ5wRdqEFt*u;H2n`}KH0lE=e9<2j z@|9|kxQT>JAlzKOD2mp>iv`LKi7Z2?)yNQF2s>^yU%ENqnp=#hcOLhrnVs z6!JU6;fPRIT((*Pf*}^i>$Q22Ra!)OPb`XB3b_OV4e4nN$8c|ZSHBrJBS1!!5)KQ~ zxVyda;}8FG+Z;iMpPLK2T}-BIg)Rp}yFcJC-R>G6o~3DvOQ0PgWzgvXmvz+cLLIdb zAX%`p=4sPYBx)rnaHkMvZ_jS2zq$E3qFwKHFVF!1lnw^LcLP0ttc-qEw9Rx zpu4*<-lA-ZzoJxMQdEwRBM)LRQY!(h2CRg$J-xuTQ|UDx9lA$L z)2(MuUIhjsXNd)Kg=nW4|g$kS_N{Dj+%g|;KK z#8t_J=@MCHZf<6pRKTD`U85F9M4XkGm79aqq5uMfzHl^X?fr5nM5ZaTR%jKtdwP9& z&BnC~c4!=%>>1YrA<@HI^7B<14tR}0Ztrvj62P%yIhra{YBR7LWGuNR&7&T=l-jT) zXjqy%Ky^1}>*;B~Y4#;R?iq5<%+1ru%-p<{!X!dCef`k+_7XBho+3+?m(TWt>K*0r zAYT>BWg1eHCP~Xp{Ctyqbj8rbkw z7jIl!vVwyw#GnlW6-$zruh$i3X02d{16Gg`J0`vEkdFt6Gnq`GK_oVr2>HVESX66?`W;U6v_VF)ob=&-jU* zm@GvImdiLzCPaKU8VF!liQqB_STqXMb)aG}GV5|878V${O~d(9WRTF-Rh8?DA)o|s z^U@O5Izit|6fa|}lY&M(h6UoBdla?RJo@~+%a6!Ms(1-xZ8S`@OsugO2pfCQeuwE! zOVGyg_-tV=iAr5861mKTbJl@%KWznKCD=~I2ohW~ zjtQ4-iCki!w(*{V%HkDbWaC2SX$N)??!eUWoJ?O_qL!sF)m7yiHWul!!J6Ti!9YNd zOVz2GoXkvF0$yvMbzzI00vtD>H54OTszkhq?Jz-lW5^^S^9bf%EcsDn-gFQvpJ?hVyteIEbvr;1%;CF zi7pTUyOS=G>sD>5D%64$FyNi_MiyfjT&d(AI2R@K*dES~x#k62a0_^1ETki&9v^`~OE&P#p=oEpHEVNur%Ye` ztp{G80aj(O<|h_G3IYbBK-aB~-YHZjB$yJpSjy*$_}(x8;RyT@Sd=okOED}hX&_XH z@d1BxT3kz_Y=}MOs>Mt|&ZD>x#I#U(8&_(z1^S|_G%dh}>fFjrRcVCF8z*_u1P_6t zR1QnB6o@hD$)#{GKx0ACbPjtCjCe?%L&=IhKjDqiRRy3!nV+A9qWY|TayA;W_L)o` zA_a&)76UufIdB38`4V1e$Yk|;UBlCXq!inY3^o@My2QflY>2}L7R^V{k>C=L7?4l_ z?J{{6rMjwIHEQm8q%>Q?o%hG00Nq&JL6%%0N4~0fbzYWKtgTvClO1x-0qV(ME`gs5 zG0Y?rW)Oi-O0k2MsGfa@KmK;K#bkZ~$X7pYSv9MDPlA*t(_wL1Z0ch8JDX94$R z^SLB<4!i&1xtNIQxAYGOBFJ2a=CKG>3Xv=Y?2C&*Oei42f!R}B$#Y6*>C zMlfb2mSTMFQph_oHemy~H&>F95_Tf4IL}Q{bJ-}sV$ILZ&4TvAO@MdJ=cOZn!J%_8 zHn^O2*WAL`j5iF3xStMk8Ha0$;EECF5)m9ala4~_7+`;hgCs$kmB1hL4xr=2@(che z>7*u=1ew1#ibNWh#}y#n9wmfQRkl{ERcdwmtlTUu>Z&#As9tnoPQ@BjA_P%r7}(te za03ya%Vc&h@=}@frFqBLG=S794N5N{FO8hdG-5Qcgg{8cNXSljq6v&!^X}QHU^IlV zRme9PWiq2~^VF1!SPIca85v?2IqVHGF_&Kv7jo5Gz>a9K1~npz=M=?Y7WOYg}`;VLxp=EX7+oSgjmF!(|fsk$ug zg5A{8=Uf7*Rn#>@(L<`VnskJl0yf)1%x9g1CKZUb(@8FzEzLJ*o}FhdB8HB18;I!^rJ76$bADcVY1%9$Ck$C*J`MZ~EWSd!^4_|2l^U6VDFw|?(mNAe5~gR8i=l;BC`5qaIF%Q) zcJ~5V9tJP17o(0;p@J7Jx#O)&=TDjDc(dQxRr7rbwdTkiqcWoSy(EaAFBevl3wnW=}3wHIaG0FBJ9$Ktqek zXq6^ME{G);1fXO9Ophrq&_TbT7|IB;3}sHPBxajukk|*$&-zeDCP)*oy`a3rEH{T1 zM!B&?kr*Vh0E{jrxd73lB7F?ZsZ&uhH9u1(h`6xjfj38-wh)UaVj{LOW3vNSiygbe z>VV*G!0#|S=J`S?HsN99*SR2pT8LsblA!Sk8WY4y+z^w?rbiM{|EwE244l-$d-7ML z5P=X&Bu4?q0*$ZK>sIPl7HD!;VnW2eQiMGPC|{xPHRC4IKoLav?4iK8b$G%&8DlYN zY&MO_<11x+?AK70Fg<1+8l3=jC;X1&Kmn7+qw_f!qLILrBUI?M+h;up(}d#5g~)<; zs(08r>O>?@0J0qxZoEuFPsS~dFi0XKQmzoV?!~ZuNhZyZ5J898GT~bSzBdz$@qlX! zKzR>(Ei61F(oAf7N(yx#4*@q-L2R_71IdMW)NP;WHCczub8Hb$g7eBV zQDZwZLlI3RTo$tpB^_*^Vo6o2gci@i}O}1Q8L9hUa6DqhMwzvsZ#< zRmBr7Foi2BYt~nn%Ox4vnUyu=Ix=qW=;@yZ%}Y{3a(L|E{IKcE&WXv102irBm28DN z1iXJmFwJQ}1OW{#7 zn#@fh*&;INX0{)HUlw$+s7@ z8T9Ck6{P4+aBNG}2(09<)XA_>LpgndrO3dp4HOpj^EHn3Xv;RA{OEbFYuHQqts@Jkbj9rk?XNdjP{xA)3cLZw?QX@ zksL+T_8FhomE=f3cUVQz}JcOF20zLXP0wG49DF{J05Uhk}RbkYw+vRtsSVz8gH&dn1` zEINNF5=zFsGvl^#E0jJ)C*5-_GP_Vs11)-jtgKmAUZLXBG4moB<(#&3o2G1T_r&19 z_zWQ3_K`klwM4O!ktj6!!Xhms@41Xn$Qc3dC3snxz|v!zt1Vf3-^SJG#?ggH2sRis_4bSe60E4- zH8%2P$DO_&Ym^p?#z3p1%qhP|uU5&iJHgPL06UDB2gWEuKuN45L-w)ZNvk)(PEC~w zqL^26);xUZi33~j)vp9my*4XTBV$BSya6g^0SoZK{?10k7nb6T0LXk2*ng*~GbLmc z1dJ|+H^E_oH7L3m_E2GL6nG#aG3O;fNY9*S6QsPPs;VM47dxRua0*dU>EXQ}PuhVQfMG)J5`uujoqq`0pO14xQ(Jvw|8J{JHMq`)p?s2T? zjUl7)#10}rbk!3PgJGM2Aa?)MfWt#jk2tmvTL_Ke!ig>ThGcgQvHZz>Qv7&h5)T2R zv4gQ=J#p&N{znb?OxNMNAKTZ2pUY=57#=-R*=>CPS$x&mv+umMd;;p>RNx&vCifW3 z#-^VbI}G@E$f)LUBF5bYqp{k+*Ic0as5ct4#-XmansujMdh1t>MAI8a!caxj81^+1 zy9|bDV!5SFhH7=_r-Z?1FvOLT-Jxj6sm?buhOvRa88;uH;U z(ia#E|As3u7%mZp=XV_4ZP+g}8f!U*ZU4rPD35ctx9xcUgwa@3XQ&kDFBlIf565M|DQy1=u1d62g@RPP*}k|G#tDXng6-&`DVN zjCJ>MBBRw`!>1kfG)!*^X^Q!Hy>kJx1aFL;EkhQn2Mf zLAfQz0(%?XDr3E|yZMySc#OKe#`-w*xO}`qJ%(N}zIDuK>2LE4s4f^^3rIup$sN0P z|MUsNzwI-395fs{TvrO?96so2b`Qm*m(HKKI$5i^W;eRQJ$2I9^^QcEPPm2f^wRB> zzxs?-qbZ12*OaT8LgvrTGd`-n_K{`aOrXbj)i@+8QkicI(S%Mxow`J|HP1l5zHB zzJ%JDM!la2aQ&KccSX_{(p+@!3np`oPK8tW864VW>X&)2d0vK8@yy?VDft z;Q`JO!;2-AhxbjWYo6U5DUzlO13v53i1AnFBNM+m-}YJS%l*GHHn!aeoO!>|=lST( zw+8B8c`X?-_ZTm?MY_)lCR?q|h*SmwoJm5buB~(iXj)CV+QTT>UQ$_JSBEm}f=3^v z5p@MZUG>g`l{;#yQJbnFn(QZ=lKl6LFI`?XIn~rx&b(jtlvY-159d5lx3hFd`IbFD*{<9Fll42d)$Q7Mux8s~!=WdBYItJLi?#5AJ%~3m?7m%CQs8 zCp!k(+Aj1EEGR9~l&bXF9h>#LwmtFe&Z1qJmqta+AYuA@=d35LcJ^S_@*ni-_3r7#{JNUwZ7Y;nJW&O6DwIzBLO&X6m-2+#z zp1OASos(}+_u?BzdgnLqzx3ui7mi(MY__x_@#yo=gfR|FSGj&m-J>YZ-SzzQ&%;ZW z2M@ywFBp!#_`Ko8XAd7by8qywM{Bm%uCJ`FNiR?rrK@8}1R^}s0Mhgf^mMmfZN7B* za^u-kmoC>|K3QLX{`}c@&NN=S+Bnc*1v{_>u=Ws0N)bgVDk-QcuPQ06uB|PqtSUmh zM_Yhu7zrO4EUGHhI%(}{y3u|4^7%7o-aPsK8^3wut_OW%oL?DV`qgW196NsEqqCRl z>pyGk7=ZImdjd(CP{5HClvJ-TsoDJK`nv7A_8-`_Z_mLe_U(M)(4n1=?%KIy%l7Ij zeL;~*rv!aBYa(f}SemV^-PhV0&tLwm`Raww>Mvhwy4Kj(*wsAL-ESGPI^7Uapd}@I zrAnhOudLj%?a`f2>^pF1&$EYKc;V>LL(jf&JuzwR?rCjpZoPK(^4UvgFP*vc{%7^4PJVW&{`}eIYnPiZcMVw4e0MAa zj#iqGBZW+hQlr!AbR{_jh$ZL>C|4{H$b^*q48rfuxZOQ4)YaD2c)9-kM<-9dbMl>c zUiua08zT%u8R=KX*IvWybNro;-Z^&u#I*~JO|1jXR3-xfk3Iu$GJujcygolMpHBH?&Oer zG7t!WPZB!wQof9$bkZnw=nBdL%o0jnI(DY%LK#OwZEIr@6g2>1FwoQA+R=Kg>HOtO zpPfB(_T-u4AHij)KgZ8}bgKT;`T7fu7g`&e+d6s%ER$BZGY|o+frH8xnH1;LAQ4$m zRD?BmL1hUZN{R{!a6>f6BT6M$_kunT)bk)?1mP!K7C1R;|B$(7vftVdTTKtSE#RLG zxMQg5O44W&;K*faV9JUL%1f&%t81&b)NI*YySZ+A?Uvdtb+xtYvGJ=eEicfOsB{2{ z^JN?sElCT|pdkU`ThD-dV0vI^U;xyc9p(<)3OqGiED*1S#DLp_rbEpMRR9nv;s^y& znIv7Nf|XP%r3QbIj05UH!biLUHEGxy1yEozjdojyECc;8ep?3|6x3f$%}qC28#|iX znmceedb$V91C!=Sd<6(QA^M48FBW6~arShj3MIK3jV?!9pn;oebsCLEsg-JkDxpxu zl7cl0+|)z}-{cDfP@oMffr-^>x4I{%op^9h2Y?DdyFs!DQcCQwab9UUT8z`?=n8a5 z?iQ5jitr-`g_1g*Hb<*QRk#eBdm;3$Xs~}0il8xH#0`xWoN#h_a&po#jazA%#2?%g z%12=x$VOoCOC%~c6Yuv{=Gi}K7VX_tOV}n_l`7j8&DsyoBoc;V<71U;0H@=$KyX&bP`pty15x+~|#pi04*X_+-y(-0FeD6K8>MzvCjIWZFyY?D>t|Bfu z&W$WI+&p3HReT>O#mdHTB)4b{B3FuRhD^T+3*B!W&poD%xDg#3>K{$8$&pB+GKHA% z*(V5<+nE^YTt4+b9)7+2^!4{HeQ@GJ{a;R>e)ZTfyz+~Gyuo<8r25`eAd^?NM7mq{v>sddFiwI0}>g*N-0?3_tqUBQHGjgJ<<|Gi^>`OB5o zhSuKOgQKH1uMgQx8YdwFPY1|0z{=1K0du})1ywGs&lVfkaYJBD8|6@M=rmg?wC%<_0*KfUd;&lDFi&r|E`a2;F z4RN3VR5C;&?W$F)bMy2SW$V{(dVKf3BM0_<_j}(vurt8WAmETo7b;dvwG9! zt+i!k6-8?|KlH%XHAUIkt7;y2c<*<=`_Mz1)|RcQ-MnM>-iJ1TIURJVS0kv3DCtzV^AsZtm;CgRXECQ4Bj7+8Kd z9X6!gC#?NlJ%a#<4fWq@ZNJrYrJ?cW7gw%aY-nt_c=1Z(UoKuaar*50$A0&_*WY~m z_%S&5xBJn5(TK0S{!4t~)%Q=F`taQ6P3=8HJwvE|cYDz&S$6iyyp^kpRu*sF`@J7L z^UM$aTOR)(dCHHT`@s=7|E}$Ibv0`%))W_^AV(}huno#YP6!;k?N%Vf@Td1yYfo3x zg$tJ&ni?;Be(B1UOIJQ`ymIlvg~ltF&edPI)bvF|Ygc=7Q)gG}=btxRxpixBVsvDv ztGUZ+vyPev2Z0gjx!vE@b-NuC?ch-VAOIuaJ?y#F+;HVm!xv3WUwnSC{>I;IEoiE19EqCRrRmGLH4?MPO*RH)!9{Iu1=Z^m9XaA95{?pg~^=B{q=*K^P z?&+t$_w@I^yZiCS_wIUN(}p!`*TA`o^?AiLYw|SN8fl7Br2wi6Dkda{i8{>`F=UE4 zBFL69Ntv8aqUbJ9s}hUkDy1SjJ5wgl)M&G_^HAiCzbd%3UXzJATOpRq6`1YtC`%zx zS&OqFEe;&fLIi9RRAkON0a}%jq5j^UuFlrxTdmDsG<^P-(;wnE{`OnH`|WSveD(i> zU;c+ifA#p8zkKq^g~raFuHFeZxJ7Y&QbqR4qKY+Z>mJy(@5%2UrDm=FpO2rvaP+z7 ze)Qatr=EOr@9rJjF<7r%t=DQYRY-e-IWHD;JCHOP85%T?jF|fe&7&y29vlSL;ETqF zhKm=@)qis8gAYD9@&51L{N0<&z3msj{Piz?@$xT!d3PZE<*#4<8{?;-4!_#BO-g@)R z-@f|lZ}G;rDSN{esdv5i{_ztZd~oVaef`<9=p$DeZnmN)fknpcbb15OWZ-ZB6_sgn z^{ZBut>3hD>(+<&9(eNUAN&a3^}>&T{$IA<&wldb=YH_?Q%@b(xA(D!He)SWyJ1a{ zK5u27HWM`HP)AKb*v;;6Kon-mHj0kj`b9(I7Z}klUA%bdFK6q|ee&T4Xzb||Cr+I? zed5^h(`S~Q=z|aOMzuzgPyx^0Yl#xji2LaXlQ6`YQFi!O<+dbdwOqo_4anP z-n@0|c2DQ6&fER{c&W3i6R+a`?SMDk>g?_B@4bDyr?>p1_%!D7r@xPBgzDDMJ$D4%^LtM{314~g0LK4ac>nH)u`1dA0Q{!1qM~AT(JDPi zez06sVNr~lLv%?FQs1!%>S-1L8Gw`=20@1%iM9#o5iT2U6bEuEqt=P3DZC2y2%8OF zHZ(d4mm3-yG7k-6XzS@6#8}tU+k;DOZ>OjiI@__TZf)=Ey4`sT2f%0ehgb00@^4@s z7^%l@d5R5J?L<7D+G!}zS7I;WO z@k^<0A~75cQdY#^5TphOJjaV3aD@Y}fHemWoPlDh!KX1aLZARTgMi(}7GQO(k1@JX zx&cf!#5HkX(1NxiGS?&&q%om?bBIMCil+|z{N_awYB%vVN{$g9#DRPn4xEnxPFd6^ z-#y03(1`inEB7xxLx*l-Wn@@jWfNhd^{>53g1_kb*Mrae^j~t(0Un{dx{M9i-yT3T zwfR?XeEO%xcQ5>U(D&|@n!}3nPm+f>8Vo;s#Bg}K;kz5F)Vxlzl?-+p-?gwjb$&Yi zr-bXuHNhsK;9T#o-<|o>d(FT9z4>xD+e**<`I8Sb?lTbih1H9Sn) z&ng{X+bhVg+`jYEf~vihhpKdkp4~sSbNHF?KRtPqflB3T4dcmoKcSZ8#*hDY_Km+@ zXc4BZ-~aRUtbaCatTwP>lbl=yBb)c}KFw}1t55y&oho%z;W#O*UR%+9t_@Ne$BchE z_RBY#J~5s?d9Ll`<-c(pk*r~Bbu2HZ`mujOt;PL2tM_ip`}BmWK7(^lhDmgkkz zosR6(Yt2^OGgT2{9eQF-xPx{6VmvzVX44(>Yn`W!W1hv-wS>3q{)hM8f8^nCRc>jK z*zWf-8a{ll`Hq-3G8P6>N_6h3&DV1M=I>3P9)I^rU!>33JZ23EdBq(LMOk@;T$Cf? zkTy>jY$?}dg|+qmg^m)q9*KaY(#8TJ9Y zBQe8w(MyUelX}DcU5EB79@ySBW3HC#4QB@$&tCrIW?T1f-|nDISs`4Q4n5vX zPtePu1#OSyl7kBSqwWnK@!1 za!Jw2caQzn`0h99lz)G%tXzA4ZZj(q86IdsAjA6mH(Cb(%XN*n+K7^Twvbe>ui3b< zqM&O1)^f76xS$jYp`vO*)X5*4ndxc1)BV@q)VFnfQs3Hop%WEX4#$Yy?Lc0i=yN#4 zd4G(TfF8~sC zadL3vYQyr7_MH)Y1@4i_7>8U?|XngbJ*-t+F>)$>dH23(UW6&6s zraOr=TAam4rWz7{yd;g|>avF8GhMxt)-l8mM(k!kEs+G&l9i?eC{CGGi1PK)?0ijX zX0}QWl|Bd`So)g(-rhaZ)Y#h5H8o~(MJe?fx-gX`SWJ3j;qmc1-F;ncoz3lSBd&3e zHzC&*RuvW0Y}{V6wmQGCvQmK>fpFMk8|eTZx#jv_ueEkvZ|NMI@$%y;QEt_`b?XZC zMWy*!@}z5K($snF>iNd=f4*@3>|bwQssH=+E&xM)5R)Qxh3mJhdvM?3BR~52&wldk z{=@(La9L5QIu%kSj_#hDt$)4vDYj;(|ME0b+Inn}ex7gnHYrcQrM3c6CE$ z(=rZ8ND$&PphLpq(D`!20%NhHKkSB(v<;NmraK*X#)rKjg3eDb$Szx7w`C+Y}# z&887Y1UlRD%%XK0x9{8YoqsxX^k1Gl^wj=G9;&XYZ5Z_z!Nek+jcOV} zs(_U9c+gRn^HWpB!Zb2XinTkRMDiAras*o_70L5TE7n%6U$?fpyhxu3)ot6PxwGYB zef_DAPkngde0^hcdruGI&S3tB$_0r0!N|&&0^-V8jDhPo z%m@Eqeql*jQE^FWDOPr6VC_JdRj0|yR%eQ!`o>1}jL&U%Sh{XD{1p+4_x|U*$KL(p zC!e0XaIFQQay#lA;!wh2L%WJ#33x22Sfr3EbFvExODd~3Zrr%8?!Jv1H`J7s>2tHv z#k@Ez9*TOL*dpMVf=i8!S;i3dpPC$-#D8HPEVImm1AV=H-Ccb>-6k`>1ME8pr3%w? z^9qVet1D}&*RS7Dx3;3HW?fBrSxIqzu11OS*973jGgCJ6$Z&T@S5F6we8<#HE$0S$ zO#=gc!{#XqYTB(vX9%^R4hPWmZE<;kO~8r`Ay7Jv2B94qMjzDEp;8$*r$wk1CLrL1 z(m~+mrE(>h9kMmKc}fKYc>$?_FumW03O-!>Bz5g}h>1I?b@(KdV}ODNX5R-zD1w1j zVGW*}pI=Z|TwGjKSeTcalbe&J(PYXYE+-_RG6iIKFywaH$1IRf@9Ao3ZU&Ll#jAhA zPNAu_>&~#v6(*p02G=aDK%GhT`gJwy*H+?BRar$@c@c2$x@?6)%0neK8~QQvkk1QF zP}{J{bO%})t<5*DH~szZjn}R|_62oy_uaQ? z)BX2v*|Mo_U3F=Gehzle@DAJ`FLg;4>mVA}(RrtWfD7c}?)YFH@;o-qS%dpvE8Xg%o4VuTs%;S?|Q}!8;kE#oy(^&#If)s@3s%*r@ z@(T*!`WWc}WGX<-Xl|xLo{G_ej?gv`0HL5C=>?aAx9w%*+VN+!=fKkySy^x)U11?E8;`o&Ociw2 zpsd#;Qjv*THGN(l z%&0FaD#*{ndK2&`GzOnPUHx zh$j|-=LQEzJQ|E(Q-*3?ubbMgx!kyQQ?Lgf?VurXQ`U&a=yV2$1XT)z36+^>uLk{7 zm6b)!ylI)Ksi^`!Bo5iI2o>*HTm)YtzQ`Y@PV04HBM2|Bq03G=rVy^2a?fD5>W68< zk!Tbd8U}QYghEW-Y3Qa(B_{9m^we~@5ceJoP;5v(qN9QR8iiB-XxQU(IdSXU5R-My zc!TH*{#XoXKg?%z4i7@g0*p}tp->={k|eMTJe+`qX&YFc#b}h$bfTD>;<)O?MT|Ps z|Kkvp0~K^E49pd^%k-kq7STAjYsP~s@cHpufLxJBN=-)}&d)C@E2}Io1NBK62ATZa z+-!vuK?`Vo`8?1u0(}Ukq?V@Zt=F5V18b^|PEeCtz_$yvcEC9pP{C3tv(TT4N=vZ= zKn}Bt+US>->h*eEPL^7wNQEBNWBjE2IFb(wFfkz{xVj3K_SOLJAL1Ha}vx6xl z6*kVrSWpI=tlzltzU5=XIt*mxMfrJI%2W|V)nb^&VCcc#JDsRxZMk_9bd)!n+uA!& zNH;iwIm``)llUTy%^^i1K;`9>8PM$XRB37|;Aa>K_@sym6i{HxyAK#HKqdl#dJc<< z08s6RV?_@*6<);9OK{5I303;UN$qOvQ3Y zr2=hMR+c84IxrV$G7)Q~h9VxOPfSOCuV==A1*HYSXX?(H1_v=7TgRy`4kb$rL^KwM zhnW|575gU~xWCjzkOC@ff$oiC5x5F!GL0f66pcc38D0(N#%F0z+v9L}JPse1iL2!a zNFJci94g3xd?fl61_#V1pk)Q20d=nsx4{fUT@u1eam=gKfhikjVzHLbg@6gx0*DJ! z%L1`@*`OknlcPl#1~9`@DrH#DMXAn&Q)37~NXY4;{^2>!9t`2!%MHY-5pltJ*~?KJ zgksP*{JneJeUXaIP&WpxrjEPO8LTswFF6(sQ?^In4O6#(YBY}c@`8eD`0_!ui8_|A z1?E~l07gkbKb;x?@DJ+`>cE>AEPN9WHp5loQqdTUA76hh^&V;{p?-dI+&%a5cCjL>=|Ewf->jb4^iLv^{Z$V)fC)8>T+-_d)D%^<;(iImG~s?#j-&tqu}N) zA8e|XUs;E83Cbs62}I16ofGDPfncWP6H>Oq7g56>b%&R|gbJQfD?IcMsZ>hcQMed} z3+jI2Tp-%R2z)m>w;Z1fQqwMVj=RCQ<#WLC`EUd3SZ)-WwCoW04qRT6Y83w9=eI2Q zl`W_r%ch{-h|Wi~9>X-6kAFCDE!08X*>64!Lr`9M*DWcZ{Q9779U4H*e>f>b^WvCQ zDQ|>3I`1Bor~9yWTGsia{1EpY_Z&753aKz5e&B4BPg7&U@_DF>ShnkOOQ;9<+TFI@ z?R%6tmYYf4_MN*^edT+1 zEk$*I>PVGhSF=0@P(uJ*X4&TGo0P}g9b8=0fzk%_e+-}5vFpgzQ zfAxs}E{_pk*@k)(PP+Wk|MB{=NtR7Z-C^p$t^V5D|F@B;PcNVJ?h`zI_1$-Gc;TyWr;M_E0e2sk{rn$ZzI-)b ze-rido0HxB`0}T}>LAPa^Q+(UO4e-7;qiiC)Uc1=u!|#%00W#zftfYM5H=m`?sIle z1p2JJ9KzZcFJ80ep8NMca_{DqTT5uOgMD`z)4@o2{`Beg)2Ba9@`SbeoE3T=@1AY< z78Vnvj8`lUg3R>RMAUxk%P*4*ravxS!Q{qd)L;kZ~P3Q+c$XeR%0K@h~y|ho5~D${Q=u_ zQc;o~uy(iF2CbGsE3fvkdmk%=v_^GK2Ds2?W{R1!eHSl&eBt!1zS*#qk;BPR1ZR`? zZ!Nh;Y_~=?W@cyV)9vGy+n?U(>z>}2v9VT`B!aR9X)(t(s~7XUUtTy|v%jQOxk# zXPpB{`*>!KEIWPHZXUGUiHMmDo-jg;Up#&K#b9@td2`7jO0 zNwMqZ<|R#YJ(b@p0m%v6bxUVoxSkEM6cx1KRp z#3GP6nrMz8UnpmnH(K=xQw_WBgL}}9HBH`?eK&=q)D)QIhbh}K3 zDP*`Zad)7%YwF38Ya9}(P?)Or{P{CAr&`Y(tvRZxFe#SFpbJL6+11y3_b#>;-Pw&j zQ3(Z_rb@lO_^x+JmPW&C-rk#2iSviBqb2wm9gdwk_rj_3#c0ht;r(XH zH9mFE0Vod+&$!ZDnNBDx#&+BEn5+^+r$QPfmq}G}H@|Z`f;*auM09i2C0I+$+;yne z7=J8?MFRRm^(I}V`ewF|5R+<>m4r!5uPcjti-vsCn{B( zwJ5^j&~9*PJRP0c431AR7@k^7bc%$PirCV`u22MTgL=RFimS}7txTkmu%fuah?nTk zU^9-}9CAk{W2j|Edc)`U_C4XqDi2l4(y^cnv`G{Z;F=1wxuG-VW4z7Ppc^lNeB#WO z9}1~^`=;Q0;btO`=-b6aa0U-+G9NvE{)O5XaD8=RVyt%nHX1lycbCuAd$+G|6Uo#y zCMemXtE{egNs}uS;`$oIEDO1bfX_Q|lYM<+ffB?hZX!&0YoQWsvkWCtTpkp`5+<^< zHAi)oO0C6W zx*3iIy}L4DA|d3hV@RXms86(>Kc|ynCB+GHX6D{*3O0oNYiq%7x1(>_ySkfOgL8ws z9VQVMJ5z}Z^%Wp083q+ky}ez`lTA*-)%D$4+U5AWAQ-G|tTml89aW}5B$WzGh8-?R zgrhRf`f%UPt{?@6L(@;zg2y(nT~i61Gp__Qh?NVF%SAyoz+FJ%&e}#|S0?cKp9o(% z{{r?Lu*W-gdo#VXk>>5fHv_BQ0O|K`Q9P{njBE#!ooXsU;oL*d?Ftx_+Fe_la4d=Z zh1Q9^>&ZD!|4j4O5p!- zNpXq(1n6yrVpFXzmO%+OK*zAl52^Zz+kJoEd;#{Eu=D4tD?86OAIe^Ge8&Yd$W_X~ zTDXS4SxW>5Q!0@#TaZAzxz$P}D8b;^9Aw)=n_I!unlg>45fc$aqnk?;-V$alsMj3T z6l1cjgkm?mL{;c3v4lpMyX3uluPYE-@@_`6HN0r}kO(_}0)OfJOO-L+lbtA~O1ND9 zneINnZ;A2`+;#ZFSn-}ec*$h`u}%@rURxvmP?vjS&EMDO_Ie$|(RD`lBww$~K6O~g zaBHjK6(SiIzMS`aQ#wHc6LFtVaQ}^W*Y9wLqu$D5japX;JmNmt5T4N;1>6d_f`oT! z&E**D>KgWvo9n^d6D2}@e(jmo^PPu8++q~n@Oizt!5O#L?RDMj?)najEFP^q1>CGH zDL>O%gQC8vRmW76L95Y)FTeTwJ+}^pg_W{hC?MZ_{slGUJ&EjM!tAvak6c{~KpBi! z`UNf=GxQIScmI8Sm$$3amz0#?*zPesR$Hk@vicGkPyJkKHPUyxYXDsOfO~BzfkVY{ z{rU4J;K90LB;y_xuCFD$17F>Cc^&Ds-me_D{ZPLiTM8Sz~e6DYzGNG*X z+=+4owUqU>3bnqXgb_xg3yxve#O>j)y1V~QO!-v}Cn_sD&Yx*IalXFuJQNX33xZRQ z3GnLOF84jwx%b_ZRRG=RYxE6ZZjNo`rq(9D^QHt?dNpM{9*L zguymKf=pv4G!T6twLTjq+Hr+YmT&|dyi1GXFtH{T4%~X-#|qgNj^K#n!dS1%?drPefFx^P?{{AJAz3z%)!Baj{LxBK zHLril;Tm%|9N+a#-0kz0Xe#q#%jD7g5_PKyEChOjc-SOQpm=k-VZ(TTn^qY>ft*ltC>4zJK4uj{)tFA0_k=d5mSKy_YWo314N zWEWMS!x$vFg{=47VBft!&`qU588L8O0{oB?6KpV%Z*G3~WGS0rgoh86)K;_~J*+uY zg7bo4hL&A^*Ox3oz4u}+O32OCohxYsUI4!u&eT4q*cI|7+`YH=h`xDm;vVC=OUg=` z+93uyf9BMQ28^i&x*_{b7`9U=>`62dl`#v0w_R%sL76N9x)9yP+Db4zUJP?7IoDRJ zfvmO=-L5@ZcJ*~l40QWkefPeTVfqs)3^WX`VG;5V`-g@hEm&4Aw@@Px)fK{WxgtC8 zP$a-m&7lOfO>I7O5BE&&X&~}%H&YHmZ2UxAoc!~f2_ytpSZOx=9X#HhQ`j$ z&enD{l#s~fNySnVdU1WkQ*i7Vgb{g9|TiK5Fuv3qy zvAg%j98+I*&(d4b$z(J>H9hj`4JqN{@yK?ZoZY16 z3L&ctGeuHv*m$1WR3a*#SB3=7W9mcM&r6l^Y#x_#LvE&R!RBV9-I$jf7g7G%8FxIe z68Hx>J4G`~bL6H#DbgNbX=!??wZ@?3##hL>IclnZcnTt*uC9K{-bELtH-Fe^Zs_cM zsk5`L^P~wfKB9+H-M!rd{nK4tQZA(Pp`vjTav~s8A!Pf`YZY(KW{@Zs%|2{4YD<+U zQ;Z?%;YvJWC}SXT=lz+70XTHgduuy)GmTsllX$*cQf6)D|xS^~zfF zn1wCKxf~gr?w>@P3sX~h+0;KC2-2mkWg;+5PHN|Rk z*Ic2|a0+OKtM$-N+Up?eBk~X2>Ys8?+`QS9C`41!kxbqZEKNPkJM=tcMXnPhRsP}5I zMUf&d6`7shmZQzh40mbDJvG&zNUuCZd7QvBxot9Q1evY&vmo~74ueJ$+@Gza9_hC^wF9R7NkT6&m4(a5x8YNo%tpH?OqlKXs(;fHxzY%?#fPFurr zQY%KuX%NLW)Z(;z-Hx8F?l~Z9A+nWWiEeM|Y&@wobe0unZ8B*lFg!KPK6#28$yLh* zTckk@x%%@C!OH}NN=QP+B&e}5DkI7>95Nhg#nlM@DAuVJZDlqoYWn_t(3vkCcV{Ct zg+DaZ88q3Z_L|OCgQiT=4h!|omHS^mcsM)tB^=#b)$1U0IaFTjk-Vd2cwt^E zDy%!A$pux@YBnRY52hv~$^PMo(c$~uarZ=j*Ki~dsbGl)vshoF&C4?%NNi($USl=S>(7q`cy% z`dJ76wY~cmeTZxNNkg8Yv*!7l=8lG=?VU#}w1Dfeev(Ddw!`6`of__j)bI}*HD!hh zquKx{dS2RKI*==91bPl^Zn_8Ha40pr5^?u#NBu(&iLN;sk{yDH29tNHNt2r=I$j}S zB8ZyG1l;{l4QQ&j%Prp0lqs`vnT7aP9+str%C3t)hBuPFu2oNO>uQQZn9Ujc#KUO^tyZQ<(W%akrXSWc z)D?=vv8|c|o7BQmWGk-_aRIlm0r0~Exd{f|n2nOuN@1Q7>Uc)zI5!|Id+wArS7bN@ zBo{W+RDdBnl)E`K`mgKyf_yo`+QxVsJY{8>#2tJPVEm7y;TUSL+|YD!w17%Uym6Ix7~L8q+^;iG-w5( zS#9&FBZUVFHClBZl}Hrka;N5E1~%b67M~g>s7x-3#vqdyHxQ!!u~b($GfPHR;+s;i zHVw~hX$=Q>CL`36%|&2NMQ;0-y4ek+8;igmhvL~BsE1W zK?4Z} z)Ew+l06;q$4rzV}ZcB3j3ax0t0?z@KX5btekP=Tm47i8D(3U=L$TI*LO?A(kOnHU_ zn^TjSSTWZjADPdy`zE;@l8?KIg8{L`kWsv$a(tKpCX~COmxeW_JW& zcx&4|{7@vCim^)7UcsWYGk24gK8FM%YRbWKk417fr4jhYCc$B~mYuCJnOY5|8hDq# z5Hx(M+YPUKZT8>lddRTm>0w|dQdp?W%Inl1o~c8b3(u`76QfcMcXRA!H#yUPXGy+E zZz1n=B-cGmo0{s?ym;r4JOekIj4XI(BT^JyT6rkoYIq`6pqebQOq2cG0$72r{;{da zp05K_lhnh)Iq+NTRR=#WX}0{E2N;r?8~bu#&s}wOO~QBTQwv*recBsL^^JLjS|b#= zW>$tB!^0U~d~@nSfZp^E^>q8E(1CPXUR-R1<8Y|32Cp&K)M<+I3VE5tR%rO9V*o}g z%*}8&+4wh7&s(3X*2XQ$P^60L!IQ+u_9H^Vb0bsU&heA!Y^7#m74hzmpb5{!MzF$C zU1`w=DhftC6B9*FS=2YND5D6C*|; z%c+27k|6B8eypv!y#=2mwkIbF%vEwDMi4}FFj`w;vD8aONBB`;oxGtcvg?N4!3~|p zV#(6?5Q!|UsY;DKh>sA28||-cvD6zxBX?Kh6_z4H)}#{#A(Gm9i>0Vx-8s0stv6r| zkEbUH;z57NQfFx?!Dfa-3z(&;z%)5Z5IuuLfu+G>IKE8~ON(%ON*#cadj@-eW{ahz zpYZhf>MU4WRsaTGC6J{BnmGhP`5sx?D_XEIf*4&SD)xFqk6EI`B5$%Fxb=1~S zlpvhjS(bJ~N0l9#o!v#2;}(l~fFKs8EtY}~%LcSQAUqZsbj~A)6}rUI(r!5kt#B2T z8!eXFAaInhSgP7B1<(ewX)1!wM+jnMauq(dScdmHQ%%s?u?2i2;5E$#OB1yE2;!6$ znom37gqCNo^V(kLM-6Om&RB1d&;!dYmchMdGcelH5bPcyLKX}BAxj-WJgSA;7L4Z` zgppxv3rGd7QwVOWBy$82-O%N%z)l%SLn^Tws?(w9bAY|+VtD|gdUsD{2 zYciw>V%x%ktzeG~zFY}o9N~os0)s;&miEVNXTmgR>1e4{L#vOSwIwyfwxSSl6zV=j ziN0Evp-m}x20;{2(5g`bIsz6Gbmjm-a6gv=0IMpx-%YTrwREKSaEE3z7E@KjBY*+h zYLTt8okvGujD`jwF)_H;xr(;v0y zkRQ=A_F%_Sccf(4KDu57a&0f7+0G;P-N!BUExf@<3bVjm%@unvm>o=7+E1xGz70uJ z6^K@wfWCcW&N2LKZ7s)@#EUE-pDGqfz=NTH!DL1cJcx5rX|R|jv(VV>c8+bdSlUrK zTU%>^xoTAaT{|&76x0`)_qh}0*eRaYQop;$XW!hgr@R4njw%f;Ey!#s**8Gk?jKyY zj}&Ol>d^jbtV1YiH^uu2Vwec{>=Sr}5zDRzX(!7qD1Mt5Bl@VpQJ%ECk~TN#EpkqE z{SG{Dlz5!Bk06bqsKrulv8)$a@X&2yh3MYs?@w@w%hi?=LkAYp8`p-2yP!8S#Mp|w z3Rnraek|0XS${W0*jKwpqdawWgQe=M1)CM}Qj5fWf>>O*-M=W)AF;6bjO^2(xmo7~ zF}ef{*{=d^Hd-vA6}0MKv4dnOAZA)~<2PtZD)9x6>m%0GCJiQ<0IG+e6!6f8gR}u|Vu5?CYFI?kF*t1KePn zv#0GnMEAnvM%3*goVyxO9cWGMX=@)5*jXHP6SI;Aw$+l2fC{2_mP$kBU}9AMJvUU_ zen1P5?S8s6J4meaSepV6Uw8J;62qg5X-ygtwxSChKr|?yeonyh?N6y(i6tVZ*-WIj7 zcKU2|U?9-_U}h|Yf}=fs!Bo*%mTKJ!;aMBm@p**XivxXk)4a1C(Ag3l7+xQl_T3NB z)X2a{C@MFx(lS3LyisQ)8r{zai!t(Or=gZ*_0H{)l^G{JyAxf%OH70k+1jEeOMBbK z{Xk-I9a7w8ZS)eJrC?PB3!2oh8@}#aq_XM6eZs!z+h{0hYwBo!8VGI$H+F;ta!x;S ze{rn53jC8L>7znaaFND#ckUCTK2KDyG#VOo+mWU9Ej~vs&*682$8i=N(Srd*erkO+ z^)ySe%^4)_yGQ79Tx+zLvpB0uaSo;_C=h`ZMn{ze1r4X#)6wK&fR|N~C)|aZOwT4I z99hAsN{%qNu(MyI#Y6zR+YeTAB$(OKl0vB^S}51ZI9WqrfLzi21qDY=RY`JI7N26p zRYht!j7+Qx(^$3T^lnysDYRc+iDwHzlD&_TseQY6l_pCVU0YYH>&rC-y)Z@;rIl5d z(~#LRvH^+c3WU4`f*4o`1+sE#%?(1xJiS$+F0VBjSgW!GUk!t>(sOInqoRVGl7g%h z;A!%aJDydfHSbXI70AG-Z91Z7J5OwF6_{Hr{6~@GI_#LKm3%O!BhC#fu2eTzIKf9j zi5x4gt|%I0;l7fRfjJQQ{f`n*P@|l~11I7d4lb-qu~U|PkzAZ+3CpP#{xo zJWUM@O*pB2k5hR^%*nNd*}QsrmQto!AUqRxNrAi=H)9LI$D%4M$%%%N)3cL{SvaJl zHZ*WHqH$3*=P}BX2YTkbo-C-lBtKprT8LyBifKg0SDkag#cfV#ai{3WP9*p!UB!=c z3ikU4sKs@RBSa9-bGEi+#aU3xHx+PGD52sfsYFSeFe|-~6t2&1V>=Hf{1lHDNDBGz zts^hAUzv5#^?$mbP z`W#;;i3wxc`*XR8`QDw{LyIIUB{ceOi5OmYoP~X)Wbdx~$|xzt@>m z&L#PBZGdn-l^V5pQ)SlDm}g~8{&Y@LUIpHEdP8f*wQ{uPb4EN{LMp3BZ*UTW>%}Jx z6;*29;`HKDK*rfHm`|qr2+wX)tp+BZ3XFI>k?aW6;oR@-8;#=)7*s`;tOtBcK?wj{ zQxF;^CepPAr6$eWj`%~Nb$Nm(%t5}1;T2_zzDli>Cl`I5P_`1u3*_qyBhIv`MXkr= z+1r6p*EY7E-hLFCg%>gR>nqho{DO39Wh5c5NWrQ!^&HZ8)XIbWB1VGf+~2q8s2I3j)2RoGQzQG6dd&NHBUp2Cf9;d&n!RBSYDx& zZEa5vZzwC$>x&!fqF{eOW7d`wNVB&?cbDMHjgZg1z7cmiCFKnbCT-r+jRzxJvLfNC z_bC#t+x;3#gSNapC$&DYD9=uLM@K>%iBac1s5hxs7etX~aX%)EE;)lc{OGW=xaGJ8 z5|gI3sA$gq$h3WOF%cYc%d4R7=8@to6pd!V^IZ3-?OhuDUc<>Mjb6o1r&5yb;9X+W z9i_(HIpw&qs!pAi-d@kb5`n&v#Sqj-4B@(Z6IchngtIM)2JFyzWnpZwKwoaIJ!QZo zSxLSux-d9GEkSQyQANYaN`tltZGwBJ7JoLtxs2Xc;|G#gE) z^rDT&fnkW&iT>fa{YsU-y!LGES)+P;X>Or^u&=v&$Pb;1t7=;sPPQ3EamwApM!N%( zbGve7L-lFahm`X+e6x4^x^It7uRu3vPa10>5IC#K z3XMRh1o76KhZah7O-*KY4C$5|f*iIvG }weJPimLhC-asZ4g;YkLUI6{-91BPg8 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 q^K>iQ>!tnh7 literal 0 HcmV?d00001 diff --git a/lib/apex-audio-system/examples/AASExample_c++/Makefile b/lib/apex-audio-system/examples/AASExample_c++/Makefile new file mode 100644 index 0000000..d908cb1 --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample_c++/Makefile @@ -0,0 +1,8 @@ +# AAS Example Makefile +EXAMPLE_CPP_PREFIX ?= AASExamplePlusPlus +SHORTNAME = $(EXAMPLE_CPP_PREFIX) + +CROSS ?= arm-none-eabi- +LD = $(CROSS)g++ + +include ../../make/example.make diff --git a/lib/apex-audio-system/examples/AASExample_c++/crt0.s b/lib/apex-audio-system/examples/AASExample_c++/crt0.s new file mode 100644 index 0000000..a4a092b --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample_c++/crt0.s @@ -0,0 +1,781 @@ +@******************************************************************** +@* crt0.S v1.26 by Jeff Frohwein * +@******************************************************************** + +@ - Modified by James Daniels/Apex Designs to give AAS interrupts higher priority in special +@ "AAS_MultipleInterrupts" mode + +@ v1.0 - Original release +@ v1.1 - Added proper .data section support +@ v1.2 - Added support for c++, overlays, interrupts, and +@ far calls (__FarFunction & __FarProcedure). +@ - Some ideas from Jason Wilkins & Mike Heckenbach. +@ v1.21- Killed the dumb test bug left in the code. +@ v1.22- Killed dumb bug "numero dos" in multiple interrupts routine. Thanks Mike H. :) +@ v1.23- Now correctly handles zero length .bss section. +@ v1.24- Loop back to start_vector now works if main {} exits. +@ v1.25- __FarProcedure now works. It was missing a .thumb_func directive. +@ v1.26- Added missing Serial Interrupt processing to __MultipleInterrupts section. +@ Added __FastInterrupt option for minimal interrupt processing. +@ Optimized __MultipleInterrupts section to save 4 bytes of stack space. +@ Added __ISRinIWRAM option that puts interrupt processing in IWRAM by default. +@ Options passed to main() or AgbMain() are now set to 0. (Thanks to DarkFader) +@ +@ This file is released into the public domain for commercial +@ or non-commercial usage with no restrictions placed upon it. + + .TEXT + +@ Comment out the next line ONLY if you plan to never support +@ multiboot mode and want to save a few bytes by removing +@ multiboot support code. Otherwise, leave it alone. It wont +@ disturb code designed to run only on flash carts. +@ +@ The normal way to enable generating code that works with +@ both multiboot and flash carts is to add the following to +@ your C code in your main project file AS A GLOBAL VARIABLE: +@ +@ #define MULTIBOOT int __gba_multiboot; +@ Then use it like this : MULTIBOOT +@ +@ IT MUST BE A GLOBAL VARIABLE OR IT WILL NOT WORK! +@ If this variable is not defined somewhere in your project +@ then code will be generated to run out of ROM instead of +@ EXRAM. The value of this variable is not important. + + .equ __MultiBootInclude, 1 + +@ If you are compiling for multiboot dedicated (will not +@ run in a cart) code then uncomment the following. Normally +@ you should leave this commented out so that a multiboot +@ image will run in a cart as well (by copying from ROM to RAM). +@ +@ This sets the maker code to "MB " which is a key that +@ some emulators look for to know to load the rom image +@ at 0x2000000 instead of the standard 0x8000000. + +@ .equ __MultibootDedicated, 1 + +@ There are two methods for clearing memory and +@ copying appropriate setup data. The fast & bulky +@ method is GBA DMA copy/clear but some emulators +@ do not accurately do DMA. If you have an inaccurate +@ emulator or want to conserve ROM space then comment +@ out the following line. There is not much advantage +@ gained by doing DMA copy/clear. + +@ .equ __DMACopyClear, 1 + +@ Uncomment the following line to support C++ development. +@ You also need to name your main C function the following: +@ int main (void) ...instead of... int AgbMain (void) +@ Doing so will cause ~5500 bytes of c++ support code to be +@ linked in with your project so do not enable c++ support +@ unless you plan to use it. + +@ .equ __CPPSupport, 1 + +@ Comment out the following line to disable interrupt support +@ in your code and to save some space in this file. + + .equ __InterruptSupport, 1 + + +@ Comment out the following line to put interrupt support in +@ ROM instead of IWRAM. Interrupt support in ROM will slow +@ down interrupt execution and has no advantage other than +@ saving a little bit of IWRAM. + + .equ __ISRinIWRAM, 1 + +@ NOTE: Only ONE of the following 3 interrupt options may be +@ uncommented. Also, __InterruptSupport above must be uncommented +@ for any of the following to have an effect. +@ +@ __FastInterrupts +@ Uncomment this line for minimal interrupt processing. +@ +@ __SingleInterrupts +@ Uncomment this line if you wish to use a table of function +@ pointers to process specific interrupts. +@ +@ __MultipleInterrupts +@ Uncomment this line to allow multiple-interrupts-at-once +@ support. If you have several interrupts where one can +@ occur while another is being serviced then you need to +@ enable this option. +@ +@ __AAS_MultipleInterrupts +@ Uncomment this line to allow multiple-interrupts-at-once +@ support, giving the AAS interrupt higher priority. If +@ you have several interrupts where one can occur while +@ another is being serviced then you need to enable this +@ option. Only for use with AAS! Added by James Daniels. + +.equ __FastInterrupts, 1 +@ .equ __SingleInterrupts, 1 +@ .equ __MultipleInterrupts, 1 +@ .equ __AAS_MultipleInterrupts, 1 + + +@ Uncomment the following line to disable sound and enter an +@ infinite loop if cart is removed during game play. You +@ must have the cart interrupt enabled for this to work and +@ __ISRinIWRAM, above, must be enabled (not commented out.) + +@ .equ __HandleCartInterrupt, 1 + +@ The following prevents IRQ stack overflow by switching to +@ System mode (User stack) when handling multiple interrupts. +@ To force use of IRQ stack only, comment out the following line. + + .equ __SwitchToUserStack, 1 + +@ !!!! NOTE: THE COPY ROUTINES IN THIS FILE WORK ON 4 BYTE +@ BOUNDARIES. YOUR LINKER SCRIPT MUST ALIGN SECTION STARTS +@ AND SECTION ENDS FOR SECTIONS THAT GET COPIED TO RAM WITH +@ ALIGN(4) !!!! + + .GLOBAL _start +_start: + .ALIGN + .CODE 32 + @ Start Vector + + b rom_header_end + + @ Nintendo Logo Character Data (8000004h) + .fill 156,1,0 + + @ Game Title (80000A0h) + .ascii "AAS Example" + .byte 0x00 + + .ifdef __MultibootDedicated + @ Game Code (80000ACh) + .ascii "MB " + .else + @ Game Code (80000ACh) + .byte 0x00,0x00,0x00,0x00 + .endif + + @ Maker Code (80000B0h) + .byte 0x30,0x31 + + @ Fixed Value (80000B2h) + .byte 0x96 + + @ Main Unit Code (80000B3h) + .byte 0x00 + + @ Device Type (80000B4h) + .byte 0x00 + + @ Unused Data (7Byte) (80000B5h) + .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00 + + @ Software Version No (80000BCh) + .byte 0x00 + + @ Complement Check (80000BDh) + .byte 0xf0 + + @ Checksum (80000BEh) + .byte 0x00,0x00 + + .ALIGN + .ARM @ ..or you can use CODE 32 here + +rom_header_end: + b start_vector @ This branch must be here for proper + @ positioning of the following header. + @ DO NOT REMOVE IT. + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ The following reserved bytes are used if the code is compiled for @ +@ multiboot mode. It does not hurt anything to leave this header in +@ even if the code is not compiled for multiboot. The GBA BIOS will +@ auto-patch the first two bytes with 0x03 and 0x01, respectively, +@ before running any code if it is executed as multiboot. +@ + +@ The following two bytes are included even for non-multiboot supporting +@ builds to guarantee that any generic library code that depends on them +@ will still be functional. + + .GLOBAL __boot_method, __slave_number + +__boot_method: + .byte 0 @ boot method (0=ROM boot, 3=Multiplay boot) +__slave_number: + .byte 0 @ slave # (1=slave#1, 2=slave#2, 3=slave#3) + + .ifdef __MultiBootInclude + + .byte 0 @ reserved + .byte 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .endif +@ @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + +@@@@@@@@@@@@@@@@@@@@@@ +@ Reset @ +@@@@@@@@@@@@@@@@@@@@@@ + + .GLOBAL start_vector + .ALIGN + .ARM @ ..or you can use CODE 32 here +start_vector: + mov r0, #0x12 @ Switch to IRQ Mode + msr cpsr, r0 + ldr sp,=__sp_irq @ Set SP_irq + mov r0, #0x1f @ Switch to System Mode + msr cpsr, r0 + ldr sp,=__sp_usr @ Set SP_usr + +@ Enter Thumb mode + adr r0,1f + 1 @ add r0,pc,#1 also works here + @ for those that want to conserve labels. + bx r0 + + .THUMB @ ..or you can use .CODE 16 here +1: + + .ifdef __InterruptSupport + ldr r1, =__intr_vector_buf @ Set Interrupt Address + ldr r0, =intr_main + str r0, [r1] + .endif + + .ifdef __MultiBootInclude + +@ *** Multiboot Copy Routine *** +@ Check the Program Counter to see if code is running +@ at 0x2000000 or 0x8000000. If it is running at 0x8000000 +@ then copy 256K bytes of it to 0x2000000 and then branch +@ to 0x2000000. +@ The reason for all this is to allow a program to be used +@ "as is" with an flash cart/emulator or with an MBV2-style +@ multiboot cable. +@ NOTE: You can also detect if this ROM is running from +@ 0x2000000 by checking the multiboot header above. + + ldr r0,=__text_start + lsl r0,#5 @ Was code compiled at 0x08000000 or higher? + bcs DoEWRAMClear @ yes, you can not run it in external WRAM + +@ Make sure we're in ExWRAM + + mov r0,pc + lsl r0,#5 @ Are we running from ROM (0x8000000 or higher) ? + bcc SkipEWRAMClear @ No, so no need to do a copy. + +@ We were started in ROM, silly emulators. :P +@ So we need to copy to ExWRAM. + + mov r3,#0x40 + lsl r3,#12 @ r3 = 0x40000 + lsl r2,r3,#7 @ r2 = 0x2000000 + mov r6,r2 @ r6 = 0x2000000 + lsl r1,r2,#2 @ r1 = 0x8000000 + + bl CopyMem + +@ Jump to the code to execute + + bx r6 + .endif + +DoEWRAMClear: +@ Clear External WRAM to 0x00 + + mov r1,#0x40 + lsl r1,#12 @ r1 = 0x40000 + lsl r0,r1,#7 @ r0 = 0x2000000 + bl ClearMem + +SkipEWRAMClear: +@ ldr r0,=AgbMain +@ bx r0 + +@ Clear Internal WRAM to 0x00 + mov r0,#3 + lsl r0,#24 @ r0 = 0x3000000 + ldr r1,=__sp_usr_offset - 16 + bl ClearMem + + .ifdef __MultiBootInclude +@ Clear BSS section to 0x00 +@ (Sometimes BSS may be in External WRAM) + ldr r0,=__bss_start + ldr r1,=__bss_end + sub r1,r0 + bl ClearMem + .endif + +@ Copy initialized data (data section) from LMA to VMA (ROM to RAM) + ldr r1,=__data_lma + ldr r2,=__data_start + ldr r4,=__data_end + bl CopyMemChk + +@ Copy internal work ram (iwram section) from LMA to VMA (ROM to RAM) + ldr r1,=__iwram_lma + ldr r2,=__iwram_start + ldr r4,=__iwram_end + bl CopyMemChk + +@ Copy internal work ram overlay 0 (iwram0 section) from LMA to VMA (ROM to RAM) + ldr r2,=__load_stop_iwram0 + ldr r1,=__load_start_iwram0 + sub r3,r2,r1 @ Is there any data to copy? + beq CIW0Skip @ no + + ldr r2,=__iwram_overlay_start + bl CopyMem +CIW0Skip: + +@ Copy external work ram (ewram section) from LMA to VMA (ROM to RAM) + ldr r1,=__ewram_lma + ldr r2,=__ewram_start + ldr r4,=__ewram_end + bl CopyMemChk + +@ Copy external work ram overlay 0 (ewram0 section) from LMA to VMA (ROM to RAM) + ldr r2,=__load_stop_ewram0 + ldr r1,=__load_start_ewram0 + sub r3,r2,r1 @ Is there any data to copy? + beq CEW0Skip @ no + + ldr r2,=__ewram_overlay_start + bl CopyMem +CEW0Skip: + +@ Jump to user code + + mov r0,#0 @ int argc + mov r1,#0 @ char *argv[] + + ldr r3,=start_vector + mov lr,r3 @ Set start_vector as return address + +.ifdef __CPPSupport + ldr r3,=main +.else + ldr r3,=AgbMain +.endif + bx r3 + + + .GLOBAL __FarFunction,__FarProcedure + .THUMB_FUNC +__FarFunction: + .THUMB_FUNC +__FarProcedure: + bx r0 + nop + nop @ This nop is here to allow unmapped memory to be used as + @ as a delay of almost 1 sec with a 1 cycle resolution. + @ Read this for technical info: + @ http://www.devrs.com/gba/files/gbadevfaqs.php#RepeatUses + +@ Clear memory to 0x00 if length != 0 +@ r0 = Start Address +@ r1 = Length + +ClearMem: + cmp r1,#0 @ Is length zero? + beq ClearMX @ yes, exit + +.ifdef __DMACopyClear + ldr r2,reg_base + lsr r1,#2 @ r1 = (length/4) & 0xffff + + adr r3,fill_val + str r3,[r2,#0x4] @ Set source address (fill value) + str r0,[r2,#0x8] @ Set destination address (fill dest address) + strh r1,[r2,#0xc] @ Set DMA length + ldr r1,=0x8500 @ dma_clrb + strh r1,[r2,#0xe] @ Start DMA +.else + mov r2,#0 +ClrLoop: + stmia r0!,{r2} + sub r1,#4 + bne ClrLoop +.endif +ClearMX: + bx lr + +@ Copy memory if length != 0 +@ r1 = Source Address +@ r2 = Dest Address +@ r4 = Dest Address + Length + +CopyMemChk: + sub r3,r4,r2 @ Is there any data to copy? + beq CIDExit @ no + +@ Copy memory +@ r1 = Source Address +@ r2 = Dest Address +@ r3 = Length + +CopyMem: +.ifdef __DMACopyClear + ldr r0,reg_base + lsr r3,#2 @ r3 = (length/4) & 0xffff + + str r1,[r0,#0x4] @ Set source address + str r2,[r0,#0x8] @ Set destination address + strh r3,[r0,#0xc] @ Set DMA length + ldr r3,=0x8400 @ dma_copy + strh r3,[r0,#0xe] @ Start DMA +.else +CIDLoop: + ldmia r1!,{r0} + stmia r2!,{r0} + sub r3,#4 + bne CIDLoop +.endif +CIDExit: +If_Undefined_Reference__rename_main_or_AgbMain_to_each_other_in_your_C_file: + bx lr + + .ALIGN + +.ifdef __DMACopyClear +fill_val: .word 0 +reg_base: .word 0x040000d0 +.endif + + .ALIGN + .POOL + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Interrupt Processing @ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .ifdef __ISRinIWRAM + .SECTION .iwram + .endif + + .EXTERN IntrTable + .EXTERN InterruptProcess + .GLOBAL intr_main + .ALIGN + .ARM + +@ NOTE: Ifyou copy the following code (start: intr_main - +@ end: intr_main_end) to internal WRAM then do not forget +@ to copy everything between these two labels. The .POOL +@ data must be copied since it is used by intr_main. + +@ NOTE2: If __ISRinIWRAM is defined then the copy to +@ IWRAM is done automatically for you. + + .ifdef __InterruptSupport + + .ifdef __FastInterrupts +intr_main: + ldr r0,=InterruptProcess + bx r0 + .endif + + .ifdef __SingleInterrupts +intr_main: + @ Single interrupts support + mov r3, #0x4000000 @ REG_BASE + ldr r2, [r3,#0x200]! @ Read REG_IE + and r1, r2, r2, lsr #16 @ r1 = IE & IF + ldr r2, =IntrTable + + ands r0, r1, #1 @ V-Blank Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #2 @ H-Blank Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #4 @ V Counter Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #8 @ Timer 0 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x10 @ Timer 1 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x20 @ Timer 2 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x40 @ Timer 3 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x80 @ Serial Communication Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x100 @ DMA0 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x200 @ DMA1 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x400 @ DMA2 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x800 @ DMA3 Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x1000 @ Key Interrupt + bne jump_intr + add r2, r2, #4 + ands r0, r1, #0x2000 @ Cart Interrupt + + .ifdef __HandleCartInterrupt + strneb r0, [r3, #0x84 - 0x200] @ Stop sound if cart removed (REG_SOUNDCNT_X) +loop: bne loop @ Infinite loop if cart removed + .endif + +jump_intr: + strh r0, [r3, #2] @ IF Clear + ldr r0, [r2] @ Jump to user IRQ process + bx r0 + .endif + + .ifdef __MultipleInterrupts +intr_main: + @ Multiple interrupts support + mov r2, #0x4000000 @ REG_BASE + ldr r3, [r2,#0x200]! @ r2 = IE : r3 = IF|IE + ldrh r1, [r2, #0x8] @ r1 = IME + mrs r0, spsr + stmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} // IF|IE + + mov r0, #1 @ IME = 1 (To permit multiple interrupts if + @ an interrupt occurs) + strh r0, [r2, #0x8] + and r1, r3, r3, lsr #16 @ r1 = IE & IF + ldr r12, =IntrTable + + ands r0, r1, #1 @ V-blank interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #2 @ H-blank interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #4 @ V-counter interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #8 @ Timer 0 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x10 @ Timer 1 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x20 @ Timer 2 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x40 @ Timer 3 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x80 @ Serial Communication Interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x100 @ DMA 0 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x200 @ DMA 1 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x400 @ DMA 2 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x800 @ DMA 3 interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x1000 @ Key interrupt + bne jump_intr + add r12,r12, #4 + ands r0, r1, #0x2000 @ Cart interrupt + + .ifdef __HandleCartInterrupt + strneb r0, [r2, #0x84 - 0x200] @ Stop sound if cart removed (REG_SOUNDCNT_X) +loop: bne loop @ Infinite loop if cart removed + .endif + +jump_intr: + strh r0, [r2, #2] @ Clear IF + +@ Enable multiple interrupts & switch to system +@ mode if __SwitchToUserStack is defined. + + mrs r3, cpsr + .ifdef __SwitchToUserStack + bic r3, r3, #0xdf @ \__ + orr r3, r3, #0x1f @ / --> Enable IRQ & FIQ. Set CPU mode to System. + .else + bic r3, r3, #0xc0 @ Enable IRQ & FIQ + .endif + msr cpsr, r3 + + ldr r0, [r12] + + stmfd sp!, {lr} + adr lr, IntrRet + bx r0 +IntrRet: + ldmfd sp!, {lr} + +@ Disable multiple interrupts & switch to IRQ Mode +@ if __SwitchToUserStack is defined. + + mrs r3, cpsr + .ifdef __SwitchToUserStack + bic r3, r3, #0xdf @ \__ + orr r3, r3, #0x92 @ / --> Disable IRQ. Enable FIQ. Set CPU mode to IRQ. + .else + orr r3, r3, #0x80 @ Disable IRQ. + .endif + msr cpsr, r3 + + ldmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} //IF|IE +@ strh r3, [r2] @ set IE + strh r1, [r2, #0x8] @ restore REG_IME + msr spsr, r0 @ restore spsr + bx lr + + .endif + + .ifdef __AAS_MultipleInterrupts +intr_main: + @ Multiple interrupts support + mov r2, #0x4000000 @ REG_BASE + ldr r3, [r2,#0x200]! @ r2 = IE : r3 = IF|IE + ldrh r1, [r2, #0x8] @ r1 = IME + mrs r0, spsr + stmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} // IF|IE + + and r1, r3, r3, lsr #16 @ r1 = IE & IF + + ands r0, r1, #0x10 @ Timer 1 interrupt + bne jump_intr_AAS + + mov r0, #1 @ IME = 1 (To permit multiple interrupts if + @ an interrupt occurs) + strh r0, [r2, #0x8] + +AAS_intr_start: + ands r0, r1, #1 @ V-blank interrupt + blne jump_intr + ands r0, r1, #2 @ H-blank interrupt + blne jump_intr + ands r0, r1, #4 @ V-counter interrupt + blne jump_intr + ands r0, r1, #8 @ Timer 0 interrupt + blne jump_intr + ands r0, r1, #0x20 @ Timer 2 interrupt + blne jump_intr + ands r0, r1, #0x40 @ Timer 3 interrupt + blne jump_intr + ands r0, r1, #0x80 @ Serial Communication Interrupt + blne jump_intr + ands r0, r1, #0x100 @ DMA 0 interrupt + blne jump_intr + ands r0, r1, #0x200 @ DMA 1 interrupt + blne jump_intr + ands r0, r1, #0x400 @ DMA 2 interrupt + blne jump_intr + ands r0, r1, #0x800 @ DMA 3 interrupt + blne jump_intr + ands r0, r1, #0x1000 @ Key interrupt + blne jump_intr + ands r0, r1, #0x2000 @ Cart interrupt + + .ifdef __HandleCartInterrupt + strneb r0, [r2, #0x84 - 0x200] @ Stop sound if cart removed (REG_SOUNDCNT_X) +loop: bne loop @ Infinite loop if cart removed + .endif + +jump_intr: + strh r0, [r2, #2] @ Clear IF + +@ Enable multiple interrupts & switch to system +@ mode if __SwitchToUserStack is defined. + + ldr r12, =AAS_IntrTable + adr r0, AAS_intr_start+8 + sub r14, r14, r0 + mov r14, r14, lsr #3 + ldr r0, [r12, r14, lsl #2] + + mrs r3, cpsr + bic r3, r3, #0xc0 @ Enable IRQ & FIQ + .ifdef __SwitchToUserStack + orr r3, r3, #0x1f @ Set CPU mode to System. + .endif + msr cpsr, r3 + + stmfd sp!, {lr} + adr lr, IntrRet + bx r0 + +IntrRet: + ldmfd sp!, {lr} + +@ Disable multiple interrupts & switch to IRQ Mode +@ if __SwitchToUserStack is defined. + + mrs r3, cpsr + .ifdef __SwitchToUserStack + bic r3, r3, #0xdf @ \__ + orr r3, r3, #0x92 @ / --> Disable IRQ. Enable FIQ. Set CPU mode to IRQ. + .else + orr r3, r3, #0x80 @ Disable IRQ. + .endif + msr cpsr, r3 + + ldmfd sp!, {r0-r2,lr} @ {spsr, IME, REG_IE, lr} //IF|IE + strh r1, [r2, #0x8] @ restore REG_IME + msr spsr, r0 @ restore spsr + bx lr + +jump_intr_AAS: + strh r0, [r2, #2] @ Clear IF + +@ Switch to system mode if __SwitchToUserStack is defined. + + .ifdef __SwitchToUserStack + mrs r3, cpsr + orr r3, r3, #0x1f @ Set CPU mode to System. + msr cpsr, r3 + .endif + + ldr r0, =AAS_FastTimer1InterruptHandler + + stmfd sp!, {lr} + adr lr, IntrRet + bx r0 + + .endif + + .ALIGN + .POOL @ If you copy the intr_main routine, above, to internal + @ RAM then copy the pool data as well because IntrTable + @ address is stored here. Use intr_main_end as last address+1. +intr_main_end: + .endif + + .ALIGN + .POOL + + + .END + + diff --git a/lib/apex-audio-system/examples/AASExample_c++/lnkscript b/lib/apex-audio-system/examples/AASExample_c++/lnkscript new file mode 100644 index 0000000..b35df8a --- /dev/null +++ b/lib/apex-audio-system/examples/AASExample_c++/lnkscript @@ -0,0 +1,462 @@ +/*****************************************************************************\ + DevKit Advance Linker Script +\*****************************************************************************/ + +/* Administrivia: + * + * Copyright 2003, Jason Wilkins. This source code is free for any use except + * that this copyright notice and the following disclaimers remain intact when + * the source is distributed. There are absolutely no restrictions on use of + * object code generated from this source, but the disclaimers remain in force. + * + * THIS CODE WAS NOT MADE IN ASSOCIATION WITH NINTENDO AND DOES NOT MAKE USE OF + * ANY INTELLECTUAL PROPERTY CLAIMED BY NINTENDO. + * + * GAMEBOY ADVANCE IS A TRADEMARK OF NINTENDO. + * + * THIS CODE HAS BEEN PROVIDED "AS-IS" WITHOUT A WARRANTY OF ANY KIND, EITHER + * EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO IMPLIED WARRANTIES OF + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. THE ENTIRE RISK AS TO THE + * QUALITY OR PERFORMANCE OF THE CODE IS WITH YOU. + * + * IN NO EVENT, UNLESS AGREED TO IN WRITING, WILL ANY COPYRIGHT HOLDER, OR ANY + * OTHER PARTY, BE HELD LIABLE FOR ANY DAMAGES RESULTING FROM THE USE OR + * INABILITY TO USE THIS CODE. + * + * See $(DEVKITADV)/docs/Credits.txt for a list of contributors. + *****************************************************************************/ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) + +ENTRY(_start) + +SEARCH_DIR("/devkitadv-r5-beta-3/arm-agb-elf/lib"); + + + +__memmap_ewram_start = 0x02000000; +__memmap_ewram_end = 0x02040000; + +__memmap_iwram_start = 0x03000000; +__memmap_iwram_end = 0x03008000; + +__memmap_rom_start = 0x08000000; + + +/* Added */ +__text_start = DEFINED (__gba_multiboot) ? __memmap_ewram_start : __memmap_rom_start; +/* __ewram_start = __memmap_ewram_start; */ +/* __eheap_end = __memmap_ewram_end; */ +__iwram_start = __memmap_iwram_start; +__iheap_end = __memmap_iwram_end - 0x400; +__sp_usr = __memmap_iwram_end - 0x100; +__sp_irq = __memmap_iwram_end - 0x60; +__intr_vector_buf = __memmap_iwram_end - 4; +__sp_usr_offset = __sp_usr - __iwram_start; +__intr_vect_offset = __intr_vector_buf - __sp_usr; + + +SECTIONS +{ +/*** read-only sections ***/ + + . = DEFINED(__gba_multiboot) ? __memmap_ewram_start : __memmap_rom_start ; + + .text : + { + /* crt0.o has to be the first thing in the ROM */ + *crt0.o(.text) + + *(EXCLUDE_FILE(*.rodata.* *.cartrom.o *.ewram.o *.iwram.o) .text) + *(.stub .text.* .gnu.linkonce.t*) + + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + + *(.glue_7) + *(.glue_7t) + + . = ALIGN(4); + } =0xFF + + .init : + { + *(.init) + . = ALIGN(4); + } =0xFF + + .fini : + { + *(.fini) + . = ALIGN(4); + } =0xFF + + __cartrom_start = . ; + .cartrom : + { + *(.cartrom .cartrom.*) + *.rodata.* (.text .rodata .data) /* deprecated: R4 */ + *.cartrom.o (.text .rodata .data) + + . = ALIGN(4); + } =0xFF + __cartrom_end = . ; + + __rodata_start = . ; + .rodata : + { + *(.rodata1) + *(EXCLUDE_FILE(*.rodata.* *.cartrom.o *.ewram.o *.iwram.o) .rodata) + *(.rodata.* .gnu.linkonce.r*) + *(.roda) /* deprecated: for compatibility with objcopyroda */ + + SORT(CONSTRUCTORS) + + . = ALIGN(4); + } =0xFF + __rodata_end = . ; + + .eh_frame : + { + KEEP(*(.eh_frame)) + . = ALIGN(4); + } =0xFF + + .gcc_except_table : + { + *(.gcc_except_table) + . = ALIGN(4); + } =0xFF + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP(*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP(*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP(*(SORT(.ctors.*))) + KEEP(*(.ctors)) + + . = ALIGN(4); + } =0xFF + + .dtors : + { + KEEP(*crtbegin.o(.dtors)) + KEEP(*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + + . = ALIGN(4); + } =0xFF + + .jcr : + { + *(.jcr) + . = ALIGN(4); + } =0xFF + + + +/*** EWRAM ***/ + + __load_start_ewram = + ADDR(.text) + + SIZEOF(.text) + + SIZEOF(.init) + + SIZEOF(.fini) + + SIZEOF(.cartrom) + + SIZEOF(.rodata) + + SIZEOF(.eh_frame) + + SIZEOF(.gcc_except_table) + + SIZEOF(.ctors) + + SIZEOF(.dtors) + + SIZEOF(.jcr); + + . = DEFINED(__gba_multiboot) ? __load_start_ewram : __memmap_ewram_start ; + + __ewram_start = . ; + .ewram : AT(__load_start_ewram) + { + *(.ewram .ewram.*) + *.ewram.o (.text .rodata .data) + . = ALIGN(4); + } =0xFF + __ewram_end = . ; + + __ewram_overlay_start = . ; + OVERLAY : NOCROSSREFS AT (__load_start_ewram + SIZEOF(.ewram)) + { + .ewram0 { *(.ewram0 .ewram0.*) . = ALIGN(4); } =0xFF + .ewram1 { *(.ewram1 .ewram1.*) . = ALIGN(4); } =0xFF + .ewram2 { *(.ewram2 .ewram2.*) . = ALIGN(4); } =0xFF + .ewram3 { *(.ewram3 .ewram3.*) . = ALIGN(4); } =0xFF + .ewram4 { *(.ewram4 .ewram4.*) . = ALIGN(4); } =0xFF + .ewram5 { *(.ewram5 .ewram5.*) . = ALIGN(4); } =0xFF + .ewram6 { *(.ewram6 .ewram6.*) . = ALIGN(4); } =0xFF + .ewram7 { *(.ewram7 .ewram7.*) . = ALIGN(4); } =0xFF + .ewram8 { *(.ewram8 .ewram8.*) . = ALIGN(4); } =0xFF + .ewram9 { *(.ewram9 .ewram9.*) . = ALIGN(4); } =0xFF + } + + /* OVERLAY should do this, but it doesn't seem to work. */ + . = __ewram_start + SIZEOF(.ewram) + + MAX(SIZEOF(.ewram0), + MAX(SIZEOF(.ewram1), + MAX(SIZEOF(.ewram2), + MAX(SIZEOF(.ewram3), + MAX(SIZEOF(.ewram4), + MAX(SIZEOF(.ewram5), + MAX(SIZEOF(.ewram6), + MAX(SIZEOF(.ewram7), + MAX(SIZEOF(.ewram8), SIZEOF(.ewram9)))))))))); + + __ewram_overlay_end = . ; + + __load_stop_ewram = + __load_start_ewram + + SIZEOF(.ewram) + + SIZEOF(.ewram0) + + SIZEOF(.ewram1) + + SIZEOF(.ewram2) + + SIZEOF(.ewram3) + + SIZEOF(.ewram4) + + SIZEOF(.ewram5) + + SIZEOF(.ewram6) + + SIZEOF(.ewram7) + + SIZEOF(.ewram8) + + SIZEOF(.ewram9); + + + +/* data */ + + . = DEFINED(__gba_ewram_data) ? __ewram_overlay_end : __memmap_iwram_start ; + + __load_start_data = __load_stop_ewram; + + __data_start = . ; + .data : AT(__load_start_data) + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + *(EXCLUDE_FILE(*.rodata.* *.cartrom.o *.ewram.o *.iwram.o) .data) + *(.data.* .gnu.linkonce.d.*) + *(.data1) + *(.tdata .tdata.* .gnu.linkonce.td.*) + *(.sdata .sdata.* .gnu.linkonce.s.*) + + . = ALIGN(4); + } =0xFF + __data_end = . ; + + __load_stop_data = __load_start_data + SIZEOF(.data); + + + +/*** IWRAM ***/ + + . = DEFINED(__gba_ewram_data) ? __memmap_iwram_start : __data_end ; + + __load_start_iwram = __load_stop_data; + + __iwram_start = . ; + .iwram : AT(__load_start_iwram) + { + *(.iwram .iwram.*) + *.iwram.o (.text .rodata .data) + . = ALIGN(4); + } =0xFF + __iwram_end = . ; + + __iwram_overlay_start = . ; + OVERLAY : NOCROSSREFS AT (__load_start_iwram + SIZEOF(.iwram)) + { + .iwram0 { *(.iwram0 .iwram0.*) . = ALIGN(4); } =0xFF + .iwram1 { *(.iwram1 .iwram1.*) . = ALIGN(4); } =0xFF + .iwram2 { *(.iwram2 .iwram2.*) . = ALIGN(4); } =0xFF + .iwram3 { *(.iwram3 .iwram3.*) . = ALIGN(4); } =0xFF + .iwram4 { *(.iwram4 .iwram4.*) . = ALIGN(4); } =0xFF + .iwram5 { *(.iwram5 .iwram5.*) . = ALIGN(4); } =0xFF + .iwram6 { *(.iwram6 .iwram6.*) . = ALIGN(4); } =0xFF + .iwram7 { *(.iwram7 .iwram7.*) . = ALIGN(4); } =0xFF + .iwram8 { *(.iwram8 .iwram8.*) . = ALIGN(4); } =0xFF + .iwram9 { *(.iwram9 .iwram9.*) . = ALIGN(4); } =0xFF + } + + /* OVERLAY should do this, but it doesn't seem to work. */ + . = __iwram_start + SIZEOF(.iwram) + + MAX(SIZEOF(.iwram0), + MAX(SIZEOF(.iwram1), + MAX(SIZEOF(.iwram2), + MAX(SIZEOF(.iwram3), + MAX(SIZEOF(.iwram4), + MAX(SIZEOF(.iwram5), + MAX(SIZEOF(.iwram6), + MAX(SIZEOF(.iwram7), + MAX(SIZEOF(.iwram8), SIZEOF(.iwram9)))))))))); + + __iwram_overlay_end = . ; + + __load_stop_iwram = + __load_start_iwram + + SIZEOF(.iwram) + + SIZEOF(.iwram0) + + SIZEOF(.iwram1) + + SIZEOF(.iwram2) + + SIZEOF(.iwram3) + + SIZEOF(.iwram4) + + SIZEOF(.iwram5) + + SIZEOF(.iwram6) + + SIZEOF(.iwram7) + + SIZEOF(.iwram8) + + SIZEOF(.iwram9); + + + +/*** footer ***/ + + . = __load_stop_iwram; + + __load_start_footer = . ; + .footer : + { + *crt0.o(.footer) + *(.footer) + . = ALIGN(4); + } + __load_stop_footer = . ; + + + +/*** bss ***/ + + . = DEFINED(__gba_ewram_data) ? (DEFINED(__gba_multiboot) ? __load_stop_footer : __data_end) : __iwram_overlay_end ; + . = ALIGN(32); + + PROVIDE(__bss_start__ = . ); + __bss_start = . ; + .bss : + { + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + + *(.tbss .tbss.* .gnu.linkonce.tb.*) + *(.tcommon) + + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + + *(.bss .bss.* .gnu.linkonce.b*) + *(COMMON) + + . = ALIGN(4); + } + __bss_end = . ; + PROVIDE(_bss_end__ = . ); + PROVIDE(__bss_end__ = . ); + + + +/*** appended assets ***/ + + . = DEFINED(__gba_ewram_data) ? (DEFINED(__gba_multiboot) ? __bss_end : __load_stop_footer ) : __load_stop_footer ; + + __load_start_appended = __load_stop_footer ; + + __appended_start = . ; + .appended : AT(__load_start_appended) + { + *(.appended .appended.*) + . = ALIGN(4); + } + __appended_end = . ; + + __load_stop_appended = __load_start_appended + SIZEOF(.appended); + + + +/*** heap ***/ + + __iwram_break = DEFINED(__gba_ewram_data) ? __iwram_overlay_end : __bss_end ; + + __ewram_break = DEFINED(__gba_multiboot) ? __appended_end : (DEFINED(__gba_ewram_data) ? __bss_end : __ewram_overlay_end ) ; + + _end = DEFINED(__gba_iwram_heap) ? __iwram_break : __ewram_break ; + PROVIDE(__end__ = _end); + PROVIDE(end = _end); + + __heap_limit = DEFINED(__gba_iwram_heap) ? __memmap_iwram_end - 0x100 : __memmap_ewram_end ; + + +/* Added */ + __iwram_lma = __load_start_iwram; + __data_lma = __load_start_data; + __ewram_lma = __load_start_ewram; + + +/* discard configuration variables */ + + /DISCARD/ : + { + *(.devkitadv.config) + } + + + +/*** debugging info ***/ + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + + .comment 0 : { *(.comment) } + + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} + + + diff --git a/lib/apex-audio-system/make/common.make b/lib/apex-audio-system/make/common.make new file mode 100644 index 0000000..ef6dff8 --- /dev/null +++ b/lib/apex-audio-system/make/common.make @@ -0,0 +1,75 @@ +# Tools and flags. +CC = $(CROSS)gcc +CCPP = $(CROSS)g++ +CFLAGS = -mthumb-interwork -fomit-frame-pointer -mcpu=arm7tdmi -ffast-math -fno-exceptions +# added "-ffixed-r14" and "-mlong-calls" below to work around compiler bugs +THUMB = -mthumb -O3 -ffixed-r14 -funroll-loops +ARM = -marm -Os -mlong-calls +DEFAULT = $(THUMB) +# DEFAULT was $(THUMB) + +AS = $(CROSS)as +ASFLAGS = -mthumb-interwork + +# Graphics related raw input files (e.g. sprites, palettes). +GFX = + +# Sound related o input files. +SOUND = + +# This rule builds a .h file of all your raw input file exports. +# So this creates a file (say) 'symbol.h' which has lines like (say): +# extern const u8 _binary_bob_raw_start[]; +SYMBOLS = symbols.h +SYMBOL_PREFIX = "extern const u8 _binary_" +SYMBOL_SUFFIX1 = "_start[];" +SYMBOL_SUFFIX2 = "_end[];" + + + +# Here follow the generic build rules. +all: $(TARGET) + +# Rule to build raw files into .o files, noting their exported symbols. +%.o: %.raw + @$(CROSS)objcopy -B arm -I binary -O elf32-little $< temp.o 2> /dev/null + @$(CROSS)ld -T convert.ls temp.o -o $@ + @interflip -mthumb-interwork $@ + @echo $(CROSS)objcopy -I binary -O elf32-little $< $@ + @echo -n $(SYMBOL_PREFIX) >> $(SYMBOLS) + @echo -n "$<" | tr "[:punct:]" "_" >> $(SYMBOLS) + @echo $(SYMBOL_SUFFIX1) >> $(SYMBOLS) + @echo -n $(SYMBOL_PREFIX) >> $(SYMBOLS) + @echo -n "$<" | tr "[:punct:]" "_" >> $(SYMBOLS) + @echo $(SYMBOL_SUFFIX2) >> $(SYMBOLS) + +release: + make clean all + rm -f *.o $(NAME) $(GFX) $(SOUND) $(SYMBOLS) $(MAP) + +crt0.o: crt0.s + $(AS) -o $@ $< + +%.o: %.s + $(AS) $(ASFLAGS) -o $@ $< + +%.o: %.thumb.c + $(CC) $(THUMB) $(INCLUDES) $(CFLAGS) -c $< -o $@ + +%.o: %.arm.c + $(CC) $(ARM) $(INCLUDES) $(CFLAGS) -c $< -o $@ + +%.o: %.c + $(CC) $(DEFAULT) $(INCLUDES) $(CFLAGS) -c $< -o $@ + +%.o: %.thumb.cpp + $(CCPP) $(THUMB) $(INCLUDES) $(CFLAGS) -c $< -o $@ + +%.o: %.arm.cpp + $(CCPP) $(ARM) $(INCLUDES) $(CFLAGS) -c $< -o $@ + +%.o: %.cpp + $(CCPP) $(DEFAULT) $(INCLUDES) $(CFLAGS) -c $< -o $@ + +%.text.iwram.o: %.o + cp $< $@ diff --git a/lib/apex-audio-system/make/example.make b/lib/apex-audio-system/make/example.make new file mode 100644 index 0000000..4a5513a --- /dev/null +++ b/lib/apex-audio-system/make/example.make @@ -0,0 +1,39 @@ +# Library and include paths. +LIBS = -L../../build/aas/lib -lAAS +INCLUDES = -I../../build/aas/include + +# Files you want to go in ROM (AAS_Data.o must go first) +SRC = AAS_Data.o AASExample.o + +MAP = map.out +LDFLAGS = -mthumb-interwork -Xlinker -Map $(MAP) -nostartfiles -Tlnkscript + +# Name of output targets. +NAME = $(SHORTNAME).tmp +TARGET = $(SHORTNAME).gba + +# Files you want to go in IWRAM. +IWRAM = + +include ../../make/common.make + +CONV2AAS_FILE = conv2aas +ifeq ($(OS),Windows_NT) + CONV2AAS_FILE = conv2aas.exe +endif + +AAS_Data.o: + ../../build/conv2aas/$(CONV2AAS_FILE) AAS_Data + $(AS) $(ASFLAGS) -o $@ AAS_Data.s + +$(NAME): crt0.o $(IWRAM) $(GFX) $(SOUND) $(SRC) + touch $(MAP) + $(LD) $(LDFLAGS) -o $@ crt0.o $(SRC) $(IWRAM) $(GFX) $(SOUND) $(LIBS) + $(CROSS)size $@ + +$(TARGET): $(NAME) + $(CROSS)objcopy -v -O binary $< $@ + gbafix $@ + +clean: + rm -f *.o AAS_Data.h AAS_Data.s $(TARGET) $(NAME) $(GFX) $(SOUND) $(SYMBOLS) $(MAP) diff --git a/lib/apex-audio-system/src/aas/AAS.h b/lib/apex-audio-system/src/aas/AAS.h new file mode 100644 index 0000000..300aae4 --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS.h @@ -0,0 +1,121 @@ +// Copyright (c) 2003-2021 James Daniels +// Distributed under the MIT License +// license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +// Main AAS include +// +// See API documentation for more information. + +#ifndef __AAS__ +#define __AAS__ + +#ifdef __cplusplus +#define AAS_BEGIN_DECLS extern "C" { +#define AAS_END_DECLS } +#else +#define AAS_BEGIN_DECLS +#define AAS_END_DECLS +#endif + +AAS_BEGIN_DECLS + +#define AAS_VERSION 0x111 // v1.11 + +// Types +#define AAS_u32 unsigned int +#define AAS_s32 signed int +#define AAS_u16 unsigned short +#define AAS_s16 signed short +#define AAS_u8 unsigned char +#define AAS_s8 signed char +#define AAS_BOOL unsigned char +#define AAS_TRUE 1 +#define AAS_FALSE 0 +#define AAS_NULL 0 + +// Return values +#define AAS_OK 0 +#define AAS_ERROR_VOLUME_OUT_OF_RANGE -1 +#define AAS_ERROR_CHANNEL_NOT_AVAILABLE -2 +#define AAS_ERROR_FREQUENCY_OUT_OF_RANGE -3 +#define AAS_ERROR_MOD_DOES_NOT_EXIST -4 +#define AAS_ERROR_CALL_SET_CONFIG_FIRST -5 +#define AAS_ERROR_INVALID_CONFIG -6 +#define AAS_ERROR_INVALID_SAMPLE_ADDRESS -7 +#define AAS_ERROR_NO_MOD_PLAYING -8 +#define AAS_ERROR_NOT_ENOUGH_CHANNELS -9 +#define AAS_ERROR_CHANNEL_ACTIVE -10 +#define AAS_ERROR_CHANNEL_UNRESUMEABLE -11 +#define AAS_ERROR_INVALID_SONG_POS -12 + +// AAS_SetConfig() mix settings +#define AAS_CONFIG_MIX_32KHZ 1 +#define AAS_CONFIG_MIX_28KHZ 2 +#define AAS_CONFIG_MIX_24KHZ 3 +#define AAS_CONFIG_MIX_20KHZ 4 +#define AAS_CONFIG_MIX_16KHZ 5 +#define AAS_CONFIG_MIX_12KHZ 6 +#define AAS_CONFIG_MIX_8KHZ 7 + +// AAS_SetConfig() channel settings +#define AAS_CONFIG_CHANS_16_LOUD 6 +#define AAS_CONFIG_CHANS_8_LOUD 5 +#define AAS_CONFIG_CHANS_4_LOUD 4 +#define AAS_CONFIG_CHANS_16 3 +#define AAS_CONFIG_CHANS_8 2 +#define AAS_CONFIG_CHANS_4 1 + +// AAS_SetConfig() spatial settings +#define AAS_CONFIG_SPATIAL_STEREO 2 +#define AAS_CONFIG_SPATIAL_MONO 1 + +// AAS_SetConfig() dynamic mixing settings +#define AAS_CONFIG_DYNAMIC_OFF 0 +#define AAS_CONFIG_DYNAMIC_ON 1 + +// General commands +int AAS_SetConfig( int config_mix, int config_chans, int config_spatial, int config_dynamic ); // Must call at least once before doing anything else +void AAS_DoDMA3( void* source, void* dest, AAS_u32 flags_and_length ); +void AAS_ShowLogo(); + +// Interrupt handling commands +void AAS_Timer1InterruptHandler(); // Use when there are no other CPU-intensive interrupts +void AAS_FastTimer1InterruptHandler(); // Use when there are other CPU-intensive interrupts +void AAS_DoWork(); // Must be called at least 50 times/sec if using AAS_FastTimer1InterruptHandler() + +// Sample playing commands +int AAS_SFX_Play( int channel, int sample_volume, int sample_frequency, const AAS_s8* sample_start, const AAS_s8* sample_end, const AAS_s8* sample_restart ); +AAS_BOOL AAS_SFX_ChannelExists( int channel ); // returns AAS_TRUE only if AAS_SFX_Play will succeed for this channel +AAS_BOOL AAS_SFX_IsActive( int channel ); // returns AAS_TRUE if channel is valid and active, AAS_FALSE otherwise +int AAS_SFX_EndLoop( int channel ); // If sample was looping, will stop at end of current iteration +int AAS_SFX_SetFrequency( int channel, int sample_frequency ); +int AAS_SFX_SetVolume( int channel, int sample_volume ); +int AAS_SFX_Stop( int channel ); +int AAS_SFX_Resume( int channel ); +int AAS_SFX_GetNumChannels(); // returns number of SFX channels + +// MOD commands +int AAS_MOD_Play( int song_num ); // loops by default +int AAS_MOD_SetLoop( AAS_BOOL loop ); // specify whether current song will loop +void AAS_MOD_Stop(); +AAS_BOOL AAS_MOD_IsPlaying(); // is a song playing? +AAS_BOOL AAS_MOD_HasLooped(); // has the current song looped? +int AAS_MOD_GetVolume(); // 0: silent, 256 = max +int AAS_MOD_SetVolume( int vol ); // 0: silent, 256 = max (do not set above 256 or below 0!) +int AAS_MOD_GetSongPos(); +int AAS_MOD_SetSongPos( int song_pos ); // Immediately jumps to the specified song position. +int AAS_MOD_QueueSongPos( int song_pos ); // Jumps to the specified song position when the current pattern finishes. +int AAS_MOD_GetLineNum(); +int AAS_MOD_GetLastFilterValue(); // Returns the value specified by the most recent "E0: Set Filter" effect +void AAS_MOD_Pause(); // Stops the MOD in a way that allows it to be safely resumed +void AAS_MOD_Resume(); // Should only be used after AAS_MOD_Pause() +int AAS_MOD_GetNumChannels(); // Returns number of channels currently being reserved by the MOD + +// Misc commands +const AAS_s8* AAS_GetOutputBufferAddress( int buffer ); // buffer should be 0 or 1, otherwise will return AAS_NULL +int AAS_GetOutputBufferLength(); +int AAS_GetActualMixRate(); + +AAS_END_DECLS + +#endif diff --git a/lib/apex-audio-system/src/aas/AAS_ASM.s b/lib/apex-audio-system/src/aas/AAS_ASM.s new file mode 100644 index 0000000..bf99d4a --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS_ASM.s @@ -0,0 +1,299 @@ +@ Copyright (c) 2003-2021 James Daniels +@ Distributed under the MIT License +@ license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +.TEXT +.SECTION .text,"ax",%progbits +.ALIGN +.ARM + +.GLOBAL AAS_DoDMA3 + +.GLOBAL AAS_MixAudio_SetMode_Normal +.GLOBAL AAS_MixAudio_SetMode_Boost +.GLOBAL AAS_MixAudio_SetMode_BoostAndClip + +.GLOBAL AAS_MixAudio_SetMaxChans_2 +.GLOBAL AAS_MixAudio_SetMaxChans_4 +.GLOBAL AAS_MixAudio_SetMaxChans_8 + +.GLOBAL _AAS_vol_lookup + + +@ Volume lookup table. -1 means use multiply, 0 to 7 means use bit shift. + +_AAS_vol_lookup: + .byte 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4 + .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5 + .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6 + .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7 + +_ma_mul_r5_r0_r3: + .word 0x00000010 + mul r5,r0,r3 +_ma_mov_r5_r0_lsl_0: + .word 0x00000001 + mov r5,r0,lsl #0 +_ma_mlane_r5_r0_r3_r5: + .word 0x00000011 + mlane r5,r0,r3,r5 +_ma_add_r5_r5_r0_lsl_0: + .word 0x00000011 + add r5,r5,r0,lsl #0 + + +_ma_merge_noclip_start: + @ ma_again: + + @ Merge + ldr r14,[sp,#24] + and r5,r14,r5,lsr #8 + and r6,r14,r6,lsr #8 + and r7,r14,r7,lsr #8 + and r8,r14,r8,lsr #8 + and r9,r14,r9,lsr #8 + and r10,r14,r10,lsr #8 + and r11,r14,r11,lsr #8 + and r12,r14,r12,lsr #8 + add r5,r5,r6,lsl #8 + add r6,r7,r8,lsl #8 + add r7,r9,r10,lsl #8 + add r8,r11,r12,lsl #8 + + @ Store + stmia r4!,{r5-r8} + + @ Loop + subs r14,r14,#0x2000000 + .word 0xdaffffa5 @ ble ma_end + + @ ma_start: + str r14,[sp,#24] +_ma_merge_noclip_end: + + +_ma_merge_boostnoclip_start: + @ ma_again: + + @ Merge + ldr r14,[sp,#24] + and r5,r14,r5,lsr #7 + and r6,r14,r6,lsr #7 + and r7,r14,r7,lsr #7 + and r8,r14,r8,lsr #7 + and r9,r14,r9,lsr #7 + and r10,r14,r10,lsr #7 + and r11,r14,r11,lsr #7 + and r12,r14,r12,lsr #7 + add r5,r5,r6,lsl #8 + add r6,r7,r8,lsl #8 + add r7,r9,r10,lsl #8 + add r8,r11,r12,lsl #8 + + @ Store + stmia r4!,{r5-r8} + + @ Loop + subs r14,r14,#0x2000000 + .word 0xdaffffa5 @ ble ma_end + + @ ma_start: + str r14,[sp,#24] +_ma_merge_boostnoclip_end: + + +_ma_merge_clip_start: + _ma_mask_0x80808080: .word 0x80808080 + + .word 0,0 @ padding + + @ ma_again: + @ Merge + ldr r14,[sp,#24] + .word 0xe51f2018 @ ldr r2,_ma_mask_0x80808080 + + and r0,r14,r5,lsr #8 + and r1,r14,r6,lsr #8 + add r0,r0,r1,lsl #8 + and r5,r14,r5,lsr #7 + and r6,r14,r6,lsr #7 + add r5,r5,r6,lsl #8 + eor r0,r0,r5 + ands r0,r2,r0 + beq no_clip1 @ perhaps not worthwhile? + and r1,r2,r5 + sub r1,r2,r1,lsr #7 + sub r0,r0,r0,lsr #7 + orr r0,r0,r0,lsl #1 + bic r5,r5,r0 + and r1,r1,r0 + orr r5,r5,r1 +no_clip1: + + and r0,r14,r7,lsr #8 + and r1,r14,r8,lsr #8 + add r0,r0,r1,lsl #8 + and r7,r14,r7,lsr #7 + and r8,r14,r8,lsr #7 + add r6,r7,r8,lsl #8 + eor r0,r0,r6 + ands r0,r2,r0 + beq no_clip2 @ perhaps not worthwhile? + and r1,r2,r6 + sub r1,r2,r1,lsr #7 + sub r0,r0,r0,lsr #7 + orr r0,r0,r0,lsl #1 + bic r6,r6,r0 + and r1,r1,r0 + orr r6,r6,r1 +no_clip2: + + and r0,r14,r9,lsr #8 + and r1,r14,r10,lsr #8 + add r0,r0,r1,lsl #8 + and r9,r14,r9,lsr #7 + and r10,r14,r10,lsr #7 + add r7,r9,r10,lsl #8 + eor r0,r0,r7 + ands r0,r2,r0 + beq no_clip3 @ perhaps not worthwhile? + and r1,r2,r7 + sub r1,r2,r1,lsr #7 + sub r0,r0,r0,lsr #7 + orr r0,r0,r0,lsl #1 + bic r7,r7,r0 + and r1,r1,r0 + orr r7,r7,r1 +no_clip3: + + and r0,r14,r11,lsr #8 + and r1,r14,r12,lsr #8 + add r0,r0,r1,lsl #8 + and r11,r14,r11,lsr #7 + and r12,r14,r12,lsr #7 + add r8,r11,r12,lsl #8 + eor r0,r0,r8 + ands r0,r2,r0 + beq no_clip4 @ perhaps not worthwhile? + and r1,r2,r8 + sub r1,r2,r1,lsr #7 + sub r0,r0,r0,lsr #7 + orr r0,r0,r0,lsl #1 + bic r8,r8,r0 + and r1,r1,r0 + orr r8,r8,r1 +no_clip4: + + @ Store + stmia r4!,{r5-r8} + + @ Loop + subs r14,r14,#0x2000000 + .word 0xdaffff6d @ ble ma_end + + @ ma_start: + str r14,[sp,#24] +_ma_merge_clip_end: + +_ma_clip: +add r12,pc,#0x540 @ adr r12,ma_buffer_start +.word 0xea000091 @ b ma_start +add r0,pc,#0x248 @ adr r0,ma_again + +_ma_noclip: +add r12,pc,#0x460 @ adr r12,ma_buffer_start +.word 0xea000059 @ b ma_start +add r0,pc,#0x23c @ adr r0,ma_again + + +AAS_MixAudio_SetMode_BoostAndClip: + adr r12,_ma_clip + adr r0,_ma_merge_clip_start + mov r2,#((_ma_merge_clip_end-_ma_merge_clip_start)/4) + +do_mods: + ldr r1,=_AAS_MixAudio_mod4 + add r2,r2,#0x84000000 + mov r3,#0x04000000 + add r3,r3,#0xd4 + stmia r3,{r0-r2} + ldmia r12,{r1-r3} + ldr r0,=_AAS_MixAudio_mod1 + str r1,[r0] + ldr r0,=_AAS_MixAudio_mod2 + str r2,[r0] + ldr r0,=_AAS_MixAudio_mod3 + str r3,[r0] + bx lr + + +AAS_MixAudio_SetMode_Normal: + adr r12,_ma_noclip + adr r0,_ma_merge_noclip_start + mov r2,#((_ma_merge_noclip_end-_ma_merge_noclip_start)/4) + b do_mods + + +AAS_MixAudio_SetMode_Boost: + adr r12,_ma_noclip + adr r0,_ma_merge_boostnoclip_start + mov r2,#((_ma_merge_boostnoclip_end-_ma_merge_boostnoclip_start)/4) + b do_mods + + +_ma_2ch: +mov r6,#0x10000000 +mov r10,#2 +mov r14,#2 +sub r1,r1,#(20*2) + +_ma_4ch: +mov r6,#0x30000000 +mov r10,#4 +mov r14,#4 +sub r1,r1,#(20*4) + +_ma_8ch: +mov r6,#0x70000000 +mov r10,#8 +mov r14,#8 +sub r1,r1,#(20*8) + + +AAS_MixAudio_SetMaxChans_4: + adr r12,_ma_4ch + +do_mods2: + ldmia r12,{r0-r3} + ldr r12,=_AAS_MixAudio_mod5 + str r0,[r12] + ldr r12,=_AAS_MixAudio_mod6 + str r1,[r12] + ldr r12,=_AAS_MixAudio_mod7 + str r2,[r12] + ldr r12,=_AAS_MixAudio_mod8 + str r3,[r12] + bx lr + + +AAS_MixAudio_SetMaxChans_8: + adr r12,_ma_8ch + b do_mods2 + + +AAS_MixAudio_SetMaxChans_2: + adr r12,_ma_2ch + b do_mods2 + +.pool + + +AAS_DoDMA3: + mov r3,#0x04000000 + add r3,r3,#0xd4 + stmia r3,{r0-r2} + bx lr diff --git a/lib/apex-audio-system/src/aas/AAS_Logo.c b/lib/apex-audio-system/src/aas/AAS_Logo.c new file mode 100644 index 0000000..d37de86 --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS_Logo.c @@ -0,0 +1,153 @@ +// Copyright (c) 2003-2021 James Daniels +// Distributed under the MIT License +// license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +#include "AAS_Shared.h" + +static const AAS_u16 AAS_Logo_Palette[256] = { 0, 1057, 2114, 3171, 3207, 4228, 5285, 4231, 6342, 7399, 5288, 4234, 5320, 6312, 6344, 6345, 6377, 7401, 6346, 7402, 5292, 5294, 6348, 7407, 7433, 7434, 7436, 15591, 8456, 9513, 8458, 8459, 9483, 9514, 9515, 10539, 10570, 10571, 11627, 9516, 9519, 10540, 10543, 11597, 11598, 15690, 12654, 12684, 12685, 13741, 12686, 12687, 12718, 13742, 15756, 14798, 15855, 5265, 5299, 6322, 7408, 6354, 7381, 7382, 6360, 7419, 7440, 8441, 8496, 8467, 9553, 10547, 10576, 10578, 9525, 8503, 10551, 10581, 11638, 11664, 11666, 12688, 13746, 14800, 15856, 15857, 14803, 13748, 12695, 14773, 14775, 15860, 14807, 8473, 9530, 9560, 9562, 10555, 10585, 10587, 8509, 9534, 10556, 11645, 10622, 11677, 11679, 12696, 12699, 15832, 12701, 12703, 13791, 15869, 14815, 17639, 18663, 20678, 23783, 16681, 16747, 19720, 19819, 16780, 17870, 18861, 18894, 20810, 22825, 22891, 21900, 20975, 22924, 24014, 24807, 25864, 25930, 27945, 26987, 25005, 26062, 27020, 28143, 28936, 30026, 32107, 29068, 29167, 32173, 32206, 16895, 16912, 16913, 16945, 17937, 17969, 17971, 19984, 19026, 20083, 16949, 17974, 18006, 19028, 20084, 20085, 19030, 22065, 22098, 23056, 24179, 21140, 21141, 22164, 22197, 21143, 22198, 22199, 22231, 23188, 23254, 23255, 24278, 24311, 17948, 17951, 19004, 19007, 20063, 21119, 21144, 22232, 23256, 23257, 24312, 24313, 24314, 26161, 25203, 27185, 28275, 26293, 26359, 27317, 27350, 29200, 29266, 31248, 31281, 32272, 32305, 31314, 31347, 32338, 32371, 29332, 30422, 31380, 31413, 32404, 32437, 31446, 32470, 32503, 25368, 25369, 25401, 26392, 26425, 26427, 27416, 27482, 27483, 28506, 28539, 28540, 29497, 30587, 32536, 31578, 31611, 32602, 32635, 29596, 29597, 30620, 30653, 30654, 31677, 31710, 31711, 31743, 32734, 32767, 0, 0 }; + +static const AAS_u32 AAS_Logo_Image[2880] = { 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 3958898173UL, 4108903909UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4110286333UL, 1145459375UL, 1210597954UL, 4226130514UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1146874877UL, 1767718717UL, 1651404398UL, 1447443530UL, 4261281220UL, 4261281277UL, 4261281277UL, 4261281277UL, 4194172413UL, 4261263027UL, 4261281277UL, 4261281277UL, 3825073661UL, 3014898611UL, 4261000883UL, 4261281277UL, 4261281277UL, 3014910973UL, 4142325942UL, 4261281277UL, 4261281277UL, 3068394237UL, 4261281017UL, 4261281258UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4227726845UL, 1715357374UL, 1130852208UL, 1128218432UL, 1030517353UL, 4260864328UL, 4261281277UL, 4261281277UL, 4261281277UL, 3405643261UL, 4242963357UL, 4261281277UL, 4261281277UL, 2835217917UL, 3890733991UL, 4257906150UL, 4261281277UL, 4261281277UL, 3819415804UL, 4261281002UL, 4261281277UL, 4261281277UL, 2129067517UL, 3438667434UL, 4261281273UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 2700738045UL, 1785751365UL, 1044398145UL, 976894522UL, 1918712378UL, 3897967211UL, 4261281277UL, 4261281277UL, 4261281277UL, 2868706813UL, 4121524138UL, 4261281277UL, 4261281277UL, 2851732989UL, 3402281859UL, 4257839818UL, 4261281277UL, 4261281277UL, 3011750393UL, 4261279974UL, 4261281277UL, 4261281277UL, 2214133245UL, 3970607735UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1297873661UL, 1097101423UL, 117904446UL, 67372807UL, 976819466UL, 1379692899UL, 4261281268UL, 4261281277UL, 4261281277UL, 3337420285UL, 3866720935UL, 4261281276UL, 4261281277UL, 2247687677UL, 3400968834UL, 4257972172UL, 4261281277UL, 4261281277UL, 2860484088UL, 4260949964UL, 4261281277UL, 4261281277UL, 3438935549UL, 3869864825UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1867424253UL, 375219312UL, 118098956UL, 117704455UL, 352782087UL, 1148280121UL, 4261280160UL, 4261281277UL, 4261281277UL, 3402563069UL, 3312822696UL, 4261281269UL, 4261281277UL, 2365128189UL, 3351610752UL, 4260334791UL, 4261281277UL, 4261281277UL, 2843774200UL, 4260354248UL, 4261281277UL, 4261281277UL, 3439132157UL, 3431232901UL, 4261281276UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1919895489UL, 252857189UL, 168430092UL, 117901066UL, 67372807UL, 1902000907UL, 4261264966UL, 4261281277UL, 4261281277UL, 3452826109UL, 2290584974UL, 4261281263UL, 4261281277UL, 2398682621UL, 4042050445UL, 4261281016UL, 4261281277UL, 4261281277UL, 2861403896UL, 4261279974UL, 4261281277UL, 4261281277UL, 3640524285UL, 3464924103UL, 4261281272UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4160617981UL, 1752329296UL, 252777311UL, 168430606UL, 117705223UL, 67372804UL, 1731922692UL, 4259861080UL, 4261281277UL, 4261281277UL, 4042841341UL, 2429013228UL, 4261281245UL, 4261281277UL, 3489463805UL, 4260949141UL, 4261281277UL, 4261281277UL, 4261281277UL, 3381826552UL, 4261279980UL, 4261281277UL, 4261281277UL, 3690135037UL, 2425015270UL, 4261281265UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 2952658429UL, 1735356237UL, 252712986UL, 202116110UL, 67372807UL, 67569415UL, 1041564676UL, 4255270038UL, 4261281277UL, 4261281277UL, 4261278200UL, 2498754812UL, 4261281234UL, 4261281277UL, 3590192637UL, 4261280978UL, 4261281277UL, 4261281277UL, 4261281277UL, 3499414012UL, 4175420630UL, 4261281277UL, 4261281277UL, 4242472189UL, 2446912752UL, 4261281234UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1358626301UL, 1164604012UL, 269555998UL, 168693263UL, 67372807UL, 117704452UL, 1023870727UL, 4099042145UL, 4261281277UL, 4261281277UL, 4261281277UL, 4244438525UL, 4261281276UL, 4261281277UL, 4244504061UL, 4261281276UL, 4261281277UL, 4261281277UL, 4261281277UL, 4075942653UL, 4261215480UL, 4261281277UL, 4261281277UL, 4261281277UL, 4025547004UL, 4261281272UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1206255101UL, 661549167UL, 286858783UL, 201985808UL, 270012687UL, 117900295UL, 352782087UL, 3208933695UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261215484UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 3992320252UL, 4261281272UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1320156669UL, 693661807UL, 421404192UL, 269356049UL, 589438488UL, 117705251UL, 185009927UL, 2689036862UL, 4261281275UL, 4261281277UL, 4261281277UL, 4261209062UL, 4261281277UL, 4210949629UL, 4261279209UL, 4210687485UL, 4261281277UL, 3874881021UL, 3823363043UL, 4261279178UL, 4261281277UL, 4260030973UL, 4261281277UL, 3405184509UL, 3065427638UL, 4261280202UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1650195965UL, 692679282UL, 505422370UL, 286198808UL, 875242014UL, 117909812UL, 117901066UL, 1380870462UL, 4261281271UL, 4261281277UL, 3992845821UL, 4242766718UL, 4261281277UL, 4244504061UL, 4261275303UL, 4193648125UL, 4261281277UL, 2095513085UL, 3823559626UL, 4261193885UL, 4261281277UL, 4256412669UL, 4261281277UL, 2812870141UL, 3403932618UL, 4261262972UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1649606141UL, 692622998UL, 572662313UL, 286132752UL, 1429349150UL, 118370899UL, 168430090UL, 1331192125UL, 4261281259UL, 4261281277UL, 3338468861UL, 4119033801UL, 4261281277UL, 4177395197UL, 4261203075UL, 4193123837UL, 4261281277UL, 2060254717UL, 3823757002UL, 4260987815UL, 4261281277UL, 4239043324UL, 4261281277UL, 2810445053UL, 3874089443UL, 4261194365UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1665727485UL, 726186390UL, 690170155UL, 269355534UL, 841687576UL, 118565678UL, 168430090UL, 678125885UL, 4261281253UL, 4261281277UL, 3321429501UL, 3430515368UL, 4261281276UL, 4043177469UL, 4261005698UL, 4176477693UL, 4261281277UL, 2144075005UL, 3874351562UL, 4260922793UL, 4261281277UL, 4173703672UL, 4261281277UL, 2844129789UL, 3874878950UL, 4260939138UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1615395837UL, 743487929UL, 724249387UL, 235670031UL, 572526862UL, 118431778UL, 168430604UL, 1332438590UL, 4261280708UL, 4261281277UL, 3386375677UL, 3312822183UL, 4261281269UL, 4043177469UL, 4260939905UL, 4176608765UL, 4261281277UL, 2177629437UL, 3874876876UL, 4260924300UL, 4261281277UL, 4173827320UL, 4261281277UL, 3314284797UL, 3975739622UL, 4260939659UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1280375549UL, 861387705UL, 774581806UL, 218761753UL, 286330380UL, 168431889UL, 168562188UL, 1330538815UL, 4261280707UL, 4261281277UL, 3348364541UL, 2272693132UL, 4261281263UL, 4076731901UL, 4260417162UL, 4176608765UL, 4261281277UL, 2295856381UL, 3874549708UL, 4260924814UL, 4261281277UL, 4174222328UL, 4261281277UL, 2391668989UL, 3975213798UL, 4260939661UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1297545981UL, 1366145904UL, 774779442UL, 168232747UL, 235670538UL, 202116623UL, 302911246UL, 1330278493UL, 4261280451UL, 4261281277UL, 4025409533UL, 2311572716UL, 4261280985UL, 4177395197UL, 4243574418UL, 4176412157UL, 4261281277UL, 2430270973UL, 3438079192UL, 4260926867UL, 4261281277UL, 4241543164UL, 4261281277UL, 3449158909UL, 3975147494UL, 4261204882UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1235418109UL, 1387969639UL, 875705395UL, 67575604UL, 168232711UL, 252578826UL, 386863120UL, 1363309150UL, 4261280451UL, 4261281277UL, 4244430589UL, 2515333368UL, 4261280977UL, 4244504061UL, 3755856277UL, 4242271982UL, 4261281277UL, 2447310333UL, 3571112404UL, 4261204628UL, 4261281277UL, 4258648828UL, 4261281277UL, 2513632765UL, 3655196121UL, 4261272721UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 683801597UL, 1505606497UL, 875836242UL, 119549490UL, 168035332UL, 286331153UL, 1259343889UL, 1445424231UL, 4261280737UL, 4261281277UL, 4261281020UL, 4059889149UL, 4261281009UL, 4261281277UL, 4007649272UL, 4260950510UL, 4261281277UL, 3757243901UL, 3671776733UL, 4261278429UL, 4261281277UL, 4260491773UL, 4261281277UL, 3757637117UL, 3739213791UL, 4261280991UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1340669437UL, 3132976973UL, 875843922UL, 724251186UL, 505421602UL, 404299294UL, 1712787729UL, 2737259890UL, 4261281255UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4244504061UL, 3974753784UL, 4261281005UL, 4261281277UL, 4261281277UL, 4261281277UL, 4244504061UL, 4177329404UL, 4261281272UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 2700410365UL, 3183173160UL, 877744749UL, 724250162UL, 539108137UL, 421076510UL, 1784746769UL, 2771527529UL, 4261281258UL, 4261281277UL, 4210884093UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4193910013UL, 4261281276UL, 4261281277UL, 3924424188UL, 4261281005UL, 4261281277UL, 4261281020UL, 4261281277UL, 4261215485UL, 4177395197UL, 4261281016UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 3237608957UL, 3160885034UL, 1364352189UL, 724250162UL, 539108137UL, 421076512UL, 1885888275UL, 2991925061UL, 4261281271UL, 4261281277UL, 2828901878UL, 4207588269UL, 3019570685UL, 4261280173UL, 4261078781UL, 2644375037UL, 3820400040UL, 4143840762UL, 914140618UL, 4259755688UL, 2645097981UL, 3820401581UL, 4261281270UL, 4121787560UL, 3019439613UL, 4261260668UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 3858628093UL, 1850484636UL, 1382923708UL, 724250193UL, 539109673UL, 438181920UL, 1265789538UL, 3785109031UL, 4261281275UL, 4261281277UL, 3014883530UL, 4261013962UL, 3925736957UL, 4176065406UL, 4261277165UL, 2910374652UL, 4243180211UL, 4261281277UL, 766044669UL, 4261279203UL, 2642672125UL, 4261013942UL, 4244504061UL, 3866656170UL, 2817128693UL, 4260996989UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4110286333UL, 1277645233UL, 3099442281UL, 741101399UL, 572729643UL, 1766270754UL, 710963311UL, 4088156971UL, 4261281277UL, 4261281277UL, 2829613001UL, 4243442355UL, 4177395197UL, 3871963817UL, 4261281228UL, 2809645564UL, 3989484456UL, 4261281276UL, 2058024445UL, 4261280230UL, 2206397949UL, 4260947635UL, 4177395197UL, 2837152682UL, 2814830282UL, 4260725626UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4227726845UL, 657236964UL, 3166266958UL, 1348122812UL, 1227500104UL, 1886350926UL, 724198250UL, 4209155637UL, 4261281277UL, 4261281277UL, 1936947660UL, 4035213683UL, 4244504061UL, 3313795046UL, 4261281269UL, 1937362173UL, 2222551923UL, 4261281264UL, 2143746301UL, 4261281004UL, 2139418877UL, 4023961257UL, 4194172413UL, 2138679493UL, 2810562986UL, 4260726143UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 731493879UL, 1734363418UL, 3116088505UL, 1920112313UL, 1735366258UL, 807610189UL, 4260803736UL, 4261281277UL, 4261281277UL, 2223359480UL, 3632300418UL, 4261281277UL, 3414214125UL, 4261281272UL, 2244344061UL, 2155971202UL, 4261281240UL, 2294873341UL, 4261281261UL, 2173432061UL, 4176465094UL, 4244504061UL, 1971628744UL, 2810554793UL, 4260727937UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1437657853UL, 1192891182UL, 1919903327UL, 1869771378UL, 659384168UL, 1412375840UL, 4261276334UL, 4261281277UL, 4261281277UL, 2865556989UL, 3716655527UL, 4261281277UL, 3632977912UL, 4261281276UL, 3438149117UL, 2276042666UL, 4261281245UL, 2463759613UL, 4261281266UL, 2374891773UL, 4260949193UL, 4261281277UL, 1992740052UL, 2865139080UL, 4260926346UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 2934504957UL, 287387732UL, 1162094608UL, 1162496586UL, 555622184UL, 2891198500UL, 4261280744UL, 4261281277UL, 4261281277UL, 3874553085UL, 3750807753UL, 4261281277UL, 4053065725UL, 4261281277UL, 4043111933UL, 2429077990UL, 4261281247UL, 2497641981UL, 4261281276UL, 2476080381UL, 4261212108UL, 4261281277UL, 2462904284UL, 3435959183UL, 4261204117UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 3942383101UL, 791779760UL, 286793253UL, 504959251UL, 639901985UL, 3903887921UL, 4261281275UL, 4261281277UL, 4261281277UL, 3604733682UL, 4241871317UL, 4261281277UL, 4074107389UL, 4261281277UL, 3688821501UL, 3587298774UL, 4261281276UL, 3605986813UL, 4261281276UL, 3520462333UL, 3739014869UL, 4261281272UL, 3757636831UL, 4176539285UL, 4261272789UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 1419756275UL, 606482225UL, 606348325UL, 1412509478UL, 4260610719UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281020UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261215485UL, 4261281277UL, 4261281277UL, 4261281277UL, 4244504061UL, 4261281276UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 3051944445UL, 926456228UL, 926365495UL, 3047463736UL, 4261280231UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4194172413UL, 2964710122UL, 2964106156UL, 4192920245UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4143578109UL, 4143379446UL, 4261280761UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4143840765UL, 3942514163UL, 4210490873UL, 3942514173UL, 3942120953UL, 4260625917UL, 3942252029UL, 4143185405UL, 4261018109UL, 4261281277UL, 4261281277UL, 4159962621UL, 4261281277UL, 3941268989UL, 4260817642UL, 4210949629UL, 3941264106UL, 4261281275UL, 4261145334UL, 4261278715UL, 4261281277UL, 4261281277UL, 3941264118UL, 4261281258UL, 3941858813UL, 4260817642UL, 4194172413UL, 4142590698UL, 4261281277UL, 4261278707UL, 3942317565UL, 4226476778UL, 4261281277UL, 4261279466UL, 4261280247UL, 3942055421UL, 4260817642UL, 4261281277UL, 4261281277UL, 4260817661UL, 4261082877UL, 3942317565UL, 4226476778UL, 4093509117UL, 3941264106UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 2667445757UL, 12057859UL, 4196859192UL, 150863357UL, 3145016UL, 4247910120UL, 15203837UL, 151124714UL, 4259617789UL, 4261281277UL, 4261281277UL, 151190269UL, 4261281277UL, 788790781UL, 3875577764UL, 3942514173UL, 2678364928UL, 4261281270UL, 4255056359UL, 4261261463UL, 4261281277UL, 4261281277UL, 2762212664UL, 4261230344UL, 487194109UL, 4259357860UL, 50200061UL, 3030688823UL, 4261281277UL, 4261226022UL, 488963581UL, 4137657508UL, 4261281277UL, 4259971333UL, 4261263263UL, 2583820029UL, 4259357860UL, 4261281277UL, 4261281277UL, 4177723901UL, 4259985661UL, 15400445UL, 4137657499UL, 2935881213UL, 2671181988UL, 4261281274UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 3908959741UL, 641264128UL, 4247780617UL, 939392509UL, 52886793UL, 4256084127UL, 66977277UL, 2537375UL, 4261228537UL, 4261281277UL, 4261281277UL, 10395645UL, 4261281252UL, 2751725053UL, 3070295549UL, 3942514173UL, 4261276160UL, 4261281277UL, 939630333UL, 4261281183UL, 4261281277UL, 4261281277UL, 4261218616UL, 4261226022UL, 940178941UL, 4261281277UL, 16645629UL, 4192922283UL, 4261281277UL, 4261226022UL, 940178941UL, 4261281277UL, 4261281277UL, 4246478118UL, 4261263268UL, 3070290685UL, 4261079786UL, 4261281277UL, 4261281277UL, 805840637UL, 4259985661UL, 15400445UL, 4261281258UL, 4261281277UL, 4256628989UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 3072761603UL, 4254851584UL, 3086876157UL, 798484224UL, 4260771620UL, 654179837UL, 32127014UL, 4261228468UL, 4261281277UL, 4261281277UL, 503129341UL, 4261281060UL, 788790781UL, 3875577764UL, 3942514173UL, 926429440UL, 4261281277UL, 84540925UL, 4261281275UL, 2930048509UL, 4261281277UL, 4261218616UL, 4261226022UL, 151649789UL, 4259461176UL, 66977277UL, 134217728UL, 4261281277UL, 4261226022UL, 940178941UL, 2667657271UL, 4261281277UL, 2667705126UL, 4261263268UL, 129021UL, 4246536192UL, 4261281277UL, 4261281277UL, 15148797UL, 4259985591UL, 15400445UL, 4248254513UL, 4261281277UL, 4256628989UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4197522726UL, 4259454209UL, 4194172413UL, 2766152705UL, 4261225986UL, 2684222973UL, 486352387UL, 4261255709UL, 4261281277UL, 4261281277UL, 808985780UL, 4261276160UL, 2600730109UL, 4260817642UL, 3942514173UL, 4261276160UL, 4261281277UL, 36757757UL, 4261281080UL, 2654535165UL, 4261281277UL, 4261218616UL, 4261226022UL, 940178941UL, 4261281277UL, 4261281277UL, 60816893UL, 4261281277UL, 4261226022UL, 940178941UL, 2751725053UL, 4261281277UL, 27262246UL, 4261263255UL, 4261281277UL, 4245240061UL, 4261281277UL, 4261281277UL, 956114685UL, 4259985155UL, 15400445UL, 4261281258UL, 4261281277UL, 4256628989UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4255908004UL, 4261085468UL, 4261281277UL, 4093313289UL, 4261228544UL, 3942514173UL, 2549952512UL, 4261273600UL, 166198781UL, 4261281277UL, 4261280294UL, 4261228808UL, 2667838973UL, 4261281277UL, 3942514173UL, 3082267648UL, 4261281270UL, 3036491751UL, 4261273600UL, 4261281277UL, 4261281277UL, 3082225208UL, 4261228828UL, 638189053UL, 4259821495UL, 3086876157UL, 104314807UL, 4261281277UL, 4261226022UL, 639499773UL, 2667755447UL, 4261281277UL, 167640358UL, 4261263105UL, 3082287869UL, 4246546103UL, 838729213UL, 4261281188UL, 4210894589UL, 4259971333UL, 15400445UL, 4139235244UL, 4261281277UL, 4256628989UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261001209UL, 4261274858UL, 4261281277UL, 4261274856UL, 4261278688UL, 4261281277UL, 4143838176UL, 4261280695UL, 3086482941UL, 4261281277UL, 4261281255UL, 4261274346UL, 4091608573UL, 4261281277UL, 4194172413UL, 3082270647UL, 4261281273UL, 4261280231UL, 4261275616UL, 4261281277UL, 4261281277UL, 3082270698UL, 4261280183UL, 3085106685UL, 4260018103UL, 3774742013UL, 4088903607UL, 4261281277UL, 4261275623UL, 3086417405UL, 4091852727UL, 4261281277UL, 4143840740UL, 4261279671UL, 3082288637UL, 4260804535UL, 3892182525UL, 4261281258UL, 4261275642UL, 4261066730UL, 3086614013UL, 4189566903UL, 4261281277UL, 4260804602UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL, 4261281277UL }; + +#define REG_BG2X (*(volatile AAS_u32 *)0x4000028) +#define REG_BG2Y (*(volatile AAS_u32 *)0x400002C) +#define REG_BG2PA (*(volatile AAS_u16 *)0x4000020) +#define REG_BG2PD (*(volatile AAS_u16 *)0x4000026) + +static void AAS_AddBrightness( int add ) +{ + int i, r, g, b, val, t; + AAS_u16* dest = (AAS_u16*)0x5000000; + const AAS_u16* palette_pos = AAS_Logo_Palette; + + for( i = 256; i > 0; --i ) + { + val = *palette_pos++; + r = AAS_Min( (val>>10)+add, 31 ); + g = AAS_Min( ((val>>5)&0x1f)+add, 31 ); + b = AAS_Min( (val&0x1f)+add, 31 ); + *dest++ = r + (g<<5) + (b<<10); + } +} + +static void AAS_AddBrightness2( int add ) +{ + int i, r, g, b, val, t; + AAS_u16* dest = (AAS_u16*)0x5000000; + const AAS_u16* palette_pos = AAS_Logo_Palette; + + ++palette_pos; + ++dest; + + for( i = 255; i > 0; --i ) + { + val = *palette_pos++; + r = AAS_Min( (val>>10)+add, 31 ); + g = AAS_Min( ((val>>5)&0x1f)+add, 31 ); + b = AAS_Min( (val&0x1f)+add, 31 ); + *dest++ = r + (g<<5) + (b<<10); + } +} + +static void AAS_SetBrightness( int brightness ) +{ + int i, r, g, b, val, t; + AAS_u16* dest = (AAS_u16*)0x5000000; + const AAS_u16* palette_pos = AAS_Logo_Palette; + + for( i = 256; i > 0; --i ) + { + val = *palette_pos++; + r = ((val>>10)*brightness)>>5; + g = (((val>>5)&0x1f)*brightness)>>5; + b = ((val&0x1f)*brightness)>>5; + *dest++ = r + (g<<5) + (b<<10); + } +} + +static void AAS_BlankFrame( AAS_u32 val ) +{ + AAS_u32* dest_pos = (AAS_u32*)0x06000000; + int i; + + for( i = 9600; i > 0; --i ) + *dest_pos++ = val; +} + +static void AAS_CopyFrame() +{ + const AAS_u32* source_pos = AAS_Logo_Image; + AAS_u32* dest_pos = (AAS_u32*)(0x06000000 + (240*51)); + int i; + + for( i = 2880; i > 0; --i ) + *dest_pos++ = *source_pos++; +} + +static void AAS_WaitVBlank() +{ + while( REG_VCOUNT >= 160 ); + while( REG_VCOUNT < 160 ); +} + +void AAS_ShowLogo() +{ + int i, tmpx, tmpy; + + AAS_WaitVBlank(); + AAS_AddBrightness( 32 ); + DISPCNT = 0x0444; + AAS_BlankFrame( 0xfdfdfdfd ); + AAS_CopyFrame(); + + for( i = 31; i >= 0; --i ) + { + AAS_WaitVBlank(); + AAS_AddBrightness( i ); + } + + for( i = 120; i > 0; --i ) + { + AAS_WaitVBlank(); + } + + for( i = 0; i <= 15; ++i ) + { + AAS_WaitVBlank(); + + if ( i > 0 ) + { + tmpy = i<<10; + REG_BG2PD = tmpy; + REG_BG2Y = 20480-(80*tmpy); + } + + AAS_AddBrightness2( i ); + } + + for( i = 16; i <= 31; ++i ) + { + AAS_WaitVBlank(); + + tmpx = (i-16)<<11; + tmpy = i<<10; + REG_BG2PA = tmpx; + REG_BG2PD = tmpy; + REG_BG2X = 30720-(120*tmpx); + REG_BG2Y = 20480-(80*tmpy); + + AAS_AddBrightness2( i ); + } + + for( i = 31; i >= 0; --i ) + { + AAS_SetBrightness( i ); + AAS_WaitVBlank(); + } + + AAS_BlankFrame( 0 ); + + REG_BG2PA = 256; + REG_BG2PD = 256; + REG_BG2X = 30720-(120*256); + REG_BG2Y = 20480-(80*256); +} diff --git a/lib/apex-audio-system/src/aas/AAS_MOD.c b/lib/apex-audio-system/src/aas/AAS_MOD.c new file mode 100644 index 0000000..4e9aff8 --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS_MOD.c @@ -0,0 +1,1047 @@ +// Copyright (c) 2003-2021 James Daniels +// Distributed under the MIT License +// license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +#include "AAS_Shared.h" + +AAS_s16 AAS_mod_num AAS_IN_EWRAM = -1; +AAS_u8 AAS_mod_num_chans AAS_IN_EWRAM = 0; + +static AAS_s16 AAS_mod_num_store AAS_IN_EWRAM = -2; +static AAS_u16 AAS_mod_song_pos AAS_IN_EWRAM; +static AAS_u16 AAS_mod_line_num AAS_IN_EWRAM; + +struct AAS_MOD_Channel +{ + AAS_u32* pattern; + const AAS_u8* samp_start; + AAS_u16 effect; + AAS_u16 period; + AAS_u16 slide_target_period; + AAS_u8 samp_num; + AAS_u8 slide_rate; + AAS_u8 volume; + AAS_u8 vibrato_rate; + AAS_u8 vibrato_depth; + AAS_u8 vibrato_pos; + AAS_u8 tremolo_rate; + AAS_u8 tremolo_depth; + AAS_u8 tremolo_pos; + AAS_s8 trigger; + AAS_u8 arpeggio_pos; + AAS_u8 note; +}; // 28 bytes + +static struct AAS_MOD_Channel AAS_mod_chan[AAS_MAX_CHANNELS] AAS_IN_EWRAM; + +static AAS_s32 AAS_mod_timer AAS_IN_EWRAM; +static AAS_u32 AAS_mod_tempo AAS_IN_EWRAM; +static AAS_u8 AAS_mod_bpm AAS_IN_EWRAM; +static AAS_u8 AAS_mod_speed AAS_IN_EWRAM; +static AAS_BOOL AAS_mod_looped AAS_IN_EWRAM = AAS_FALSE; +static AAS_s16 AAS_mod_overall_volume AAS_IN_EWRAM = 256; +static AAS_u8 AAS_mod_loop_start AAS_IN_EWRAM = 0; +static AAS_s8 AAS_mod_loop_counter AAS_IN_EWRAM = 0; +static AAS_BOOL AAS_mod_loop AAS_IN_EWRAM = AAS_TRUE; +static AAS_u8 AAS_mod_last_filter_value AAS_IN_EWRAM = 0; +static AAS_BOOL AAS_mod_active_effects AAS_IN_EWRAM = AAS_FALSE; +static AAS_s8 AAS_mod_next_song_pos AAS_IN_EWRAM = -1; + +int AAS_MOD_GetNumChannels() +{ + return AAS_mod_num_chans; +} + +int AAS_MOD_GetLastFilterValue() +{ + return AAS_mod_last_filter_value; +} + +int AAS_MOD_QueueSongPos( int song_pos ) +{ + if ( AAS_mod_num >= 0 ) + { + if ( (song_pos >= 0) && (song_pos < 128) ) + { + if ( AAS_Sequence[AAS_mod_num][song_pos][0] == -1 ) + { + return AAS_ERROR_INVALID_SONG_POS; + } + else + { + AAS_mod_next_song_pos = song_pos; + + return AAS_OK; + } + } + else + { + return AAS_ERROR_INVALID_SONG_POS; + } + } + else + { + return AAS_ERROR_NO_MOD_PLAYING; + } +} + +int AAS_MOD_SetSongPos( int song_pos ) +{ + if ( AAS_mod_num >= 0 ) + { + if ( (song_pos >= 0) && (song_pos < 128) ) + { + if ( AAS_Sequence[AAS_mod_num][song_pos][0] == -1 ) + { + return AAS_ERROR_INVALID_SONG_POS; + } + else + { + struct AAS_MOD_Channel* mod_chan = AAS_mod_chan; + int chan; + + for( chan = 0; chan < AAS_mod_num_chans; ++chan ) + { + mod_chan->pattern = (AAS_u32*)(AAS_PatternData + (((int)AAS_Sequence[AAS_mod_num][song_pos][chan])<<8)); + ++mod_chan; + } + AAS_mod_line_num = 0; + AAS_mod_song_pos = song_pos; + + return AAS_OK; + } + } + else + { + return AAS_ERROR_INVALID_SONG_POS; + } + } + else + { + return AAS_ERROR_NO_MOD_PLAYING; + } +} + +int AAS_MOD_GetSongPos() +{ + if ( AAS_mod_num >= 0 ) + return AAS_mod_song_pos; + else + return AAS_ERROR_NO_MOD_PLAYING; +} + +int AAS_MOD_GetLineNum() +{ + if ( AAS_mod_num >= 0 ) + return AAS_mod_line_num; + else + return AAS_ERROR_NO_MOD_PLAYING; +} + +int AAS_MOD_GetVolume() +{ + return AAS_mod_overall_volume; +} + +int AAS_MOD_SetVolume( int vol ) +{ + if ( (vol >= 0) && (vol <= 256) ) + { + int i; + + for( i = AAS_mod_num_chans-1; i >= 0; --i ) + AAS_channels[AAS_chan_rearrange[i]].volume = (AAS_mod_chan[i].volume*vol)>>AAS_volscale; + + AAS_mod_overall_volume = vol; + + return AAS_OK; + } + else + { + return AAS_ERROR_VOLUME_OUT_OF_RANGE; + } +} + +void AAS_MOD_Pause() +{ + int i; + + AAS_mod_num_store = AAS_mod_num; + AAS_mod_num = -1; + + for( i = 0; i < AAS_mod_num_chans; ++i ) + { + AAS_channels[AAS_chan_rearrange[i]].active = AAS_FALSE; + } +} + +void AAS_MOD_Resume() +{ + if ( AAS_mod_num_store != -2 ) + { + struct AAS_Channel* ch; + int i; + + for( i = 0; i < AAS_mod_num_chans; ++i ) + { + ch = &AAS_channels[AAS_chan_rearrange[i]]; + + if ( !ch->active ) + { + if ( ch->loop_length ) + { + ch->active = AAS_TRUE; + } + else + { + if ( ch->pos < ((ch->end - (ch->delta>>6)) - 1) ) + { + ch->active = AAS_TRUE; + } + } + } + } + + AAS_mod_num = AAS_mod_num_store; + } +} + +void AAS_MOD_Stop() +{ + int i; + struct AAS_Channel* ch; + AAS_mod_num_store = -2; + AAS_mod_num = -1; + AAS_mod_next_song_pos = -1; + + for( i = 0; i < AAS_mod_num_chans; ++i ) + { + ch = &AAS_channels[AAS_chan_rearrange[i]]; + ch->active = AAS_FALSE; + ch->loop_length = 0; + ch->pos = 0; + ch->end = 0; + ch->delta = 0; + AAS_mod_chan[i].tremolo_pos = 0; + AAS_mod_chan[i].vibrato_pos = 0; + AAS_mod_chan[i].effect = 0; + AAS_mod_chan[i].volume = 0; + AAS_mod_chan[i].trigger = -1; + AAS_mod_chan[i].note = 0; + AAS_mod_chan[i].slide_target_period = 0; + } + AAS_mod_active_effects = AAS_FALSE; + AAS_mod_looped = AAS_FALSE; + AAS_mod_loop_counter = 0; + AAS_mod_loop_start = 0; + AAS_mod_last_filter_value = 0; + AAS_mod_num_chans = 0; +} + +AAS_BOOL AAS_MOD_HasLooped() +{ + return AAS_mod_looped; +} + +AAS_BOOL AAS_MOD_IsPlaying() +{ + return (AAS_mod_num>=0); +} + +int AAS_MOD_Play( int song_num ) +{ + AAS_MOD_Stop(); + + if ( AAS_initialised ) + { + if ( (song_num >= 0) && (song_num < AAS_DATA_NUM_MODS) && AAS_NumChans[song_num] ) + { + int i; + + if ( AAS_volscale == 9 ) + i = 16; + else if ( AAS_volscale == 8 ) + i = 8; + else + i = 4; + + if ( AAS_NumChans[song_num] > i ) + { + return AAS_ERROR_NOT_ENOUGH_CHANNELS; + } + else + { + //AAS_mod_num = 0; + AAS_mod_loop = AAS_TRUE; + AAS_mod_num_store = -2; + AAS_mod_song_pos = 0; + AAS_mod_num_chans = AAS_NumChans[song_num]; + + for( i = 0; i < AAS_mod_num_chans; ++i ) + AAS_mod_chan[i].pattern = (AAS_u32*)(AAS_PatternData + (((int)AAS_Sequence[song_num][0][i])<<8)); + + AAS_mod_line_num = 0; + AAS_mod_speed = 6; + AAS_mod_bpm = 125; + AAS_mod_tempo = AAS_DivTable[AAS_mod_speed]*AAS_mod_bpm; + AAS_mod_timer = 0x7d0000 - AAS_mod_tempo; + AAS_mod_num = song_num; + return AAS_OK; + } + } + else + { + return AAS_ERROR_MOD_DOES_NOT_EXIST; + } + } + else + { + return AAS_ERROR_CALL_SET_CONFIG_FIRST; + } +} + +int AAS_MOD_SetLoop( AAS_BOOL loop ) +{ + if ( AAS_initialised ) + { + if ( AAS_mod_num >= 0 ) + { + AAS_mod_loop = loop; + return AAS_OK; + } + else + { + return AAS_ERROR_NO_MOD_PLAYING; + } + } + else + { + return AAS_ERROR_CALL_SET_CONFIG_FIRST; + } +} + +void AAS_MOD_Interrupt() +{ + if ( AAS_mod_num >= 0 ) + { + AAS_mod_timer += AAS_mod_tempo; + + if ( AAS_mod_timer < 0x7d0000 ) + { + if ( AAS_mod_active_effects ) + { + const AAS_u8* chan_rearrange = AAS_chan_rearrange; + struct AAS_MOD_Channel* mod_chan = AAS_mod_chan; + int chan, num_chans; + + num_chans = AAS_mod_num_chans; + + for( chan = 0; chan < num_chans; ++chan ) + { + int effect; + + effect = mod_chan->effect; + + if ( effect ) + { + int val, tmp, output; + struct AAS_Channel* out_chan; + + tmp = chan_rearrange[chan]; + out_chan = &AAS_channels[tmp]; + output = tmp>>3; + + switch( effect>>8 ) + { + case 0xe: // extended effects + switch( effect&0xf0 ) + { + case 0xc0: // note cut + val = effect&0xf; + --val; + if ( val <= 0 ) + { + mod_chan->effect = 0; + out_chan->active = AAS_FALSE; + + AAS_changed[output] = AAS_TRUE; + } + else + { + mod_chan->effect = (effect&0xff0)+val; + } + break; + + case 0x90: // retrigger sample + case 0xd0: // delay sample + if ( mod_chan->trigger >= 0 ) + { + --mod_chan->trigger; + if ( mod_chan->trigger < 0 ) + { + const struct AAS_ModSample* samp = &AAS_ModSamples[AAS_mod_num][mod_chan->samp_num]; + int repeat = samp->repeat; + int length = samp->length; + const AAS_s8* data = AAS_SampleData + samp->data; + + mod_chan->samp_start = data; + out_chan->pos = data; + out_chan->pos_fraction = 0; + if ( repeat == 65535 ) + out_chan->loop_length = 0; + else + out_chan->loop_length = ((AAS_u32)(length - repeat))<<1; + out_chan->end = data + (length<<1); + out_chan->frequency = AAS_MOD_period_conv_table[mod_chan->period]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + out_chan->active = AAS_TRUE; + + AAS_changed[output] = AAS_TRUE; + } + } + break; + + default: + break; + } + break; + + case 0x6: // vibrato + volume slide + val = mod_chan->vibrato_pos; + val += mod_chan->vibrato_rate; + if ( val >= 64 ) + val -= 64; + mod_chan->vibrato_pos = val; + tmp = mod_chan->period + (((AAS_sin[val]*mod_chan->vibrato_depth)+32)>>6); + if ( tmp < 113 ) + tmp = 113; + if ( tmp > 856 ) + tmp = 856; + out_chan->frequency = AAS_MOD_period_conv_table[tmp]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + // Intentionally no "break;" + + case 0xa: // volume slide + val = effect&0xf0; + if ( val ) + val >>= 4; + else + val = -(effect&0xf); + tmp = mod_chan->volume; + tmp += val; + if ( tmp > 64 ) + tmp = 64; + else if ( tmp < 0 ) + tmp = 0; + mod_chan->volume = tmp; + out_chan->volume = (tmp*AAS_mod_overall_volume)>>AAS_volscale; + + AAS_changed[output] = AAS_TRUE; + break; + + case 0x1: // slide up + val = effect&0xff; + tmp = mod_chan->period - val; + if ( tmp < 113 ) + tmp = 113; + mod_chan->period = tmp; + out_chan->frequency = AAS_MOD_period_conv_table[tmp]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + + AAS_changed[output] = AAS_TRUE; + break; + + case 0x2: // slide down + val = effect&0xff; + tmp = mod_chan->period + val; + if ( tmp > 856 ) + tmp = 856; + mod_chan->period = tmp; + out_chan->frequency = AAS_MOD_period_conv_table[tmp]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + + AAS_changed[output] = AAS_TRUE; + break; + + case 0x3: // tone portamento + val = mod_chan->period; + tmp = mod_chan->slide_target_period; + if ( val < tmp ) + { + val += mod_chan->slide_rate; + if ( val >= tmp ) + { + mod_chan->effect = 0; + val = tmp; + } + } + else if ( val > tmp ) + { + val -= mod_chan->slide_rate; + if ( val <= tmp ) + { + mod_chan->effect = 0; + val = tmp; + } + } + else if ( val == tmp ) + { + mod_chan->effect = 0; + } + mod_chan->period = val; + out_chan->frequency = AAS_MOD_period_conv_table[val]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + + AAS_changed[output] = AAS_TRUE; + break; + + case 0x5: // tone portamento + volume slide + val = mod_chan->period; + tmp = mod_chan->slide_target_period; + if ( val < tmp ) + { + val += mod_chan->slide_rate; + if ( val >= tmp ) + val = tmp; + } + else if ( val > tmp ) + { + val -= mod_chan->slide_rate; + if ( val <= tmp ) + val = tmp; + } + mod_chan->period = val; + out_chan->frequency = AAS_MOD_period_conv_table[val]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + + val = effect&0xf0; + if ( val ) + val >>= 4; + else + val = -(effect&0xf); + tmp = mod_chan->volume; + tmp += val; + if ( tmp > 64 ) + tmp = 64; + else if ( tmp < 0 ) + tmp = 0; + mod_chan->volume = tmp; + out_chan->volume = (tmp*AAS_mod_overall_volume)>>AAS_volscale; + + AAS_changed[output] = AAS_TRUE; + break; + + case 0x4: // vibrato + val = mod_chan->vibrato_pos; + val += mod_chan->vibrato_rate; + if ( val >= 64 ) + val -= 64; + mod_chan->vibrato_pos = val; + tmp = mod_chan->period + (((AAS_sin[val]*mod_chan->vibrato_depth)+32)>>6); + if ( tmp < 113 ) + tmp = 113; + else if ( tmp > 856 ) + tmp = 856; + out_chan->frequency = AAS_MOD_period_conv_table[tmp]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + + AAS_changed[output] = AAS_TRUE; + break; + + case 0x7: // tremolo + val = mod_chan->tremolo_pos; + val += mod_chan->tremolo_rate; + if ( val >= 64 ) + val -= 64; + mod_chan->tremolo_pos = val; + tmp = mod_chan->volume + (((AAS_sin[val]*mod_chan->tremolo_depth)+32)>>6); + if ( tmp < 0 ) + tmp = 0; + else if ( tmp > 64 ) + tmp = 64; + out_chan->volume = (tmp*AAS_mod_overall_volume)>>AAS_volscale; + + AAS_changed[output] = AAS_TRUE; + break; + + case 0x0: // possible arpeggio + tmp = effect & 0xff; + if ( tmp ) // definite arpeggio + { + ++mod_chan->arpeggio_pos; + val = mod_chan->note; + switch( mod_chan->arpeggio_pos ) + { + case 0: + break; + + case 1: + val += tmp>>4; + break; + + case 2: + val += tmp&0xf; + // Intentionally no "break;" to allow AAS_mod_arpeggio_pos[chan] to be restarted + + default: + mod_chan->arpeggio_pos = 0; + break; + } + + if ( val ) + { + out_chan->frequency = AAS_MOD_period_conv_table[AAS_period_table[AAS_ModSamples[AAS_mod_num][mod_chan->samp_num].finetune][val-1]]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + + AAS_changed[output] = AAS_TRUE; + } + } + break; + + default: + break; + } + } + + ++mod_chan; + } + } + } + else + { + const AAS_u8* chan_rearrange = AAS_chan_rearrange; + struct AAS_MOD_Channel* mod_chan = AAS_mod_chan; + int chan, num_chans; + int samp_num, effect, period, speed, tmp; + int jump_ahead = -1; + int jump_song_pos = -1; + AAS_BOOL active_effects = AAS_FALSE; + const struct AAS_ModSample* mod_samp = AAS_ModSamples[AAS_mod_num]; + + num_chans = AAS_mod_num_chans; + + AAS_mod_timer -= 0x7d0000; + + for( chan = 0; chan < num_chans; ++chan ) + { + int output; + struct AAS_Channel* out_chan; + AAS_u32 dat; + + tmp = chan_rearrange[chan]; + out_chan = &AAS_channels[tmp]; + output = tmp>>3; + + // Tidy up after arpeggio + effect = mod_chan->effect; + if ( effect ) + { + if ( effect < 0x100 ) + { + tmp = mod_chan->note; + if ( tmp ) + { + out_chan->frequency = AAS_MOD_period_conv_table[AAS_period_table[mod_samp[mod_chan->samp_num].finetune][tmp-1]]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + + AAS_changed[output] = AAS_TRUE; + } + } + } + + dat = *mod_chan->pattern++; + samp_num = (dat>>24)-1; + period = (dat>>12)&0xfff; + effect = dat&0xfff; + + if ( samp_num >= 0 ) + { + mod_chan->samp_num = samp_num; + mod_chan->volume = tmp = mod_samp[samp_num].volume; + out_chan->volume = (tmp*AAS_mod_overall_volume)>>AAS_volscale; + + AAS_changed[output] = AAS_TRUE; + } + else + { + samp_num = mod_chan->samp_num; + } + + if ( period ) + { + if ( samp_num >= 0 ) + { + const struct AAS_ModSample* samp = &mod_samp[samp_num]; + + mod_chan->note = period; + period = AAS_period_table[samp->finetune][period-1]; + + if ( (effect > 0xed0) && (effect < 0xee0) ) // delay sample + { + mod_chan->period = period; + mod_chan->trigger = (effect&0xf)-1; + } + else + { + tmp = effect>>8; + + if ( (tmp != 0x3) && (tmp != 0x5) ) + { + int repeat = samp->repeat; + int length = samp->length; + const AAS_s8* data = AAS_SampleData + samp->data; + + mod_chan->samp_start = data; + out_chan->pos = data; + out_chan->pos_fraction = 0; + mod_chan->period = period; + if ( repeat == 65535 ) + out_chan->loop_length = 0; + else + out_chan->loop_length = ((AAS_u32)(length - repeat))<<1; + out_chan->end = data + (length<<1); + out_chan->frequency = AAS_MOD_period_conv_table[period]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + out_chan->active = AAS_TRUE; + + AAS_changed[output] = AAS_TRUE; + } + } + } + } + + if ( effect ) + { + switch( effect>>8 ) + { + case 0xf: // set speed + speed = effect&0xff; + if ( speed > 0 ) + { + if ( speed > 31 ) + AAS_mod_bpm = speed; + else + AAS_mod_speed = speed; + + //AAS_mod_tempo = (((1<<15)*AAS_mod_bpm*24)/(3000*AAS_mod_speed))<<13; // use LUT + + // approximately: + //AAS_mod_tempo = AAS_DivTable[AAS_mod_speed]*AAS_mod_bpm*33; + AAS_mod_tempo = AAS_DivTable[AAS_mod_speed]*AAS_mod_bpm; + } + effect = 0; // No need to process this effect again + break; + + case 0xe: // extended effects + switch( effect&0xf0 ) + { + case 0x00: // set filter (used to send messages to code instead) + AAS_mod_last_filter_value = effect&0xf; + effect = 0; // No need to process this effect again + break; + + case 0x10: // fine slide up + tmp = mod_chan->period - (effect&0xf); + if ( tmp < 113 ) + tmp = 113; + mod_chan->period = tmp; + out_chan->frequency = AAS_MOD_period_conv_table[tmp]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + effect = 0; // No need to process this effect again + + AAS_changed[output] = AAS_TRUE; + break; + + case 0x20: // fine slide down + tmp = mod_chan->period + (effect&0xf); + if ( tmp > 856 ) + tmp = 856; + mod_chan->period = tmp; + out_chan->frequency = AAS_MOD_period_conv_table[tmp]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + effect = 0; // No need to process this effect again + + AAS_changed[output] = AAS_TRUE; + break; + + case 0x60: // set/jump to loop + tmp = effect & 0xf; + if ( tmp ) + { + if ( AAS_mod_loop_counter ) + --AAS_mod_loop_counter; + else + AAS_mod_loop_counter = tmp; + + if ( AAS_mod_loop_counter ) + { + int i; + struct AAS_MOD_Channel* mod_chan2 = AAS_mod_chan; + + for( i = 0; i < num_chans; ++i ) + { + mod_chan2->pattern = (AAS_u32*)(AAS_PatternData + (((int)AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][i])<<8)); + mod_chan2->pattern += AAS_mod_loop_start; + ++mod_chan2; + } + AAS_mod_line_num = AAS_mod_loop_start; + } + } + else + { + AAS_mod_loop_start = AAS_mod_line_num; + } + effect = 0; // No need to process this effect again + break; + + case 0x90: // retrigger sample + mod_chan->trigger = (effect&0xf)-1; + break; + + case 0xa0: // fine volume slide up + tmp = mod_chan->volume; + tmp += effect&0xf; + if ( tmp > 64 ) + tmp = 64; + mod_chan->volume = tmp; + out_chan->volume = (tmp*AAS_mod_overall_volume)>>AAS_volscale; + effect = 0; // No need to process this effect again + + AAS_changed[output] = AAS_TRUE; + break; + + case 0xb0: // fine volume slide down + tmp = mod_chan->volume; + tmp -= effect&0xf; + if ( tmp < 0 ) + tmp = 0; + mod_chan->volume = tmp; + out_chan->volume = (tmp*AAS_mod_overall_volume)>>AAS_volscale; + effect = 0; // No need to process this effect again + + AAS_changed[output] = AAS_TRUE; + break; + + case 0xc0: // note cut + if ( (effect&0xf) == 0 ) + { + effect = 0; + out_chan->active = AAS_FALSE; + AAS_changed[output] = AAS_TRUE; + } + break; + + case 0xe0: // pattern delay + AAS_mod_timer -= (effect&0xf)*0x7d0000; + effect = 0; // No need to process this effect again + break; + + default: + break; + } + break; + + case 0xd: // pattern break + //jump_ahead = (((effect>>4)&0xf)*10)+(effect&0xf); + jump_ahead = effect&0xff; + effect = 0; // No need to process this effect again + break; + + case 0xc: // set volume + mod_chan->volume = tmp = effect&0xff; + out_chan->volume = (tmp*AAS_mod_overall_volume)>>AAS_volscale; + effect = 0; // No need to process this effect again + + AAS_changed[output] = AAS_TRUE; + break; + + case 0xb: // position jump + jump_song_pos = effect&0xff; + effect = 0; // No need to process this effect again + break; + + case 0x9: // set sample offset + tmp = effect & 0xff; + if ( tmp ) + { + const AAS_s8* new_pos = mod_chan->samp_start + (tmp<<8); + + if ( new_pos >= out_chan->end ) + { + out_chan->active = AAS_FALSE; + + AAS_changed[output] = AAS_TRUE; + } + else + out_chan->pos = new_pos; + } + effect = 0; // No need to process this effect again + break; + + case 0x7: // tremolo + if ( effect & 0xf0 ) + mod_chan->tremolo_rate = (effect & 0xf0)>>4; + if ( effect & 0xf ) + mod_chan->tremolo_depth = effect & 0xf; + if ( effect & 0xff ) + mod_chan->tremolo_pos = 0; + break; + + case 0x4: // vibrato + if ( effect & 0xf0 ) + mod_chan->vibrato_rate = (effect & 0xf0)>>4; + if ( effect & 0xf ) + mod_chan->vibrato_depth = effect & 0xf; + if ( effect & 0xff ) + mod_chan->vibrato_pos = 0; + break; + + case 0x3: // tone portamento + tmp = effect & 0xff; + if ( tmp ) + mod_chan->slide_rate = tmp; + + if ( period ) + mod_chan->slide_target_period = period; + else if ( mod_chan->slide_target_period == 0 ) + effect = 0; + break; + + case 0x0: // possible arpeggio + tmp = effect & 0xff; + if ( tmp ) // definite arpeggio + { + tmp = mod_chan->note; + mod_chan->arpeggio_pos = 0; + if ( tmp ) + { + out_chan->frequency = AAS_MOD_period_conv_table[AAS_period_table[mod_samp[mod_chan->samp_num].finetune][tmp-1]]; + out_chan->delta = AAS_Min( 4095, ((out_chan->frequency*AAS_mix_scale)+32768)>>16 ); + + AAS_changed[output] = AAS_TRUE; + } + } + break; + + default: + //printf_special( "effect:%p period:%d samp:%d\n", effect, period, samp_num ); + break; + } + } + + mod_chan->effect = effect; + if ( effect ) + active_effects = AAS_TRUE; + ++mod_chan; + } + + AAS_mod_active_effects = active_effects; + + if ( jump_ahead >= 0 ) + { + AAS_mod_loop_start = 0; + ++AAS_mod_song_pos; + if ( AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][0] == -1 ) + { + AAS_mod_looped = AAS_TRUE; + AAS_mod_song_pos = 0; + mod_chan = AAS_mod_chan; + for( chan = num_chans; chan > 0; --chan ) + { + mod_chan->slide_target_period = 0; + ++mod_chan; + } + } + + mod_chan = AAS_mod_chan; + for( chan = 0; chan < num_chans; ++chan ) + { + mod_chan->pattern = (AAS_u32*)(AAS_PatternData + (((int)AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][chan])<<8)); + mod_chan->pattern += jump_ahead; + ++mod_chan; + } + AAS_mod_line_num = jump_ahead; + } + else if ( jump_song_pos >= 0 ) + { + AAS_mod_loop_start = 0; + if ( jump_song_pos < 128 ) + { + AAS_mod_song_pos = jump_song_pos; + if ( AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][0] == -1 ) + { + AAS_mod_looped = AAS_TRUE; + mod_chan = AAS_mod_chan; + for( chan = num_chans; chan > 0; --chan ) + { + mod_chan->slide_target_period = 0; + ++mod_chan; + } + AAS_mod_song_pos = 0; + } + } + else + { + AAS_mod_looped = AAS_TRUE; + mod_chan = AAS_mod_chan; + for( chan = num_chans; chan > 0; --chan ) + { + mod_chan->slide_target_period = 0; + ++mod_chan; + } + AAS_mod_song_pos = 0; + } + + mod_chan = AAS_mod_chan; + for( chan = 0; chan < num_chans; ++chan ) + { + mod_chan->pattern = (AAS_u32*)(AAS_PatternData + (((int)AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][chan])<<8)); + ++mod_chan; + } + AAS_mod_line_num = 0; + } + else + { + ++AAS_mod_line_num; + if ( AAS_mod_line_num > 63 ) + { + AAS_mod_line_num = 0; + AAS_mod_loop_start = 0; + + if ( AAS_mod_next_song_pos == -1 ) + { + ++AAS_mod_song_pos; + } + else + { + AAS_mod_song_pos = AAS_mod_next_song_pos; + AAS_mod_next_song_pos = -1; + } + + if ( AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][0] == -1 ) + { + AAS_mod_looped = AAS_TRUE; + mod_chan = AAS_mod_chan; + for( chan = num_chans; chan > 0; --chan ) + { + mod_chan->slide_target_period = 0; + ++mod_chan; + } + AAS_mod_song_pos = AAS_RestartPos[AAS_mod_num]; + } + + mod_chan = AAS_mod_chan; + for( chan = 0; chan < num_chans; ++chan ) + { + mod_chan->pattern = (AAS_u32*)(AAS_PatternData + (((int)AAS_Sequence[AAS_mod_num][AAS_mod_song_pos][chan])<<8)); + ++mod_chan; + } + } + } + + if ( AAS_mod_looped ) + if ( !AAS_mod_loop ) + AAS_MOD_Stop(); + } + } +} diff --git a/lib/apex-audio-system/src/aas/AAS_Main.c b/lib/apex-audio-system/src/aas/AAS_Main.c new file mode 100644 index 0000000..3a484d6 --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS_Main.c @@ -0,0 +1,802 @@ +// Copyright (c) 2003-2021 James Daniels +// Distributed under the MIT License +// license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +#include "AAS_Shared.h" + +extern const int AAS_data_v111; +int AAS_lib_v111 AAS_IN_EWRAM; + +static AAS_BOOL AAS_da_active AAS_IN_EWRAM; +static AAS_BOOL AAS_db_active AAS_IN_EWRAM; +static AAS_BOOL AAS_dynamic_mix_rate AAS_IN_EWRAM; + +// 0 = 0 Hz mix rate +// 1 = 800 Hz mix rate, 16 byte mix buffer +// 2 = 1600 Hz mix rate, 32 byte mix buffer +// n = 800n Hz mix rate, 16n byte mix buffer +// n <= 40 +// REG_TM1D = 0x10000 - 16n; +// REG_TM0D = AAS_tick_rate[n]; // 0x10000 - ((int)(16777216/800n)); +static AAS_u8 AAS_req_mix_rate AAS_IN_EWRAM; +static AAS_u8 AAS_next_mix_rate AAS_IN_EWRAM; + +static AAS_u8* AAS_next_mixing_buffer AAS_IN_EWRAM; + +static AAS_BOOL AAS_DSA_first AAS_IN_EWRAM = AAS_TRUE; + +static AAS_u8 AAS_MaxChans AAS_IN_EWRAM = 4; + +static AAS_BOOL AAS_Loud AAS_IN_EWRAM = AAS_FALSE; +static AAS_u8 AAS_MixAudio_Mode AAS_IN_EWRAM = AAS_MIXAUDIO_MODE_NORMAL; + +void AAS_MixAudio_SetMode( int mode ) +{ + if ( mode != AAS_MixAudio_Mode ) + { + switch( mode ) + { + case AAS_MIXAUDIO_MODE_NORMAL: + AAS_MixAudio_SetMode_Normal(); + AAS_MixAudio_Mode = AAS_MIXAUDIO_MODE_NORMAL; + AAS_changed[0] = AAS_TRUE; + AAS_changed[1] = AAS_TRUE; + break; + + case AAS_MIXAUDIO_MODE_BOOST: + AAS_MixAudio_SetMode_Boost(); + AAS_MixAudio_Mode = AAS_MIXAUDIO_MODE_BOOST; + AAS_changed[0] = AAS_TRUE; + AAS_changed[1] = AAS_TRUE; + break; + + case AAS_MIXAUDIO_MODE_BOOSTANDCLIP: + AAS_MixAudio_SetMode_BoostAndClip(); + AAS_MixAudio_Mode = AAS_MIXAUDIO_MODE_BOOSTANDCLIP; + AAS_changed[0] = AAS_TRUE; + AAS_changed[1] = AAS_TRUE; + break; + + default: + break; + } + } +} + +static void AAS_DoConfig( int mix_rate, int volscale, AAS_BOOL stereo, AAS_BOOL dynamic, AAS_BOOL loud, int chans ) +{ + struct AAS_Channel* ch; + int i; + + AAS_MOD_Stop(); + + if ( !AAS_initialised ) + { + REG_SOUNDCNT_X = 0x0080; // turn sound chip on + + REG_DMA1SAD = (AAS_u32)AAS_mix_buffer; //dma1 source + REG_DMA1DAD = 0x040000a0; //write to FIFO A address + REG_DMA1CNT_H = 0xb600; //dma control: DMA enabled+ start on FIFO+32bit+repeat+increment source&dest + + REG_DMA2SAD = (AAS_u32)(AAS_mix_buffer + 160); //dma2 source + REG_DMA2DAD = 0x040000a4; //write to FIFO B address + REG_DMA2CNT_H = 0xb600; //dma control: DMA enabled+ start on FIFO+32bit+repeat+increment source&dest + + AAS_next_mixing_buffer = ((AAS_u8*)AAS_mix_buffer) + 1280; + + REG_IE |= 0x10; // Enable irq for timer 1 + REG_IME = 1; // Enable all interrupts + + AAS_da_active = AAS_FALSE; + AAS_db_active = AAS_FALSE; + } + + REG_TM0CNT = 0x0; + REG_TM1CNT = 0x0; + + if ( chans != AAS_MaxChans ) + { + switch( chans ) + { + case 8: + AAS_MixAudio_SetMaxChans_8(); + break; + + case 4: + AAS_MixAudio_SetMaxChans_4(); + break; + + default: + AAS_MixAudio_SetMaxChans_2(); + break; + } + AAS_MaxChans = chans; + } + + AAS_next_mix_rate = AAS_req_mix_rate = mix_rate; + AAS_mix_scale = ((AAS_DivTable[mix_rate]*82)+128)>>6; + AAS_dynamic_mix_rate = dynamic; + + if ( stereo ) + { + const AAS_u8 chan_rearrange[AAS_MAX_CHANNELS] = { 0, 8, 9, 1, 2, 10, 11, 3, 4, 12, 13, 5, 6, 14, 15, 7 }; + + for( i = 0; i < AAS_MAX_CHANNELS; ++i ) + { + AAS_chan_rearrange[i] = chan_rearrange[i]; + } + + REG_SOUNDCNT_H = 0x9a0d; //enable DS A&B + fifo reset + use timer0 + 100% volume to L and R + } + else + { + int a, b; + + a = 0; + for( b = 0; b < chans; ++b ) + { + AAS_chan_rearrange[a] = b; + ++a; + } + for( b = 0; b < chans; ++b ) + { + AAS_chan_rearrange[a] = b + 8; + ++a; + } + + REG_SOUNDCNT_H = 0xbb0d; //enable DS A&B + fifo reset + use timer0 + 100% volume to L and R + } + + ch = &AAS_channels[0]; + for( i = 16; i > 0; --i ) + { + ch->active = AAS_FALSE; + ch->loop_length = 0; + ch->pos = 0; + ch->end = 0; + ch->delta = 0; + ++ch; + } + + AAS_volscale = volscale; + + AAS_Loud = loud; + if ( !loud ) + AAS_MixAudio_SetMode( AAS_MIXAUDIO_MODE_NORMAL ); + + REG_TM0D = AAS_tick_rate[mix_rate]; + REG_TM0CNT = 0x0080; // Enable timer0 + + REG_TM1D = 0x10000 - (mix_rate<<4); + REG_TM1CNT = 0xC4; //enable timer1 + irq and cascade from timer 0 + + AAS_lib_v111 = AAS_data_v111; +} + +int AAS_SetConfig( int config_mix, int config_chans, int config_spatial, int config_dynamic ) +{ + int i, chans, mix_rate, volscale, ret; + AAS_BOOL stereo; + AAS_BOOL dynamic; + AAS_BOOL loud; + + ret = AAS_OK; + + switch( config_mix ) + { + case AAS_CONFIG_MIX_32KHZ: + mix_rate = 40; + break; + + case AAS_CONFIG_MIX_28KHZ: + mix_rate = 35; + break; + + case AAS_CONFIG_MIX_24KHZ: + mix_rate = 30; + break; + + case AAS_CONFIG_MIX_20KHZ: + mix_rate = 25; + break; + + case AAS_CONFIG_MIX_16KHZ: + mix_rate = 20; + break; + + case AAS_CONFIG_MIX_12KHZ: + mix_rate = 15; + break; + + case AAS_CONFIG_MIX_8KHZ: + mix_rate = 10; + break; + + default: + ret = AAS_ERROR_INVALID_CONFIG; + break; + } + + switch( config_chans ) + { + case AAS_CONFIG_CHANS_16_LOUD: + volscale = 9; + loud = AAS_TRUE; + chans = 8; + break; + + case AAS_CONFIG_CHANS_8_LOUD: + volscale = 8; + loud = AAS_TRUE; + chans = 4; + break; + + case AAS_CONFIG_CHANS_4_LOUD: + volscale = 7; + loud = AAS_TRUE; + chans = 2; + break; + + case AAS_CONFIG_CHANS_16: + volscale = 9; + loud = AAS_FALSE; + chans = 8; + break; + + case AAS_CONFIG_CHANS_8: + volscale = 8; + loud = AAS_FALSE; + chans = 4; + break; + + case AAS_CONFIG_CHANS_4: + volscale = 7; + loud = AAS_FALSE; + chans = 2; + break; + + default: + ret = AAS_ERROR_INVALID_CONFIG; + break; + } + + switch( config_spatial ) + { + case AAS_CONFIG_SPATIAL_MONO: + stereo = AAS_FALSE; + break; + + case AAS_CONFIG_SPATIAL_STEREO: + stereo = AAS_TRUE; + break; + + default: + ret = AAS_ERROR_INVALID_CONFIG; + break; + } + + switch( config_dynamic ) + { + case AAS_CONFIG_DYNAMIC_ON: + dynamic = AAS_TRUE; + break; + + case AAS_CONFIG_DYNAMIC_OFF: + dynamic = AAS_FALSE; + break; + + default: + ret = AAS_ERROR_INVALID_CONFIG; + break; + } + + if ( ret == AAS_OK ) + { + AAS_DoConfig( mix_rate, volscale, stereo, dynamic, loud, chans ); + + AAS_initialised = AAS_TRUE; + } + + return ret; +} + +const AAS_s8* AAS_GetOutputBufferAddress( int buffer ) +{ + switch( buffer ) + { + case 0: + if ( AAS_da_active ) + return AAS_next_mixing_buffer; + else + return AAS_NULL; + break; + + case 1: + if ( AAS_db_active ) + return AAS_next_mixing_buffer + 640; + else + return AAS_NULL; + break; + + default: + return AAS_NULL; + break; + } +} + +int AAS_GetOutputBufferLength() +{ + return AAS_next_mix_rate*16; +} + +const AAS_u32 AAS_zero_vols[160] = { 0 }; + +static AAS_BOOL AAS_interrupt_occured AAS_IN_EWRAM = AAS_FALSE; + +void AAS_FastTimer1InterruptHandler() +{ + if ( AAS_dynamic_mix_rate ) + { + REG_TM0CNT = 0x0; + REG_TM0D = AAS_tick_rate[AAS_next_mix_rate]; + REG_TM0CNT = 0x0080; // Enable timer0 + REG_TM1CNT = 0x0; + REG_TM1D = 0x10000 - (AAS_next_mix_rate<<4); + REG_TM1CNT = 0xC4; // Enable timer1 + irq and cascade from timer 0 + } + + REG_DMA1CNT = 0x84400004; + REG_DMA2CNT = 0x84400004; + REG_DMA1CNT_H = 0x0440; + REG_DMA2CNT_H = 0x0440; + if ( AAS_da_active ) + REG_DMA1SAD = (unsigned long)AAS_next_mixing_buffer; // DMA1 source + else + REG_DMA1SAD = (unsigned long)AAS_zero_vols; + REG_DMA1CNT_H = 0xb600; // DMA control: DMA enabled+start on FIFO+32bit+repeat+increment source&dest + // Get click on hardware when switch off DMA on Direct Sound B, so have to do it this way instead + if ( AAS_db_active ) + REG_DMA2SAD = (unsigned long)AAS_next_mixing_buffer + 640; // DMA2 source + else + REG_DMA2SAD = (unsigned long)AAS_zero_vols; // DMA2 source + REG_DMA2CNT_H = 0xb600; // DMA control: DMA enabled+start on FIFO+32bit+repeat+increment source&dest + + AAS_interrupt_occured = AAS_TRUE; +} + +#define READCH1 \ + if ( ch->active ) \ + { \ + int vol = ch->volume; \ + if ( vol == 0 ) \ + { \ + int delta = ch->delta; \ + const AAS_s8* end_addr; \ + addr = ch->pos + ((delta*curr_mix_rate)>>6); \ + end_addr = (ch->end - (delta>>6)) - 1; \ + if ( addr >= end_addr ) \ + { \ + int ll = ch->loop_length; \ + if ( ll ) \ + { \ + while( addr >= end_addr ) \ + { \ + addr -= ll; \ + } \ + } \ + else \ + { \ + ch->active = AAS_FALSE; \ + } \ + } \ + ch->pos = addr; \ + } \ + else \ + { \ + tmp1 += vol; \ + } \ + ch->effective_volume = vol; \ + } \ + else \ + { \ + ch->effective_volume = 0; \ + } \ + +#define READCH2 \ + if ( ch->active ) \ + { \ + int vol = ch->volume; \ + if ( vol == 0 ) \ + { \ + int delta = ch->delta; \ + const AAS_s8* end_addr; \ + addr = ch->pos + ((delta*curr_mix_rate)>>6); \ + end_addr = (ch->end - (delta>>6)) - 1; \ + if ( addr >= end_addr ) \ + { \ + int ll = ch->loop_length; \ + if ( ll ) \ + { \ + while( addr >= end_addr ) \ + { \ + addr -= ll; \ + } \ + } \ + else \ + { \ + ch->active = AAS_FALSE; \ + } \ + } \ + ch->pos = addr; \ + } \ + else \ + { \ + tmp2 += vol; \ + } \ + ch->effective_volume = vol; \ + } \ + else \ + { \ + ch->effective_volume = 0; \ + } \ + +void AAS_DoWork() +{ + if ( AAS_interrupt_occured ) + { + AAS_interrupt_occured = AAS_FALSE; + + if ( AAS_next_mixing_buffer == (AAS_u8*)AAS_mix_buffer ) + AAS_next_mixing_buffer = ((AAS_u8*)AAS_mix_buffer) + 1280; + else + AAS_next_mixing_buffer = ((AAS_u8*)AAS_mix_buffer); + + AAS_MOD_Interrupt(); + + { + int tmp1, tmp2, val, curr_mix_rate; + struct AAS_Channel* ch; + const AAS_s8* addr; + + curr_mix_rate = AAS_req_mix_rate; + + if ( AAS_dynamic_mix_rate ) + { + val = 0; + ch = &AAS_channels[0]; + for( tmp2 = AAS_MaxChans; tmp2 > 0; --tmp2 ) + { + if ( ch->active && (ch->volume > 0) ) + { + tmp1 = ch->frequency; + if ( tmp1 > val ) + val = tmp1; + } + ++ch; + } + + ch = &AAS_channels[8]; + for( tmp2 = AAS_MaxChans; tmp2 > 0; --tmp2 ) + { + if ( ch->active && (ch->volume > 0) ) + { + tmp1 = ch->frequency; + if ( tmp1 > val ) + val = tmp1; + } + ++ch; + } + + val = ((val * 82)>>16)+1; + if ( val < curr_mix_rate ) + curr_mix_rate = val; + + if ( AAS_next_mix_rate != curr_mix_rate ) + { + AAS_next_mix_rate = curr_mix_rate; + AAS_mix_scale = val = ((AAS_DivTable[curr_mix_rate]*82)+128)>>6; + ch = &AAS_channels[0]; + for( tmp2 = AAS_MaxChans; tmp2 > 0; --tmp2 ) + { + if ( ch->active ) + ch->delta = AAS_Min( 4095, ((ch->frequency*val)+32768)>>16 ); + ++ch; + } + + ch = &AAS_channels[8]; + for( tmp2 = AAS_MaxChans; tmp2 > 0; --tmp2 ) + { + if ( ch->active ) + ch->delta = AAS_Min( 4095, ((ch->frequency*val)+32768)>>16 ); + ++ch; + } + + AAS_changed[0] = AAS_TRUE; + AAS_changed[1] = AAS_TRUE; + } + } + + tmp1 = 0; + tmp2 = 0; + + ch = &AAS_channels[0]; + switch( AAS_MaxChans ) + { + case 8: + READCH1 + ++ch; + READCH1 + ++ch; + READCH1 + ++ch; + READCH1 + ++ch; + READCH1 + ++ch; + READCH1 + ++ch; + READCH1 + ++ch; + READCH1 + ++ch; + READCH2 + ++ch; + READCH2 + ++ch; + READCH2 + ++ch; + READCH2 + ++ch; + READCH2 + ++ch; + READCH2 + ++ch; + READCH2 + ++ch; + READCH2 + break; + + case 4: + READCH1 + ++ch; + READCH1 + ++ch; + READCH1 + ++ch; + READCH1 + ch = &AAS_channels[8]; + READCH2 + ++ch; + READCH2 + ++ch; + READCH2 + ++ch; + READCH2 + break; + + case 2: + default: + READCH1 + ++ch; + READCH1 + ch = &AAS_channels[8]; + READCH2 + ++ch; + READCH2 + break; + } + + if ( AAS_Loud ) + { + if ( AAS_DSA_first ) + { + // Direct Sound A + if ( tmp1 ) + { + if ( tmp1 > 128 ) + { + AAS_MixAudio_SetMode( AAS_MIXAUDIO_MODE_BOOSTANDCLIP ); + } + else + { + AAS_MixAudio_SetMode( AAS_MIXAUDIO_MODE_BOOST ); + } + + if ( AAS_changed[0] ) + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate ); + } + else + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio_NoChange, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate ); + } + AAS_da_active = AAS_TRUE; + } + else + { + AAS_da_active = AAS_FALSE; + } + + // Direct Sound B + if ( tmp2 ) + { + if ( tmp2 > 128 ) + { + AAS_MixAudio_SetMode( AAS_MIXAUDIO_MODE_BOOSTANDCLIP ); + } + else + { + AAS_MixAudio_SetMode( AAS_MIXAUDIO_MODE_BOOST ); + } + + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate ); + } + + AAS_db_active = AAS_TRUE; + } + else + { + AAS_db_active = AAS_FALSE; + } + + AAS_DSA_first = AAS_FALSE; + } + else + { + // Direct Sound B + if ( tmp2 ) + { + if ( tmp2 > 128 ) + { + AAS_MixAudio_SetMode( AAS_MIXAUDIO_MODE_BOOSTANDCLIP ); + } + else + { + AAS_MixAudio_SetMode( AAS_MIXAUDIO_MODE_BOOST ); + } + + if ( AAS_changed[1] ) + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate ); + } + else + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio_NoChange, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate ); + } + AAS_db_active = AAS_TRUE; + } + else + { + AAS_db_active = AAS_FALSE; + } + + // Direct Sound A + if ( tmp1 ) + { + if ( tmp1 > 128 ) + { + AAS_MixAudio_SetMode( AAS_MIXAUDIO_MODE_BOOSTANDCLIP ); + } + else + { + AAS_MixAudio_SetMode( AAS_MIXAUDIO_MODE_BOOST ); + } + + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate ); + } + + AAS_da_active = AAS_TRUE; + } + else + { + AAS_da_active = AAS_FALSE; + } + + AAS_DSA_first = AAS_TRUE; + } + } + else + { + if ( AAS_DSA_first ) + { + // Direct Sound A + if ( tmp1 ) + { + if ( AAS_changed[0] ) + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate ); + } + else + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio_NoChange, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate ); + } + AAS_da_active = AAS_TRUE; + } + else + { + AAS_da_active = AAS_FALSE; + } + + // Direct Sound B + if ( tmp2 ) + { + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate ); + } + AAS_db_active = AAS_TRUE; + } + else + { + AAS_db_active = AAS_FALSE; + } + + AAS_DSA_first = AAS_FALSE; + } + else + { + // Direct Sound B + if ( tmp2 ) + { + if ( AAS_changed[1] ) + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate ); + } + else + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio_NoChange, AAS_next_mixing_buffer + 640, &AAS_channels[8], curr_mix_rate ); + } + AAS_db_active = AAS_TRUE; + } + else + { + AAS_db_active = AAS_FALSE; + } + + // Direct Sound A + if ( tmp1 ) + { + { + AAS_INIT_BRANCH + AAS_BRANCH( AAS_MixAudio, AAS_next_mixing_buffer, &AAS_channels[0], curr_mix_rate ); + } + + AAS_da_active = AAS_TRUE; + } + else + { + AAS_da_active = AAS_FALSE; + } + + AAS_DSA_first = AAS_TRUE; + } + } + + AAS_changed[0] = AAS_FALSE; + AAS_changed[1] = AAS_FALSE; + } + } +} + +void AAS_Timer1InterruptHandler() +{ + AAS_FastTimer1InterruptHandler(); + AAS_DoWork(); +} + +int AAS_GetActualMixRate() +{ + return AAS_next_mix_rate*800; +} diff --git a/lib/apex-audio-system/src/aas/AAS_Mixer.h b/lib/apex-audio-system/src/aas/AAS_Mixer.h new file mode 100644 index 0000000..6d3897f --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS_Mixer.h @@ -0,0 +1,62 @@ +// Copyright (c) 2003-2021 James Daniels +// Distributed under the MIT License +// license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +// Mixer-specific AAS include +// +// The functions and variables declared here should only be used if you need +// to directly access AAS_MixAudio(). This is not recommended and doing so +// will make it unsafe to use any other AAS functions except AAS_ShowLogo() +// and AAS_DoDMA3(). See the "Mixer" section of the documentation for more +// information. + +#ifndef __AAS_MIXER__ +#define __AAS_MIXER__ + +#include "AAS.h" + +AAS_BEGIN_DECLS + +#define AAS_IN_IWRAM __attribute__ ((section (".iwram"))) +#define AAS_IN_EWRAM __attribute__ ((section (".ewram"))) + +struct AAS_Channel +{ + AAS_u8 effective_volume; // 0 : effective_volume = (active&volume)?volume:0 + AAS_BOOL active; // 1 : 0 = Channel inactive, 1 = channel active + AAS_u8 volume; // 2 : Total vol of chan set must be <= 256, each vol usually in range 0-64 + AAS_u8 pos_fraction; // 3 : Fraction component of pos + AAS_u16 frequency; // 4 : Frequency (Hz) + AAS_u16 delta; // 6 : Delta + const AAS_s8* pos; // 8 : Current sample address, fraction component in pos_fraction + const AAS_s8* end; // 12 : Address of end of sample + AAS_u32 loop_length; // 16 : 0 = No repeat, Other value = Bytes from end back to restart point +}; // Length = 20 bytes + +extern struct AAS_Channel AAS_channels[16] AAS_IN_EWRAM; +extern AAS_u32 AAS_mix_buffer[640] AAS_IN_EWRAM; + +#define AAS_INIT_BRANCH void (*ptr2Function)(); +#define AAS_BRANCH(a,b...) ({ ptr2Function = a; ptr2Function(b); }) + +// AAS_MixAudio() is in IWRAM, call from ROM as follows: (same for AAS_MixAudio_NoChange()) +// AAS_INIT_BRANCH +// AAS_BRANCH( AAS_MixAudio, mix_buffer, chans, iterations ); + +void AAS_MixAudio( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations ); +void AAS_MixAudio_NoChange( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations ); // Only call if no changes to chans[] since previous call to AAS_MixAudio(). Do not call twice in a row. + +#define AAS_MIXAUDIO_MODE_NORMAL 0 // Total vol must be <= 256, normal vol - default +#define AAS_MIXAUDIO_MODE_BOOST 1 // Total vol must be <= 128, double vol +#define AAS_MIXAUDIO_MODE_BOOSTANDCLIP 2 // Total vol must be <= 256, double vol + +void AAS_MixAudio_SetMode( int mode ); // Set mixer mode, only call if 100% sure AAS_MixAudio won't interrupt + +// Set maximum number of channels in set (lower=faster), only call if 100% sure AAS_MixAudio won't interrupt +void AAS_MixAudio_SetMaxChans_2(); +void AAS_MixAudio_SetMaxChans_4(); // Default +void AAS_MixAudio_SetMaxChans_8(); + +AAS_END_DECLS + +#endif diff --git a/lib/apex-audio-system/src/aas/AAS_Mixer.s b/lib/apex-audio-system/src/aas/AAS_Mixer.s new file mode 100644 index 0000000..7f1e20f --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS_Mixer.s @@ -0,0 +1,632 @@ +@ Copyright (c) 2003-2021 James Daniels +@ Distributed under the MIT License +@ license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +.TEXT +.SECTION .iwram,"ax",%progbits +.ALIGN +.ARM + +.GLOBAL AAS_MixAudio +.GLOBAL AAS_MixAudio_NoChange +.EXTERN AAS_DivTable + +.GLOBAL _AAS_MixAudio_mod1 +.GLOBAL _AAS_MixAudio_mod2 +.GLOBAL _AAS_MixAudio_mod3 +.GLOBAL _AAS_MixAudio_mod4 +.GLOBAL _AAS_MixAudio_mod5 +.GLOBAL _AAS_MixAudio_mod6 +.GLOBAL _AAS_MixAudio_mod7 +.GLOBAL _AAS_MixAudio_mod8 + +.pool + +_ma_mov_r3_0: mov r3,#0 +_ma_add_r0_r0_0: add r0,r0,#0 + +_ma_ldr_pc_0: .word 0xe51f0000+8 @ sort of equivalent to opcode(ldr r0,[pc,#-0]) +_ma_mov_r14_r0_lsr_6: mov r14,r0,lsr #6 +_ma_ldrsb_r0_r14_shifted: .word 0x3e1fe00d @ (opcode("ldrsb r0,[r14,#+0]!")>>4) + (3<<28) +_ma_add_r0_r0_r0_lsl_16: adds r0,r0,r0,lsl #16 @ change regs as appropriate +_ma_vol_lookup_addr: .word _AAS_vol_lookup-1 +_ma_total_iterations: .word 0x0 +_ma_total_delta: .word 0x0 +_ma_bytes_available: .word 0x0 +_ma_no_skip: .word 0x0 + + + @ AAS_CODE_IN_IWRAM void AAS_MixAudio_NoChange( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations ); + +AAS_MixAudio_NoChange: + stmfd sp!,{r4-r11,r14} + sub sp,sp,#16 + stmfd sp!,{r0-r2} + + mov r9,#0 + str r9,_ma_no_skip + ldr r10,_ma_bytes_available + ldr r9,_ma_total_iterations + cmp r9,r2 + movhi r9,r2 + mov r11,r9 + ldr r2,_ma_total_delta + + b ma_quickstart + + + @ AAS_CODE_IN_IWRAM void AAS_MixAudio( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations ); + +AAS_MixAudio: + stmfd sp!,{r4-r11,r14} + sub sp,sp,#16 + stmfd sp!,{r0-r2} + + @ [sp] = _ma_mix_buffer + @ [sp,#4] = _ma_chans + @ [sp,#8] = _ma_to_go + @ [sp,#12] = _ma_iterations_loop + @ [sp,#16] = _ma_iterations_buffer + @ [sp,#20] = _ma_iterations_scale_buffer + @ [sp,#24] = _ma_loop_counter + + @ r0 = temp + @ r1 = chans + @ r2 = iterations in main loop + @ r3 = _ma_add_r0_r0_r0_lsl_16 + @ r4 = temp + @ r5 = temp + @ r6 = outer loop counter/active channels found/total delta>>2 + @ r7 = temp + @ r8 = temp + @ r9 = temp + @ r10 = temp + @ r11 = temp + @ r12 = dest address + @ r14 = temp + +ma_do_setup: +_AAS_MixAudio_mod1: + adr r12,ma_buffer_start + ldr r3,_ma_add_r0_r0_r0_lsl_16 +_AAS_MixAudio_mod5: + mov r6,#0x70000000 @ was #0x30000000 + mov r2,#256 + + +ma_setup_loop: + ldrb r14,[r1],#20 @ effective_volume + + cmp r14,#0 + beq ma_skip @ skip if effective_volume == 0 + + + @ Setup volume registers: + @ r11 = increment for r4 + @ r14 = "mul r5,r0,r3"/"mov r5,r0,lsl #0"/"mlane r5,r0,r3,r5"/"add r5,r5,r0,lsl #0" + @adr r10,_ma_vol_lookup-1 + ldr r10,_ma_vol_lookup_addr + add r4,r10,#129 @ 129 = 1+_ma_mul_r5_r0_r3-_ma_vol_lookup + ldrsb r10,[r10,r14] + ands r5,r6,#0x0f000000 @ test if this is first active channel + addne r4,r4,#16 @ 16 = _ma_mlane_r5_r0_r3_r5-_ma_mul_r5_r0_r3 + @adreq r4,_ma_mul_r5_r0_r3 @ use mul/mov if this is first non-zero chan + @adrne r4,_ma_mlane_r5_r0_r3_r5 @ use mlane/add if this is first non-zero chan + cmp r10,#0 + ldrlt r11,_ma_mov_r3_0 @ read "mov r3,#vol" if vol not power of 2 + addlt r11,r11,r14 @ set #vol in "mov r3,#vol" if vol not power of 2 + strlt r11,[r12],#4 @ write "mov r3,#vol" if vol not power of 2 + addge r4,r4,#8 @ increment if vol is power of 2 + ldmia r4,{r11,r14} @ read mul/mlane/mov/add and increment + addge r14,r14,r10,lsl #7 @ set lsl #val for mov/add if vol power of 2 + + + @ r0,r4,r5,r7,r8,r9,r10 available + @ r3 = _ma_add_r0_r0_0 + @ r5 = delta/increment for r14 + @ r8 = _ma_divide_table + @ r11 = temp (was increment for r14) + @ r12 = dest address + @ r14 = "mul r5,r0,r3"/"mov r5,r0,lsl #0"/"mlane r5,r0,r3,r5"/"add r5,r5,r0,lsl #0" + + @ Setup delta registers, write delta increment instructions: + @ r5 = delta/increment for r14 + adr r7,_ma_chan_cache @ could remove + add r7,r7,r5,lsr #22 @ could remove + ldr r10,_ma_ldr_pc_0 @ could pre-subtract _ma_chan_cache from _ma_ldr_pc_0 (would need to set at runtime) + sub r10,r10,r7 @ could change to sub r10,r10,r5,lsr #22 + add r0,r10,r12 + eor r10,r10,#0x00100000 @ switch to str + ldr r7,_ma_mov_r14_r0_lsr_6 + ldrh r5,[r1,#6-20] @ delta + and r9,r5,#0xff + ldr r4,_ma_add_r0_r0_0 + add r9,r4,r9 + stmia r12!,{r0,r7,r9} + add r7,r4,#0xc00 + add r7,r7,r5,lsr #8 + tst r7,#0xff + strne r7,[r12],#4 + add r6,r6,r5,lsr #2 + add r7,r10,r12 + str r7,[r12],#4 + add r5,r11,r5,lsl #20 + + + @ Final setup: + @ r0 = delta_pos + @ r8 = x + @ r9 = x_history + @ r10 = local outer loop counter/_ma_ldrsb_r0_r14_shifted + mov r0,#0x200 @ delta_pos = 0.5 (was 0) + ldr r10,_ma_ldrsb_r0_r14_shifted + mov r8,#0 + mov r9,#0 + + + @ r0 = delta_pos + @ r1 = chans + @ r2 = iterations in main loop + @ r3 = _ma_add_r0_r0_r0_lsl_16 + @ r4 = temp + @ r5 = delta/increment for r14 + @ r6 = outer loop counter/total delta<<1 + @ r7 = temp + @ r8 = x + @ r9 = x_history + @ r10 = local outer loop counter/_ma_ldrsb_r0_r14_shifted + @ r11 = temp (was increment for r14) + @ r12 = dest address + @ r14 = "mul r5,r0,r3"/"mov r5,r0,lsl #0"/"mlane r5,r0,r3,r5"/"add r5,r5,r0,lsl #0" + + @ Write instructions: + mov r7,r10,lsl #4 + str r7,[r12],#4 + b ma_setup_inner_loop_first + .word 0,0,0 @ padding +ma_setup_outer_loop: + + @ Write delta: + add r0,r0,r5,lsr #20 + movs r4,r0,lsr #10 + beq ma_setup_inner_loop_skip1 + sub r0,r0,r4,lsl #10 + add r4,r4,r10,lsl #4 + mov r8,r7 + add r4,r4,r8,lsl #4 + str r4,[r12],#4 +ma_setup_inner_loop_skip1: + add r9,r8,r9,lsl #8 + +ma_setup_inner_loop_first: + + @ Write delta: + add r0,r0,r5,lsr #20 + movs r4,r0,lsr #10 + beq ma_setup_inner_loop_skip2 + sub r0,r0,r4,lsl #10 + add r4,r4,r10,lsl #4 + subs r8,r8,#0x100 + movlt r8,#0x200 + add r4,r4,r8,lsl #4 + str r4,[r12],#4 +ma_setup_inner_loop_skip2: + add r9,r8,r9,lsl #8 + + @ Write delta: + add r0,r0,r5,lsr #20 + movs r4,r0,lsr #10 + beq ma_setup_inner_loop_skip3 + sub r0,r0,r4,lsl #10 + add r4,r4,r10,lsl #4 + subs r8,r8,#0x100 + movlt r8,#0x200 + add r4,r4,r8,lsl #4 + str r4,[r12],#4 +ma_setup_inner_loop_skip3: + add r9,r8,r9,lsl #8 + + @ Write merge and mul/mla/mov/add: + subs r11,r8,#0x100 + movlt r11,#0x200 + add r7,r14,r11,lsr #8 + add r4,r3,r11,lsl #4 + bic r11,r9,#0x00ff0000 + add r4,r4,r11,lsr #8 + stmia r12!,{r4,r7} + add r14,r14,r5,lsl #12 + + @ Write delta: + add r0,r0,r5,lsr #20 + movs r4,r0,lsr #10 + beq ma_setup_inner_loop_skip4 + sub r0,r0,r4,lsl #10 + add r4,r4,r10,lsl #4 + subs r8,r8,#0x100 + movlt r8,#0x200 + add r4,r4,r8,lsl #4 + str r4,[r12],#4 +ma_setup_inner_loop_skip4: + add r9,r8,r9,lsl #8 + + @ Write merge: (skips if unnecessary) + subs r7,r8,#0x100 + movlt r7,#0x200 + bic r4,r9,#0x00ff0000 + cmp r4,r11 + addne r11,r3,r4,lsr #8 + addne r11,r11,r7,lsl #4 + strne r11,[r12],#4 + + @ Write mul/mla/mov/add: + add r4,r14,r7,lsr #8 + str r4,[r12],#4 + add r14,r14,r5,lsl #12 + + subs r10,r10,#0x10000000 + bge ma_setup_outer_loop + + + @ Calculate iterations until end of sample: + ldr r10,[r1,#8-20] @ pos + ldr r0,[r1,#12-20] @ end + sub r0,r0,r10 + mov r5,r5,lsr #19 + ldr r8,_ma_divide_table + ldrh r5,[r8,r5] + mul r0,r5,r0 + cmp r2,r0,lsr #10 + movhi r2,r0,lsr #10 + + add r6,r6,#0x01000000 @ increment active channels found + +ma_skip: + subs r6,r6,#0x10000000 + bge ma_setup_loop + + @ Write "b ma_again" +_AAS_MixAudio_mod3: + adr r0,ma_again + sub r0,r0,r12 + mov r0,r0,asr #2 + sub r0,r0,#2 + @bic r0,r0,#0xff000000 + @add r0,r0,#0xea000000 + adr r4,ma_buffer_end + bic r0,r0,#0x15000000 @ offset always negative, so this is equivalent to above + str r0,[r12],#4 + + sub r10,r4,r12 + and r4,r6,#0x0f000000 + sub r10,r10,r4,lsr #21 @ r10 -= 8*used_channels + @str r10,_ma_iterations_scale_buffer + @str r10,[sp,#20] + str r10,_ma_bytes_available + + ldr r11,[sp,#8] + subs r9,r2,r11 + str r9,_ma_total_iterations + @cmp r2,r11 + mov r9,#1 + movhi r9,#0 + str r9,_ma_no_skip + movhi r2,r11 + + mov r11,r2 + mov r9,r2 + bic r2,r6,#0xff000000 + str r2,_ma_total_delta + + @ r2 = total_delta>>2 + @ r9 = r11 = total_iterations - i.e. iterations until loop - argh! need to recalculate each call! + @ r10 = ((bytes_available-(8*channels_used))<<4) + + @ Could remove need to recalc total_iterations each call by not doing "total_iterations = min( iterations, total_iterations )" - do min below instead and sub "iterations" from "total_iterations" afterwards. Problem: Need to accurately calculate "total_iterations" even when it is large. (Although only need to cope with total_iterations being twice as large as it is now because only ever re-use config once.) + +ma_quickstart: + @ldr r4,_ma_mix_buffer + ldr r4,[sp] + + + @ r1 = &_ma_mix_buffer + @ r2 = total_delta>>2 + @ r3 = refill iterations<<3 + @ r4 = _ma_mix_buffer + @ r5 = temp + @ r6 = temp + @ r7 = temp + @ r8 = #0x04000000 + @ r9 = total iterations + @ r10 = ((bytes_available-(8*channels_used))<<4) + @ r11 = total iterations + @ r12 = temp + @ r14 = dest + + @ Calc iterations + @ iterations = ((bytes_available-(8*channels_used))<<4)/(total_delta>>2) + ldr r3,_ma_divide_table +ma_begin: @ called from process loop + mov r2,r2,lsl #1 + ldrh r3,[r3,r2] + mul r3,r10,r3 + @str r3,_ma_iterations_buffer + str r3,[sp,#16] +ma_begin2: + cmp r9,r3,lsr #12 @ was asr #3 + movgt r9,r3,lsr #12 @ was asr #3 + + sub r3,r11,r9 + @str r3,_ma_iterations_loop + str r3,[sp,#12] + + cmp r9,#0 + ble ma_end + + + @ r0 = temp + @ r1 = temp + @ r2 = 0xc0 + @ r3 = chans + @ r4 = _ma_mix_buffer + @ r5 = DMA address + @ r6 = 2 + @ r7 = temp + @ r8 = &_ma_chan_cache + @ r9 = iterations + @ r10 = loop counter + @ r11 = temp + @ r12 = buffer address + @ r14 = temp + + @ Fill buffer + adr r8,_ma_chan_cache + mov r5,#0x04000000 + add r5,r5,#0xd4 + mov r6,#2 +_AAS_MixAudio_mod6: + mov r10,#8 @ was #4 - could perhaps set according to max # of channels / 2? + mov r2,#0xc0 + adr r12,ma_buffer_end + @ldr r3,_ma_chans + ldr r3,[sp,#4] + +ma_fill_buffer_loop: + ldrb r14,[r3],#20 @ effective_volume + cmp r14,#0 + beq ma_fill_buffer_skip + ldr r7,[r3,#8-20] @ pos + bic r0,r7,#0x3 + ldrb r11,[r3,#3-20] @ pos_fraction + and r1,r2,r7,lsl #6 + add r1,r1,r11,lsr #2 + ldrh r14,[r3,#6-20] @ delta + mul r14,r9,r14 + add r11,r11,r14,lsl #2 + strb r11,[r3,#3-20] @ pos_fraction + add r7,r7,r11,lsr #8 + str r7,[r3,#8-20] @ pos + add r7,r6,r14,lsr #8 @ words to copy + sub r12,r12,r7,lsl #2 + add r1,r1,r12,lsl #6 + str r1,[r8],#4 @ IWRAM pos + add r14,r7,#0x84000000 + stmia r5,{r0,r12,r14} +ma_fill_buffer_skip: + subs r10,r10,#1 + bgt ma_fill_buffer_loop + + @ Setup registers for main loop + @ldr r3,_ma_to_go + ldr r3,[sp,#8] + sub r3,r3,r9 + @str r3,_ma_to_go + str r3,[sp,#8] + + @ Setup registers for main loop + @mvn r14,#0xff00 + @add r14,r14,r9,lsl #24 + mvn r14,#0xff00 + bic r14,r14,#0x1000000 + add r14,r14,r9,lsl #25 +_AAS_MixAudio_mod2: + b ma_start + +ma_end: + @ldr r9,_ma_iterations_loop + ldr r9,[sp,#12] + movs r11,r9 + @ldrne r3,_ma_iterations_buffer + ldrne r3,[sp,#16] + bne ma_begin2 + + @ldr r1,_ma_chans + ldr r1,[sp,#4] + @ should be after ble below? + + @ldr r9,_ma_to_go + ldr r9,[sp,#8] + cmp r9,#0 + ldrle r3,_ma_no_skip + cmple r3,#0 + ble ma_chan_finished + + @ change so only branch if done all iterations and no samples have ended + + @ r0 = redo setup + @ r1 = chans[] (was loop) + @ r2 = total_delta>>2 + @ r3 = divide_table + @ r4 = _ma_mix_buffer + @ r5 = temp + @ r6 = delta + @ r7 = end + @ r8 = unused + @ r9 = loops to go + @ r10 = _ma_specific_first + @ r11 = &ma_chan0_start + @ r12 = temp + @ r13 = unused + @ r14 = loop (was chans[]) + + ldr r3,_ma_divide_table +_AAS_MixAudio_mod7: + mov r14,#8 @ was #4 + mov r2,#0 + mov r0,#0 + +ma_check_chan_loop: + ldrb r7,[r1],#20 + cmp r7,#0 + beq ma_chan_done + + ldrh r7,[r1,#6-20] @ delta + ldr r12,[r1,#8-20] @ pos + ldr r6,[r1,#12-20] @ end + sub r5,r6,r7,lsr #6 + sub r5,r5,#1 + cmp r5,r12 + ble ma_chan_do_loop + +ma_chan_ok: + add r2,r2,r7,lsr #2 + sub r5,r6,r12 + mov r7,r7,lsl #1 + ldrh r7,[r3,r7] + mul r5,r7,r5 + cmp r9,r5,lsr #10 + movhi r9,r5,lsr #10 + +ma_chan_done: + subs r14,r14,#1 + bgt ma_check_chan_loop + + cmp r0,#0 + bne ma_chan_has_finished + + movs r11,r9 + @ldrgt r10,_ma_iterations_scale_buffer + @ldrgt r10,[sp,#20] + ldrgt r10,_ma_bytes_available + bgt ma_begin + +ma_chan_finished: + add sp,sp,#28 + ldmfd sp!, {r4-r11, r14} + bx lr @ Thumb interwork friendly. + +ma_chan_has_finished: + cmp r2,#0 + beq ma_chan_all_zeroes + @ldr r2,_ma_to_go + @ldr r2,[sp,#8] +_AAS_MixAudio_mod8: + sub r1,r1,#(20*8) @ was #(20*4) + @str r4,_ma_mix_buffer + str r4,[sp] + b ma_do_setup + +ma_chan_all_zeroes: @ very rare - only happens if last active channel finished during this period + @ldr r5,_ma_to_go + ldr r5,[sp,#8] @ can be 0 sometimes + movs r5,r5,lsl #2 + add r5,r5,#0x85000000 + adr r2,_ma_empty + mov r6,#0x04000000 + add r6,r6,#0xd4 + stmneia r6,{r2,r4,r5} @ r5(_ma_to_go) can be 0 sometimes + b ma_chan_finished + + + +ma_chan_do_loop: + ldr r5,[r1,#16-20] @ loop_length + cmp r5,#0 + + mov r0,#1 @ redo setup !!moved!! + + @ Loop sample + subne r12,r12,r5 + strne r12,[r1,#8-20] @ pos + bne ma_chan_ok + + @ Set inactive + strh r5,[r1,#0-20] @ effective_volume + active + @mov r0,#1 @ redo setup !!was here!! + b ma_chan_done + + +_ma_chan_cache: + .word 0,0,0,0,0,0,0,0 @ IWRAM pos, chan: 0,1,2,3,4,5,6,7 + +_ma_divide_table: .word AAS_DivTable + +_ma_empty: .word 0 +.word 0,0 @ padding + +_AAS_MixAudio_mod4: + + @ r0-r2 : temp + @ r3 : volume + @ r4 : output address + @ r5-r12 : output buffer + @ r14 : sample address/loop/mask + +ma_again: + + @ r0 = temp + @ r1 = temp2 + @ r2 = mask_0x80808080 + @@ r3 free + + @ Make sure algo is as efficient as possible + + @ Merge + @ldr r14,_ma_loop_counter + ldr r14,[sp,#24] + and r5,r14,r5,lsr #8 + and r6,r14,r6,lsr #8 + and r7,r14,r7,lsr #8 + and r8,r14,r8,lsr #8 + and r9,r14,r9,lsr #8 + and r10,r14,r10,lsr #8 + and r11,r14,r11,lsr #8 + and r12,r14,r12,lsr #8 + add r5,r5,r6,lsl #8 + add r6,r7,r8,lsl #8 + add r7,r9,r10,lsl #8 + add r8,r11,r12,lsl #8 + + @ Store + stmia r4!,{r5-r8} + + @ Loop + subs r14,r14,#0x2000000 + ble ma_end + +ma_start: + @str r14,_ma_loop_counter + str r14,[sp,#24] + +ma_buffer_start: @ 2048 bytes (1152 bytes would be equivalent to previous cache size) + + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @ 128 bytes + +ma_buffer_end: diff --git a/lib/apex-audio-system/src/aas/AAS_SFX.c b/lib/apex-audio-system/src/aas/AAS_SFX.c new file mode 100644 index 0000000..e5e2448 --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS_SFX.c @@ -0,0 +1,284 @@ +// Copyright (c) 2003-2021 James Daniels +// Distributed under the MIT License +// license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +#include "AAS_Shared.h" + +int AAS_SFX_GetNumChannels() +{ + if ( AAS_initialised ) + { + if ( AAS_volscale == 9 ) + return 16-AAS_MOD_GetNumChannels(); + else if ( AAS_volscale == 8 ) + return 8-AAS_MOD_GetNumChannels(); + else + return 4-AAS_MOD_GetNumChannels(); + } + else + { + return 0; + } +} + +struct AAS_Channel* AAS_SFX_GetChannel( int channel ) +{ + if ( AAS_volscale == 9 ) + return &AAS_channels[AAS_chan_rearrange[15-channel]]; + else if ( AAS_volscale == 8 ) + return &AAS_channels[AAS_chan_rearrange[7-channel]]; + else + return &AAS_channels[AAS_chan_rearrange[3-channel]]; +} + +int AAS_SFX_GetOutput( int channel ) +{ + if ( AAS_volscale == 9 ) + return AAS_chan_rearrange[15-channel]>>3; + else if ( AAS_volscale == 8 ) + return AAS_chan_rearrange[7-channel]>>3; + else + return AAS_chan_rearrange[3-channel]>>3; +} + +AAS_BOOL AAS_SFX_ChannelExists( int channel ) +{ + if ( (channel >= 0) && (channel < AAS_SFX_GetNumChannels()) ) + { + return AAS_TRUE; + } + else + { + return AAS_FALSE; + } +} + +int AAS_SFX_Play( int channel, int sample_volume, int sample_frequency, const AAS_s8* sample_start, const AAS_s8* sample_end, const AAS_s8* sample_restart ) +{ + if ( AAS_initialised ) + { + if ( AAS_SFX_ChannelExists( channel ) ) + { + if ( (sample_frequency >= 1) && (sample_frequency <= 65535) ) + { + if ( (sample_volume >= 0) && (sample_volume <= 64) ) + { + if ( sample_start && (sample_end > sample_start) && (sample_restart < sample_end) ) + { + struct AAS_Channel* ch; + + ch = AAS_SFX_GetChannel( channel ); + ch->active = AAS_FALSE; + ch->volume = (sample_volume<<8)>>AAS_volscale; + ch->frequency = sample_frequency; + ch->delta = AAS_Min( 4095, ((sample_frequency*AAS_mix_scale)+32768)>>16 ); + ch->pos = sample_start; + ch->pos_fraction = 0; + if ( sample_restart ) + ch->loop_length = sample_end - sample_restart; + else + ch->loop_length = 0; + ch->end = sample_end; + ch->active = AAS_TRUE; + + AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE; + + return AAS_OK; + } + else + { + return AAS_ERROR_INVALID_SAMPLE_ADDRESS; + } + } + else + { + return AAS_ERROR_VOLUME_OUT_OF_RANGE; + } + } + else + { + return AAS_ERROR_FREQUENCY_OUT_OF_RANGE; + } + } + else + { + return AAS_ERROR_CHANNEL_NOT_AVAILABLE; + } + } + else + { + return AAS_ERROR_CALL_SET_CONFIG_FIRST; + } +} + +AAS_BOOL AAS_SFX_IsActive( int channel ) +{ + if ( AAS_SFX_ChannelExists( channel ) ) + { + return AAS_SFX_GetChannel( channel )->active; + } + else + { + return AAS_FALSE; + } +} + +int AAS_SFX_EndLoop( int channel ) +{ + if ( AAS_initialised ) + { + if ( AAS_SFX_ChannelExists( channel ) ) + { + AAS_SFX_GetChannel( channel )->loop_length = 0; + + return AAS_OK; + } + else + { + return AAS_ERROR_CHANNEL_NOT_AVAILABLE; + } + } + else + { + return AAS_ERROR_CALL_SET_CONFIG_FIRST; + } +} + +int AAS_SFX_SetFrequency( int channel, int sample_frequency ) +{ + if ( AAS_initialised ) + { + if ( AAS_SFX_ChannelExists( channel ) ) + { + if ( (sample_frequency >= 1) && (sample_frequency <= 65535) ) + { + struct AAS_Channel* ch; + + ch = AAS_SFX_GetChannel( channel ); + ch->frequency = sample_frequency; + ch->delta = AAS_Min( 4095, ((sample_frequency*AAS_mix_scale)+32768)>>16 ); + + AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE; + + return AAS_OK; + } + else + { + return AAS_ERROR_FREQUENCY_OUT_OF_RANGE; + } + } + else + { + return AAS_ERROR_CHANNEL_NOT_AVAILABLE; + } + } + else + { + return AAS_ERROR_CALL_SET_CONFIG_FIRST; + } +} + +int AAS_SFX_SetVolume( int channel, int sample_volume ) +{ + if ( AAS_initialised ) + { + if ( AAS_SFX_ChannelExists( channel ) ) + { + if ( (sample_volume >= 0) && (sample_volume <= 64) ) + { + AAS_SFX_GetChannel( channel )->volume = (sample_volume<<8)>>AAS_volscale; + + AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE; + + return AAS_OK; + } + else + { + return AAS_ERROR_VOLUME_OUT_OF_RANGE; + } + } + else + { + return AAS_ERROR_CHANNEL_NOT_AVAILABLE; + } + } + else + { + return AAS_ERROR_CALL_SET_CONFIG_FIRST; + } +} + +int AAS_SFX_Stop( int channel ) +{ + if ( AAS_initialised ) + { + if ( AAS_SFX_ChannelExists( channel ) ) + { + AAS_SFX_GetChannel( channel )->active = AAS_FALSE; + + AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE; + + return AAS_OK; + } + else + { + return AAS_ERROR_CHANNEL_NOT_AVAILABLE; + } + } + else + { + return AAS_ERROR_CALL_SET_CONFIG_FIRST; + } +} + +int AAS_SFX_Resume( int channel ) +{ + if ( AAS_initialised ) + { + if ( AAS_SFX_ChannelExists( channel ) ) + { + struct AAS_Channel* ch; + + ch = AAS_SFX_GetChannel( channel ); + + if ( !ch->active ) + { + if ( ch->loop_length ) + { + ch->active = AAS_TRUE; + + AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE; + + return AAS_OK; + } + else + { + if ( ch->pos < ((ch->end - (ch->delta>>6)) - 1) ) + { + ch->active = AAS_TRUE; + + AAS_changed[AAS_SFX_GetOutput(channel)] = AAS_TRUE; + + return AAS_OK; + } + else + { + return AAS_ERROR_CHANNEL_UNRESUMEABLE; + } + } + } + else + { + return AAS_ERROR_CHANNEL_ACTIVE; + } + } + else + { + return AAS_ERROR_CHANNEL_NOT_AVAILABLE; + } + } + else + { + return AAS_ERROR_CALL_SET_CONFIG_FIRST; + } +} diff --git a/lib/apex-audio-system/src/aas/AAS_Shared.c b/lib/apex-audio-system/src/aas/AAS_Shared.c new file mode 100644 index 0000000..6c1d40c --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS_Shared.c @@ -0,0 +1,126 @@ +// Copyright (c) 2003-2021 James Daniels +// Distributed under the MIT License +// license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +#include "AAS_Shared.h" + +const AAS_u16 AAS_DivTable[8192] = { 65535, 65535, 32768, 21845, 16384, 13107, 10922, 9362, 8192, 7281, 6553, 5957, 5461, 5041, 4681, 4369, 4096, 3855, 3640, 3449, 3276, 3120, 2978, 2849, 2730, 2621, 2520, 2427, 2340, 2259, 2184, 2114, 2048, 1985, 1927, 1872, 1820, 1771, 1724, 1680, 1638, 1598, 1560, 1524, 1489, 1456, 1424, 1394, 1365, 1337, 1310, 1285, 1260, 1236, 1213, 1191, 1170, 1149, 1129, 1110, 1092, 1074, 1057, 1040, 1024, 1008, 992, 978, 963, 949, 936, 923, 910, 897, 885, 873, 862, 851, 840, 829, 819, 809, 799, 789, 780, 771, 762, 753, 744, 736, 728, 720, 712, 704, 697, 689, 682, 675, 668, 661, 655, 648, 642, 636, 630, 624, 618, 612, 606, 601, 595, 590, 585, 579, 574, 569, 564, 560, 555, 550, 546, 541, 537, 532, 528, 524, 520, 516, 512, 508, 504, 500, 496, 492, 489, 485, 481, 478, 474, 471, 468, 464, 461, 458, 455, 451, 448, 445, 442, 439, 436, 434, 431, 428, 425, 422, 420, 417, 414, 412, 409, 407, 404, 402, 399, 397, 394, 392, 390, 387, 385, 383, 381, 378, 376, 374, 372, 370, 368, 366, 364, 362, 360, 358, 356, 354, 352, 350, 348, 346, 344, 343, 341, 339, 337, 336, 334, 332, 330, 329, 327, 326, 324, 322, 321, 319, 318, 316, 315, 313, 312, 310, 309, 307, 306, 304, 303, 302, 300, 299, 297, 296, 295, 293, 292, 291, 289, 288, 287, 286, 284, 283, 282, 281, 280, 278, 277, 276, 275, 274, 273, 271, 270, 269, 268, 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, 256, 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 240, 239, 238, 237, 236, 235, 234, 234, 233, 232, 231, 230, 229, 229, 228, 227, 226, 225, 225, 224, 223, 222, 222, 221, 220, 219, 219, 218, 217, 217, 216, 215, 214, 214, 213, 212, 212, 211, 210, 210, 209, 208, 208, 207, 206, 206, 205, 204, 204, 203, 202, 202, 201, 201, 200, 199, 199, 198, 197, 197, 196, 196, 195, 195, 194, 193, 193, 192, 192, 191, 191, 190, 189, 189, 188, 188, 187, 187, 186, 186, 185, 185, 184, 184, 183, 183, 182, 182, 181, 181, 180, 180, 179, 179, 178, 178, 177, 177, 176, 176, 175, 175, 174, 174, 173, 173, 172, 172, 172, 171, 171, 170, 170, 169, 169, 168, 168, 168, 167, 167, 166, 166, 165, 165, 165, 164, 164, 163, 163, 163, 162, 162, 161, 161, 161, 160, 160, 159, 159, 159, 158, 158, 157, 157, 157, 156, 156, 156, 155, 155, 154, 154, 154, 153, 153, 153, 152, 152, 152, 151, 151, 151, 150, 150, 149, 149, 149, 148, 148, 148, 147, 147, 147, 146, 146, 146, 145, 145, 145, 144, 144, 144, 144, 143, 143, 143, 142, 142, 142, 141, 141, 141, 140, 140, 140, 140, 139, 139, 139, 138, 138, 138, 137, 137, 137, 137, 136, 136, 136, 135, 135, 135, 135, 134, 134, 134, 134, 133, 133, 133, 132, 132, 132, 132, 131, 131, 131, 131, 130, 130, 130, 130, 129, 129, 129, 129, 128, 128, 128, 128, 127, 127, 127, 127, 126, 126, 126, 126, 125, 125, 125, 125, 124, 124, 124, 124, 123, 123, 123, 123, 122, 122, 122, 122, 122, 121, 121, 121, 121, 120, 120, 120, 120, 120, 119, 119, 119, 119, 118, 118, 118, 118, 118, 117, 117, 117, 117, 117, 116, 116, 116, 116, 115, 115, 115, 115, 115, 114, 114, 114, 114, 114, 113, 113, 113, 113, 113, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 110, 110, 110, 110, 110, 109, 109, 109, 109, 109, 109, 108, 108, 108, 108, 108, 107, 107, 107, 107, 107, 107, 106, 106, 106, 106, 106, 106, 105, 105, 105, 105, 105, 105, 104, 104, 104, 104, 104, 104, 103, 103, 103, 103, 103, 103, 102, 102, 102, 102, 102, 102, 101, 101, 101, 101, 101, 101, 100, 100, 100, 100, 100, 100, 100, 99, 99, 99, 99, 99, 99, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 96, 96, 96, 96, 96, 96, 96, 95, 95, 95, 95, 95, 95, 95, 94, 94, 94, 94, 94, 94, 94, 94, 93, 93, 93, 93, 93, 93, 93, 92, 92, 92, 92, 92, 92, 92, 92, 91, 91, 91, 91, 91, 91, 91, 91, 90, 90, 90, 90, 90, 90, 90, 90, 89, 89, 89, 89, 89, 89, 89, 89, 88, 88, 88, 88, 88, 88, 88, 88, 87, 87, 87, 87, 87, 87, 87, 87, 87, 86, 86, 86, 86, 86, 86, 86, 86, 86, 85, 85, 85, 85, 85, 85, 85, 85, 85, 84, 84, 84, 84, 84, 84, 84, 84, 84, 83, 83, 83, 83, 83, 83, 83, 83, 83, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; + +const AAS_u16 AAS_MOD_period_conv_table[2048] = { 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 64488, 63337, 62226, 61153, 60116, 59114, 58145, 57207, 56299, 55420, 54567, 53740, 52938, 52160, 51404, 50669, 49956, 49262, 48587, 47931, 47291, 46669, 46063, 45473, 44897, 44336, 43788, 43254, 42733, 42224, 41728, 41242, 40768, 40305, 39852, 39409, 38976, 38553, 38138, 37732, 37335, 36946, 36565, 36192, 35827, 35468, 35117, 34773, 34435, 34104, 33779, 33461, 33148, 32841, 32540, 32244, 31954, 31668, 31388, 31113, 30842, 30576, 30315, 30058, 29805, 29557, 29313, 29072, 28836, 28603, 28375, 28149, 27928, 27710, 27495, 27283, 27075, 26870, 26668, 26469, 26273, 26080, 25889, 25702, 25517, 25334, 25155, 24978, 24803, 24631, 24461, 24293, 24128, 23965, 23804, 23645, 23489, 23334, 23182, 23031, 22883, 22736, 22591, 22448, 22307, 22168, 22030, 21894, 21760, 21627, 21496, 21366, 21238, 21112, 20987, 20864, 20742, 20621, 20502, 20384, 20267, 20152, 20038, 19926, 19815, 19704, 19596, 19488, 19381, 19276, 19172, 19069, 18967, 18866, 18766, 18667, 18570, 18473, 18377, 18282, 18189, 18096, 18004, 17913, 17823, 17734, 17646, 17558, 17472, 17386, 17301, 17217, 17134, 17052, 16970, 16889, 16809, 16730, 16652, 16574, 16497, 16420, 16345, 16270, 16195, 16122, 16049, 15977, 15905, 15834, 15763, 15694, 15625, 15556, 15488, 15421, 15354, 15288, 15222, 15157, 15093, 15029, 14965, 14902, 14840, 14778, 14717, 14656, 14596, 14536, 14477, 14418, 14359, 14301, 14244, 14187, 14131, 14074, 14019, 13964, 13909, 13855, 13801, 13747, 13694, 13641, 13589, 13537, 13486, 13435, 13384, 13334, 13284, 13234, 13185, 13136, 13088, 13040, 12992, 12944, 12897, 12851, 12804, 12758, 12712, 12667, 12622, 12577, 12533, 12489, 12445, 12401, 12358, 12315, 12272, 12230, 12188, 12146, 12105, 12064, 12023, 11982, 11942, 11902, 11862, 11822, 11783, 11744, 11705, 11667, 11629, 11591, 11553, 11515, 11478, 11441, 11404, 11368, 11331, 11295, 11259, 11224, 11188, 11153, 11118, 11084, 11049, 11015, 10981, 10947, 10913, 10880, 10846, 10813, 10780, 10748, 10715, 10683, 10651, 10619, 10587, 10556, 10524, 10493, 10462, 10432, 10401, 10371, 10340, 10310, 10280, 10251, 10221, 10192, 10163, 10133, 10105, 10076, 10047, 10019, 9991, 9963, 9935, 9907, 9879, 9852, 9825, 9798, 9771, 9744, 9717, 9690, 9664, 9638, 9612, 9586, 9560, 9534, 9509, 9483, 9458, 9433, 9408, 9383, 9358, 9333, 9309, 9285, 9260, 9236, 9212, 9188, 9165, 9141, 9117, 9094, 9071, 9048, 9025, 9002, 8979, 8956, 8934, 8911, 8889, 8867, 8845, 8823, 8801, 8779, 8757, 8736, 8714, 8693, 8672, 8650, 8629, 8608, 8588, 8567, 8546, 8526, 8505, 8485, 8465, 8444, 8424, 8404, 8385, 8365, 8345, 8326, 8306, 8287, 8267, 8248, 8229, 8210, 8191, 8172, 8153, 8135, 8116, 8097, 8079, 8061, 8042, 8024, 8006, 7988, 7970, 7952, 7934, 7917, 7899, 7881, 7864, 7847, 7829, 7812, 7795, 7778, 7761, 7744, 7727, 7710, 7693, 7677, 7660, 7644, 7627, 7611, 7595, 7578, 7562, 7546, 7530, 7514, 7498, 7482, 7467, 7451, 7435, 7420, 7404, 7389, 7374, 7358, 7343, 7328, 7313, 7298, 7283, 7268, 7253, 7238, 7223, 7209, 7194, 7179, 7165, 7150, 7136, 7122, 7108, 7093, 7079, 7065, 7051, 7037, 7023, 7009, 6995, 6982, 6968, 6954, 6941, 6927, 6914, 6900, 6887, 6873, 6860, 6847, 6834, 6820, 6807, 6794, 6781, 6768, 6755, 6743, 6730, 6717, 6704, 6692, 6679, 6667, 6654, 6642, 6629, 6617, 6605, 6592, 6580, 6568, 6556, 6544, 6532, 6520, 6508, 6496, 6484, 6472, 6460, 6448, 6437, 6425, 6413, 6402, 6390, 6379, 6367, 6356, 6345, 6333, 6322, 6311, 6299, 6288, 6277, 6266, 6255, 6244, 6233, 6222, 6211, 6200, 6190, 6179, 6168, 6157, 6147, 6136, 6125, 6115, 6104, 6094, 6083, 6073, 6063, 6052, 6042, 6032, 6021, 6011, 6001, 5991, 5981, 5971, 5961, 5951, 5941, 5931, 5921, 5911, 5901, 5891, 5882, 5872, 5862, 5852, 5843, 5833, 5824, 5814, 5805, 5795, 5786, 5776, 5767, 5757, 5748, 5739, 5730, 5720, 5711, 5702, 5693, 5684, 5675, 5665, 5656, 5647, 5638, 5629, 5621, 5612, 5603, 5594, 5585, 5576, 5568, 5559, 5550, 5542, 5533, 5524, 5516, 5507, 5499, 5490, 5482, 5473, 5465, 5456, 5448, 5440, 5431, 5423, 5415, 5406, 5398, 5390, 5382, 5374, 5365, 5357, 5349, 5341, 5333, 5325, 5317, 5309, 5301, 5293, 5285, 5278, 5270, 5262, 5254, 5246, 5239, 5231, 5223, 5216, 5208, 5200, 5193, 5185, 5177, 5170, 5162, 5155, 5147, 5140, 5132, 5125, 5118, 5110, 5103, 5096, 5088, 5081, 5074, 5066, 5059, 5052, 5045, 5038, 5031, 5023, 5016, 5009, 5002, 4995, 4988, 4981, 4974, 4967, 4960, 4953, 4946, 4939, 4933, 4926, 4919, 4912, 4905, 4899, 4892, 4885, 4878, 4872, 4865, 4858, 4852, 4845, 4838, 4832, 4825, 4819, 4812, 4806, 4799, 4793, 4786, 4780, 4773, 4767, 4760, 4754, 4748, 4741, 4735, 4729, 4722, 4716, 4710, 4704, 4697, 4691, 4685, 4679, 4673, 4666, 4660, 4654, 4648, 4642, 4636, 4630, 4624, 4618, 4612, 4606, 4600, 4594, 4588, 4582, 4576, 4570, 4564, 4558, 4553, 4547, 4541, 4535, 4529, 4524, 4518, 4512, 4506, 4501, 4495, 4489, 4484, 4478, 4472, 4467, 4461, 4455, 4450, 4444, 4439, 4433, 4428, 4422, 4417, 4411, 4406, 4400, 4395, 4389, 4384, 4378, 4373, 4368, 4362, 4357, 4352, 4346, 4341, 4336, 4330, 4325, 4320, 4314, 4309, 4304, 4299, 4294, 4288, 4283, 4278, 4273, 4268, 4263, 4257, 4252, 4247, 4242, 4237, 4232, 4227, 4222, 4217, 4212, 4207, 4202, 4197, 4192, 4187, 4182, 4177, 4172, 4167, 4163, 4158, 4153, 4148, 4143, 4138, 4133, 4129, 4124, 4119, 4114, 4109, 4105, 4100, 4095, 4090, 4086, 4081, 4076, 4072, 4067, 4062, 4058, 4053, 4048, 4044, 4039, 4035, 4030, 4025, 4021, 4016, 4012, 4007, 4003, 3998, 3994, 3989, 3985, 3980, 3976, 3971, 3967, 3963, 3958, 3954, 3949, 3945, 3940, 3936, 3932, 3927, 3923, 3919, 3914, 3910, 3906, 3901, 3897, 3893, 3889, 3884, 3880, 3876, 3872, 3867, 3863, 3859, 3855, 3851, 3846, 3842, 3838, 3834, 3830, 3826, 3822, 3817, 3813, 3809, 3805, 3801, 3797, 3793, 3789, 3785, 3781, 3777, 3773, 3769, 3765, 3761, 3757, 3753, 3749, 3745, 3741, 3737, 3733, 3729, 3725, 3721, 3717, 3714, 3710, 3706, 3702, 3698, 3694, 3690, 3687, 3683, 3679, 3675, 3671, 3667, 3664, 3660, 3656, 3652, 3649, 3645, 3641, 3637, 3634, 3630, 3626, 3622, 3619, 3615, 3611, 3608, 3604, 3600, 3597, 3593, 3589, 3586, 3582, 3579, 3575, 3571, 3568, 3564, 3561, 3557, 3554, 3550, 3546, 3543, 3539, 3536, 3532, 3529, 3525, 3522, 3518, 3515, 3511, 3508, 3504, 3501, 3497, 3494, 3491, 3487, 3484, 3480, 3477, 3473, 3470, 3467, 3463, 3460, 3457, 3453, 3450, 3446, 3443, 3440, 3436, 3433, 3430, 3426, 3423, 3420, 3417, 3413, 3410, 3407, 3403, 3400, 3397, 3394, 3390, 3387, 3384, 3381, 3377, 3374, 3371, 3368, 3365, 3361, 3358, 3355, 3352, 3349, 3346, 3342, 3339, 3336, 3333, 3330, 3327, 3324, 3321, 3317, 3314, 3311, 3308, 3305, 3302, 3299, 3296, 3293, 3290, 3287, 3284, 3281, 3278, 3275, 3272, 3269, 3266, 3263, 3260, 3257, 3254, 3251, 3248, 3245, 3242, 3239, 3236, 3233, 3230, 3227, 3224, 3221, 3218, 3215, 3212, 3209, 3206, 3204, 3201, 3198, 3195, 3192, 3189, 3186, 3183, 3181, 3178, 3175, 3172, 3169, 3166, 3164, 3161, 3158, 3155, 3152, 3149, 3147, 3144, 3141, 3138, 3136, 3133, 3130, 3127, 3125, 3122, 3119, 3116, 3114, 3111, 3108, 3105, 3103, 3100, 3097, 3095, 3092, 3089, 3086, 3084, 3081, 3078, 3076, 3073, 3070, 3068, 3065, 3062, 3060, 3057, 3055, 3052, 3049, 3047, 3044, 3041, 3039, 3036, 3034, 3031, 3028, 3026, 3023, 3021, 3018, 3016, 3013, 3010, 3008, 3005, 3003, 3000, 2998, 2995, 2993, 2990, 2988, 2985, 2983, 2980, 2978, 2975, 2973, 2970, 2968, 2965, 2963, 2960, 2958, 2955, 2953, 2950, 2948, 2945, 2943, 2941, 2938, 2936, 2933, 2931, 2928, 2926, 2924, 2921, 2919, 2916, 2914, 2912, 2909, 2907, 2904, 2902, 2900, 2897, 2895, 2893, 2890, 2888, 2886, 2883, 2881, 2878, 2876, 2874, 2871, 2869, 2867, 2865, 2862, 2860, 2858, 2855, 2853, 2851, 2848, 2846, 2844, 2842, 2839, 2837, 2835, 2832, 2830, 2828, 2826, 2823, 2821, 2819, 2817, 2814, 2812, 2810, 2808, 2806, 2803, 2801, 2799, 2797, 2795, 2792, 2790, 2788, 2786, 2784, 2781, 2779, 2777, 2775, 2773, 2771, 2768, 2766, 2764, 2762, 2760, 2758, 2755, 2753, 2751, 2749, 2747, 2745, 2743, 2741, 2738, 2736, 2734, 2732, 2730, 2728, 2726, 2724, 2722, 2720, 2717, 2715, 2713, 2711, 2709, 2707, 2705, 2703, 2701, 2699, 2697, 2695, 2693, 2691, 2689, 2687, 2685, 2682, 2680, 2678, 2676, 2674, 2672, 2670, 2668, 2666, 2664, 2662, 2660, 2658, 2656, 2654, 2652, 2650, 2648, 2646, 2644, 2642, 2641, 2639, 2637, 2635, 2633, 2631, 2629, 2627, 2625, 2623, 2621, 2619, 2617, 2615, 2613, 2611, 2609, 2608, 2606, 2604, 2602, 2600, 2598, 2596, 2594, 2592, 2590, 2588, 2587, 2585, 2583, 2581, 2579, 2577, 2575, 2573, 2572, 2570, 2568, 2566, 2564, 2562, 2560, 2559, 2557, 2555, 2553, 2551, 2549, 2548, 2546, 2544, 2542, 2540, 2538, 2537, 2535, 2533, 2531, 2529, 2528, 2526, 2524, 2522, 2520, 2519, 2517, 2515, 2513, 2511, 2510, 2508, 2506, 2504, 2503, 2501, 2499, 2497, 2496, 2494, 2492, 2490, 2489, 2487, 2485, 2483, 2482, 2480, 2478, 2476, 2475, 2473, 2471, 2469, 2468, 2466, 2464, 2463, 2461, 2459, 2458, 2456, 2454, 2452, 2451, 2449, 2447, 2446, 2444, 2442, 2441, 2439, 2437, 2436, 2434, 2432, 2431, 2429, 2427, 2426, 2424, 2422, 2421, 2419, 2417, 2416, 2414, 2412, 2411, 2409, 2407, 2406, 2404, 2403, 2401, 2399, 2398, 2396, 2394, 2393, 2391, 2390, 2388, 2386, 2385, 2383, 2382, 2380, 2378, 2377, 2375, 2374, 2372, 2370, 2369, 2367, 2366, 2364, 2363, 2361, 2359, 2358, 2356, 2355, 2353, 2352, 2350, 2348, 2347, 2345, 2344, 2342, 2341, 2339, 2338, 2336, 2335, 2333, 2331, 2330, 2328, 2327, 2325, 2324, 2322, 2321, 2319, 2318, 2316, 2315, 2313, 2312, 2310, 2309, 2307, 2306, 2304, 2303, 2301, 2300, 2298, 2297, 2295, 2294, 2292, 2291, 2289, 2288, 2286, 2285, 2283, 2282, 2280, 2279, 2278, 2276, 2275, 2273, 2272, 2270, 2269, 2267, 2266, 2264, 2263, 2262, 2260, 2259, 2257, 2256, 2254, 2253, 2251, 2250, 2249, 2247, 2246, 2244, 2243, 2242, 2240, 2239, 2237, 2236, 2234, 2233, 2232, 2230, 2229, 2227, 2226, 2225, 2223, 2222, 2220, 2219, 2218, 2216, 2215, 2214, 2212, 2211, 2209, 2208, 2207, 2205, 2204, 2203, 2201, 2200, 2198, 2197, 2196, 2194, 2193, 2192, 2190, 2189, 2188, 2186, 2185, 2184, 2182, 2181, 2180, 2178, 2177, 2176, 2174, 2173, 2172, 2170, 2169, 2168, 2166, 2165, 2164, 2162, 2161, 2160, 2158, 2157, 2156, 2154, 2153, 2152, 2150, 2149, 2148, 2147, 2145, 2144, 2143, 2141, 2140, 2139, 2137, 2136, 2135, 2134, 2132, 2131, 2130, 2128, 2127, 2126, 2125, 2123, 2122, 2121, 2120, 2118, 2117, 2116, 2115, 2113, 2112, 2111, 2109, 2108, 2107, 2106, 2104, 2103, 2102, 2101, 2099, 2098, 2097, 2096, 2095, 2093, 2092, 2091, 2090, 2088, 2087, 2086, 2085, 2083, 2082, 2081, 2080, 2079, 2077, 2076, 2075, 2074, 2072, 2071, 2070, 2069, 2068, 2066, 2065, 2064, 2063, 2062, 2060, 2059, 2058, 2057, 2056, 2054, 2053, 2052, 2051, 2050, 2049, 2047, 2046, 2045, 2044, 2043, 2041, 2040, 2039, 2038, 2037, 2036, 2034, 2033, 2032, 2031, 2030, 2029, 2027, 2026, 2025, 2024, 2023, 2022, 2021, 2019, 2018, 2017, 2016, 2015, 2014, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2003, 2002, 2001, 2000, 1999, 1998, 1997, 1996, 1994, 1993, 1992, 1991, 1990, 1989, 1988, 1987, 1985, 1984, 1983, 1982, 1981, 1980, 1979, 1978, 1977, 1975, 1974, 1973, 1972, 1971, 1970, 1969, 1968, 1967, 1966, 1965, 1963, 1962, 1961, 1960, 1959, 1958, 1957, 1956, 1955, 1954, 1953, 1952, 1950, 1949, 1948, 1947, 1946, 1945, 1944, 1943, 1942, 1941, 1940, 1939, 1938, 1937, 1936, 1935, 1933, 1932, 1931, 1930, 1929, 1928, 1927, 1926, 1925, 1924, 1923, 1922, 1921, 1920, 1919, 1918, 1917, 1916, 1915, 1914, 1913, 1912, 1911, 1910, 1908, 1907, 1906, 1905, 1904, 1903, 1902, 1901, 1900, 1899, 1898, 1897, 1896, 1895, 1894, 1893, 1892, 1891, 1890, 1889, 1888, 1887, 1886, 1885, 1884, 1883, 1882, 1881, 1880, 1879, 1878, 1877, 1876, 1875, 1874, 1873, 1872, 1871, 1870, 1869, 1868, 1867, 1866, 1865, 1864, 1863, 1862, 1861, 1860, 1859, 1858, 1857, 1857, 1856, 1855, 1854, 1853, 1852, 1851, 1850, 1849, 1848, 1847, 1846, 1845, 1844, 1843, 1842, 1841, 1840, 1839, 1838, 1837, 1836, 1835, 1834, 1833, 1833, 1832, 1831, 1830, 1829, 1828, 1827, 1826, 1825, 1824, 1823, 1822, 1821, 1820, 1819, 1818, 1817, 1817, 1816, 1815, 1814, 1813, 1812, 1811, 1810, 1809, 1808, 1807, 1806, 1805, 1805, 1804, 1803, 1802, 1801, 1800, 1799, 1798, 1797, 1796, 1795, 1794, 1794, 1793, 1792, 1791, 1790, 1789, 1788, 1787, 1786, 1785, 1785, 1784, 1783, 1782, 1781, 1780, 1779, 1778, 1777, 1777, 1776, 1775, 1774, 1773, 1772, 1771, 1770, 1769, 1769, 1768, 1767, 1766, 1765, 1764, 1763, 1762, 1761, 1761, 1760, 1759, 1758, 1757, 1756, 1755, 1755, 1754, 1753, 1752, 1751, 1750, 1749, 1748, 1748, 1747, 1746, 1745, 1744, 1743, 1742, 1742, 1741, 1740, 1739, 1738, 1737, 1736, 1736, 1735, 1734, 1733, 1732 }; + +const AAS_u16 AAS_period_table[16][60] = +{ + { + 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960 , 906, + 856 , 808 , 762 , 720 , 678 , 640 , 604 , 570 , 538 , 508 , 480 , 453, + 428 , 404 , 381 , 360 , 339 , 320 , 302 , 285 , 269 , 254 , 240 , 226, + 214 , 202 , 190 , 180 , 170 , 160 , 151 , 143 , 135 , 127 , 120 , 113, + 107 , 101 , 95 , 90 , 85 , 80 , 75 , 71 , 67 , 63 , 60 , 56 + },{ + 1700, 1604, 1514, 1430, 1348, 1274, 1202, 1134, 1070, 1010, 954 , 900, + 850 , 802 , 757 , 715 , 674 , 637 , 601 , 567 , 535 , 505 , 477 , 450, + 425 , 401 , 379 , 357 , 337 , 318 , 300 , 284 , 268 , 253 , 239 , 225, + 213 , 201 , 189 , 179 , 169 , 159 , 150 , 142 , 134 , 126 , 119 , 113, + 106 , 100 , 94 , 89 , 84 , 79 , 75 , 71 , 67 , 63 , 59 , 56 + },{ + 1688, 1592, 1504, 1418, 1340, 1264, 1194, 1126, 1064, 1004, 948 , 894, + 844 , 796 , 752 , 709 , 670 , 632 , 597 , 563 , 532 , 502 , 474 , 447, + 422 , 398 , 376 , 355 , 335 , 316 , 298 , 282 , 266 , 251 , 237 , 224, + 211 , 199 , 188 , 177 , 167 , 158 , 149 , 141 , 133 , 125 , 118 , 112, + 105 , 99 , 94 , 88 , 83 , 79 , 74 , 70 , 66 , 62 , 59 , 56 + },{ + 1676, 1582, 1492, 1408, 1330, 1256, 1184, 1118, 1056, 996 , 940 , 888, + 838 , 791 , 746 , 704 , 665 , 628 , 592 , 559 , 528 , 498 , 470 , 444, + 419 , 395 , 373 , 352 , 332 , 314 , 296 , 280 , 264 , 249 , 235 , 222, + 209 , 198 , 187 , 176 , 166 , 157 , 148 , 140 , 132 , 125 , 118 , 111, + 104 , 99 , 93 , 88 , 83 , 78 , 74 , 70 , 66 , 62 , 59 , 55 + },{ + 1664, 1570, 1482, 1398, 1320, 1246, 1176, 1110, 1048, 990 , 934 , 882, + 832 , 785 , 741 , 699 , 660 , 623 , 588 , 555 , 524 , 495 , 467 , 441, + 416 , 392 , 370 , 350 , 330 , 312 , 294 , 278 , 262 , 247 , 233 , 220, + 208 , 196 , 185 , 175 , 165 , 156 , 147 , 139 , 131 , 124 , 117 , 110, + 104 , 98 , 92 , 87 , 82 , 78 , 73 , 69 , 65 , 62 , 58 , 55 + },{ + 1652, 1558, 1472, 1388, 1310, 1238, 1168, 1102, 1040, 982 , 926 , 874, + 826 , 779 , 736 , 694 , 655 , 619 , 584 , 551 , 520 , 491 , 463 , 437, + 413 , 390 , 368 , 347 , 328 , 309 , 292 , 276 , 260 , 245 , 232 , 219, + 206 , 195 , 184 , 174 , 164 , 155 , 146 , 138 , 130 , 123 , 116 , 109, + 103 , 97 , 92 , 87 , 82 , 77 , 73 , 69 , 65 , 61 , 58 , 54 + },{ + 1640, 1548, 1460, 1378, 1302, 1228, 1160, 1094, 1032, 974 , 920 , 868, + 820 , 774 , 730 , 689 , 651 , 614 , 580 , 547 , 516 , 487 , 460 , 434, + 410 , 387 , 365 , 345 , 325 , 307 , 290 , 274 , 258 , 244 , 230 , 217, + 205 , 193 , 183 , 172 , 163 , 154 , 145 , 137 , 129 , 122 , 115 , 109, + 102 , 96 , 91 , 86 , 81 , 77 , 72 , 68 , 64 , 61 , 57 , 54 + },{ + 1628, 1536, 1450, 1368, 1292, 1220, 1150, 1086, 1026, 968 , 914 , 862, + 814 , 768 , 725 , 684 , 646 , 610 , 575 , 543 , 513 , 484 , 457 , 431, + 407 , 384 , 363 , 342 , 323 , 305 , 288 , 272 , 256 , 242 , 228 , 216, + 204 , 192 , 181 , 171 , 161 , 152 , 144 , 136 , 128 , 121 , 114 , 108, + 102 , 96 , 90 , 85 , 80 , 76 , 72 , 68 , 64 , 60 , 57 , 54 + },{ + 1814, 1712, 1616, 1524, 1440, 1356, 1280, 1208, 1140, 1076, 1016, 960, + 907 , 856 , 808 , 762 , 720 , 678 , 640 , 604 , 570 , 538 , 508 , 480, + 453 , 428 , 404 , 381 , 360 , 339 , 320 , 302 , 285 , 269 , 254 , 240, + 226 , 214 , 202 , 190 , 180 , 170 , 160 , 151 , 143 , 135 , 127 , 120, + 113 , 107 , 101 , 95 , 90 , 85 , 80 , 75 , 71 , 67 , 63 , 60 + },{ + 1800, 1700, 1604, 1514, 1430, 1350, 1272, 1202, 1134, 1070, 1010, 954, + 900 , 850 , 802 , 757 , 715 , 675 , 636 , 601 , 567 , 535 , 505 , 477, + 450 , 425 , 401 , 379 , 357 , 337 , 318 , 300 , 284 , 268 , 253 , 238, + 225 , 212 , 200 , 189 , 179 , 169 , 159 , 150 , 142 , 134 , 126 , 119, + 112 , 106 , 100 , 94 , 89 , 84 , 79 , 75 , 71 , 67 , 63 , 59 + },{ + 1788, 1688, 1592, 1504, 1418, 1340, 1264, 1194, 1126, 1064, 1004, 948, + 894 , 844 , 796 , 752 , 709 , 670 , 632 , 597 , 563 , 532 , 502 , 474, + 447 , 422 , 398 , 376 , 355 , 335 , 316 , 298 , 282 , 266 , 251 , 237, + 223 , 211 , 199 , 188 , 177 , 167 , 158 , 149 , 141 , 133 , 125 , 118, + 111 , 105 , 99 , 94 , 88 , 83 , 79 , 74 , 70 , 66 , 62 , 59 + },{ + 1774, 1676, 1582, 1492, 1408, 1330, 1256, 1184, 1118, 1056, 996 , 940, + 887 , 838 , 791 , 746 , 704 , 665 , 628 , 592 , 559 , 528 , 498 , 470, + 444 , 419 , 395 , 373 , 352 , 332 , 314 , 296 , 280 , 264 , 249 , 235, + 222 , 209 , 198 , 187 , 176 , 166 , 157 , 148 , 140 , 132 , 125 , 118, + 111 , 104 , 99 , 93 , 88 , 83 , 78 , 74 , 70 , 66 , 62 , 59 + },{ + 1762, 1664, 1570, 1482, 1398, 1320, 1246, 1176, 1110, 1048, 988 , 934, + 881 , 832 , 785 , 741 , 699 , 660 , 623 , 588 , 555 , 524 , 494 , 467, + 441 , 416 , 392 , 370 , 350 , 330 , 312 , 294 , 278 , 262 , 247 , 233, + 220 , 208 , 196 , 185 , 175 , 165 , 156 , 147 , 139 , 131 , 123 , 117, + 110 , 104 , 98 , 92 , 87 , 82 , 78 , 73 , 69 , 65 , 61 , 58 + },{ + 1750, 1652, 1558, 1472, 1388, 1310, 1238, 1168, 1102, 1040, 982 , 926, + 875 , 826 , 779 , 736 , 694 , 655 , 619 , 584 , 551 , 520 , 491 , 463, + 437 , 413 , 390 , 368 , 347 , 328 , 309 , 292 , 276 , 260 , 245 , 232, + 219 , 206 , 195 , 184 , 174 , 164 , 155 , 146 , 138 , 130 , 123 , 116, + 109 , 103 , 97 , 92 , 87 , 82 , 77 , 73 , 69 , 65 , 61 , 58 + },{ + 1736, 1640, 1548, 1460, 1378, 1302, 1228, 1160, 1094, 1032, 974 , 920, + 868 , 820 , 774 , 730 , 689 , 651 , 614 , 580 , 547 , 516 , 487 , 460, + 434 , 410 , 387 , 365 , 345 , 325 , 307 , 290 , 274 , 258 , 244 , 230, + 217 , 205 , 193 , 183 , 172 , 163 , 154 , 145 , 137 , 129 , 122 , 115, + 108 , 102 , 96 , 91 , 86 , 81 , 77 , 72 , 68 , 64 , 61 , 57 + },{ + 1724, 1628, 1536, 1450, 1368, 1292, 1220, 1150, 1086, 1026, 968 , 914, + 862 , 814 , 768 , 725 , 684 , 646 , 610 , 575 , 543 , 513 , 484 , 457, + 431 , 407 , 384 , 363 , 342 , 323 , 305 , 288 , 272 , 256 , 242 , 228, + 216 , 203 , 192 , 181 , 171 , 161 , 152 , 144 , 136 , 128 , 121 , 114, + 108 , 101 , 96 , 90 , 85 , 80 , 76 , 72 , 68 , 64 , 60 , 57 + } +}; + +const AAS_u16 AAS_tick_rate[41] = { 65535, 44565, 55051, 58546, 60294, 61342, 62041, 62541, 62915, 63206, 63439, 63630, 63789, 63923, 64039, 64138, 64226, 64303, 64371, 64433, 64488, 64538, 64583, 64625, 64663, 64698, 64730, 64760, 64788, 64813, 64837, 64860, 64881, 64901, 64920, 64937, 64954, 64970, 64985, 64999, 65012 }; + +const AAS_s8 AAS_sin[64] = { 0, -12, -24, -37, -48, -60, -71, -81, -90, -98, -106, -112, -118, -122, -125, -127, -127, -127, -125, -122, -118, -112, -106, -99, -90, -81, -71, -60, -49, -37, -25, -12, 0, 12, 24, 36, 48, 60, 70, 81, 90, 98, 106, 112, 118, 122, 125, 127, 127, 127, 125, 122, 118, 113, 106, 99, 90, 81, 71, 60, 49, 37, 25, 12 }; + +AAS_BOOL AAS_initialised AAS_IN_EWRAM = AAS_FALSE; +AAS_u8 AAS_volscale AAS_IN_EWRAM; +AAS_u16 AAS_mix_scale AAS_IN_EWRAM; +AAS_BOOL AAS_changed[2] AAS_IN_IWRAM; + +AAS_u8 AAS_chan_rearrange[AAS_MAX_CHANNELS] AAS_IN_EWRAM; + +struct AAS_Channel AAS_channels[16] AAS_IN_EWRAM; + +// 2560 bytes, must be aligned to 4 byte boundary, could be just 640 bytes if mix rate was 8KHz +AAS_u32 AAS_mix_buffer[640] AAS_IN_EWRAM; diff --git a/lib/apex-audio-system/src/aas/AAS_Shared.h b/lib/apex-audio-system/src/aas/AAS_Shared.h new file mode 100644 index 0000000..48729e8 --- /dev/null +++ b/lib/apex-audio-system/src/aas/AAS_Shared.h @@ -0,0 +1,83 @@ +// Copyright (c) 2003-2021 James Daniels +// Distributed under the MIT License +// license terms: see LICENSE file in root or http://opensource.org/licenses/MIT + +#ifndef __AAS_SHARED__ +#define __AAS_SHARED__ + +#include "AAS.h" +#include "AAS_Mixer.h" + +#define AAS_MAX_CHANNELS 16 + +#define REG_SOUNDCNT_L (*(volatile AAS_u16 *)0x4000080) +#define REG_SOUNDCNT_H (*(volatile AAS_u16 *)0x4000082) +#define REG_SOUNDCNT_X (*(volatile AAS_u16 *)0x4000084) + +#define REG_DMA1SAD (*(volatile AAS_u32 *)0x40000BC) +#define REG_DMA1DAD (*(volatile AAS_u32 *)0x40000C0) +#define REG_DMA1CNT_H (*(volatile AAS_u16 *)0x40000C6) +#define REG_DMA1CNT (*(volatile AAS_u32 *)0x40000C4) + +#define REG_DMA2SAD (*(volatile AAS_u32 *)0x40000C8) +#define REG_DMA2DAD (*(volatile AAS_u32 *)0x40000CC) +#define REG_DMA2CNT_H (*(volatile AAS_u16 *)0x40000D2) +#define REG_DMA2CNT (*(volatile AAS_u32 *)0x40000d0) + +#define REG_TM0CNT (*(volatile AAS_u16 *)0x4000102) +#define REG_TM0D (*(volatile AAS_u16 *)0x4000100) + +#define REG_TM1CNT (*(volatile AAS_u16 *)0x4000106) +#define REG_TM1D (*(volatile AAS_u16 *)0x4000104) + +#define REG_IE (*(volatile AAS_u16 *)0x4000200) +#define REG_IME (*(volatile AAS_u16 *)0x4000208) +#define REG_IF (*(volatile AAS_u16 *)0x4000202) + +#define DISPCNT (*(volatile AAS_u16 *)0x4000000) +#define REG_VCOUNT (*(volatile AAS_u16 *)0x4000006) + +struct AAS_ModSample +{ + AAS_u32 data; // offset in bytes + AAS_u16 repeat; // in halfwords + AAS_u16 length; // in halfwords + AAS_u8 finetune; + AAS_u8 volume; + AAS_u16 padding; +}; + +extern const AAS_u16 AAS_DATA_NUM_MODS; +extern const struct AAS_ModSample AAS_ModSamples[][31]; +extern const AAS_s16 AAS_Sequence[][128][16]; +extern const AAS_u8 AAS_NumChans[]; +extern const AAS_u8 AAS_RestartPos[]; +extern const AAS_u8 AAS_PatternData[]; +extern const AAS_s8 AAS_SampleData[]; + +extern const AAS_u16 AAS_DivTable[8192]; +extern const AAS_u16 AAS_MOD_period_conv_table[2048]; +extern const AAS_u16 AAS_period_table[16][60]; + +extern const AAS_u16 AAS_tick_rate[41]; + +extern const AAS_s8 AAS_sin[64]; + +extern AAS_s16 AAS_mod_num AAS_IN_EWRAM; +extern AAS_BOOL AAS_initialised AAS_IN_EWRAM; +extern AAS_u8 AAS_volscale AAS_IN_EWRAM; +extern AAS_u8 AAS_mod_num_chans AAS_IN_EWRAM; +extern AAS_u16 AAS_mix_scale AAS_IN_EWRAM; +extern AAS_BOOL AAS_changed[2] AAS_IN_IWRAM; + +extern AAS_u8 AAS_chan_rearrange[AAS_MAX_CHANNELS] AAS_IN_EWRAM; + +__inline static int AAS_Min( int a, int b ) +{ + if ( a < b ) + return a; + else + return b; +} + +#endif diff --git a/lib/apex-audio-system/src/aas/Makefile b/lib/apex-audio-system/src/aas/Makefile new file mode 100644 index 0000000..0a4f8f8 --- /dev/null +++ b/lib/apex-audio-system/src/aas/Makefile @@ -0,0 +1,23 @@ +# AAS Mix Library makefile +# NOTE: Disable printf_special in final version + +# Tools and flags. +# CROSS = arm-thumb-elf- +CROSS ?= arm-none-eabi- + +# Name of output targets. +TARGET = libAAS.a + +# Files you want to go in IWRAM. +IWRAM = AAS_Mixer.o + +# Other source files. +SRC = AAS_ASM.o AAS_Logo.o AAS_Main.o AAS_MOD.o AAS_Shared.o AAS_SFX.o + +include ../../make/common.make + +$(TARGET): $(IWRAM) $(GFX) $(SOUND) $(SRC) + $(CROSS)ar r $@ $(SRC) $(IWRAM) $(GFX) $(SOUND) $(LIBS) + +clean: + rm -f *.o $(TARGET) $(NAME) $(GFX) $(SOUND) $(SYMBOLS) $(MAP) diff --git a/lutcalc/Makefile b/lutcalc/Makefile deleted file mode 100644 index e686868..0000000 --- a/lutcalc/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -CC := clang - -%.o: %.c - $(CC) $< -Wall -o $@ - -math_divlut.h math_divlut.c: lutcalc - ./lutcalc - mv math_divlut.h ../source/math_divlut.h - mv math_divlut.c ../data/math_divlut.c diff --git a/lutcalc/lutcalc.c b/lutcalc/lutcalc.c deleted file mode 100644 index 4355853..0000000 --- a/lutcalc/lutcalc.c +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include -#include - - -// fracional bits of fixed point num -#define RECIPROCAL_FRACT_SHIFT 10 -#define RECIPROCAL_FRACT_SIZE (1 << RECIPROCAL_FRACT_SHIFT) -// the integer bits -#define RECIPROCAL_INT_SHIFT (32 - RECIPROCAL_FRACT_SHIFT) -#define RECIPROCAL_INT_SIZE (1 << RECIPROCAL_INT_SHIFT) - -#define RECIPROCAL_MAX_INT (128) -// length of resulting reciprocal LUT -#define RECIPROCAL_LUT_SIZE (RECIPROCAL_FRACT_SIZE * RECIPROCAL_MAX_INT) - -int32_t divLutArray[RECIPROCAL_LUT_SIZE]; - -int32_t double2fx(double n) { - return n * RECIPROCAL_FRACT_SIZE; -} -double fx2double(uint32_t fx) { - return fx / (double) RECIPROCAL_FRACT_SIZE; -} - - -void setupDivLut() { - assert(RECIPROCAL_FRACT_SHIFT + RECIPROCAL_INT_SHIFT == 32); - assert((RECIPROCAL_LUT_SIZE & (RECIPROCAL_LUT_SIZE - 1)) == 0 ); // must be power of two - - FILE *outfile = fopen("math_divlut.c", "w"); // remove existing file first - fclose(outfile); - outfile = fopen("math_divlut.c", "a"); - - FILE *outfileHeader = fopen("math_divlut.h", "w"); // remove existing file first - fclose(outfileHeader); - outfileHeader = fopen("math_divlut.h", "a"); - - // calculate the LUT - for (uint32_t i = 1; i <= RECIPROCAL_LUT_SIZE; ++i) { - divLutArray[i - 1] = double2fx(1. / fx2double(i)); - } - - // format it into a header file (metaprogramming lol) - const char *headers = { - "#ifndef MAT_DIVLUT_H\n" - "#define MAT_DIVLUT_H\n" - "#include \n\n" - "#define RECIPROCAL_FRACT_SHIFT %d\n" - "#define RECIPROCAL_FRACT_SIZE %d\n" - "#define RECIPROCAL_MAX_INT %d\n" - "#define RECIPROCAL_LUT_SIZE %d\n\n" - "" - "extern const s32 reciprocalLUT[RECIPROCAL_LUT_SIZE];" - "\n\n#endif" - }; - fprintf(outfileHeader, headers, RECIPROCAL_FRACT_SHIFT, RECIPROCAL_FRACT_SIZE, RECIPROCAL_MAX_INT, RECIPROCAL_LUT_SIZE); - fclose(outfileHeader); - - fprintf(outfile, "#include \"../source/math_divlut.h\"\nconst s32 reciprocalLUT[RECIPROCAL_LUT_SIZE] = {"); // u16 vs fixed - for (int i = 0; i < RECIPROCAL_LUT_SIZE; ++i) { - fprintf(outfile, "%d, ", divLutArray[i]); - } - fprintf(outfile, "};"); - fclose(outfile); -} - - -int main(void) { - setupDivLut(); - return 0; -} diff --git a/source/main.c b/source/main.c index c2cd7c3..91e7a1b 100644 --- a/source/main.c +++ b/source/main.c @@ -1,4 +1,5 @@ #include +#include "AAS.h" #include "logutils.h" #include "globals.h" @@ -8,6 +9,8 @@ #include "model.h" #include "render/draw.h" +#include "../data-audio/AAS_Data.h" + static FIXED_12 g_wave_time; static FIXED g_wave_amp; @@ -23,17 +26,27 @@ void waveUpdate(void) g_wave_amp = int2fx(3) + fxmul(int2fx(6), sinFx(g_wave_time << 5)); } +void audioInit(void) +{ + AAS_SetConfig( AAS_CONFIG_MIX_24KHZ, AAS_CONFIG_CHANS_8, AAS_CONFIG_SPATIAL_MONO, AAS_CONFIG_DYNAMIC_OFF); + irq_add(II_TIMER1, AAS_FastTimer1InterruptHandler); + irq_add(II_VBLANK, AAS_DoWork); + + AAS_MOD_Play(AAS_DATA_MOD_aaa); +} + int main(void) { // REG_WAITCNT controls the pre-fetch buffer and the waitstates of the external cartridge bus. REG_WAITCNT = 0x4317; // This setting yields a *major* perf improvement over the defaults; cf. https://problemkaputt.de/gbatek.htm#gbatechnicaldata (last retrieved 2021-05-28). - sqran(1997); + sqran(2001); irq_init(NULL); - irq_add(II_VBLANK, NULL); + // irq_add(II_VBLANK, NULL); // irq_add(II_HBLANK, wave); // irq_add(II_VBLANK, waveUpdate); + audioInit(); globalsInit(); drawInit(); mathInit(); @@ -45,10 +58,10 @@ int main(void) while (1) { scenesDispatchUpdate(); scenesDispatchDraw(); - + performanceGather(); perfPrint(); - + timerTick(&g_timer); ++g_frameCount; } diff --git a/source/math.c b/source/math.c index 328deb3..68cb3cb 100644 --- a/source/math.c +++ b/source/math.c @@ -308,7 +308,12 @@ void matrix4x4Transpose(FIXED mat[16]) } -// Not my code, also not used anymore , and only included for reference. Numerical matrix inversion code: https://stackoverflow.com/questions/1148309/inverting-a-4x4-matrix +/* + The following is not my code and belongs to its respective author. (I simply converted it to use fixed point instead of floats.) + It's not used anymore, and only included as a comment for reference in case we want to invert non-orthonormal matrices one day. + It's some sort of numerical approach to matrix inversion (it worked fine, but the transpose approach is simpler, and less general). + cf. https://stackoverflow.com/questions/1148309/inverting-a-4x4-matrix (last retrieved 2021-06-29) + FIXED invf(int i,int j,const FIXED* m) { int o = 2+(j-i); @@ -349,3 +354,4 @@ bool matrix4x4Inverse(const FIXED *m, FIXED *out) return true; } +*/ \ No newline at end of file diff --git a/source/render/draw.c b/source/render/draw.c index 0c88801..b1b621a 100644 --- a/source/render/draw.c +++ b/source/render/draw.c @@ -48,7 +48,8 @@ void setDispScaleM5Scaled(void) .scr_x=0, .scr_y=5, // Vertical letterboxing. .tex_x=0, - .tex_y=0 }; + .tex_y=0 + }; BG_AFFINE bgaff; bg_rotscale_ex(&bgaff, &asx); REG_BG_AFFINE[2]= bgaff; @@ -58,6 +59,17 @@ void resetDispScale(void) { BG_AFFINE bgaff; bg_aff_identity(&bgaff); + AFF_SRC_EX asx= { + .alpha=0, + .sx=int2fx(1), + .sy=int2fx(1), + .scr_x=0, + .scr_y=-5, // Reset Vertical letterboxing. + .tex_x=0, + .tex_y=0 + }; + bg_rotscale_ex(&bgaff, &asx); + REG_BG_AFFINE[2]= bgaff; } @@ -142,7 +154,7 @@ IWRAM_CODE_ARM void drawPoints(const Camera *cam, Vec3 *points, int num, COLOR c } } -INLINE void drawTriangleWireframe(const RasterTriangle *tri) +IWRAM_CODE_ARM void drawTriangleWireframe(const RasterTriangle *tri) { if (!RASTERPOINT_IN_BOUNDS_M5(tri->vert[0]) || !RASTERPOINT_IN_BOUNDS_M5(tri->vert[1]) || !RASTERPOINT_IN_BOUNDS_M5(tri->vert[2])) { // We have to clip against the screen. for (int j = 0; j < 3; ++j) { @@ -273,7 +285,8 @@ IWRAM_CODE_ARM static void modelInstancesPrepareDraw(Camera* cam, ModelInstance // const Vec3 b = vecSub(vertsCamSpace[face.vertexIndex[2]], vertsCamSpace[face.vertexIndex[0]]); // const Vec3 triNormal = vecCross(b, a); // const Vec3 camToTri = vertsCamSpace[face.vertexIndex[2]]; - + + // Backface culling (with face normals, winding order does not matter): const Vec3 triNormal = vecTransformedRot(instanceRotMat, &face.normal); const Vec3 camToTri = vecSub(cam->pos, vertsWorldSpace[face.vertexIndex[0]]); if (vecDot(triNormal, camToTri) <= 0) { // If the angle between camera and normal is not between 90 degs and 270 degs, the face is invisible and to be culled. diff --git a/source/scenes/benchmarkScene.c b/source/scenes/benchmarkScene.c index bb719d0..724ea5f 100644 --- a/source/scenes/benchmarkScene.c +++ b/source/scenes/benchmarkScene.c @@ -8,7 +8,7 @@ #include "../timer.h" #include "../render/draw.h" -#include "../data/suzanneModel.h" +#include "../../data-models/suzanneModel.h" static Timer timer; static Camera cam; diff --git a/source/scenes/gbaScene.c b/source/scenes/gbaScene.c index 14f64e1..b1f00bd 100644 --- a/source/scenes/gbaScene.c +++ b/source/scenes/gbaScene.c @@ -7,7 +7,7 @@ #include "../timer.h" #include "../render/draw.h" -#include "../data/gbaModel.h" +#include "../../data-models/gbaModel.h" static Timer timer; diff --git a/source/scenes/testbedScene.c b/source/scenes/testbedScene.c index ca55b3e..8badaab 100644 --- a/source/scenes/testbedScene.c +++ b/source/scenes/testbedScene.c @@ -12,7 +12,7 @@ #include "../logutils.h" #include "../timer.h" -#include "../data/headModel.h" +#include "../../data-models/headModel.h" #define NUM_CUBES 9 diff --git a/source/scenes/twisterScene.c b/source/scenes/twisterScene.c index 4953b39..ab7ce84 100644 --- a/source/scenes/twisterScene.c +++ b/source/scenes/twisterScene.c @@ -70,8 +70,8 @@ IWRAM_CODE_ARM void twisterSceneUpdate(void) timerTick(&timer); int letterboxTrans = + fx12ToInt(8 * lu_sin(fx12ToInt(timer.time * TAU))); - letterboxTop = 40; - letterboxBottom = 120; + letterboxTop = 20; + letterboxBottom = 130; for (int i = 0; i < MAX_RENDER_TWISTERS; ++i) { int t = fx12ToInt(timer.time * PI / 2); @@ -175,6 +175,7 @@ IWRAM_CODE_ARM void twisterSceneDraw(void) { memset32(vid_page, quad8(CLRIDX_BLACK), 15 * M4_WIDTH/4); // TODO: REMOVE ME (only here for debugging so the fps text does not overdraw). memset32(vid_page + letterboxTop * M4_WIDTH / 2, quad8(CLRIDX_PASTEL_BLUE), (letterboxBottom - letterboxTop) * M4_WIDTH/4); + m4_rect(0, 0, 240, 20, CLRIDX_RED); renderTwisters(twistPtrs, MAX_RENDER_TWISTERS); } @@ -203,7 +204,7 @@ static void videoModeInit(void) { void twisterSceneStart(void) { - videoModeInit(); + videoModeInit(); m4_fill(CLRIDX_BLACK); timerStart(&timer); } diff --git a/source/timer.c b/source/timer.c index 995a989..122fc32 100644 --- a/source/timer.c +++ b/source/timer.c @@ -9,22 +9,20 @@ static PerformanceData performanceData[MAX_PERF_DATA]; static int currentPerformanceId; - void timerInit(void) { - REG_TM0D = 0x10000 - 4; // 4 ticks till overflow (at 16384 Hz (1024 cycles), that means we have a overflow every 4 * 16384^-1 = 2^-12 s, or 0.2 ms) - REG_TM0CNT = TM_ENABLE | TM_FREQ_1024; - REG_TM1CNT = TM_ENABLE | TM_CASCADE; // will increment in 2^-12 seconds (4098 Hz), can be used as a .12 fixed point number then, overflows every 16 seconds - - REG_TM2D = 0x10000 - 0xffff; // 0xffff ticks till overflow, or about 1 seconds (65536 Hz) - REG_TM2CNT = TM_ENABLE | TM_FREQ_256; + REG_TM2D = 0x10000 - 4; // 4 ticks till overflow (at 16384 Hz (1024 cycles), that means we have a overflow every 4 * 16384^-1 = 2^-12 s, or 0.2 ms) + REG_TM2CNT = TM_ENABLE | TM_FREQ_1024; + REG_TM3CNT = TM_ENABLE | TM_CASCADE; // will increment in 2^-12 seconds (4098 Hz), can be used as a .12 fixed point number then, overflows every 16 seconds + // REG_TM2D = 0x10000 - 0xffff; // 0xffff ticks till overflow, or about 1 seconds (65536 Hz) + // REG_TM2CNT = TM_ENABLE | TM_FREQ_256; for (int i = 0; i < MAX_PERF_DATA; ++i) { performanceData[i].avgTime = 0; } } - +// We ignore the TimerType; it's always TIMER_REGULAR for now regardless of the argument (we need Timer 0 and 1 for apex audio). Timer timerNew(FIXED_12 duration, TimerType type) { Timer timer; @@ -40,7 +38,8 @@ Timer timerNew(FIXED_12 duration, TimerType type) void timerStart(Timer *timer) { - timer->__prevTimerState = timer->type == TIMER_REGULAR ? REG_TM1D : REG_TM2D; + // timer->__prevTimerState = timer->type == TIMER_REGULAR ? REG_TM1D : REG_TM2D; + timer->__prevTimerState = REG_TM3D; timer->time = 0; timer->stopped = false; timer->done = false; @@ -54,7 +53,9 @@ void timerStop(Timer *timer) void timerResume(Timer *timer) { timer->stopped = false; - timer->__prevTimerState = timer->type == TIMER_REGULAR ? REG_TM1D : REG_TM2D; + // timer->__prevTimerState = timer->type == TIMER_REGULAR ? REG_TM1D : REG_TM2D; + timer->__prevTimerState = REG_TM3D; + } void timerRewind(Timer *timer) @@ -69,7 +70,8 @@ void timerTick(Timer *timer) return; } - FIXED_12 timerState = timer->type == TIMER_REGULAR ? REG_TM1D : REG_TM2D; + // FIXED_12 timerState = timer->type == TIMER_REGULAR ? REG_TM1D : REG_TM2D; + FIXED_12 timerState = REG_TM3D; if (timer->__prevTimerState > timerState) { timer->deltatime = (0xffff + timerState) - timer->__prevTimerState; // handle overflow @@ -130,7 +132,8 @@ void performancePrintAll(void) for (int i = 0; i < currentPerformanceId; ++i) { PerformanceData perf = performanceData[i]; if (perf.avgTime) { - int shift = perf.timer.type == TIMER_PERF ? 4 : 0; + // int shift = perf.timer.type == TIMER_PERF ? 4 : 0; + int shift = 0; mgba_printf("%s: %f ms (%d samples)", perf.name, fx12ToFloat( fx12div(perf.avgTime, int2fx12(perf.avgSamples)) * 1000 >> shift), perf.avgSamples); performanceData[i].avgSamples = 0; performanceData[i].avgTime = 0; @@ -141,6 +144,7 @@ void performancePrintAll(void) FIXED_12 performanceGetSeconds(const PerformanceData *perfData) { - int shift = perfData->timer.type == TIMER_PERF ? 4 : 0; + // int shift = perfData->timer.type == TIMER_PERF ? 4 : 0; + int shift = 0; return perfData->timer.time >> shift; } \ No newline at end of file diff --git a/tools/obj2model.py b/tools/obj2model.py index e3c4667..b54c936 100644 --- a/tools/obj2model.py +++ b/tools/obj2model.py @@ -201,7 +201,7 @@ def read_model_limits(): # With respect to the project directory. SOURCE_DIR = "source/" MODEL_DIR = "assets/models/" -OUT_DIR_DATA = "data/" +OUT_DIR_DATA = "data-models/" if __name__ == "__main__": MAX_MODEL_VERTS, MAX_MODEL_FACES = read_model_limits() @@ -231,5 +231,3 @@ def read_model_limits(): elif modelsWritten > 0 and modelsWritten < len(models): print(f"In:\t{' '.join(infile_paths)}\nOut:\t{' '.join(outfile_paths)}") print(f"Some models could not be converted, but no specific error was caught. This is a bug. {FAIL}(Failure){END}") - - diff --git a/tools/rgb2rgb15.py b/tools/rgb2rgb15.py deleted file mode 100644 index 6febb20..0000000 --- a/tools/rgb2rgb15.py +++ /dev/null @@ -1,21 +0,0 @@ -import re -import sys - -def convert(rgb): - match = re.search(r"(\d+)\D*(\d+)\D*(\d+)", rgb) - if match: - r = int(match.group(1)) - g = int(match.group(2)) - b = int(match.group(3)) - - r = round(r / 255.0 * 31) - g = round(g / 255.0 * 31) - b = round(b / 255.0 * 31) - - print(f"RGB15_SAFE({r}, {g}, {b})") - -if __name__ == "__main__": - if len(sys.argv) > 1: - convert(sys.argv[1]) - else: - print("Usage: rgb2rgb15 rgbstring") diff --git a/tools/sceneCodegen.py b/tools/sceneCodegen.py index dde77d6..5e7c811 100644 --- a/tools/sceneCodegen.py +++ b/tools/sceneCodegen.py @@ -99,7 +99,6 @@ def generate_template(name, mode=None): def generate_scene_c(): - cfiles = [scene for scene in pathlib.Path(".").joinpath(SCENE_DIR).glob("*.c")] scenes = list() for scene in cfiles: @@ -212,6 +211,8 @@ def generate_scene_c(): + +# NOTE: This was used to find the relevant functions in the source files back when we didn't use the CODEGEN block; we had to check for matching parentheses. Only here for reference. # match = re.search(r"void\s+scenesInit\s*(\s*void\s*)\s*\{", scene_c_text) # if not match: # raise ValueError("scene.c does not contain a sceneInit function, abort.")