From d242a071024060f65217ff1da616b8b865ab2ece Mon Sep 17 00:00:00 2001 From: CrashOveride95 Date: Sat, 2 Jan 2021 22:48:12 -0500 Subject: [PATCH] Add iQue support --- .gitignore | 2 + Makefile | 24 +- README.md | 3 +- asm/llmuldiv_gcc.s | 100 - include/ique/PR/PRimage.h | 126 + include/ique/PR/R4300.h | 453 ++ include/{ => ique}/PR/abi.h | 0 include/ique/PR/audiotools.h | 69 + include/ique/PR/bbfs.h | 86 + include/ique/PR/bbfs_export.h | 14 + include/ique/PR/bbskapi.h | 179 + include/ique/PR/bbskapi_export.h | 19 + include/ique/PR/dbgdefs.h | 38 + include/ique/PR/dbgproto.h | 609 +++ include/ique/PR/driverd.h | 134 + include/ique/PR/em.h | 102 + include/{ => ique}/PR/gbi-poslight.h | 0 include/{ => ique}/PR/gbi.h | 0 include/ique/PR/gs2dex.h | 393 ++ include/ique/PR/gt.h | 365 ++ include/ique/PR/gtoff.h | 12 + include/ique/PR/gu.h | 269 + include/ique/PR/gzsort.h | 633 +++ include/ique/PR/leo.h | 280 + include/{ => ique}/PR/leoappli.h | 0 include/ique/PR/leosp.h | 50 + include/{ => ique}/PR/libaudio.h | 0 include/ique/PR/mbi.h | 100 + include/{ => ique}/PR/n_libaudio.h | 0 include/{ => ique}/PR/n_libaudio_s_to_n.h | 0 include/ique/PR/os.h | 108 + include/ique/PR/os_ai.h | 92 + include/ique/PR/os_bb.h | 111 + include/ique/PR/os_bb_export.h | 30 + include/ique/PR/os_bbcard.h | 71 + include/ique/PR/os_bbexec.h | 72 + include/ique/PR/os_bbexec_export.h | 26 + include/ique/PR/os_bbfs.h | 108 + include/ique/PR/os_bbfs_export.h | 41 + include/ique/PR/os_cache.h | 96 + include/ique/PR/os_cont.h | 219 + include/ique/PR/os_convert.h | 111 + include/ique/PR/os_debug.h | 117 + include/ique/PR/os_eeprom.h | 107 + include/ique/PR/os_error.h | 86 + include/ique/PR/os_exception.h | 119 + include/ique/PR/os_flash.h | 71 + include/ique/PR/os_gbpak.h | 107 + include/ique/PR/os_gio.h | 86 + include/ique/PR/os_host.h | 170 + include/ique/PR/os_internal.h | 49 + include/ique/PR/os_internal_debug.h | 43 + include/ique/PR/os_internal_error.h | 45 + include/ique/PR/os_internal_exception.h | 49 + include/ique/PR/os_internal_gio.h | 45 + include/ique/PR/os_internal_host.h | 42 + include/ique/PR/os_internal_reg.h | 59 + include/ique/PR/os_internal_rsp.h | 48 + include/ique/PR/os_internal_si.h | 46 + include/ique/PR/os_internal_thread.h | 43 + include/ique/PR/os_internal_tlb.h | 47 + include/ique/PR/os_libc.h | 103 + include/ique/PR/os_message.h | 167 + include/ique/PR/os_motor.h | 83 + include/ique/PR/os_pfs.h | 174 + include/ique/PR/os_pi.h | 224 + include/ique/PR/os_rdp.h | 92 + include/ique/PR/os_reg.h | 90 + include/ique/PR/os_rsp.h | 86 + include/ique/PR/os_si.h | 86 + include/ique/PR/os_system.h | 118 + include/ique/PR/os_thread.h | 174 + include/ique/PR/os_time.h | 114 + include/ique/PR/os_tlb.h | 107 + include/ique/PR/os_usb.h | 172 + include/ique/PR/os_version.h | 16 + include/ique/PR/os_vi.h | 298 ++ include/ique/PR/os_voice.h | 108 + include/ique/PR/ramrom.h | 118 + include/ique/PR/rcp.h | 885 ++++ include/ique/PR/rdb.h | 107 + include/ique/PR/region.h | 123 + include/ique/PR/rmon.h | 53 + include/ique/PR/rsp.h | 85 + include/ique/PR/rsp_ipc.h | 69 + include/ique/PR/sched.h | 115 + include/ique/PR/sp.h | 196 + include/ique/PR/sptask.h | 201 + include/ique/PR/sptaskoff.h | 17 + include/ique/PR/trace.h | 82 + include/{ => ique}/PR/ucode.h | 0 include/ique/PR/ucode_debug.h | 54 + include/ique/PR/ultraerror.h | 179 + include/ique/PR/ultralog.h | 74 + include/{ => ique}/PR/ultratypes.h | 0 include/ique/PR/uportals.h | 134 + include/ique/PR/verify.h | 120 + include/ique/ultra64.h | 40 + include/{ => n64}/PR/PRimage.h | 0 include/{ => n64}/PR/R4300.h | 0 include/n64/PR/abi.h | 841 +++ include/n64/PR/gbi-poslight.h | 129 + include/n64/PR/gbi.h | 4805 ++++++++++++++++++ include/{ => n64}/PR/gs2dex.h | 0 include/{ => n64}/PR/gt.h | 0 include/{ => n64}/PR/gtoff.h | 0 include/{ => n64}/PR/gu.h | 0 include/{ => n64}/PR/gzsort.h | 0 include/{ => n64}/PR/leo.h | 0 include/n64/PR/leoappli.h | 274 + include/n64/PR/libaudio.h | 48 + include/{ => n64}/PR/mbi.h | 0 include/n64/PR/n_libaudio.h | 352 ++ include/n64/PR/n_libaudio_s_to_n.h | 120 + include/{ => n64}/PR/os.h | 0 include/{ => n64}/PR/os_ai.h | 0 include/{ => n64}/PR/os_cache.h | 0 include/{ => n64}/PR/os_cont.h | 0 include/{ => n64}/PR/os_convert.h | 0 include/{ => n64}/PR/os_debug.h | 0 include/{ => n64}/PR/os_eeprom.h | 0 include/{ => n64}/PR/os_error.h | 0 include/{ => n64}/PR/os_exception.h | 0 include/{ => n64}/PR/os_flash.h | 0 include/{ => n64}/PR/os_gbpak.h | 0 include/{ => n64}/PR/os_gio.h | 0 include/{ => n64}/PR/os_host.h | 0 include/{ => n64}/PR/os_internal.h | 0 include/{ => n64}/PR/os_internal_debug.h | 0 include/{ => n64}/PR/os_internal_error.h | 0 include/{ => n64}/PR/os_internal_exception.h | 0 include/{ => n64}/PR/os_internal_gio.h | 0 include/{ => n64}/PR/os_internal_host.h | 0 include/{ => n64}/PR/os_internal_reg.h | 0 include/{ => n64}/PR/os_internal_rsp.h | 0 include/{ => n64}/PR/os_internal_si.h | 0 include/{ => n64}/PR/os_internal_thread.h | 0 include/{ => n64}/PR/os_internal_tlb.h | 0 include/{ => n64}/PR/os_libc.h | 0 include/{ => n64}/PR/os_message.h | 0 include/{ => n64}/PR/os_motor.h | 0 include/{ => n64}/PR/os_pfs.h | 0 include/{ => n64}/PR/os_pi.h | 0 include/{ => n64}/PR/os_rdp.h | 0 include/{ => n64}/PR/os_reg.h | 0 include/{ => n64}/PR/os_rsp.h | 0 include/{ => n64}/PR/os_si.h | 0 include/{ => n64}/PR/os_system.h | 0 include/{ => n64}/PR/os_thread.h | 0 include/{ => n64}/PR/os_time.h | 0 include/{ => n64}/PR/os_tlb.h | 0 include/{ => n64}/PR/os_version.h | 0 include/{ => n64}/PR/os_vi.h | 0 include/{ => n64}/PR/os_voice.h | 0 include/{ => n64}/PR/ramrom.h | 0 include/{ => n64}/PR/rcp.h | 0 include/{ => n64}/PR/rdb.h | 0 include/{ => n64}/PR/region.h | 0 include/{ => n64}/PR/rmon.h | 0 include/{ => n64}/PR/rsp.h | 0 include/{ => n64}/PR/rsp_ipc.h | 0 include/{ => n64}/PR/sched.h | 0 include/{ => n64}/PR/sp.h | 0 include/{ => n64}/PR/sptask.h | 0 include/{ => n64}/PR/sptaskoff.h | 0 include/{ => n64}/PR/trace.h | 0 include/n64/PR/ucode.h | 260 + include/{ => n64}/PR/ucode_debug.h | 0 include/{ => n64}/PR/ultraerror.h | 0 include/{ => n64}/PR/ultralog.h | 0 include/n64/PR/ultratypes.h | 97 + include/{ => n64}/PR/uportals.h | 0 include/{ => n64}/ultra64.h | 0 lib/ique/libultra_rom.a | Bin 0 -> 1381082 bytes lib/libgcc.a | Bin 0 -> 303298 bytes lib/libultra.a | Bin 1277452 -> 0 bytes lib/libultra_d.a | Bin 17661280 -> 0 bytes lib/{ => n64}/libultra_rom.a | Bin sm64.ld | 24 +- 179 files changed, 18231 insertions(+), 107 deletions(-) delete mode 100644 asm/llmuldiv_gcc.s create mode 100755 include/ique/PR/PRimage.h create mode 100755 include/ique/PR/R4300.h rename include/{ => ique}/PR/abi.h (100%) create mode 100755 include/ique/PR/audiotools.h create mode 100644 include/ique/PR/bbfs.h create mode 100755 include/ique/PR/bbfs_export.h create mode 100644 include/ique/PR/bbskapi.h create mode 100755 include/ique/PR/bbskapi_export.h create mode 100755 include/ique/PR/dbgdefs.h create mode 100755 include/ique/PR/dbgproto.h create mode 100755 include/ique/PR/driverd.h create mode 100755 include/ique/PR/em.h rename include/{ => ique}/PR/gbi-poslight.h (100%) rename include/{ => ique}/PR/gbi.h (100%) mode change 100644 => 100755 create mode 100755 include/ique/PR/gs2dex.h create mode 100755 include/ique/PR/gt.h create mode 100755 include/ique/PR/gtoff.h create mode 100755 include/ique/PR/gu.h create mode 100755 include/ique/PR/gzsort.h create mode 100755 include/ique/PR/leo.h rename include/{ => ique}/PR/leoappli.h (100%) mode change 100644 => 100755 create mode 100755 include/ique/PR/leosp.h rename include/{ => ique}/PR/libaudio.h (100%) create mode 100755 include/ique/PR/mbi.h rename include/{ => ique}/PR/n_libaudio.h (100%) mode change 100644 => 100755 rename include/{ => ique}/PR/n_libaudio_s_to_n.h (100%) mode change 100644 => 100755 create mode 100755 include/ique/PR/os.h create mode 100755 include/ique/PR/os_ai.h create mode 100644 include/ique/PR/os_bb.h create mode 100755 include/ique/PR/os_bb_export.h create mode 100755 include/ique/PR/os_bbcard.h create mode 100644 include/ique/PR/os_bbexec.h create mode 100755 include/ique/PR/os_bbexec_export.h create mode 100644 include/ique/PR/os_bbfs.h create mode 100755 include/ique/PR/os_bbfs_export.h create mode 100755 include/ique/PR/os_cache.h create mode 100755 include/ique/PR/os_cont.h create mode 100755 include/ique/PR/os_convert.h create mode 100755 include/ique/PR/os_debug.h create mode 100755 include/ique/PR/os_eeprom.h create mode 100755 include/ique/PR/os_error.h create mode 100755 include/ique/PR/os_exception.h create mode 100755 include/ique/PR/os_flash.h create mode 100755 include/ique/PR/os_gbpak.h create mode 100755 include/ique/PR/os_gio.h create mode 100755 include/ique/PR/os_host.h create mode 100755 include/ique/PR/os_internal.h create mode 100755 include/ique/PR/os_internal_debug.h create mode 100755 include/ique/PR/os_internal_error.h create mode 100755 include/ique/PR/os_internal_exception.h create mode 100755 include/ique/PR/os_internal_gio.h create mode 100755 include/ique/PR/os_internal_host.h create mode 100755 include/ique/PR/os_internal_reg.h create mode 100755 include/ique/PR/os_internal_rsp.h create mode 100755 include/ique/PR/os_internal_si.h create mode 100755 include/ique/PR/os_internal_thread.h create mode 100755 include/ique/PR/os_internal_tlb.h create mode 100755 include/ique/PR/os_libc.h create mode 100755 include/ique/PR/os_message.h create mode 100755 include/ique/PR/os_motor.h create mode 100755 include/ique/PR/os_pfs.h create mode 100755 include/ique/PR/os_pi.h create mode 100755 include/ique/PR/os_rdp.h create mode 100755 include/ique/PR/os_reg.h create mode 100755 include/ique/PR/os_rsp.h create mode 100755 include/ique/PR/os_si.h create mode 100755 include/ique/PR/os_system.h create mode 100755 include/ique/PR/os_thread.h create mode 100755 include/ique/PR/os_time.h create mode 100755 include/ique/PR/os_tlb.h create mode 100755 include/ique/PR/os_usb.h create mode 100755 include/ique/PR/os_version.h create mode 100755 include/ique/PR/os_vi.h create mode 100755 include/ique/PR/os_voice.h create mode 100755 include/ique/PR/ramrom.h create mode 100755 include/ique/PR/rcp.h create mode 100755 include/ique/PR/rdb.h create mode 100755 include/ique/PR/region.h create mode 100755 include/ique/PR/rmon.h create mode 100755 include/ique/PR/rsp.h create mode 100755 include/ique/PR/rsp_ipc.h create mode 100755 include/ique/PR/sched.h create mode 100755 include/ique/PR/sp.h create mode 100755 include/ique/PR/sptask.h create mode 100755 include/ique/PR/sptaskoff.h create mode 100755 include/ique/PR/trace.h rename include/{ => ique}/PR/ucode.h (100%) create mode 100755 include/ique/PR/ucode_debug.h create mode 100755 include/ique/PR/ultraerror.h create mode 100755 include/ique/PR/ultralog.h rename include/{ => ique}/PR/ultratypes.h (100%) create mode 100755 include/ique/PR/uportals.h create mode 100755 include/ique/PR/verify.h create mode 100755 include/ique/ultra64.h rename include/{ => n64}/PR/PRimage.h (100%) rename include/{ => n64}/PR/R4300.h (100%) create mode 100644 include/n64/PR/abi.h create mode 100644 include/n64/PR/gbi-poslight.h create mode 100644 include/n64/PR/gbi.h rename include/{ => n64}/PR/gs2dex.h (100%) rename include/{ => n64}/PR/gt.h (100%) rename include/{ => n64}/PR/gtoff.h (100%) rename include/{ => n64}/PR/gu.h (100%) rename include/{ => n64}/PR/gzsort.h (100%) rename include/{ => n64}/PR/leo.h (100%) create mode 100644 include/n64/PR/leoappli.h create mode 100644 include/n64/PR/libaudio.h rename include/{ => n64}/PR/mbi.h (100%) create mode 100644 include/n64/PR/n_libaudio.h create mode 100644 include/n64/PR/n_libaudio_s_to_n.h rename include/{ => n64}/PR/os.h (100%) rename include/{ => n64}/PR/os_ai.h (100%) rename include/{ => n64}/PR/os_cache.h (100%) rename include/{ => n64}/PR/os_cont.h (100%) rename include/{ => n64}/PR/os_convert.h (100%) rename include/{ => n64}/PR/os_debug.h (100%) rename include/{ => n64}/PR/os_eeprom.h (100%) rename include/{ => n64}/PR/os_error.h (100%) rename include/{ => n64}/PR/os_exception.h (100%) rename include/{ => n64}/PR/os_flash.h (100%) rename include/{ => n64}/PR/os_gbpak.h (100%) rename include/{ => n64}/PR/os_gio.h (100%) rename include/{ => n64}/PR/os_host.h (100%) rename include/{ => n64}/PR/os_internal.h (100%) rename include/{ => n64}/PR/os_internal_debug.h (100%) rename include/{ => n64}/PR/os_internal_error.h (100%) rename include/{ => n64}/PR/os_internal_exception.h (100%) rename include/{ => n64}/PR/os_internal_gio.h (100%) rename include/{ => n64}/PR/os_internal_host.h (100%) rename include/{ => n64}/PR/os_internal_reg.h (100%) rename include/{ => n64}/PR/os_internal_rsp.h (100%) rename include/{ => n64}/PR/os_internal_si.h (100%) rename include/{ => n64}/PR/os_internal_thread.h (100%) rename include/{ => n64}/PR/os_internal_tlb.h (100%) rename include/{ => n64}/PR/os_libc.h (100%) rename include/{ => n64}/PR/os_message.h (100%) rename include/{ => n64}/PR/os_motor.h (100%) rename include/{ => n64}/PR/os_pfs.h (100%) rename include/{ => n64}/PR/os_pi.h (100%) rename include/{ => n64}/PR/os_rdp.h (100%) rename include/{ => n64}/PR/os_reg.h (100%) rename include/{ => n64}/PR/os_rsp.h (100%) rename include/{ => n64}/PR/os_si.h (100%) rename include/{ => n64}/PR/os_system.h (100%) rename include/{ => n64}/PR/os_thread.h (100%) rename include/{ => n64}/PR/os_time.h (100%) rename include/{ => n64}/PR/os_tlb.h (100%) rename include/{ => n64}/PR/os_version.h (100%) rename include/{ => n64}/PR/os_vi.h (100%) rename include/{ => n64}/PR/os_voice.h (100%) rename include/{ => n64}/PR/ramrom.h (100%) rename include/{ => n64}/PR/rcp.h (100%) rename include/{ => n64}/PR/rdb.h (100%) rename include/{ => n64}/PR/region.h (100%) rename include/{ => n64}/PR/rmon.h (100%) rename include/{ => n64}/PR/rsp.h (100%) rename include/{ => n64}/PR/rsp_ipc.h (100%) rename include/{ => n64}/PR/sched.h (100%) rename include/{ => n64}/PR/sp.h (100%) rename include/{ => n64}/PR/sptask.h (100%) rename include/{ => n64}/PR/sptaskoff.h (100%) rename include/{ => n64}/PR/trace.h (100%) create mode 100644 include/n64/PR/ucode.h rename include/{ => n64}/PR/ucode_debug.h (100%) rename include/{ => n64}/PR/ultraerror.h (100%) rename include/{ => n64}/PR/ultralog.h (100%) create mode 100644 include/n64/PR/ultratypes.h rename include/{ => n64}/PR/uportals.h (100%) rename include/{ => n64}/ultra64.h (100%) create mode 100644 lib/ique/libultra_rom.a create mode 100644 lib/libgcc.a delete mode 100644 lib/libultra.a delete mode 100644 lib/libultra_d.a rename lib/{ => n64}/libultra_rom.a (100%) diff --git a/.gitignore b/.gitignore index 0995f7a5..1af2b587 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,8 @@ build/* # libultra !/lib/*.a +!/lib/n64/*.a +!/lib/ique/*.a !/lib/PR/hvqm/*.o diff --git a/Makefile b/Makefile index 0d38a3f2..39927956 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,21 @@ DEFINES := # Build for the N64 (turn this off for ports) TARGET_N64 ?= 1 +# Location of official N64 libraries +# CONSOLE - selects the console to target +# jp - builds the 1996 Japanese version +# us - builds the 1996 North American version +CONSOLE ?= n64 +$(eval $(call validate-option,CONSOLE,n64 ique)) + +ifeq ($(CONSOLE),n64) + INCLUDE_DIRS += include/n64 + LIBS_DIR := lib/n64 +else ifeq ($(CONSOLE),ique) + INCLUDE_DIRS += include/ique + LIBS_DIR := lib/ique + DEFINES += BBPLAYER=1 +endif # COMPILER - selects the C compiler to use # ido - uses the SGI IRIS Development Option compiler, which is used to build @@ -130,7 +145,7 @@ endif COMPARE ?= 0 $(eval $(call validate-option,COMPARE,0 1)) -TARGET_STRING := sm64.$(VERSION).$(GRUCODE) +TARGET_STRING := sm64.$(VERSION).$(CONSOLE).$(GRUCODE) # If non-default settings were chosen, disable COMPARE ifeq ($(filter $(TARGET_STRING), sm64.jp.f3d_old sm64.us.f3d_old sm64.eu.f3d_new sm64.sh.f3d_new),) COMPARE := 0 @@ -172,6 +187,7 @@ ifeq ($(filter clean distclean,$(MAKECMDGOALS)),) $(info ==== Build Options ====) $(info Version: $(VERSION)) $(info Microcode: $(GRUCODE)) + $(info Console: $(CONSOLE)) $(info Target: $(TARGET)) ifeq ($(COMPARE),1) $(info Compare ROM: yes) @@ -193,8 +209,6 @@ endif TOOLS_DIR := tools -# Location of official N64 libraries -N64_LIBS_DIR ?= lib # (This is a bit hacky, but a lot of rules implicitly depend # on tools and assets, and we use directory globs further down @@ -337,7 +351,7 @@ ifeq ($(TARGET_N64),1) CC_CFLAGS := -fno-builtin endif -INCLUDE_DIRS := include $(BUILD_DIR) $(BUILD_DIR)/include src . include/hvqm +INCLUDE_DIRS += include $(BUILD_DIR) $(BUILD_DIR)/include src . include/hvqm ifeq ($(TARGET_N64),1) INCLUDE_DIRS += include/libc endif @@ -752,7 +766,7 @@ $(BUILD_DIR)/libultra.a: $(ULTRA_O_FILES) # Link SM64 ELF file $(ELF): $(O_FILES) $(YAY0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt $(BUILD_DIR)/libultra.a @$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n" - $(V)$(LD) -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -L $(N64_LIBS_DIR) -lultra_rom -lhvqm2 + $(V)$(LD) -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -L$(LIBS_DIR) -lultra_rom -Llib -lhvqm2 -lgcc # Build ROM $(ROM): $(ELF) diff --git a/README.md b/README.md index 4ea76d94..1c0650f5 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,9 @@ - Naming and documentation of the source code and data structures are in progress. - It has been edited to allow for the usage of the final "N64 OS" library, version ``2.0L`` - Shindou Rumble Pak code is on for all regions. +- Targeting the iQue Player is supported. - It has been patched with someone2639's shiftable segments patch -- It will have HVQM full motion video support +- Getting HVQM FMV support to work with the game is in progress. - Getting UNFLoader (flashcart USB library) to work with the game is in progress. ## FAQ diff --git a/asm/llmuldiv_gcc.s b/asm/llmuldiv_gcc.s deleted file mode 100644 index cf604929..00000000 --- a/asm/llmuldiv_gcc.s +++ /dev/null @@ -1,100 +0,0 @@ -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 - -.include "macros.inc" - - -.section .text, "ax" - -/* -------------------------------------------------------------------------------------- */ -/* need to asm these functions because lib32gcc-7-dev-mips-cross does not exist so we */ -/* cannot naturally link a libgcc variant for this target given this architecture and */ -/* compiler. Until we have a good workaround with a gcc target that doesn't involve */ -/* assuming a 32-bit to 64-bit change, we have to encode these functions as raw assembly */ -/* for it to compile. */ -/* -------------------------------------------------------------------------------------- */ - -/* TODO: Is there a non-insane way to fix this hack that doesn't involve the user compiling */ -/* a library themselves? */ -glabel __umoddi3 - sw $a0, ($sp) - sw $a1, 4($sp) - sw $a2, 8($sp) - sw $a3, 0xc($sp) - ld $t7, 8($sp) - ld $t6, ($sp) - ddivu $zero, $t6, $t7 - bnez $t7, .L80324144 - nop - break 7 -.L80324144: - mfhi $v0 - dsll32 $v1, $v0, 0 - dsra32 $v1, $v1, 0 - jr $ra - dsra32 $v0, $v0, 0 - -glabel __udivdi3 - sw $a0, ($sp) - sw $a1, 4($sp) - sw $a2, 8($sp) - sw $a3, 0xc($sp) - ld $t7, 8($sp) - ld $t6, ($sp) - ddivu $zero, $t6, $t7 - bnez $t7, .L80324180 - nop - break 7 -.L80324180: - mflo $v0 - dsll32 $v1, $v0, 0 - dsra32 $v1, $v1, 0 - jr $ra - dsra32 $v0, $v0, 0 - -glabel __moddi3 - sw $a0, ($sp) - sw $a1, 4($sp) - sw $a2, 8($sp) - sw $a3, 0xc($sp) - ld $t7, 8($sp) - ld $t6, ($sp) - ddivu $zero, $t6, $t7 - bnez $t7, .L803241E8 - nop - break 7 -.L803241E8: - mfhi $v0 - dsll32 $v1, $v0, 0 - dsra32 $v1, $v1, 0 - jr $ra - dsra32 $v0, $v0, 0 - -glabel __divdi3 - sw $a0, ($sp) - sw $a1, 4($sp) - sw $a2, 8($sp) - sw $a3, 0xc($sp) - ld $t7, 8($sp) - ld $t6, ($sp) - ddiv $zero, $t6, $t7 - nop - bnez $t7, .L80324228 - nop - break 7 -.L80324228: - daddiu $at, $zero, -1 - bne $t7, $at, .L80324244 - daddiu $at, $zero, 1 - dsll32 $at, $at, 0x1f - bne $t6, $at, .L80324244 - nop - break 6 -.L80324244: - mflo $v0 - dsll32 $v1, $v0, 0 - dsra32 $v1, $v1, 0 - jr $ra - dsra32 $v0, $v0, 0 diff --git a/include/ique/PR/PRimage.h b/include/ique/PR/PRimage.h new file mode 100755 index 00000000..85457713 --- /dev/null +++ b/include/ique/PR/PRimage.h @@ -0,0 +1,126 @@ +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/PRimage.h,v $ + * + **************************************************************************/ + +#ifndef __GL_IMAGE_H__ +#define __GL_IMAGE_H__ +#ifdef __cplusplus +extern "C" { +#endif + + +/* + * Defines for image files . . . . + * + * Paul Haeberli - 1984 + * Look in /usr/people/4Dgifts/iristools/imgtools for example code! + * + */ + +#include + +#define IMAGIC 0732 + +/* colormap of images */ +#define CM_NORMAL 0 /* file contains rows of values which + * are either RGB values (zsize == 3) + * or greyramp values (zsize == 1) */ +#define CM_DITHERED 1 +#define CM_SCREEN 2 /* file contains data which is a screen + * image; getrow returns buffer which + * can be displayed directly with + * writepixels */ +#define CM_COLORMAP 3 /* a colormap file */ + +#define TYPEMASK 0xff00 +#define BPPMASK 0x00ff +#define ITYPE_VERBATIM 0x0000 +#define ITYPE_RLE 0x0100 +#define ISRLE(type) (((type) & 0xff00) == ITYPE_RLE) +#define ISVERBATIM(type) (((type) & 0xff00) == ITYPE_VERBATIM) +#define BPP(type) ((type) & BPPMASK) +#define RLE(bpp) (ITYPE_RLE | (bpp)) +#define VERBATIM(bpp) (ITYPE_VERBATIM | (bpp)) +#define IBUFSIZE(pixels) (((pixels)+((pixels)>>6))<<2) +#define RLE_NOP 0x00 + +#define ierror(p) (((p)->flags&_IOERR)!=0) +#define ifileno(p) ((p)->file) +#define getpix(p) (--(p)->cnt>=0 ? *(p)->ptr++ : ifilbuf(p)) +#define putpix(p,x) (--(p)->cnt>=0 \ + ? ((int)(*(p)->ptr++=(unsigned)(x))) \ + : iflsbuf(p,(unsigned)(x))) + +typedef struct { + unsigned short imagic; /* stuff saved on disk . . */ + unsigned short type; + unsigned short dim; + unsigned short xsize; + unsigned short ysize; + unsigned short zsize; + unsigned long min; + unsigned long max; + unsigned long wastebytes; + char name[80]; + unsigned long colormap; + + long file; /* stuff used in core only */ + unsigned short flags; + short dorev; + short x; + short y; + short z; + short cnt; + unsigned short *ptr; + unsigned short *base; + unsigned short *tmpbuf; + unsigned long offset; + unsigned long rleend; /* for rle images */ + unsigned long *rowstart; /* for rle images */ + long *rowsize; /* for rle images */ +} IMAGE; + +IMAGE *icreate(); +/* + * IMAGE *iopen(char *file, char *mode, unsigned int type, unsigned int dim, + * unsigned int xsize, unsigned int ysize, unsigned int zsize); + * IMAGE *fiopen(int f, char *mode, unsigned int type, unsigned int dim, + * unsigned int xsize, unsigned int ysize, unsigned int zsize); + * + * ...while iopen and fiopen can take an extended set of parameters, the + * last five are optional, so a more correct prototype would be: + * + */ +IMAGE *iopen(char *file, char *mode, ...); +IMAGE *fiopen(int f, char *mode, ...); + +/* + * + * unsigned short *ibufalloc(IMAGE *image); + * int ifilbuf(IMAGE *image); + * int iflush(IMAGE *image); + * unsigned int iflsbuf(IMAGE *image, unsigned int c); + * void isetname(IMAGE *image, char *name); + * void isetcolormap(IMAGE *image, int colormap); + */ + +int iclose(IMAGE *image); +int putrow(IMAGE *image, unsigned short *buffer, unsigned int y, unsigned int z); +int getrow(IMAGE *image, unsigned short *buffer, unsigned int y, unsigned int z); + +/* +IMAGE *iopen(); +IMAGE *icreate(); +*/ + +unsigned short *ibufalloc(); + +#define IMAGEDEF /* for backwards compatibility */ +#ifdef __cplusplus +} +#endif +#endif /* !__GL_IMAGE_H__ */ diff --git a/include/ique/PR/R4300.h b/include/ique/PR/R4300.h new file mode 100755 index 00000000..95c5211b --- /dev/null +++ b/include/ique/PR/R4300.h @@ -0,0 +1,453 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/R4300.h,v $ + * + **************************************************************************/ + +#ifndef __R4300_H__ +#define __R4300_H__ + +#include + +/* + * Segment base addresses and sizes + */ +#define KUBASE 0 +#define KUSIZE 0x80000000 +#define K0BASE 0x80000000 +#define K0SIZE 0x20000000 +#define K1BASE 0xA0000000 +#define K1SIZE 0x20000000 +#define K2BASE 0xC0000000 +#define K2SIZE 0x20000000 + +/* + * Exception vectors + */ +#define SIZE_EXCVEC 0x80 /* Size of an exc. vec */ +#define UT_VEC K0BASE /* utlbmiss vector */ +#define R_VEC (K1BASE+0x1fc00000) /* reset vector */ +#define XUT_VEC (K0BASE+0x80) /* extended address tlbmiss */ +#define ECC_VEC (K0BASE+0x100) /* Ecc exception vector */ +#define E_VEC (K0BASE+0x180) /* Gen. exception vector */ + +/* + * Address conversion macros + */ +#ifdef _LANGUAGE_ASSEMBLY + +#define K0_TO_K1(x) ((x)|0xA0000000) /* kseg0 to kseg1 */ +#define K1_TO_K0(x) ((x)&0x9FFFFFFF) /* kseg1 to kseg0 */ +#define K0_TO_PHYS(x) ((x)&0x1FFFFFFF) /* kseg0 to physical */ +#define K1_TO_PHYS(x) ((x)&0x1FFFFFFF) /* kseg1 to physical */ +#define KDM_TO_PHYS(x) ((x)&0x1FFFFFFF) /* direct mapped to physical */ +#define PHYS_TO_K0(x) ((x)|0x80000000) /* physical to kseg0 */ +#define PHYS_TO_K1(x) ((x)|0xA0000000) /* physical to kseg1 */ + +#else /* _LANGUAGE_C */ + +#define K0_TO_K1(x) ((u32)(x)|0xA0000000) /* kseg0 to kseg1 */ +#define K1_TO_K0(x) ((u32)(x)&0x9FFFFFFF) /* kseg1 to kseg0 */ +#define K0_TO_PHYS(x) ((u32)(x)&0x1FFFFFFF) /* kseg0 to physical */ +#define K1_TO_PHYS(x) ((u32)(x)&0x1FFFFFFF) /* kseg1 to physical */ +#define KDM_TO_PHYS(x) ((u32)(x)&0x1FFFFFFF) /* direct mapped to physical */ +#define PHYS_TO_K0(x) ((u32)(x)|0x80000000) /* physical to kseg0 */ +#define PHYS_TO_K1(x) ((u32)(x)|0xA0000000) /* physical to kseg1 */ + +#endif /* _LANGUAGE_ASSEMBLY */ + +/* + * Address predicates + */ +#define IS_KSEG0(x) ((u32)(x) >= K0BASE && (u32)(x) < K1BASE) +#define IS_KSEG1(x) ((u32)(x) >= K1BASE && (u32)(x) < K2BASE) +#define IS_KSEGDM(x) ((u32)(x) >= K0BASE && (u32)(x) < K2BASE) +#define IS_KSEG2(x) ((u32)(x) >= K2BASE && (u32)(x) < KPTE_SHDUBASE) +#define IS_KPTESEG(x) ((u32)(x) >= KPTE_SHDUBASE) +#define IS_KUSEG(x) ((u32)(x) < K0BASE) + +/* + * TLB size constants + */ + +#define NTLBENTRIES 31 /* entry 31 is reserved by rdb */ + +#define TLBHI_VPN2MASK 0xffffe000 +#define TLBHI_VPN2SHIFT 13 +#define TLBHI_PIDMASK 0xff +#define TLBHI_PIDSHIFT 0 +#define TLBHI_NPID 255 /* 255 to fit in 8 bits */ + +#define TLBLO_PFNMASK 0x3fffffc0 +#define TLBLO_PFNSHIFT 6 +#define TLBLO_CACHMASK 0x38 /* cache coherency algorithm */ +#define TLBLO_CACHSHIFT 3 +#define TLBLO_UNCACHED 0x10 /* not cached */ +#define TLBLO_NONCOHRNT 0x18 /* Cacheable non-coherent */ +#define TLBLO_EXLWR 0x28 /* Exclusive write */ +#define TLBLO_D 0x4 /* writeable */ +#define TLBLO_V 0x2 /* valid bit */ +#define TLBLO_G 0x1 /* global access bit */ + +#define TLBINX_PROBE 0x80000000 +#define TLBINX_INXMASK 0x3f +#define TLBINX_INXSHIFT 0 + +#define TLBRAND_RANDMASK 0x3f +#define TLBRAND_RANDSHIFT 0 + +#define TLBWIRED_WIREDMASK 0x3f + +#define TLBCTXT_BASEMASK 0xff800000 +#define TLBCTXT_BASESHIFT 23 +#define TLBCTXT_BASEBITS 9 + +#define TLBCTXT_VPNMASK 0x7ffff0 +#define TLBCTXT_VPNSHIFT 4 + +#define TLBPGMASK_4K 0x0 +#define TLBPGMASK_16K 0x6000 +#define TLBPGMASK_64K 0x1e000 + +/* + * Status register + */ +#define SR_CUMASK 0xf0000000 /* coproc usable bits */ + +#define SR_CU3 0x80000000 /* Coprocessor 3 usable */ +#define SR_CU2 0x40000000 /* Coprocessor 2 usable */ +#define SR_CU1 0x20000000 /* Coprocessor 1 usable */ +#define SR_CU0 0x10000000 /* Coprocessor 0 usable */ +#define SR_RP 0x08000000 /* Reduced power (quarter speed) */ +#define SR_FR 0x04000000 /* MIPS III FP register mode */ +#define SR_RE 0x02000000 /* Reverse endian */ +#define SR_ITS 0x01000000 /* Instruction trace support */ +#define SR_BEV 0x00400000 /* Use boot exception vectors */ +#define SR_TS 0x00200000 /* TLB shutdown */ +#define SR_SR 0x00100000 /* Soft reset occured */ +#define SR_CH 0x00040000 /* Cache hit for last 'cache' op */ +#define SR_CE 0x00020000 /* Create ECC */ +#define SR_DE 0x00010000 /* ECC of parity does not cause error */ + +/* + * Interrupt enable bits + * (NOTE: bits set to 1 enable the corresponding level interrupt) + */ +#define SR_IMASK 0x0000ff00 /* Interrupt mask */ +#define SR_IMASK8 0x00000000 /* mask level 8 */ +#define SR_IMASK7 0x00008000 /* mask level 7 */ +#define SR_IMASK6 0x0000c000 /* mask level 6 */ +#define SR_IMASK5 0x0000e000 /* mask level 5 */ +#define SR_IMASK4 0x0000f000 /* mask level 4 */ +#define SR_IMASK3 0x0000f800 /* mask level 3 */ +#define SR_IMASK2 0x0000fc00 /* mask level 2 */ +#define SR_IMASK1 0x0000fe00 /* mask level 1 */ +#define SR_IMASK0 0x0000ff00 /* mask level 0 */ + +#define SR_IBIT8 0x00008000 /* bit level 8 */ +#define SR_IBIT7 0x00004000 /* bit level 7 */ +#define SR_IBIT6 0x00002000 /* bit level 6 */ +#define SR_IBIT5 0x00001000 /* bit level 5 */ +#define SR_IBIT4 0x00000800 /* bit level 4 */ +#define SR_IBIT3 0x00000400 /* bit level 3 */ +#define SR_IBIT2 0x00000200 /* bit level 2 */ +#define SR_IBIT1 0x00000100 /* bit level 1 */ + +#define SR_IMASKSHIFT 8 + +#define SR_KX 0x00000080 /* extended-addr TLB vec in kernel */ +#define SR_SX 0x00000040 /* xtended-addr TLB vec supervisor */ +#define SR_UX 0x00000020 /* xtended-addr TLB vec in user mode */ +#define SR_KSU_MASK 0x00000018 /* mode mask */ +#define SR_KSU_USR 0x00000010 /* user mode */ +#define SR_KSU_SUP 0x00000008 /* supervisor mode */ +#define SR_KSU_KER 0x00000000 /* kernel mode */ +#define SR_ERL 0x00000004 /* Error level, 1=>cache error */ +#define SR_EXL 0x00000002 /* Exception level, 1=>exception */ +#define SR_IE 0x00000001 /* interrupt enable, 1=>enable */ + +/* + * Cause Register + */ +#define CAUSE_BD 0x80000000 /* Branch delay slot */ +#define CAUSE_CEMASK 0x30000000 /* coprocessor error */ +#define CAUSE_CESHIFT 28 + +/* Interrupt pending bits */ +#define CAUSE_IP8 0x00008000 /* External level 8 pending - COMPARE */ +#define CAUSE_IP7 0x00004000 /* External level 7 pending - INT4 */ +#define CAUSE_IP6 0x00002000 /* External level 6 pending - INT3 */ +#define CAUSE_IP5 0x00001000 /* External level 5 pending - INT2 */ +#define CAUSE_IP4 0x00000800 /* External level 4 pending - INT1 */ +#define CAUSE_IP3 0x00000400 /* External level 3 pending - INT0 */ +#define CAUSE_SW2 0x00000200 /* Software level 2 pending */ +#define CAUSE_SW1 0x00000100 /* Software level 1 pending */ + +#define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */ +#define CAUSE_IPSHIFT 8 + +#define CAUSE_EXCMASK 0x0000007C /* Cause code bits */ + +#define CAUSE_EXCSHIFT 2 + +/* Cause register exception codes */ + +#define EXC_CODE(x) ((x)<<2) + +/* Hardware exception codes */ +#define EXC_INT EXC_CODE(0) /* interrupt */ +#define EXC_MOD EXC_CODE(1) /* TLB mod */ +#define EXC_RMISS EXC_CODE(2) /* Read TLB Miss */ +#define EXC_WMISS EXC_CODE(3) /* Write TLB Miss */ +#define EXC_RADE EXC_CODE(4) /* Read Address Error */ +#define EXC_WADE EXC_CODE(5) /* Write Address Error */ +#define EXC_IBE EXC_CODE(6) /* Instruction Bus Error */ +#define EXC_DBE EXC_CODE(7) /* Data Bus Error */ +#define EXC_SYSCALL EXC_CODE(8) /* SYSCALL */ +#define EXC_BREAK EXC_CODE(9) /* BREAKpoint */ +#define EXC_II EXC_CODE(10) /* Illegal Instruction */ +#define EXC_CPU EXC_CODE(11) /* CoProcessor Unusable */ +#define EXC_OV EXC_CODE(12) /* OVerflow */ +#define EXC_TRAP EXC_CODE(13) /* Trap exception */ +#define EXC_VCEI EXC_CODE(14) /* Virt. Coherency on Inst. fetch */ +#define EXC_FPE EXC_CODE(15) /* Floating Point Exception */ +#define EXC_WATCH EXC_CODE(23) /* Watchpoint reference */ +#define EXC_VCED EXC_CODE(31) /* Virt. Coherency on data read */ + +/* C0_PRID Defines */ +#define C0_IMPMASK 0xff00 +#define C0_IMPSHIFT 8 +#define C0_REVMASK 0xff +#define C0_MAJREVMASK 0xf0 +#define C0_MAJREVSHIFT 4 +#define C0_MINREVMASK 0xf + +/* + * Coprocessor 0 operations + */ +#define C0_READI 0x1 /* read ITLB entry addressed by C0_INDEX */ +#define C0_WRITEI 0x2 /* write ITLB entry addressed by C0_INDEX */ +#define C0_WRITER 0x6 /* write ITLB entry addressed by C0_RAND */ +#define C0_PROBE 0x8 /* probe for ITLB entry addressed by TLBHI */ +#define C0_RFE 0x10 /* restore for exception */ + +/* + * 'cache' instruction definitions + */ + +/* Target cache */ +#define CACH_PI 0x0 /* specifies primary inst. cache */ +#define CACH_PD 0x1 /* primary data cache */ +#define CACH_SI 0x2 /* secondary instruction cache */ +#define CACH_SD 0x3 /* secondary data cache */ + +/* Cache operations */ +#define C_IINV 0x0 /* index invalidate (inst, 2nd inst) */ +#define C_IWBINV 0x0 /* index writeback inval (d, sd) */ +#define C_ILT 0x4 /* index load tag (all) */ +#define C_IST 0x8 /* index store tag (all) */ +#define C_CDX 0xc /* create dirty exclusive (d, sd) */ +#define C_HINV 0x10 /* hit invalidate (all) */ +#define C_HWBINV 0x14 /* hit writeback inv. (d, sd) */ +#define C_FILL 0x14 /* fill (i) */ +#define C_HWB 0x18 /* hit writeback (i, d, sd) */ +#define C_HSV 0x1c /* hit set virt. (si, sd) */ + +/* + * Cache size definitions + */ +#define ICACHE_SIZE 0x4000 /* 16K */ +#define ICACHE_LINESIZE 32 /* 8 words */ +#define ICACHE_LINEMASK (ICACHE_LINESIZE-1) + +#define DCACHE_SIZE 0x2000 /* 8K */ +#define DCACHE_LINESIZE 16 /* 4 words */ +#define DCACHE_LINEMASK (DCACHE_LINESIZE-1) + +/* + * C0_CONFIG register definitions + */ +#define CONFIG_CM 0x80000000 /* 1 == Master-Checker enabled */ +#define CONFIG_EC 0x70000000 /* System Clock ratio */ +#define CONFIG_EC_1_1 0x6 /* System Clock ratio 1 :1 */ +#define CONFIG_EC_3_2 0x7 /* System Clock ratio 1.5 :1 */ +#define CONFIG_EC_2_1 0x0 /* System Clock ratio 2 :1 */ +#define CONFIG_EC_3_1 0x1 /* System Clock ratio 3 :1 */ +#define CONFIG_EP 0x0f000000 /* Transmit Data Pattern */ +#define CONFIG_SB 0x00c00000 /* Secondary cache block size */ + +#define CONFIG_SS 0x00200000 /* Split scache: 0 == I&D combined */ +#define CONFIG_SW 0x00100000 /* scache port: 0==128, 1==64 */ +#define CONFIG_EW 0x000c0000 /* System Port width: 0==64, 1==32 */ +#define CONFIG_SC 0x00020000 /* 0 -> 2nd cache present */ +#define CONFIG_SM 0x00010000 /* 0 -> Dirty Shared Coherency enabled*/ +#define CONFIG_BE 0x00008000 /* Endian-ness: 1 --> BE */ +#define CONFIG_EM 0x00004000 /* 1 -> ECC mode, 0 -> parity */ +#define CONFIG_EB 0x00002000 /* Block order:1->sequent,0->subblock */ + +#define CONFIG_IC 0x00000e00 /* Primary Icache size */ +#define CONFIG_DC 0x000001c0 /* Primary Dcache size */ +#define CONFIG_IB 0x00000020 /* Icache block size */ +#define CONFIG_DB 0x00000010 /* Dcache block size */ +#define CONFIG_CU 0x00000008 /* Update on Store-conditional */ +#define CONFIG_K0 0x00000007 /* K0SEG Coherency algorithm */ + +#define CONFIG_UNCACHED 0x00000002 /* K0 is uncached */ +#define CONFIG_NONCOHRNT 0x00000003 +#define CONFIG_COHRNT_EXLWR 0x00000005 +#define CONFIG_SB_SHFT 22 /* shift SB to bit position 0 */ +#define CONFIG_IC_SHFT 9 /* shift IC to bit position 0 */ +#define CONFIG_DC_SHFT 6 /* shift DC to bit position 0 */ +#define CONFIG_BE_SHFT 15 /* shift BE to bit position 0 */ + +/* + * C0_TAGLO definitions for setting/getting cache states and physaddr bits + */ +#define SADDRMASK 0xFFFFE000 /* 31..13 -> scache paddr bits 35..17 */ +#define SVINDEXMASK 0x00000380 /* 9..7: prim virt index bits 14..12 */ +#define SSTATEMASK 0x00001c00 /* bits 12..10 hold scache line state */ +#define SINVALID 0x00000000 /* invalid --> 000 == state 0 */ +#define SCLEANEXCL 0x00001000 /* clean exclusive --> 100 == state 4 */ +#define SDIRTYEXCL 0x00001400 /* dirty exclusive --> 101 == state 5 */ +#define SECC_MASK 0x0000007f /* low 7 bits are ecc for the tag */ +#define SADDR_SHIFT 4 /* shift STagLo (31..13) to 35..17 */ + +#define PADDRMASK 0xFFFFFF00 /* PTagLo31..8->prim paddr bits35..12 */ +#define PADDR_SHIFT 4 /* roll bits 35..12 down to 31..8 */ +#define PSTATEMASK 0x00C0 /* bits 7..6 hold primary line state */ +#define PINVALID 0x0000 /* invalid --> 000 == state 0 */ +#define PCLEANEXCL 0x0080 /* clean exclusive --> 10 == state 2 */ +#define PDIRTYEXCL 0x00C0 /* dirty exclusive --> 11 == state 3 */ +#define PPARITY_MASK 0x0001 /* low bit is parity bit (even). */ + +/* + * C0_CACHE_ERR definitions. + */ +#define CACHERR_ER 0x80000000 /* 0: inst ref, 1: data ref */ +#define CACHERR_EC 0x40000000 /* 0: primary, 1: secondary */ +#define CACHERR_ED 0x20000000 /* 1: data error */ +#define CACHERR_ET 0x10000000 /* 1: tag error */ +#define CACHERR_ES 0x08000000 /* 1: external ref, e.g. snoop*/ +#define CACHERR_EE 0x04000000 /* error on SysAD bus */ +#define CACHERR_EB 0x02000000 /* complicated, see spec. */ +#define CACHERR_EI 0x01000000 /* complicated, see spec. */ +#define CACHERR_SIDX_MASK 0x003ffff8 /* secondary cache index */ +#define CACHERR_PIDX_MASK 0x00000007 /* primary cache index */ +#define CACHERR_PIDX_SHIFT 12 /* bits 2..0 are paddr14..12 */ + +/* R4000 family supports hardware watchpoints: + * C0_WATCHLO: + * bits 31..3 are bits 31..3 of physaddr to watch + * bit 2: reserved; must be written as 0. + * bit 1: when set causes a watchpoint trap on load accesses to paddr. + * bit 0: when set traps on stores to paddr; + * C0_WATCHHI + * bits 31..4 are reserved and must be written as zeros. + * bits 3..0 are bits 35..32 of the physaddr to watch + */ +#define WATCHLO_WTRAP 0x00000001 +#define WATCHLO_RTRAP 0x00000002 +#define WATCHLO_ADDRMASK 0xfffffff8 +#define WATCHLO_VALIDMASK 0xfffffffb +#define WATCHHI_VALIDMASK 0x0000000f + +/* + * Coprocessor 0 registers + */ +#ifdef _LANGUAGE_ASSEMBLY +#define C0_INX $0 +#define C0_RAND $1 +#define C0_ENTRYLO0 $2 +#define C0_ENTRYLO1 $3 +#define C0_CONTEXT $4 +#define C0_PAGEMASK $5 /* page mask */ +#define C0_WIRED $6 /* # wired entries in tlb */ +#define C0_BADVADDR $8 +#define C0_COUNT $9 /* free-running counter */ +#define C0_ENTRYHI $10 +#define C0_SR $12 +#define C0_CAUSE $13 +#define C0_EPC $14 +#define C0_PRID $15 /* revision identifier */ +#define C0_COMPARE $11 /* counter comparison reg. */ +#define C0_CONFIG $16 /* hardware configuration */ +#define C0_LLADDR $17 /* load linked address */ +#define C0_WATCHLO $18 /* watchpoint */ +#define C0_WATCHHI $19 /* watchpoint */ +#define C0_ECC $26 /* S-cache ECC and primary parity */ +#define C0_CACHE_ERR $27 /* cache error status */ +#define C0_TAGLO $28 /* cache operations */ +#define C0_TAGHI $29 /* cache operations */ +#define C0_ERROR_EPC $30 /* ECC error prg. counter */ + +# else /* ! _LANGUAGE_ASSEMBLY */ + +#define C0_INX 0 +#define C0_RAND 1 +#define C0_ENTRYLO0 2 +#define C0_ENTRYLO1 3 +#define C0_CONTEXT 4 +#define C0_PAGEMASK 5 /* page mask */ +#define C0_WIRED 6 /* # wired entries in tlb */ +#define C0_BADVADDR 8 +#define C0_COUNT 9 /* free-running counter */ +#define C0_ENTRYHI 10 +#define C0_SR 12 +#define C0_CAUSE 13 +#define C0_EPC 14 +#define C0_PRID 15 /* revision identifier */ +#define C0_COMPARE 11 /* counter comparison reg. */ +#define C0_CONFIG 16 /* hardware configuration */ +#define C0_LLADDR 17 /* load linked address */ +#define C0_WATCHLO 18 /* watchpoint */ +#define C0_WATCHHI 19 /* watchpoint */ +#define C0_ECC 26 /* S-cache ECC and primary parity */ +#define C0_CACHE_ERR 27 /* cache error status */ +#define C0_TAGLO 28 /* cache operations */ +#define C0_TAGHI 29 /* cache operations */ +#define C0_ERROR_EPC 30 /* ECC error prg. counter */ + +#endif /* _LANGUAGE_ASSEMBLY */ + +/* + * floating-point status register + */ +#define FPCSR_FS 0x01000000 /* flush denorm to zero */ +#define FPCSR_C 0x00800000 /* condition bit */ +#define FPCSR_CE 0x00020000 /* cause: unimplemented operation */ +#define FPCSR_CV 0x00010000 /* cause: invalid operation */ +#define FPCSR_CZ 0x00008000 /* cause: division by zero */ +#define FPCSR_CO 0x00004000 /* cause: overflow */ +#define FPCSR_CU 0x00002000 /* cause: underflow */ +#define FPCSR_CI 0x00001000 /* cause: inexact operation */ +#define FPCSR_EV 0x00000800 /* enable: invalid operation */ +#define FPCSR_EZ 0x00000400 /* enable: division by zero */ +#define FPCSR_EO 0x00000200 /* enable: overflow */ +#define FPCSR_EU 0x00000100 /* enable: underflow */ +#define FPCSR_EI 0x00000080 /* enable: inexact operation */ +#define FPCSR_FV 0x00000040 /* flag: invalid operation */ +#define FPCSR_FZ 0x00000020 /* flag: division by zero */ +#define FPCSR_FO 0x00000010 /* flag: overflow */ +#define FPCSR_FU 0x00000008 /* flag: underflow */ +#define FPCSR_FI 0x00000004 /* flag: inexact operation */ +#define FPCSR_RM_MASK 0x00000003 /* rounding mode mask */ +#define FPCSR_RM_RN 0x00000000 /* round to nearest */ +#define FPCSR_RM_RZ 0x00000001 /* round to zero */ +#define FPCSR_RM_RP 0x00000002 /* round to positive infinity */ +#define FPCSR_RM_RM 0x00000003 /* round to negative infinity */ + +#endif /* __R4300_H */ diff --git a/include/PR/abi.h b/include/ique/PR/abi.h similarity index 100% rename from include/PR/abi.h rename to include/ique/PR/abi.h diff --git a/include/ique/PR/audiotools.h b/include/ique/PR/audiotools.h new file mode 100755 index 00000000..7cf62236 --- /dev/null +++ b/include/ique/PR/audiotools.h @@ -0,0 +1,69 @@ +/*==================================================================== + * audiotools.h + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/audiotools.h,v $ + * + **************************************************************************/ + +/*------------------------------------------------------------------- + * + * This file contains defines used by the audiotools programs. + * + *-------------------------------------------------------------------*/ + +#ifndef __AUDIOTOOLS__ +#define __AUDIOTOOLS__ + +#define AL_SYM_FILE_VERSION 'SF01' + +typedef struct { + s32 objectId; + s32 objectClass; + s32 bankFileOffset; + s32 stringOffset; + s32 refCount; +} ALSymFileObj; + +typedef struct { + s32 revision; + s32 fileSize; + s32 objectCount; +} ALSymFile; + + +#define AL_NO_CLASS 0 +#define AL_BANK_CLASS 1 +#define AL_INST_CLASS 2 +#define AL_SOUND_CLASS 3 +#define AL_KEYMAP_CLASS 4 +#define AL_WAVETBL_CLASS 5 +#define AL_LOOP_CLASS 6 +#define AL_BNKFILE_CLASS 7 +#define AL_ENVLP_CLASS 8 +#define AL_BOOK_CLASS 9 +#define AL_SNDFILE_CLASS 10 + +#define AL_NUM_CLASSES 11 + +#endif /* !__AUDIOTOOLS__ */ diff --git a/include/ique/PR/bbfs.h b/include/ique/PR/bbfs.h new file mode 100644 index 00000000..379ea261 --- /dev/null +++ b/include/ique/PR/bbfs.h @@ -0,0 +1,86 @@ +#ifndef __bb_fs_h__ +#define __bb_fs_h__ + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * BBplayer file system data structures + */ + +#define BB_FL_PAGE_SIZE 512 +#define BB_FL_SPARE_SIZE 16 +#define BB_FL_BLOCK_SIZE 16384 +#define BB_FL_BYTE_TO_BLOCK(x) ((u32)(x)>>14) +#define BB_FL_BLOCK_TO_BYTE(x) ((u32)(x)<<14) +#define BB_FL_KB_TO_BLOCK(x) ((u32)(x)>>4) +#define BB_FL_BLOCK_TO_KB(x) ((u32)(x)<<4) +#define BB_FL_BYTE_TO_PAGE(x) ((u32)(x)>>9) +#define BB_FL_PAGE_TO_BYTE(x) ((u32)(x)<<9) +#define BB_FL_BLOCK_PAGES (BB_FL_BLOCK_SIZE/BB_FL_PAGE_SIZE) +#define BB_FL_ECC0_OFF (525-512) +#define BB_FL_ECC1_OFF (520-512) +#define BB_FL_BLOCK_STATUS_OFF (517-512) +#define BB_FL_BLOCK_LINK_OFF (512-512) +#define BB_FL_BLOCK_LINK_SIZE 2 +#define BB_FL_SEQ_OFF (514-512) + +/* + * FAT entries are 16-bit block numbers, each pointing to the + * next block in a file or a system-specific code + * Block numbers are relative to the start of the device. + */ +typedef u16 BbFatEntry; + +#define BB_FAT_AVAIL 0x0000 /* available block */ +#define BB_FAT_LAST 0xFFFF /* last block of a file */ +#define BB_FAT_BAD 0xFFFE /* unreadable/writable block */ +#define BB_FAT_RESERVED 0xFFFD /* reserved block */ + +#define BB_FAT16_ENTRIES 4096 /* enough to span 64MB */ +#define BB_FAT16_ENTRIES_SHIFT 12 /* enough to span 64MB */ + +#define BB_INODE16_ENTRIES 409 /* remainder of space in FAT block */ +#define BB_INODE16_NAMELEN 11 /* maximum name length */ + +#define BB_FAT16_MAGIC "BBFS" +#define BB_FAT16_LINK_MAGIC "BBFL" + +#define BB_FAT16_CKSUM 0xcad7 + +#define BB_FAT16_BLOCKS 16 /* number of copies of the fat */ +#define BB_SYSTEM_AREA_SIZE 0x100000 /* 384KB reserved for system area */ +#define BB_BIG_FILE_THRESHOLD 0x100000 /* allocation hint */ + +/* + * Inode entries contain the file name, type, first block address + * and file size. There are a fixed number of inodes immediately + * following the FAT entries. + */ + +/* + * All fields are big-endian + */ + +typedef struct { + u8 name[BB_INODE16_NAMELEN]; /* 8.3 name */ + u8 type; /* unused type field */ + u16 block; /* address of first block in file */ + u16 pad; /* to align on 4-byte boundary */ + u32 size; /* size of file in bytes */ +} BbInode; + +typedef struct { /* FAT for a 16K block size */ + BbFatEntry entry[BB_FAT16_ENTRIES]; + BbInode inode[BB_INODE16_ENTRIES]; + u8 magic[4]; /* 'BBFS' */ + u32 seq; /* highest number is current */ + u16 link; /* link to another FAT */ + u16 cksum; /* mod 2^16 checksum */ +} BbFat16; + +#define BB_FAT16_NEXT(fat,n) (fat)[(n)>>BB_FAT16_ENTRIES_SHIFT].entry[(n)&(BB_FAT16_ENTRIES-1)] + +#endif +#endif diff --git a/include/ique/PR/bbfs_export.h b/include/ique/PR/bbfs_export.h new file mode 100755 index 00000000..ec95b784 --- /dev/null +++ b/include/ique/PR/bbfs_export.h @@ -0,0 +1,14 @@ +/*---------------------------------------------------------------------* + Copyright (C) 2002 - 2004 BroadOn Communications. + *---------------------------------------------------------------------*/ + +#ifndef __bb_fs_h__ +#define __bb_fs_h__ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +#define BB_FL_BLOCK_SIZE 16384 +#define BB_INODE16_NAMELEN 11 /* maximum name length */ + +#endif +#endif diff --git a/include/ique/PR/bbskapi.h b/include/ique/PR/bbskapi.h new file mode 100644 index 00000000..07809fd4 --- /dev/null +++ b/include/ique/PR/bbskapi.h @@ -0,0 +1,179 @@ +#ifndef __BB_SK_API_HDR__ +#define __BB_SK_API_HDR__ + + +/* + * To add an sk api function: + * 1) add SK_API_CALL_ define + * 2) add function prototype in this header + * 3) implement function in lib/SK/skapi.c + * 4) add the function to the array skapi_call_table (lib/SK/skapi.c) + * 5) add entry stub to libultra/bb/sk/skapi.s. + */ + +/* + * Function call mapping numbers, must be in order 0..end + */ + +#define SK_API_CALL_GET_ID 0 +#define SK_API_CALL_LAUNCH_SETUP 1 +#define SK_API_CALL_LAUNCH 2 +#define SK_API_CALL_LIST_VALID 3 +#define SK_API_CALL_RECRYPT_BEGIN 4 +#define SK_API_CALL_RECRYPT_DATA 5 +#define SK_API_CALL_RECRYPT_STATE 6 +#define SK_API_CALL_RECRYPT_END 7 +#define SK_API_CALL_SIGN_HASH 8 +#define SK_API_CALL_VERIFY_HASH 9 +#define SK_API_CALL_GET_CONSUMPTION 10 +#define SK_API_CALL_ADVANCE_TICKET_WINDOW 11 +#define SK_API_CALL_SET_LIMIT 12 +#define SK_API_CALL_EXIT 13 +#define SK_API_CALL_KEEP_ALIVE 14 + +/* + * the calls below are for test purpose, not for default or + * production build + */ + +#define SK_API_CALL_GET_RAND 15 +#define SK_API_CALL_DUMP_VIRAGE 16 +#define SK_API_CALL_TEST2 17 +#define SK_API_CALL_TEST3 18 +#define SK_API_CALL_RESET_WINDOW 19 +#define SK_API_CALL_VALIDATE_RLS 20 + + + +/* sk api error and return codes. Negative implies failure. */ +#define SK_API_SUCCESS 0 +#define SK_API_RECRYPT_NOT_REQUIRED 1 +#define SK_API_RECRYPT_COMPLETE 2 +#define SK_API_RECRYPT_INCOMPLETE 3 +#define SK_API_RECRYPT_NEW 4 + +#define SK_API_FAIL -1 +#define SK_API_INVALID_TSRL -2 +#define SK_API_INVALID_CARL -3 +#define SK_API_INVALID_CPRL -4 +#define SK_API_INVALID_CRL -5 +#define SK_API_INVALID_CERT -6 +#define SK_API_INVALID_CONT_HASH -7 +#define SK_API_SIGNER_MISMATCH -8 +#define SK_API_REVOKED_SERVER -9 +#define SK_API_REVOKED_CONTENT -10 +#define SK_API_NO_ENTRY_FOUND -11 + +#define SK_IDENTITY (0x06091968) +#define API_IDENTITY (0x00000001) + +#define SK_RECRYPT_KEYLIST_SIZE (16*1024) + +/* + * Function call declarations. + * NOTE: max number of args is 4, and they must fit into a0-a3. + */ + +#if defined(_LANGUAGE_C) + +#include +#include +#include +#include + +typedef struct { + BbCrlHead *head; + BbServerSuffix *list; /* the actual names of revoked SNs */ + + /* each pointer points to a cert object */ + BbCertBase *certChain[BB_CERT_CHAIN_MAXLEN]; +} BbCrlBundle; + +typedef struct { + BbTicket *ticket; + BbCertBase *ticketChain[BB_CERT_CHAIN_MAXLEN]; + BbCertBase *cmdChain[BB_CERT_CHAIN_MAXLEN]; +} BbTicketBundle; + +typedef struct { + BbCrlBundle tsrl; /* ticket server revocation list */ + BbCrlBundle carl; /* certificate authority revocation list */ + BbCrlBundle cprl; /* content publishing server revocation list */ +} BbAppLaunchCrls; + + +/* + * The actual sk api function declarations. All functions + * return SK_API_ return codes defined above. Any return + * value < 0 is failure. + */ + + +/* get the bbid */ +int skGetId(BbId *id); + +/* setup app launch. does not transfer data. + */ +int skLaunchSetup(BbTicketBundle *ticket, + BbAppLaunchCrls *crls, + void *pKeyList); + +/* setyp app rights and xfer control to app at addr. */ +int skLaunch(u32 addr); + +/* primes sk for ensuing skRecrypt*() calls. + * ticket and crls are as in skLaunchSetup(). + * pKeyList will obtain list to be stored. + * Maximum key list length is 16KB. + */ +int skRecryptListValid(void *pKeyList); + +int skRecryptBegin(BbTicketBundle *ticket, + BbAppLaunchCrls *crls, + void *pKeyList); + +int skRecryptData(u8 *data, u32 size); + +/* when recovering from aborted recryption attempt, this call must + * be used to feed the already recrypted data before calling + * skRecryptData to finish. + */ +int skRecryptComputeState(u8 *data, u32 size); + +/* end recyrption and determine success. + * pKeyList will obtain list to be stored. + * Maximum key list length is 16KB. + */ +int skRecryptEnd(void *pKeyList); + +/*sign hash: operates on SHA-1 hash only, add on an optional identity */ +int skSignHash(BbShaHash hash, BbEccSig sign); + +/*verify hash: operates on SHA-1 hash only, use an optional identity */ +int skVerifyHash(BbShaHash hash, BbGenericSig *sign, BbCertBase *certChain[], + BbAppLaunchCrls *crls); + + +extern int skGetConsumption(u16* tidWindow, u16 cc[BB_MAX_CC]); +extern int skAdvanceTicketWindow(void); +extern int skSetLimit(u16 limit, u16 code); +extern int skExit(void); +extern int skKeepAlive(void); + +#ifdef SK_DEVELOP +/* test calls for developement, not for production */ +int skGetRandomKeyData(u8 *data, int size); /* max size = 16 bytes */ +int skDumpVirage(u8 *virage2data); +int skTest2(int a,int b); +int skTest3(int a,int b); +int skResetWindow(void); +int skValidateRls(BbCrlBundle *carl, BbCrlBundle *cprl, + BbCrlBundle *tsrl, u32 *versions); + +#endif + +#endif /* _LANGUAGE_C */ + +#endif + + diff --git a/include/ique/PR/bbskapi_export.h b/include/ique/PR/bbskapi_export.h new file mode 100755 index 00000000..5afb622f --- /dev/null +++ b/include/ique/PR/bbskapi_export.h @@ -0,0 +1,19 @@ +/*---------------------------------------------------------------------* + Copyright (C) 2002 - 2004 BroadOn Communications. + *---------------------------------------------------------------------*/ + +#ifndef __BB_SK_API_HDR__ +#define __BB_SK_API_HDR__ + +#if defined(_LANGUAGE_C) + +typedef u32 BbId; /* 32-bit Player identity */ +typedef u32 BbContentId; /* 32-bit content identity */ + +/* get the bbid */ +int skGetId(BbId *id); +extern int skExit(void); + +#endif /* _LANGUAGE_C */ + +#endif diff --git a/include/ique/PR/dbgdefs.h b/include/ique/PR/dbgdefs.h new file mode 100755 index 00000000..fa68983b --- /dev/null +++ b/include/ique/PR/dbgdefs.h @@ -0,0 +1,38 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/dbgdefs.h,v $ + * + **************************************************************************/ + +#ifndef _DBGDEFS_H_ +#define _DBGDEFS_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + + +typedef int TVid; +typedef unsigned short TVushort; +typedef unsigned char TVuchar; + + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif diff --git a/include/ique/PR/dbgproto.h b/include/ique/PR/dbgproto.h new file mode 100755 index 00000000..4bc7f6be --- /dev/null +++ b/include/ique/PR/dbgproto.h @@ -0,0 +1,609 @@ +/* + * ========================================================================== + * Copyright (c) 1993, Silicon Graphics, Inc. All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; + * the contents of this file may not be disclosed to third parties, copied + * or duplicated in any form, in whole or in part, without the prior written + * permission of Silicon Graphics, Inc. handleSelectExceptions + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data + * and Computer Software clause at DFARS 252.227-7013, and/or in similar or + * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished + * rights reserved under the Copyright Laws of the United States. + * ========================================================================== + */ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/dbgproto.h,v $ + * + **************************************************************************/ + +#ifndef dbgproto_h +#define dbgproto_h + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#ident "$Revision: 1.1.1.2 $" + +/* + * NOTE: If you change this file, remember increment the revision below. + */ +#define TV_DBGPROTO_REV 2 + + +#define TV_DBG_MAXREQ_SIZE 1024 + +/* + * Higher resolution time information + */ +typedef struct __KKTimeStruct { + long seconds; + long nanoseconds; +} KKTimeStruct; + +#define MAGIC_PORT 2727 /* clients connect here */ + +typedef struct __KKObjsStruct { + TVushort number; /* number of objects */ + TVid objects[1]; /* variabel length array of object ids */ +} KKObjs; + +typedef struct __KKFaultInfoStruct { + unsigned int addr; /* Faulting address on a watchpoint */ + short major; /* major classification of fault */ + short minor; /* minor classification of fault */ +} KKFaultInfo; + +typedef struct __KKThreadStatusStruct { + int flags; /* flags */ + short why; /* reason for stop */ + short what; /* system call number when why == KK_SYSENTRY */ + /* or why == KK_SYSEXIT */ + TVid tid; /* thread id */ + TVid pid; /* process id */ + unsigned int instr; /* current instruction */ + KKFaultInfo info; /* info associated with fault */ + int priority; /* scheduling priority */ + int start; /* used to name the thread */ + int rv; /* return value from last system call */ + unsigned args[6]; /* args to system call */ +} KKThreadStatus; + +/* values for flags - Thread States */ +#define KK_STOPPED 0x1 /* thread is stopped */ +#define KK_RUNNABLE 0x2 /* thread is waiting for the cpu */ +#define KK_RUNNING 0x4 /* thread is executing in the cpu */ +#define KK_WAITING 0x8 /* thread is waiting for non-cpu resource */ + +/* values for why - reason for being stopped, mutually exclusive */ +#define KK_REQUESTED 0x1 /* stopped as a result of stop directive */ +#define KK_FAULTED 0x2 /* stopped on incurring a hardware fault */ +#define KK_SYSENTRY 0x3 /* stopped on entry to a system call */ +#define KK_SYSEXIT 0x4 /* stopped on exit from a system call */ +#define KK_NWHY 0x4 /* number of values for why */ + +typedef struct __KKRunStruct { + int flags; /* flags */ + unsigned int vaddr; /* Virtual address at which to resume */ +} KKRun; + +/* values for flags */ +#define KK_STEP 0x1 /* single step thread */ +#define KK_VADDR 0x2 /* set PC on resumption from vaddr */ +#define KK_ABORT 0x4 /* thread should kill itself when resumed */ + +typedef struct __KKFaultStruct { + short majorMask; /* bit mask giving major fault */ + short minorMask; /* bit mask giving minor fault */ +} KKFault; + +/* values for major_ mask */ +#define KK_FLTMEM 0x1 /* Memory fault */ +#define KK_FLTINSTR 0x2 /* Instruction fault */ +#define KK_FLTINTX 0x4 /* Integer exception fault */ +#define KK_FLTFPE 0x8 /* Floating point exception fault */ + +/* types of memory faults */ +#define KK_FLTALIGN 0x1 /* Alignment error */ +#define KK_FLTACCESS 0x2 /* Memory access violation */ +#define KK_FLTBOUNDS 0x4 /* Memory bounds violation */ +#define KK_FLTWATCH 0x8 /* User watchpoint */ + +/* types of instruction faults */ +#define KK_FLTILL 0x1 /* Illegal instruction */ +#define KK_FLTPRIV 0x2 /* Privileged instruction */ +#define KK_FLTTRACE 0x4 /* Trace or breakpoint instruction */ + +/* types of exception faults - integer and floating point */ +#define KK_FLTOVF 0x1 /* overflow */ +#define KK_FLTZDIV 0x2 /* zero-divide */ + +/* types of exceptions - only floating point */ +#define KK_FLTUDF 0x4 /* underflow */ +#define KK_FLTINXCT 0x8 /* inexact result */ +#define KK_FLTINVAL 0xf /* invalid operand */ + +typedef struct __KKRegionStruct { + unsigned int vaddr; /* Starting virtual address of region */ + unsigned int size; /* size of region */ + short flags; /* access flags */ + unsigned int paddr; /* physical address of first page in region */ +} KKRegion; + +/* values for flags - access permissions */ +#define KK_READ 0x1 /* read permission */ +#define KK_WRITE 0x2 /* write permission */ +#define KK_EXEC 0x4 /* execute permission */ + +#define KK_NGREGS 37 +#define KK_NSREGS 40 + +typedef struct __KKGregSetStruct { + unsigned int gregs[KK_NGREGS]; +} KKGregSet; + +typedef struct __KKFPregSetStruct { + union { + double dregs[16]; /* 16 64-bit registers */ + float fregs[32]; /* 32 32-bit registers */ + unsigned int regs[32]; /* 32 64-bit registers */ + } fpregs; + unsigned int fpcsr; + unsigned int fppad; +} KKFPregSet; + +typedef struct __KKRegisterContextStruct { + KKGregSet gregs; /* general register set */ + KKFPregSet fpregs; /* floating point register set */ +} KKRegisterContext; + +#define KK_VREGS 32 +#define KK_SREGS 40 /* 32 + 8 special registers */ + +/* + sregs[0..31] = scalar registers + + Special Registers (all 32 bits in size): + + sregs[32] = dramDMA + sregs[33] = memDMA + sregs[34] = readDMA + sregs[35] = pc + sregs[36] = writeDMA + sregs[37] = status + sregs[38] = DMAfull + sregs[39] = DMAbusy +*/ + + + +typedef struct __KKCpScalarSetStruct { + unsigned int sregs[KK_SREGS]; +} KKCpScalarRegSet; + +typedef struct __KKCpVectorSetStruct { + unsigned int vregs[4 * KK_VREGS]; +} KKCpVectorRegSet; + +typedef struct __KKCpRegisterContextStruct { + KKCpScalarRegSet sregs; + KKCpVectorRegSet vregs; +} KKCpRegisterContext; + +typedef struct __KKUsageStruct { + KKTimeStruct tstamp; /* Wall clock time */ + KKTimeStruct created; /* Create time */ + KKTimeStruct states[10]; +} KKUsage; + +/* values for how in __KKSetCommRequestStruct */ +#define KK_TTY 0 +#define KK_TCP 1 +#define KK_NOP 2 + +/* specify a range of log events to enable or disable */ +typedef struct __KKLogEventSetStruct { + int from; + int to; +} KKLogEventSet; + +/* define where log data is flushed */ +#define KK_LOG_FLUSH_TO_FILE 0 +#define KK_LOG_FLUSH_TO_FIFO 1 + +/* logger status */ +typedef struct __KKLogStatusStruct { + int bufferType; + int bufferSize; + int dataSize; + int logState; + int flushLimit; +} KKLogStatus; + +/* process usage data */ +typedef struct __KKProcUsageStruct { + TVid pid; + KKTimeStruct states[10]; +} KKProcUsage; + +/* + * Request codes + */ + +#define _KK_REQ_LDXEQ 0 +#define _KK_REQ_LISTPROCS 1 +#define _KK_REQ_GETXEQNAME 2 +#define _KK_REQ_LSTTHREADS 3 +#define _KK_REQ_STATUS 4 +#define _KK_REQ_STOPPROC 5 +#define _KK_REQ_STOPTHREAD 6 +#define _KK_REQ_RUNTHREAD 7 +#define _KK_REQ_RUNPROC 8 +#define _KK_REQ_KILLPROC 9 +#define _KK_REQ_SETFAULT 10 +#define _KK_REQ_GETFAULT 11 +#define _KK_REQ_NUMREGIONS 12 +#define _KK_REQ_GETREGIONS 13 +#define _KK_REQ_GETGREGSET 14 +#define _KK_REQ_SETGREGSET 15 +#define _KK_REQ_GETFPREGSET 16 +#define _KK_REQ_SETFPREGSET 17 +#define _KK_REQ_READMEM 18 +#define _KK_REQ_WRITEMEM 19 +#define _KK_REQ_SETBKPT 20 +#define _KK_REQ_CLRBKPT 21 +#define _KK_REQ_LISTBKPTS 22 +#define _KK_REQ_NUMWATCH 23 +#define _KK_REQ_SETWATCH 24 +#define _KK_REQ_GETWATCH 25 +#define _KK_REQ_USAGE 26 +#define _KK_REQ_GETPATHLIST 27 +#define _KK_REQ_GETFRAME 28 +#define _KK_REQ_REBOOT 29 +#define _KK_REQ_SETCOMM 30 +#define _KK_REQ_SETSYSENTRY 31 +#define _KK_REQ_GETSYSENTRY 32 +#define _KK_REQ_SETSYSEXIT 33 +#define _KK_REQ_GETSYSEXIT 34 +#define _KK_REQ_ENABLELOG 35 +#define _KK_REQ_DISABLELOG 36 +#define _KK_REQ_FLUSHLOG 37 +#define _KK_REQ_NEWLOG 38 +#define _KK_REQ_GETMASK 39 +#define _KK_REQ_AMCMD 40 +#define _KK_REQ_REMOTE 41 +#define _KK_REQ_LOGCONTROL 42 +#define _KK_REQ_LOGSTATUS 43 +#define _KK_REQ_GETLOGFILE 44 +#define _KK_REQ_GETSYSUSAGE 45 +#define _KK_REQ_SETTRPT 46 +#define _KK_REQ_CLRTRPT 47 +#define _KK_REQ_LISTTRPTS 48 +#define _KK_REQ_GETSREGSET 49 +#define _KK_REQ_SETSREGSET 50 +#define _KK_REQ_GETVREGSET 51 +#define _KK_REQ_SETVREGSET 52 +#define _KK_REQ_COUNT 53 /* must be last */ + +/* for the type field in KKHeader */ +#define _KK_REQUEST 0 +#define _KK_REPLY 1 +#define _KK_EXCEPTION 2 +#define _KK_THREAD_EXIT 3 +#define _KK_PROCESS_EXIT 4 +#define _KK_CONSOLE 5 + +typedef struct __KKHeaderStruct { + int length; + char code; + char type; + short error; + char rev; + char method; /* 0 - cpu, 1 - RCP */ + short notused2; +} KKHeader; + +/* + * Request Structures + */ +typedef struct __KKGetFrameRequestStruct { + KKHeader header; + int height, width; + int which; +} KKGetFrameRequest; + +typedef struct __KKLoadExecutableRequestStruct { + KKHeader header; + char str[1]; +} KKLoadExecutableRequest; + +typedef struct __KKObjectRequestStruct { + KKHeader header; + TVid object; +} KKObjectRequest; + +typedef struct __KKRunThreadRequestStruct { + KKHeader header; + TVid tid; + KKRun actions; +} KKRunThreadRequest; + +typedef struct __KKFaultRequestStruct { + KKHeader header; + TVid tid; + KKFault fault; + TVuchar stopAllThreads; +} KKFaultRequest; + +typedef struct __KKGRegsetRequestStruct { + KKHeader header; + TVid tid; + KKGregSet registers; +} KKGRegsetRequest; + +typedef struct __KKFPRegsetRequestStruct { + KKHeader header; + TVid tid; + KKFPregSet registers; +} KKFPRegsetRequest; + +typedef struct __KKCpScalarRegsetRequestStruct { + KKHeader header; + TVid tid; + KKCpScalarRegSet registers; +} KKCpScalarRegsetRequest; + +typedef struct __KKCpVectorRegsetRequestStruct { + KKHeader header; + TVid tid; + KKCpVectorRegSet registers; +} KKCpVectorRegsetRequest; + +typedef struct __KKReadRequestStruct { + KKHeader header; + TVid object; + unsigned int addr; + unsigned int nbytes; +} KKReadRequest; + +typedef struct __KKWriteHeaderStruct { + KKHeader header; + TVid object; + unsigned int addr; + unsigned int nbytes; +} KKWriteHeader; + +typedef struct __KKWriteRequestStruct { + KKWriteHeader writeHeader; + char buffer[1]; +} KKWriteRequest; + +typedef struct __KKSetBkptRequestStruct { + KKHeader header; + TVid object; + unsigned int addr; +} KKSetBkptRequest; + +typedef struct __KKClrBkptRequestStruct { + KKHeader header; + TVid object; + TVid bp; +} KKClrBkptRequest; + +typedef struct __KKWatchRequestStruct { + KKHeader header; + TVid object; + unsigned int number; + KKRegion wp[1]; +} KKWatchRequest; + +typedef struct __KKSetCommRequestStruct { + KKHeader header; + unsigned int how; + unsigned int addr; +} KKSetCommRequest; + +typedef struct __KKSysCallSetStruct { + unsigned int word[8]; +} KKSysCallSet; + +typedef struct __KKSysCallRequestStruct { + KKHeader header; + TVid pid; + KKSysCallSet syscallset; +} KKSysCallRequest; + +typedef struct __KKLogEventRequestStruct { + KKHeader header; + unsigned int numSet; + KKLogEventSet set[1]; +} KKLogEventRequest; + +typedef struct __KKNewLogRequestStruct { + KKHeader header; + char str[1]; +} KKNewLogRequest; + +typedef struct __KKRemoteRequestStruct { + KKHeader header; + int len; + char buf[16]; +} KKRemoteRequest; + +typedef struct __KKFlushLogRequestStruct { + KKHeader header; + int no_block; +} KKFlushLogRequest; + +typedef struct __KKLogControlRequestStruct { + KKHeader header; + int command; + int arg; +} KKLogControlRequest; + +typedef struct __KKSetTrptRequestStruct { + KKSetBkptRequest bpRequest; + unsigned short code; +} KKSetTrptRequest; + +typedef KKClrBkptRequest KKClrTrptRequest; + +/* + * Macros for manipulating sets of flags. + * sp must be a pointer to KKSysCallSet. + * flag must be a member of the enumeration corresponding to *sp. + */ + +/* turn on all flags in set */ +#define TVFILLSET(sp) \ + { int _i_ = sizeof(*(sp))/sizeof(unsigned int); \ + while(_i_) ((unsigned int*)(sp))[--_i_] = 0xFFFFFFFF; } + +/* turn off all flags in set */ +#define TVEMPTYSET(sp) \ + { int _i_ = sizeof(*(sp))/sizeof(unsigned int); \ + while(_i_) ((unsigned int*)(sp))[--_i_] = 0; } + +/* is this set empty? */ +#define TVISEMPTYSET(set) \ + (setisempty(set, sizeof(*(set))/sizeof(unsigned int))) + +/* turn on specified flag in set */ +#define TVADDSET(sp, flag) \ + (((unsigned)((flag)) < 32*sizeof(*(sp))/sizeof(unsigned int)) \ + && (((unsigned int*)(sp))[((flag))/32] |= (1<<(((flag))%32)))) + +/* turn off specified flag in set */ +#define TVDELSET(sp, flag) \ + (((unsigned)((flag)) < 32*sizeof(*(sp))/sizeof(unsigned int)) \ + && (((unsigned int*)(sp))[((flag))/32] &= ~(1<<(((flag))%32)))) + +/* query: != 0 iff flag is turned on in set */ +#define TVISMEMBER(sp, flag) \ + (((unsigned)((flag)) < 32*sizeof(*(sp))/sizeof(unsigned int)) \ + && (((unsigned int*)(sp))[((flag))/32] & (1<<(((flag))%32)))) + + +/* + * Event Structures + */ + +typedef struct __KKObjectEventStruct { + KKHeader header; + TVid object; +} KKObjectEvent; + +typedef struct __KKObjsEventStruct { + KKHeader header; + TVid object; + KKObjs objs; +} KKObjsEvent; + +typedef struct __KKBufferEventStruct { + KKHeader header; + TVid object; + char buffer[1]; +} KKBufferEvent; + +typedef struct __KKStatusEventStruct { + KKHeader header; + KKThreadStatus status; +} KKStatusEvent; + +typedef struct __KKFaultEventStruct { + KKHeader header; + TVid tid; + KKFault fault; + TVuchar stopAllThreads; +} KKFaultEvent; + +typedef struct __KKNumberEventStruct { + KKHeader header; + TVid object; + unsigned int number; +} KKNumberEvent; + +typedef struct __KKRegionEventStruct { + KKHeader header; + TVid object; + unsigned int number; + KKRegion regions[1]; +} KKRegionEvent; + +typedef struct __KKGregEventStruct { + KKHeader header; + TVid tid; + KKGregSet registers; +} KKGregEvent; + +typedef struct __KKFPregEventStruct { + KKHeader header; + TVid tid; + KKFPregSet registers; +} KKFPregEvent; + +typedef struct __KKCpSregEventStruct { + KKHeader header; + TVid tid; + KKCpScalarRegSet registers; +} KKCpSregEvent; + +typedef struct __KKCpVregEventStruct { + KKHeader header; + TVid tid; + KKCpVectorRegSet registers; +} KKCpVregEvent; + +typedef struct __KKBkptEventStruct { + KKHeader header; + TVid object; + TVid bp; + unsigned int instruction; +} KKBkptEvent; + +typedef struct __KKUsageEventStruct { + KKHeader header; + TVid tid; + KKUsage usage; +} KKUsageEvent; + +typedef struct __KKFlushEventStruct { + KKHeader header; + int bufferType; + char buffer[1]; +} KKFlushEvent; + +typedef struct __KKLogStatusEventStruct { + KKHeader header; + KKLogStatus status; +} KKLogStatusEvent; + +typedef struct __KKSysUsageEventStruct { + KKHeader header; + KKTimeStruct tstamp; + int numProc; + KKProcUsage usage[1]; +} KKSysUsageEvent; + +typedef struct __KKStringEventStruct { + KKHeader header; + char str[1]; +} KKStringEvent; + +typedef KKSysCallRequest KKSysCallEvent; + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* dbgproto_h */ diff --git a/include/ique/PR/driverd.h b/include/ique/PR/driverd.h new file mode 100755 index 00000000..1de9adb7 --- /dev/null +++ b/include/ique/PR/driverd.h @@ -0,0 +1,134 @@ +/* + * driverd.h: driver daemon declarations & struct definitions. + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; + * the contents of this file may not be disclosed to third parties, copied or + * duplicated in any form, in whole or in part, without the prior written + * permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data + * and Computer Software clause at DFARS 252.227-7013, and/or in similar or + * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - + * rights reserved under the Copyright Laws of the United States. + * + */ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/driverd.h,v $ + * + **************************************************************************/ + + +#define MAXCLIENTS 5 + +/* + * Same numbers as videod, bumped up by one each. + */ +#define DRIVERD_TCP_PORT 8001 +#define DRIVERD_RPC_PORT 391012 + +/* + * Daemon must keep track of each client which has attached; it does so by + * maintaining an array of 'em. + */ + +typedef struct _Client *ClientPtr; + +typedef struct _Client { + + int fd; /* File descriptor of private socket between daemon/client */ + id_t id; /* Process ID of the client (so that we can signal them) */ + /* + * Event range (6 bit numbers) that this client is interested in; when + * the game sends the daemon an event via a socket (that the emulator + * opens with the daemon), the daemon checks to see which clients are + * interested in this event, then writes to their sockets to indicate + * that the event came in. The clients then wake up, realize an event + * has occurred, & query the daemon to find out what happened (just as + * they'll have to query the device driver via ioctl to find out what + * happened). + */ + int min_event; + int max_event; + int index; +} ClientRec; + +/* + * We need a special one byte header on all writes to the private socket + * between daemon & client to differentiate between the three actions we + * expect the daemon to perform: + * + * Session registration (new clients identify themselves & pass pid to daemon) + * + * Events from Game (emulator writes events on private socket) + * + * Commands to Game (daemon receives commands from host side clients, + * arbitrates for control of ramrom, writes the command into ramrom, + * sends a signal to the game to tell it to read the ramrom arena, then + * waits for an acknowledge to come back from the game indicating that the + * command has been accepted (so that the daemon could begin a new command + * arbitration if needed). + */ + +#define DRIVERD_REGISTER_SESSION 101 +#define DRIVERD_REGISTER_EMULATOR 102 +#define DRIVERD_EVENT_FROM_GAME 103 +#define DRIVERD_IOCTL_REQUEST 104 + +typedef struct _registerSession *registerSessionPtr; + +typedef struct _registerSession { + + unsigned int dd_header; /* One of the three possible actions for daemon*/ + + id_t id; /* Process ID of the client (so that we can signal them) */ + /* + * Event range (6 bit numbers) that this client is interested in; when + * the game sends the daemon an event via a socket (that the emulator + * opens with the daemon), the daemon checks to see which clients are + * interested in this event, then writes to their sockets to indicate + * that the event came in. The clients then wake up, realize an event + * has occurred, & query the daemon to find out what happened (just as + * they'll have to query the device driver via ioctl to find out what + * happened). + */ +} RegisterSession; + +typedef struct _registerEmulator { + + unsigned int dd_header; /* One of the possible actions for daemon*/ + + id_t id; /* Process ID of emulate (so that we can signal them) */ + int shmkey; /* Shared memory key */ +} RegisterEmulator; + +typedef struct _eventFromGame *eventFromGamePtr; + +typedef struct _eventFromGame { + unsigned int dd_header; /* One of the possible actions for daemon*/ + int event; /* Signed value */ +} EventFromGame; + +typedef struct _commandToGame *commandToGamePtr; + +typedef struct _commandToGame { + unsigned int dd_header; /* One of the possible actions for daemon*/ + /* + * XXX + */ +} CommandToGame; + +typedef struct _ioctlRequest { + unsigned int dd_header; /* One of the possible actions for daemon*/ + int request; +} IoctlRequest; + +extern int MakeDriverDConnection(char *phostname, int iserver, int retries, int *familyp); /* RETURN */ diff --git a/include/ique/PR/em.h b/include/ique/PR/em.h new file mode 100755 index 00000000..bf81f480 --- /dev/null +++ b/include/ique/PR/em.h @@ -0,0 +1,102 @@ +#ifndef _EM_H_ +#define _EM_H_ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/em.h,v $ + * + **************************************************************************/ + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +typedef struct { + int x; + int y; + unsigned int buttons; +} MouseState; + +#define BUTTON_LEFT 0x4 +#define BUTTON_MIDDLE 0x2 +#define BUTTON_RIGHT 0x1 + +typedef struct { + unsigned short button; /* all of the 14 buttons */ + unsigned char stick_x; + unsigned char stick_y; +} GamePad; + +/* Simulate interrupts with signals */ +#define SIGSW1 (SIGRTMIN + OS_EVENT_SW1) +#define SIGSW2 (SIGRTMIN + OS_EVENT_SW2) +#define SIGCART (SIGRTMIN + OS_EVENT_CART) +#define SIGCOUNTER (SIGRTMIN + OS_EVENT_COUNTER) +#define SIGSP (SIGRTMIN + OS_EVENT_SP) +#define SIGSI (SIGRTMIN + OS_EVENT_SI) +#define SIGAI (SIGRTMIN + OS_EVENT_AI) +#define SIGVI (SIGRTMIN + OS_EVENT_VI) +#define SIGPI (SIGRTMIN + OS_EVENT_PI) +#define SIGDI (SIGRTMIN + OS_EVENT_DP) +#define SIGBREAK (SIGRTMIN + OS_EVENT_CPU_BREAK) +#define SIGSPBREAK (SIGRTMIN + OS_EVENT_SP_BREAK) + + +/* + * Function Prototypes + */ + +extern void emDisplayBuffer(unsigned int); +extern void emGetMouseState(MouseState *); +extern int emInitController(int); +extern int emGetController(int, GamePad *); +extern int emMemoryDump(const char *); +extern int emMemoryLoad(const char *); +extern int emPrintf(const char *, ...); +extern void emGIOInit( void ); +extern void emInitSocket( void ); +extern void emWriteSocket( char ); +extern void emRomToHost( int, int ); + +/* connect to RSP: */ +extern int emRSPFrame(char *prefix, int fid, int keepMem, int DRAMoutput, int RDPin); +extern int emRSPAudioFrame(char *prefix, int fid, int keepMem); +extern int emRSPQuit(void); + +/* audio support */ + +extern void emAudioInit(char *filename); +extern void emAudioWrite(short *out, int count); +extern void emAudioFlush(void); +extern void emPause(void); + +/* DRAM definites */ + +#define KSEG0_BASE 0x20000000 +#define DRAM_SIZE 0x200000 + +/* locations for shared ROM in emulator */ + +#define ROM_BASE (KSEG0_BASE + DRAM_SIZE + 0x2000) +#define GIO_CART_INT_REGISTER (ROM_BASE + RAMROM_SIZE - 4) +#define SHM_CART_INT_REGISTER (RAMROM_MSG_SIZE - 4) +#define SHM_MSG_BUFFER_ADDRESS (RAMROM_MSG_SIZE - 8) + + +#endif /* _LANGUAGE_C */ + +#endif /* !_EM_H_ */ diff --git a/include/PR/gbi-poslight.h b/include/ique/PR/gbi-poslight.h similarity index 100% rename from include/PR/gbi-poslight.h rename to include/ique/PR/gbi-poslight.h diff --git a/include/PR/gbi.h b/include/ique/PR/gbi.h old mode 100644 new mode 100755 similarity index 100% rename from include/PR/gbi.h rename to include/ique/PR/gbi.h diff --git a/include/ique/PR/gs2dex.h b/include/ique/PR/gs2dex.h new file mode 100755 index 00000000..cf982d0d --- /dev/null +++ b/include/ique/PR/gs2dex.h @@ -0,0 +1,393 @@ +/*--------------------------------------------------------------------- + Copyright (C) 1997, Nintendo. + + File gs2dex.h + Coded by Yoshitaka Yasumoto. Jul 31, 1997. + Modified by + Comments Header file for S2DEX ucode. + + $Id: gs2dex.h,v 1.1.1.1 2002/05/02 03:28:24 blythe Exp $ + ---------------------------------------------------------------------*/ + +#ifndef _GS2DEX_H_ +#define _GS2DEX_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +/*===========================================================================* + * Macro + *===========================================================================*/ +#define GS_CALC_DXT(line) (((1<< G_TX_DXT_FRAC)-1)/(line)+1) +#define GS_PIX2TMEM(pix, siz) ((pix)>>(4-(siz))) +#define GS_PIX2DXT(pix, siz) GS_CALC_DXT(GS_PIX2TMEM((pix), (siz))) + +/*===========================================================================* + * Data structures for S2DEX microcode + *===========================================================================*/ + +/*---------------------------------------------------------------------------* + * Background + *---------------------------------------------------------------------------*/ +#define G_BGLT_LOADBLOCK 0x0033 +#define G_BGLT_LOADTILE 0xfff4 + +#define G_BG_FLAG_FLIPS 0x01 +#define G_BG_FLAG_FLIPT 0x10 + +/* Non scalable background plane */ +typedef struct { + u16 imageX; /* ¥Æ¥¯¥¹¥Á¥ã¤Îº¸¾å°ÌÃÖ X ºÂɸ (u10.5) */ + u16 imageW; /* ¥Æ¥¯¥¹¥Á¥ã¤ÎÉý (u10.2) */ + s16 frameX; /* žÁ÷¤µ¤ì¤ë¥Õ¥ì¡¼¥à¤Îº¸¾å°ÌÃÖ(s10.2) */ + u16 frameW; /* žÁ÷¤µ¤ì¤ë¥Õ¥ì¡¼¥à¤ÎÉý (u10.2) */ + + u16 imageY; /* ¥Æ¥¯¥¹¥Á¥ã¤Îº¸¾å°ÌÃÖ Y ºÂɸ (u10.5) */ + u16 imageH; /* ¥Æ¥¯¥¹¥Á¥ã¤Î¹â¤µ (u10.2) */ + s16 frameY; /* žÁ÷¤µ¤ì¤ë¥Õ¥ì¡¼¥à¤Îº¸¾å°ÌÃÖ(s10.2) */ + u16 frameH; /* žÁ÷¤µ¤ì¤ë¥Õ¥ì¡¼¥à¤Î¹â¤µ (u10.2) */ + + u64 *imagePtr; /* DRAM ¾å¤Î¥Æ¥¯¥¹¥Á¥ã¥½¡¼¥¹¥¢¥É¥ì¥¹ */ + u16 imageLoad; /* LoadBlock, LoadTile ¤Î¤É¤Á¤é¤ò»ÈÍѤ¹¤ë¤« */ + u8 imageFmt; /* ¥Æ¥¯¥»¥ë¤Î¥Õ¥©¡¼¥Þ¥Ã¥È G_IM_FMT_* */ + u8 imageSiz; /* ¥Æ¥¯¥»¥ë¤Î¥µ¥¤¥º G_IM_SIZ_* */ + u16 imagePal; /* ¥Ñ¥ì¥Ã¥ÈÈÖ¹æ */ + u16 imageFlip; /* ¥¤¥á¡¼¥¸¤Îº¸±¦È¿Å¾ G_BG_FLAG_FLIPS ¤Çȿž */ + + /* °Ê²¼¤Ï½é´ü²½¥ë¡¼¥Á¥ó guS2DInitBg() Æâ¤ÇÀßÄꤵ¤ì¤ë¤Î¤Ç¥æ¡¼¥¶¤¬Àß + Äꤹ¤ëɬÍפϤʤ¤ */ + u16 tmemW; /* frame 1 ¥é¥¤¥ó¤Î TMEM Éý Word ¥µ¥¤¥º + LoadBlock ¤Î»þ GS_PIX2TMEM(imageW/4,imageSiz) + LoadTile ¤Î»þ GS_PIX2TMEM(frameW/4,imageSiz)+1 */ + u16 tmemH; /* °ìÅÙ¤Ë¥í¡¼¥É¤Ç¤­¤ë TMEM ¹â¤µ (s13.2) 4ÇÜÃÍ + ÄÌ¾ï¥Æ¥¯¥¹¥Á¥ã¤Î»þ 512/tmemW*4 + CI ¥Æ¥¯¥¹¥Á¥ã¤Î»þ 256/tmemW*4 */ + u16 tmemLoadSH; /* SH ÃÍ + LoadBlock ¤Î»þ tmemSize/2-1 + LoadTile ¤Î»þ tmemW*16-1 */ + u16 tmemLoadTH; /* TH ÃÍ or Stride ÃÍ + LoadBlock ¤Î»þ GS_CALC_DXT(tmemW) + LoadTile ¤Î»þ tmemH-1 */ + u16 tmemSizeW; /* image 1 ¥é¥¤¥óʬ¤Î imagePtr ¤Î¥¹¥­¥Ã¥×ÃÍ + LoadBlock ¤Î»þ tmemW*2 + LoadTile ¤Î»þ GS_PIX2TMEM(imageW/4,imageSiz)*2 */ + u16 tmemSize; /* ¥í¡¼¥É°ì²óʬ¤Î imagePtr ¤Î¥¹¥­¥Ã¥×ÃÍ + = tmemSizeW*tmemH */ +} uObjBg_t; /* 40 bytes */ + +/* Scalable background plane */ +typedef struct { + u16 imageX; /* ¥Æ¥¯¥¹¥Á¥ã¤Îº¸¾å°ÌÃÖ X ºÂɸ (u10.5) */ + u16 imageW; /* ¥Æ¥¯¥¹¥Á¥ã¤ÎÉý (u10.2) */ + s16 frameX; /* žÁ÷¤µ¤ì¤ë¥Õ¥ì¡¼¥à¤Îº¸¾å°ÌÃÖ(s10.2) */ + u16 frameW; /* žÁ÷¤µ¤ì¤ë¥Õ¥ì¡¼¥à¤ÎÉý (u10.2) */ + + u16 imageY; /* ¥Æ¥¯¥¹¥Á¥ã¤Îº¸¾å°ÌÃÖ Y ºÂɸ (u10.5) */ + u16 imageH; /* ¥Æ¥¯¥¹¥Á¥ã¤Î¹â¤µ (u10.2) */ + s16 frameY; /* žÁ÷¤µ¤ì¤ë¥Õ¥ì¡¼¥à¤Îº¸¾å°ÌÃÖ(s10.2) */ + u16 frameH; /* žÁ÷¤µ¤ì¤ë¥Õ¥ì¡¼¥à¤Î¹â¤µ (u10.2) */ + + u64 *imagePtr; /* DRAM ¾å¤Î¥Æ¥¯¥¹¥Á¥ã¥½¡¼¥¹¥¢¥É¥ì¥¹ */ + u16 imageLoad; /* LoadBlock, LoadTile ¤Î¤É¤Á¤é¤ò»ÈÍѤ¹¤ë¤« */ + u8 imageFmt; /* ¥Æ¥¯¥»¥ë¤Î¥Õ¥©¡¼¥Þ¥Ã¥È G_IM_FMT_* */ + u8 imageSiz; /* ¥Æ¥¯¥»¥ë¤Î¥µ¥¤¥º G_IM_SIZ_* */ + u16 imagePal; /* ¥Ñ¥ì¥Ã¥ÈÈÖ¹æ */ + u16 imageFlip; /* ¥¤¥á¡¼¥¸¤Îº¸±¦È¿Å¾ G_BG_FLAG_FLIPS ¤Çȿž */ + + u16 scaleW; /* X Êý¸þ¥¹¥±¡¼¥ëÃÍ (u5.10) */ + u16 scaleH; /* Y Êý¸þ¥¹¥±¡¼¥ëÃÍ (u5.10) */ + s32 imageYorig; /* image ¤Ë¤ª¤±¤ëÉÁ²è»ÏÅÀ (s20.5) */ + + u8 padding[4]; + +} uObjScaleBg_t; /* 40 bytes */ + +typedef union { + uObjBg_t b; + uObjScaleBg_t s; + long long int force_structure_alignment; +} uObjBg; + +/*---------------------------------------------------------------------------* + * 2D Objects + *---------------------------------------------------------------------------*/ +#define G_OBJ_FLAG_FLIPS 1<<0 /* S Êý¸þȿž */ +#define G_OBJ_FLAG_FLIPT 1<<4 /* T Êý¸þȿž */ + +typedef struct { + s16 objX; /* s10.2 OBJ º¸¾åü X ºÂɸ */ + u16 scaleW; /* u5.10 ÉýÊý¸þ¥¹¥±¡¼¥ê¥ó¥° */ + u16 imageW; /* u10.5 ¥Æ¥¯¥¹¥Á¥ã¤ÎÉý (S Êý¸þ¤ÎŤµ) */ + u16 paddingX; /* ̤»ÈÍÑ ¾ï¤Ë 0 */ + s16 objY; /* s10.2 OBJ º¸¾åü Y ºÂɸ */ + u16 scaleH; /* u5.10 ¹â¤µÊý¸þ¥¹¥±¡¼¥ê¥ó¥° */ + u16 imageH; /* u10.5 ¥Æ¥¯¥¹¥Á¥ã¤Î¹â¤µ (T Êý¸þ¤ÎŤµ) */ + u16 paddingY; /* ̤»ÈÍÑ ¾ï¤Ë 0 */ + u16 imageStride; /* ¥Æ¥¯¥»¥ë¤ÎÀÞ¤êÊÖ¤·Éý (64bit word ñ°Ì) */ + u16 imageAdrs; /* TMEM Æâ¤Î¥Æ¥¯¥¹¥Á¥ãÀèÆ¬°ÌÃÖ (64bit word ñ°Ì) */ + u8 imageFmt; /* ¥Æ¥¯¥»¥ë¤Î¥Õ¥©¡¼¥Þ¥Ã¥È G_IM_FMT_* */ + u8 imageSiz; /* ¥Æ¥¯¥»¥ë¤Î¥µ¥¤¥º G_IM_SIZ_* */ + u8 imagePal; /* ¥Ñ¥ì¥Ã¥ÈÈÖ¹æ 0-7 */ + u8 imageFlags; /* ɽ¼¨¥Õ¥é¥° G_OBJ_FLAG_FLIP* */ +} uObjSprite_t; /* 24 bytes */ + +typedef union { + uObjSprite_t s; + long long int force_structure_alignment; +} uObjSprite; + +/*---------------------------------------------------------------------------* + * 2D Matrix + *---------------------------------------------------------------------------*/ +typedef struct { + s32 A, B, C, D; /* s15.16 */ + s16 X, Y; /* s10.2 */ + u16 BaseScaleX; /* u5.10 */ + u16 BaseScaleY; /* u5.10 */ +} uObjMtx_t; /* 24 bytes */ + +typedef union { + uObjMtx_t m; + long long int force_structure_alignment; +} uObjMtx; + +typedef struct { + s16 X, Y; /* s10.2 */ + u16 BaseScaleX; /* u5.10 */ + u16 BaseScaleY; /* u5.10 */ +} uObjSubMtx_t; /* 8 bytes */ + +typedef union { + uObjSubMtx_t m; + long long int force_structure_alignment; +} uObjSubMtx; + +/*---------------------------------------------------------------------------* + * Loading into TMEM + *---------------------------------------------------------------------------*/ +#define G_OBJLT_TXTRBLOCK 0x00001033 +#define G_OBJLT_TXTRTILE 0x00fc1034 +#define G_OBJLT_TLUT 0x00000030 + +#define GS_TB_TSIZE(pix,siz) (GS_PIX2TMEM((pix),(siz))-1) +#define GS_TB_TLINE(pix,siz) (GS_CALC_DXT(GS_PIX2TMEM((pix),(siz)))) + +typedef struct { + u32 type; /* Type ¼ïÊÌ G_OBJLT_TXTRBLOCK */ + u64 *image; /* DRAM ¾å¤Î¥Æ¥¯¥¹¥Á¥ã¥½¡¼¥¹¥¢¥É¥ì¥¹ */ + u16 tmem; /* ¥í¡¼¥ÉÀè¤Î TMEM ¥ï¡¼¥É¥¢¥É¥ì¥¹ (8byteWORD) */ + u16 tsize; /* Texture ¥µ¥¤¥º ¥Þ¥¯¥í GS_TB_TSIZE() ¤Ç»ØÄê */ + u16 tline; /* Texture 1 ¥é¥¤¥óÉý ¥Þ¥¯¥í GS_TB_TLINE() ¤Ç»ØÄê */ + u16 sid; /* STATE ID 4 ¤ÎÇÜ¿ô¤Ç 0,4,8,12 ¤Î¤É¤ì¤« */ + u32 flag; /* STATE flag */ + u32 mask; /* STATE mask */ +} uObjTxtrBlock_t; /* 24 bytes */ + +#define GS_TT_TWIDTH(pix,siz) ((GS_PIX2TMEM((pix), (siz))<<2)-1) +#define GS_TT_THEIGHT(pix,siz) (((pix)<<2)-1) + +typedef struct { + u32 type; /* Type ¼ïÊÌ G_OBJLT_TXTRTILE */ + u64 *image; /* DRAM ¾å¤Î¥Æ¥¯¥¹¥Á¥ã¥½¡¼¥¹¥¢¥É¥ì¥¹ */ + u16 tmem; /* ¥í¡¼¥ÉÀè¤Î TMEM ¥ï¡¼¥É¥¢¥É¥ì¥¹ (8byteWORD) */ + u16 twidth; /* Texture Éý ¥Þ¥¯¥í GS_TT_TWIDTH() ¤Ç»ØÄê */ + u16 theight; /* Texture ¹â¤µ ¥Þ¥¯¥í GS_TT_THEIGHT() ¤Ç»ØÄê */ + u16 sid; /* STATE ID 4 ¤ÎÇÜ¿ô¤Ç 0,4,8,12 ¤Î¤É¤ì¤« */ + u32 flag; /* STATE flag */ + u32 mask; /* STATE mask */ +} uObjTxtrTile_t; /* 24 bytes */ + +#define GS_PAL_HEAD(head) ((head)+256) +#define GS_PAL_NUM(num) ((num)-1) + +typedef struct { + u32 type; /* Type ¼ïÊÌ G_OBJLT_TLUT */ + u64 *image; /* DRAM ¾å¤Î¥Æ¥¯¥¹¥Á¥ã¥½¡¼¥¹¥¢¥É¥ì¥¹ */ + u16 phead; /* ¥í¡¼¥ÉÀèÆ¬¤Î¥Ñ¥ì¥Ã¥ÈÈÖ¹æ 256 °Ê¾å 511 °Ê²¼ */ + u16 pnum; /* ¥í¡¼¥É¤¹¤ë¥Ñ¥ì¥Ã¥È¿ô - 1 */ + u16 zero; /* ¾ï¤Ë 0 ¤òÂåÆþ¤¹¤ë */ + u16 sid; /* STATE ID 4 ¤ÎÇÜ¿ô¤Ç 0,4,8,12 ¤Î¤É¤ì¤« */ + u32 flag; /* STATE flag */ + u32 mask; /* STATE mask */ +} uObjTxtrTLUT_t; /* 24 bytes */ + +typedef union { + uObjTxtrBlock_t block; + uObjTxtrTile_t tile; + uObjTxtrTLUT_t tlut; + long long int force_structure_alignment; +} uObjTxtr; + +/*---------------------------------------------------------------------------* + * Loading into TMEM & 2D Objects + *---------------------------------------------------------------------------*/ +typedef struct { + uObjTxtr txtr; + uObjSprite sprite; +} uObjTxSprite; /* 48 bytes */ + +/*===========================================================================* + * GBI Commands for S2DEX microcode + *===========================================================================*/ +/* GBI Header */ +#ifdef F3DEX_GBI_2 +#define G_OBJ_RECTANGLE_R 0xda +#define G_OBJ_MOVEMEM 0xdc +#define G_RDPHALF_0 0xe4 +#define G_OBJ_RECTANGLE 0x01 +#define G_OBJ_SPRITE 0x02 +#define G_SELECT_DL 0x04 +#define G_OBJ_LOADTXTR 0x05 +#define G_OBJ_LDTX_SPRITE 0x06 +#define G_OBJ_LDTX_RECT 0x07 +#define G_OBJ_LDTX_RECT_R 0x08 +#define G_BG_1CYC 0x09 +#define G_BG_COPY 0x0a +#define G_OBJ_RENDERMODE 0x0b +#else +#define G_BG_1CYC 0x01 +#define G_BG_COPY 0x02 +#define G_OBJ_RECTANGLE 0x03 +#define G_OBJ_SPRITE 0x04 +#define G_OBJ_MOVEMEM 0x05 +#define G_SELECT_DL 0xb0 +#define G_OBJ_RENDERMODE 0xb1 +#define G_OBJ_RECTANGLE_R 0xb2 +#define G_OBJ_LOADTXTR 0xc1 +#define G_OBJ_LDTX_SPRITE 0xc2 +#define G_OBJ_LDTX_RECT 0xc3 +#define G_OBJ_LDTX_RECT_R 0xc4 +#define G_RDPHALF_0 0xe4 +#endif + +/*---------------------------------------------------------------------------* + * Background wrapped screen + *---------------------------------------------------------------------------*/ +#define gSPBgRectangle(pkt, m, mptr) gDma0p((pkt),(m),(mptr),0) +#define gsSPBgRectangle(m, mptr) gsDma0p( (m),(mptr),0) +#define gSPBgRectCopy(pkt, mptr) gSPBgRectangle((pkt), G_BG_COPY, (mptr)) +#define gsSPBgRectCopy(mptr) gsSPBgRectangle( G_BG_COPY, (mptr)) +#define gSPBgRect1Cyc(pkt, mptr) gSPBgRectangle((pkt), G_BG_1CYC, (mptr)) +#define gsSPBgRect1Cyc(mptr) gsSPBgRectangle( G_BG_1CYC, (mptr)) + +/*---------------------------------------------------------------------------* + * 2D Objects + *---------------------------------------------------------------------------*/ +#define gSPObjSprite(pkt, mptr) gDma0p((pkt),G_OBJ_SPRITE, (mptr),0) +#define gsSPObjSprite(mptr) gsDma0p( G_OBJ_SPRITE, (mptr),0) +#define gSPObjRectangle(pkt, mptr) gDma0p((pkt),G_OBJ_RECTANGLE, (mptr),0) +#define gsSPObjRectangle(mptr) gsDma0p( G_OBJ_RECTANGLE, (mptr),0) +#define gSPObjRectangleR(pkt, mptr) gDma0p((pkt),G_OBJ_RECTANGLE_R,(mptr),0) +#define gsSPObjRectangleR(mptr) gsDma0p( G_OBJ_RECTANGLE_R,(mptr),0) + +/*---------------------------------------------------------------------------* + * 2D Matrix + *---------------------------------------------------------------------------*/ +#define gSPObjMatrix(pkt, mptr) gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),0,23) +#define gsSPObjMatrix(mptr) gsDma1p( G_OBJ_MOVEMEM,(mptr),0,23) +#define gSPObjSubMatrix(pkt, mptr) gDma1p((pkt),G_OBJ_MOVEMEM,(mptr),2, 7) +#define gsSPObjSubMatrix(mptr) gsDma1p( G_OBJ_MOVEMEM,(mptr),2, 7) + +/*---------------------------------------------------------------------------* + * Loading into TMEM + *---------------------------------------------------------------------------*/ +#define gSPObjLoadTxtr(pkt, tptr) gDma0p((pkt),G_OBJ_LOADTXTR, (tptr),23) +#define gsSPObjLoadTxtr(tptr) gsDma0p( G_OBJ_LOADTXTR, (tptr),23) +#define gSPObjLoadTxSprite(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_SPRITE,(tptr),47) +#define gsSPObjLoadTxSprite(tptr) gsDma0p( G_OBJ_LDTX_SPRITE,(tptr),47) +#define gSPObjLoadTxRect(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_RECT, (tptr),47) +#define gsSPObjLoadTxRect(tptr) gsDma0p( G_OBJ_LDTX_RECT, (tptr),47) +#define gSPObjLoadTxRectR(pkt, tptr) gDma0p((pkt),G_OBJ_LDTX_RECT_R,(tptr),47) +#define gsSPObjLoadTxRectR(tptr) gsDma0p( G_OBJ_LDTX_RECT_R,(tptr),47) + +/*---------------------------------------------------------------------------* + * Select Display List + *---------------------------------------------------------------------------*/ +#define gSPSelectDL(pkt, mptr, sid, flag, mask) \ +{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); } +#define gsSPSelectDL(mptr, sid, flag, mask) \ +{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); } +#define gSPSelectBranchDL(pkt, mptr, sid, flag, mask) \ +{ gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); } +#define gsSPSelectBranchDL(mptr, sid, flag, mask) \ +{ gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); } + +/*---------------------------------------------------------------------------* + * Set general status + *---------------------------------------------------------------------------*/ +#define G_MW_GENSTAT 0x08 /* G_MW_FOG ¤ÈƱ¤¸ÃͤʤΤÇÃí°Õ */ + +#define gSPSetStatus(pkt, sid, val) \ + gMoveWd((pkt), G_MW_GENSTAT, (sid), (val)) +#define gsSPSetStatus(sid, val) \ + gsMoveWd( G_MW_GENSTAT, (sid), (val)) + +/*---------------------------------------------------------------------------* + * Set Object Render Mode + *---------------------------------------------------------------------------*/ +#define G_OBJRM_NOTXCLAMP 0x01 +#define G_OBJRM_XLU 0x02 /* Ignored */ +#define G_OBJRM_ANTIALIAS 0x04 /* Ignored */ +#define G_OBJRM_BILERP 0x08 +#define G_OBJRM_SHRINKSIZE_1 0x10 +#define G_OBJRM_SHRINKSIZE_2 0x20 +#define G_OBJRM_WIDEN 0x40 + +#define gSPObjRenderMode(pkt, mode) gImmp1((pkt),G_OBJ_RENDERMODE,(mode)) +#define gsSPObjRenderMode(mode) gsImmp1( G_OBJ_RENDERMODE,(mode)) + +/*===========================================================================* + * Render Mode Macro + *===========================================================================*/ +#define RM_RA_SPRITE(clk) \ + AA_EN | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define G_RM_SPRITE G_RM_OPA_SURF +#define G_RM_SPRITE2 G_RM_OPA_SURF2 +#define G_RM_RA_SPRITE RM_RA_SPRITE(1) +#define G_RM_RA_SPRITE2 RM_RA_SPRITE(2) +#define G_RM_AA_SPRITE G_RM_AA_TEX_TERR +#define G_RM_AA_SPRITE2 G_RM_AA_TEX_TERR2 +#define G_RM_XLU_SPRITE G_RM_XLU_SURF +#define G_RM_XLU_SPRITE2 G_RM_XLU_SURF2 +#define G_RM_AA_XLU_SPRITE G_RM_AA_XLU_SURF +#define G_RM_AA_XLU_SPRITE2 G_RM_AA_XLU_SURF2 + +/*===========================================================================* + * External functions + *===========================================================================*/ +extern u64 gspS2DEX_fifoTextStart[], gspS2DEX_fifoTextEnd[]; +extern u64 gspS2DEX_fifoDataStart[], gspS2DEX_fifoDataEnd[]; +extern u64 gspS2DEX_fifo_dTextStart[], gspS2DEX_fifo_dTextEnd[]; +extern u64 gspS2DEX_fifo_dDataStart[], gspS2DEX_fifo_dDataEnd[]; +extern u64 gspS2DEX2_fifoTextStart[], gspS2DEX2_fifoTextEnd[]; +extern u64 gspS2DEX2_fifoDataStart[], gspS2DEX2_fifoDataEnd[]; +extern u64 gspS2DEX2_xbusTextStart[], gspS2DEX2_xbusTextEnd[]; +extern u64 gspS2DEX2_xbusDataStart[], gspS2DEX2_xbusDataEnd[]; +extern void guS2DInitBg(uObjBg *); + +#ifdef F3DEX_GBI_2 +# define guS2DEmuBgRect1Cyc guS2D2EmuBgRect1Cyc /*Wrapper*/ +# define guS2DEmuSetScissor guS2D2EmuSetScissor /*Wrapper*/ + extern void guS2D2EmuSetScissor(u32, u32, u32, u32, u8); + extern void guS2D2EmuBgRect1Cyc(Gfx **, uObjBg *); +#else + extern void guS2DEmuSetScissor(u32, u32, u32, u32, u8); + extern void guS2DEmuBgRect1Cyc(Gfx **, uObjBg *); +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif +#endif /* _GS2DEX_H_ */ + +/*======== End of gs2dex.h ========*/ diff --git a/include/ique/PR/gt.h b/include/ique/PR/gt.h new file mode 100755 index 00000000..b6bbb5e5 --- /dev/null +++ b/include/ique/PR/gt.h @@ -0,0 +1,365 @@ + +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + * + */ + +/* + * File: gt.h + * Creator: hsa@sgi.com + * Create Date: Thu Oct 12 15:48:14 PDT 1995 + * + * This file defines the GBI for the TURBO 3D graphics microcode. + * The turbo microcode is a special FEATURE-LIMITED microcode designed + * for specific applications. It is not for general use. + * + * (see XXX for more information) + * + */ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/gt.h,v $ + * + **************************************************************************/ + +#ifndef _GT_H_ +#define _GT_H_ + +/* this file should be #included AFTER gbi.h */ + +#include "sptask.h" + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif /* _LANGUAGE_C_PLUS_PLUS */ + +#include + +/* the following #defines seem out of order, but we need them + * for the microcode. + */ + +/* + * object state field: rendState + * + * This flag word is built up out of the bits from a + * subset of the G_SETGEOMETRYMODE flags from gbi.h. + * + * When each of these bits is '1', the comments below explain + * the effect on the triangles. + */ +#define GT_ZBUFFER G_ZBUFFER +#define GT_TEXTURE G_TEXTURE_ENABLE /* texture ON */ +#define GT_CULL_BACK G_CULL_BACK /* reject backfaces */ +#define GT_SHADING_SMOOTH G_SHADING_SMOOTH /* smooth shade ON */ + +/* + * object state field: textureState + * + * The lower 3 bits of this flag word contain the texture tile number + * to be used. All triangles of an object are rendered with the same + * texture tile. + */ + +/* + * object state field: flag + * + * This is a group of what would be pad bits. We use them for some + * flag bits. + */ +#define GT_FLAG_NOMTX 0x01 /* don't load the matrix */ +#define GT_FLAG_NO_XFM 0x02 /* load vtx, use verbatim */ +#define GT_FLAG_XFM_ONLY 0x04 /* xform vtx, write to *TriN */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* turbo 3D ucode: */ +extern long long int gspTurbo3DTextStart[], gspTurbo3DTextEnd[]; +extern long long int gspTurbo3DDataStart[], gspTurbo3DDataEnd[]; +extern long long int gspTurbo3D_dramTextStart[], gspTurbo3D_dramTextEnd[]; +extern long long int gspTurbo3D_dramDataStart[], gspTurbo3D_dramDataEnd[]; +extern long long int gspTurbo3D_fifoTextStart[], gspTurbo3D_fifoTextEnd[]; +extern long long int gspTurbo3D_fifoDataStart[], gspTurbo3D_fifoDataEnd[]; + +/* + * This is the global state structure. It's definition carefully + * matches the ucode, so if this structure changes, you must also change + * the ucode. + */ +typedef struct { + u16 perspNorm; /* persp normalization */ + u16 pad0; + u32 flag; + Gfx rdpOthermode; + u32 segBases[16]; /* table of segment base addrs (SEE NOTE!) */ + Vp viewport; /* the viewport to use */ + Gfx *rdpCmds; /* block of RDP data, process if !NULL + * block terminated by gDPEndDisplayList() + * (This is a segment address) + */ +} gtGlobState_t; + +/* NOTE: + * Although there are 16 segment table entries, the first one (segment 0) + * is reserved for physical memory mapping. You should not segment 0 + * to anything other than 0x0. + */ + +typedef union { + gtGlobState_t sp; + long long int force_structure_alignment; +} gtGlobState; + + +/* + * This is the 'state' structure associated with each object + * to be rendered. It's definition carefully matches the + * ucode, so if this structure changes, you must also change + * the gtoff.c tool and the ucode. + */ +typedef struct { + u32 renderState; /* render state */ + u32 textureState; /* texture state */ + u8 vtxCount; /* how many verts? */ + u8 vtxV0; /* where to load verts? */ + u8 triCount; /* how many tris? */ + u8 flag; + Gfx *rdpCmds; /* ptr (segment address) to RDP DL */ + Gfx rdpOthermode; + Mtx transform; /* the transform matrix to use */ +} gtState_t; + +typedef union { + gtState_t sp; + long long int force_structure_alignment; +} gtState; + +/* gtStateLite : same as gtState, but no matrix (see flags below) */ +/* this structure must be identical to gtState! (bad) */ +typedef struct { + u32 renderState; /* render state */ + u32 textureState; /* texture state */ + u8 vtxCount; /* how many verts? */ + u8 vtxV0; /* where to load verts? */ + u8 triCount; /* how many tris? */ + u8 flag; + Gfx *rdpCmds; /* ptr (segment address) to RDP DL */ + Gfx rdpOthermode; +} gtStateL_t; + +typedef union { + gtStateL_t sp; + long long int force_structure_alignment; +} gtStateL; + +/* + * The vertex list for the turbo display list uses the + * Vtx struct in gbi.h + * + */ + + +/* + * This structure represents a single triangle, part of the + * triangle list of the object to be rendered. + * + * NOTE: The triangle list MUST be aligned to an 8-byte boundary. + * Since this structure is only 4 bytes, we are REQUIRING that + * this structure only be used as an array of triangles, and we + * depend on the MIPS C compiler (which always aligns arrays to + * 8-byte boundaries). THIS IS DANGEROUS!!!! + * + */ +typedef struct { + u8 v0, v1, v2, flag; /* flag is which one for flat shade */ +} gtTriN; + + +/* + * This structure represents the transformed points. It is the format + * of the points written out when GT_FLAG_XFM_ONLY is set, as well as + * the format expected when GT_FLAG_NO_XFM is used. + * + * NOTE: The size and layout of these points is very similar to Vtx, + * except the screen coordinates overwrite the x,y,z,pad fields. + * (we could consider adding to the Vtx union, but we want to keep + * turbo stuff out of gbi.h) + * + * NOTE: The z is a special format. It can be used to compare vertices + * for sorting, but it should not be used for other purposes. If modified, + * the z-buffer hardware might not understand the data. + * + */ +typedef struct { + short int xscrn; /* x,y screen coordinates are SSSS10.2 */ + short int yscrn; + int zscrn; /* z screen is S15.16 */ + + short int s; /* transformed texture coord, S10.5 */ + short int t; + + u8 r; /* color (or normal) */ + u8 g; + u8 b; + u8 a; +} gtVtxOut_t; + +/* see "Data Structure" comment in gbi.h for information about why + * we use this union. + */ +typedef union { + gtVtxOut_t v; + long long int force_structure_alignment; +} gtVtxOut; + + + +/* + * state field: rdpOthermode + * + * This is one of the trickier state fields. The turbo interface + * requires the RDP othermode command to be cached by the host, + * therefore we provide a different interface in libultra to help cache + * this in the gt state (this word is just bits, you could pack them + * on your own). + * + * gtStateSetOthermode() accomplishs this, taking as arguments + * the state, one of the following mode enums, and a piece of data + * (othermode parameters from gbi.h). + * + * By definition, the othermode word from the gt state structure is sent + * to the RDP *before* any RDP commands from the rdpCmds[] field. The + * othermode is *always* sent. + * + * Stated another way, NONE of the gbi RDP othermode commands equivalent + * to those listed here are allowed in the rdpCmd[] field of the + * gt state structure. + * + * Notice also that many of these commands do not make sense for + * the turbo ucode (they control features not supported, like mip-mapping). + * They are only included here for completeness. + * + */ +typedef enum { + GT_CLEAR, /* special gt mode, clears othermode state */ + GT_ALPHACOMPARE, + GT_ZSRCSEL, + GT_RENDERMODE, + GT_ALPHADITHER, + GT_RGBDITHER, + GT_COMBKEY, + GT_TEXTCONV, + GT_TEXTFILT, + GT_TEXTLUT, + GT_TEXTLOD, + GT_TEXTDETAIL, + GT_TEXTPERSP, + GT_CYCLETYPE, + GT_PIPELINE +} gtStateOthermode_t; + +/* + * This call builds up an othermode command word. The 'mode' is one of + * the above modes, the 'data' field comes from gbi.h, it is the data + * field for the equivalent gbi setothermode macro. + */ +extern void gtStateSetOthermode(Gfx *om, gtStateOthermode_t mode, int data); + +/* + * This call dumps a turbo display list for use with gbi2mem and RSPSIM + */ +#define GT_DUMPTURBO_HANGAFTER 64 +#define GT_DUMPTURBO_NOTEXTURES 128 +extern void gtDumpTurbo(OSTask *tp,u8 flags); + +/* + * Special macros to init othermode words to all 0's, a good default + * value. + */ +#define gDPClearOtherMode(pkt) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_RDPSETOTHERMODE, 24, 8); \ + _g->words.w1 = 0x0; \ +} + +#define gsDPClearOtherMode() \ +{ \ + _SHIFTL(G_RDPSETOTHERMODE, 24, 8), 0x0 \ +} + +/* + * Special macros to end DP blocks (see above). These commands + * generate all 0's, which the turbo ucode looks for. They *aren't* + * real DP commands! + */ +#define gDPEndDisplayList(pkt) gSPNoOp(pkt) +#define gsDPEndDisplayList() gsSPNoOp() + +/* + * This structure is a turbo 'object', the turbo display list is + * simply a list of these. + * + * NOTE: All pointers are segment addresses + * + * NOTE: If (statep->flag & GT_FLAG_XFM_ONLY), the trip field is + * interpreted as a pointer to gtVtxOut[] that can be used to store + * the transformed points. (statep->triCount should be 0, else bad + * things could happen...) + * + * NOTE: If (statep->flag & GT_FLAG_NO_XFM), the vtxp field is + * interpreted as a pointer to gtVtxOut[] that can be used to load + * pre-transformed points. + * + */ +typedef struct { + gtGlobState *gstatep; /* global state, usually NULL */ + gtState *statep; /* if this is NULL, end object processing */ + Vtx *vtxp; /* if this is NULL, use points in buffer */ + gtTriN *trip; /* if this is NULL, use tris in buffer */ +} gtGfx_t; + +typedef union { + gtGfx_t obj; + long long int force_structure_alignment; +} gtGfx; + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_ASSEMBLY +#include +#endif /* _LANGUAGE_ASSEMBLY */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif /* _LANGUAGE_C_PLUS_PLUS */ + +#ifdef _LANGUAGE_MAKEROM +#endif /* _LANGUAGE_MAKEROM */ + +#endif /* _GT_H_ */ diff --git a/include/ique/PR/gtoff.h b/include/ique/PR/gtoff.h new file mode 100755 index 00000000..bd321534 --- /dev/null +++ b/include/ique/PR/gtoff.h @@ -0,0 +1,12 @@ +/* GENERATED FILE, DO NOT EDIT! */ + +/* gtState_t structure offsets for assembly language: */ +#define GT_STATE_SIZE 88 +#define GT_STATE_OFF_RENDSTATE 0x00 +#define GT_STATE_OFF_TEXSTATE 0x04 +#define GT_STATE_OFF_VTXCOUNT 0x08 +#define GT_STATE_OFF_VTXV0 0x09 +#define GT_STATE_OFF_TRICOUNT 0x0a +#define GT_STATE_OFF_RDPCMDS 0x0c +#define GT_STATE_OFF_OTHERMODE 0x10 +#define GT_STATE_OFF_TRANSFORM 0x18 diff --git a/include/ique/PR/gu.h b/include/ique/PR/gu.h new file mode 100755 index 00000000..a8d2d701 --- /dev/null +++ b/include/ique/PR/gu.h @@ -0,0 +1,269 @@ +#ifndef _GU_H_ +#define _GU_H_ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/gu.h,v $ + * + **************************************************************************/ + +#include +#include +#include + +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif + +#define M_PI 3.14159265358979323846 +#define M_DTOR (3.14159265358979323846/180.0) + +#define FTOFIX32(x) (long)((x) * (float)0x00010000) +#define FIX32TOF(x) ((float)(x) * (1.0f / (float)0x00010000)) +#define FTOFRAC8(x) ((int) MIN(((x) * (128.0f)), 127.0f) & 0xff) + +#define FILTER_WRAP 0 +#define FILTER_CLAMP 1 + +#define RAND(x) (guRandom()%x) /* random number between 0 to x */ + +/* + * Data Structures + */ +typedef struct { + unsigned char *base; + int fmt, siz; + int xsize, ysize; + int lsize; + /* current tile info */ + int addr; + int w, h; + int s, t; +} Image; + +typedef struct { + float col[3]; + float pos[3]; + float a1, a2; /* actual color = col/(a1*dist + a2) */ +} PositionalLight; + + +/* + * Function Prototypes + */ + +extern int guLoadTextureBlockMipMap(Gfx **glist, unsigned char *tbuf, Image *im, + unsigned char startTile, unsigned char pal, unsigned char cms, + unsigned char cmt, unsigned char masks, unsigned char maskt, + unsigned char shifts, unsigned char shiftt, unsigned char cfs, + unsigned char cft); + +extern int guGetDPLoadTextureTileSz (int ult, int lrt); +extern void guDPLoadTextureTile (Gfx *glistp, void *timg, + int texl_fmt, int texl_size, + int img_width, int img_height, + int uls, int ult, int lrs, int lrt, + int palette, + int cms, int cmt, + int masks, int maskt, + int shifts, int shiftt); + + +/* + * matrix operations: + * + * The 'F' version is floating point, in case the application wants + * to do matrix manipulations and convert to fixed-point at the last + * minute. + */ +extern void guMtxIdent(Mtx *m); +extern void guMtxIdentF(float mf[4][4]); +extern void guOrtho(Mtx *m, float l, float r, float b, float t, + float n, float f, float scale); +extern void guOrthoF(float mf[4][4], float l, float r, float b, float t, + float n, float f, float scale); +extern void guFrustum(Mtx *m, float l, float r, float b, float t, + float n, float f, float scale); +extern void guFrustumF(float mf[4][4], float l, float r, float b, float t, + float n, float f, float scale); +extern void guPerspective(Mtx *m, u16 *perspNorm, float fovy, + float aspect, float near, float far, float scale); +extern void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, + float aspect, float near, float far, float scale); +extern void guLookAt(Mtx *m, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp); +extern void guLookAtF(float mf[4][4], float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp); +extern void guLookAtReflect(Mtx *m, LookAt *l, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp); +extern void guLookAtReflectF(float mf[4][4], LookAt *l, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp); +extern void guLookAtHilite(Mtx *m, LookAt *l, Hilite *h, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float xl1, float yl1, float zl1, + float xl2, float yl2, float zl2, + int twidth, int theight); +extern void guLookAtHiliteF(float mf[4][4], LookAt *l, Hilite *h, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float xl1, float yl1, float zl1, + float xl2, float yl2, float zl2, + int twidth, int theight); +extern void guLookAtStereo(Mtx *m, + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float eyedist); +extern void guLookAtStereoF(float mf[4][4], + float xEye, float yEye, float zEye, + float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, + float eyedist); +extern void guRotate(Mtx *m, float a, float x, float y, float z); +extern void guRotateF(float mf[4][4], float a, float x, float y, float z); +extern void guRotateRPY(Mtx *m, float r, float p, float y); +extern void guRotateRPYF(float mf[4][4], float r, float p, float h); +extern void guAlign(Mtx *m, float a, float x, float y, float z); +extern void guAlignF(float mf[4][4], float a, float x, float y, float z); +extern void guScale(Mtx *m, float x, float y, float z); +extern void guScaleF(float mf[4][4], float x, float y, float z); +extern void guTranslate(Mtx *m, float x, float y, float z); +extern void guTranslateF(float mf[4][4], float x, float y, float z); +extern void guPosition(Mtx *m, float r, float p, float h, float s, + float x, float y, float z); +extern void guPositionF(float mf[4][4], float r, float p, float h, float s, + float x, float y, float z); +extern void guMtxF2L(float mf[4][4], Mtx *m); +extern void guMtxL2F(float mf[4][4], Mtx *m); +extern void guMtxCatF(float m[4][4], float n[4][4], float r[4][4]); +extern void guMtxCatL(Mtx *m, Mtx *n, Mtx *res); +extern void guMtxXFMF(float mf[4][4], float x, float y, float z, + float *ox, float *oy, float *oz); +extern void guMtxXFML(Mtx *m, float x, float y, float z, + float *ox, float *oy, float *oz); + +/* vector utility: */ +extern void guNormalize(float *x, float *y, float *z); + +/* light utilities: */ +void guPosLight(PositionalLight *pl, Light *l, + float xOb, float yOb, float zOb); +void guPosLightHilite(PositionalLight *pl1, PositionalLight *pl2, + Light *l1, Light *l2, + LookAt *l, Hilite *h, + float xEye, float yEye, float zEye, + float xOb, float yOb, float zOb, + float xUp, float yUp, float zUp, + int twidth, int theight); +extern int guRandom(void); + +/* + * Math functions + */ +extern float sinf(float angle); +extern float cosf(float angle); +extern signed short sins (unsigned short angle); +extern signed short coss (unsigned short angle); +extern float sqrtf(float value); +#ifdef __sgi +#pragma intrinsic(sqrtf); +#endif + +/* + * Dump routines for low-level display lists + */ +/* flag values for guParseRdpDL() */ +#define GU_PARSERDP_VERBOSE 1 +#define GU_PARSERDP_PRAREA 2 +#define GU_PARSERDP_PRHISTO 4 +#define GU_PARSERDP_DUMPONLY 32 /* doesn't need to be same as */ + /* GU_PARSEGBI_DUMPOLNY, but this */ + /* allows app to use interchangeably */ + +extern void guParseRdpDL(u64 *rdp_dl, u64 nbytes, u8 flags); +extern void guParseString(char *StringPointer, u64 nbytes); + +/* + * NO LONGER SUPPORTED, + * use guParseRdpDL with GU_PARSERDP_DUMPONLY flags + */ +/* extern void guDumpRawRdpDL(u64 *rdp_dl, u64 nbytes); */ + +/* flag values for guBlinkRdpDL() */ +#define GU_BLINKRDP_HILITE 1 +#define GU_BLINKRDP_EXTRACT 2 + +extern void +guBlinkRdpDL(u64 *rdp_dl_in, u64 nbytes_in, + u64 *rdp_dl_out, u64 *nbytes_out, + u32 x, u32 y, u32 radius, + u8 red, u8 green, u8 blue, + u8 flags); + +/* flag values for guParseGbiDL() */ +#define GU_PARSEGBI_ROWMAJOR 1 +#define GU_PARSEGBI_NONEST 2 +#define GU_PARSEGBI_FLTMTX 4 +#define GU_PARSEGBI_SHOWDMA 8 +#define GU_PARSEGBI_ALLMTX 16 +#define GU_PARSEGBI_DUMPONLY 32 +/* +#define GU_PARSEGBI_HANGAFTER 64 +#define GU_PARSEGBI_NOTEXTURES 128 +*/ +extern void guParseGbiDL(u64 *gbi_dl, u32 nbytes, u8 flags); +extern void guDumpGbiDL(OSTask *tp,u8 flags); + +#define GU_PARSE_GBI_TYPE 1 +#define GU_PARSE_RDP_TYPE 2 +#define GU_PARSE_READY 3 +#define GU_PARSE_MEM_BLOCK 4 +#define GU_PARSE_ABI_TYPE 5 +#define GU_PARSE_STRING_TYPE 6 + +typedef struct { + int dataSize; + int dlType; + int flags; + u32 paddr; +} guDLPrintCB; + +void guSprite2DInit(uSprite *SpritePointer, + void *SourceImagePointer, + void *TlutPointer, + int Stride, + int SubImageWidth, + int SubImageHeight, + int SourceImageType, + int SourceImageBitSize, + int SourceImageOffsetS, + int SourceImageOffsetT); + +#endif /* !_GU_H_ */ diff --git a/include/ique/PR/gzsort.h b/include/ique/PR/gzsort.h new file mode 100755 index 00000000..edd3e1ed --- /dev/null +++ b/include/ique/PR/gzsort.h @@ -0,0 +1,633 @@ +/*---------------------------------------------------------------------* + Copyright (C) 1997-1998, Nintendo. + + File gzsort.h + Coded by Yoshitaka Yasumoto. Jun 16, 1997. + + $Id: gzsort.h,v 1.1.1.1 2002/05/02 03:28:24 blythe Exp $ + *---------------------------------------------------------------------*/ +#ifndef _GZSORT_H_ +#define _GZSORT_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +/*===========================================================================* + * GBI Commands for ZSort microcode + *===========================================================================*/ +/* GBI Header */ +#define G_ZS_ZOBJ 0x80 +#define G_ZS_RDPCMD 0x81 +#define G_ZS_MOVEMEM 0xdc +#define G_ZS_SENDSIGNAL 0xda +#define G_ZS_WAITSIGNAL 0xd9 +#define G_ZS_SETSUBDL 0xd8 +#define G_ZS_LINKSUBDL 0xd7 +#define G_ZS_MULT_MPMTX 0xd6 +#define G_ZS_MTXCAT 0xd5 +#define G_ZS_MTXTRNSP 0xd4 +#define G_ZS_LIGHTING_L 0xd3 /* Not use */ +#define G_ZS_LIGHTING 0xd2 +#define G_ZS_XFMLIGHT 0xd1 +#define G_ZS_INTERPOLATE 0xd0 + +/*------------------------------------------------------------------------* + * case_G_ZOBJ + * +--------+--------+--------+--------+ + * | Pointr for zobj0:32 | + * +--------+--------+--------+--------+ + * | Pointr for zobj1:32 | + * +--------+--------+--------+--------+ + * Draw zobject links + */ +#define gSPZObject(pkt, objA, objB) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = (unsigned int)(objA); \ + _g->words.w1 = (unsigned int)(objB); \ +} + +#define gsSPZObject(objA, objB) \ +{ \ + (unsigned int)(objA), (unsigned int)(objB) \ +} + +/*------------------------------------------------------------------------* + * case_G_RDPCMD + * +--------+--------+--------+--------+ + * | RDPCMD | 0 | + * +--------+--------+--------+--------+ + * | Pointr for rdpcmd:32 | + * +--------+--------+--------+--------+ + * Submit rdp cmd + */ +#define gSPZRdpCmd(pkt, cmd) gImmp1((pkt), G_ZS_RDPCMD, (cmd)) +#define gsSPZRdpCmd(cmd) gsImmp1(G_ZS_RDPCMD, (cmd)) + +/*------------------------------------------------------------------------* + * case_G_MOVEMEM + * +--------+--------++-------+-+----+-+ + * |MOVEMEM | Len:9 | Ofs:9 |ID:5|F| + * +--------+--------++-------+-+----+-+ + * | Pointr for RDRAM:32 | + * +--------+--------+--------+--------+ + * Read/Write DMEM + */ +#define GZM_USER0 0 +#define GZM_USER1 2 +#define GZM_MMTX 4 +#define GZM_PMTX 6 +#define GZM_MPMTX 8 +#define GZM_OTHERMODE 10 +#define GZM_VIEWPORT 12 +#define GZF_LOAD 0 +#define GZF_SAVE 1 + +#define gSPZMoveMem(pkt, id, ofs, len, buffer, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_ZS_MOVEMEM, 24, 8)| \ + _SHIFTL(((len)-1)>>3, 15, 9)| \ + _SHIFTL((ofs)>>3, 6, 9)|(id)|(flag); \ + _g->words.w1 = (unsigned int)(buffer); \ +} + +#define gsSPZMoveMem(id, ofs, len, buffer, flag) \ +{ \ + _SHIFTL(G_ZS_MOVEMEM, 24, 8)| \ + _SHIFTL(((len)-1)>>3, 15, 9)| \ + _SHIFTL((ofs)>>3, 6, 9)|(id)|(flag), \ + (unsigned int)(buffer) \ +} + +/*------------------------------------------------------------------------*/ +#define gSPZSetUMem(pkt, umem, size, adrs) \ + gSPZMoveMem((pkt),GZM_USER0,(umem),(size),(adrs),GZF_LOAD) +#define gsSPZSetUMem(umem, size, adrs) \ + gsSPZMoveMem(GZM_USER0,(umem),(size),(adrs),GZF_LOAD) + +#define gSPZGetUMem(pkt, umem, size, adrs) \ + gSPZMoveMem((pkt),GZM_USER0,(umem),(size),(adrs),GZF_SAVE) +#define gsSPZGetUMem(umem, size, adrs) \ + gsSPZMoveMem(GZM_USER0,(umem),(size),(adrs),GZF_SAVE) + +/*------------------------------------------------------------------------*/ +#define gSPZSetMtx(pkt, mid, mp) \ + gSPZMoveMem((pkt), (mid), 0, sizeof(Mtx), (mp), GZF_LOAD) +#define gsSPZSetMtx(mid, mp) \ + gsSPZMoveMem((mid), 0, sizeof(Mtx), (mp), GZF_LOAD) + +/*------------------------------------------------------------------------*/ +#define gSPZGetMtx(pkt, mid, mp) \ + gSPZMoveMem((pkt), (mid), 0, sizeof(Mtx), (mp), GZF_SAVE) +#define gsSPZGetMtx(mid, mp) \ + gsSPZMoveMem((mid), 0, sizeof(Mtx), (mp), GZF_SAVE) + +/*------------------------------------------------------------------------*/ +#define gSPZSetAmbient(pkt, umem, lights) \ + gSPZSetUMem((pkt),(umem),ZSIZE_AMBIENT,(lights)) +#define gsSPZSetAmbient(umem, lights) \ + gsSPZSetUMem((umem),ZSIZE_AMBIENT,(lights)) + +/*------------------------------------------------------------------------*/ +#define gSPZSetDefuse(pkt, umem, lid, lights) \ + gSPZSetUMem((pkt),(umem)+ZSIZE_AMBIENT+(lid)*ZSIZE_LIGHT, \ + ZSIZE_DEFUSE, (lights)) +#define gsSPZSetDefuse(umem, lid, lights) \ + gsSPZSetUMem((umem)+ZSIZE_AMBIENT+(lid)*ZSIZE_LIGHT, \ + ZSIZE_DEFUSE, (lights)) + +/*------------------------------------------------------------------------*/ +#define gSPZSetLookAt(pkt, umem, lid, lookat) \ +{ gSPZSetUMem((pkt), (umem)+ZSIZE_AMBIENT+((lid)+0)*ZSIZE_LIGHT, \ + ZSIZE_DEFUSE, \ + ((u32)(lookat))+sizeof(Light)*0); \ + gSPZSetUMem((pkt), (umem)+ZSIZE_AMBIENT+((lid)+1)*ZSIZE_LIGHT, \ + ZSIZE_DEFUSE, \ + ((u32)(lookat))+sizeof(Light)*1); } +#define gsSPZSetLookAt(umem, lid, lookat) \ + gsSPZSetUMem((umem)+ZSIZE_AMBIENT+((lid)+0)*ZSIZE_LIGHT, \ + ZSIZE_DEFUSE, \ + ((u32)(lookat))+sizeof(Light)*0), \ + gsSPZSetUMem((umem)+ZSIZE_AMBIENT+((lid)+1)*ZSIZE_LIGHT, \ + ZSIZE_DEFUSE, \ + ((u32)(lookat))+sizeof(Light)*1) + +/*------------------------------------------------------------------------*/ +#define gSPZViewport(pkt, v) \ + gSPZMoveMem((pkt), GZM_VIEWPORT, 0, 16, (v), GZF_LOAD) +#define gsSPZViewport(v) \ + gsSPZMoveMem(GZM_VIEWPORT, 0, 16, (v), GZF_LOAD) + +#define GZ_VIEWPORT_FOG_S(in, out) (0x400000/((out)-(in))) +#define GZ_VIEWPORT_FOG_T(in, out) ((0x200*(out))/((in)-(out))) + +/*------------------------------------------------------------------------* + * case_G_SENDSIGNAL + * +--------+--------+--------+--------+ + * |Send SIG| Parameter1:24 | + * +--------+--------+--------+--------+ + * | Parameter2:32 | + * +--------+--------+--------+--------+ + * Send signal to CPU + */ +#define GZ_INTR_SPBRK1 SP_STATUS_RSPSIGNAL +#define GZ_INTR_SPBRK2 \ + (SP_SET_RSPSIGNAL|SP_CLR_TASKDONE|SP_CLR_YIELDED|SP_SET_INTR) + +#define gSPZSendMessage(pkt) \ + gDma0p((pkt), G_ZS_SENDSIGNAL, GZ_INTR_SPBRK2, GZ_INTR_SPBRK1) +#define gsSPZSendMessage() \ + gsDma0p(G_ZS_SENDSIGNAL, GZ_INTR_SPBRK2, GZ_INTR_SPBRK1) + +/*------------------------------------------------------------------------* + * case_G_WAITSIGNAL + * +--------+--------+--------+--------+ + * |Wait SIG| Phy Adrs of signal buf:24| + * +--------+--------+--------+--------+ + * | Parameter:32 | + * +--------+--------+--------+--------+ + * Wait signal from CPU + */ +#define gSPZWaitSignal(pkt, adrs, param) \ + gDma0p((pkt), G_ZS_WAITSIGNAL, (param), (adrs)) + +#define gsSPZWaitSignal(adrs, param) \ +{ \ + (unsigned int)((char *)(adrs)+((G_ZS_WAITSIGNAL-0x80)<<24)), \ + (unsigned int)(param) \ +} + +#define GZ_SENDSIGNAL(adrs,val) { \ + IO_WRITE(&(((zSignal *)(adrs))->t.signal), (val)); \ + IO_WRITE(SP_STATUS_REG, SP_SET_CPUSIGNAL); \ +} + +/*------------------------------------------------------------------------* + * case_G_SETSUBDL + * +--------+--------+--------+--------+ + * |SETSUBDL| 0 | + * +--------+--------+--------+--------+ + * | DL:32 | + * +--------+--------+--------+--------+ + */ +#define gSPZSetSubDL(pkt, dl) gImmp1((pkt), G_ZS_SETSUBDL, (u32)(dl)) +#define gsSPZSetSubDL(dl) gsImmp1(G_ZS_SETSUBDL, (u32)(dl)) + +/*------------------------------------------------------------------------* + * case_G_LINKSUBDL + * +--------+--------+--------+--------+ + * |LINKSUBD| 0 | + * +--------+--------+--------+--------+ + * | 0 | + * +--------+--------+--------+--------+ + */ +#define gSPZLinkSubDL(pkt) gImmp0((pkt), G_ZS_LINKSUBDL) +#define gsSPZLinkSubDL() gsImmp0(G_ZS_LINKSUBDL) + +/*------------------------------------------------------------------------* + * case_G_MULT_MPMTX + * +--------+--------+--------+--------+ + * |MULT_MPM| 0 | Mid:8 | + * +--------+--------+----+---+--------+ + * | Num:8 | Src:12 | Dest:12 | + * +--------+-------------+------------+ + */ +#define gSPZMultMPMtx(pkt, mid, src, num, dest) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_ZS_MULT_MPMTX,24,8)|_SHIFTL((mid),0,8); \ + _g->words.w1 = _SHIFTL(((num)-1), 24, 8)| \ + _SHIFTL((src)+1024,12,12)|_SHIFTL((dest)+1024, 0,12); \ +} + +#define gsSPZMultMPMtx(mid, src, num, dest) \ +{ \ + _SHIFTL(G_ZS_MULT_MPMTX,24,8)|_SHIFTL((mid),0, 8), \ + _SHIFTL(((num)-1), 24, 8)| \ + _SHIFTL((src)+1024,12,12)|_SHIFTL((dest)+1024,0,12) \ +} + +/*------------------------------------------------------------------------* + * case_G_MTXCAT + * +--------+--------+--------+--------+ + * | MTXCAT | 0 | 0 | MidS:8 | + * +--------+--------+--------+--------+ + * | 0 | MidT:8 | 0 | MidD:8 | + * +--------+--------+--------+--------+ + */ +#define gSPZMtxCat(pkt, midS, midT, midD) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_ZS_MTXCAT,24,8)|_SHIFTL((midS), 0,8); \ + _g->words.w1 = _SHIFTL((midT), 16,8)|_SHIFTL((midD), 0,8); \ +} + +#define gsSPZMtxCat(midS, midT, midD) \ +{ \ + _SHIFTL(G_ZS_MTXCAT,24,8)|_SHIFTL((midS), 0,8), \ + _SHIFTL((midT), 16,8)|_SHIFTL((midD), 0,8) \ +} + +/*------------------------------------------------------------------------* + * case_G_MTXTRNSP + * +--------+--------+--------+--------+ + * |MTXTRNSP| 0 | 0 | 0 | + * +--------+--------+--------+--------+ + * | 0 | 0 | 0 | Mid:8 | + * +--------+--------+--------+--------+ + */ +#define gSPZMtxTrnsp3x3(pkt, mid) gImmp1((pkt), G_ZS_MTXTRNSP, (mid)) +#define gsSPZMtxTrnsp3x3(mid) gsImmp1(G_ZS_MTXTRNSP, (mid)) + +/*------------------------------------------------------------------------* + * case_G_XFMLIGHT + * +--------+--------+--------+--------+ + * |XFMLIGHT| 0 | Mid:8 | + * +--------+----+---+----+---+--------+ + * | 0 | Lnum:8 | Lptr:12 | + * +--------+----+---+----+---+--------+ + */ +#define gSPZXfmLights(pkt, mid, umem, lnum) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_ZS_XFMLIGHT,24,8)|(mid); \ + _g->words.w1 = _SHIFTL((lnum)-1,12,8)|_SHIFTL((umem)+1024, 0,12); \ +} + +#define gsSPZXfmLights(mid, umem, lnum) \ +{ \ + _SHIFTL(G_ZS_XFMLIGHT,24,8)|(mid), \ + _SHIFTL((lnum)-1,12,8)|_SHIFTL((umem)+1024, 0,12) \ +} + +/*------------------------------------------------------------------------* + * case_G_LIGHTING + * +--------+-------------+------------+ + * |LIGHTING| Color:12 | Norm:12 | + * +--------+-------------+------------+ + * | Num:8 | DestColor:12| DestTxtr:12| + * +--------+-------------+------------+ + * gSPZLight/gSPZLightMaterial + */ +#define gSPZLightMaterial(pkt, csrc, nsrc, num, cdest, tdest) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_ZS_LIGHTING,24,8)| \ + _SHIFTL((csrc)+1024, 12,12)|_SHIFTL((nsrc) +1024,0,12);\ + _g->words.w1 = _SHIFTL((num)-1, 24, 8)| \ + _SHIFTL((cdest)+1024,12,12)|_SHIFTL((tdest)+1024,0,12);\ +} + +#define gsSPZLightMaterial(csrc, nsrc, num, cdest, tdest) \ +{ \ + _SHIFTL(G_ZS_LIGHTING,24,8)| \ + _SHIFTL((csrc)+1024, 12,12)|_SHIFTL((nsrc) +1024,0,12), \ + _SHIFTL((num)-1, 24, 8)| \ + _SHIFTL((cdest)+1024,12,12)|_SHIFTL((tdest)+1024,0,12) \ +} + +#define gSPZLight(pkt, nsrc, num, cdest, tdest) \ + gSPZLightMaterial((pkt),-16,(nsrc),(num),(cdest),(tdest)) +#define gsSPZLight(nsrc, num, cdest, tdest) \ + gsSPZLightMaterial(-16,(nsrc),(num),(cdest),(tdest)) + +/*------------------------------------------------------------------------* + * case_G_INTERPOLATE + * +--------+--------+-----------------+ + * |INTERPLT| Type:8 | Factor:16 | + * +--------+--------+----+------------+ + * | Num:8 | Src1/Dest:12| Src2:12 | + * +--------+-------------+------------+ + */ +#define GZ_INTRP_S16 0 +#define GZ_INTRP_S8 2 +#define GZ_INTRP_U8 4 + +#define gSPZMix(pkt, src1, src2, num, factor, type) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_ZS_INTERPOLATE,24,8)| \ + _SHIFTL((type),16, 8)|_SHIFTL((factor),0,16); \ + _g->words.w1 = _SHIFTL((num)/8-1,24,8)| \ + _SHIFTL((src1),12,12)|_SHIFTL((src2), 0,12); \ +} + +#define gsSPZMix(src1, src2, num, factor, type) \ +{ \ + _SHIFTL(G_ZS_INTERPOLATE,24,8)| \ + _SHIFTL((type),16, 8)|_SHIFTL((factor),0,16), \ + _SHIFTL(((num)-1)/8,24,8)| \ + _SHIFTL((src1),12,12)|_SHIFTL((src2), 0,12) \ +} + +#define gSPZMixS16(pkt, src1, src2, num, factor) \ + gSPZMix((pkt), (src1), (src2), (num), (factor), GZ_INTRP_S16) +#define gSPZMixS8(pkt, src1, src2, num, factor) \ + gSPZMix((pkt), (src1), (src2), (num), (factor), GZ_INTRP_S8) +#define gSPZMixU8(pkt, src1, src2, num, factor) \ + gSPZMix((pkt), (src1), (src2), (num), (factor), GZ_INTRP_U8) + +#define gsSPZMixS16(src1, src2, num, factor) \ + gsSPZMix((src1), (src2), (num), (factor), GZ_INTRP_S16) +#define gsSPZMixS8(src1, src2, num, factor) \ + gsSPZMix((src1), (src2), (num), (factor), GZ_INTRP_S8) +#define gsSPZMixU8(src1, src2, num, factor) \ + gsSPZMix((src1), (src2), (num), (factor), GZ_INTRP_U8) + +/*------------------------------------------------------------------------* + * Compatible GBIs + *------------------------------------------------------------------------*/ +#define gSPZSegment(pkt, segment, base) gSPSegment((pkt), (segment), (base)) +#define gsSPZSegment(segment, base) gsSPSegment((segment), (base)) +#define gSPZPerspNormalize(pkt, s) gSPPerspNormalize((pkt), (s)) +#define gsSPZPerspNormalize(s) gsSPPerspNormalize(s) +#define gSPZDisplayList(pkt, dl) gSPDisplayList((pkt), (dl)) +#define gsSPZDisplayList(dl) gsSPDisplayList(dl) +#define gSPZEndDisplayList(pkt) gSPEndDisplayList(pkt) +#define gsSPZEndDisplayList() gsSPEndDisplayList() + +/*===========================================================================* + * Data structures for ZSort microcode + *===========================================================================*/ + +#define G_ZOBJ_NONE 0x80000000 + +/* ZObject IDs */ +#define ZH_NULL 0 +#define ZH_SHTRI 1 +#define ZH_TXTRI 2 +#define ZH_SHQUAD 3 +#define ZH_TXQUAD 4 +#define ZHDR(pointer, type) ((type)+((u32)(pointer))) + +/*===========================================================================* + * Useful MACRO + *===========================================================================*/ +#define guZFixLookAt(lp) \ + { (lp)->l[1].l.col[1] = (lp)->l[1].l.colc[1] = 0x00; } + +#if (defined(_LANGUAGE_C)||defined(_LANGUAGE_C_PLUS_PLUS)) +/*------------------------------------------------------------------------*/ +/* ZMath: Vertex structure format */ + +/*-----------------------------------------------------*/ +#define ZSIZE_VSRC 6 + +typedef struct { s16 x,y,z; } zVtxSrc; + +/*-----------------------------------------------------*/ +#define ZSIZE_VDEST 16 + +typedef struct { + s16 sx, sy; + s32 invw; + s16 xi, yi; + u8 cc; + u8 fog; + s16 wi; +} zVtxDest; + +#define GZ_CC_RIGHT 0x01 +#define GZ_CC_TOP 0x02 +#define GZ_CC_NEAR 0x04 +#define GZ_CC_LEFT 0x10 +#define GZ_CC_BOTTOM 0x20 +#define GZ_CC_FAR 0x40 + +/*-----------------------------------------------------*/ +#define ZSIZE_NSRC 3 + +typedef struct { s8 nx,ny,nz; } zNorm; + +/*-----------------------------------------------------*/ +#define ZSIZE_CSRC 4 +#define ZSIZE_CDEST 4 + +typedef struct { u8 r, g, b, a; } zColor_t; +typedef union { + zColor_t n; + u32 w; +} zColor; + +/*-----------------------------------------------------*/ +#define ZSIZE_TDEST 4 + +typedef struct { s16 s, t; } zTxtr_t; +typedef union { + zTxtr_t n; + u32 w; +} zTxtr; + +/*-----------------------------------------------------*/ +#define ZSIZE_LIGHT 24 +#define ZSIZE_DEFUSE 16 +#define ZSIZE_AMBIENT 8 + +/*------------------------------------------------------------------------*/ +/* ZObject: Common header */ +typedef struct { + u32 header; + Gfx *rdpcmd1; +} zHeader_t; + +typedef union { + zHeader_t t; + u64 force_structure_alignment; +} zHeader; + +/*------------------------------------------------------------------------*/ +/* ZObject: Null Node */ +typedef struct { + zHeader *header; + Gfx *rdpcmd1; + Gfx *rdpcmd2; + Gfx *rdpcmd3; +} zNull_t; + +typedef union { + zNull_t t; + u64 force_structure_alignment; +} zNull; + +/*------------------------------------------------------------------------*/ +/* ZObject: Smooth Shaded Triangle */ +typedef struct { + s16 x, y; + u8 r, g, b, a; +} zShVtx; + +/*------------------------------------------------------------------------*/ +typedef struct { + zHeader *header; + Gfx *rdpcmd1; + zShVtx v[3]; +} zShTri_t; + +typedef struct { + zHeader *header; + Gfx *rdpcmd1; + u32 xy0, clr0; + u32 xy1, clr1; + u32 xy2, clr2; +} zShTri_w; + +typedef union { + zShTri_t t; + zShTri_w w; + u64 force_structure_alignment; +} zShTri; + +/*------------------------------------------------------------------------*/ +/* ZObject: Smooth Shaded Quadrangle */ +typedef struct { + zHeader *header; + Gfx *rdpcmd1; + zShVtx v[4]; +} zShQuad_t; + +typedef struct { + zHeader *header; + Gfx *rdpcmd1; + u32 xy0, clr0; + u32 xy1, clr1; + u32 xy2, clr2; + u32 xy3, clr3; +} zShQuad_w; + +typedef union { + zShQuad_t t; + zShQuad_w w; + u64 force_structure_alignment; +} zShQuad; + +/*------------------------------------------------------------------------*/ +/* ZObject: Smooth Shaded and Texture Mapped Triangle */ +typedef struct { + s16 x, y; + u8 r, g, b, a; + s16 s, t; + s32 invw; +} zTxVtx; + +/*------------------------------------------------------------------------*/ +typedef struct { + zHeader *header; + Gfx *rdpcmd1; + Gfx *rdpcmd2; + Gfx *rdpcmd3; + zTxVtx v[3]; +} zTxTri_t; + +typedef struct { + zHeader *header; + Gfx *rdpcmd1; + Gfx *rdpcmd2; + Gfx *rdpcmd3; + u32 xy0, clr0, st0, invw0; + u32 xy1, clr1, st1, invw1; + u32 xy2, clr2, st2, invw2; +} zTxTri_w; + +typedef union { + zTxTri_t t; + zTxTri_w w; + u64 force_structure_alignment; +} zTxTri; + +/*------------------------------------------------------------------------*/ +/* ZObject: Smooth Shaded and Texture Mapped Quadrangle */ +typedef struct { + zHeader *header; + Gfx *rdpcmd1; + Gfx *rdpcmd2; + Gfx *rdpcmd3; + zTxVtx v[4]; +} zTxQuad_t; + +typedef struct { + zHeader *header; + Gfx *rdpcmd1; + Gfx *rdpcmd2; + Gfx *rdpcmd3; + u32 xy0, clr0, st0, invw0; + u32 xy1, clr1, st1, invw1; + u32 xy2, clr2, st2, invw2; + u32 xy3, clr3, st3, invw3; +} zTxQuad_w; + +typedef union { + zTxQuad_t t; + zTxQuad_w w; + u64 force_structure_alignment; +} zTxQuad; + +/*------------------------------------------------------------------------*/ +typedef struct { + u32 signal; + u32 padding; +} zSignal_t; + +typedef union { + zSignal_t t; + u64 force_structure_alignment; +} zSignal; + +/*===========================================================================* + * External functions + *===========================================================================*/ +extern u64 gspZSort_fifoTextStart[], gspZSort_fifoTextEnd[]; +extern u64 gspZSort_fifoDataStart[], gspZSort_fifoDataEnd[]; +extern u64 gspZSort_pl_fifoTextStart[], gspZSort_pl_fifoTextEnd[]; +extern u64 gspZSort_pl_fifoDataStart[], gspZSort_pl_fifoDataEnd[]; +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif +#endif /* _GZSORT_H_ */ + +/*======== End of gzsort.h ========*/ diff --git a/include/ique/PR/leo.h b/include/ique/PR/leo.h new file mode 100755 index 00000000..0cb43e32 --- /dev/null +++ b/include/ique/PR/leo.h @@ -0,0 +1,280 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: leo.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _LEO_H_ +#define _LEO_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ +typedef u32 LEOError; + +typedef u8 LEOSpdlMode; + +typedef u8 LEOStatus; + +typedef struct +{ + u8 drive; /* version of hw */ + u8 driver; /* version of sw */ + u8 deviceType; /* dev type, always 00 */ + u8 ndevices; /* # of devices, always 01 */ +} LEOVersion; + +typedef struct +{ + u32 startLBA; + u32 endLBA; + u32 nbytes; +} LEOCapacity; + +typedef struct +{ + u8 pad; + u8 yearhi; + u8 yearlo; + u8 month; + u8 day; + u8 hour; + u8 minute; + u8 second; +} LEODiskTime; + +typedef struct +{ + u64 lineNumber; + LEODiskTime time; +} LEOSerialNum; + +typedef struct +{ + u8 gameName[4]; + u8 gameVersion; + u8 diskNumber; + u8 ramUsage; + u8 diskUsage; + LEOSerialNum serialNumber; + u8 company[2]; + u8 freeArea[6]; +} LEODiskID; + +typedef struct +{ + LEOCmdHeader header; + union + { + struct + { + u32 lba; + u32 xfer_blks; + void *buff_ptr; + u32 rw_bytes; +#ifdef _LONGCMD + u32 size; +#endif + } readwrite; + struct + { + u32 lba; + } seek; + struct + { + void *buffer_pointer; + } readdiskid; + LEODiskTime time; + struct + { + u8 reserve1; + u8 reserve2; + u8 standby_time; + u8 sleep_time; + u32 reserve3; + } modeselect; + + } data; + +} LEOCmd; + + +#define _nbytes readwrite.rw_bytes +#define _result header.status + + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ +#define LEO_SW_VERSION 6 /* This will be returned by */ + /* LeoInquiry command */ + +#define OS_PRIORITY_LEOMGR OS_PRIORITY_PIMGR + +/* + * Drive Rom offset address + */ +#define DDROM_FONT_START 0x000a0000 +#define DDROM_WAVEDATA_START 0x00140000 + +/* + * Definition for osLeoSpdlMotor() + */ +#define ACTIVE 0 +#define STANDBY 1 +#define SLEEP 2 +#define BRAKE 4 + +#define LEO_MOTOR_ACTIVE 0 +#define LEO_MOTOR_STANDBY 1 +#define LEO_MOTOR_SLEEP 2 +#define LEO_MOTOR_BRAKE 4 + +#define NUM_LBAS 4292 /* total number of LBAs */ + +#define BLK_SIZE_ZONE0 19720 +#define BLK_SIZE_ZONE1 18360 +#define BLK_SIZE_ZONE2 17680 +#define BLK_SIZE_ZONE3 16320 +#define BLK_SIZE_ZONE4 14960 +#define BLK_SIZE_ZONE5 13600 +#define BLK_SIZE_ZONE6 12240 +#define BLK_SIZE_ZONE7 10880 +#define BLK_SIZE_ZONE8 9520 + +#define MAX_BLK_SIZE BLK_SIZE_ZONE0 +#define MIN_BLK_SIZE BLK_SIZE_ZONE8 + +/* + * Error codes + */ +#define LEO_ERROR_GOOD 0 +#define LEO_ERROR_DRIVE_NOT_READY 1 +#define LEO_ERROR_DIAGNOSTIC_FAILURE 2 +#define LEO_ERROR_COMMAND_PHASE_ERROR 3 +#define LEO_ERROR_DATA_PHASE_ERROR 4 +#define LEO_ERROR_REAL_TIME_CLOCK_FAILURE 5 +#define LEO_ERROR_BUSY 8 +#define LEO_ERROR_INCOMPATIBLE_MEDIUM_INSTALLED 11 +#define LEO_ERROR_UNKNOWN_FORMAT 11 +#define LEO_ERROR_NO_SEEK_COMPLETE 21 +#define LEO_ERROR_WRITE_FAULT 22 +#define LEO_ERROR_UNRECOVERED_READ_ERROR 23 +#define LEO_ERROR_NO_REFERENCE_POSITION_FOUND 24 +#define LEO_ERROR_TRACK_FOLLOWING_ERROR 25 +#define LEO_ERROR_TRACKING_OR_SPDL_SERVO_FAILURE 25 +#define LEO_ERROR_INVALID_COMMAND_OPERATION_CODE 31 +#define LEO_ERROR_LBA_OUT_OF_RANGE 32 +#define LEO_ERROR_WRITE_PROTECT_ERROR 33 +#define LEO_ERROR_COMMAND_CLEARED_BY_HOST 34 +#define LEO_ERROR_COMMAND_TERMINATED 34 +#define LEO_ERROR_QUEUE_FULL 35 +#define LEO_ERROR_ILLEGAL_TIMER_VALUE 36 +#define LEO_ERROR_WAITING_NMI 37 +#define LEO_ERROR_DEVICE_COMMUNICATION_FAILURE 41 +#define LEO_ERROR_MEDIUM_NOT_PRESENT 42 +#define LEO_ERROR_POWERONRESET_DEVICERESET_OCCURED 43 +#define LEO_ERROR_RAMPACK_NOT_CONNECTED 44 +#define LEO_ERROR_MEDIUM_MAY_HAVE_CHANGED 47 +#define LEO_ERROR_EJECTED_ILLEGALLY_RESUME 49 + +/* + * Reserved + */ +#define LEO_ERROR_NOT_BOOTED_DISK 45 +#define LEO_ERROR_DIDNOT_CHANGED_DISK_AS_EXPECTED 46 + +/* + * Error codes only used in IPL + */ +#define LEO_ERROR_RTC_NOT_SET_CORRECTLY 48 +#define LEO_ERROR_DIAGNOSTIC_FAILURE_RESET 50 +#define LEO_ERROR_EJECTED_ILLEGALLY_RESET 51 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ +#define GET_ERROR(x) ((x).header.sense) + + +/************************************************************************** + * + * Extern variables + * + */ +extern LEODiskID leoBootID; +extern OSPiHandle *__osDiskHandle; /* For exceptasm to get disk info*/ + + +/************************************************************************** + * + * Function prototypes + * + */ +/* Initialize routine */ +extern s32 LeoCreateLeoManager(OSPri comPri, OSPri intPri, + OSMesg *cmdBuf, s32 cmdMsgCnt); +extern s32 LeoCJCreateLeoManager(OSPri comPri, OSPri intPri, + OSMesg *cmdBuf, s32 cmdMsgCnt); +extern s32 LeoCACreateLeoManager(OSPri comPri, OSPri intPri, + OSMesg *cmdBuf, s32 cmdMsgCnt); +extern u32 LeoDriveExist(void); + +/* Synchronous functions */ +extern s32 LeoClearQueue(void); +extern s32 LeoByteToLBA(s32 startLBA, u32 nbytes, s32 *lbas); +extern s32 LeoLBAToByte(s32 startLBA, u32 nLBAs, s32 *bytes); +extern s32 LeoReadCapacity(LEOCapacity *cap, s32 dir); +extern s32 LeoInquiry(LEOVersion *ver); +extern s32 LeoTestUnitReady(LEOStatus *status); + +/* Asynchronous functions */ +extern s32 LeoSpdlMotor(LEOCmd *cmdBlock, LEOSpdlMode mode, OSMesgQueue *mq); +extern s32 LeoSeek(LEOCmd *cmdBlock, u32 lba, OSMesgQueue *mq); +extern s32 LeoRezero(LEOCmd *cmdBlock, OSMesgQueue *mq); +extern s32 LeoReadWrite(LEOCmd *cmdBlock, s32 direction, + u32 LBA, void *vAddr, u32 nLBAs, OSMesgQueue *mq); +extern s32 LeoReadDiskID(LEOCmd *cmdBlock, LEODiskID *vaddr, OSMesgQueue *mq); +extern s32 LeoSetRTC(LEOCmd *cmdBlock, LEODiskTime *RTCdata, OSMesgQueue *mq); +extern s32 LeoReadRTC(LEOCmd *cmdBlock, OSMesgQueue *mq); +extern s32 LeoModeSelectAsync(LEOCmd *cmdBlock, u32 standby, + u32 sleep, OSMesgQueue *mq); + +/* Font routines */ +extern int LeoGetKAdr(int sjis); +extern int LeoGetAAdr(int code,int *dx,int *dy, int *cy); +extern int LeoGetAAdr2(u32 ccode,int *dx,int *dy, int *cy); + +/* Boot function */ +extern void LeoBootGame(void *entry); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_LEO_H */ diff --git a/include/PR/leoappli.h b/include/ique/PR/leoappli.h old mode 100644 new mode 100755 similarity index 100% rename from include/PR/leoappli.h rename to include/ique/PR/leoappli.h diff --git a/include/ique/PR/leosp.h b/include/ique/PR/leosp.h new file mode 100755 index 00000000..a4897eed --- /dev/null +++ b/include/ique/PR/leosp.h @@ -0,0 +1,50 @@ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/leosp.h,v $ + * + **************************************************************************/ + +#ifndef _LEOSP_H_ +#define _LEOSP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#ifndef _LONGCMD +#define _LONGCMD +#endif + +#include + +#define LEO_COMMAND_READ_LONG 0x10 +#define LEO_COMMAND_WRITE_LONG 0x11 +#define LEO_COMMAND_READ_SECTOR 0x12 + +#define LEO_CONTROL_ND 0x40 /* no defect mode */ +#define LEO_CONTROL_LONG 0x01 /* do long read/write */ + + +#define LEO_ERROR_RTC_NOT_SET_CORRECTLY 48 +#define LEO_ERROR_ILLEGAL_SECTOR_SIZE 91 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +extern s32 LeoReadWriteLong(LEOCmd *cmdBlock, s32 direction, + s32 LBA, void *vAddr, u32 nLBAs, + u32 secSize, OSMesgQueue *mq); +extern s32 LeoSectorRead(LEOCmd *cmdBlock, s32 LBA, void *vAddr, + u32 nLBAs, OSMesgQueue *mq); +extern s32 LeoSysReadWrite(LEOCmd *cmdBlock, s32 direction, + s32 LBA, void *vAddr, u32 nLBAs, OSMesgQueue *mq); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_LEOSP_H */ diff --git a/include/PR/libaudio.h b/include/ique/PR/libaudio.h similarity index 100% rename from include/PR/libaudio.h rename to include/ique/PR/libaudio.h diff --git a/include/ique/PR/mbi.h b/include/ique/PR/mbi.h new file mode 100755 index 00000000..a63824e7 --- /dev/null +++ b/include/ique/PR/mbi.h @@ -0,0 +1,100 @@ +#ifndef _MBI_H_ +#define _MBI_H_ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/mbi.h,v $ + * + **************************************************************************/ + +/* + * Header file for the Media Binary Interface + * + * NOTE: This file is included by the RSP microcode, so any C-specific + * constructs must be bracketed by #ifdef _LANGUAGE_C + * + */ + + +/* + * the SHIFT macros are used to build display list commands, inserting + * bit-fields into a 32-bit word. They take a value, a shift amount, + * and a width. + * + * For the left shift, the lower bits of the value are masked, + * then shifted left. + * + * For the right shift, the value is shifted right, then the lower bits + * are masked. + * + * (NOTE: _SHIFTL(v, 0, 32) won't work, just use an assignment) + * + */ +#define _SHIFTL(v, s, w) \ + ((unsigned int) (((unsigned int)(v) & ((0x01 << (w)) - 1)) << (s))) +#define _SHIFTR(v, s, w) \ + ((unsigned int)(((unsigned int)(v) >> (s)) & ((0x01 << (w)) - 1))) + +#define _SHIFT _SHIFTL /* old, for compatibility only */ + +#define G_ON (1) +#define G_OFF (0) + +/************************************************************************** + * + * Graphics Binary Interface + * + **************************************************************************/ + +#include + +/************************************************************************** + * + * Audio Binary Interface + * + **************************************************************************/ + +#include + +/************************************************************************** + * + * Task list + * + **************************************************************************/ + +#define M_GFXTASK 1 +#define M_AUDTASK 2 +#define M_VIDTASK 3 +#define M_HVQTASK 6 +#define M_HVQMTASK 7 + +/************************************************************************** + * + * Segment macros and definitions + * + **************************************************************************/ + +#define NUM_SEGMENTS (16) +#define SEGMENT_OFFSET(a) ((unsigned int)(a) & 0x00ffffff) +#define SEGMENT_NUMBER(a) (((unsigned int)(a) << 4) >> 28) +#define SEGMENT_ADDR(num, off) (((num) << 24) + (off)) + +#ifndef NULL +#define NULL 0 +#endif + +#endif /* !_MBI_H_ */ diff --git a/include/PR/n_libaudio.h b/include/ique/PR/n_libaudio.h old mode 100644 new mode 100755 similarity index 100% rename from include/PR/n_libaudio.h rename to include/ique/PR/n_libaudio.h diff --git a/include/PR/n_libaudio_s_to_n.h b/include/ique/PR/n_libaudio_s_to_n.h old mode 100644 new mode 100755 similarity index 100% rename from include/PR/n_libaudio_s_to_n.h rename to include/ique/PR/n_libaudio_s_to_n.h diff --git a/include/ique/PR/os.h b/include/ique/PR/os.h new file mode 100755 index 00000000..a44ed17b --- /dev/null +++ b/include/ique/PR/os.h @@ -0,0 +1,108 @@ + +/*==================================================================== + * os.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os.h,v $ + $Revision: 1.1.1.2 $ + $Date: 2002/10/29 08:06:34 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_H_ +#define _OS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Stack size for I/O device managers: PIM (PI Manager), VIM (VI Manager), + * SIM (SI Manager) + * + */ +#define OS_PIM_STACKSIZE 4096 +#define OS_VIM_STACKSIZE 4096 +#define OS_SIM_STACKSIZE 4096 + +#define OS_MIN_STACKSIZE 72 + +/* + * Leo Disk + */ + +/* transfer mode */ + +#define LEO_BLOCK_MODE 1 +#define LEO_TRACK_MODE 2 +#define LEO_SECTOR_MODE 3 + +/* + * Boot addresses + */ +#define BOOT_ADDRESS_ULTRA 0x80000400 +#define BOOT_ADDRESS_COSIM 0x80002000 +#define BOOT_ADDRESS_EMU 0x20010000 +#define BOOT_ADDRESS_INDY 0x88100000 + + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_H */ diff --git a/include/ique/PR/os_ai.h b/include/ique/PR/os_ai.h new file mode 100755 index 00000000..0aa0b0d7 --- /dev/null +++ b/include/ique/PR/os_ai.h @@ -0,0 +1,92 @@ + +/*==================================================================== + * os_ai.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_ai.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_AI_H_ +#define _OS_AI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Audio interface (Ai) */ +extern u32 osAiGetStatus(void); +extern u32 osAiGetLength(void); +extern s32 osAiSetFrequency(u32); +extern s32 osAiSetNextBuffer(void *, u32); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_AI_H_ */ diff --git a/include/ique/PR/os_bb.h b/include/ique/PR/os_bb.h new file mode 100644 index 00000000..a7a92d89 --- /dev/null +++ b/include/ique/PR/os_bb.h @@ -0,0 +1,111 @@ +/*---------------------------------------------------------------------* + Copyright (C) 2002 BroadOn Communications. + + $RCSfile: os_bb.h,v $ + $Revision: 1.13 $ + $Date: 2004/06/28 22:34:42 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_BB_H_ +#define _OS_BB_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* BB Player Events */ +#define OS_EVENT_FLASH 23 /* flash ctrl interrupt */ +#define OS_EVENT_AES 24 /* aes ctrl interrupt */ +#define OS_EVENT_IDE 25 /* io interface interrupt */ +#define OS_EVENT_PI_ERR 26 /* pi error interrupt */ +#define OS_EVENT_USB0 27 /* usb0 interrupt */ +#define OS_EVENT_USB1 28 /* usb1 interrupt */ +#define OS_EVENT_BUT 29 /* button interrupt */ +#define OS_EVENT_MD 30 /* module detect interrupt */ +#define OS_EVENT_DBG_WAIT_BRK 31 /* waiting for breakpoint */ +#define OS_EVENT_RDB_READ_RESET 32 /* RDB was reset */ +#define OS_EVENT_RDB_DATA_RESET 33 /* RDB was reset */ +#define OS_NUM_EVENTS 34 /* contradicts os_message.h */ + +/* BB Player I/O Messages */ +#define OS_MESG_TYPE_FLASH (OS_MESG_TYPE_BASE+7) +#define OS_MESG_TYPE_MD (OS_MESG_TYPE_BASE+8) +#define OS_MESG_TYPE_RDB_READ_DONE (OS_MESG_TYPE_BASE+9) +#define OS_MESG_TYPE_RDB_READ_RESET (OS_MESG_TYPE_BASE+10) +#define OS_MESG_TYPE_RDB_DATA_DONE (OS_MESG_TYPE_BASE+11) +#define OS_MESG_TYPE_RDB_DATA_RESET (OS_MESG_TYPE_BASE+12) + +/* Stack sizes for managers */ +#define OS_CARDM_STACKSIZE 4096 + +#include "os.h" +#include "os_bbcard.h" +#include "os_bbfs.h" +#include "os_usb.h" +#include "os_bbatb.h" +#include "os_bbexec.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +extern void osBbPowerOff(void); +extern void osBbPowerOn(void); +extern void osBbSetErrorLed(u32 value); +extern u32 osBbGetErrorLed(void); +extern u32 osBbGetBoxId(void); +extern s32 osBbExecFile(s32 fd, const char *name, OSBbLaunchMetaData *md, + u8 buffer[16*1024]); +extern void osBbRtcInit(void); +extern void osBbRtcSet(u8 year, u8 month, u8 day, u8 dow, u8 hour, u8 min, + u8 sec); +extern void osBbRtcGet(u8* year, u8* month, u8* day, u8* dow, u8* hour, u8* min, + u8* sec); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_BB_H_ */ diff --git a/include/ique/PR/os_bb_export.h b/include/ique/PR/os_bb_export.h new file mode 100755 index 00000000..49eae36b --- /dev/null +++ b/include/ique/PR/os_bb_export.h @@ -0,0 +1,30 @@ +/*---------------------------------------------------------------------* + Copyright (C) 2002 - 2004 BroadOn Communications. + *---------------------------------------------------------------------*/ + +#ifndef _OS_BB_H_ +#define _OS_BB_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Function prototypes + * + */ +extern void osBbRtcGet(u8* year, u8* month, u8* day, u8* dow, u8* hour, u8* min, + u8* sec); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_BB_H_ */ diff --git a/include/ique/PR/os_bbcard.h b/include/ique/PR/os_bbcard.h new file mode 100755 index 00000000..d2f950c0 --- /dev/null +++ b/include/ique/PR/os_bbcard.h @@ -0,0 +1,71 @@ +#ifndef _os_bb_card_h_ +#define _os_bb_card_h_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +#define BBCARD_ERR_NO_CARD (-1) /* no card present */ +#define BBCARD_ERR_FAIL (-2) /* operation failed */ +#define BBCARD_ERR_INVALID (-3) /* invalid parameters */ +#define BBCARD_ERR_CHANGED (-4) /* card changed */ + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +extern void osBbCardInit(void); +extern s32 osBbCardProbe(u32 dev); +extern s32 osBbCardUnhappy(void); +extern u32 osBbCardBlocks(u32 dev); +extern s32 osBbCardStatus(u32 dev, u8 *status); +extern s32 osBbCardReadId(u32 dev, u32 *mfg, u32* type); +extern s32 osBbCardEraseBlock(u32 dev, u16 block); +extern s32 osBbCardEraseBlocks(u32 dev, const u16 block[], u32 n); +extern s32 osBbCardReadBlock(u32 dev, u16 block, void* addr, void* spare); +extern s32 osBbCardWriteBlock(u32 dev, u16 block, const void* addr, + const void* spare); +extern s32 osBbCardWriteBlocks(u32 dev, const u16 block[], u32 n, + const void* addr, const void* spare); +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif +#endif diff --git a/include/ique/PR/os_bbexec.h b/include/ique/PR/os_bbexec.h new file mode 100644 index 00000000..3071e25b --- /dev/null +++ b/include/ique/PR/os_bbexec.h @@ -0,0 +1,72 @@ +#ifndef __os_bb_metadata_h__ +#define __os_bb_metadata_h__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +typedef struct { + u32 eepromAddress; + u32 eepromSize; + u32 flashAddress; + u32 flashSize; + u32 sramAddress; + u32 sramSize; + u32 pakAddress[MAXCONTROLLERS]; + u32 pakSize; +} OSBbStateVector; + +typedef struct { + OSBbStateVector state; + + u32 romBase; + s32 tvType; + u32 memSize; + u32 errataSize; + u32 errataAddress; + + u32 magic; +} OSBbLaunchMetaData; + +#define BB_METADATA_MAGIC 0x43414d00 +#define BB_MAX_AUXDATA_SIZE 32768 +#define BB_MAX_AUXDATA 16 +#define BB_STATENAME_LEN 16 + +/* Extract permitted auxdata from the metadata */ +#define BB_AUXDATA_COUNT(md) ((md)->magic & 0xFF) + +extern s32 osBbSaveState(char stateName[] /* OUTPUT, 8.3 filename */, BbTicketId* tid); +extern s32 osBbLoadState(const char *name, BbTicketId tid, OSBbStateVector *sv, s32 bindings[MAXCONTROLLERS]); +extern s32 osBbGetLaunchMetaData(OSBbLaunchMetaData *md, u16 *blockList, s32 listSize); +extern u32 osBbLoadApp(OSBbLaunchMetaData *md, u16* blockList, s32 listSize, s32 loadAll); +extern s32 osBbExecApp(u32 addr); +extern s32 osBbVerifyFile(const char *name, u8 block[BB_FL_BLOCK_SIZE]); +extern s32 osBbVerifySig(const char *name, BbEccSig sig, u8 block[BB_FL_BLOCK_SIZE]); +extern s32 osBbSignFile(const char *name, u8 block[BB_FL_BLOCK_SIZE]); +extern s32 osBbDeleteSignedFile(const char *name, u8 block[BB_FL_BLOCK_SIZE]); + +extern void osBbInitState(const char *name); +extern s32 osBbAuxDataGetLimit(); +extern s32 osBbAuxDataSetLimit(u8 limit); + +/* State functions to be used by games */ +extern s32 osBbGameCommitState(); +extern s32 osBbAuxDataInit(void* buf, u32 len); +extern s32 osBbAuxDataSave(u8 id, const void* buf, u32 len); +extern s32 osBbAuxDataLoad(u8 id, void* buf, u32 len); +extern s32 osBbAuxDataDelete(u8 id); +extern s32 osBbAuxDataSize(u8 id); +extern s32 osBbAuxDataIds(u8 ids[BB_MAX_AUXDATA]); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif diff --git a/include/ique/PR/os_bbexec_export.h b/include/ique/PR/os_bbexec_export.h new file mode 100755 index 00000000..bc0fed79 --- /dev/null +++ b/include/ique/PR/os_bbexec_export.h @@ -0,0 +1,26 @@ +#ifndef __os_bb_exec_h__ +#define __os_bb_exec_h__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +#define BB_MAX_AUXDATA 16 + +extern s32 osBbGameCommitState(); +extern s32 osBbAuxDataInit(void* buf, u32 len); +extern s32 osBbAuxDataSave(u8 id, const void* buf, u32 len); +extern s32 osBbAuxDataLoad(u8 id, void* buf, u32 len); +extern s32 osBbAuxDataDelete(u8 id); +extern s32 osBbAuxDataSize(u8 id); +extern s32 osBbAuxDataIds(u8 ids[BB_MAX_AUXDATA]); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* __os_bb_exec_h__ */ diff --git a/include/ique/PR/os_bbfs.h b/include/ique/PR/os_bbfs.h new file mode 100644 index 00000000..2b1aec5b --- /dev/null +++ b/include/ique/PR/os_bbfs.h @@ -0,0 +1,108 @@ +#ifndef __os_bb_fs_h__ +#define __os_bb_fs_h__ + +#include +#include + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef struct { +#ifndef WIN32 + u8 root[2*16*1024] __attribute__((aligned(16))); /* room for two FATs */ +#else + u8 root[2*16*1024]; /* room for two FATs */ +#endif +} OSBbFs; + +typedef struct { + u16 files; + u16 blocks; + u16 freeFiles; + u16 freeBlocks; +} OSBbStatFs; + +typedef struct { + char name[BB_INODE16_NAMELEN+2]; /* extra space for '.' and 0 termination */ + u8 type; + u32 size; +} OSBbDirEnt; + +typedef struct { + u8 type; + u32 size; +} OSBbStatBuf; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +#define BBFS_ERR_NO_CARD (-1) /* card not present */ +#define BBFS_ERR_FAIL (-2) /* operation failed */ +#define BBFS_ERR_INVALID (-3) /* invalid parameters */ +#define BBFS_ERR_CHANGED (-4) /* card changed */ +#define BBFS_ERR_UNINIT (-5) /* fs uninitialized */ +#define BBFS_ERR_EXISTS (-6) /* file exists */ +#define BBFS_ERR_SPACE (-7) /* no space */ +#define BBFS_ERR_ENTRY (-8) /* no entry */ + +/* Used for saving auxilliary game state data */ +#define BBFS_ERR_STATE (-9) /* invalid state */ +#define BBFS_ERR_STATE_LIMIT (-10) /* state limit reached */ + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +s32 osBbFInit(OSBbFs* fs); +s32 osBbFStatFs(OSBbStatFs* fs); +s32 osBbFReadDir(OSBbDirEnt* dir, u32 count); +s32 osBbFOpen(const char* name, const char* mode); +s32 osBbFCreate(const char*name, u8 type, u32 len); +s32 osBbFDelete(const char* name); +s32 osBbFRename(const char* old, const char* new); +s32 osBbFClose(s32 fd); +s32 osBbFRead(s32 fd, u32 off, void* buf, u32 len); +s32 osBbFWrite(s32 fd, u32 off, const void* buf, u32 len); +s32 osBbFStat(s32 fd, OSBbStatBuf* sb, u16* blockList, u32 listLen); +s32 osBbFShuffle(s32 sfd, s32 dfd, s32 release, void* buf, u32 len); +s32 osBbFRepairBlock(s32 fd, u32 off, void* buf, u32 len); +s32 osBbFAutoSync(u32 on); +s32 osBbFSync(void); +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif +#endif /*__os_bb_fs_h__*/ diff --git a/include/ique/PR/os_bbfs_export.h b/include/ique/PR/os_bbfs_export.h new file mode 100755 index 00000000..1b7f22af --- /dev/null +++ b/include/ique/PR/os_bbfs_export.h @@ -0,0 +1,41 @@ +#ifndef __os_bb_fs_h__ +#define __os_bb_fs_h__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +#define BBFS_ERR_NO_CARD (-1) /* card not present */ +#define BBFS_ERR_FAIL (-2) /* operation failed */ +#define BBFS_ERR_INVALID (-3) /* invalid parameters */ +#define BBFS_ERR_CHANGED (-4) /* card changed */ +#define BBFS_ERR_UNINIT (-5) /* fs uninitialized */ +#define BBFS_ERR_EXISTS (-6) /* file exists */ +#define BBFS_ERR_SPACE (-7) /* no space */ +#define BBFS_ERR_ENTRY (-8) /* no entry */ + +/* Used for saving auxilliary game state data */ +#define BBFS_ERR_STATE (-9) /* invalid state */ +#define BBFS_ERR_STATE_LIMIT (-10) /* state limit reached */ + +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif +#endif /*__os_bb_fs_h__*/ diff --git a/include/ique/PR/os_cache.h b/include/ique/PR/os_cache.h new file mode 100755 index 00000000..71b35343 --- /dev/null +++ b/include/ique/PR/os_cache.h @@ -0,0 +1,96 @@ + +/*==================================================================== + * os_cache.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_cache.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_CACHE_H_ +#define _OS_CACHE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +#define OS_DCACHE_ROUNDUP_ADDR(x) (void *)(((((u32)(x)+0xf)/0x10)*0x10)) +#define OS_DCACHE_ROUNDUP_SIZE(x) (u32)(((((u32)(x)+0xf)/0x10)*0x10)) + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Cache operations and macros */ + +extern void osInvalDCache(void *, s32); +extern void osInvalICache(void *, s32); +extern void osWritebackDCache(void *, s32); +extern void osWritebackDCacheAll(void); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_CACHE_H_ */ diff --git a/include/ique/PR/os_cont.h b/include/ique/PR/os_cont.h new file mode 100755 index 00000000..bafdbc8a --- /dev/null +++ b/include/ique/PR/os_cont.h @@ -0,0 +1,219 @@ + +/*==================================================================== + * os_cont.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_cont.h,v $ + $Revision: 1.2 $ + $Date: 2004/10/29 00:51:42 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_CONT_H_ +#define _OS_CONT_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for controllers + */ + +typedef struct { + u16 type; /* Controller Type */ + u8 status; /* Controller status */ +#ifndef BBC + u8 errno; +#else + u8 err_no; +#endif +}OSContStatus; + +typedef struct { + u16 button; + s8 stick_x; /* -80 <= stick_x <= 80 */ + s8 stick_y; /* -80 <= stick_y <= 80 */ +#ifndef BBC + u8 errno; +#else + u8 err_no; +#endif +} OSContPad; + +typedef struct { + void *address; /* Ram pad Address: 11 bits */ + u8 databuffer[32]; /* address of the data buffer */ + u8 addressCrc; /* CRC code for address */ + u8 dataCrc; /* CRC code for data */ +#ifndef BBC + u8 errno; +#else + u8 err_no; +#endif +} OSContRamIo; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Controllers number + */ + +#ifndef _HW_VERSION_1 +#define MAXCONTROLLERS 4 +#else +#define MAXCONTROLLERS 6 +#endif + +/* controller errors */ +#define CONT_NO_RESPONSE_ERROR 0x8 +#define CONT_OVERRUN_ERROR 0x4 +#ifdef _HW_VERSION_1 +#define CONT_FRAME_ERROR 0x2 +#define CONT_COLLISION_ERROR 0x1 +#endif + +/* Controller type */ + +#define CONT_ABSOLUTE 0x0001 +#define CONT_RELATIVE 0x0002 +#define CONT_JOYPORT 0x0004 +#define CONT_EEPROM 0x8000 +#define CONT_EEP16K 0x4000 +#define CONT_TYPE_MASK 0x1f07 +#define CONT_TYPE_NORMAL 0x0005 +#define CONT_TYPE_MOUSE 0x0002 +#define CONT_TYPE_VOICE 0x0100 + +/* Controller status */ + +#define CONT_CARD_ON 0x01 +#define CONT_CARD_PULL 0x02 +#define CONT_ADDR_CRC_ER 0x04 +#define CONT_EEPROM_BUSY 0x80 + +/* Buttons */ + +#define CONT_A 0x8000 +#define CONT_B 0x4000 +#define CONT_G 0x2000 +#define CONT_START 0x1000 +#define CONT_UP 0x0800 +#define CONT_DOWN 0x0400 +#define CONT_LEFT 0x0200 +#define CONT_RIGHT 0x0100 +#define CONT_L 0x0020 +#define CONT_R 0x0010 +#define CONT_E 0x0008 +#define CONT_D 0x0004 +#define CONT_C 0x0002 +#define CONT_F 0x0001 + +/* Nintendo's official button names */ + +#define A_BUTTON CONT_A +#define B_BUTTON CONT_B +#define L_TRIG CONT_L +#define R_TRIG CONT_R +#define Z_TRIG CONT_G +#define START_BUTTON CONT_START +#define U_JPAD CONT_UP +#define L_JPAD CONT_LEFT +#define R_JPAD CONT_RIGHT +#define D_JPAD CONT_DOWN +#define U_CBUTTONS CONT_E +#define L_CBUTTONS CONT_C +#define R_CBUTTONS CONT_F +#define D_CBUTTONS CONT_D + +/* Controller error number */ + +#define CONT_ERR_NO_CONTROLLER PFS_ERR_NOPACK /* 1 */ +#define CONT_ERR_CONTRFAIL CONT_OVERRUN_ERROR /* 4 */ +#define CONT_ERR_INVALID PFS_ERR_INVALID /* 5 */ +#define CONT_ERR_DEVICE PFS_ERR_DEVICE /* 11 */ +#define CONT_ERR_NOT_READY 12 +#define CONT_ERR_VOICE_MEMORY 13 +#define CONT_ERR_VOICE_WORD 14 +#define CONT_ERR_VOICE_NO_RESPONSE 15 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Controller interface */ + +extern s32 osContInit(OSMesgQueue *, u8 *, OSContStatus *); +extern s32 osContReset(OSMesgQueue *, OSContStatus *); +extern s32 osContStartQuery(OSMesgQueue *); +extern s32 osContStartReadData(OSMesgQueue *); +#ifndef _HW_VERSION_1 +extern s32 osContSetCh(u8); +#endif +extern void osContGetQuery(OSContStatus *); +extern void osContGetReadData(OSContPad *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_CONT_H_ */ diff --git a/include/ique/PR/os_convert.h b/include/ique/PR/os_convert.h new file mode 100755 index 00000000..3f712545 --- /dev/null +++ b/include/ique/PR/os_convert.h @@ -0,0 +1,111 @@ + +/*==================================================================== + * os_convert.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_convert.h,v $ + $Revision: 1.1.1.2 $ + $Date: 2002/10/29 08:06:34 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_CONVERT_H_ +#define _OS_CONVERT_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#define OS_CLOCK_RATE 62500000LL +#define OS_CPU_COUNTER (OS_CLOCK_RATE*3/4) + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +#define OS_NSEC_TO_CYCLES(n) (((u64)(n)*(OS_CPU_COUNTER/15625000LL))/(1000000000LL/15625000LL)) +#define OS_USEC_TO_CYCLES(n) (((u64)(n)*(OS_CPU_COUNTER/15625LL))/(1000000LL/15625LL)) +#define OS_CYCLES_TO_NSEC(c) (((u64)(c)*(1000000000LL/15625000LL))/(OS_CPU_COUNTER/15625000LL)) +#define OS_CYCLES_TO_USEC(c) (((u64)(c)*(1000000LL/15625LL))/(OS_CPU_COUNTER/15625LL)) + +/* OS_K?_TO_PHYSICAL macro bug fix for CodeWarrior */ +#ifndef __MWERKS__ +#define OS_K0_TO_PHYSICAL(x) (u32)(((char *)(x)-0x80000000)) +#define OS_K1_TO_PHYSICAL(x) (u32)(((char *)(x)-0xa0000000)) +#else +#define OS_K0_TO_PHYSICAL(x) ((char *)(x)-0x80000000) +#define OS_K1_TO_PHYSICAL(x) ((char *)(x)-0xa0000000) +#endif + +#define OS_PHYSICAL_TO_K0(x) (void *)(((u32)(x)+0x80000000)) +#define OS_PHYSICAL_TO_K1(x) (void *)(((u32)(x)+0xa0000000)) + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Address translation routines and macros */ + +extern u32 osVirtualToPhysical(void *); +extern void * osPhysicalToVirtual(u32); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_CONVERT_H_ */ diff --git a/include/ique/PR/os_debug.h b/include/ique/PR/os_debug.h new file mode 100755 index 00000000..35a7bbb3 --- /dev/null +++ b/include/ique/PR/os_debug.h @@ -0,0 +1,117 @@ + +/*==================================================================== + * os_debug.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_debug.h,v $ + $Revision: 1.1.1.2 $ + $Date: 2002/10/29 08:06:34 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_DEBUG_H_ +#define _OS_DEBUG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for Profiler + */ +typedef struct { + u16 *histo_base; /* histogram base */ + u32 histo_size; /* histogram size */ + u32 *text_start; /* start of text segment */ + u32 *text_end; /* end of text segment */ +} OSProf; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Profiler constants + */ +#define PROF_MIN_INTERVAL 50 /* microseconds */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Profiler Interface */ + +extern void osProfileInit(OSProf *, u32 profcnt); +extern void osProfileStart(u32); +extern void osProfileFlush(void); +extern void osProfileStop(void); + +/* Thread Profiler Interface */ +extern void osThreadProfileClear(OSId); +extern void osThreadProfileInit(void); +extern void osThreadProfileStart(void); +extern void osThreadProfileStop(void); +extern u32 osThreadProfileReadCount(OSId); +extern u32 osThreadProfileReadCountTh(OSThread*); +extern OSTime osThreadProfileReadTime(OSId); +extern OSTime osThreadProfileReadTimeTh(OSThread*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_DEBUG_H_ */ diff --git a/include/ique/PR/os_eeprom.h b/include/ique/PR/os_eeprom.h new file mode 100755 index 00000000..050b8a88 --- /dev/null +++ b/include/ique/PR/os_eeprom.h @@ -0,0 +1,107 @@ + +/*==================================================================== + * os_eeprom.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_eeprom.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_EEPROM_H_ +#define _OS_EEPROM_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* EEPROM TYPE */ + +#define EEPROM_TYPE_4K 0x01 +#define EEPROM_TYPE_16K 0x02 + +/* definition for EEPROM */ + +#define EEPROM_MAXBLOCKS 64 +#define EEP16K_MAXBLOCKS 256 +#define EEPROM_BLOCK_SIZE 8 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* EEPROM interface */ + +extern s32 osEepromProbe(OSMesgQueue *); +extern s32 osEepromRead(OSMesgQueue *, u8, u8 *); +extern s32 osEepromWrite(OSMesgQueue *, u8, u8 *); +extern s32 osEepromLongRead(OSMesgQueue *, u8, u8 *, int); +extern s32 osEepromLongWrite(OSMesgQueue *, u8, u8 *, int); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_EEPROM_H_ */ diff --git a/include/ique/PR/os_error.h b/include/ique/PR/os_error.h new file mode 100755 index 00000000..51d4c67a --- /dev/null +++ b/include/ique/PR/os_error.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_error.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_error.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_ERROR_H_ +#define _OS_ERROR_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_ERROR_H_ */ diff --git a/include/ique/PR/os_exception.h b/include/ique/PR/os_exception.h new file mode 100755 index 00000000..d546d5a0 --- /dev/null +++ b/include/ique/PR/os_exception.h @@ -0,0 +1,119 @@ + +/*==================================================================== + * os_exception.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_exception.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_EXCEPTION_H_ +#define _OS_EXCEPTION_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef u32 OSIntMask; +typedef u32 OSHWIntr; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Flags for debugging purpose */ + +#define OS_FLAG_CPU_BREAK 1 /* Break exception has occurred */ +#define OS_FLAG_FAULT 2 /* CPU fault has occurred */ + +/* Interrupt masks */ + +#define OS_IM_NONE 0x00000001 +#define OS_IM_SW1 0x00000501 +#define OS_IM_SW2 0x00000601 +#define OS_IM_CART 0x00000c01 +#define OS_IM_PRENMI 0x00001401 +#define OS_IM_RDBWRITE 0x00002401 +#define OS_IM_RDBREAD 0x00004401 +#define OS_IM_COUNTER 0x00008401 +#define OS_IM_CPU 0x0000ff01 +#define OS_IM_SP 0x00010401 +#define OS_IM_SI 0x00020401 +#define OS_IM_AI 0x00040401 +#define OS_IM_VI 0x00080401 +#define OS_IM_PI 0x00100401 +#define OS_IM_DP 0x00200401 +#define OS_IM_ALL 0x003fff01 +#define RCP_IMASK 0x003f0000 +#define RCP_IMASKSHIFT 16 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Interrupt operations */ + +extern OSIntMask osGetIntMask(void); +extern OSIntMask osSetIntMask(OSIntMask); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_EXCEPTION_H_ */ diff --git a/include/ique/PR/os_flash.h b/include/ique/PR/os_flash.h new file mode 100755 index 00000000..8357a116 --- /dev/null +++ b/include/ique/PR/os_flash.h @@ -0,0 +1,71 @@ +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_flash.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/10/29 08:06:34 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_FLASH_H_ +#define _OS_FLASH_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * defines for FLASH + */ +#define FLASH_START_ADDR 0x08000000 + +#define FLASH_SIZE 0x20000 +#define FLASH_LATENCY 0x5 +#define FLASH_PULSE 0x0c +#define FLASH_PAGE_SIZE 0xf +#define FLASH_REL_DURATION 0x2 +#define DEVICE_TYPE_FLASH 8 + +#define FLASH_VERSION_MX_PROTO_A 0x00c20000 +#define FLASH_VERSION_MX_A 0x00c20001 +#define FLASH_VERSION_MX_C 0x00c2001e +#define FLASH_VERSION_MX_B_AND_D 0x00c2001d +#define FLASH_VERSION_MEI 0x003200f1 + +#define OLD_FLASH 0 +#define NEW_FLASH 1 +/* OLD_FLASH is MX_PROTO_A, MX_A and MX_C */ +/* NEW_FLASH is MX_B_AND_D and MATSUSHITA flash */ + +#define FLASH_STATUS_ERASE_BUSY 2 +#define FLASH_STATUS_ERASE_ERROR -1 +#define FLASH_STATUS_ERASE_OK 0 + +extern OSPiHandle *osFlashReInit(u8 latency, u8 pulse, + u8 page_size, u8 rel_duration, u32 start); +extern OSPiHandle *osFlashInit(void); +extern void osFlashReadStatus(u8 *flash_status); +extern void osFlashReadId(u32 *flash_type, u32 *flash_maker); +extern void osFlashClearStatus(void); +extern s32 osFlashAllErase(void); +extern s32 osFlashSectorErase(u32 page_num); +extern s32 osFlashWriteBuffer(OSIoMesg *mb, s32 priority, + void *dramAddr, OSMesgQueue *mq); +extern s32 osFlashWriteArray(u32 page_num); +extern s32 osFlashReadArray(OSIoMesg *mb, s32 priority, u32 page_num, + void *dramAddr, u32 n_pages, OSMesgQueue *mq); +extern void osFlashChange(u32 flash_num); +extern void osFlashAllEraseThrough(void); +extern void osFlashSectorEraseThrough(u32 page_num); +extern s32 osFlashCheckEraseEnd(void); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_FLASH_H_ */ diff --git a/include/ique/PR/os_gbpak.h b/include/ique/PR/os_gbpak.h new file mode 100755 index 00000000..fa6aaddc --- /dev/null +++ b/include/ique/PR/os_gbpak.h @@ -0,0 +1,107 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_gbpak.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_GBPAK_H_ +#define _OS_GBPAK_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" +#include "os_pfs.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef struct { + u16 fixed1; + u16 start_address; + u8 nintendo_chr[0x30]; + u8 game_title[16]; + u16 company_code; + u8 body_code; + u8 cart_type; + u8 rom_size; + u8 ram_size; + u8 country_code; + u8 fixed2; + u8 version; + u8 isum; + u16 sum; +} OSGbpakId; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* definition for 64GB-PAK */ + +#define OS_GBPAK_POWER 0x01 +#define OS_GBPAK_RSTB_DETECTION 0x04 +#define OS_GBPAK_RSTB_STATUS 0x08 +#define OS_GBPAK_GBCART_PULL 0x40 +#define OS_GBPAK_GBCART_ON 0x80 + +#define OS_GBPAK_POWER_OFF 0x00 /* power of 64GB-PAK */ +#define OS_GBPAK_POWER_ON 0x01 + +#define OS_GBPAK_ROM_ID_SIZE 0x50 /* ID size of GB cartridge */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* 64GB-PAK */ +extern s32 osGbpakInit(OSMesgQueue *, OSPfs *, int); +extern s32 osGbpakPower(OSPfs *, s32); +extern s32 osGbpakGetStatus(OSPfs *, u8 *); +extern s32 osGbpakReadWrite(OSPfs *, u16, u16, u8 *, u16); +extern s32 osGbpakReadId(OSPfs *, OSGbpakId *, u8 *); +extern s32 osGbpakCheckConnector(OSPfs *, u8 *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_GBPAK_H_ */ diff --git a/include/ique/PR/os_gio.h b/include/ique/PR/os_gio.h new file mode 100755 index 00000000..d274b97d --- /dev/null +++ b/include/ique/PR/os_gio.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_gio.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_gio.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_GIO_H_ +#define _OS_GIO_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_GIO_H_ */ diff --git a/include/ique/PR/os_host.h b/include/ique/PR/os_host.h new file mode 100755 index 00000000..8cb72e74 --- /dev/null +++ b/include/ique/PR/os_host.h @@ -0,0 +1,170 @@ + +/*==================================================================== + * os_host.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_host.h,v $ + $Revision: 1.2 $ + $Date: 2004/06/28 22:34:42 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_HOST_H_ +#define _OS_HOST_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +extern void __osInitialize_common(void); + +#if defined(_FINALROM) + +#define osInitialize() __osInitialize_common() + +#else + +/* PARTNER-N64 */ +#if defined(PTN64) +extern void __osInitialize_kmc(void); +#define osReadHost osReadHost_pt +#define osWriteHost osWriteHost_pt +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_kmc(); \ +} + +/* MONEGI SMART PACK A */ +#elif defined(MWN64) +extern void __osInitialize_msp(void); +#define osReadHost osReadHost_pt +#define osWriteHost osWriteHost_pt +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_msp(); \ +} + +/* IS-Viewer(for Debugger) */ +#elif defined(ISV64) +extern void __osInitialize_isv(void); +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_isv(); \ +} + +/* Emulation board for INDY */ +#elif defined(EMU64) +extern void __osInitialize_emu(void); +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_emu(); \ +} + +#else +/* Default (auto detect) */ +extern void __osInitialize_autodetect(void); +extern void __osInitialize_msp(void); +extern void __osInitialize_kmc(void); +extern void __osInitialize_isv(void); +extern void __osInitialize_emu(void); +#define osInitialize() \ +{ \ + __osInitialize_common(); \ + __osInitialize_autodetect(); \ +} +#endif + +#endif /* _FINAL_ROM */ + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Game <> Host data transfer functions */ + +extern s32 osTestHost(void); +extern void osReadHost(void *, u32); +extern void osWriteHost(void *, u32); +extern void osAckRamromRead(void); +extern void osAckRamromWrite(void); + +#ifdef BBPLAYER +/* BB versions of osReadHost and osWriteHost that returns upon error */ +extern s32 osBbReadHost(void *, u32); +extern s32 osBbWriteHost(void *, u32); +#endif + +/* RDB port operations */ + +extern void osInitRdb(u8 *sendBuf, u32 sendSize); + +#ifdef BBPLAYER +extern void osResetRdb(); +#endif + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_HOST_H_ */ diff --git a/include/ique/PR/os_internal.h b/include/ique/PR/os_internal.h new file mode 100755 index 00000000..ff2dc227 --- /dev/null +++ b/include/ique/PR/os_internal.h @@ -0,0 +1,49 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_H_ +#define _OS_INTERNAL_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +#include "os_internal_reg.h" +#include "os_internal_exception.h" +#include "os_internal_tlb.h" +#include "os_internal_si.h" +#include "os_internal_rsp.h" +#include "os_internal_error.h" +#include "os_internal_gio.h" +#include "os_internal_thread.h" +#include "os_internal_debug.h" +#include "os_internal_host.h" + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_H */ diff --git a/include/ique/PR/os_internal_debug.h b/include/ique/PR/os_internal_debug.h new file mode 100755 index 00000000..24337b83 --- /dev/null +++ b/include/ique/PR/os_internal_debug.h @@ -0,0 +1,43 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_debug.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_DEBUG_H_ +#define _OS_INTERNAL_DEBUG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Debug port */ +extern void __osSyncPutChars(int, int, const char *); +extern int __osAtomicDec(unsigned int *p); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_DEBUG_H */ diff --git a/include/ique/PR/os_internal_error.h b/include/ique/PR/os_internal_error.h new file mode 100755 index 00000000..0607f873 --- /dev/null +++ b/include/ique/PR/os_internal_error.h @@ -0,0 +1,45 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_error.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_ERROR_H_ +#define _OS_INTERNAL_ERROR_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Error handling */ + +extern void __osError(s16, s16, ...); +extern OSThread * __osGetCurrFaultedThread(void); +extern OSThread * __osGetNextFaultedThread(OSThread *); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_ERROR_H */ diff --git a/include/ique/PR/os_internal_exception.h b/include/ique/PR/os_internal_exception.h new file mode 100755 index 00000000..8f38e5cb --- /dev/null +++ b/include/ique/PR/os_internal_exception.h @@ -0,0 +1,49 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_exception.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_EXCEPTION_H_ +#define _OS_INTERNAL_EXCEPTION_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Routine for HW interrupt "handler" */ +extern void __osSetHWIntrRoutine(OSHWIntr interrupt, + s32 (*handler)(void), void *stackEnd); +extern void __osGetHWIntrRoutine(OSHWIntr interrupt, + s32 (**handler)(void), void **stackEnd); + +/* Routine for global interrupt mask */ +extern void __osSetGlobalIntMask(OSHWIntr); +extern void __osResetGlobalIntMask(OSHWIntr); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_EXCEPTION_H */ diff --git a/include/ique/PR/os_internal_gio.h b/include/ique/PR/os_internal_gio.h new file mode 100755 index 00000000..4ad86fd0 --- /dev/null +++ b/include/ique/PR/os_internal_gio.h @@ -0,0 +1,45 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_gio.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_GIO_H_ +#define _OS_INTERNAL_GIO_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Development board functions */ + +extern void __osGIOInit(s32); +extern void __osGIOInterrupt(s32); +extern void __osGIORawInterrupt(s32); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_GIO_H */ diff --git a/include/ique/PR/os_internal_host.h b/include/ique/PR/os_internal_host.h new file mode 100755 index 00000000..b5f7c6bb --- /dev/null +++ b/include/ique/PR/os_internal_host.h @@ -0,0 +1,42 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_host.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:24 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_HOST_H_ +#define _OS_INTERNAL_HOST_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* routine for rdb port */ +extern u32 __osRdbSend(u8 *buf, u32 size, u32 type); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_HOST_H */ diff --git a/include/ique/PR/os_internal_reg.h b/include/ique/PR/os_internal_reg.h new file mode 100755 index 00000000..395655d8 --- /dev/null +++ b/include/ique/PR/os_internal_reg.h @@ -0,0 +1,59 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_reg.h,v $ + $Revision: 1.1.1.2 $ + $Date: 2002/10/29 08:06:34 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_REG_H_ +#define _OS_INTERNAL_REG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Routines to get/fetch coprocessor 0 registers */ + +extern u32 __osGetCause(void); +extern void __osSetCause(u32); +extern u32 __osGetCompare(void); +extern void __osSetCompare(u32); +extern u32 __osGetConfig(void); +extern void __osSetConfig(u32); +extern void __osSetCount(u32); +extern u32 __osGetSR(void); +extern void __osSetSR(u32); +extern u32 __osDisableInt(void); +extern void __osRestoreInt(u32); +extern u32 __osGetWatchLo(void); +extern void __osSetWatchLo(u32); + +/* Routines to get/set floating-point control and status register */ +extern u32 __osSetFpcCsr(u32); +extern u32 __osGetFpcCsr(void); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_REG_H */ diff --git a/include/ique/PR/os_internal_rsp.h b/include/ique/PR/os_internal_rsp.h new file mode 100755 index 00000000..b2fbd082 --- /dev/null +++ b/include/ique/PR/os_internal_rsp.h @@ -0,0 +1,48 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_rsp.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_RSP_H_ +#define _OS_INTERNAL_RSP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Signal processor interface (Sp) */ + +extern u32 __osSpGetStatus(void); +extern void __osSpSetStatus(u32); +extern s32 __osSpSetPc(u32); +extern s32 __osSpRawWriteIo(u32, u32); +extern s32 __osSpRawReadIo(u32, u32 *); +extern s32 __osSpRawStartDma(s32, u32, void *, u32); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_RSP_H */ diff --git a/include/ique/PR/os_internal_si.h b/include/ique/PR/os_internal_si.h new file mode 100755 index 00000000..6dccf6d6 --- /dev/null +++ b/include/ique/PR/os_internal_si.h @@ -0,0 +1,46 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_si.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_SI_H_ +#define _OS_INTERNAL_SI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Serial interface (Si) */ + +extern u32 __osSiGetStatus(void); +extern s32 __osSiRawWriteIo(u32, u32); +extern s32 __osSiRawReadIo(u32, u32 *); +extern s32 __osSiRawStartDma(s32, void *); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_SI_H */ diff --git a/include/ique/PR/os_internal_thread.h b/include/ique/PR/os_internal_thread.h new file mode 100755 index 00000000..a4d2e0fe --- /dev/null +++ b/include/ique/PR/os_internal_thread.h @@ -0,0 +1,43 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_thread.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_THREAD_H_ +#define _OS_INTERNAL_THREAD_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* For debugger use */ + +extern OSThread * __osGetActiveQueue(void); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_THREAD_H */ diff --git a/include/ique/PR/os_internal_tlb.h b/include/ique/PR/os_internal_tlb.h new file mode 100755 index 00000000..9f0c18a2 --- /dev/null +++ b/include/ique/PR/os_internal_tlb.h @@ -0,0 +1,47 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_tlb.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_TLB_H_ +#define _OS_INTERNAL_TLB_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Routines for fetch TLB info */ + +extern u32 __osGetTLBASID(void); +extern u32 __osGetTLBPageMask(s32); +extern u32 __osGetTLBHi(s32); +extern u32 __osGetTLBLo0(s32); +extern u32 __osGetTLBLo1(s32); + + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_TLB_H */ diff --git a/include/ique/PR/os_libc.h b/include/ique/PR/os_libc.h new file mode 100755 index 00000000..72417ebb --- /dev/null +++ b/include/ique/PR/os_libc.h @@ -0,0 +1,103 @@ + +/*==================================================================== + * os_libc.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_libc.h,v $ + $Revision: 1.5 $ + $Date: 2004/11/16 01:47:19 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_LIBC_H_ +#define _OS_LIBC_H_ + +#include "os_pfs.h" + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* byte string operations */ + +#ifdef TARGET_N64 + extern void bcopy(const void *, void *, int); + extern int bcmp(const void *, const void *, int); + extern void bzero(void *, int); +#endif + +/* Printf */ + +#ifndef WIN32 +extern int sprintf(char *s, const char *fmt, ...); +#endif +extern void osSyncPrintf(const char *fmt, ...); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_LIBC_H_ */ diff --git a/include/ique/PR/os_message.h b/include/ique/PR/os_message.h new file mode 100755 index 00000000..3f93e3ff --- /dev/null +++ b/include/ique/PR/os_message.h @@ -0,0 +1,167 @@ + +/*==================================================================== + * os_message.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_message.h,v $ + $Revision: 1.3 $ + $Date: 2004/06/28 22:34:42 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_MESSAGE_H_ +#define _OS_MESSAGE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef u32 OSEvent; + +/* + * Structure for message + */ +typedef void * OSMesg; + +/* + * Structure for message queue + */ +typedef struct OSMesgQueue_s { + OSThread *mtqueue; /* Queue to store threads blocked + on empty mailboxes (receive) */ + OSThread *fullqueue; /* Queue to store threads blocked + on full mailboxes (send) */ + s32 validCount; /* Contains number of valid message */ + s32 first; /* Points to first valid message */ + s32 msgCount; /* Contains total # of messages */ + OSMesg *msg; /* Points to message buffer array */ +} OSMesgQueue; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Events */ +#ifndef BBPLAYER +/*XXXblythe events also defined is os_bb.h*/ +#ifdef _FINALROM +#define OS_NUM_EVENTS 15 +#else +#define OS_NUM_EVENTS 23 +#endif +#endif + +#define OS_EVENT_SW1 0 /* CPU SW1 interrupt */ +#define OS_EVENT_SW2 1 /* CPU SW2 interrupt */ +#define OS_EVENT_CART 2 /* Cartridge interrupt: used by rmon */ +#define OS_EVENT_COUNTER 3 /* Counter int: used by VI/Timer Mgr */ +#define OS_EVENT_SP 4 /* SP task done interrupt */ +#define OS_EVENT_SI 5 /* SI (controller) interrupt */ +#define OS_EVENT_AI 6 /* AI interrupt */ +#define OS_EVENT_VI 7 /* VI interrupt: used by VI/Timer Mgr */ +#define OS_EVENT_PI 8 /* PI interrupt: used by PI Manager */ +#define OS_EVENT_DP 9 /* DP full sync interrupt */ +#define OS_EVENT_CPU_BREAK 10 /* CPU breakpoint: used by rmon */ +#define OS_EVENT_SP_BREAK 11 /* SP breakpoint: used by rmon */ +#define OS_EVENT_FAULT 12 /* CPU fault event: used by rmon */ +#define OS_EVENT_THREADSTATUS 13 /* CPU thread status: used by rmon */ +#define OS_EVENT_PRENMI 14 /* Pre NMI interrupt */ +#ifndef _FINALROM +#define OS_EVENT_RDB_READ_DONE 15 /* RDB read ok event: used by rmon */ +#define OS_EVENT_RDB_LOG_DONE 16 /* read of log data complete */ +#define OS_EVENT_RDB_DATA_DONE 17 /* read of hostio data complete */ +#define OS_EVENT_RDB_REQ_RAMROM 18 /* host needs ramrom access */ +#define OS_EVENT_RDB_FREE_RAMROM 19 /* host is done with ramrom access */ +#define OS_EVENT_RDB_DBG_DONE 20 +#define OS_EVENT_RDB_FLUSH_PROF 21 +#define OS_EVENT_RDB_ACK_PROF 22 +/* BBPlayer event messages continues in os_bb.h */ +#endif + +/* Flags to turn blocking on/off when sending/receiving message */ + +#define OS_MESG_NOBLOCK 0 +#define OS_MESG_BLOCK 1 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/* Get count of valid messages in queue */ +#define MQ_GET_COUNT(mq) ((mq)->validCount) + +/* Figure out if message queue is empty or full */ +#define MQ_IS_EMPTY(mq) (MQ_GET_COUNT(mq) == 0) +#define MQ_IS_FULL(mq) (MQ_GET_COUNT(mq) >= (mq)->msgCount) + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Message operations */ + +extern void osCreateMesgQueue(OSMesgQueue *, OSMesg *, s32); +extern s32 osSendMesg(OSMesgQueue *, OSMesg, s32); +extern s32 osJamMesg(OSMesgQueue *, OSMesg, s32); +extern s32 osRecvMesg(OSMesgQueue *, OSMesg *, s32); + +/* Event operations */ + +extern void osSetEventMesg(OSEvent, OSMesgQueue *, OSMesg); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_MESSAGE_H_ */ diff --git a/include/ique/PR/os_motor.h b/include/ique/PR/os_motor.h new file mode 100755 index 00000000..d851f577 --- /dev/null +++ b/include/ique/PR/os_motor.h @@ -0,0 +1,83 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_motor.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_MOTOR_H_ +#define _OS_MOTOR_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" +#include "os_pfs.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Rumble PAK interface */ + +extern s32 osMotorInit(OSMesgQueue *, OSPfs *, int); +#if 1 +#define MOTOR_START 1 +#define MOTOR_STOP 0 +#define osMotorStart(x) __osMotorAccess((x), MOTOR_START) +#define osMotorStop(x) __osMotorAccess((x), MOTOR_STOP) +extern s32 __osMotorAccess(OSPfs *, s32); +#else +extern s32 osMotorStop(OSPfs *); +extern s32 osMotorStart(OSPfs *); +#endif + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_MOTOR_H_ */ diff --git a/include/ique/PR/os_pfs.h b/include/ique/PR/os_pfs.h new file mode 100755 index 00000000..38c70c05 --- /dev/null +++ b/include/ique/PR/os_pfs.h @@ -0,0 +1,174 @@ + +/*==================================================================== + * os_pfs.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_pfs.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_PFS_H_ +#define _OS_PFS_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for file system + */ +typedef struct { + int status; + OSMesgQueue *queue; + int channel; + u8 id[32]; + u8 label[32]; + int version; + int dir_size; + int inode_table; /* block location */ + int minode_table; /* mirrioring inode_table */ + int dir_table; /* block location */ + int inode_start_page; /* page # */ + u8 banks; + u8 activebank; +} OSPfs; + +typedef struct { + u32 file_size; /* bytes */ + u32 game_code; + u16 company_code; + char ext_name[4]; + char game_name[16]; +} OSPfsState; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* File System size */ +#define OS_PFS_VERSION 0x0200 +#define OS_PFS_VERSION_HI (OS_PFS_VERSION >> 8) +#define OS_PFS_VERSION_LO (OS_PFS_VERSION & 255) + +#define PFS_FILE_NAME_LEN 16 +#define PFS_FILE_EXT_LEN 4 +#define BLOCKSIZE 32 /* bytes */ +#define PFS_ONE_PAGE 8 /* blocks */ +#define PFS_MAX_BANKS 62 + +/* File System flag */ + +#define PFS_READ 0 +#define PFS_WRITE 1 +#define PFS_CREATE 2 + +/* File System status */ +#define PFS_INITIALIZED 0x1 +#define PFS_CORRUPTED 0x2 /* File system was corrupted */ +#define PFS_ID_BROKEN 0x4 +#define PFS_MOTOR_INITIALIZED 0x8 +#define PFS_GBPAK_INITIALIZED 0x10 + +/* File System error number */ + +#define PFS_ERR_NOPACK 1 /* no memory card is plugged or */ +#define PFS_ERR_NEW_PACK 2 /* ram pack has been changed to a */ + /* different one */ +#define PFS_ERR_INCONSISTENT 3 /* need to run Pfschecker */ +#define PFS_ERR_CONTRFAIL CONT_OVERRUN_ERROR +#define PFS_ERR_INVALID 5 /* invalid parameter or file not exist*/ +#define PFS_ERR_BAD_DATA 6 /* the data read from pack are bad*/ +#define PFS_DATA_FULL 7 /* no free pages on ram pack */ +#define PFS_DIR_FULL 8 /* no free directories on ram pack*/ +#define PFS_ERR_EXIST 9 /* file exists */ +#define PFS_ERR_ID_FATAL 10 /* dead ram pack */ +#define PFS_ERR_DEVICE 11 /* wrong device type*/ +#define PFS_ERR_NO_GBCART 12 /* no gb cartridge (64GB-PAK) */ +#define PFS_ERR_NEW_GBCART 13 /* gb cartridge may be changed */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* file system interface */ + +extern s32 osPfsInitPak(OSMesgQueue *, OSPfs *, int); +extern s32 osPfsRepairId(OSPfs *); +extern s32 osPfsInit(OSMesgQueue *, OSPfs *, int); +extern s32 osPfsReFormat(OSPfs *, OSMesgQueue *, int); +extern s32 osPfsChecker(OSPfs *); +extern s32 osPfsAllocateFile(OSPfs *, u16, u32, u8 *, u8 *, int, s32 *); +extern s32 osPfsFindFile(OSPfs *, u16, u32, u8 *, u8 *, s32 *); +extern s32 osPfsDeleteFile(OSPfs *, u16, u32, u8 *, u8 *); +extern s32 osPfsReadWriteFile(OSPfs *, s32, u8, int, int, u8 *); +extern s32 osPfsFileState(OSPfs *, s32, OSPfsState *); +extern s32 osPfsGetLabel(OSPfs *, u8 *, int *); +extern s32 osPfsSetLabel(OSPfs *, u8 *); +extern s32 osPfsIsPlug(OSMesgQueue *, u8 *); +extern s32 osPfsFreeBlocks(OSPfs *, s32 *); +extern s32 osPfsNumFiles(OSPfs *, s32 *, s32 *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_PFS_H_ */ diff --git a/include/ique/PR/os_pi.h b/include/ique/PR/os_pi.h new file mode 100755 index 00000000..9df269f5 --- /dev/null +++ b/include/ique/PR/os_pi.h @@ -0,0 +1,224 @@ + +/*==================================================================== + * os_pi.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_pi.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_PI_H_ +#define _OS_PI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_thread.h" +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for Enhanced PI interface + */ + +/* + * OSTranxInfo is set up for Leo Disk DMA. This info will be maintained + * by exception handler. This is how the PIMGR and the ISR communicate. + */ + +typedef struct { + u32 errStatus; /* error status */ + void *dramAddr; /* RDRAM buffer address (DMA) */ + void *C2Addr; /* C2 buffer address */ + u32 sectorSize; /* size of transfering sector */ + u32 C1ErrNum; /* total # of C1 errors */ + u32 C1ErrSector[4]; /* error sectors */ +} __OSBlockInfo; + +typedef struct { + u32 cmdType; /* for disk only */ + u16 transferMode; /* Block, Track, or sector? */ + u16 blockNum; /* which block is transfering */ + s32 sectorNum; /* which sector is transfering */ + u32 devAddr; /* Device buffer address */ + u32 bmCtlShadow; /* asic bm_ctl(510) register shadow ram */ + u32 seqCtlShadow; /* asic seq_ctl(518) register shadow ram */ + __OSBlockInfo block[2]; /* bolck transfer info */ +} __OSTranxInfo; + + +typedef struct OSPiHandle_s { + struct OSPiHandle_s *next; /* point to next handle on the table */ + u8 type; /* DEVICE_TYPE_BULK for disk */ + u8 latency; /* domain latency */ + u8 pageSize; /* domain page size */ + u8 relDuration; /* domain release duration */ + u8 pulse; /* domain pulse width */ + u8 domain; /* which domain */ + u32 baseAddress; /* Domain address */ + u32 speed; /* for roms only */ + /* The following are "private" elements" */ + __OSTranxInfo transferInfo; /* for disk only */ +} OSPiHandle; + +typedef struct { + u8 type; + u32 address; +} OSPiInfo; + +/* + * Structure for I/O message block + */ +typedef struct { + u16 type; /* Message type */ + u8 pri; /* Message priority (High or Normal) */ + u8 status; /* Return status */ + OSMesgQueue *retQueue; /* Return message queue to notify I/O + * completion */ +} OSIoMesgHdr; + +typedef struct { + OSIoMesgHdr hdr; /* Message header */ + void * dramAddr; /* RDRAM buffer address (DMA) */ + u32 devAddr; /* Device buffer address (DMA) */ + u32 size; /* DMA transfer size in bytes */ + OSPiHandle *piHandle; /* PI device handle */ +} OSIoMesg; + +/* + * Structure for device manager block + */ +typedef struct { + s32 active; /* Status flag */ + OSThread *thread; /* Calling thread */ + OSMesgQueue *cmdQueue; /* Command queue */ + OSMesgQueue *evtQueue; /* Event queue */ + OSMesgQueue *acsQueue; /* Access queue */ + /* Raw DMA routine */ + s32 (*dma)(s32, u32, void *, u32); + s32 (*edma)(OSPiHandle *, s32, u32, void *, u32); +} OSDevMgr; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Flags to indicate direction of data transfer */ + +#define OS_READ 0 /* device -> RDRAM */ +#define OS_WRITE 1 /* device <- RDRAM */ +#define OS_OTHERS 2 /* for Leo disk only */ + +/* + * I/O message types + */ +#define OS_MESG_TYPE_BASE (10) +#define OS_MESG_TYPE_LOOPBACK (OS_MESG_TYPE_BASE+0) +#define OS_MESG_TYPE_DMAREAD (OS_MESG_TYPE_BASE+1) +#define OS_MESG_TYPE_DMAWRITE (OS_MESG_TYPE_BASE+2) +#define OS_MESG_TYPE_VRETRACE (OS_MESG_TYPE_BASE+3) +#define OS_MESG_TYPE_COUNTER (OS_MESG_TYPE_BASE+4) +#define OS_MESG_TYPE_EDMAREAD (OS_MESG_TYPE_BASE+5) +#define OS_MESG_TYPE_EDMAWRITE (OS_MESG_TYPE_BASE+6) + +/* + * I/O message priority + */ +#define OS_MESG_PRI_NORMAL 0 +#define OS_MESG_PRI_HIGH 1 + +/* + * PI/EPI + */ +#define PI_DOMAIN1 0 +#define PI_DOMAIN2 1 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + +extern OSPiHandle *__osPiTable; /* The head of OSPiHandle link list */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Peripheral interface (Pi) */ +extern u32 osPiGetStatus(void); +extern s32 osPiGetDeviceType(void); +extern s32 osPiWriteIo(u32, u32); +extern s32 osPiReadIo(u32, u32 *); +extern s32 osPiStartDma(OSIoMesg *, s32, s32, u32, void *, u32, + OSMesgQueue *); +extern void osCreatePiManager(OSPri, OSMesgQueue *, OSMesg *, s32); + +/* Enhanced PI interface */ + +extern OSPiHandle *osCartRomInit(void); +extern OSPiHandle *osLeoDiskInit(void); +extern OSPiHandle *osDriveRomInit(void); + +extern s32 osEPiDeviceType(OSPiHandle *, OSPiInfo *); +extern s32 osEPiWriteIo(OSPiHandle *, u32 , u32 ); +extern s32 osEPiReadIo(OSPiHandle *, u32 , u32 *); +extern s32 osEPiStartDma(OSPiHandle *, OSIoMesg *, s32); +extern s32 osEPiLinkHandle(OSPiHandle *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_PI_H_ */ diff --git a/include/ique/PR/os_rdp.h b/include/ique/PR/os_rdp.h new file mode 100755 index 00000000..edc767c5 --- /dev/null +++ b/include/ique/PR/os_rdp.h @@ -0,0 +1,92 @@ + +/*==================================================================== + * os_rdp.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_rdp.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_RDP_H_ +#define _OS_RDP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Display processor interface (Dp) */ +extern u32 osDpGetStatus(void); +extern void osDpSetStatus(u32); +extern void osDpGetCounters(u32 *); +extern s32 osDpSetNextBuffer(void *, u64); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_RDP_H_ */ diff --git a/include/ique/PR/os_reg.h b/include/ique/PR/os_reg.h new file mode 100755 index 00000000..3ec0c5ab --- /dev/null +++ b/include/ique/PR/os_reg.h @@ -0,0 +1,90 @@ + +/*==================================================================== + * os_reg.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_reg.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_REG_H_ +#define _OS_REG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Miscellaneous operations */ + +extern u32 osGetCount(void); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_REG_H_ */ diff --git a/include/ique/PR/os_rsp.h b/include/ique/PR/os_rsp.h new file mode 100755 index 00000000..d02d544c --- /dev/null +++ b/include/ique/PR/os_rsp.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_rsp.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_rsp.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_RSP_H_ +#define _OS_RSP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_RSP_H_ */ diff --git a/include/ique/PR/os_si.h b/include/ique/PR/os_si.h new file mode 100755 index 00000000..de5094fc --- /dev/null +++ b/include/ique/PR/os_si.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_si.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_si.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_SI_H_ +#define _OS_SI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_SI_H_ */ diff --git a/include/ique/PR/os_system.h b/include/ique/PR/os_system.h new file mode 100755 index 00000000..168de781 --- /dev/null +++ b/include/ique/PR/os_system.h @@ -0,0 +1,118 @@ + +/*==================================================================== + * os_system.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_system.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_SYSTEM_H_ +#define _OS_SYSTEM_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Values for osTvType + */ +#define OS_TV_PAL 0 +#define OS_TV_NTSC 1 +#define OS_TV_MPAL 2 + +/* + * Size of buffer the retains contents after NMI + */ +#define OS_APP_NMI_BUFSIZE 64 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + +extern s32 osRomType; /* Bulk or cartridge ROM. 0=cartridge 1=bulk */ +extern void *osRomBase; /* Rom base address of the game image */ +extern s32 osTvType; /* 0 = PAL, 1 = NTSC, 2 = MPAL */ +extern s32 osResetType; /* 0 = cold reset, 1 = NMI */ +extern s32 osCicId; +extern s32 osVersion; +extern u32 osMemSize; /* Memory Size */ +extern s32 osAppNMIBuffer[]; + +extern u64 osClockRate; + +extern OSIntMask __OSGlobalIntMask; /* global interrupt mask */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +extern void osInitialize(void); +extern void osExit(void); +extern u32 osGetMemSize(void); + +/* pre-NMI */ +extern s32 osAfterPreNMI(void); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_SYSTEM_H_ */ diff --git a/include/ique/PR/os_thread.h b/include/ique/PR/os_thread.h new file mode 100755 index 00000000..4ca4cbdf --- /dev/null +++ b/include/ique/PR/os_thread.h @@ -0,0 +1,174 @@ + +/*==================================================================== + * os_thread.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_thread.h,v $ + $Revision: 1.4 $ + $Date: 2004/02/06 02:16:48 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_THREAD_H_ +#define _OS_THREAD_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef s32 OSPri; +typedef s32 OSId; +typedef union { struct { f32 f_odd; f32 f_even; } f; f64 d; } __OSfp; + +typedef struct { + u64 at, v0, v1, a0, a1, a2, a3; + u64 t0, t1, t2, t3, t4, t5, t6, t7; + u64 s0, s1, s2, s3, s4, s5, s6, s7; + u64 t8, t9, gp, sp, s8, ra; + u64 lo, hi; + u32 sr, pc, cause, badvaddr, rcp; + u32 fpcsr; + __OSfp fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14; + __OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30; +} __OSThreadContext; + +typedef struct { + u32 flag; + u32 count; + u64 time; +} __OSThreadprofile_s; + +typedef struct OSThread_s { + struct OSThread_s *next; /* run/mesg queue link */ + OSPri priority; /* run/mesg queue priority */ + struct OSThread_s **queue; /* queue thread is on */ + struct OSThread_s *tlnext; /* all threads queue link */ + u16 state; /* OS_STATE_* */ + u16 flags; /* flags for rmon */ + OSId id; /* id for debugging */ + int fp; /* thread has used fp unit */ + __OSThreadprofile_s *thprof; /* workarea for thread profiler */ + __OSThreadContext context; /* register/interrupt mask */ +} OSThread; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Thread states */ + +#define OS_STATE_STOPPED 1 +#define OS_STATE_RUNNABLE 2 +#define OS_STATE_RUNNING 4 +#define OS_STATE_WAITING 8 + +/* Recommended thread priorities for the system threads */ + +#define OS_PRIORITY_MAX 255 +#define OS_PRIORITY_VIMGR 254 +#define OS_PRIORITY_RMON 250 +#define OS_PRIORITY_RMONSPIN 200 +#define OS_PRIORITY_PIMGR 150 +#define OS_PRIORITY_SIMGR 140 +#define OS_PRIORITY_APPMAX 127 +#define OS_PRIORITY_IDLE 0 /* Must be 0 */ + +#ifdef BBPLAYER +/* BB Player thread IDs */ +#define OS_TID_RMONMAIN 3201 +#define OS_TID_RMONIO 3202 +#define OS_TID_PROFILEIO 3251 +#define OS_TID_PIMGR 3301 +#define OS_TID_RAMROM 3302 +#define OS_TID_VIMGR 3401 + +/* We also have two USB threads (see osint_usb.h) */ +#define OS_TID_USB0 (OS_USB_TID_BASE) /* 3141 */ +#define OS_TID_USB1 (OS_USB_TID_BASE+1) /* 3142 */ + +/* Also define constants for GDB */ +#define OS_PRIORITY_GDB OS_PRIORITY_RMON +#define OS_TID_GDBMAIN OS_TID_RMONMAIN +#define OS_TID_GDBIO OS_TID_RMONIO + +#endif + +/* for thread profiler */ +#define THPROF_IDMAX 64 +#define THPROF_STACKSIZE 256 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Thread operations */ + +extern void osCreateThread(OSThread *, OSId, void (*)(void *), + void *, void *, OSPri); +extern void osDestroyThread(OSThread *); +extern void osYieldThread(void); +extern void osStartThread(OSThread *); +extern void osStopThread(OSThread *); +extern OSId osGetThreadId(OSThread *); +extern void osSetThreadPri(OSThread *, OSPri); +extern OSPri osGetThreadPri(OSThread *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_THREAD_H_ */ diff --git a/include/ique/PR/os_time.h b/include/ique/PR/os_time.h new file mode 100755 index 00000000..f2dbf82a --- /dev/null +++ b/include/ique/PR/os_time.h @@ -0,0 +1,114 @@ + +/*==================================================================== + * os_time.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_time.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_TIME_H_ +#define _OS_TIME_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for time value + */ +typedef u64 OSTime; + +/* + * Structure for interval timer + */ +typedef struct OSTimer_s { + struct OSTimer_s *next; /* point to next timer in list */ + struct OSTimer_s *prev; /* point to previous timer in list */ + OSTime interval; /* duration set by user */ + OSTime value; /* time remaining before */ + /* timer fires */ + OSMesgQueue *mq; /* Message Queue */ + OSMesg msg; /* Message to send */ +} OSTimer; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Timer interface */ + +extern OSTime osGetTime(void); +extern void osSetTime(OSTime); +extern int osSetTimer(OSTimer *, OSTime, OSTime, + OSMesgQueue *, OSMesg); +extern int osStopTimer(OSTimer *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_TIME_H_ */ diff --git a/include/ique/PR/os_tlb.h b/include/ique/PR/os_tlb.h new file mode 100755 index 00000000..a27ed30b --- /dev/null +++ b/include/ique/PR/os_tlb.h @@ -0,0 +1,107 @@ + +/*==================================================================== + * os_tlb.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_tlb.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_TLB_H_ +#define _OS_TLB_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef u32 OSPageMask; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Page size argument for TLB routines + */ +#define OS_PM_4K 0x0000000 +#define OS_PM_16K 0x0006000 +#define OS_PM_64K 0x001e000 +#define OS_PM_256K 0x007e000 +#define OS_PM_1M 0x01fe000 +#define OS_PM_4M 0x07fe000 +#define OS_PM_16M 0x1ffe000 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* TLB management routines */ + +extern void osMapTLB(s32, OSPageMask, void *, u32, u32, s32); +extern void osMapTLBRdb(void); +extern void osUnmapTLB(s32); +extern void osUnmapTLBAll(void); +extern void osSetTLBASID(s32); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_TLB_H_ */ diff --git a/include/ique/PR/os_usb.h b/include/ique/PR/os_usb.h new file mode 100755 index 00000000..f2961844 --- /dev/null +++ b/include/ique/PR/os_usb.h @@ -0,0 +1,172 @@ +/*==================================================================== + * os_usb.h + * + * Copyright 2003, BroadOn Communications Corp. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of BroadOn Communications + * Corp.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of BroadOn Communications. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 2003 BroadOn Communications Corp + + $RCSfile: os_usb.h,v $ + $Revision: 1.12 $ + $Date: 2004/09/03 03:52:47 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_USB_H_ +#define _OS_USB_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure to describe USB device + */ +typedef struct OSBbUsbInfo_s { + u8 ua_type; /* controller mode (host or device) */ + u8 ua_class; /* device class */ + u8 ua_subclass; /* subclass */ + u8 ua_protocol; /* protocol */ + u16 ua_vendor; /* vendor */ + u16 ua_product; /* product */ + u8 ua_cfg; /* configuration */ + u8 ua_ifc; /* interface */ + u8 ua_ep; /* endpoint */ + u8 ua_speed; /* LS/FS/HS */ + u8 ua_mode; /* R, W or R/W */ + u8 ua_blksize; /* block size */ + u8 ua_support; /* have driver */ + u8 ua_state; /* device state (attached?) */ + u8 *ua_mfr_str; /* manufacturer string */ + u8 *ua_prod_str; /* product description string */ + u8 *ua_driver_name; /* driver name */ +} OSBbUsbInfo; + +/* + * Handle for USB device + */ +typedef void *OSBbUsbHandle; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * USB Controller Modes + */ +#define OS_USB_TYPE_DISABLED 0 +#define OS_USB_TYPE_HOST 1 +#define OS_USB_TYPE_DEVICE 2 +#define OS_USB_TYPE_EITHER (OS_USB_TYPE_HOST|OS_USB_HOST_DEVICE) + +/* + * USB Device States + */ +#define OS_USB_STATE_NULL 0 +#define OS_USB_STATE_ATTACHED 1 + +/* + * USB Device Classes + */ +#define OS_USB_DEV_GENERIC 0 +#define OS_USB_DEV_SERIAL 1 +#define OS_USB_DEV_MODEM 2 +#define OS_USB_DEV_MSD 3 + +/* + * USB Device Speeds + */ +#define OS_USB_LOW_SPEED 0 /* LS (1Mb/s) */ +#define OS_USB_FULL_SPEED 1 /* FS (12Mb/s) */ +#define OS_USB_HIGH_SPEED 2 /* HS (480Mb/s) */ + +/* + * USB Device Access Modes + */ +#define OS_USB_MODE_READ 1 /* Read only */ +#define OS_USB_MODE_WRITE 2 /* Write only */ +#define OS_USB_MODE_RW 3 /* R/W = READ | WRITE */ + + +/* + * USB subsystem parameters + */ +#define OS_USB_MAX_CONTROLLERS 2 +#define OS_USB_QUEUE_SIZE 128 + +/* + * Error codes + */ +#define OS_USB_ERROR_BASE 201 +#define EUSBRINVAL OS_USB_ERROR_BASE+0 +#define EUSBAGAIN OS_USB_ERROR_BASE+1 +#define EUSBBUSY OS_USB_ERROR_BASE+2 +#define EUSBNXIO OS_USB_ERROR_BASE+3 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* USB interface */ +extern s32 osBbUsbInit(void); +extern s32 osBbUsbSetCtlrModes(s32, u32); +extern u32 osBbUsbGetResetCount(s32); +extern s32 osBbUsbDevQuery(s32, OSBbUsbInfo *, s32); +extern s32 osBbUsbDevGetHandle(s32, OSBbUsbInfo *, OSBbUsbHandle *); +extern s32 osBbUsbDevFreeHandle(OSBbUsbHandle); +extern s32 osBbUsbDevRead(OSBbUsbHandle, u8 *, s32, u64); +extern s32 osBbUsbDevWrite(OSBbUsbHandle, u8 *, s32, u64); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_USB_H_ */ diff --git a/include/ique/PR/os_version.h b/include/ique/PR/os_version.h new file mode 100755 index 00000000..2be0c971 --- /dev/null +++ b/include/ique/PR/os_version.h @@ -0,0 +1,16 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_version.h,v $ + $Revision: 1.1.1.2 $ + $Date: 2002/10/29 08:06:34 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_VERSION_H_ +#define _OS_VERSION_H_ + +#define OS_MAJOR_VERSION "2.0K" /* major version */ +#define OS_MINOR_VERSION 0 /* patch level */ + +#endif /* !_OS_VERSION_H_ */ diff --git a/include/ique/PR/os_vi.h b/include/ique/PR/os_vi.h new file mode 100755 index 00000000..c00498e7 --- /dev/null +++ b/include/ique/PR/os_vi.h @@ -0,0 +1,298 @@ + +/*==================================================================== + * os_vi.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_vi.h,v $ + $Revision: 1.1.1.1 $ + $Date: 2002/05/02 03:28:25 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_VI_H_ +#define _OS_VI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_thread.h" +#include "os_message.h" + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure to store VI register values that remain the same between 2 fields + */ +typedef struct { + u32 ctrl; + u32 width; + u32 burst; + u32 vSync; + u32 hSync; + u32 leap; + u32 hStart; + u32 xScale; + u32 vCurrent; +} OSViCommonRegs; + + +/* + * Structure to store VI register values that change between fields + */ +typedef struct { + u32 origin; + u32 yScale; + u32 vStart; + u32 vBurst; + u32 vIntr; +} OSViFieldRegs; + + +/* + * Structure for VI mode + */ +typedef struct { + u8 type; /* Mode type */ + OSViCommonRegs comRegs; /* Common registers for both fields */ + OSViFieldRegs fldRegs[2]; /* Registers for Field 1 & 2 */ +} OSViMode; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Video Interface (VI) mode type + */ +#define OS_VI_NTSC_LPN1 0 /* NTSC */ +#define OS_VI_NTSC_LPF1 1 +#define OS_VI_NTSC_LAN1 2 +#define OS_VI_NTSC_LAF1 3 +#define OS_VI_NTSC_LPN2 4 +#define OS_VI_NTSC_LPF2 5 +#define OS_VI_NTSC_LAN2 6 +#define OS_VI_NTSC_LAF2 7 +#define OS_VI_NTSC_HPN1 8 +#define OS_VI_NTSC_HPF1 9 +#define OS_VI_NTSC_HAN1 10 +#define OS_VI_NTSC_HAF1 11 +#define OS_VI_NTSC_HPN2 12 +#define OS_VI_NTSC_HPF2 13 + +#define OS_VI_PAL_LPN1 14 /* PAL */ +#define OS_VI_PAL_LPF1 15 +#define OS_VI_PAL_LAN1 16 +#define OS_VI_PAL_LAF1 17 +#define OS_VI_PAL_LPN2 18 +#define OS_VI_PAL_LPF2 19 +#define OS_VI_PAL_LAN2 20 +#define OS_VI_PAL_LAF2 21 +#define OS_VI_PAL_HPN1 22 +#define OS_VI_PAL_HPF1 23 +#define OS_VI_PAL_HAN1 24 +#define OS_VI_PAL_HAF1 25 +#define OS_VI_PAL_HPN2 26 +#define OS_VI_PAL_HPF2 27 + +#define OS_VI_MPAL_LPN1 28 /* MPAL - mainly Brazil */ +#define OS_VI_MPAL_LPF1 29 +#define OS_VI_MPAL_LAN1 30 +#define OS_VI_MPAL_LAF1 31 +#define OS_VI_MPAL_LPN2 32 +#define OS_VI_MPAL_LPF2 33 +#define OS_VI_MPAL_LAN2 34 +#define OS_VI_MPAL_LAF2 35 +#define OS_VI_MPAL_HPN1 36 +#define OS_VI_MPAL_HPF1 37 +#define OS_VI_MPAL_HAN1 38 +#define OS_VI_MPAL_HAF1 39 +#define OS_VI_MPAL_HPN2 40 +#define OS_VI_MPAL_HPF2 41 + +#define OS_VI_FPAL_LPN1 42 /* FPAL - Full screen PAL */ +#define OS_VI_FPAL_LPF1 43 +#define OS_VI_FPAL_LAN1 44 +#define OS_VI_FPAL_LAF1 45 +#define OS_VI_FPAL_LPN2 46 +#define OS_VI_FPAL_LPF2 47 +#define OS_VI_FPAL_LAN2 48 +#define OS_VI_FPAL_LAF2 49 +#define OS_VI_FPAL_HPN1 50 +#define OS_VI_FPAL_HPF1 51 +#define OS_VI_FPAL_HAN1 52 +#define OS_VI_FPAL_HAF1 53 +#define OS_VI_FPAL_HPN2 54 +#define OS_VI_FPAL_HPF2 55 + +/* + * Video Interface (VI) special features + */ +#define OS_VI_GAMMA_ON 0x0001 +#define OS_VI_GAMMA_OFF 0x0002 +#define OS_VI_GAMMA_DITHER_ON 0x0004 +#define OS_VI_GAMMA_DITHER_OFF 0x0008 +#define OS_VI_DIVOT_ON 0x0010 +#define OS_VI_DIVOT_OFF 0x0020 +#define OS_VI_DITHER_FILTER_ON 0x0040 +#define OS_VI_DITHER_FILTER_OFF 0x0080 + +/* + * Video Interface (VI) mode attribute bit + */ +#define OS_VI_BIT_NONINTERLACE 0x0001 /* lo-res */ +#define OS_VI_BIT_INTERLACE 0x0002 /* lo-res */ +#define OS_VI_BIT_NORMALINTERLACE 0x0004 /* hi-res */ +#define OS_VI_BIT_DEFLICKINTERLACE 0x0008 /* hi-res */ +#define OS_VI_BIT_ANTIALIAS 0x0010 +#define OS_VI_BIT_POINTSAMPLE 0x0020 +#define OS_VI_BIT_16PIXEL 0x0040 +#define OS_VI_BIT_32PIXEL 0x0080 +#define OS_VI_BIT_LORES 0x0100 +#define OS_VI_BIT_HIRES 0x0200 +#define OS_VI_BIT_NTSC 0x0400 +#define OS_VI_BIT_PAL 0x0800 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + +extern OSViMode osViModeTable[]; /* Global VI mode table */ + +extern OSViMode osViModeNtscLpn1; /* Individual VI NTSC modes */ +extern OSViMode osViModeNtscLpf1; +extern OSViMode osViModeNtscLan1; +extern OSViMode osViModeNtscLaf1; +extern OSViMode osViModeNtscLpn2; +extern OSViMode osViModeNtscLpf2; +extern OSViMode osViModeNtscLan2; +extern OSViMode osViModeNtscLaf2; +extern OSViMode osViModeNtscHpn1; +extern OSViMode osViModeNtscHpf1; +extern OSViMode osViModeNtscHan1; +extern OSViMode osViModeNtscHaf1; +extern OSViMode osViModeNtscHpn2; +extern OSViMode osViModeNtscHpf2; + +extern OSViMode osViModePalLpn1; /* Individual VI PAL modes */ +extern OSViMode osViModePalLpf1; +extern OSViMode osViModePalLan1; +extern OSViMode osViModePalLaf1; +extern OSViMode osViModePalLpn2; +extern OSViMode osViModePalLpf2; +extern OSViMode osViModePalLan2; +extern OSViMode osViModePalLaf2; +extern OSViMode osViModePalHpn1; +extern OSViMode osViModePalHpf1; +extern OSViMode osViModePalHan1; +extern OSViMode osViModePalHaf1; +extern OSViMode osViModePalHpn2; +extern OSViMode osViModePalHpf2; + +extern OSViMode osViModeMpalLpn1; /* Individual VI MPAL modes */ +extern OSViMode osViModeMpalLpf1; +extern OSViMode osViModeMpalLan1; +extern OSViMode osViModeMpalLaf1; +extern OSViMode osViModeMpalLpn2; +extern OSViMode osViModeMpalLpf2; +extern OSViMode osViModeMpalLan2; +extern OSViMode osViModeMpalLaf2; +extern OSViMode osViModeMpalHpn1; +extern OSViMode osViModeMpalHpf1; +extern OSViMode osViModeMpalHan1; +extern OSViMode osViModeMpalHaf1; +extern OSViMode osViModeMpalHpn2; +extern OSViMode osViModeMpalHpf2; + +extern OSViMode osViModeFpalLpn1; /* Individual VI FPAL modes */ +extern OSViMode osViModeFpalLpf1; +extern OSViMode osViModeFpalLan1; +extern OSViMode osViModeFpalLaf1; +extern OSViMode osViModeFpalLpn2; +extern OSViMode osViModeFpalLpf2; +extern OSViMode osViModeFpalLan2; +extern OSViMode osViModeFpalLaf2; +extern OSViMode osViModeFpalHpn1; +extern OSViMode osViModeFpalHpf1; +extern OSViMode osViModeFpalHan1; +extern OSViMode osViModeFpalHaf1; +extern OSViMode osViModeFpalHpn2; +extern OSViMode osViModeFpalHpf2; + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Video interface (Vi) */ +extern u32 osViGetStatus(void); +extern u32 osViGetCurrentMode(void); +extern u32 osViGetCurrentLine(void); +extern u32 osViGetCurrentField(void); +extern void *osViGetCurrentFramebuffer(void); +extern void *osViGetNextFramebuffer(void); +extern void osViSetXScale(f32); +extern void osViSetYScale(f32); +extern void osViExtendVStart(u32); +extern void osViSetSpecialFeatures(u32); +extern void osViSetMode(OSViMode *); +extern void osViSetEvent(OSMesgQueue *, OSMesg, u32); +extern void osViSwapBuffer(void *); +extern void osViBlack(u8); +extern void osViFade(u8, u16); +extern void osViRepeatLine(u8); +extern void osCreateViManager(OSPri); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_VI_H_ */ diff --git a/include/ique/PR/os_voice.h b/include/ique/PR/os_voice.h new file mode 100755 index 00000000..207eb6f9 --- /dev/null +++ b/include/ique/PR/os_voice.h @@ -0,0 +1,108 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_voice.h,v $ + $Revision: 1.1.1.2 $ + $Date: 2002/10/29 08:06:34 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_VOICE_H_ +#define _OS_VOICE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef struct { /* Voice Recognition System */ + OSMesgQueue *__mq; /* SI Message Queue */ + int __channel; /* Controller Port # */ + s32 __mode; + u8 cmd_status; /* Command Status */ +} OSVoiceHandle; + +typedef struct { /* Voice Recognition System */ + u16 warning; + u16 answer_num; /* 0...5 */ + u16 voice_level; + u16 voice_sn; + u16 voice_time; + u16 answer[5]; + u16 distance[5]; +} OSVoiceData; + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* definition for Voice Recognition System */ + +#define VOICE_WARN_TOO_SMALL 0x0400 +#define VOICE_WARN_TOO_LARGE 0x0800 +#define VOICE_WARN_NOT_FIT 0x4000 +#define VOICE_WARN_TOO_NOISY 0x8000 + +#define VOICE_STATUS_READY 0 +#define VOICE_STATUS_START 1 +#define VOICE_STATUS_CANCEL 3 +#define VOICE_STATUS_BUSY 5 +#define VOICE_STATUS_END 7 + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Voice Recognition System */ +extern s32 osVoiceInit(OSMesgQueue *, OSVoiceHandle *, int); +extern s32 osVoiceCheckWord(u8 *data); +extern s32 osVoiceClearDictionary(OSVoiceHandle *, u8); +extern s32 osVoiceControlGain(OSVoiceHandle *, s32, s32); +extern s32 osVoiceSetWord(OSVoiceHandle *, u8 *); +extern s32 osVoiceStartReadData(OSVoiceHandle *); +extern s32 osVoiceStopReadData(OSVoiceHandle *); +extern s32 osVoiceGetReadData(OSVoiceHandle *, OSVoiceData *); +extern s32 osVoiceMaskDictionary(OSVoiceHandle *, u8 *, int); +extern void osVoiceCountSyllables(u8 *, u32 *); + + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_VOICE_H_ */ diff --git a/include/ique/PR/ramrom.h b/include/ique/PR/ramrom.h new file mode 100755 index 00000000..7ac67d4c --- /dev/null +++ b/include/ique/PR/ramrom.h @@ -0,0 +1,118 @@ +#ifndef _RAMROM_H +#define _RAMROM_H + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.3 $ + * $Date: 2003/04/26 23:43:20 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/ramrom.h,v $ + * + **************************************************************************/ + +/* + * Defines for the GIO card in the Nintendo Development Station + * + * The RAM on the GIO card acts as ROM for the game + * Interrupts available between the game and the Indy host + * + * The last part of the ramrom is used for communication between + * game and host. There are 6 4K buffers defined: + * log, printf, rmon to indy, rmon from indy, app to indy, app from indy + * The last 8 bytes of the buffer are used in the emulator environment + */ + +#define RAMROM_SIZE (0x1000000) + +#define RAMROM_BUF_SIZE (4096) +#define RAMROM_MSG_SIZE (RAMROM_BUF_SIZE*6) +#define RAMROM_MSG_ADDR (RAMROM_SIZE - RAMROM_MSG_SIZE) +#define RAMROM_MSG_HDR_SIZE (3*sizeof(long)) +#define RAMROM_USER_DATA_SIZE (RAMROM_MSG_SIZE-RAMROM_MSG_HDR_SIZE) + +#define RAMROM_APP_READ_ADDR (RAMROM_MSG_ADDR + (0*RAMROM_BUF_SIZE)) +#ifdef BBPLAYER +extern unsigned long __osBbIsBb; +#define RAMROM_APP_WRITE_ADDR (__osBbIsBb ? 0x04980000 : (RAMROM_MSG_ADDR + (1*RAMROM_BUF_SIZE))) +#else +#define RAMROM_APP_WRITE_ADDR (RAMROM_MSG_ADDR + (1*RAMROM_BUF_SIZE)) +#endif +#define RAMROM_RMON_READ_ADDR (RAMROM_MSG_ADDR + (2*RAMROM_BUF_SIZE)) +#define RAMROM_RMON_WRITE_ADDR (RAMROM_MSG_ADDR + (3*RAMROM_BUF_SIZE)) +#define RAMROM_PRINTF_ADDR (RAMROM_MSG_ADDR + (4*RAMROM_BUF_SIZE)) +#define RAMROM_LOG_ADDR (RAMROM_MSG_ADDR + (5*RAMROM_BUF_SIZE)) + +/*#define RAMROM_GIO_INTERRUPT (RAMROM_MSG_ADDR + RAMROM_MSG_SIZE - 4)*/ + +/* + * For the initial round of PIF bringup, we will load in a bootstrap loader + * 0x400 bytes into the ramrom, and the rom will be loaded at 0x2000 + */ +#ifndef _HW_VERSION_1 +#define RAMROM_BOOTSTRAP_OFFSET 0x40 +#define RAMROM_GAME_OFFSET 0x1000 +#define RAMROM_FONTDATA_OFFSET 0xb70 +#define RAMROM_FONTDATA_SIZE 1152 +#else +#define RAMROM_BOOTSTRAP_OFFSET 0x400 +#define RAMROM_GAME_OFFSET 0x2000 +#endif +#define RAMROM_CLOCKRATE_OFFSET 0x4 +#define RAMROM_CLOCKRATE_MASK 0xfffffff0 +#define RAMROM_BOOTADDR_OFFSET 0x8 +#define RAMROM_RELEASE_OFFSET 0xc +/* + * Second version of the PIF jumps to location 0x1000, and we'll put a jump to + * location 0x400 into the ramrom (for backwards compatibility). + */ +#define RAMROM_PIF2BOOTSTRAP_OFFSET 0x1000 + +typedef struct { + long type; + long length; /* in bytes of userdata */ + long magic; + char userdata[RAMROM_USER_DATA_SIZE]; +} RamRomBuffer; + +/* + * Interrupt values (must fit in 6 bits!) + * values are used for both request & response + * Transactions initiated by the host start with HOST + * and those initiated by the target start with GAME. + */ + +#define HOST_PIACCESS_REQ 1 +#define HOST_DBG_CMD_READY 2 +#define GAME_DBG_DATA_SEND 3 +#define HOST_DBG_DATA_ACK 4 +#define GAME_PRINTF_SEND 5 +#define HOST_PRINTF_ACK 6 +#define GAME_LOG_SEND 7 +#define HOST_LOG_ACK 8 +#define HOST_APP_CMD_READY 9 +#define GAME_APP_DATA_READY 10 +#define HOST_PROF_REQ 11 +#define GAME_PROF_SEND 12 +#define HOST_PROF_ACK 13 +#define GAME_FAULT_SEND 14 +#define HOST_FAULT_ACK 15 +#define GAME_EXIT 16 +#define HOST_DATA_ACK 17 + +#ifdef _EMULATOR +void __RamRomInit(int key, void *romaddr); +void __RamRomDestroy(int key); +#endif /* _EMULATOR */ + +#endif /* !_RAMROM_H */ diff --git a/include/ique/PR/rcp.h b/include/ique/PR/rcp.h new file mode 100755 index 00000000..0a51d6c2 --- /dev/null +++ b/include/ique/PR/rcp.h @@ -0,0 +1,885 @@ +#ifndef _RCP_H_ +#define _RCP_H_ + +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * File: rcp.h + * + * This file contains register and bit definitions for RCP memory map. + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/rcp.h,v $ + * + **************************************************************************/ + +#include +#include + +/********************************************************************** + * + * Here is a quick overview of the RCP memory map: + * + +0x0000_0000 .. 0x03ef_ffff RDRAM memory +0x03f0_0000 .. 0x03ff_ffff RDRAM registers + + RCP registers (see below) +0x0400_0000 .. 0x040f_ffff SP registers +0x0410_0000 .. 0x041f_ffff DP command registers +0x0420_0000 .. 0x042f_ffff DP span registers +0x0430_0000 .. 0x043f_ffff MI registers +0x0440_0000 .. 0x044f_ffff VI registers +0x0450_0000 .. 0x045f_ffff AI registers +0x0460_0000 .. 0x046f_ffff PI registers +0x0470_0000 .. 0x047f_ffff RI registers +0x0480_0000 .. 0x048f_ffff SI registers +0x0490_0000 .. 0x04ff_ffff unused + +0x0500_0000 .. 0x05ff_ffff cartridge domain 2 +0x0600_0000 .. 0x07ff_ffff cartridge domain 1 +0x0800_0000 .. 0x0fff_ffff cartridge domain 2 +0x1000_0000 .. 0x1fbf_ffff cartridge domain 1 + +0x1fc0_0000 .. 0x1fc0_07bf PIF Boot Rom (1984 bytes) +0x1fc0_07c0 .. 0x1fc0_07ff PIF (JoyChannel) RAM (64 bytes) +0x1fc0_0800 .. 0x1fcf_ffff Reserved +0x1fd0_0000 .. 0x7fff_ffff cartridge domain 1 +0x8000_0000 .. 0xffff_ffff external SysAD device + +The Indy development board use cartridge domain 1: +0x1000_0000 .. 0x10ff_ffff RAMROM +0x1800_0000 .. 0x1800_0003 GIO interrupt (6 bits valid in 4 bytes) +0x1800_0400 .. 0x1800_0403 GIO sync (6 bits valid in 4 bytes) +0x1800_0800 .. 0x1800_0803 CART interrupt (6 bits valid in 4 bytes) + + + +**************************************************************************/ + + +/************************************************************************* + * RDRAM Memory (Assumes that maximum size is 4 MB) + */ +#define RDRAM_0_START 0x00000000 +#define RDRAM_0_END 0x001FFFFF +#define RDRAM_1_START 0x00200000 +#define RDRAM_1_END 0x003FFFFF + +#define RDRAM_START RDRAM_0_START +#define RDRAM_END RDRAM_1_END + + +/************************************************************************* + * Address predicates + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) +#define IS_RDRAM(x) ((unsigned)(x) >= RDRAM_START && \ + (unsigned)(x) < RDRAM_END) +#endif + + +/************************************************************************* + * RDRAM Registers (0x03f0_0000 .. 0x03ff_ffff) + */ +#define RDRAM_BASE_REG 0x03F00000 + +#define RDRAM_CONFIG_REG (RDRAM_BASE_REG+0x00) +#define RDRAM_DEVICE_TYPE_REG (RDRAM_BASE_REG+0x00) +#define RDRAM_DEVICE_ID_REG (RDRAM_BASE_REG+0x04) +#define RDRAM_DELAY_REG (RDRAM_BASE_REG+0x08) +#define RDRAM_MODE_REG (RDRAM_BASE_REG+0x0c) +#define RDRAM_REF_INTERVAL_REG (RDRAM_BASE_REG+0x10) +#define RDRAM_REF_ROW_REG (RDRAM_BASE_REG+0x14) +#define RDRAM_RAS_INTERVAL_REG (RDRAM_BASE_REG+0x18) +#define RDRAM_MIN_INTERVAL_REG (RDRAM_BASE_REG+0x1c) +#define RDRAM_ADDR_SELECT_REG (RDRAM_BASE_REG+0x20) +#define RDRAM_DEVICE_MANUF_REG (RDRAM_BASE_REG+0x24) + +#define RDRAM_0_DEVICE_ID 0 +#define RDRAM_1_DEVICE_ID 1 + +#define RDRAM_RESET_MODE 0 +#define RDRAM_ACTIVE_MODE 1 +#define RDRAM_STANDBY_MODE 2 + +#define RDRAM_LENGTH (2*512*2048) +#define RDRAM_0_BASE_ADDRESS (RDRAM_0_DEVICE_ID*RDRAM_LENGTH) +#define RDRAM_1_BASE_ADDRESS (RDRAM_1_DEVICE_ID*RDRAM_LENGTH) + +#define RDRAM_0_CONFIG 0x00000 +#define RDRAM_1_CONFIG 0x00400 +#define RDRAM_GLOBAL_CONFIG 0x80000 + + +/************************************************************************* + * PIF Physical memory map (total size = 2 KB) + * + * Size Description Mode + * 1FC007FF +-------+-----------------+-----+ + * | 64 B | JoyChannel RAM | R/W | + * 1FC007C0 +-------+-----------------+-----+ + * |1984 B | Boot ROM | * | * = Reserved + * 1FC00000 +-------+-----------------+-----+ + * + */ +#define PIF_ROM_START 0x1FC00000 +#define PIF_ROM_END 0x1FC007BF +#define PIF_RAM_START 0x1FC007C0 +#define PIF_RAM_END 0x1FC007FF + + +/************************************************************************* + * Controller channel + * Each game controller channel has 4 error bits that are defined in bit 6-7 of + * the Rx and Tx data size area bytes. Programmers need to clear these bits + * when setting the Tx/Rx size area values for a channel + */ +#define CHNL_ERR_NORESP 0x80 /* Bit 7 (Rx): No response error */ +#define CHNL_ERR_OVERRUN 0x40 /* Bit 6 (Rx): Overrun error */ +#define CHNL_ERR_FRAME 0x80 /* Bit 7 (Tx): Frame error */ +#define CHNL_ERR_COLLISION 0x40 /* Bit 6 (Tx): Collision error */ + +#define CHNL_ERR_MASK 0xC0 /* Bit 6-7: channel errors */ + + +/************************************************************************* + * External device info + */ +#define DEVICE_TYPE_CART 0 /* ROM cartridge */ +#define DEVICE_TYPE_BULK 1 /* ROM bulk */ +#define DEVICE_TYPE_64DD 2 /* 64 Disk Drive */ +#define DEVICE_TYPE_SRAM 3 /* SRAM */ +/* 4-6 are reserved */ +#define DEVICE_TYPE_INIT 7 /* initial value */ +/* 8-14 are reserved */ + +/************************************************************************* + * SP Memory + */ +#define SP_DMEM_START 0x04000000 /* read/write */ +#define SP_DMEM_END 0x04000FFF +#define SP_IMEM_START 0x04001000 /* read/write */ +#define SP_IMEM_END 0x04001FFF + +/************************************************************************* + * SP CP0 Registers + */ + +#define SP_BASE_REG 0x04040000 + +/* SP memory address (R/W): [11:0] DMEM/IMEM address; [12] 0=DMEM,1=IMEM */ +#define SP_MEM_ADDR_REG (SP_BASE_REG+0x00) /* Master */ + +/* SP DRAM DMA address (R/W): [23:0] RDRAM address */ +#define SP_DRAM_ADDR_REG (SP_BASE_REG+0x04) /* Slave */ + +/* SP read DMA length (R/W): [11:0] length, [19:12] count, [31:20] skip */ +/* direction: I/DMEM <- RDRAM */ +#define SP_RD_LEN_REG (SP_BASE_REG+0x08) /* R/W: read len */ + +/* SP write DMA length (R/W): [11:0] length, [19:12] count, [31:20] skip */ +/* direction: I/DMEM -> RDRAM */ +#define SP_WR_LEN_REG (SP_BASE_REG+0x0C) /* R/W: write len */ + +/* SP status (R/W): [14:0] valid bits; see below for write/read mode */ +#define SP_STATUS_REG (SP_BASE_REG+0x10) + +/* SP DMA full (R): [0] valid bit; dma full */ +#define SP_DMA_FULL_REG (SP_BASE_REG+0x14) + +/* SP DMA busy (R): [0] valid bit; dma busy */ +#define SP_DMA_BUSY_REG (SP_BASE_REG+0x18) + +/* SP semaphore (R/W): Read: [0] semaphore flag (set on read) */ +/* Write: [] clear semaphore flag */ +#define SP_SEMAPHORE_REG (SP_BASE_REG+0x1C) + +/* SP PC (R/W): [11:0] program counter */ +#define SP_PC_REG 0x04080000 + +/* SP MEM address: bit 12 specifies if address is IMEM or DMEM */ +#define SP_DMA_DMEM 0x0000 /* Bit 12: 0=DMEM, 1=IMEM */ +#define SP_DMA_IMEM 0x1000 /* Bit 12: 0=DMEM, 1=IMEM */ + +/* + * Values to clear/set bit in status reg (SP_STATUS_REG - write) + */ +#define SP_CLR_HALT 0x00001 /* Bit 0: clear halt */ +#define SP_SET_HALT 0x00002 /* Bit 1: set halt */ +#define SP_CLR_BROKE 0x00004 /* Bit 2: clear broke */ +#define SP_CLR_INTR 0x00008 /* Bit 3: clear intr */ +#define SP_SET_INTR 0x00010 /* Bit 4: set intr */ +#define SP_CLR_SSTEP 0x00020 /* Bit 5: clear sstep */ +#define SP_SET_SSTEP 0x00040 /* Bit 6: set sstep */ +#define SP_CLR_INTR_BREAK 0x00080 /* Bit 7: clear intr on break */ +#define SP_SET_INTR_BREAK 0x00100 /* Bit 8: set intr on break */ +#define SP_CLR_SIG0 0x00200 /* Bit 9: clear signal 0 */ +#define SP_SET_SIG0 0x00400 /* Bit 10: set signal 0 */ +#define SP_CLR_SIG1 0x00800 /* Bit 11: clear signal 1 */ +#define SP_SET_SIG1 0x01000 /* Bit 12: set signal 1 */ +#define SP_CLR_SIG2 0x02000 /* Bit 13: clear signal 2 */ +#define SP_SET_SIG2 0x04000 /* Bit 14: set signal 2 */ +#define SP_CLR_SIG3 0x08000 /* Bit 15: clear signal 3 */ +#define SP_SET_SIG3 0x10000 /* Bit 16: set signal 3 */ +#define SP_CLR_SIG4 0x20000 /* Bit 17: clear signal 4 */ +#define SP_SET_SIG4 0x40000 /* Bit 18: set signal 4 */ +#define SP_CLR_SIG5 0x80000 /* Bit 19: clear signal 5 */ +#define SP_SET_SIG5 0x100000 /* Bit 20: set signal 5 */ +#define SP_CLR_SIG6 0x200000 /* Bit 21: clear signal 6 */ +#define SP_SET_SIG6 0x400000 /* Bit 22: set signal 6 */ +#define SP_CLR_SIG7 0x800000 /* Bit 23: clear signal 7 */ +#define SP_SET_SIG7 0x1000000 /* Bit 24: set signal 7 */ + +/* + * Patterns to interpret status reg (SP_STATUS_REG - read) + */ +#define SP_STATUS_HALT 0x001 /* Bit 0: halt */ +#define SP_STATUS_BROKE 0x002 /* Bit 1: broke */ +#define SP_STATUS_DMA_BUSY 0x004 /* Bit 2: dma busy */ +#define SP_STATUS_DMA_FULL 0x008 /* Bit 3: dma full */ +#define SP_STATUS_IO_FULL 0x010 /* Bit 4: io full */ +#define SP_STATUS_SSTEP 0x020 /* Bit 5: single step */ +#define SP_STATUS_INTR_BREAK 0x040 /* Bit 6: interrupt on break */ +#define SP_STATUS_SIG0 0x080 /* Bit 7: signal 0 set */ +#define SP_STATUS_SIG1 0x100 /* Bit 8: signal 1 set */ +#define SP_STATUS_SIG2 0x200 /* Bit 9: signal 2 set */ +#define SP_STATUS_SIG3 0x400 /* Bit 10: signal 3 set */ +#define SP_STATUS_SIG4 0x800 /* Bit 11: signal 4 set */ +#define SP_STATUS_SIG5 0x1000 /* Bit 12: signal 5 set */ +#define SP_STATUS_SIG6 0x2000 /* Bit 13: signal 6 set */ +#define SP_STATUS_SIG7 0x4000 /* Bit 14: signal 7 set */ + +/* + * Use of SIG bits + */ +#define SP_CLR_YIELD SP_CLR_SIG0 +#define SP_SET_YIELD SP_SET_SIG0 +#define SP_STATUS_YIELD SP_STATUS_SIG0 +#define SP_CLR_YIELDED SP_CLR_SIG1 +#define SP_SET_YIELDED SP_SET_SIG1 +#define SP_STATUS_YIELDED SP_STATUS_SIG1 +#define SP_CLR_TASKDONE SP_CLR_SIG2 +#define SP_SET_TASKDONE SP_SET_SIG2 +#define SP_STATUS_TASKDONE SP_STATUS_SIG2 +#define SP_CLR_RSPSIGNAL SP_CLR_SIG3 +#define SP_SET_RSPSIGNAL SP_SET_SIG3 +#define SP_STATUS_RSPSIGNAL SP_STATUS_SIG3 +#define SP_CLR_CPUSIGNAL SP_CLR_SIG4 +#define SP_SET_CPUSIGNAL SP_SET_SIG4 +#define SP_STATUS_CPUSIGNAL SP_STATUS_SIG4 + +/* SP IMEM BIST REG (R/W): [6:0] BIST status bits; see below for detail */ +#define SP_IBIST_REG 0x04080004 + +/* + * Patterns to interpret status reg (SP_BIST_REG - write) + */ +#define SP_IBIST_CHECK 0x01 /* Bit 0: BIST check */ +#define SP_IBIST_GO 0x02 /* Bit 1: BIST go */ +#define SP_IBIST_CLEAR 0x04 /* Bit 2: BIST clear */ + +/* + * Patterns to interpret status reg (SP_BIST_REG - read) + */ +/* First 2 bits are same as in write mode: + * Bit 0: BIST check; Bit 1: BIST go + */ +#define SP_IBIST_DONE 0x04 /* Bit 2: BIST done */ +#define SP_IBIST_FAILED 0x78 /* Bit [6:3]: BIST fail */ + + +/************************************************************************* + * DP Command Registers + */ +#define DPC_BASE_REG 0x04100000 + +/* DP CMD DMA start (R/W): [23:0] DMEM/RDRAM start address */ +#define DPC_START_REG (DPC_BASE_REG+0x00) + +/* DP CMD DMA end (R/W): [23:0] DMEM/RDRAM end address */ +#define DPC_END_REG (DPC_BASE_REG+0x04) + +/* DP CMD DMA end (R): [23:0] DMEM/RDRAM current address */ +#define DPC_CURRENT_REG (DPC_BASE_REG+0x08) + +/* DP CMD status (R/W): [9:0] valid bits - see below for definitions */ +#define DPC_STATUS_REG (DPC_BASE_REG+0x0C) + +/* DP clock counter (R): [23:0] clock counter */ +#define DPC_CLOCK_REG (DPC_BASE_REG+0x10) + +/* DP buffer busy counter (R): [23:0] clock counter */ +#define DPC_BUFBUSY_REG (DPC_BASE_REG+0x14) + +/* DP pipe busy counter (R): [23:0] clock counter */ +#define DPC_PIPEBUSY_REG (DPC_BASE_REG+0x18) + +/* DP TMEM load counter (R): [23:0] clock counter */ +#define DPC_TMEM_REG (DPC_BASE_REG+0x1C) + +/* + * Values to clear/set bit in status reg (DPC_STATUS_REG - write) + */ +#define DPC_CLR_XBUS_DMEM_DMA 0x0001 /* Bit 0: clear xbus_dmem_dma */ +#define DPC_SET_XBUS_DMEM_DMA 0x0002 /* Bit 1: set xbus_dmem_dma */ +#define DPC_CLR_FREEZE 0x0004 /* Bit 2: clear freeze */ +#define DPC_SET_FREEZE 0x0008 /* Bit 3: set freeze */ +#define DPC_CLR_FLUSH 0x0010 /* Bit 4: clear flush */ +#define DPC_SET_FLUSH 0x0020 /* Bit 5: set flush */ +#define DPC_CLR_TMEM_CTR 0x0040 /* Bit 6: clear tmem ctr */ +#define DPC_CLR_PIPE_CTR 0x0080 /* Bit 7: clear pipe ctr */ +#define DPC_CLR_CMD_CTR 0x0100 /* Bit 8: clear cmd ctr */ +#define DPC_CLR_CLOCK_CTR 0x0200 /* Bit 9: clear clock ctr */ + +/* + * Patterns to interpret status reg (DPC_STATUS_REG - read) + */ +#define DPC_STATUS_XBUS_DMEM_DMA 0x001 /* Bit 0: xbus_dmem_dma */ +#define DPC_STATUS_FREEZE 0x002 /* Bit 1: freeze */ +#define DPC_STATUS_FLUSH 0x004 /* Bit 2: flush */ +/*#define DPC_STATUS_FROZEN 0x008*/ /* Bit 3: frozen */ +#define DPC_STATUS_START_GCLK 0x008 /* Bit 3: start gclk */ +#define DPC_STATUS_TMEM_BUSY 0x010 /* Bit 4: tmem busy */ +#define DPC_STATUS_PIPE_BUSY 0x020 /* Bit 5: pipe busy */ +#define DPC_STATUS_CMD_BUSY 0x040 /* Bit 6: cmd busy */ +#define DPC_STATUS_CBUF_READY 0x080 /* Bit 7: cbuf ready */ +#define DPC_STATUS_DMA_BUSY 0x100 /* Bit 8: dma busy */ +#define DPC_STATUS_END_VALID 0x200 /* Bit 9: end valid */ +#define DPC_STATUS_START_VALID 0x400 /* Bit 10: start valid */ + + +/************************************************************************* + * DP Span Registers + */ +#define DPS_BASE_REG 0x04200000 + +/* DP tmem bist (R/W): [10:0] BIST status bits; see below for detail */ +#define DPS_TBIST_REG (DPS_BASE_REG+0x00) + +/* DP span test mode (R/W): [0] Span buffer test access enable */ +#define DPS_TEST_MODE_REG (DPS_BASE_REG+0x04) + +/* DP span buffer test address (R/W): [6:0] bits; see below for detail */ +#define DPS_BUFTEST_ADDR_REG (DPS_BASE_REG+0x08) + +/* DP span buffer test data (R/W): [31:0] span buffer data */ +#define DPS_BUFTEST_DATA_REG (DPS_BASE_REG+0x0C) + +/* + * Patterns to interpret status reg (DPS_TMEM_BIST_REG - write) + */ +#define DPS_TBIST_CHECK 0x01 /* Bit 0: BIST check */ +#define DPS_TBIST_GO 0x02 /* Bit 1: BIST go */ +#define DPS_TBIST_CLEAR 0x04 /* Bit 2: BIST clear */ + +/* + * Patterns to interpret status reg (DPS_TMEM_BIST_REG - read) + */ +/* First 2 bits are same as in write mode: + * Bit 0: BIST check; Bit 1: BIST go + */ +#define DPS_TBIST_DONE 0x004 /* Bit 2: BIST done */ +#define DPS_TBIST_FAILED 0x7F8 /* Bit [10:3]: BIST fail */ + + +/************************************************************************* + * MIPS Interface (MI) Registers + */ +#define MI_BASE_REG 0x04300000 + +/* + * MI init mode (W): [6:0] init length, [7] clear init mode, [8] set init mode + * [9/10] clear/set ebus test mode, [11] clear DP interrupt + * (R): [6:0] init length, [7] init mode, [8] ebus test mode + */ +#define MI_INIT_MODE_REG (MI_BASE_REG+0x00) +#define MI_MODE_REG MI_INIT_MODE_REG + +/* + * Values to clear/set bit in mode reg (MI_MODE_REG - write) + */ +#define MI_CLR_INIT 0x0080 /* Bit 7: clear init mode */ +#define MI_SET_INIT 0x0100 /* Bit 8: set init mode */ +#define MI_CLR_EBUS 0x0200 /* Bit 9: clear ebus test */ +#define MI_SET_EBUS 0x0400 /* Bit 10: set ebus test mode */ +#define MI_CLR_DP_INTR 0x0800 /* Bit 11: clear dp interrupt */ +#define MI_CLR_RDRAM 0x1000 /* Bit 12: clear RDRAM reg */ +#define MI_SET_RDRAM 0x2000 /* Bit 13: set RDRAM reg mode */ + +/* + * Patterns to interpret mode reg (MI_MODE_REG - read) + */ +#define MI_MODE_INIT 0x0080 /* Bit 7: init mode */ +#define MI_MODE_EBUS 0x0100 /* Bit 8: ebus test mode */ +#define MI_MODE_RDRAM 0x0200 /* Bit 9: RDRAM reg mode */ + +/* MI version (R): [7:0] io, [15:8] rac, [23:16] rdp, [31:24] rsp */ +#define MI_VERSION_REG (MI_BASE_REG+0x04) +#define MI_NOOP_REG MI_VERSION_REG + +/* MI interrupt (R): [5:0] valid bits - see below for bit patterns */ +#define MI_INTR_REG (MI_BASE_REG+0x08) + +/* + * MI interrupt mask (W): [11:0] valid bits - see below for bit patterns + * (R): [5:0] valid bits - see below for bit patterns + */ +#define MI_INTR_MASK_REG (MI_BASE_REG+0x0C) + +/* + * The following are values to check for interrupt setting (MI_INTR_REG) + */ +#define MI_INTR_SP 0x01 /* Bit 0: SP intr */ +#define MI_INTR_SI 0x02 /* Bit 1: SI intr */ +#define MI_INTR_AI 0x04 /* Bit 2: AI intr */ +#define MI_INTR_VI 0x08 /* Bit 3: VI intr */ +#define MI_INTR_PI 0x10 /* Bit 4: PI intr */ +#define MI_INTR_DP 0x20 /* Bit 5: DP intr */ + +/* + * The following are values to clear/set various interrupt bit mask + * They can be ORed together to manipulate multiple bits + * (MI_INTR_MASK_REG - write) + */ +#define MI_INTR_MASK_CLR_SP 0x0001 /* Bit 0: clear SP mask */ +#define MI_INTR_MASK_SET_SP 0x0002 /* Bit 1: set SP mask */ +#define MI_INTR_MASK_CLR_SI 0x0004 /* Bit 2: clear SI mask */ +#define MI_INTR_MASK_SET_SI 0x0008 /* Bit 3: set SI mask */ +#define MI_INTR_MASK_CLR_AI 0x0010 /* Bit 4: clear AI mask */ +#define MI_INTR_MASK_SET_AI 0x0020 /* Bit 5: set AI mask */ +#define MI_INTR_MASK_CLR_VI 0x0040 /* Bit 6: clear VI mask */ +#define MI_INTR_MASK_SET_VI 0x0080 /* Bit 7: set VI mask */ +#define MI_INTR_MASK_CLR_PI 0x0100 /* Bit 8: clear PI mask */ +#define MI_INTR_MASK_SET_PI 0x0200 /* Bit 9: set PI mask */ +#define MI_INTR_MASK_CLR_DP 0x0400 /* Bit 10: clear DP mask */ +#define MI_INTR_MASK_SET_DP 0x0800 /* Bit 11: set DP mask */ + +/* + * The following are values to check for interrupt mask setting + * (MI_INTR_MASK_REG - read) + */ +#define MI_INTR_MASK_SP 0x01 /* Bit 0: SP intr mask */ +#define MI_INTR_MASK_SI 0x02 /* Bit 1: SI intr mask */ +#define MI_INTR_MASK_AI 0x04 /* Bit 2: AI intr mask */ +#define MI_INTR_MASK_VI 0x08 /* Bit 3: VI intr mask */ +#define MI_INTR_MASK_PI 0x10 /* Bit 4: PI intr mask */ +#define MI_INTR_MASK_DP 0x20 /* Bit 5: DP intr mask */ + + +/************************************************************************* + * Video Interface (VI) Registers + */ +#define VI_BASE_REG 0x04400000 + +/* VI status/control (R/W): [15-0] valid bits: + * [1:0] = type[1:0] (pixel size) + * 0: blank (no data, no sync) + * 1: reserved + * 2: 5/5/5/3 ("16" bit) + * 3: 8/8/8/8 (32 bit) + * [2] = gamma_dither_enable (normally on, unless "special effect") + * [3] = gamma_enable (normally on, unless MPEG/JPEG) + * [4] = divot_enable (normally on if antialiased, unless decal lines) + * [5] = reserved - always off + * [6] = serrate (always on if interlaced, off if not) + * [7] = reserved - diagnostics only + * [9:8] = anti-alias (aa) mode[1:0] + * 0: aa & resamp (always fetch extra lines) + * 1: aa & resamp (fetch extra lines if needed) + * 2: resamp only (treat as all fully covered) + * 3: neither (replicate pixels, no interpolate) + * [11] = reserved - diagnostics only + * [15:12] = reserved + * + */ +#define VI_STATUS_REG (VI_BASE_REG+0x00) +#define VI_CONTROL_REG VI_STATUS_REG + +/* VI origin (R/W): [23:0] frame buffer origin in bytes */ +#define VI_ORIGIN_REG (VI_BASE_REG+0x04) +#define VI_DRAM_ADDR_REG VI_ORIGIN_REG + +/* VI width (R/W): [11:0] frame buffer line width in pixels */ +#define VI_WIDTH_REG (VI_BASE_REG+0x08) +#define VI_H_WIDTH_REG VI_WIDTH_REG + +/* VI vertical intr (R/W): [9:0] interrupt when current half-line = V_INTR */ +#define VI_INTR_REG (VI_BASE_REG+0x0C) +#define VI_V_INTR_REG VI_INTR_REG + +/* + * VI current vertical line (R/W): [9:0] current half line, sampled once per + * line (the lsb of V_CURRENT is constant within a field, and in + * interlaced modes gives the field number - which is constant for non- + * interlaced modes) + * - Any write to this register will clear interrupt line + */ +#define VI_CURRENT_REG (VI_BASE_REG+0x10) +#define VI_V_CURRENT_LINE_REG VI_CURRENT_REG + +/* + * VI video timing (R/W): [ 7: 0] horizontal sync width in pixels, + * [15: 8] color burst width in pixels, + * [19:16] vertical sync width in half lines, + * [29:20] start of color burst in pixels from h-sync + */ +#define VI_BURST_REG (VI_BASE_REG+0x14) +#define VI_TIMING_REG VI_BURST_REG + +/* VI vertical sync (R/W): [9:0] number of half-lines per field */ +#define VI_V_SYNC_REG (VI_BASE_REG+0x18) + +/* VI horizontal sync (R/W): [11: 0] total duration of a line in 1/4 pixel + * [20:16] a 5-bit leap pattern used for PAL only + * (h_sync_period) + */ +#define VI_H_SYNC_REG (VI_BASE_REG+0x1C) + +/* + * VI horizontal sync leap (R/W): [11: 0] identical to h_sync_period + * [27:16] identical to h_sync_period + */ +#define VI_LEAP_REG (VI_BASE_REG+0x20) +#define VI_H_SYNC_LEAP_REG VI_LEAP_REG + +/* + * VI horizontal video (R/W): [ 9: 0] end of active video in screen pixels + * : [25:16] start of active video in screen pixels + */ +#define VI_H_START_REG (VI_BASE_REG+0x24) +#define VI_H_VIDEO_REG VI_H_START_REG + +/* + * VI vertical video (R/W): [ 9: 0] end of active video in screen half-lines + * : [25:16] start of active video in screen half-lines + */ +#define VI_V_START_REG (VI_BASE_REG+0x28) +#define VI_V_VIDEO_REG VI_V_START_REG + +/* + * VI vertical burst (R/W): [ 9: 0] end of color burst enable in half-lines + * : [25:16] start of color burst enable in half-lines + */ +#define VI_V_BURST_REG (VI_BASE_REG+0x2C) + +/* VI x-scale (R/W): [11: 0] 1/horizontal scale up factor (2.10 format) + * [27:16] horizontal subpixel offset (2.10 format) + */ +#define VI_X_SCALE_REG (VI_BASE_REG+0x30) + +/* VI y-scale (R/W): [11: 0] 1/vertical scale up factor (2.10 format) + * [27:16] vertical subpixel offset (2.10 format) + */ +#define VI_Y_SCALE_REG (VI_BASE_REG+0x34) + +/* + * Patterns to interpret VI_CONTROL_REG + */ +#define VI_CTRL_TYPE_16 0x00002 /* Bit [1:0] pixel size: 16 bit */ +#define VI_CTRL_TYPE_32 0x00003 /* Bit [1:0] pixel size: 32 bit */ +#define VI_CTRL_GAMMA_DITHER_ON 0x00004 /* Bit 2: default = on */ +#define VI_CTRL_GAMMA_ON 0x00008 /* Bit 3: default = on */ +#define VI_CTRL_DIVOT_ON 0x00010 /* Bit 4: default = on */ +#define VI_CTRL_SERRATE_ON 0x00040 /* Bit 6: on if interlaced */ +#define VI_CTRL_ANTIALIAS_MASK 0x00300 /* Bit [9:8] anti-alias mode */ +#define VI_CTRL_DITHER_FILTER_ON 0x10000 /* Bit 16: dither-filter mode */ + +/* + * Possible video clocks (NTSC or PAL) + */ +#define VI_NTSC_CLOCK 48681812 /* Hz = 48.681812 MHz */ +#define VI_PAL_CLOCK 49656530 /* Hz = 49.656530 MHz */ +#define VI_MPAL_CLOCK 48628316 /* Hz = 48.628316 MHz */ + + +/************************************************************************* + * Audio Interface (AI) Registers + * + * The address and length registers are double buffered; that is, they + * can be written twice before becoming full. + * The address must be written before the length. + */ +#define AI_BASE_REG 0x04500000 + +/* AI DRAM address (W): [23:0] starting RDRAM address (8B-aligned) */ +#define AI_DRAM_ADDR_REG (AI_BASE_REG+0x00) /* R0: DRAM address */ + +/* AI length (R/W): [14:0] transfer length (v1.0) - Bottom 3 bits are ignored */ +/* [17:0] transfer length (v2.0) - Bottom 3 bits are ignored */ +#define AI_LEN_REG (AI_BASE_REG+0x04) /* R1: Length */ + +/* AI control (W): [0] DMA enable - if LSB == 1, DMA is enabled */ +#define AI_CONTROL_REG (AI_BASE_REG+0x08) /* R2: DMA Control */ + +/* + * AI status (R): [31]/[0] ai_full (addr & len buffer full), [30] ai_busy + * Note that a 1->0 transition in ai_full will set interrupt + * (W): clear audio interrupt + */ +#define AI_STATUS_REG (AI_BASE_REG+0x0C) /* R3: Status */ + +/* + * AI DAC sample period register (W): [13:0] dac rate + * - vid_clock/(dperiod + 1) is the DAC sample rate + * - (dperiod + 1) >= 66 * (aclockhp + 1) must be true + */ +#define AI_DACRATE_REG (AI_BASE_REG+0x10) /* R4: DAC rate 14-lsb*/ + +/* + * AI bit rate (W): [3:0] bit rate (abus clock half period register - aclockhp) + * - vid_clock/(2 * (aclockhp + 1)) is the DAC clock rate + * - The abus clock stops if aclockhp is zero + */ +#define AI_BITRATE_REG (AI_BASE_REG+0x14) /* R5: Bit rate 4-lsb */ + +/* Value for control register */ +#define AI_CONTROL_DMA_ON 0x01 /* LSB = 1: DMA enable*/ +#define AI_CONTROL_DMA_OFF 0x00 /* LSB = 1: DMA enable*/ + +/* Value for status register */ +#define AI_STATUS_FIFO_FULL 0x80000000 /* Bit 31: full */ +#define AI_STATUS_DMA_BUSY 0x40000000 /* Bit 30: busy */ + +/* DAC rate = video clock / audio frequency + * - DAC rate >= (66 * Bit rate) must be true + */ +#define AI_MAX_DAC_RATE 16384 /* 14-bit+1 */ +#define AI_MIN_DAC_RATE 132 + +/* Bit rate <= (DAC rate / 66) */ +#define AI_MAX_BIT_RATE 16 /* 4-bit+1 */ +#define AI_MIN_BIT_RATE 2 + +/* + * Maximum and minimum values for audio frequency based on video clocks + * max frequency = (video clock / min dac rate) + * min frequency = (video clock / max dac rate) + */ +#define AI_NTSC_MAX_FREQ 368000 /* 368 KHz */ +#define AI_NTSC_MIN_FREQ 3000 /* 3 KHz ~ 2971 Hz */ + +#define AI_PAL_MAX_FREQ 376000 /* 376 KHz */ +#define AI_PAL_MIN_FREQ 3050 /* 3 KHz ~ 3031 Hz */ + +#define AI_MPAL_MAX_FREQ 368000 /* 368 KHz */ +#define AI_MPAL_MIN_FREQ 3000 /* 3 KHz ~ 2968 Hz */ + + +/************************************************************************* + * Peripheral Interface (PI) Registers + */ +#define PI_BASE_REG 0x04600000 + +/* PI DRAM address (R/W): [23:0] starting RDRAM address */ +#define PI_DRAM_ADDR_REG (PI_BASE_REG+0x00) /* DRAM address */ + +/* PI pbus (cartridge) address (R/W): [31:0] starting AD16 address */ +#define PI_CART_ADDR_REG (PI_BASE_REG+0x04) + +/* PI read length (R/W): [23:0] read data length */ +#define PI_RD_LEN_REG (PI_BASE_REG+0x08) + +/* PI write length (R/W): [23:0] write data length */ +#define PI_WR_LEN_REG (PI_BASE_REG+0x0C) + +/* + * PI status (R): [0] DMA busy, [1] IO busy, [2], error + * (W): [0] reset controller (and abort current op), [1] clear intr + */ +#define PI_STATUS_REG (PI_BASE_REG+0x10) + +/* PI dom1 latency (R/W): [7:0] domain 1 device latency */ +#define PI_BSD_DOM1_LAT_REG (PI_BASE_REG+0x14) + +/* PI dom1 pulse width (R/W): [7:0] domain 1 device R/W strobe pulse width */ +#define PI_BSD_DOM1_PWD_REG (PI_BASE_REG+0x18) + +/* PI dom1 page size (R/W): [3:0] domain 1 device page size */ +#define PI_BSD_DOM1_PGS_REG (PI_BASE_REG+0x1C) /* page size */ + +/* PI dom1 release (R/W): [1:0] domain 1 device R/W release duration */ +#define PI_BSD_DOM1_RLS_REG (PI_BASE_REG+0x20) + +/* PI dom2 latency (R/W): [7:0] domain 2 device latency */ +#define PI_BSD_DOM2_LAT_REG (PI_BASE_REG+0x24) /* Domain 2 latency */ + +/* PI dom2 pulse width (R/W): [7:0] domain 2 device R/W strobe pulse width */ +#define PI_BSD_DOM2_PWD_REG (PI_BASE_REG+0x28) /* pulse width */ + +/* PI dom2 page size (R/W): [3:0] domain 2 device page size */ +#define PI_BSD_DOM2_PGS_REG (PI_BASE_REG+0x2C) /* page size */ + +/* PI dom2 release (R/W): [1:0] domain 2 device R/W release duration */ +#define PI_BSD_DOM2_RLS_REG (PI_BASE_REG+0x30) /* release duration */ + +#define PI_DOMAIN1_REG PI_BSD_DOM1_LAT_REG +#define PI_DOMAIN2_REG PI_BSD_DOM2_LAT_REG + +#define PI_DOM_LAT_OFS 0x00 +#define PI_DOM_PWD_OFS 0x04 +#define PI_DOM_PGS_OFS 0x08 +#define PI_DOM_RLS_OFS 0x0C + +/* + * PI status register has 3 bits active when read from (PI_STATUS_REG - read) + * Bit 0: DMA busy - set when DMA is in progress + * Bit 1: IO busy - set when IO is in progress + * Bit 2: Error - set when CPU issues IO request while DMA is busy + */ +#define PI_STATUS_ERROR 0x04 +#define PI_STATUS_IO_BUSY 0x02 +#define PI_STATUS_DMA_BUSY 0x01 + +/* PI status register has 2 bits active when written to: + * Bit 0: When set, reset PIC + * Bit 1: When set, clear interrupt flag + * The values of the two bits can be ORed together to both reset PIC and + * clear interrupt at the same time. + * + * Note: + * - The PIC does generate an interrupt at the end of each DMA. CPU + * needs to clear the interrupt flag explicitly (from an interrupt + * handler) by writing into the STATUS register with bit 1 set. + * + * - When a DMA completes, the interrupt flag is set. CPU can issue + * another request even while the interrupt flag is set (as long as + * PIC is idle). However, it is the CPU's responsibility for + * maintaining accurate correspondence between DMA completions and + * interrupts. + * + * - When PIC is reset, if PIC happens to be busy, an interrupt will + * be generated as PIC returns to idle. Otherwise, no interrupt will + * be generated and PIC remains idle. + */ +/* + * Values to clear interrupt/reset PIC (PI_STATUS_REG - write) + */ +#define PI_STATUS_RESET 0x01 +#define PI_SET_RESET PI_STATUS_RESET + +#define PI_STATUS_CLR_INTR 0x02 +#define PI_CLR_INTR PI_STATUS_CLR_INTR + +#define PI_DMA_BUFFER_SIZE 128 + +#define PI_DOM1_ADDR1 0x06000000 /* to 0x07FFFFFF */ +#define PI_DOM1_ADDR2 0x10000000 /* to 0x1FBFFFFF */ +#define PI_DOM1_ADDR3 0x1FD00000 /* to 0x7FFFFFFF */ +#define PI_DOM2_ADDR1 0x05000000 /* to 0x05FFFFFF */ +#define PI_DOM2_ADDR2 0x08000000 /* to 0x0FFFFFFF */ + + +/************************************************************************* + * RDRAM Interface (RI) Registers + */ +#define RI_BASE_REG 0x04700000 + +/* RI mode (R/W): [1:0] operating mode, [2] stop T active, [3] stop R active */ +#define RI_MODE_REG (RI_BASE_REG+0x00) + +/* RI config (R/W): [5:0] current control input, [6] current control enable */ +#define RI_CONFIG_REG (RI_BASE_REG+0x04) + +/* RI current load (W): [] any write updates current control register */ +#define RI_CURRENT_LOAD_REG (RI_BASE_REG+0x08) + +/* RI select (R/W): [2:0] receive select, [2:0] transmit select */ +#define RI_SELECT_REG (RI_BASE_REG+0x0C) + +/* RI refresh (R/W): [7:0] clean refresh delay, [15:8] dirty refresh delay, + * [16] refresh bank, [17] refresh enable + * [18] refresh optimize + */ +#define RI_REFRESH_REG (RI_BASE_REG+0x10) +#define RI_COUNT_REG RI_REFRESH_REG + +/* RI latency (R/W): [3:0] DMA latency/overlap */ +#define RI_LATENCY_REG (RI_BASE_REG+0x14) + +/* RI error (R): [0] nack error, [1] ack error */ +#define RI_RERROR_REG (RI_BASE_REG+0x18) + +/* RI error (W): [] any write clears all error bits */ +#define RI_WERROR_REG (RI_BASE_REG+0x1C) + + +/************************************************************************* + * Serial Interface (SI) Registers + */ +#define SI_BASE_REG 0x04800000 + +/* SI DRAM address (R/W): [23:0] starting RDRAM address */ +#define SI_DRAM_ADDR_REG (SI_BASE_REG+0x00) /* R0: DRAM address */ + +/* SI address read 64B (W): [] any write causes a 64B DMA write */ +#define SI_PIF_ADDR_RD64B_REG (SI_BASE_REG+0x04) /* R1: 64B PIF->DRAM */ + +/* Address SI_BASE_REG + (0x08, 0x0c, 0x14) are reserved */ + +/* SI address write 64B (W): [] any write causes a 64B DMA read */ +#define SI_PIF_ADDR_WR64B_REG (SI_BASE_REG+0x10) /* R4: 64B DRAM->PIF */ + +/* + * SI status (W): [] any write clears interrupt + * (R): [0] DMA busy, [1] IO read busy, [2] reserved + * [3] DMA error, [12] interrupt + */ +#define SI_STATUS_REG (SI_BASE_REG+0x18) /* R6: Status */ + +/* SI status register has the following bits active: + * 0: DMA busy - set when DMA is in progress + * 1: IO busy - set when IO access is in progress + * 3: DMA error - set when there are overlapping DMA requests + * 12: Interrupt - Interrupt set + */ +#define SI_STATUS_DMA_BUSY 0x0001 +#define SI_STATUS_RD_BUSY 0x0002 +#define SI_STATUS_DMA_ERROR 0x0008 +#define SI_STATUS_INTERRUPT 0x1000 + +/************************************************************************* + * Development Board GIO Control Registers + */ + +#define GIO_BASE_REG 0x18000000 + +/* Game to Host Interrupt */ +#define GIO_GIO_INTR_REG (GIO_BASE_REG+0x000) + +/* Game to Host SYNC */ +#define GIO_GIO_SYNC_REG (GIO_BASE_REG+0x400) + +/* Host to Game Interrupt */ +#define GIO_CART_INTR_REG (GIO_BASE_REG+0x800) + + +/************************************************************************* + * Common macros + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) +#define IO_READ(addr) (*(vu32 *)PHYS_TO_K1(addr)) +#define IO_WRITE(addr,data) (*(vu32 *)PHYS_TO_K1(addr)=(u32)(data)) +#define RCP_STAT_PRINT \ + rmonPrintf("current=%x start=%x end=%x dpstat=%x spstat=%x\n", \ + IO_READ(DPC_CURRENT_REG), \ + IO_READ(DPC_START_REG), \ + IO_READ(DPC_END_REG), \ + IO_READ(DPC_STATUS_REG), \ + IO_READ(SP_STATUS_REG)) + +#endif + +#endif /* _RCP_H_ */ + diff --git a/include/ique/PR/rdb.h b/include/ique/PR/rdb.h new file mode 100755 index 00000000..c2b9775d --- /dev/null +++ b/include/ique/PR/rdb.h @@ -0,0 +1,107 @@ + +/************************************************************************** + * + * $Revision: 1.5 $ + * $Date: 2004/02/06 02:26:05 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/rdb.h,v $ + * + **************************************************************************/ + +#ifndef _RDB_H +#define _RDB_H + +/* U64 side address */ +#define RDB_BASE_REG 0xc0000000 +#define RDB_WRITE_INTR_REG (RDB_BASE_REG + 0x8) +#define RDB_READ_INTR_REG (RDB_BASE_REG + 0xc) +#define RDB_BASE_VIRTUAL_ADDR 0x80000000 + +/* packet type Have six bits, so can have up to 63 types */ +#define RDB_TYPE_INVALID 0 +#define RDB_TYPE_GtoH_PRINT 1 +#define RDB_TYPE_GtoH_FAULT 2 +#define RDB_TYPE_GtoH_LOG_CT 3 +#define RDB_TYPE_GtoH_LOG 4 +#define RDB_TYPE_GtoH_READY_FOR_DATA 5 +#define RDB_TYPE_GtoH_DATA_CT 6 +#define RDB_TYPE_GtoH_DATA 7 +#define RDB_TYPE_GtoH_DEBUG 8 +#define RDB_TYPE_GtoH_RAMROM 9 +#define RDB_TYPE_GtoH_DEBUG_DONE 10 +#define RDB_TYPE_GtoH_DEBUG_READY 11 +#define RDB_TYPE_GtoH_KDEBUG 12 +#define RDB_TYPE_GtoH_PROF_DATA 22 +#ifdef BBPLAYER +#define RDB_TYPE_GtoH_DATAB 23 +#define RDB_TYPE_GtoH_SYNC 25 +#endif + + +#define RDB_TYPE_HtoG_LOG_DONE 13 +#define RDB_TYPE_HtoG_DEBUG 14 +#define RDB_TYPE_HtoG_DEBUG_CT 15 +#define RDB_TYPE_HtoG_DATA 16 +#define RDB_TYPE_HtoG_DATA_DONE 17 +#define RDB_TYPE_HtoG_REQ_RAMROM 18 +#define RDB_TYPE_HtoG_FREE_RAMROM 19 +#define RDB_TYPE_HtoG_KDEBUG 20 +#define RDB_TYPE_HtoG_PROF_SIGNAL 21 +#ifdef BBPLAYER +#define RDB_TYPE_HtoG_DATAB 24 +#define RDB_TYPE_HtoG_SYNC_DONE 26 +#define RDB_TYPE_HtoG_DEBUG_DONE 27 +#endif + + +#define RDB_PROF_ACK_SIG 1 +#define RDB_PROF_FLUSH_SIG 2 +#define PROF_BLOCK_SIZE 2048 + +#ifdef BBPLAYER +#define RDB_LOG_MAX_BLOCK_SIZE 0x1000 +#define RDB_DATA_MAX_BLOCK_SIZE 0x1000 +#else +#define RDB_LOG_MAX_BLOCK_SIZE 0x8000 +#define RDB_DATA_MAX_BLOCK_SIZE 0x8000 +#endif + + +/* GIO side address */ +#define GIO_RDB_BASE_REG 0xbf480000 +#define GIO_RDB_WRITE_INTR_REG (GIO_RDB_BASE_REG + 0x8) +#define GIO_RDB_READ_INTR_REG (GIO_RDB_BASE_REG + 0xc) + +/* minor device number */ +#define GIO_RDB_PRINT_MINOR 1 +#define GIO_RDB_DEBUG_MINOR 2 + +/* interrupt bit */ +#define GIO_RDB_WRITE_INTR_BIT 0x80000000 +#define GIO_RDB_READ_INTR_BIT 0x40000000 + +/* debug command */ +#define DEBUG_COMMAND_NULL 0 +#define DEBUG_COMMAND_MEMORY 1 +#define DEBUG_COMMAND_REGISTER 2 +#define DEBUG_COMMAND_INVALID 255 + +/* debug state */ +#define DEBUG_STATE_NULL 0 +#define DEBUG_STATE_RECEIVE 1 +#define DEBUG_STATE_INVALID 255 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Structure for debug port */ +typedef struct { + unsigned type : 6; /* 0: invalid, 1: print, 2: debug */ + unsigned length : 2; /* 1, 2, or 3 */ + char buf[3]; /* character buffer */ +} rdbPacket; + +extern unsigned int __osRdbWriteOK; +extern unsigned int __osRdbSendMessage; + +#endif /* _LANGUAGE_C */ + +#endif /* !_RDB_H */ diff --git a/include/ique/PR/region.h b/include/ique/PR/region.h new file mode 100755 index 00000000..f84d7c06 --- /dev/null +++ b/include/ique/PR/region.h @@ -0,0 +1,123 @@ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * Module: region.h + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Author: blythe $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/region.h,v $ + * + * Description: + * This file contains macros and structure definitions for the region + * library. + * + **************************************************************************/ + + +#ifndef _REGION_H_ +#define _REGION_H_ + + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + + +/*************************************** + * + * Global defines + * + */ + /* Alignment sizes */ +#define ALIGNSZ (sizeof(long long)) /* 8 bytes */ +#define ALIGNOFFST (ALIGNSZ-1) + + /* size for storing index to free buffer */ +#define BUF_CTRL_SIZE ALIGNSZ + + /* Max bufcount = 32K */ +#define MAX_BUFCOUNT 0x8000 + /* code for last free buffer */ +#define BUF_FREE_WO_NEXT 0x8000 + +/* + * Global defines for alignment size (default is 8-byte alignment) + */ +#define OS_RG_ALIGN_2B 2 /* 2 bytes = 16-bit alignment */ +#define OS_RG_ALIGN_4B 4 /* 4 bytes = 32-bit alignment */ +#define OS_RG_ALIGN_8B 8 /* 8 bytes = 64-bit alignment */ +#define OS_RG_ALIGN_16B 16 /* 16 bytes = 128-bit alignment */ + +#define OS_RG_ALIGN_DEFAULT OS_RG_ALIGN_8B + + +/*************************************** + * + * Macro definitions + * + */ + +/* Perform alignment on input 's' */ +#define ALIGN(s, align) (((u32)(s) + ((align)-1)) & ~((align)-1)) + + +/*************************************** + * + * Typedefs & structure definitions + * + */ +/* + * Structure for region header/control area + */ +typedef struct _Region_s { + u8 *r_startBufferAddress; /* start address to data buffer */ + u8 *r_endAddress; /* end address of region */ + s32 r_bufferSize; /* size of buffers for this region */ + s32 r_bufferCount; /* up to 32K entries; MSB is used for + setting end-of-list/used */ + u16 r_freeList; /* point to array index of first + available memory buffer */ + u16 r_alignSize; /* alignment size (# of bytes) */ +} OSRegion; + +/* + * Macro to simplify accessing region header structure + */ +#define RP(x) rp->r_##x + + +/*************************************** + * + * Function prototypes + * + */ +extern void *osCreateRegion(void *, u32, u32, u32); +extern void *osMalloc(void *); +extern void osFree(void *, void *); +extern s32 osGetRegionBufCount(void *); +extern s32 osGetRegionBufSize(void *); + + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + + +#endif /* _REGION_H_ */ + + diff --git a/include/ique/PR/rmon.h b/include/ique/PR/rmon.h new file mode 100755 index 00000000..e949a0f0 --- /dev/null +++ b/include/ique/PR/rmon.h @@ -0,0 +1,53 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.2 $ + * $Date: 2004/02/06 02:27:21 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/rmon.h,v $ + * + **************************************************************************/ + +#ifndef _RMON_H_ +#define _RMON_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#define RMON_DBG_BUF_SIZE 2048 +#define RMON_STACKSIZE 0x1000 + +#ifdef BBPLAYER + +/* Let's use GDB debugger instead of RMON */ +#define rmonMain gdbMain +#define rmonPrintf osSyncPrintf + +#define GDB_DBG_BUF_SIZE 2048 +#define GDB_STACKSIZE 0x1000 + +extern void gdbMain( void * ); +extern void gdbInit(); + +#else +extern void rmonMain( void * ); +extern void rmonPrintf( const char *, ... ); +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_H */ diff --git a/include/ique/PR/rsp.h b/include/ique/PR/rsp.h new file mode 100755 index 00000000..2ae03153 --- /dev/null +++ b/include/ique/PR/rsp.h @@ -0,0 +1,85 @@ + +/* + * rsp.h + * + * Mon Mar 21 21:15:39 PST 1994 + * + * This file is some common definitions for RSP code. + * It enforces the programming model for the task lists. + * + */ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/rsp.h,v $ + * + **************************************************************************/ + +#ifndef _RSP_H_ +#define _RSP_H_ 1 + +#define RSP_DMEM_BASE 0x04000000 +#define RSP_IMEM_BASE 0x04001000 + +#define RSP_SCRATCH_BASE 0x20000000 /* for sim use only */ + +#define DCACHEBASEHI 0x0400 +#define DCACHEBASELO 0x0000 + +#define RSPBOOTBASEHI 0x0400 +#define RSPBOOTBASELO 0x1000 + +#define TASKBASEHI 0x0400 +#define TASKBASELO 0x1080 + +#define HOSTSEMADDRHI 0x0000 # semaphore address +#define HOSTSEMADDRLO 0x1ffc # semaphore address + +/* for now, we'll just copy all the output somewhere out-of-the-way... */ +#define RDP_BUFF_HI 0x2000 +#define RDP_BUFF_LO 0x0000 + +/* for now, we'll just fix some DRAM stack (for matrices, etc.) */ +#define DRAM_STACK_HI 0x001f +#define DRAM_STACK_LO 0xfc00 /* a 1K stack... */ + +/* + * this is a hack; we need a place in DRAM for the RSP to + * use as a stack. + */ +#define rsp_DRAM_STACK_HI 0x0020 +#define rsp_DRAM_STACK_LO 0x0000 + + /* where is the trig ROM? */ +#define rsp_TRIG_BASE 0x10010000 +#define rsp_TRIG_BASEHI 0x1001 +#define rsp_TRIG_BASELO 0x0000 + +#ifdef _LANGUAGE_ASSEMBLY + + .symbol RSPBOOTBASE, RSP_IMEM_BASE # start of rsp bootstrap + .symbol TASKBASE, (RSP_IMEM_BASE+0x80) # 32 inst. for bootstrap + + .name DMA_CACHE, $c0 # these are CP0 registers + .name DMA_DRAM, $c1 # + .name DMA_READ_LENGTH, $c2 + .name DMA_WRITE_LENGTH, $c3 + .name SP_STATUS, $c4 + .name DMA_FULL, $c5 + .name DMA_BUSY, $c6 + .name SP_RESERVED, $c7 + .name CMD_START, $c8 + .name CMD_END, $c9 + .name CMD_CURRENT, $c10 + .name CMD_STATUS, $c11 + .name CMD_CLOCK, $c12 + .name CMD_BUSY, $c13 + .name CMD_PIPE_BUSY, $c14 + .name CMD_TMEM_BUSY, $c15 + +#endif + + +#endif diff --git a/include/ique/PR/rsp_ipc.h b/include/ique/PR/rsp_ipc.h new file mode 100755 index 00000000..7e5b74ff --- /dev/null +++ b/include/ique/PR/rsp_ipc.h @@ -0,0 +1,69 @@ + +/* + * rsp_ipc.h + * + * Mon Mar 13 10:24:35 PST 1995 + * + * + */ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/rsp_ipc.h,v $ + * + **************************************************************************/ + +#ifndef _RSP_IPC_H_ +#define _RSP_IPC_H_ 1 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +typedef enum +{ + CMD_NULL, + CMD_CMD, + CMD_QUIT, + CMD_DMA_READ, + CMD_DMA_WRITE, + CMD_READ_WORD, + CMD_WRITE_WORD, + CMD_LAST +} rsp_shm_cmd_t; + +typedef struct +{ + unsigned long int dram[(2048 * 1024)>>2]; /* share DRAM */ + /* + * howardc - Keep buff right after the dram to keep it 64b aligned. This + * is the fake DMA IPC buffer to communicate to rspsim. If 64b aligned, the + * _emAlign64b (64bit alignment checking code) will properly check for + * alignment. + */ + unsigned long int buff[1024]; /* could be IMEM or DMEM */ + char string[256]; /* pass command string */ + rsp_shm_cmd_t cmd; /* what to do */ + int reg; /* which register */ + unsigned long int addr; /* RSP memory address for copy */ + unsigned long int length; /* length of data to be copied */ +} rsp_shm_buf_t; + + +/* + * simple semaphore interface, stolen from Stevens' Networking book. + * + * Tue Feb 7 13:38:49 PST 1995 + * + */ +extern int sem_create(key_t key, int initval); +extern int sem_open(key_t key); +extern int sem_rm(int id); +extern int sem_close(int id); +extern int sem_wait(int id); +extern int sem_signal(int id); +extern int sem_op(int id, int value); + +#endif + +#endif diff --git a/include/ique/PR/sched.h b/include/ique/PR/sched.h new file mode 100755 index 00000000..f3466941 --- /dev/null +++ b/include/ique/PR/sched.h @@ -0,0 +1,115 @@ +/*==================================================================== + * sched.h + * + * Synopsis: + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/sched.h,v $ + * + **************************************************************************/ + +#ifndef __sched__ +#define __sched__ + +#include + +#define OS_SC_STACKSIZE 0x2000 + +#define OS_SC_RETRACE_MSG 1 +#define OS_SC_DONE_MSG 2 +#define OS_SC_RDP_DONE_MSG 3 +#define OS_SC_PRE_NMI_MSG 4 +#define OS_SC_LAST_MSG 4 /* this should have highest number */ +#define OS_SC_MAX_MESGS 8 + +typedef struct { + short type; + char misc[30]; +} OSScMsg; + +typedef struct OSScTask_s { + struct OSScTask_s *next; /* note: this must be first */ + u32 state; + u32 flags; + void *framebuffer; /* used by graphics tasks */ + + OSTask list; + OSMesgQueue *msgQ; + OSMesg msg; +#ifndef _FINALROM /* all #ifdef items should */ + OSTime startTime; /* remain at the end!!, or */ + OSTime totalTime; /* possible conflict if */ +#endif /* FINALROM library used with */ +} OSScTask; /* non FINALROM code */ + +/* + * OSScTask flags: + */ +#define OS_SC_NEEDS_RDP 0x0001 /* uses the RDP */ +#define OS_SC_NEEDS_RSP 0x0002 /* uses the RSP */ +#define OS_SC_DRAM_DLIST 0x0004 /* SP & DP communicate through DRAM */ +#define OS_SC_PARALLEL_TASK 0x0010 /* must be first gfx task on list */ +#define OS_SC_LAST_TASK 0x0020 /* last task in queue for frame */ +#define OS_SC_SWAPBUFFER 0x0040 /* swapbuffers when gfx task done */ + +#define OS_SC_RCP_MASK 0x0003 /* mask for needs bits */ +#define OS_SC_TYPE_MASK 0x0007 /* complete type mask */ +/* + * OSScClient: + * + * Data structure used by threads that wish to communicate to the + * scheduling thread + * + */ +typedef struct SCClient_s { + struct SCClient_s *next; /* next client in the list */ + OSMesgQueue *msgQ; /* where to send the frame msg */ +} OSScClient; + +typedef struct { + OSScMsg retraceMsg; + OSScMsg prenmiMsg; + OSMesgQueue interruptQ; + OSMesg intBuf[OS_SC_MAX_MESGS]; + OSMesgQueue cmdQ; + OSMesg cmdMsgBuf[OS_SC_MAX_MESGS]; + OSThread thread; + OSScClient *clientList; + OSScTask *audioListHead; + OSScTask *gfxListHead; + OSScTask *audioListTail; + OSScTask *gfxListTail; + OSScTask *curRSPTask; + OSScTask *curRDPTask; + u32 frameCount; + s32 doAudio; +} OSSched; + +void osCreateScheduler(OSSched *s, void *stack, OSPri priority, + u8 mode, u8 numFields); +void osScAddClient(OSSched *s, OSScClient *c, OSMesgQueue *msgQ); +void osScRemoveClient(OSSched *s, OSScClient *c); +OSMesgQueue *osScGetCmdQ(OSSched *s); + +#endif + diff --git a/include/ique/PR/sp.h b/include/ique/PR/sp.h new file mode 100755 index 00000000..4d7737c6 --- /dev/null +++ b/include/ique/PR/sp.h @@ -0,0 +1,196 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * Sprite library include file + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/sp.h,v $ + * + **************************************************************************/ + +#ifndef _SP_H_ +#define _SP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include + +struct bitmap { + s16 width; /* Size across to draw in texels */ + /* Done if width = 0 */ + + s16 width_img; /* Size across of bitmap in texels */ + /* Done if width = 0 */ + + s16 s; /* Horizontal offset into bitmap */ + /* if (s > width), then load only! */ + + s16 t; /* Vertical offset into base */ + + void *buf; /* Pointer to bitmap data */ + /* Don't re-load if new buf */ + /* is the same as the old one */ + /* Skip if NULL */ + + s16 actualHeight; /* True Height of this bitmap piece */ + + s16 LUToffset; /* LUT base index */ +}; + +typedef struct bitmap Bitmap; + +struct sprite { + s16 x,y; /* Target position */ + + s16 width, height; /* Target size */ + + f32 scalex, scaley; /* Texel to Pixel scale factor */ + + s16 expx, expy; /* Explosion spacing */ + + u16 attr; /* Attribute Flags */ + s16 zdepth; /* Z Depth */ + + u8 red; /* Red component */ + u8 green; /* Green component */ + u8 blue; /* Blue component */ + u8 alpha; /* Alpha component */ + + s16 startTLUT; /* Lookup Table Entry Starting index */ + s16 nTLUT; /* Total number of Lookup Table Entries */ + + int *LUT; /* Pointer to Lookup Table */ + + s16 istart; /* Starting bitmap index */ + s16 istep; /* Bitmaps index step (see SP_INCY) */ + /* if 0, then variable width bitmaps */ + + s16 nbitmaps; /* Total number of bitmaps */ + s16 ndisplist; /* Total number of display-list words */ + + s16 bmheight; /* Bitmap Texel height (Used) */ + s16 bmHreal; /* Bitmap Texel height (Real) */ + u8 bmfmt; /* Bitmap Format */ + u8 bmsiz; /* Bitmap Texel Size */ + + Bitmap *bitmap; /* Pointer to first bitmap */ + + Gfx *rsp_dl; /* Pointer to RSP display list */ + + Gfx *rsp_dl_next; /* Pointer to next RSP display entry */ + + s16 frac_s, /* Fractional Texture offsets */ + frac_t; /* These have 5 fraction bits */ +}; + +typedef struct sprite Sprite; + +/* + * DANGER! + * This is bad programming. Where the *heck* do these numbers come + * from? + * + * They are obviously 'maximums' from the sprite library, but since + * the sprite library is built on top of gbi.h, which includes macros + * that decode into multiple macros, etc., it is nearly impossible to + * know what these maximums should be. + * + * Worse, there are some gbi macros (texture alignment mostly) that + * decode into *many* macros, so if we choose that as a maximum, we + * are wasting TONS of space... + * + * These numbers work for "reasonable" sprite library usage, and + * there is an assert() in the library to detect when they aren't + * enough. (use the debug version) + */ +#define DL_BM_OVERHEAD (12) +#define DL_SPRITE_OVERHEAD (24) + +#define NUM_DL(nb) ((nb)*DL_BM_OVERHEAD +DL_SPRITE_OVERHEAD) + +/* + * Misc constants + */ + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +/* + * For sprite->attr + */ + +#define SP_TRANSPARENT 0x00000001 +#define SP_CUTOUT 0x00000002 +#define SP_HIDDEN 0x00000004 +#define SP_Z 0x00000008 +#define SP_SCALE 0x00000010 +#define SP_FASTCOPY 0x00000020 +#define SP_OVERLAP 0x00000040 +#define SP_TEXSHIFT 0x00000080 +#define SP_FRACPOS 0x00000100 +#define SP_TEXSHUF 0x00000200 +#define SP_EXTERN 0x00000400 + +/* + * Function wrapper + */ +#if defined(F3DEX_GBI_2) +#define spMove spX2Move +#define spSetZ spX2SetZ +#define spScissor spX2Scissor +#define spDraw spX2Draw +#define spInit spX2Init +#define spFinish spX2Finish +#elif defined(F3DEX_GBI) +#define spMove spXMove +#define spSetZ spXSetZ +#define spScissor spXScissor +#define spDraw spXDraw +#define spInit spXInit +#define spFinish spXFinish +#endif + +/* + * Function prototypes + */ + +void spSetAttribute (Sprite *sp, s32 attr); +void spClearAttribute (Sprite *sp, s32 attr); +void spMove (Sprite *sp, s32 x, s32 y); +void spScale (Sprite *sp, f32 sx, f32 sy); +void spSetZ (Sprite *sp, s32 z ); +void spColor (Sprite *sp, u8 red, u8 green, u8 blue, u8 alpha); +Gfx *spDraw (Sprite *sp); +void spInit( Gfx **glistp ); +void spScissor( s32 xmin, s32 xmax, s32 ymin, s32 ymax ); +void spFinish( Gfx **glistp ); + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* _SP_H_ */ diff --git a/include/ique/PR/sptask.h b/include/ique/PR/sptask.h new file mode 100755 index 00000000..ec4d8d4e --- /dev/null +++ b/include/ique/PR/sptask.h @@ -0,0 +1,201 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/sptask.h,v $ + * + **************************************************************************/ + +#ifndef _SPTASK_H_ +#define _SPTASK_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Task List Structure. + * + * Things an app might pass to the SP via the task list. + * Not every task ucode would need/use every field, but + * + * - type (audio, gfx, video, ...) + * - flags + * - wait for DP to drain before running new task + * - SEE BIT DEFINITIONS UNDER "Task Flags field" + * - pointer to boot ucode + * - size of boot ucode + * - pointer to ucode + * - size of ucode + * - pointer to initial DMEM data + * - size of initial DMEM data + * - pointer to DRAM stack + * - size of DRAM stack (max) + * - pointer to output buffer + * - pointer to store output buffer length + * - generic data pointer (for display list, etc.) + * - generic data length (for display list, etc.) + * - pointer to buffer where to store saved DMEM (in yield case) + * - size of buffer to store saved DMEM. + * + * IMPORTANT!!! Watch alignment issues. + * + * IMPORTANT!!! Watch data cache issues. The RCP may write data into the + * dram_stack, output_buff, output_buff_size, and the yield_data_ptr areas. + * These buffers should be cache aligned and use the entire line (16 bytes) to + * avoid corruption by writebacks by the CPU (cache tearing). + * + * IMPORTANT!!! all addresses are virtual addresses. Library does + * any necessary translation. + * + */ +typedef struct { + u32 type; + u32 flags; + + u64 *ucode_boot; + u32 ucode_boot_size; + + u64 *ucode; + u32 ucode_size; + + u64 *ucode_data; + u32 ucode_data_size; + + u64 *dram_stack; + u32 dram_stack_size; + + u64 *output_buff; + u64 *output_buff_size; + + u64 *data_ptr; + u32 data_size; + + u64 *yield_data_ptr; + u32 yield_data_size; + +} OSTask_t; + +typedef union { + OSTask_t t; + long long int force_structure_alignment; +} OSTask; + +typedef u32 OSYieldResult; + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_ASSEMBLY + +/* + * For the RSP ucode: + * offsets into the task structure + */ + +#include + +#endif + +/* + * Task Flags field + */ +#define OS_TASK_YIELDED 0x0001 +#define OS_TASK_DP_WAIT 0x0002 +#define OS_TASK_LOADABLE 0x0004 +#define OS_TASK_SP_ONLY 0x0008 +#define OS_TASK_USR0 0x0010 +#define OS_TASK_USR1 0x0020 +#define OS_TASK_USR2 0x0040 +#define OS_TASK_USR3 0x0080 + +/* + * Size of Yield buffer. The taskHdrPtr->t.yield_data_ptr must point to a + * buffer of this size. (The size is in bytes). ONLY If the task will NEVER + * yield it may be a null pointer. The buffer must be aligned to a 64 bit + * boundary. The taskHdrPtr->t.yield_data_ptr must be set to point to the + * buffer BEFORE the task is started. + */ +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)||defined(F3DEX_GBI_2)) +#define OS_YIELD_DATA_SIZE 0xc00 +#else +#define OS_YIELD_DATA_SIZE 0x900 +#endif +#define OS_YIELD_AUDIO_SIZE 0x400 + +/************************************************************************** + * + * Global definitions + * + */ + + + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/* + * this macro simulates atomic action. + */ +#define osSpTaskStart(tp) \ + { \ + osSpTaskLoad((tp)); \ + osSpTaskStartGo((tp)); \ + } + + +/************************************************************************** + * + * Extern variables + * + */ + + +/************************************************************************** + * + * Function prototypes + * + */ + +/* + * break this up into two steps for debugging. + */ +extern void osSpTaskLoad(OSTask *tp); +extern void osSpTaskStartGo(OSTask *tp); + +extern void osSpTaskYield(void); +extern OSYieldResult osSpTaskYielded(OSTask *tp); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_SPTASK_H */ diff --git a/include/ique/PR/sptaskoff.h b/include/ique/PR/sptaskoff.h new file mode 100755 index 00000000..640a837c --- /dev/null +++ b/include/ique/PR/sptaskoff.h @@ -0,0 +1,17 @@ +#define OS_TASK_SIZE 64 +#define OS_TASK_OFF_TYPE 0 +#define OS_TASK_OFF_FLAGS 4 +#define OS_TASK_OFF_UBOOT 8 +#define OS_TASK_OFF_UBOOT_SZ 12 +#define OS_TASK_OFF_UCODE 16 +#define OS_TASK_OFF_UCODE_SZ 20 +#define OS_TASK_OFF_UDATA 24 +#define OS_TASK_OFF_UDATA_SZ 28 +#define OS_TASK_OFF_STACK 32 +#define OS_TASK_OFF_STACK_SZ 36 +#define OS_TASK_OFF_OUTBUFF 40 +#define OS_TASK_OFF_OUTBUFF_SZ 44 +#define OS_TASK_OFF_DATA 48 +#define OS_TASK_OFF_DATA_SZ 52 +#define OS_TASK_OFF_YIELD 56 +#define OS_TASK_OFF_YIELD_SZ 60 diff --git a/include/ique/PR/trace.h b/include/ique/PR/trace.h new file mode 100755 index 00000000..35dcd329 --- /dev/null +++ b/include/ique/PR/trace.h @@ -0,0 +1,82 @@ +#ifndef _TRACE_H_ +#define _TRACE_H_ + + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + + +/************************************************************************** + * + * Module: trace.h + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Author: blythe $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/trace.h,v $ + * + * Description: + * This file contains debbuging and tracing macros + * + **************************************************************************/ + + +/*************************************** + * + * Macro definitions + * + */ + +/* Debug macros */ + +#ifdef _TRACE +#undef _TRACE +#endif + +#ifdef _DEBUG + +#if defined( _EMULATOR ) || ( _INDY_TARGET ) +extern unsigned long Dflags; /* Global debug flag */ + + /* Debug flag settings */ +#define DALL 0xFFFFFFFF /* Turn on all debug types */ +#define DERROR 0x00000001 /* Turn on error tracing */ +#define DTHREAD 0x00000002 /* Turn on thread tracing */ +#define DTIMER 0x00000004 /* Turn on timer tracing */ +#define DMESSAGE 0x00000008 /* Turn on message tracing */ +#define DMEMORY 0x00000010 /* Turn on memory tracing */ +#define DREGION 0x00000020 /* Turn on region tracing */ + +#define _TRACE(type, code) { if (Dflags & (type)) \ + { printf("%s, %d: ", __FILE__, __LINE__); code; } } +#else + +#define _TRACE(type, code) + +#endif /* _EMULATOR | _INDY_TARGET */ + +#else + +#define _TRACE(type, code) + +#endif /* _DEBUG */ + + +/*************************************** + * + * Extern function prototypes + * + */ + + +#endif /* _TRACE_H_ */ + diff --git a/include/PR/ucode.h b/include/ique/PR/ucode.h similarity index 100% rename from include/PR/ucode.h rename to include/ique/PR/ucode.h diff --git a/include/ique/PR/ucode_debug.h b/include/ique/PR/ucode_debug.h new file mode 100755 index 00000000..f71a255b --- /dev/null +++ b/include/ique/PR/ucode_debug.h @@ -0,0 +1,54 @@ +/*---------------------------------------------------------------------* + Copyright (C) 1998, Nintendo. + + File ucode_debug.h + Coded by Yoshitaka Yasumoto. Nov 15, 1998. + + $Id: ucode_debug.h,v 1.1.1.1 2002/05/02 03:28:25 blythe Exp $ + *---------------------------------------------------------------------*/ +#ifndef _UCODE_DEBUG_H_ +#define _UCODE_DEBUG_H_ + +#define DEBUG_DL_PTR() IO_READ(SP_DMEM_START+0xfc0) + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) +/*========== F3DEX2/F3DLX2/L3DEX2/S2DEX2 ==========*/ +/* FIFO version */ +extern long long int gspF3DEX2d_fifoTextStart[], gspF3DEX2d_fifoTextEnd[]; +extern long long int gspF3DEX2d_fifoDataStart[], gspF3DEX2d_fifoDataEnd[]; +extern long long int gspF3DEX2d_NoN_fifoTextStart[],gspF3DEX2d_NoN_fifoTextEnd[]; +extern long long int gspF3DEX2d_NoN_fifoDataStart[],gspF3DEX2d_NoN_fifoDataEnd[]; +extern long long int gspF3DEX2d_Rej_fifoTextStart[],gspF3DEX2d_Rej_fifoTextEnd[]; +extern long long int gspF3DEX2d_Rej_fifoDataStart[],gspF3DEX2d_Rej_fifoDataEnd[]; +extern long long int gspF3DLX2d_Rej_fifoTextStart[],gspF3DLX2d_Rej_fifoTextEnd[]; +extern long long int gspF3DLX2d_Rej_fifoDataStart[],gspF3DLX2d_Rej_fifoDataEnd[]; +extern long long int gspL3DEX2d_fifoTextStart[], gspL3DEX2d_fifoTextEnd[]; +extern long long int gspL3DEX2d_fifoDataStart[], gspL3DEX2d_fifoDataEnd[]; +extern long long int gspS2DEX2d_fifoTextStart[], gspS2DEX2d_fifoTextEnd[]; +extern long long int gspS2DEX2d_fifoDataStart[], gspS2DEX2d_fifoDataEnd[]; + +/* XBUS version */ +extern long long int gspF3DEX2d_xbusTextStart[], gspF3DEX2d_xbusTextEnd[]; +extern long long int gspF3DEX2d_xbusDataStart[], gspF3DEX2d_xbusDataEnd[]; +extern long long int gspF3DEX2d_NoN_xbusTextStart[],gspF3DEX2d_NoN_xbusTextEnd[]; +extern long long int gspF3DEX2d_NoN_xbusDataStart[],gspF3DEX2d_NoN_xbusDataEnd[]; +extern long long int gspF3DEX2d_Rej_xbusTextStart[],gspF3DEX2d_Rej_xbusTextEnd[]; +extern long long int gspF3DEX2d_Rej_xbusDataStart[],gspF3DEX2d_Rej_xbusDataEnd[]; +extern long long int gspF3DLX2d_Rej_xbusTextStart[],gspF3DLX2d_Rej_xbusTextEnd[]; +extern long long int gspF3DLX2d_Rej_xbusDataStart[],gspF3DLX2d_Rej_xbusDataEnd[]; +extern long long int gspL3DEX2d_xbusTextStart[], gspL3DEX2d_xbusTextEnd[]; +extern long long int gspL3DEX2d_xbusDataStart[], gspL3DEX2d_xbusDataEnd[]; +extern long long int gspS2DEX2d_xbusTextStart[], gspS2DEX2d_xbusTextEnd[]; +extern long long int gspS2DEX2d_xbusDataStart[], gspS2DEX2d_xbusDataEnd[]; + +#endif /* _LANGUAGE_C */ +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif +#endif /* !_UCODE_DEBUG_H */ + +/*======== End of ucode_debug.h ========*/ diff --git a/include/ique/PR/ultraerror.h b/include/ique/PR/ultraerror.h new file mode 100755 index 00000000..33fce660 --- /dev/null +++ b/include/ique/PR/ultraerror.h @@ -0,0 +1,179 @@ +/*==================================================================== + * ultraerror.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/ultraerror.h,v $ + * + **************************************************************************/ + +#ifndef __ULTRAERROR_H__ +#define __ULTRAERROR_H__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#define OS_ERROR_FMT "/usr/lib/PR/error.fmt" +#define OS_ERROR_MAGIC 0x6b617479 + +/* OS error codes */ + +#define ERR_OSCREATETHREAD_SP 1 +#define ERR_OSCREATETHREAD_PRI 2 +#define ERR_OSSTARTTHREAD 3 +#define ERR_OSSETTHREADPRI 4 +#define ERR_OSCREATEMESGQUEUE 5 +#define ERR_OSSENDMESG 6 +#define ERR_OSJAMMESG 7 +#define ERR_OSRECVMESG 8 +#define ERR_OSSETEVENTMESG 9 +#define ERR_OSMAPTLB_INDEX 10 +#define ERR_OSMAPTLB_ASID 11 +#define ERR_OSUNMAPTLB 12 +#define ERR_OSSETTLBASID 13 +#define ERR_OSAISETFREQUENCY 14 +#define ERR_OSAISETNEXTBUFFER_ADDR 15 +#define ERR_OSAISETNEXTBUFFER_SIZE 16 +#define ERR_OSDPSETNEXTBUFFER_ADDR 17 +#define ERR_OSDPSETNEXTBUFFER_SIZE 18 +#define ERR_OSPIRAWREADIO 19 +#define ERR_OSPIRAWWRITEIO 20 +#define ERR_OSPIRAWSTARTDMA_DIR 21 +#define ERR_OSPIRAWSTARTDMA_DEVADDR 22 +#define ERR_OSPIRAWSTARTDMA_ADDR 23 +#define ERR_OSPIRAWSTARTDMA_SIZE 24 +#define ERR_OSPIRAWSTARTDMA_RANGE 25 +#define ERR_OSPIREADIO 26 +#define ERR_OSPIWRITEIO 27 +#define ERR_OSPISTARTDMA_PIMGR 28 +#define ERR_OSPISTARTDMA_PRI 29 +#define ERR_OSPISTARTDMA_DIR 30 +#define ERR_OSPISTARTDMA_DEVADDR 31 +#define ERR_OSPISTARTDMA_ADDR 32 +#define ERR_OSPISTARTDMA_SIZE 33 +#define ERR_OSPISTARTDMA_RANGE 34 +#define ERR_OSCREATEPIMANAGER 35 +#define ERR_OSVIGETCURRENTMODE 36 +#define ERR_OSVIGETCURRENTFRAMEBUFFER 37 +#define ERR_OSVIGETNEXTFRAMEBUFFER 38 +#define ERR_OSVISETXSCALE_VALUE 39 +#define ERR_OSVISETXSCALE_VIMGR 40 +#define ERR_OSVISETYSCALE_VALUE 41 +#define ERR_OSVISETYSCALE_VIMGR 42 +#define ERR_OSVISETSPECIAL_VALUE 43 +#define ERR_OSVISETSPECIAL_VIMGR 44 +#define ERR_OSVISETMODE 45 +#define ERR_OSVISETEVENT 46 +#define ERR_OSVISWAPBUFFER_ADDR 47 +#define ERR_OSVISWAPBUFFER_VIMGR 48 +#define ERR_OSCREATEVIMANAGER 49 +#define ERR_OSCREATEREGION_ALIGN 50 +#define ERR_OSCREATEREGION_SIZE 51 +#define ERR_OSMALLOC 52 +#define ERR_OSFREE_REGION 53 +#define ERR_OSFREE_ADDR 54 +#define ERR_OSGETREGIONBUFCOUNT 55 +#define ERR_OSGETREGIONBUFSIZE 56 +#define ERR_OSSPTASKLOAD_DRAM 57 +#define ERR_OSSPTASKLOAD_OUT 58 +#define ERR_OSSPTASKLOAD_OUTSIZE 59 +#define ERR_OSSPTASKLOAD_YIELD 60 +#define ERR_OSPROFILEINIT_STR 61 +#define ERR_OSPROFILEINIT_CNT 62 +#define ERR_OSPROFILEINIT_ALN 63 +#define ERR_OSPROFILEINIT_ORD 64 +#define ERR_OSPROFILEINIT_SIZ 65 +#define ERR_OSPROFILESTART_TIME 66 +#define ERR_OSPROFILESTART_FLAG 67 +#define ERR_OSPROFILESTOP_FLAG 68 +#define ERR_OSPROFILESTOP_TIMER 69 +#define ERR_OSREADHOST_ADDR 70 +#define ERR_OSREADHOST_SIZE 71 +#define ERR_OSWRITEHOST_ADDR 72 +#define ERR_OSWRITEHOST_SIZE 73 +#define ERR_OSGETTIME 74 +#define ERR_OSSETTIME 75 +#define ERR_OSSETTIMER 76 +#define ERR_OSSTOPTIMER 77 +#define ERR_ALSEQP_NO_SOUND 100 +#define ERR_ALSEQP_NO_VOICE 101 +#define ERR_ALSEQP_MAP_VOICE 102 +#define ERR_ALSEQP_OFF_VOICE 103 +#define ERR_ALSEQP_POLY_VOICE 104 +#define ERR_ALSNDP_NO_VOICE 105 +#define ERR_ALSYN_NO_UPDATE 106 +#define ERR_ALSNDPDEALLOCATE 107 +#define ERR_ALSNDPDELETE 108 +#define ERR_ALSNDPPLAY 109 +#define ERR_ALSNDPSETSOUND 110 +#define ERR_ALSNDPSETPRIORITY 111 +#define ERR_ALSNDPSETPAR 112 +#define ERR_ALBNKFNEW 113 +#define ERR_ALSEQNOTMIDI 114 +#define ERR_ALSEQNOTMIDI0 115 +#define ERR_ALSEQNUMTRACKS 116 +#define ERR_ALSEQTIME 117 +#define ERR_ALSEQTRACKHDR 118 +#define ERR_ALSEQSYSEX 119 +#define ERR_ALSEQMETA 120 +#define ERR_ALSEQPINVALIDPROG 121 +#define ERR_ALSEQPUNKNOWNMIDI 122 +#define ERR_ALSEQPUNMAP 123 +#define ERR_ALEVENTNOFREE 124 +#define ERR_ALHEAPNOFREE 125 +#define ERR_ALHEAPCORRUPT 126 +#define ERR_ALHEAPFIRSTBLOCK 127 +#define ERR_ALCSEQZEROSTATUS 128 +#define ERR_ALCSEQZEROVEL 129 +#define ERR_ALCSPVNOTFREE 130 +#define ERR_ALSEQOVERRUN 131 +#define ERR_OSAISETNEXTBUFFER_ENDADDR 132 +#define ERR_ALMODDELAYOVERFLOW 133 +#define ERR_OSVIEXTENDVSTART_VIMGR 134 +#define ERR_OSVIEXTENDVSTART_VALUE 135 +#define ERR_OSTHPROFILESTART_FLAG 136 +#define ERR_OSTHPROFILESTART_START 137 +#define ERR_OSTHPROFILESTOP_FLAG 138 +#define ERR_OSTHPROFILEREADCOUNT_FLAG 139 +#define ERR_OSTHPROFILEREADTIME_FLAG 140 +#define ERR_OSTHPROFILEREADCOUNTTH_FLAG 141 +#define ERR_OSTHPROFILEREADTIMETH_FLAG 142 +#define ERR_OSTHPROFILEREADCOUNT_LAR 143 +#define ERR_OSTHPROFILEREADTIME_LAR 144 +#define ERR_OSTHPROFILEREADCOUNTTH_LAR 145 +#define ERR_OSTHPROFILEREADTIMETH_LAR 146 +#define ERR_OSTHPROFILESTOP_LAR 147 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) +typedef void (*OSErrorHandler)(s16, s16, ...); + +OSErrorHandler osSetErrorHandler(OSErrorHandler); +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* __ULTRAERROR_H__ */ diff --git a/include/ique/PR/ultralog.h b/include/ique/PR/ultralog.h new file mode 100755 index 00000000..e9f57fcd --- /dev/null +++ b/include/ique/PR/ultralog.h @@ -0,0 +1,74 @@ +/*==================================================================== + * ultralog.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/ultralog.h,v $ + * + **************************************************************************/ + +#ifndef __log__ +#define __log__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#define OS_LOG_MAX_ARGS 16 +#define OS_LOG_MAGIC 0x20736a73 +#define OS_LOG_FLOAT(x) (*(int *) &(x)) +#define OS_LOG_VERSION 1 + +typedef struct { + u32 magic; /* log identifier */ + u32 len; /* length of log data + log structure */ + u32 *base; /* starting addr array */ + s32 startCount; /* read offset from dataBase */ + s32 writeOffset; /* write offset from dataBase */ +} OSLog; + +typedef struct { + u32 magic; + u32 timeStamp; + u16 argCount; + u16 eventID; +} OSLogItem; + +typedef struct { + u32 magic; /* log identifier */ + u32 version; /* 1 */ +} OSLogFileHdr; + +void osCreateLog(OSLog *log, u32 *base, s32 len); +void osLogEvent(OSLog *log, s16 code, s16 numArgs, ...); +void osFlushLog(OSLog *log); +u32 osLogFloat(f32); + +extern void osDelay(int count); + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif diff --git a/include/PR/ultratypes.h b/include/ique/PR/ultratypes.h similarity index 100% rename from include/PR/ultratypes.h rename to include/ique/PR/ultratypes.h diff --git a/include/ique/PR/uportals.h b/include/ique/PR/uportals.h new file mode 100755 index 00000000..1692497c --- /dev/null +++ b/include/ique/PR/uportals.h @@ -0,0 +1,134 @@ +/*==================================================================== + * uportals.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * uportals.h - header file for the ultraportals library + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/uportals.h,v $ + * + **************************************************************************/ + + + +#ifndef __ULTRAPORTALS_H__ +#define __ULTRAPORTALS_H__ + +#include +#include "matrix.h" +#include "vector.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ENABLEPORTALS +#define ENABLEPORTALS +#endif + +#define UP_MAXPVERTS 16 /* max number of portal verts */ +#define UP_MAXCELLS 50 /* max number of cells */ +#define UP_CELLNL 32 /* max length of cell names */ +#define UP_OBNL 32 /* max length of obejct names */ + +typedef struct +{ + vec3 min, max; /* min and max pts of the box */ +} upBox; + +typedef struct _upPortalData * _portalptr; +typedef struct _upCellData * _cellptr; +typedef struct _upObjectData * _objectptr; + +typedef struct _upPortalData +{ + int numverts; /* number of verts in the portal*/ + _cellptr attached_cell; /* cell on the 'other side' */ + vec3 verts[UP_MAXPVERTS]; /* the actual vertices */ +#ifdef MVTVIEW + int mvt_id; /* if has mvt, this is the id */ +#endif +} upPortalData; + +typedef struct _upCellData +{ + int numportals; /* number of portals */ + int numobjects; /* number of objects */ + int rendered; /* last frame number rendered */ + _portalptr *portals; /* array for the actual portals */ + _objectptr *objects; /* array for 'detail' objects */ + upBox bbox; /* bounding box of the cell */ + Gfx *dlist; /* associated display list */ + char name[UP_CELLNL]; /* name of the cell */ + float eyeheight; /* height to constrain eyept to */ + int zone; /* current zone number */ +} upCellData; + +typedef struct _upObjectData +{ + int rendered; /* last frame number rendered */ + upBox bbox; /* bounding box for the object */ + Gfx *dlist; /* associated display list */ + char name[UP_OBNL]; /* name of the object */ +} upObjectData; + +typedef struct +{ + int numcells; /* how many cells are there? */ + upCellData cells[UP_MAXCELLS]; /* the actual cells */ + Gfx *rootdlist; /* display list for all cells */ + vec2 portalmin, portalmax; /* XY bbox used by upCheckCells */ + float near, far; /* near, far clipping planes */ + FMatrix viewmat; /* viewing matrix (world->eye) */ + FMatrix projmat; /* proj matrix (eye->screen) */ + FMatrix compmat; /* view * proj (world->screen) */ + int portaldepth; /* depth of the portal stack */ + int framecount; /* current frame number */ +} upLocateData; + +/* + * Functions: + */ +extern void upInit(); /* generated automatically by flt2walk */ +extern Gfx *upAddVisibleCells(Gfx * glistp, vec3 eyept); +extern void upTogglePortalBounds(); +extern void upToggleScissorBox(); + +/* + * Globals: + */ +extern upLocateData upLocator; /* also extern by test_portals.h */ + +/* + * Macros: + */ +#define UP_HUGEVAL 3.40282347e+37 +#define PT_IN_BOX(p,box) ((p)[0] > (box).min[0] && (p)[0] < (box).max[0] &&\ + (p)[1] > (box).min[1] && (p)[1] < (box).max[1] &&\ + (p)[2] > (box).min[2] && (p)[2] < (box).max[2]) + + +#ifdef __Cplusplus +} +#endif + +#endif diff --git a/include/ique/PR/verify.h b/include/ique/PR/verify.h new file mode 100755 index 00000000..35141b3c --- /dev/null +++ b/include/ique/PR/verify.h @@ -0,0 +1,120 @@ +#ifndef _VERIFY_H_ +#define _VERIFY_H_ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/verify.h,v $ + * + **************************************************************************/ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * This structure must be aligned to 64-bit boundary for the + * RSP to get at it. Likewise, the important fields that the + * RSP writes back must also be aligned... + */ +typedef struct { + unsigned int rspListAddr; /* 0x00 */ /* ALIGNED */ + unsigned int rspListSize; /* 0x04 */ + + unsigned int rspListType; /* 0x08 */ + unsigned int ucodeTextAddr; /* 0x0c */ + + unsigned int ucodeDataAddr; /* 0x10 */ + unsigned int ucodeDataSize; /* 0x14 */ + + unsigned int dramStackAddr; /* 0x18 */ + unsigned int dramStackSize; /* 0x1c */ + + /* this length must be a 64-bit thing so the RSP can DMA it */ + unsigned long long int rdpListSize; /* 0x20 */ /* ALIGNED */ + + unsigned int rdpListAddr; /* 0x28 */ /* ALIGNED */ + unsigned int pad1; + + unsigned int bootUcodeAddr; /* 0x30 */ + + unsigned short width; /* 0x34 */ + unsigned short height; /* 0x36 */ + + unsigned int frameBuffer0Addr; /* 0x38 */ + unsigned int frameBuffer1Addr; /* 0x3c */ + + unsigned int zBufferAddr; /* 0x40 */ + + unsigned long magicNumber; /* 0x44 */ + unsigned long version; /* 0x48 */ + + unsigned int frameBufferFormat; /* 0x4c */ + unsigned int frameBufferSize; /* 0x50 */ + + unsigned int staticSegAddr; /* 0x54 */ + unsigned int staticSegSize; /* 0x58 */ + +} VerifyInfo; + + +#define MAGICNUMBER 0x102594 /* (Kaelyn's Birthday) */ +#define VERSION 1 + +#define CVGMAGIC 0x00120594 + +struct CVGHeader { + unsigned long magic; + unsigned char format; + unsigned char size; + unsigned short width; + unsigned short height; +}; + +#endif /* _LANGUAGE_C */ + +#define VERIFY_INFO_PHYSADDR 0x00000800 + +#define RSPLIST_ADDR_OFFSET 0x00 +#define RSPLIST_SIZE_OFFSET 0x04 +#define RSPLIST_TYPE_OFFSET 0x08 +#define UCODETEXT_ADDR_OFFSET 0x0c +#define UCODEDATA_ADDR_OFFSET 0x10 +#define UCODEDATA_SIZE_OFFSET 0x14 +#define DRAMSTACK_ADDR_OFFSET 0x18 +#define DRAMSTACK_SIZE_OFFSET 0x1c +#define RDPLISTSIZE_OFFSET 0x20 +#define RDPLIST_ADDR_OFFSET 0x28 +#define BOOTUCODE_ADDR_OFFST 0x30 +#define WIDTH_OFFSET 0x34 +#define HEIGHT_OFFSET 0x36 +#define FRAMEBUFFER0_ADDR_OFFSET 0x38 +#define FRAMEBUFFER1_ADDR_OFFSET 0x3c +#define ZBUFFER_ADDR_OFFSET 0x40 + + +/* + * Address map for family of verification programs + */ +#define JEAN_START_ADDR 0x000000 +#define JEAN_END_ADDR 0x010000 +#define APP_START_ADDR JEAN_END_ADDR +#define APP_END_ADDR 0x0b0000 +#define FB_START_ADDR APP_END_ADDR +#define ZB_START_ADDR 0x100000 +#define ZB_END_ADDR 0x125800 +#define EVAN_START_ADDR 0x130000 +#define EVAN_END_ADDR 0x140000 + +#endif /* !_VERIFY_H_ */ diff --git a/include/ique/ultra64.h b/include/ique/ultra64.h new file mode 100755 index 00000000..f6ebba04 --- /dev/null +++ b/include/ique/ultra64.h @@ -0,0 +1,40 @@ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + *************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.1.1.2 $ + * $Date: 2002/10/29 08:06:34 $ + * $Source: /home/routefree/bb/depot/rf/sw/bbplayer/include/ultra64.h,v $ + * + **************************************************************************/ + +#ifndef _ULTRA64_H_ +#define _ULTRA64_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/include/PR/PRimage.h b/include/n64/PR/PRimage.h similarity index 100% rename from include/PR/PRimage.h rename to include/n64/PR/PRimage.h diff --git a/include/PR/R4300.h b/include/n64/PR/R4300.h similarity index 100% rename from include/PR/R4300.h rename to include/n64/PR/R4300.h diff --git a/include/n64/PR/abi.h b/include/n64/PR/abi.h new file mode 100644 index 00000000..2631214f --- /dev/null +++ b/include/n64/PR/abi.h @@ -0,0 +1,841 @@ +#ifndef _ABI_H_ +#define _ABI_H_ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.32 $ + * $Date: 1997/02/11 08:16:37 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/abi.h,v $ + * + **************************************************************************/ + +/* + * Header file for the Audio Binary Interface. + * This is included in the Media Binary Interface file + * mbi.h. + * + * This file follows the framework used for graphics. + * + */ + +/* Audio commands: */ +#define A_SPNOOP 0 +#define A_ADPCM 1 +#define A_CLEARBUFF 2 +#define A_RESAMPLE 5 +#define A_SETBUFF 8 +#define A_DMEMMOVE 10 +#define A_LOADADPCM 11 +#define A_MIXER 12 +#define A_INTERLEAVE 13 +#define A_SETLOOP 15 + +#ifndef VERSION_SH + +#define A_ENVMIXER 3 +#define A_LOADBUFF 4 +#define A_RESAMPLE 5 +#define A_SAVEBUFF 6 +#define A_SEGMENT 7 +#define A_SETVOL 9 +#define A_POLEF 14 + +#else + +#define A_ADDMIXER 4 +#define A_RESAMPLE_ZOH 6 +#define A_INTERL 17 +#define A_ENVSETUP1 18 +#define A_ENVMIXER 19 +#define A_LOADBUFF 20 +#define A_SAVEBUFF 21 +#define A_ENVSETUP2 22 +#define A_UNK_23 23 +#define A_HILOGAIN 24 +#define A_UNK_25 25 +#define A_DUPLICATE 26 +#define A_FILTER 27 + +#endif + +#define ACMD_SIZE 32 +/* + * Audio flags + */ + +#define A_INIT 0x01 +#define A_CONTINUE 0x00 +#define A_LOOP 0x02 +#define A_OUT 0x02 +#define A_LEFT 0x02 +#define A_RIGHT 0x00 +#define A_VOL 0x04 +#define A_RATE 0x00 +#define A_AUX 0x08 +#define A_NOAUX 0x00 +#define A_MAIN 0x00 +#define A_MIX 0x10 + +/* + * BEGIN C-specific section: (typedef's) + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * Data Structures. + */ + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int gain:16; + unsigned int addr; +} Aadpcm; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int gain:16; + unsigned int addr; +} Apolef; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int pad1:16; + unsigned int addr; +} Aenvelope; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int dmem:16; + unsigned int pad2:16; + unsigned int count:16; +} Aclearbuff; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int pad2:16; + unsigned int inL:16; + unsigned int inR:16; +} Ainterleave; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:24; + unsigned int addr; +} Aloadbuff; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int pad1:16; + unsigned int addr; +} Aenvmixer; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int gain:16; + unsigned int dmemi:16; + unsigned int dmemo:16; +} Amixer; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int dmem2:16; + unsigned int addr; +} Apan; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int pitch:16; + unsigned int addr; +} Aresample; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int pad1:16; + unsigned int addr; +} Areverb; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:24; + unsigned int addr; +} Asavebuff; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:24; + unsigned int pad2:2; + unsigned int number:4; + unsigned int base:24; +} Asegment; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int dmemin:16; + unsigned int dmemout:16; + unsigned int count:16; +} Asetbuff; + +typedef struct { + unsigned int cmd:8; + unsigned int flags:8; + unsigned int vol:16; + unsigned int voltgt:16; + unsigned int volrate:16; +} Asetvol; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int dmemin:16; + unsigned int dmemout:16; + unsigned int count:16; +} Admemmove; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int count:16; + unsigned int addr; +} Aloadadpcm; + +typedef struct { + unsigned int cmd:8; + unsigned int pad1:8; + unsigned int pad2:16; + unsigned int addr; +} Asetloop; + +/* + * Generic Acmd Packet + */ + +typedef struct { + uintptr_t w0; + uintptr_t w1; +} Awords; + +typedef union { + Awords words; +#if IS_BIG_ENDIAN && !IS_64_BIT + Aadpcm adpcm; + Apolef polef; + Aclearbuff clearbuff; + Aenvelope envelope; + Ainterleave interleave; + Aloadbuff loadbuff; + Aenvmixer envmixer; + Aresample resample; + Areverb reverb; + Asavebuff savebuff; + Asegment segment; + Asetbuff setbuff; + Asetvol setvol; + Admemmove dmemmove; + Aloadadpcm loadadpcm; + Amixer mixer; + Asetloop setloop; +#endif + long long int force_union_align; /* dummy, force alignment */ +} Acmd; + +/* + * ADPCM State + */ +typedef short ADPCM_STATE[16]; + +/* + * Pole filter state + */ +typedef short POLEF_STATE[4]; + +/* + * Resampler state + */ +typedef short RESAMPLE_STATE[16]; + +/* + * Resampler constants + */ +#define UNITY_PITCH 0x8000 +#define MAX_RATIO 1.99996 /* within .03 cents of +1 octave */ + +/* + * Enveloper/Mixer state + */ +typedef short ENVMIX_STATE[40]; + +/* + * Macros to assemble the audio command list + */ + +/* + * Info about parameters: + * + * A "count" in the following macros is always measured in bytes. + * + * All volumes/gains are in Q1.15 signed fixed point numbers: + * 0x8000 is the minimum volume (-100%), negating the audio curve. + * 0x0000 is silent. + * 0x7fff is maximum volume (99.997%). + * + * All DRAM addresses refer to segmented addresses. A segment table shall + * first be set up by calling aSegment for each segment. When a DRAM + * address is later used as parameter, the 8 high bits will be an index + * to the segment table and the lower 24 bits are added to the base address + * stored in the segment table for this entry. The result is the physical address. + * + * Transfers to/from DRAM are executed using DMA and hence follow these restrictions: + * All DRAM addresses should be aligned by 8 bytes, or they will be + * rounded down to the nearest multiple of 8 bytes. + * All DRAM lengths should be aligned by 8 bytes, or they will be + * rounded up to the nearest multiple of 8 bytes. + */ + +/* + * Decompresses ADPCM data. + * Possible flags: A_INIT and A_LOOP. + * + * First set up internal data in DMEM: + * aLoadADPCM(cmd++, nEntries * 16, physicalAddressOfBook) + * aSetLoop(cmd++, physicalAddressOfLoopState) (if A_LOOP is set) + * + * Then before this command, call: + * aSetBuffer(cmd++, 0, in, out, count) + * + * Note: count will be rounded up to the nearest multiple of 32 bytes. + * + * ADPCM decompression works on a block of 16 (uncompressed) samples. + * The previous 2 samples and 9 bytes of input are decompressed to + * 16 new samples using the code book previously loaded. + * + * Before the algorithm starts, the previous 16 samples are loaded according to flag: + * A_INIT: all zeros + * A_LOOP: the address set by aSetLoop + * no flags: the DRAM address in the s parameter + * These 16 samples are immediately copied to the destination address. + * + * The result of "count" bytes will be written after these 16 initial samples. + * The last 16 samples written to the destination will also be written to + * the state address in DRAM. + */ +#define aADPCMdec(pkt, f, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_ADPCM, 24, 8) | _SHIFTL(f, 16, 8); \ + _a->words.w1 = (uintptr_t)(s); \ +} + +#define aADPCM_23(pkt, f, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_UNK_23, 24, 8) | _SHIFTL(f, 16, 8); \ + _a->words.w1 = (uintptr_t)(s); \ +} + +/* + * Not used in SM64. + */ +#define aPoleFilter(pkt, f, g, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_POLEF, 24, 8) | _SHIFTL(f, 16, 8) | \ + _SHIFTL(g, 0, 16)); \ + _a->words.w1 = (uintptr_t)(s); \ +} + +/* + * Clears DMEM data, where d is address and c is count, by writing zeros. + * + * Note: c is rounded up to the nearest multiple of 16 bytes. + */ +#define aClearBuffer(pkt, d, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_CLEARBUFF, 24, 8) | _SHIFTL(d, 0, 24); \ + _a->words.w1 = (uintptr_t)(c); \ +} + +/* + * Mixes an envelope with mono sound into 2 or 4 channels. + * Possible flags: A_INIT, A_AUX (indicates that 4 channels should be used). + * + * Before this command, call: + * aSetBuffer(cmd++, 0, inBuf, dryLeft, count) + * aSetBuffer(cmd++, A_AUX, dryRight, wetLeft, wetRight) + * + * The first time (A_INIT is set), volume also needs to be set: + * aSetVolume(cmd++, A_VOL | A_LEFT, initialVolumeLeft, 0, 0) + * aSetVolume(cmd++, A_VOL | A_RIGHT, initialVolumeRight, 0, 0) + * aSetVolume32(cmd++, A_RATE | A_LEFT, targetVolumeLeft, rampLeft) + * aSetVolume32(cmd++, A_RATE | A_RIGHT, targetVolumeRight, rampRight) + * aSetVolume(cmd++, A_AUX, dryVolume, 0, wetVolume) + * + * This command will now mix samples in inBuf into the destination buffers (dry and wet), + * but with the volume increased (or decreased) from initial volumes to target volumes, + * with the specified ramp rate. Once the target volume is reached, the volume stays + * at that level. Before the samples are finally mixed (added) into the destination + * buffers (dry and wet), the volume is changed according to dryVolume and wetVolume. + * + * Note: count will be rounded up to the nearest multiple of 16 bytes. + * Note: the wet channels are used for reverb. + * + */ +#define aEnvMixer(pkt, f, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_ENVMIXER, 24, 8) | _SHIFTL(f, 16, 8); \ + _a->words.w1 = (uintptr_t)(s); \ +} + +/* + * Interleaves two mono channels into stereo. + * + * First call: + * aSetBuffer(cmd++, 0, 0, output, count) + * + * The count refers to the size of each input. Hence 2 * count bytes will be written out. + * A left sample will be placed before the right sample. + * + * Note: count will be rounded up to the nearest multiple of 16 bytes. + */ +#define aInterleave(pkt, l, r) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8); \ + _a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \ +} + +/* + * Loads a buffer from DRAM to DMEM. + * + * First call: + * aSetBuffer(cmd++, 0, in, 0, count) + * + * The in parameter to aSetBuffer is the destination in DMEM and the + * s parameter to this command is the source in DRAM. + */ +#define aLoadBuffer(pkt, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_LOADBUFF, 24, 8); \ + _a->words.w1 = (uintptr_t)(s); \ +} + +/* + * Mixes audio. + * Possible flags: no flags used, although parameter present. + * + * First call: + * aSetBuffer(cmd++, 0, 0, 0, count) + * + * Input and output addresses are taken from the i and o parameters. + * The volume with which the input is changed is taken from the g parameter. + * After the volume of the input samples have been changed, the result + * is added to the output. + * + * Note: count will be rounded up to the nearest multiple of 32 bytes. + */ +#define aMix(pkt, f, g, i, o) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_MIXER, 24, 8) | _SHIFTL(f, 16, 8) | \ + _SHIFTL(g, 0, 16)); \ + _a->words.w1 = _SHIFTL(i,16, 16) | _SHIFTL(o, 0, 16); \ +} + +// Not present in the audio microcode. +#define aPan(pkt, f, d, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_PAN, 24, 8) | _SHIFTL(f, 16, 8) | \ + _SHIFTL(d, 0, 16)); \ + _a->words.w1 = (uintptr_t)(s); \ +} + +/* + * Resamples audio. + * Possible flags: A_INIT, A_OUT? (not used in SM64). + * + * First call: + * aSetBuffer(cmd++, 0, in, out, count) + * + * This command resamples the audio using the given frequency ratio (pitch) + * using a filter that uses a window of 4 source samples. This can be used + * either for just resampling audio to be able to be played back at a different + * sample rate, or to change the pitch if the result is played back at + * the same sample rate as the input. + * + * The frequency ratio is given in UQ1.15 fixed point format. + * For no change in frequency, use pitch 0x8000. + * For 1 octave up or downsampling to (roughly) half number of samples, use pitch 0xffff. + * For 1 octave down or upsampling to double as many samples, use pitch 0x4000. + * + * Note: count represents the number of output sample bytes and is rounded up to + * the nearest multiple of 16 bytes. + * + * The state consists of the four following source samples when the algorithm stopped as + * well as a fractional position, and is initialized to all zeros if A_INIT is given. + * Otherwise it is loaded from DRAM at address s. + * + * The algorithm starts by writing the four source samples from the state (or zero) + * to just before the input address given. It then creates one output sample by examining + * the four next source samples and then moving the source position zero or more + * samples forward. The first output sample (when A_INIT is given) is always 0. + * + * When "count" bytes have been written, the following four source samples + * are written to the state in DRAM as well as a fractional position. + */ +#define aResample(pkt, f, p, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_RESAMPLE, 24, 8) | _SHIFTL(f, 16, 8) |\ + _SHIFTL(p, 0, 16)); \ + _a->words.w1 = (uintptr_t)(s); \ +} + +/* + * Stores a buffer in DMEM to DRAM. + * + * First call: + * aSetBuffer(cmd++, 0, 0, out, count) + * + * The out parameter to aSetBuffer is the source in DMEM and the + * s parameter to this command is the destination in DRAM. + */ +#define aSaveBuffer(pkt, s) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_SAVEBUFF, 24, 8); \ + _a->words.w1 = (uintptr_t)(s); \ +} + +/* + * Sets up an entry in the segment table. + * + * The s parameter is a segment index, 0 to 15. + * The b parameter is the base offset. + */ +#define aSegment(pkt, s, b) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_SEGMENT, 24, 8); \ + _a->words.w1 = _SHIFTL(s, 24, 8) | _SHIFTL(b, 0, 24); \ +} + +/* + * Sets internal DMEM buffer addresses used for later commands. + * See each command for how to use aSetBuffer. + */ +#define aSetBuffer(pkt, f, i, o, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_SETBUFF, 24, 8) | _SHIFTL(f, 16, 8) | \ + _SHIFTL(i, 0, 16)); \ + _a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \ +} + +#define aInterl(pkt, f, i, o, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_INTERL, 24, 8) | _SHIFTL(f, 16, 8) | \ + _SHIFTL(i, 0, 16)); \ + _a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \ +} + +/* + * Sets internal volume parameters. + * See aEnvMixer for more info. + */ +#define aSetVolume(pkt, f, v, t, r) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_SETVOL, 24, 8) | _SHIFTL(f, 16, 16) | \ + _SHIFTL(v, 0, 16)); \ + _a->words.w1 = _SHIFTL(t, 16, 16) | _SHIFTL(r, 0, 16); \ +} + +/* + * Sets the address to ADPCM loop state. + * + * The a parameter is a DRAM address. + * See aADPCMdec for more info. + */ +#define aSetLoop(pkt, a) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + _a->words.w0 = _SHIFTL(A_SETLOOP, 24, 8); \ + _a->words.w1 = (uintptr_t)(a); \ +} + +/* + * Copies memory in DMEM. + * + * Copies c bytes from address i to address o. + * + * Note: count is rounded up to the nearest multiple of 16 bytes. + * + * Note: This acts as memcpy where 16 bytes are moved at a time, therefore + * if input and output overlap, output address should be less than input address. + */ +#define aDMEMMove(pkt, i, o, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_DMEMMOVE, 24, 8) | _SHIFTL(i, 0, 24); \ + _a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \ +} + +/* + * Loads ADPCM book from DRAM into DMEM. + * + * This command loads ADPCM table entries from DRAM to DMEM. + * + * The count parameter c should be a multiple of 16 bytes. + * The d parameter is a DRAM address. + */ +#define aLoadADPCM(pkt, c, d) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_LOADADPCM, 24, 8) | _SHIFTL(c, 0, 24); \ + _a->words.w1 = (uintptr_t) (d); \ +} + +// This is a version of aSetVolume which takes a single 32-bit parameter +// instead of two 16-bit ones. According to AziAudio, it is used to set +// ramping values when neither bit 4 nor bit 8 is set in the flags parameter. +// It does not appear in the official abi.h header. +/* + * Sets internal volume parameters. + * See aEnvMixer for more info. + */ +#define aSetVolume32(pkt, f, v, tr) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_SETVOL, 24, 8) | _SHIFTL(f, 16, 16) | \ + _SHIFTL(v, 0, 16)); \ + _a->words.w1 = (uintptr_t)(tr); \ +} + +#ifdef VERSION_SH +#undef aLoadBuffer +#undef aSaveBuffer +#undef aMix +#undef aEnvMixer +#undef aInterleave + +/* + * Mix two tracks by simple clamped addition. + * + * s: DMEM source track 1 + * d: DMEM source track 2 and destination + * c: number of bytes to write (rounded down to 16 byte alignment) + */ +#define aAddMixer(pkt, s, d, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_ADDMIXER, 24, 8) | \ + _SHIFTL((c) >> 4, 16, 8) | _SHIFTL(0x7fff, 0, 16)); \ + _a->words.w1 = (_SHIFTL(s, 16, 16) | _SHIFTL(d, 0, 16)); \ +} + +/* + * Loads a buffer from DRAM to DMEM. + * + * s: DRAM source + * d: DMEM destination + * c: number of bytes to copy (rounded down to 16 byte alignment) + */ +#define aLoadBuffer(pkt, s, d, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_LOADBUFF, 24, 8) | \ + _SHIFTL((c) >> 4, 16, 8) | _SHIFTL(d, 0, 16); \ + _a->words.w1 = (uintptr_t)(s); \ +} + +/* + * Stores a buffer from DMEM to DRAM. + * + * s: DMEM source + * d: DRAM destination + * c: number of bytes to copy (rounded down to 16 byte alignment) + */ +#define aSaveBuffer(pkt, s, d, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_SAVEBUFF, 24, 8) | \ + _SHIFTL((c) >> 4, 16, 8) | _SHIFTL(s, 0, 16); \ + _a->words.w1 = (uintptr_t)(d); \ +} + +/* + * Duplicates 128 bytes of data a number of times. + * + * 128 bytes are read from source DMEM address s. + * Then c identical copies of these bytes are written to DMEM address d. + */ +#define aDuplicate(pkt, s, d, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_DUPLICATE, 24, 8) | \ + _SHIFTL(c, 16, 8) | _SHIFTL(s, 0, 16)); \ + _a->words.w1 = (_SHIFTL(d, 16, 16) | _SHIFTL(0x80, 0, 16)); \ +} + +/* + * Fast resample. + * + * Before this command, call: + * aSetBuffer(cmd++, 0, in, out, count) + * + * This works like the other resample command but just takes the "nearest" sample, + * instead of a function of the four nearest samples. + */ +#define aResampleZoh(pkt, pitch, start_fract) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_RESAMPLE_ZOH, 24, 8) | \ + _SHIFTL(pitch, 0, 16)); \ + _a->words.w1 = _SHIFTL(start_fract, 0, 16); \ +} + +/* + * Mixes audio. + * + * Input and output addresses are taken from the i and o parameters. + * The volume with which the input is changed is taken from the g parameter. + * After the volume of the input samples have been changed, the result + * is added to the output. + * + * Note: count is first rounded down to the nearest multiple of 16 bytes + * and then rounded up to the nearest multiple of 32 bytes. + */ +#define aMix(pkt, g, i, o, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_MIXER, 24, 8) | \ + _SHIFTL((c) >> 4, 16, 8) | _SHIFTL(g, 0, 16)); \ + _a->words.w1 = _SHIFTL(i, 16, 16) | _SHIFTL(o, 0, 16); \ +} + +#define aEnvSetup1(pkt, a, b, c, d) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_ENVSETUP1, 24, 8) | \ + _SHIFTL(a, 16, 8) | _SHIFTL(b, 0, 16)); \ + _a->words.w1 = _SHIFTL(c, 16, 16) | _SHIFTL(d, 0, 16); \ +} + +#define aEnvSetup2(pkt, volLeft, volRight) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_ENVSETUP2, 24, 8); \ + _a->words.w1 = _SHIFTL(volLeft, 16, 16) | \ + _SHIFTL(volRight, 0, 16); \ +} + +#define aEnvMixer(pkt, inBuf, nSamples, bit1, bit2, bit3, dryLeft, dryRight, wetLeft, wetRight) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_ENVMIXER, 24, 8) | \ + _SHIFTL((inBuf) >> 4, 16, 8) | \ + _SHIFTL(nSamples, 8, 8)) | \ + _SHIFTL(bit1, 2, 1) | _SHIFTL(bit2, 1, 1) | \ + _SHIFTL(bit3, 0, 1); \ + _a->words.w1 = _SHIFTL((dryLeft) >> 4, 24, 8) | \ + _SHIFTL((dryRight) >> 4, 16, 8) | \ + _SHIFTL((wetLeft) >> 4, 8, 8) | \ + _SHIFTL((wetRight) >> 4, 0, 8); \ +} + +#define aInterleave(pkt, o, l, r, c) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8) | \ + _SHIFTL((c) >> 4, 16, 8) | _SHIFTL(o, 0, 16); \ + _a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \ +} + +// countOrBuf meaning depends on flag +#define aFilter(pkt, f, countOrBuf, addr) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_FILTER, 24, 8) | _SHIFTL((f), 16, 8) | \ + _SHIFTL((countOrBuf), 0, 16); \ + _a->words.w1 = (uintptr_t)(addr); \ +} + +#define aHilogain(pkt, id, buflen, i) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_HILOGAIN, 24, 8) | \ + _SHIFTL((id), 16, 8) | _SHIFTL((buflen), 0, 16); \ + _a->words.w1 = _SHIFTL((i), 16, 16); \ +} + +#define aUnknown25(pkt, f, g, i, o) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_UNK_25, 24, 8) | \ + _SHIFTL((f), 16, 8) | _SHIFTL((g), 0, 16)); \ + _a->words.w1 = _SHIFTL((i), 16, 16) | _SHIFTL((o), 0, 16); \ +} + +#endif + +#endif /* _LANGUAGE_C */ + +#endif /* !_ABI_H_ */ diff --git a/include/n64/PR/gbi-poslight.h b/include/n64/PR/gbi-poslight.h new file mode 100644 index 00000000..7b93aea0 --- /dev/null +++ b/include/n64/PR/gbi-poslight.h @@ -0,0 +1,129 @@ +#ifndef _GBI_POSLIGHT_H_ +#define _GBI_POSLIGHT_H_ + +/* version 990705 */ +#define G_LIGHTING_POSITIONAL 0x00400000 +#ifdef _LANGUAGE_ASSEMBLY +#define G_LIGHTING_POSITIONAL_H (G_LIGHTING_POSITIONAL/0x10000) +#endif + +typedef struct { + unsigned char col[3]; /* diffuse light value (rgba) */ + unsigned char kc; /* positional lighting enable flag & constant attenuation Kc */ + unsigned char colc[3]; /* copy of diffuse light value (rgba) */ + unsigned char kl; /* linear attenuation Kl */ + short pos[3]; /* light position x, y, z */ + unsigned char kq; /* quadratic attenuation Kq */ + char reserved1; +} PosLight_t; + +typedef union { + PosLight_t p; + Light_t l; + long long int force_structure_alignment[2]; +} PosLight; + +typedef struct { + Ambient a; + PosLight l[7]; +} PosLightsn; + +typedef struct { + Ambient a; + PosLight l[1]; +} PosLights0; + +typedef struct { + Ambient a; + PosLight l[1]; +} PosLights1; + +typedef struct { + Ambient a; + PosLight l[2]; +} PosLights2; + +typedef struct { + Ambient a; + PosLight l[3]; +} PosLights3; + +typedef struct { + Ambient a; + PosLight l[4]; +} PosLights4; + +typedef struct { + Ambient a; + PosLight l[5]; +} PosLights5; + +typedef struct { + Ambient a; + PosLight l[6]; +} PosLights6; + +typedef struct { + Ambient a; + PosLight l[7]; +} PosLights7; + +#define _gSPLightColor2(pkt, n, col1, col2) \ +{\ + gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_a##n, col1);\ + gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_b##n, col2);\ +} +#define _gsSPLightColor2(n, col1, col2) \ + gsMoveWd(G_MW_LIGHTCOL, G_MWO_a##n, col1),\ + gsMoveWd(G_MW_LIGHTCOL, G_MWO_b##n, col2) + +#define _gdSPDefAmbient(ar,ag,ab) {{ {ar,ag,ab},0,{ar,ag,ab},0}} +#define _gdSPDefPosLight(r,g,b,x,y,z,c,l,q) {{ {r,g,b},c,{r,g,b},l,{x,y,z},q,0 }} +#define _gdSPDefInfLight(r,g,b,x,y,z) {{ {r,g,b},0,{r,g,b},0,{((x)<<8)|((y)&0xff),(z)<<8,0},0,0}} +#define gdSPDefPosLights0(ar,ag,ab) \ + { _gdSPDefAmbient(ar,ag,ab), \ + { _gdSPDefPosLight(0,0,0,0,0,0,0,0,0)} } +#define gdSPDefPosLights1(ar,ag,ab,r1,g1,b1,x1,y1,z1,c1,l1,q1) \ + { _gdSPDefAmbient(ar,ag,ab), \ + { _gdSPDefPosLight(r1,g1,b1,x1,y1,z1,c1,l1,q1)} } +#define gdSPDefPosLights2(ar,ag,ab,r1,g1,b1,x1,y1,z1,c1,l1,q1,r2,g2,b2,x2,y2,z2,c2,l2,q2) \ + { _gdSPDefAmbient(ar,ag,ab), \ + { _gdSPDefPosLight(r1,g1,b1,x1,y1,z1,c1,l1,q1), \ + _gdSPDefPosLight(r2,g2,b2,x2,y2,z2,c2,l2,q2)} } +#define gdSPDefPosLights3(ar,ag,ab,r1,g1,b1,x1,y1,z1,c1,l1,q1,r2,g2,b2,x2,y2,z2,c2,l2,q2,r3,g3,b3,x3,y3,z3,c3,l3,q3) \ + { _gdSPDefAmbient(ar,ag,ab), \ + { _gdSPDefPosLight(r1,g1,b1,x1,y1,z1,c1,l1,q1), \ + _gdSPDefPosLight(r2,g2,b2,x2,y2,z2,c2,l2,q2), \ + _gdSPDefPosLight(r3,g3,b3,x3,y3,z3,c3,l3,q3)} } +#define gdSPDefPosLights4(ar,ag,ab,r1,g1,b1,x1,y1,z1,c1,l1,q1,r2,g2,b2,x2,y2,z2,c2,l2,q2,r3,g3,b3,x3,y3,z3,c3,l3,q3,r4,g4,b4,x4,y4,z4,c4,l4,q4) \ + { _gdSPDefAmbient(ar,ag,ab), \ + { _gdSPDefPosLight(r1,g1,b1,x1,y1,z1,c1,l1,q1), \ + _gdSPDefPosLight(r2,g2,b2,x2,y2,z2,c2,l2,q2), \ + _gdSPDefPosLight(r3,g3,b3,x3,y3,z3,c3,l3,q3), \ + _gdSPDefPosLight(r4,g4,b4,x4,y4,z4,c4,l4,q4)} } +#define gdSPDefPosLights5(ar,ag,ab,r1,g1,b1,x1,y1,z1,c1,l1,q1,r2,g2,b2,x2,y2,z2,c2,l2,q2,r3,g3,b3,x3,y3,z3,c3,l3,q3,r4,g4,b4,x4,y4,z4,c4,l4,q4,r5,g5,b5,x5,y5,z5,c5,l5,q5) \ + { _gdSPDefAmbient(ar,ag,ab), \ + { _gdSPDefPosLight(r1,g1,b1,x1,y1,z1,c1,l1,q1), \ + _gdSPDefPosLight(r2,g2,b2,x2,y2,z2,c2,l2,q2), \ + _gdSPDefPosLight(r3,g3,b3,x3,y3,z3,c3,l3,q3), \ + _gdSPDefPosLight(r4,g4,b4,x4,y4,z4,c4,l4,q4), \ + _gdSPDefPosLight(r5,g5,b5,x5,y5,z5,c5,l5,q5)} } +#define gdSPDefPosLights6(ar,ag,ab,r1,g1,b1,x1,y1,z1,c1,l1,q1,r2,g2,b2,x2,y2,z2,c2,l2,q2,r3,g3,b3,x3,y3,z3,c3,l3,q3,r4,g4,b4,x4,y4,z4,c4,l4,q4,r5,g5,b5,x5,y5,z5,c5,l5,q5,r6,g6,b6,x6,y6,z6,c6,l6,q6) \ + { _gdSPDefAmbient(ar,ag,ab), \ + { _gdSPDefPosLight(r1,g1,b1,x1,y1,z1,c1,l1,q1), \ + _gdSPDefPosLight(r2,g2,b2,x2,y2,z2,c2,l2,q2), \ + _gdSPDefPosLight(r3,g3,b3,x3,y3,z3,c3,l3,q3), \ + _gdSPDefPosLight(r4,g4,b4,x4,y4,z4,c4,l4,q4), \ + _gdSPDefPosLight(r5,g5,b5,x5,y5,z5,c5,l5,q5), \ + _gdSPDefPosLight(r6,g6,b6,x6,y6,z6,c6,l6,q6)} } +#define gdSPDefPosLights7(ar,ag,ab,r1,g1,b1,x1,y1,z1,c1,l1,q1,r2,g2,b2,x2,y2,z2,c2,l2,q2,r3,g3,b3,x3,y3,z3,c3,l3,q3,r4,g4,b4,x4,y4,z4,c4,l4,q4,r5,g5,b5,x5,y5,z5,c5,l5,q5,r6,g6,b6,x6,y6,z6,c6,l6,q6,r7,g7,b7,x7,y7,z7,c7,l7,q7) \ + { _gdSPDefAmbient(ar,ag,ab), \ + { _gdSPDefPosLight(r1,g1,b1,x1,y1,z1,c1,l1,q1), \ + _gdSPDefPosLight(r2,g2,b2,x2,y2,z2,c2,l2,q2), \ + _gdSPDefPosLight(r3,g3,b3,x3,y3,z3,c3,l3,q3), \ + _gdSPDefPosLight(r4,g4,b4,x4,y4,z4,c4,l4,q4), \ + _gdSPDefPosLight(r5,g5,b5,x5,y5,z5,c5,l5,q5), \ + _gdSPDefPosLight(r6,g6,b6,x6,y6,z6,c6,l6,q6), \ + _gdSPDefPosLight(r7,g7,b7,x7,y7,z7,c7,l7,q7)} } + +#endif /* _GBI_POSLIGHT_H_ */ diff --git a/include/n64/PR/gbi.h b/include/n64/PR/gbi.h new file mode 100644 index 00000000..eea18d5b --- /dev/null +++ b/include/n64/PR/gbi.h @@ -0,0 +1,4805 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ +/************************************************************************** + * + * $Revision: 1.141 $ + * $Date: 1999/09/03 03:43:08 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/gbi.h,v $ + * + **************************************************************************/ + +#ifndef _GBI_H_ +#define _GBI_H_ + +#include + +/* + * To use the F3DEX ucodes, define F3DEX_GBI before include this file. + * + * #define F3DEX_GBI + * #include + * + * or + * + * cc -c -DF3DEX_GBI -I.... foo.c + * + */ + +/************************************************************************** + * + * Graphics Binary Interface + * + **************************************************************************/ + +/* + * Graphics Commands, 'xxx' parts may be generated from ucode + * + * The command format is + * + * |00xxxxxx| = DMA 0,..,127 + * |10xxxxxx| = Immediate Mode -65,..,-128 + * |11xxxxxx| = RDP cmds -1,..,-64 + * + * Note: in order for the RSP microcode to process RDP commands opaquely, + * we need to further identify those RDP commands that need DRAM address + * "fixup". To do this, we have the dummy command G_RDP_ADDR_FIXUP, and + * all |RDP commands| less than this are commands with embedded DRAM + * addresses. Further, the format of these commands should be similar so + * only one fixup routine is needed. + * + * Further explanation: + * The names of the commands are somewhat misleading. Here is clarification: + * + * - a 'DMA' type command has a pointer to additional data and + * causes a DMA transfer to bring that into DMEM. + * + * - an 'Immediate' type command isn't really 'immediate', in the + * traditional sense. This just means that the entire command fits + * in the 64-bit word, and the ucode can execute it 'immediately' + * without additional memory transfers. + * + * - an 'RDP' command is identified as such because the RDP + * commands can be passed-thru the RSP and sent to the RDP + * directly. One further confusing thing, is that some 'DP' + * macros below actually generate immediate commands, not + * not direct DP commands. + * + * IMPLEMENTATION NOTE: + * There is another group of RDP commands that includes the triangle commands + * generated by the RSP code. These are the raw commands the rasterizer + * hardware chews on, with slope info, etc. They will follow the RDP + * ordering... + * + * IMPLEMENTATION NOTE: + * The RDP hardware has some of these bit patterns wired up. If the hardware + * changes, we must adjust this table, likewise we can't change/add things + * once the hardware is frozen. (actually, the RDP hardware only looks at + * the lower 6 bits of the command byte) + * + */ + +#ifdef F3DEX_GBI_2E +# ifndef F3DEX_GBI_2 +# define F3DEX_GBI_2 +# endif +# define GBI_FLOATS +#endif + +#ifdef F3DEX_GBI_2 +# ifndef F3DEX_GBI +# define F3DEX_GBI +# endif +#define G_NOOP 0x00 +#define G_RDPHALF_2 0xf1 +#define G_SETOTHERMODE_H 0xe3 +#define G_SETOTHERMODE_L 0xe2 +#define G_RDPHALF_1 0xe1 +#define G_SPNOOP 0xe0 +#define G_ENDDL 0xdf +#define G_DL 0xde +#define G_LOAD_UCODE 0xdd +#define G_MOVEMEM 0xdc +#define G_MOVEWORD 0xdb +#define G_MTX 0xda +#define G_GEOMETRYMODE 0xd9 +#define G_POPMTX 0xd8 +#define G_TEXTURE 0xd7 +#define G_DMA_IO 0xd6 +#define G_SPECIAL_1 0xd5 +#define G_SPECIAL_2 0xd4 +#define G_SPECIAL_3 0xd3 + +#define G_VTX 0x01 +#define G_MODIFYVTX 0x02 +#define G_CULLDL 0x03 +#define G_BRANCH_Z 0x04 +#define G_TRI1 0x05 +#define G_TRI2 0x06 +#define G_QUAD 0x07 +#define G_LINE3D 0x08 +#else /* F3DEX_GBI_2 */ + +/* DMA commands: */ +#define G_SPNOOP 0 /* handle 0 gracefully */ +#define G_MTX 1 +#define G_RESERVED0 2 /* not implemeted */ +#define G_MOVEMEM 3 /* move a block of memory (up to 4 words) to dmem */ +#define G_VTX 4 +#define G_RESERVED1 5 /* not implemeted */ +#define G_DL 6 +#define G_RESERVED2 7 /* not implemeted */ +#define G_RESERVED3 8 /* not implemeted */ +#define G_SPRITE2D_BASE 9 /* sprite command */ + +/* IMMEDIATE commands: */ +#define G_IMMFIRST -65 +#define G_TRI1 (G_IMMFIRST-0) +#define G_CULLDL (G_IMMFIRST-1) +#define G_POPMTX (G_IMMFIRST-2) +#define G_MOVEWORD (G_IMMFIRST-3) +#define G_TEXTURE (G_IMMFIRST-4) +#define G_SETOTHERMODE_H (G_IMMFIRST-5) +#define G_SETOTHERMODE_L (G_IMMFIRST-6) +#define G_ENDDL (G_IMMFIRST-7) +#define G_SETGEOMETRYMODE (G_IMMFIRST-8) +#define G_CLEARGEOMETRYMODE (G_IMMFIRST-9) +#define G_LINE3D (G_IMMFIRST-10) +#define G_RDPHALF_1 (G_IMMFIRST-11) +#define G_RDPHALF_2 (G_IMMFIRST-12) +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +# define G_MODIFYVTX (G_IMMFIRST-13) +# define G_TRI2 (G_IMMFIRST-14) +# define G_BRANCH_Z (G_IMMFIRST-15) +# define G_LOAD_UCODE (G_IMMFIRST-16) +#else +# define G_RDPHALF_CONT (G_IMMFIRST-13) +#endif + +/* We are overloading 2 of the immediate commands + to keep the byte alignment of dmem the same */ + +#define G_SPRITE2D_SCALEFLIP (G_IMMFIRST-1) +#define G_SPRITE2D_DRAW (G_IMMFIRST-2) + +/* RDP commands: */ +#define G_NOOP 0xc0 /* 0 */ + +#endif /* F3DEX_GBI_2 */ + +/* RDP commands: */ +#define G_SETCIMG 0xff /* -1 */ +#define G_SETZIMG 0xfe /* -2 */ +#define G_SETTIMG 0xfd /* -3 */ +#define G_SETCOMBINE 0xfc /* -4 */ +#define G_SETENVCOLOR 0xfb /* -5 */ +#define G_SETPRIMCOLOR 0xfa /* -6 */ +#define G_SETBLENDCOLOR 0xf9 /* -7 */ +#define G_SETFOGCOLOR 0xf8 /* -8 */ +#define G_SETFILLCOLOR 0xf7 /* -9 */ +#define G_FILLRECT 0xf6 /* -10 */ +#define G_SETTILE 0xf5 /* -11 */ +#define G_LOADTILE 0xf4 /* -12 */ +#define G_LOADBLOCK 0xf3 /* -13 */ +#define G_SETTILESIZE 0xf2 /* -14 */ +#define G_LOADTLUT 0xf0 /* -16 */ +#define G_RDPSETOTHERMODE 0xef /* -17 */ +#define G_SETPRIMDEPTH 0xee /* -18 */ +#define G_SETSCISSOR 0xed /* -19 */ +#define G_SETCONVERT 0xec /* -20 */ +#define G_SETKEYR 0xeb /* -21 */ +#define G_SETKEYGB 0xea /* -22 */ +#define G_RDPFULLSYNC 0xe9 /* -23 */ +#define G_RDPTILESYNC 0xe8 /* -24 */ +#define G_RDPPIPESYNC 0xe7 /* -25 */ +#define G_RDPLOADSYNC 0xe6 /* -26 */ +#define G_TEXRECTFLIP 0xe5 /* -27 */ +#define G_TEXRECT 0xe4 /* -28 */ + + +/* + * The following commands are the "generated" RDP commands; the user + * never sees them, the RSP microcode generates them. + * + * The layout of the bits is magical, to save work in the ucode. + * These id's are -56, -52, -54, -50, -55, -51, -53, -49, ... + * edge, shade, texture, zbuff bits: estz + */ +#define G_TRI_FILL 0xc8 /* fill triangle: 11001000 */ +#define G_TRI_SHADE 0xcc /* shade triangle: 11001100 */ +#define G_TRI_TXTR 0xca /* texture triangle: 11001010 */ +#define G_TRI_SHADE_TXTR 0xce /* shade, texture triangle: 11001110 */ +#define G_TRI_FILL_ZBUFF 0xc9 /* fill, zbuff triangle: 11001001 */ +#define G_TRI_SHADE_ZBUFF 0xcd /* shade, zbuff triangle: 11001101 */ +#define G_TRI_TXTR_ZBUFF 0xcb /* texture, zbuff triangle: 11001011 */ +#define G_TRI_SHADE_TXTR_ZBUFF 0xcf /* shade, txtr, zbuff trngl: 11001111 */ + +/* + * A TRI_FILL triangle is just the edges. You need to set the DP + * to use primcolor, in order to see anything. (it is NOT a triangle + * that gets rendered in 'fill mode'. Triangles can't be rendered + * in 'fill mode') + * + * A TRI_SHADE is a gouraud triangle that has colors interpolated. + * Flat-shaded triangles (from the software) are still gouraud shaded, + * it's just the colors are all the same and the deltas are 0. + * + * Other triangle types, and combinations are more obvious. + */ + +/* masks to build RDP triangle commands: */ +#define G_RDP_TRI_FILL_MASK 0x08 +#define G_RDP_TRI_SHADE_MASK 0x04 +#define G_RDP_TRI_TXTR_MASK 0x02 +#define G_RDP_TRI_ZBUFF_MASK 0x01 + +/* + * HACK: + * This is a dreadful hack. For version 1.0 hardware, there are still + * some 'bowtie' hangs. This parameter can be increased to avoid + * the hangs. Every increase of 4 chops one scanline off of every + * triangle. Values of 4,8,12 should be sufficient to avoid any + * bowtie hang. + * + * Change this value, then recompile ALL of your program (including static + * display lists!) + * + * THIS WILL BE REMOVED FOR HARDWARE VERSION 2.0! + */ +#define BOWTIE_VAL 0 + + +/* gets added to RDP command, in order to test for addres fixup: */ +#define G_RDP_ADDR_FIXUP 3 /* |RDP cmds| <= this, do addr fixup */ +#ifdef _LANGUAGE_ASSEMBLY +#define G_RDP_TEXRECT_CHECK ((-1*G_TEXRECTFLIP)& 0xff) +#endif + +/* macros for command parsing: */ +#define GDMACMD(x) (x) +#define GIMMCMD(x) (G_IMMFIRST-(x)) +#define GRDPCMD(x) (0xff-(x)) + +#define G_DMACMDSIZ 128 +#define G_IMMCMDSIZ 64 +#define G_RDPCMDSIZ 64 + +/* + * Coordinate shift values, number of bits of fraction + */ +#define G_TEXTURE_IMAGE_FRAC 2 +#define G_TEXTURE_SCALE_FRAC 16 +#define G_SCALE_FRAC 8 +#define G_ROTATE_FRAC 16 + +/* + * Parameters to graphics commands + */ + +/* + * Data packing macros + */ + +/* + * Maximum z-buffer value, used to initialize the z-buffer. + * Note : this number is NOT the viewport z-scale constant. + * See the comment next to G_MAXZ for more info. + */ +#define G_MAXFBZ 0x3fff /* 3b exp, 11b mantissa */ + +#define GPACK_RGBA5551(r, g, b, a) ((((r)<<8) & 0xf800) | \ + (((g)<<3) & 0x7c0) | \ + (((b)>>2) & 0x3e) | ((a) & 0x1)) +#define GPACK_ZDZ(z, dz) ((z) << 2 | (dz)) + +/* + * G_MTX: parameter flags + */ +#ifdef F3DEX_GBI_2 +# define G_MTX_MODELVIEW 0x00 /* matrix types */ +# define G_MTX_PROJECTION 0x04 +# define G_MTX_MUL 0x00 /* concat or load */ +# define G_MTX_LOAD 0x02 +# define G_MTX_NOPUSH 0x00 /* push or not */ +# define G_MTX_PUSH 0x01 +#else /* F3DEX_GBI_2 */ +# define G_MTX_MODELVIEW 0x00 /* matrix types */ +# define G_MTX_PROJECTION 0x01 +# define G_MTX_MUL 0x00 /* concat or load */ +# define G_MTX_LOAD 0x02 +# define G_MTX_NOPUSH 0x00 /* push or not */ +# define G_MTX_PUSH 0x04 +#endif /* F3DEX_GBI_2 */ + +/* + * flags for G_SETGEOMETRYMODE + * (this rendering state is maintained in RSP) + * + * DO NOT USE THE LOW 8 BITS OF GEOMETRYMODE: + * The weird bit-ordering is for the micro-code: the lower byte + * can be OR'd in with G_TRI_SHADE (11001100) to construct + * the triangle command directly. Don't break it... + * + * DO NOT USE THE HIGH 8 BITS OF GEOMETRYMODE: + * The high byte is OR'd with 0x703 to form the clip code mask. + * If it is set to 0x04, this will cause near clipping to occur. + * If it is zero, near clipping will not occur. + * + * Further explanation: + * G_SHADE is necessary in order to see the color that you passed + * down with the vertex. If G_SHADE isn't set, you need to set the DP + * appropriately and use primcolor to see anything. + * + * G_SHADING_SMOOTH enabled means use all 3 colors of the triangle. + * If it is not set, then do 'flat shading', where only one vertex color + * is used (and all 3 vertices are set to that same color by the ucode) + * See the man page for gSP1Triangle(). + * + */ +#define G_ZBUFFER 0x00000001 +#define G_SHADE 0x00000004 /* enable Gouraud interp */ +/* rest of low byte reserved for setup ucode */ +#ifdef F3DEX_GBI_2 +# define G_TEXTURE_ENABLE 0x00000000 /* Ignored */ +# define G_SHADING_SMOOTH 0x00200000 /* flat or smooth shaded */ +# define G_CULL_FRONT 0x00000200 +# define G_CULL_BACK 0x00000400 +# define G_CULL_BOTH 0x00000600 /* To make code cleaner */ +#else +# define G_TEXTURE_ENABLE 0x00000002 /* Microcode use only */ +# define G_SHADING_SMOOTH 0x00000200 /* flat or smooth shaded */ +# define G_CULL_FRONT 0x00001000 +# define G_CULL_BACK 0x00002000 +# define G_CULL_BOTH 0x00003000 /* To make code cleaner */ +#endif +#define G_FOG 0x00010000 +#define G_LIGHTING 0x00020000 +#define G_TEXTURE_GEN 0x00040000 +#define G_TEXTURE_GEN_LINEAR 0x00080000 +#define G_LOD 0x00100000 /* NOT IMPLEMENTED */ +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +# define G_CLIPPING 0x00800000 +#else +# define G_CLIPPING 0x00000000 +#endif + +#ifdef _LANGUAGE_ASSEMBLY +#define G_FOG_H (G_FOG/0x10000) +#define G_LIGHTING_H (G_LIGHTING/0x10000) +#define G_TEXTURE_GEN_H (G_TEXTURE_GEN/0x10000) +#define G_TEXTURE_GEN_LINEAR_H (G_TEXTURE_GEN_LINEAR/0x10000) +#define G_LOD_H (G_LOD/0x10000) /* NOT IMPLEMENTED */ +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +# define G_CLIPPING_H (G_CLIPPING/0x10000) +#endif +#endif + +/* Need these defined for Sprite Microcode */ +#ifdef _LANGUAGE_ASSEMBLY +#define G_TX_LOADTILE 7 +#define G_TX_RENDERTILE 0 + +#define G_TX_NOMIRROR 0 +#define G_TX_WRAP 0 +#define G_TX_MIRROR 0x1 +#define G_TX_CLAMP 0x2 +#define G_TX_NOMASK 0 +#define G_TX_NOLOD 0 +#endif + +/* + * G_SETIMG fmt: set image formats + */ +#define G_IM_FMT_RGBA 0 +#define G_IM_FMT_YUV 1 +#define G_IM_FMT_CI 2 +#define G_IM_FMT_IA 3 +#define G_IM_FMT_I 4 + +/* + * G_SETIMG siz: set image pixel size + */ +#define G_IM_SIZ_4b 0 +#define G_IM_SIZ_8b 1 +#define G_IM_SIZ_16b 2 +#define G_IM_SIZ_32b 3 +#define G_IM_SIZ_DD 5 + +#define G_IM_SIZ_4b_BYTES 0 +#define G_IM_SIZ_4b_TILE_BYTES G_IM_SIZ_4b_BYTES +#define G_IM_SIZ_4b_LINE_BYTES G_IM_SIZ_4b_BYTES + +#define G_IM_SIZ_8b_BYTES 1 +#define G_IM_SIZ_8b_TILE_BYTES G_IM_SIZ_8b_BYTES +#define G_IM_SIZ_8b_LINE_BYTES G_IM_SIZ_8b_BYTES + +#define G_IM_SIZ_16b_BYTES 2 +#define G_IM_SIZ_16b_TILE_BYTES G_IM_SIZ_16b_BYTES +#define G_IM_SIZ_16b_LINE_BYTES G_IM_SIZ_16b_BYTES + +#define G_IM_SIZ_32b_BYTES 4 +#define G_IM_SIZ_32b_TILE_BYTES 2 +#define G_IM_SIZ_32b_LINE_BYTES 2 + +#define G_IM_SIZ_4b_LOAD_BLOCK G_IM_SIZ_16b +#define G_IM_SIZ_8b_LOAD_BLOCK G_IM_SIZ_16b +#define G_IM_SIZ_16b_LOAD_BLOCK G_IM_SIZ_16b +#define G_IM_SIZ_32b_LOAD_BLOCK G_IM_SIZ_32b + +#define G_IM_SIZ_4b_SHIFT 2 +#define G_IM_SIZ_8b_SHIFT 1 +#define G_IM_SIZ_16b_SHIFT 0 +#define G_IM_SIZ_32b_SHIFT 0 + +#define G_IM_SIZ_4b_INCR 3 +#define G_IM_SIZ_8b_INCR 1 +#define G_IM_SIZ_16b_INCR 0 +#define G_IM_SIZ_32b_INCR 0 + +/* + * G_SETCOMBINE: color combine modes + */ +/* Color combiner constants: */ +#define G_CCMUX_COMBINED 0 +#define G_CCMUX_TEXEL0 1 +#define G_CCMUX_TEXEL1 2 +#define G_CCMUX_PRIMITIVE 3 +#define G_CCMUX_SHADE 4 +#define G_CCMUX_ENVIRONMENT 5 +#define G_CCMUX_CENTER 6 +#define G_CCMUX_SCALE 6 +#define G_CCMUX_COMBINED_ALPHA 7 +#define G_CCMUX_TEXEL0_ALPHA 8 +#define G_CCMUX_TEXEL1_ALPHA 9 +#define G_CCMUX_PRIMITIVE_ALPHA 10 +#define G_CCMUX_SHADE_ALPHA 11 +#define G_CCMUX_ENV_ALPHA 12 +#define G_CCMUX_LOD_FRACTION 13 +#define G_CCMUX_PRIM_LOD_FRAC 14 +#define G_CCMUX_NOISE 7 +#define G_CCMUX_K4 7 +#define G_CCMUX_K5 15 +#define G_CCMUX_1 6 +#define G_CCMUX_0 31 + +/* Alpha combiner constants: */ +#define G_ACMUX_COMBINED 0 +#define G_ACMUX_TEXEL0 1 +#define G_ACMUX_TEXEL1 2 +#define G_ACMUX_PRIMITIVE 3 +#define G_ACMUX_SHADE 4 +#define G_ACMUX_ENVIRONMENT 5 +#define G_ACMUX_LOD_FRACTION 0 +#define G_ACMUX_PRIM_LOD_FRAC 6 +#define G_ACMUX_1 6 +#define G_ACMUX_0 7 + +/* typical CC cycle 1 modes */ +#define G_CC_PRIMITIVE 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE +#define G_CC_SHADE 0, 0, 0, SHADE, 0, 0, 0, SHADE + +#define G_CC_MODULATEI TEXEL0, 0, SHADE, 0, 0, 0, 0, SHADE +#define G_CC_MODULATEIDECALA TEXEL0, 0, SHADE, 0, 0, 0, 0, TEXEL0 +#define G_CC_MODULATEIFADE TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT + +#define G_CC_MODULATERGB G_CC_MODULATEI +#define G_CC_MODULATERGBDECALA G_CC_MODULATEIDECALA +#define G_CC_MODULATERGBFADE G_CC_MODULATEIFADE + +#define G_CC_MODULATEIA TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0 +#define G_CC_MODULATEIFADEA TEXEL0, 0, SHADE, 0, TEXEL0, 0, ENVIRONMENT, 0 + +#define G_CC_MODULATEFADE TEXEL0, 0, SHADE, 0, ENVIRONMENT, 0, TEXEL0, 0 + +#define G_CC_MODULATERGBA G_CC_MODULATEIA +#define G_CC_MODULATERGBFADEA G_CC_MODULATEIFADEA + +#define G_CC_MODULATEI_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE +#define G_CC_MODULATEIA_PRIM TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0 +#define G_CC_MODULATEIDECALA_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, TEXEL0 + +#define G_CC_MODULATERGB_PRIM G_CC_MODULATEI_PRIM +#define G_CC_MODULATERGBA_PRIM G_CC_MODULATEIA_PRIM +#define G_CC_MODULATERGBDECALA_PRIM G_CC_MODULATEIDECALA_PRIM + +#define G_CC_FADE SHADE, 0, ENVIRONMENT, 0, SHADE, 0, ENVIRONMENT, 0 +#define G_CC_FADEA TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, ENVIRONMENT, 0 + +#define G_CC_DECALRGB 0, 0, 0, TEXEL0, 0, 0, 0, SHADE +#define G_CC_DECALRGBA 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0 +#define G_CC_DECALFADE 0, 0, 0, TEXEL0, 0, 0, 0, ENVIRONMENT + +#define G_CC_DECALFADEA 0, 0, 0, TEXEL0, TEXEL0, 0, ENVIRONMENT, 0 + +#define G_CC_BLENDI ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_BLENDIA ENVIRONMENT, SHADE, TEXEL0, SHADE, TEXEL0, 0, SHADE, 0 +#define G_CC_BLENDIDECALA ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0 + +#define G_CC_BLENDRGBA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, SHADE +#define G_CC_BLENDRGBDECALA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_BLENDRGBFADEA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, ENVIRONMENT + +#define G_CC_ADDRGB TEXEL0, 0, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_ADDRGBDECALA TEXEL0, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_ADDRGBFADE TEXEL0, 0, TEXEL0, SHADE, 0, 0, 0, ENVIRONMENT + +#define G_CC_REFLECTRGB ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_REFLECTRGBDECALA ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0 + +#define G_CC_HILITERGB PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_HILITERGBA PRIMITIVE, SHADE, TEXEL0, SHADE, PRIMITIVE, SHADE, TEXEL0, SHADE +#define G_CC_HILITERGBDECALA PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0 + +#define G_CC_SHADEDECALA 0, 0, 0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_SHADEFADEA 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT + +#define G_CC_BLENDPE PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, SHADE, 0 +#define G_CC_BLENDPEDECALA PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, TEXEL0 + +/* oddball modes */ +#define _G_CC_BLENDPE ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, SHADE, 0 +#define _G_CC_BLENDPEDECALA ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, 0, 0, 0, TEXEL0 +#define _G_CC_TWOCOLORTEX PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE +/* used for 1-cycle sparse mip-maps, primitive color has color of lowest LOD */ +#define _G_CC_SPARSEST PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0, PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0 +#define G_CC_TEMPLERP TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0 + +/* typical CC cycle 1 modes, usually followed by other cycle 2 modes */ +#define G_CC_TRILERP TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0, TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0 +#define G_CC_INTERFERENCE TEXEL0, 0, TEXEL1, 0, TEXEL0, 0, TEXEL1, 0 + +/* + * One-cycle color convert operation + */ +#define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE + +/* + * NOTE: YUV2RGB expects TF step1 color conversion to occur in 2nd clock. + * Therefore, CC looks for step1 results in TEXEL1 + */ +#define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0 + +/* typical CC cycle 2 modes */ +#define G_CC_PASS2 0, 0, 0, COMBINED, 0, 0, 0, COMBINED +#define G_CC_MODULATEI2 COMBINED, 0, SHADE, 0, 0, 0, 0, SHADE +#define G_CC_MODULATEIA2 COMBINED, 0, SHADE, 0, COMBINED, 0, SHADE, 0 +#define G_CC_MODULATERGB2 G_CC_MODULATEI2 +#define G_CC_MODULATERGBA2 G_CC_MODULATEIA2 +#define G_CC_MODULATEI_PRIM2 COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE +#define G_CC_MODULATEIA_PRIM2 COMBINED, 0, PRIMITIVE, 0, COMBINED, 0, PRIMITIVE, 0 +#define G_CC_MODULATERGB_PRIM2 G_CC_MODULATEI_PRIM2 +#define G_CC_MODULATERGBA_PRIM2 G_CC_MODULATEIA_PRIM2 +#define G_CC_DECALRGB2 0, 0, 0, COMBINED, 0, 0, 0, SHADE +/* + * ? +#define G_CC_DECALRGBA2 COMBINED, SHADE, COMBINED_ALPHA, SHADE, 0, 0, 0, SHADE +*/ +#define G_CC_BLENDI2 ENVIRONMENT, SHADE, COMBINED, SHADE, 0, 0, 0, SHADE +#define G_CC_BLENDIA2 ENVIRONMENT, SHADE, COMBINED, SHADE, COMBINED, 0, SHADE, 0 +#define G_CC_CHROMA_KEY2 TEXEL0, CENTER, SCALE, 0, 0, 0, 0, 0 +#define G_CC_HILITERGB2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, SHADE +#define G_CC_HILITERGBA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, ENVIRONMENT, COMBINED, TEXEL0, COMBINED +#define G_CC_HILITERGBDECALA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, TEXEL0 +#define G_CC_HILITERGBPASSA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, COMBINED + +/* + * G_SETOTHERMODE_L sft: shift count + */ +#define G_MDSFT_ALPHACOMPARE 0 +#define G_MDSFT_ZSRCSEL 2 +#define G_MDSFT_RENDERMODE 3 +#define G_MDSFT_BLENDER 16 + +/* + * G_SETOTHERMODE_H sft: shift count + */ +#define G_MDSFT_BLENDMASK 0 /* unsupported */ +#define G_MDSFT_ALPHADITHER 4 +#define G_MDSFT_RGBDITHER 6 + +#define G_MDSFT_COMBKEY 8 +#define G_MDSFT_TEXTCONV 9 +#define G_MDSFT_TEXTFILT 12 +#define G_MDSFT_TEXTLUT 14 +#define G_MDSFT_TEXTLOD 16 +#define G_MDSFT_TEXTDETAIL 17 +#define G_MDSFT_TEXTPERSP 19 +#define G_MDSFT_CYCLETYPE 20 +#define G_MDSFT_COLORDITHER 22 /* unsupported in HW 2.0 */ +#define G_MDSFT_PIPELINE 23 + +/* G_SETOTHERMODE_H gPipelineMode */ +#define G_PM_1PRIMITIVE (1 << G_MDSFT_PIPELINE) +#define G_PM_NPRIMITIVE (0 << G_MDSFT_PIPELINE) + +/* G_SETOTHERMODE_H gSetCycleType */ +#define G_CYC_1CYCLE (0 << G_MDSFT_CYCLETYPE) +#define G_CYC_2CYCLE (1 << G_MDSFT_CYCLETYPE) +#define G_CYC_COPY (2 << G_MDSFT_CYCLETYPE) +#define G_CYC_FILL (3 << G_MDSFT_CYCLETYPE) + +/* G_SETOTHERMODE_H gSetTexturePersp */ +#define G_TP_NONE (0 << G_MDSFT_TEXTPERSP) +#define G_TP_PERSP (1 << G_MDSFT_TEXTPERSP) + +/* G_SETOTHERMODE_H gSetTextureDetail */ +#define G_TD_CLAMP (0 << G_MDSFT_TEXTDETAIL) +#define G_TD_SHARPEN (1 << G_MDSFT_TEXTDETAIL) +#define G_TD_DETAIL (2 << G_MDSFT_TEXTDETAIL) + +/* G_SETOTHERMODE_H gSetTextureLOD */ +#define G_TL_TILE (0 << G_MDSFT_TEXTLOD) +#define G_TL_LOD (1 << G_MDSFT_TEXTLOD) + +/* G_SETOTHERMODE_H gSetTextureLUT */ +#define G_TT_NONE (0 << G_MDSFT_TEXTLUT) +#define G_TT_RGBA16 (2 << G_MDSFT_TEXTLUT) +#define G_TT_IA16 (3 << G_MDSFT_TEXTLUT) + +/* G_SETOTHERMODE_H gSetTextureFilter */ +#define G_TF_POINT (0 << G_MDSFT_TEXTFILT) +#define G_TF_AVERAGE (3 << G_MDSFT_TEXTFILT) +#define G_TF_BILERP (2 << G_MDSFT_TEXTFILT) + +/* G_SETOTHERMODE_H gSetTextureConvert */ +#define G_TC_CONV (0 << G_MDSFT_TEXTCONV) +#define G_TC_FILTCONV (5 << G_MDSFT_TEXTCONV) +#define G_TC_FILT (6 << G_MDSFT_TEXTCONV) + +/* G_SETOTHERMODE_H gSetCombineKey */ +#define G_CK_NONE (0 << G_MDSFT_COMBKEY) +#define G_CK_KEY (1 << G_MDSFT_COMBKEY) + +/* G_SETOTHERMODE_H gSetColorDither */ +#define G_CD_MAGICSQ (0 << G_MDSFT_RGBDITHER) +#define G_CD_BAYER (1 << G_MDSFT_RGBDITHER) +#define G_CD_NOISE (2 << G_MDSFT_RGBDITHER) + +#ifndef _HW_VERSION_1 +#define G_CD_DISABLE (3 << G_MDSFT_RGBDITHER) +#define G_CD_ENABLE G_CD_NOISE /* HW 1.0 compatibility mode */ +#else +#define G_CD_ENABLE (1 << G_MDSFT_COLORDITHER) +#define G_CD_DISABLE (0 << G_MDSFT_COLORDITHER) +#endif + +/* G_SETOTHERMODE_H gSetAlphaDither */ +#define G_AD_PATTERN (0 << G_MDSFT_ALPHADITHER) +#define G_AD_NOTPATTERN (1 << G_MDSFT_ALPHADITHER) +#define G_AD_NOISE (2 << G_MDSFT_ALPHADITHER) +#define G_AD_DISABLE (3 << G_MDSFT_ALPHADITHER) + +/* G_SETOTHERMODE_L gSetAlphaCompare */ +#define G_AC_NONE (0 << G_MDSFT_ALPHACOMPARE) +#define G_AC_THRESHOLD (1 << G_MDSFT_ALPHACOMPARE) +#define G_AC_DITHER (3 << G_MDSFT_ALPHACOMPARE) + +/* G_SETOTHERMODE_L gSetDepthSource */ +#define G_ZS_PIXEL (0 << G_MDSFT_ZSRCSEL) +#define G_ZS_PRIM (1 << G_MDSFT_ZSRCSEL) + +/* G_SETOTHERMODE_L gSetRenderMode */ +#define AA_EN 0x8 +#define Z_CMP 0x10 +#define Z_UPD 0x20 +#define IM_RD 0x40 +#define CLR_ON_CVG 0x80 +#define CVG_DST_CLAMP 0 +#define CVG_DST_WRAP 0x100 +#define CVG_DST_FULL 0x200 +#define CVG_DST_SAVE 0x300 +#define ZMODE_OPA 0 +#define ZMODE_INTER 0x400 +#define ZMODE_XLU 0x800 +#define ZMODE_DEC 0xc00 +#define CVG_X_ALPHA 0x1000 +#define ALPHA_CVG_SEL 0x2000 +#define FORCE_BL 0x4000 +#define TEX_EDGE 0x0000 /* used to be 0x8000 */ + +#define G_BL_CLR_IN 0 +#define G_BL_CLR_MEM 1 +#define G_BL_CLR_BL 2 +#define G_BL_CLR_FOG 3 +#define G_BL_1MA 0 +#define G_BL_A_MEM 1 +#define G_BL_A_IN 0 +#define G_BL_A_FOG 1 +#define G_BL_A_SHADE 2 +#define G_BL_1 2 +#define G_BL_0 3 + +#define GBL_c1(m1a, m1b, m2a, m2b) \ + (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 +#define GBL_c2(m1a, m1b, m2a, m2b) \ + (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 + +#define RM_AA_ZB_OPA_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_ZB_OPA_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_XLU_SURF(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ + FORCE_BL | ZMODE_XLU | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_OPA_DECAL(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ALPHA_CVG_SEL | \ + ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_ZB_OPA_DECAL(clk) \ + AA_EN | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | \ + ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_XLU_DECAL(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ + FORCE_BL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_OPA_INTER(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ALPHA_CVG_SEL | ZMODE_INTER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_ZB_OPA_INTER(clk) \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ + ALPHA_CVG_SEL | ZMODE_INTER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_XLU_INTER(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ + FORCE_BL | ZMODE_INTER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_XLU_LINE(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | ZMODE_XLU | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_DEC_LINE(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_TEX_EDGE(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_TEX_INTER(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_INTER | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_SUB_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_PCL_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | G_AC_DITHER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_OPA_TERR(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_TEX_TERR(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_SUB_TERR(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + + +#define RM_AA_OPA_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_OPA_SURF(clk) \ + AA_EN | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_XLU_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | \ + ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_XLU_LINE(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_DEC_LINE(clk) \ + AA_EN | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | \ + ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_TEX_EDGE(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_SUB_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_FULL | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_PCL_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | G_AC_DITHER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_OPA_TERR(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_TEX_TERR(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | \ + CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_SUB_TERR(clk) \ + AA_EN | IM_RD | CVG_DST_FULL | \ + ZMODE_OPA | ALPHA_CVG_SEL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + + +#define RM_ZB_OPA_SURF(clk) \ + Z_CMP | Z_UPD | CVG_DST_FULL | ALPHA_CVG_SEL | \ + ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_ZB_XLU_SURF(clk) \ + Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_XLU | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_OPA_DECAL(clk) \ + Z_CMP | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_ZB_XLU_DECAL(clk) \ + Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_CLD_SURF(clk) \ + Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_XLU | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_OVL_SURF(clk) \ + Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_DEC | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_PCL_SURF(clk) \ + Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \ + G_AC_DITHER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + + +#define RM_OPA_SURF(clk) \ + CVG_DST_CLAMP | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_XLU_SURF(clk) \ + IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_TEX_EDGE(clk) \ + CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL |\ + ZMODE_OPA | TEX_EDGE | AA_EN | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_CLD_SURF(clk) \ + IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_PCL_SURF(clk) \ + CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \ + G_AC_DITHER | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_ADD(clk) \ + IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) + +#define RM_NOOP(clk) \ + GBL_c##clk(0, 0, 0, 0) + +#define RM_VISCVG(clk) \ + IM_RD | FORCE_BL | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) + +/* for rendering to an 8-bit framebuffer */ +#define RM_OPA_CI(clk) \ + CVG_DST_CLAMP | ZMODE_OPA | \ + GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +/* Custom version of RM_AA_ZB_XLU_SURF with Z_UPD */ +#define RM_CUSTOM_AA_ZB_XLU_SURF(clk) \ + RM_AA_ZB_XLU_SURF(clk) | Z_UPD + + +#define G_RM_AA_ZB_OPA_SURF RM_AA_ZB_OPA_SURF(1) +#define G_RM_AA_ZB_OPA_SURF2 RM_AA_ZB_OPA_SURF(2) +#define G_RM_AA_ZB_XLU_SURF RM_AA_ZB_XLU_SURF(1) +#define G_RM_AA_ZB_XLU_SURF2 RM_AA_ZB_XLU_SURF(2) +#define G_RM_AA_ZB_OPA_DECAL RM_AA_ZB_OPA_DECAL(1) +#define G_RM_AA_ZB_OPA_DECAL2 RM_AA_ZB_OPA_DECAL(2) +#define G_RM_AA_ZB_XLU_DECAL RM_AA_ZB_XLU_DECAL(1) +#define G_RM_AA_ZB_XLU_DECAL2 RM_AA_ZB_XLU_DECAL(2) +#define G_RM_AA_ZB_OPA_INTER RM_AA_ZB_OPA_INTER(1) +#define G_RM_AA_ZB_OPA_INTER2 RM_AA_ZB_OPA_INTER(2) +#define G_RM_AA_ZB_XLU_INTER RM_AA_ZB_XLU_INTER(1) +#define G_RM_AA_ZB_XLU_INTER2 RM_AA_ZB_XLU_INTER(2) +#define G_RM_AA_ZB_XLU_LINE RM_AA_ZB_XLU_LINE(1) +#define G_RM_AA_ZB_XLU_LINE2 RM_AA_ZB_XLU_LINE(2) +#define G_RM_AA_ZB_DEC_LINE RM_AA_ZB_DEC_LINE(1) +#define G_RM_AA_ZB_DEC_LINE2 RM_AA_ZB_DEC_LINE(2) +#define G_RM_AA_ZB_TEX_EDGE RM_AA_ZB_TEX_EDGE(1) +#define G_RM_AA_ZB_TEX_EDGE2 RM_AA_ZB_TEX_EDGE(2) +#define G_RM_AA_ZB_TEX_INTER RM_AA_ZB_TEX_INTER(1) +#define G_RM_AA_ZB_TEX_INTER2 RM_AA_ZB_TEX_INTER(2) +#define G_RM_AA_ZB_SUB_SURF RM_AA_ZB_SUB_SURF(1) +#define G_RM_AA_ZB_SUB_SURF2 RM_AA_ZB_SUB_SURF(2) +#define G_RM_AA_ZB_PCL_SURF RM_AA_ZB_PCL_SURF(1) +#define G_RM_AA_ZB_PCL_SURF2 RM_AA_ZB_PCL_SURF(2) +#define G_RM_AA_ZB_OPA_TERR RM_AA_ZB_OPA_TERR(1) +#define G_RM_AA_ZB_OPA_TERR2 RM_AA_ZB_OPA_TERR(2) +#define G_RM_AA_ZB_TEX_TERR RM_AA_ZB_TEX_TERR(1) +#define G_RM_AA_ZB_TEX_TERR2 RM_AA_ZB_TEX_TERR(2) +#define G_RM_AA_ZB_SUB_TERR RM_AA_ZB_SUB_TERR(1) +#define G_RM_AA_ZB_SUB_TERR2 RM_AA_ZB_SUB_TERR(2) + +#define G_RM_RA_ZB_OPA_SURF RM_RA_ZB_OPA_SURF(1) +#define G_RM_RA_ZB_OPA_SURF2 RM_RA_ZB_OPA_SURF(2) +#define G_RM_RA_ZB_OPA_DECAL RM_RA_ZB_OPA_DECAL(1) +#define G_RM_RA_ZB_OPA_DECAL2 RM_RA_ZB_OPA_DECAL(2) +#define G_RM_RA_ZB_OPA_INTER RM_RA_ZB_OPA_INTER(1) +#define G_RM_RA_ZB_OPA_INTER2 RM_RA_ZB_OPA_INTER(2) + +#define G_RM_AA_OPA_SURF RM_AA_OPA_SURF(1) +#define G_RM_AA_OPA_SURF2 RM_AA_OPA_SURF(2) +#define G_RM_AA_XLU_SURF RM_AA_XLU_SURF(1) +#define G_RM_AA_XLU_SURF2 RM_AA_XLU_SURF(2) +#define G_RM_AA_XLU_LINE RM_AA_XLU_LINE(1) +#define G_RM_AA_XLU_LINE2 RM_AA_XLU_LINE(2) +#define G_RM_AA_DEC_LINE RM_AA_DEC_LINE(1) +#define G_RM_AA_DEC_LINE2 RM_AA_DEC_LINE(2) +#define G_RM_AA_TEX_EDGE RM_AA_TEX_EDGE(1) +#define G_RM_AA_TEX_EDGE2 RM_AA_TEX_EDGE(2) +#define G_RM_AA_SUB_SURF RM_AA_SUB_SURF(1) +#define G_RM_AA_SUB_SURF2 RM_AA_SUB_SURF(2) +#define G_RM_AA_PCL_SURF RM_AA_PCL_SURF(1) +#define G_RM_AA_PCL_SURF2 RM_AA_PCL_SURF(2) +#define G_RM_AA_OPA_TERR RM_AA_OPA_TERR(1) +#define G_RM_AA_OPA_TERR2 RM_AA_OPA_TERR(2) +#define G_RM_AA_TEX_TERR RM_AA_TEX_TERR(1) +#define G_RM_AA_TEX_TERR2 RM_AA_TEX_TERR(2) +#define G_RM_AA_SUB_TERR RM_AA_SUB_TERR(1) +#define G_RM_AA_SUB_TERR2 RM_AA_SUB_TERR(2) + +#define G_RM_RA_OPA_SURF RM_RA_OPA_SURF(1) +#define G_RM_RA_OPA_SURF2 RM_RA_OPA_SURF(2) + +#define G_RM_ZB_OPA_SURF RM_ZB_OPA_SURF(1) +#define G_RM_ZB_OPA_SURF2 RM_ZB_OPA_SURF(2) +#define G_RM_ZB_XLU_SURF RM_ZB_XLU_SURF(1) +#define G_RM_ZB_XLU_SURF2 RM_ZB_XLU_SURF(2) +#define G_RM_ZB_OPA_DECAL RM_ZB_OPA_DECAL(1) +#define G_RM_ZB_OPA_DECAL2 RM_ZB_OPA_DECAL(2) +#define G_RM_ZB_XLU_DECAL RM_ZB_XLU_DECAL(1) +#define G_RM_ZB_XLU_DECAL2 RM_ZB_XLU_DECAL(2) +#define G_RM_ZB_CLD_SURF RM_ZB_CLD_SURF(1) +#define G_RM_ZB_CLD_SURF2 RM_ZB_CLD_SURF(2) +#define G_RM_ZB_OVL_SURF RM_ZB_OVL_SURF(1) +#define G_RM_ZB_OVL_SURF2 RM_ZB_OVL_SURF(2) +#define G_RM_ZB_PCL_SURF RM_ZB_PCL_SURF(1) +#define G_RM_ZB_PCL_SURF2 RM_ZB_PCL_SURF(2) + +#define G_RM_OPA_SURF RM_OPA_SURF(1) +#define G_RM_OPA_SURF2 RM_OPA_SURF(2) +#define G_RM_XLU_SURF RM_XLU_SURF(1) +#define G_RM_XLU_SURF2 RM_XLU_SURF(2) +#define G_RM_CLD_SURF RM_CLD_SURF(1) +#define G_RM_CLD_SURF2 RM_CLD_SURF(2) +#define G_RM_TEX_EDGE RM_TEX_EDGE(1) +#define G_RM_TEX_EDGE2 RM_TEX_EDGE(2) +#define G_RM_PCL_SURF RM_PCL_SURF(1) +#define G_RM_PCL_SURF2 RM_PCL_SURF(2) +#define G_RM_ADD RM_ADD(1) +#define G_RM_ADD2 RM_ADD(2) +#define G_RM_NOOP RM_NOOP(1) +#define G_RM_NOOP2 RM_NOOP(2) +#define G_RM_VISCVG RM_VISCVG(1) +#define G_RM_VISCVG2 RM_VISCVG(2) +#define G_RM_OPA_CI RM_OPA_CI(1) +#define G_RM_OPA_CI2 RM_OPA_CI(2) + +#define G_RM_CUSTOM_AA_ZB_XLU_SURF RM_CUSTOM_AA_ZB_XLU_SURF(1) +#define G_RM_CUSTOM_AA_ZB_XLU_SURF2 RM_CUSTOM_AA_ZB_XLU_SURF(2) + + +#define G_RM_FOG_SHADE_A GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA) +#define G_RM_FOG_PRIM_A GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA) +#define G_RM_PASS GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +/* + * G_SETCONVERT: K0-5 + */ +#define G_CV_K0 175 +#define G_CV_K1 -43 +#define G_CV_K2 -89 +#define G_CV_K3 222 +#define G_CV_K4 114 +#define G_CV_K5 42 + +/* + * G_SETSCISSOR: interlace mode + */ +#define G_SC_NON_INTERLACE 0 +#define G_SC_ODD_INTERLACE 3 +#define G_SC_EVEN_INTERLACE 2 + +/* flags to inhibit pushing of the display list (on branch) */ +#define G_DL_PUSH 0x00 +#define G_DL_NOPUSH 0x01 + +/* + * BEGIN C-specific section: (typedef's) + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * Data Structures + * + * NOTE: + * The DMA transfer hardware requires 64-bit aligned, 64-bit multiple- + * sized transfers. This important hardware optimization is unfortunately + * reflected in the programming interface, with some structures + * padded and alignment enforced. + * + * Since structures are aligned to the boundary of the "worst-case" + * element, we can't depend on the C compiler to align things + * properly. + * + * 64-bit structure alignment is enforced by wrapping structures with + * unions that contain a dummy "long long int". Why this works is + * explained in the ANSI C Spec, or on page 186 of the second edition + * of K&R, "The C Programming Language". + * + * The price we pay for this is a little awkwardness referencing the + * structures through the union. There is no memory penalty, since + * all the structures are at least 64-bits the dummy alignment field + * does not increase the size of the union. + * + * Static initialization of these union structures works because + * the ANSI C spec states that static initialization for unions + * works by using the first union element. We put the dummy alignment + * field last for this reason. + * + * (it's possible a newer 64-bit compiler from MIPS might make this + * easier with a flag, but we can't wait for it...) + * + */ + +/* + * Vertex (set up for use with colors) + */ +typedef struct { +#ifndef GBI_FLOATS + short ob[3]; /* x, y, z */ +#else + float ob[3]; /* x, y, z */ +#endif + unsigned short flag; + short tc[2]; /* texture coord */ + unsigned char cn[4]; /* color & alpha */ +} Vtx_t; + +/* + * Vertex (set up for use with normals) + */ +typedef struct { +#ifndef GBI_FLOATS + short ob[3]; /* x, y, z */ +#else + float ob[3]; /* x, y, z */ +#endif + unsigned short flag; + short tc[2]; /* texture coord */ + signed char n[3]; /* normal */ + unsigned char a; /* alpha */ +} Vtx_tn; + +typedef union { + Vtx_t v; /* Use this one for colors */ + Vtx_tn n; /* Use this one for normals */ + long long int force_structure_alignment; +} Vtx; + +/* + * Sprite structure + */ + +typedef struct { + void *SourceImagePointer; + void *TlutPointer; + short Stride; + short SubImageWidth; + short SubImageHeight; + char SourceImageType; + char SourceImageBitSize; + short SourceImageOffsetS; + short SourceImageOffsetT; + /* 20 bytes for above */ + + /* padding to bring structure size to 64 bit allignment */ + char dummy[4]; + +} uSprite_t; + +typedef union { + uSprite_t s; + + /* Need to make sure this is 64 bit aligned */ + long long int force_structure_allignment[3]; +} uSprite; + +/* + * Triangle face + */ +typedef struct { + unsigned char flag; + unsigned char v[3]; +} Tri; + +#ifndef GBI_FLOATS +/* + * 4x4 matrix, fixed point s15.16 format. + * First 8 words are integer portion of the 4x4 matrix + * Last 8 words are the fraction portion of the 4x4 matrix + */ +typedef s32 Mtx_t[4][4]; + +typedef union { + Mtx_t m; + long long int force_structure_alignment; +} Mtx; +#else +typedef struct { + float m[4][4]; +} Mtx; +#endif + +/* + * Viewport + */ + +/* + * + * This magic value is the maximum INTEGER z-range of the hardware + * (there are also 16-bits of fraction, which are introduced during + * any transformations). This is not just a good idea, it's the law. + * Feeding the hardware eventual z-coordinates (after any transforms + * or scaling) bigger than this, will not work. + * + * This number is DIFFERENT than G_MAXFBZ, which is the maximum value + * you want to use to initialize the z-buffer. + * + * The reason these are different is mildly interesting, but too long + * to explain here. It is basically the result of optimizations in the + * hardware. A more generic API might hide this detail from the users, + * but we don't have the ucode to do that... + * + */ +#define G_MAXZ 0x03ff /* 10 bits of integer screen-Z precision */ + +/* + * The viewport structure elements have 2 bits of fraction, necessary + * to accomodate the sub-pixel positioning scaling for the hardware. + * This can also be exploited to handle odd-sized viewports. + * + * Accounting for these fractional bits, using the default projection + * and viewing matrices, the viewport structure is initialized thusly: + * + * (SCREEN_WD/2)*4, (SCREEN_HT/2)*4, G_MAXZ, 0, + * (SCREEN_WD/2)*4, (SCREEN_HT/2)*4, 0, 0, + */ +typedef struct { + short vscale[4]; /* scale, 2 bits fraction */ + short vtrans[4]; /* translate, 2 bits fraction */ + /* both the above arrays are padded to 64-bit boundary */ +} Vp_t; + +typedef union { + Vp_t vp; + long long int force_structure_alignment; +} Vp; + +/* + * MOVEMEM indices + * + * Each of these indexes an entry in a dmem table + * which points to a 1-4 word block of dmem in + * which to store a 1-4 word DMA. + * + */ +#ifdef F3DEX_GBI_2 +/* 0,4 are reserved by G_MTX */ +# define G_MV_MMTX 2 +# define G_MV_PMTX 6 +# define G_MV_VIEWPORT 8 +# define G_MV_LIGHT 10 +# define G_MV_POINT 12 +# define G_MV_MATRIX 14 /* NOTE: this is in moveword table */ +# define G_MVO_LOOKATX (0*24) +# define G_MVO_LOOKATY (1*24) +# define G_MVO_L0 (2*24) +# define G_MVO_L1 (3*24) +# define G_MVO_L2 (4*24) +# define G_MVO_L3 (5*24) +# define G_MVO_L4 (6*24) +# define G_MVO_L5 (7*24) +# define G_MVO_L6 (8*24) +# define G_MVO_L7 (9*24) +#else /* F3DEX_GBI_2 */ +# define G_MV_VIEWPORT 0x80 +# define G_MV_LOOKATY 0x82 +# define G_MV_LOOKATX 0x84 +# define G_MV_L0 0x86 +# define G_MV_L1 0x88 +# define G_MV_L2 0x8a +# define G_MV_L3 0x8c +# define G_MV_L4 0x8e +# define G_MV_L5 0x90 +# define G_MV_L6 0x92 +# define G_MV_L7 0x94 +# define G_MV_TXTATT 0x96 +# define G_MV_MATRIX_1 0x9e /* NOTE: this is in moveword table */ +# define G_MV_MATRIX_2 0x98 +# define G_MV_MATRIX_3 0x9a +# define G_MV_MATRIX_4 0x9c +#endif /* F3DEX_GBI_2 */ + +/* + * MOVEWORD indices + * + * Each of these indexes an entry in a dmem table + * which points to a word in dmem in dmem where + * an immediate word will be stored. + * + */ +#define G_MW_MATRIX 0x00 /* NOTE: also used by movemem */ +#define G_MW_NUMLIGHT 0x02 +#define G_MW_CLIP 0x04 +#define G_MW_SEGMENT 0x06 +#define G_MW_FOG 0x08 +#define G_MW_LIGHTCOL 0x0a +#ifdef F3DEX_GBI_2 +# define G_MW_FORCEMTX 0x0c +#else /* F3DEX_GBI_2 */ +# define G_MW_POINTS 0x0c +#endif /* F3DEX_GBI_2 */ +#define G_MW_PERSPNORM 0x0e + +/* + * These are offsets from the address in the dmem table + */ +#define G_MWO_NUMLIGHT 0x00 +#define G_MWO_CLIP_RNX 0x04 +#define G_MWO_CLIP_RNY 0x0c +#define G_MWO_CLIP_RPX 0x14 +#define G_MWO_CLIP_RPY 0x1c +#define G_MWO_SEGMENT_0 0x00 +#define G_MWO_SEGMENT_1 0x01 +#define G_MWO_SEGMENT_2 0x02 +#define G_MWO_SEGMENT_3 0x03 +#define G_MWO_SEGMENT_4 0x04 +#define G_MWO_SEGMENT_5 0x05 +#define G_MWO_SEGMENT_6 0x06 +#define G_MWO_SEGMENT_7 0x07 +#define G_MWO_SEGMENT_8 0x08 +#define G_MWO_SEGMENT_9 0x09 +#define G_MWO_SEGMENT_A 0x0a +#define G_MWO_SEGMENT_B 0x0b +#define G_MWO_SEGMENT_C 0x0c +#define G_MWO_SEGMENT_D 0x0d +#define G_MWO_SEGMENT_E 0x0e +#define G_MWO_SEGMENT_F 0x0f +#define G_MWO_FOG 0x00 +#define G_MWO_aLIGHT_1 0x00 +#define G_MWO_bLIGHT_1 0x04 +#ifdef F3DEX_GBI_2 +#define G_MWO_aLIGHT_2 0x18 +#define G_MWO_bLIGHT_2 0x1c +#define G_MWO_aLIGHT_3 0x30 +#define G_MWO_bLIGHT_3 0x34 +#define G_MWO_aLIGHT_4 0x48 +#define G_MWO_bLIGHT_4 0x4c +#define G_MWO_aLIGHT_5 0x60 +#define G_MWO_bLIGHT_5 0x64 +#define G_MWO_aLIGHT_6 0x78 +#define G_MWO_bLIGHT_6 0x7c +#define G_MWO_aLIGHT_7 0x90 +#define G_MWO_bLIGHT_7 0x94 +#define G_MWO_aLIGHT_8 0xa8 +#define G_MWO_bLIGHT_8 0xac +#else +#define G_MWO_aLIGHT_2 0x20 +#define G_MWO_bLIGHT_2 0x24 +#define G_MWO_aLIGHT_3 0x40 +#define G_MWO_bLIGHT_3 0x44 +#define G_MWO_aLIGHT_4 0x60 +#define G_MWO_bLIGHT_4 0x64 +#define G_MWO_aLIGHT_5 0x80 +#define G_MWO_bLIGHT_5 0x84 +#define G_MWO_aLIGHT_6 0xa0 +#define G_MWO_bLIGHT_6 0xa4 +#define G_MWO_aLIGHT_7 0xc0 +#define G_MWO_bLIGHT_7 0xc4 +#define G_MWO_aLIGHT_8 0xe0 +#define G_MWO_bLIGHT_8 0xe4 +#endif +#define G_MWO_MATRIX_XX_XY_I 0x00 +#define G_MWO_MATRIX_XZ_XW_I 0x04 +#define G_MWO_MATRIX_YX_YY_I 0x08 +#define G_MWO_MATRIX_YZ_YW_I 0x0c +#define G_MWO_MATRIX_ZX_ZY_I 0x10 +#define G_MWO_MATRIX_ZZ_ZW_I 0x14 +#define G_MWO_MATRIX_WX_WY_I 0x18 +#define G_MWO_MATRIX_WZ_WW_I 0x1c +#define G_MWO_MATRIX_XX_XY_F 0x20 +#define G_MWO_MATRIX_XZ_XW_F 0x24 +#define G_MWO_MATRIX_YX_YY_F 0x28 +#define G_MWO_MATRIX_YZ_YW_F 0x2c +#define G_MWO_MATRIX_ZX_ZY_F 0x30 +#define G_MWO_MATRIX_ZZ_ZW_F 0x34 +#define G_MWO_MATRIX_WX_WY_F 0x38 +#define G_MWO_MATRIX_WZ_WW_F 0x3c +#define G_MWO_POINT_RGBA 0x10 +#define G_MWO_POINT_ST 0x14 +#define G_MWO_POINT_XYSCREEN 0x18 +#define G_MWO_POINT_ZSCREEN 0x1c + +/* + * Light structure. + * + * Note: only directional (infinite) lights are currently supported. + * + * Note: the weird order is for the DMEM alignment benefit of + * the microcode. + * + */ + +typedef struct { + unsigned char col[3]; /* diffuse light value (rgba) */ + char pad1; + unsigned char colc[3]; /* copy of diffuse light value (rgba) */ + char pad2; + signed char dir[3]; /* direction of light (normalized) */ + char pad3; +} Light_t; + +typedef struct { + unsigned char col[3]; /* ambient light value (rgba) */ + char pad1; + unsigned char colc[3]; /* copy of ambient light value (rgba) */ + char pad2; +} Ambient_t; + +typedef struct { + int x1,y1,x2,y2; /* texture offsets for highlight 1/2 */ +} Hilite_t; + +typedef union { + Light_t l; + long long int force_structure_alignment[2]; +} Light; + +typedef union { + Ambient_t l; + long long int force_structure_alignment[1]; +} Ambient; + +typedef struct { + Ambient a; + Light l[7]; +} Lightsn; + +typedef struct { + Ambient a; + Light l[1]; +} Lights0; + +typedef struct { + Ambient a; + Light l[1]; +} Lights1; + +typedef struct { + Ambient a; + Light l[2]; +} Lights2; + +typedef struct { + Ambient a; + Light l[3]; +} Lights3; + +typedef struct { + Ambient a; + Light l[4]; +} Lights4; + +typedef struct { + Ambient a; + Light l[5]; +} Lights5; + +typedef struct { + Ambient a; + Light l[6]; +} Lights6; + +typedef struct { + Ambient a; + Light l[7]; +} Lights7; + +typedef struct { + Light l[2]; +} LookAt; + +typedef union { + Hilite_t h; + long int force_structure_alignment[4]; +} Hilite; + +#define gdSPDefLights0(ar,ag,ab) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ { 0, 0, 0},0,{ 0, 0, 0},0,{ 0, 0, 0},0}}} } +#define gdSPDefLights1(ar,ag,ab,r1,g1,b1,x1,y1,z1) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}} } +#define gdSPDefLights2(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}} } +#define gdSPDefLights3(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}} } +#define gdSPDefLights4(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3,r4,g4,b4,x4,y4,z4) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}, \ + {{ {r4,g4,b4},0,{r4,g4,b4},0,{x4,y4,z4},0}}} } +#define gdSPDefLights5(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3,r4,g4,b4,x4,y4,z4,r5,g5,b5,x5,y5,z5) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}, \ + {{ {r4,g4,b4},0,{r4,g4,b4},0,{x4,y4,z4},0}}, \ + {{ {r5,g5,b5},0,{r5,g5,b5},0,{x5,y5,z5},0}}} } + + +#define gdSPDefLights6(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3,r4,g4,b4,x4,y4,z4,r5,g5,b5,x5,y5,z5,r6,g6,b6,x6,y6,z6) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}, \ + {{ {r4,g4,b4},0,{r4,g4,b4},0,{x4,y4,z4},0}}, \ + {{ {r5,g5,b5},0,{r5,g5,b5},0,{x5,y5,z5},0}}, \ + {{ {r6,g6,b6},0,{r6,g6,b6},0,{x6,y6,z6},0}}} } + + +#define gdSPDefLights7(ar,ag,ab,r1,g1,b1,x1,y1,z1,r2,g2,b2,x2,y2,z2,r3,g3,b3,x3,y3,z3,r4,g4,b4,x4,y4,z4,r5,g5,b5,x5,y5,z5,r6,g6,b6,x6,y6,z6,r7,g7,b7,x7,y7,z7) \ + { {{ {ar,ag,ab},0,{ar,ag,ab},0}}, \ + {{{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}}, \ + {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}}, \ + {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}}, \ + {{ {r4,g4,b4},0,{r4,g4,b4},0,{x4,y4,z4},0}}, \ + {{ {r5,g5,b5},0,{r5,g5,b5},0,{x5,y5,z5},0}}, \ + {{ {r6,g6,b6},0,{r6,g6,b6},0,{x6,y6,z6},0}}, \ + {{ {r7,g7,b7},0,{r7,g7,b7},0,{x7,y7,z7},0}}} } + + +#define gdSPDefLookAt(rightx,righty,rightz,upx,upy,upz) \ + { {{ {{0,0,0},0,{0,0,0},0,{rightx,righty,rightz},0}}, \ + { {{0,0x80,0},0,{0,0x80,0},0,{upx,upy,upz},0}}} } + +/* Don't declare these for F3D_OLD to avoid bss reordering */ +#ifndef F3D_OLD +/* + * Graphics DMA Packet + */ +typedef struct { + int cmd:8; + unsigned int par:8; + unsigned int len:16; + uintptr_t addr; +} Gdma; + +/* + * Graphics Immediate Mode Packet types + */ +typedef struct { + int cmd:8; + int pad:24; + Tri tri; +} Gtri; + +typedef struct { + int cmd:8; + int pad1:24; + int pad2:24; + unsigned char param:8; +} Gpopmtx; + +/* + * typedef struct { + * int cmd:8; + * int pad0:24; + * int pad1:4; + * int number:4; + * int base:24; + * } Gsegment; + */ +typedef struct { + int cmd:8; + int pad0:8; + int mw_index:8; + int number:8; + int pad1:8; + int base:24; +} Gsegment; + +typedef struct { + int cmd:8; + int pad0:8; + int sft:8; + int len:8; + unsigned int data:32; +} GsetothermodeL; + +typedef struct { + int cmd:8; + int pad0:8; + int sft:8; + int len:8; + unsigned int data:32; +} GsetothermodeH; + +typedef struct { + unsigned char cmd; + unsigned char lodscale; + unsigned char tile; + unsigned char on; + unsigned short s; + unsigned short t; +} Gtexture; + +typedef struct { + int cmd:8; + int pad:24; + Tri line; +} Gline3D; + +typedef struct { + int cmd:8; + int pad1:24; + short int pad2; + short int scale; +} Gperspnorm; + + +/* + * RDP Packet types + */ +typedef struct { + int cmd:8; + unsigned int fmt:3; + unsigned int siz:2; + unsigned int pad:7; + unsigned int wd:12; /* really only 10 bits, extra */ + uintptr_t dram; /* to account for 1024 */ +} Gsetimg; + +typedef struct { + int cmd:8; + unsigned int muxs0:24; + unsigned int muxs1:32; +} Gsetcombine; + +typedef struct { + int cmd:8; + unsigned char pad; + unsigned char prim_min_level; + unsigned char prim_level; + unsigned long color; +} Gsetcolor; + +typedef struct { + int cmd:8; + int x0:10; + int x0frac:2; + int y0:10; + int y0frac:2; + unsigned int pad:8; + int x1:10; + int x1frac:2; + int y1:10; + int y1frac:2; +} Gfillrect; + +typedef struct { + int cmd:8; + unsigned int fmt:3; + unsigned int siz:2; + unsigned int pad0:1; + unsigned int line:9; + unsigned int tmem:9; + unsigned int pad1:5; + unsigned int tile:3; + unsigned int palette:4; + unsigned int ct:1; + unsigned int mt:1; + unsigned int maskt:4; + unsigned int shiftt:4; + unsigned int cs:1; + unsigned int ms:1; + unsigned int masks:4; + unsigned int shifts:4; +} Gsettile; + +typedef struct { + int cmd:8; + unsigned int sl:12; + unsigned int tl:12; + int pad:5; + unsigned int tile:3; + unsigned int sh:12; + unsigned int th:12; +} Gloadtile; + +typedef Gloadtile Gloadblock; + +typedef Gloadtile Gsettilesize; + +typedef Gloadtile Gloadtlut; + +typedef struct { + unsigned int cmd:8; /* command */ + unsigned int xl:12; /* X coordinate of upper left */ + unsigned int yl:12; /* Y coordinate of upper left */ + unsigned int pad1:5; /* Padding */ + unsigned int tile:3; /* Tile descriptor index */ + unsigned int xh:12; /* X coordinate of lower right */ + unsigned int yh:12; /* Y coordinate of lower right */ + unsigned int s:16; /* S texture coord at top left */ + unsigned int t:16; /* T texture coord at top left */ + unsigned int dsdx:16;/* Change in S per change in X */ + unsigned int dtdy:16;/* Change in T per change in Y */ +} Gtexrect; + +/* + * Textured rectangles are 128 bits not 64 bits + */ +typedef struct { + unsigned long w0; + unsigned long w1; + unsigned long w2; + unsigned long w3; +} TexRect; +#endif + +#define MakeTexRect(xh,yh,flip,tile,xl,yl,s,t,dsdx,dtdy) \ + G_TEXRECT, xh, yh, 0, flip, 0, tile, xl, yl, s, t, dsdx, dtdy + +/* + * Generic Gfx Packet + */ +typedef struct { + uintptr_t w0; + uintptr_t w1; +} Gwords; + +/* + * This union is the fundamental type of the display list. + * It is, by law, exactly 64 bits in size. + * + * (Edit: except on 64-bit, where it is exactly 128 bit. On little-endian or + * 64-bit systems, only the 'words' member may be accessed; the rest of the + * structs don't have matching layouts for now.) + */ +typedef union { + Gwords words; +#if !defined(F3D_OLD) && IS_BIG_ENDIAN && !IS_64_BIT + Gdma dma; + Gtri tri; + Gline3D line; + Gpopmtx popmtx; + Gsegment segment; + GsetothermodeH setothermodeH; + GsetothermodeL setothermodeL; + Gtexture texture; + Gperspnorm perspnorm; + Gsetimg setimg; + Gsetcombine setcombine; + Gsetcolor setcolor; + Gfillrect fillrect; /* use for setscissor also */ + Gsettile settile; + Gloadtile loadtile; /* use for loadblock also, th is dxt */ + Gsettilesize settilesize; + Gloadtlut loadtlut; +#endif + long long int force_structure_alignment; +} Gfx; + +/* + * Macros to assemble the graphics display list + */ + +/* + * DMA macros + */ +#define gDma0p(pkt, c, s, l) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8) | _SHIFTL((l), 0, 24); \ + _g->words.w1 = (uintptr_t)(s); \ +} + +#define gsDma0p(c, s, l) \ +{{ \ + _SHIFTL((c), 24, 8) | _SHIFTL((l), 0, 24), (uintptr_t)(s) \ +}} + +#define gDma1p(pkt, c, s, l, p) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL((c), 24, 8) | _SHIFTL((p), 16, 8) | \ + _SHIFTL((l), 0, 16)); \ + _g->words.w1 = (uintptr_t)(s); \ +} + +#define gsDma1p(c, s, l, p) \ +{{ \ + (_SHIFTL((c), 24, 8) | _SHIFTL((p), 16, 8) | \ + _SHIFTL((l), 0, 16)), \ + (uintptr_t)(s) \ +}} + +#define gDma2p(pkt, c, adrs, len, idx, ofs) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL((c),24,8)|_SHIFTL(((len)-1)/8,19,5)| \ + _SHIFTL((ofs)/8,8,8)|_SHIFTL((idx),0,8)); \ + _g->words.w1 = (uintptr_t)(adrs); \ +} +#define gsDma2p(c, adrs, len, idx, ofs) \ +{{ \ + (_SHIFTL((c),24,8)|_SHIFTL(((len)-1)/8,19,5)| \ + _SHIFTL((ofs)/8,8,8)|_SHIFTL((idx),0,8)), \ + (uintptr_t)(adrs) \ +}} + +#define gSPNoOp(pkt) gDma0p(pkt, G_SPNOOP, 0, 0) +#define gsSPNoOp() gsDma0p(G_SPNOOP, 0, 0) + +#ifdef F3DEX_GBI_2 +# define gSPMatrix(pkt, m, p) \ + gDma2p((pkt),G_MTX,(m),sizeof(Mtx),(p)^G_MTX_PUSH,0) +# define gsSPMatrix(m, p) \ + gsDma2p( G_MTX,(m),sizeof(Mtx),(p)^G_MTX_PUSH,0) +#else /* F3DEX_GBI_2 */ +# define gSPMatrix(pkt, m, p) gDma1p(pkt, G_MTX, m, sizeof(Mtx), p) +# define gsSPMatrix(m, p) gsDma1p(G_MTX, m, sizeof(Mtx), p) +#endif /* F3DEX_GBI_2 */ + +#if defined(F3DEX_GBI_2) +/* + * F3DEX_GBI_2: G_VTX GBI format was changed. + * + * +--------+----+---+---+----+------+-+ + * G_VTX | cmd:8 |0000| n:8 |0000|v0+n:7|0| + * +-+---+--+----+---+---+----+------+-+ + * | |seg| address | + * +-+---+-----------------------------+ + */ +# define gSPVertex(pkt, v, n, v0) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = \ + _SHIFTL(G_VTX,24,8)|_SHIFTL((n),12,8)|_SHIFTL((v0)+(n),1,7); \ + _g->words.w1 = (uintptr_t)(v); \ +} +# define gsSPVertex(v, n, v0) \ +{{ \ + (_SHIFTL(G_VTX,24,8)|_SHIFTL((n),12,8)|_SHIFTL((v0)+(n),1,7)), \ + (uintptr_t)(v) \ +}} +#elif (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +/* + * F3DEX_GBI: G_VTX GBI format was changed to support 64 vertice. + * + * +--------+--------+------+----------+ + * G_VTX | cmd:8 | v0:8 | n:6 |length:10 | + * +-+---+--+--------+------+----------+ + * | |seg| address | + * +-+---+-----------------------------+ + */ +# define gSPVertex(pkt, v, n, v0) \ + gDma1p((pkt),G_VTX,(v),((n)<<10)|(sizeof(Vtx)*(n)-1),(v0)*2) +# define gsSPVertex(v, n, v0) \ + gsDma1p(G_VTX,(v),((n)<<10)|(sizeof(Vtx)*(n)-1),(v0)*2) +#else +# define gSPVertex(pkt, v, n, v0) \ + gDma1p(pkt, G_VTX, v, sizeof(Vtx)*(n),((n)-1)<<4|(v0)) +# define gsSPVertex(v, n, v0) \ + gsDma1p(G_VTX, v, sizeof(Vtx)*(n), ((n)-1)<<4|(v0)) +#endif + + +#ifdef F3DEX_GBI_2 +# define gSPViewport(pkt, v) \ + gDma2p((pkt), G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT, 0) +# define gsSPViewport(v) \ + gsDma2p( G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT, 0) +#else /* F3DEX_GBI_2 */ +# define gSPViewport(pkt,v) \ + gDma1p((pkt), G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT) +# define gsSPViewport(v) \ + gsDma1p( G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT) +#endif /* F3DEX_GBI_2 */ + +#define gSPDisplayList(pkt,dl) gDma1p(pkt,G_DL,dl,0,G_DL_PUSH) +#define gsSPDisplayList( dl) gsDma1p( G_DL,dl,0,G_DL_PUSH) + +#define gSPBranchList(pkt,dl) gDma1p(pkt,G_DL,dl,0,G_DL_NOPUSH) +#define gsSPBranchList( dl) gsDma1p( G_DL,dl,0,G_DL_NOPUSH) + +#define gSPSprite2DBase(pkt, s) gDma1p(pkt, G_SPRITE2D_BASE, s, sizeof(uSprite), 0) +#define gsSPSprite2DBase(s) gsDma1p(G_SPRITE2D_BASE, s, sizeof(uSprite), 0) + +/* + * RSP short command (no DMA required) macros + */ +#define gImmp0(pkt, c) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ +} + +#define gsImmp0(c) \ +{{ \ + _SHIFTL((c), 24, 8) \ +}} + +#define gImmp1(pkt, c, p0) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + _g->words.w1 = (uintptr_t)(p0); \ +} + +#define gsImmp1(c, p0) \ +{{ \ + _SHIFTL((c), 24, 8), (uintptr_t)(p0) \ +}} + +#define gImmp2(pkt, c, p0, p1) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + _g->words.w1 = _SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8); \ +} + +#define gsImmp2(c, p0, p1) \ +{{ \ + _SHIFTL((c), 24, 8), _SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8)\ +}} + +#define gImmp3(pkt, c, p0, p1, p2) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + _g->words.w1 = (_SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8) | \ + _SHIFTL((p2), 0, 8)); \ +} + +#define gsImmp3(c, p0, p1, p2) \ +{{ \ + _SHIFTL((c), 24, 8), (_SHIFTL((p0), 16, 16) | \ + _SHIFTL((p1), 8, 8) | _SHIFTL((p2), 0, 8))\ +}} + +#define gImmp21(pkt, c, p0, p1, dat) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL((c), 24, 8) | _SHIFTL((p0), 8, 16) | \ + _SHIFTL((p1), 0, 8)); \ + _g->words.w1 = (uintptr_t) (dat); \ +} + +#define gsImmp21(c, p0, p1, dat) \ +{{ \ + _SHIFTL((c), 24, 8) | _SHIFTL((p0), 8, 16) | _SHIFTL((p1), 0, 8),\ + (uintptr_t) (dat) \ +}} + +#ifdef F3DEX_GBI_2 +#define gMoveWd(pkt, index, offset, data) \ + gDma1p((pkt), G_MOVEWORD, data, offset, index) +#define gsMoveWd( index, offset, data) \ + gsDma1p( G_MOVEWORD, data, offset, index) +#else /* F3DEX_GBI_2 */ +#define gMoveWd(pkt, index, offset, data) \ + gImmp21((pkt), G_MOVEWORD, offset, index, data) +#define gsMoveWd( index, offset, data) \ + gsImmp21( G_MOVEWORD, offset, index, data) +#endif /* F3DEX_GBI_2 */ + +/* Sprite immediate macros, there is also a sprite dma macro above */ + +#define gSPSprite2DScaleFlip(pkt, sx, sy, fx, fy) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SPRITE2D_SCALEFLIP, 24, 8) | \ + _SHIFTL((fx), 8, 8) | \ + _SHIFTL((fy), 0, 8)); \ + _g->words.w1 = (_SHIFTL((sx), 16, 16) | \ + _SHIFTL((sy), 0, 16)); \ +} + +#define gsSPSprite2DScaleFlip(sx, sy, fx, fy) \ +{{ \ + (_SHIFTL(G_SPRITE2D_SCALEFLIP, 24, 8) | \ + _SHIFTL((fx), 8, 8) | \ + _SHIFTL((fy), 0, 8)), \ + (_SHIFTL((sx), 16, 16) | \ + _SHIFTL((sy), 0, 16)) \ +}} + +#define gSPSprite2DDraw(pkt, px, py) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SPRITE2D_DRAW, 24, 8)); \ + _g->words.w1 = (_SHIFTL((px), 16, 16) | \ + _SHIFTL((py), 0, 16)); \ +} + +#define gsSPSprite2DDraw(px, py) \ +{{ \ + (_SHIFTL(G_SPRITE2D_DRAW, 24, 8)), \ + (_SHIFTL((px), 16, 16) | \ + _SHIFTL((py), 0, 16)) \ +}} + + +/* + * Note: the SP1Triangle() and line macros multiply the vertex indices + * by 10, this is an optimization for the microcode. + */ +#if (defined(F3DLP_GBI)||defined(F3DEX_GBI)) +# define __gsSP1Triangle_w1(v0, v1, v2) \ + (_SHIFTL((v0)*2,16,8)|_SHIFTL((v1)*2,8,8)|_SHIFTL((v2)*2,0,8)) +# define __gsSP1Triangle_w1f(v0, v1, v2, flag) \ + (((flag) == 0) ? __gsSP1Triangle_w1(v0, v1, v2): \ + ((flag) == 1) ? __gsSP1Triangle_w1(v1, v2, v0): \ + __gsSP1Triangle_w1(v2, v0, v1)) +# define __gsSPLine3D_w1(v0, v1, wd) \ + (_SHIFTL((v0)*2,16,8)|_SHIFT((v1)*2,8,8)|_SHIFT((wd),0,8)) +# define __gsSPLine3D_w1f(v0, v1, wd, flag) \ + (((flag) == 0) ? __gsSPLine3D_w1(v0, v1, wd): \ + __gsSPLine3D_w1(v1, v0, wd)) +# define __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag) \ + (((flag) == 0) ? __gsSP1Triangle_w1(v0, v1, v2): \ + ((flag) == 1) ? __gsSP1Triangle_w1(v1, v2, v3): \ + ((flag) == 2) ? __gsSP1Triangle_w1(v2, v3, v0): \ + __gsSP1Triangle_w1(v3, v0, v1)) +# define __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \ + (((flag) == 0) ? __gsSP1Triangle_w1(v0, v2, v3): \ + ((flag) == 1) ? __gsSP1Triangle_w1(v1, v3, v0): \ + ((flag) == 2) ? __gsSP1Triangle_w1(v2, v0, v1): \ + __gsSP1Triangle_w1(v3, v1, v2)) +#else +# define __gsSP1Triangle_w1f(v0, v1, v2, flag) \ + (_SHIFTL((flag), 24,8)|_SHIFTL((v0)*10,16,8)| \ + _SHIFTL((v1)*10, 8,8)|_SHIFTL((v2)*10, 0,8)) +# define __gsSPLine3D_w1f(v0, v1, wd, flag) \ + (_SHIFTL((flag), 24,8)|_SHIFTL((v0)*10,16,8)| \ + _SHIFTL((v1)*10, 8,8)|_SHIFTL((wd), 0,8)) +#endif + +#ifdef F3DEX_GBI_2 +/*** + *** 1 Triangle + ***/ +#define gSP1Triangle(pkt, v0, v1, v2, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_TRI1, 24, 8)| \ + __gsSP1Triangle_w1f(v0, v1, v2, flag); \ + _g->words.w1 = 0; \ +} +#define gsSP1Triangle(v0, v1, v2, flag) \ +{{ \ + _SHIFTL(G_TRI1, 24, 8)|__gsSP1Triangle_w1f(v0, v1, v2, flag), \ + 0 \ +}} + +/*** + *** Line + ***/ +#define gSPLine3D(pkt, v0, v1, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8)| \ + __gsSPLine3D_w1f(v0, v1, 0, flag); \ + _g->words.w1 = 0; \ +} +#define gsSPLine3D(v0, v1, flag) \ +{{ \ + _SHIFTL(G_LINE3D, 24, 8)|__gsSPLine3D_w1f(v0, v1, 0, flag), \ + 0 \ +}} + +/*** + *** LineW + ***/ +/* these macros are the same as SPLine3D, except they have an + * additional parameter for width. The width is added to the "minimum" + * thickness, which is 1.5 pixels. The units for width are in + * half-pixel units, so a width of 1 translates to (.5 + 1.5) or + * a 2.0 pixels wide line. + */ +#define gSPLineW3D(pkt, v0, v1, wd, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8)| \ + __gsSPLine3D_w1f(v0, v1, wd, flag); \ + _g->words.w1 = 0; \ +} +#define gsSPLineW3D(v0, v1, wd, flag) \ +{{ \ + _SHIFTL(G_LINE3D, 24, 8)|__gsSPLine3D_w1f(v0, v1, wd, flag), \ + 0 \ +}} + +/*** + *** 1 Quadrangle + ***/ +#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_QUAD, 24, 8)| \ + __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \ + _g->words.w1 = __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag); \ +} + +#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \ +{{ \ + (_SHIFTL(G_QUAD, 24, 8)| \ + __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \ + __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \ +}} +#else /* F3DEX_GBI_2 */ + +/*** + *** 1 Triangle + ***/ +#define gSP1Triangle(pkt, v0, v1, v2, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_TRI1, 24, 8); \ + _g->words.w1 = __gsSP1Triangle_w1f(v0, v1, v2, flag); \ +} +#define gsSP1Triangle(v0, v1, v2, flag) \ +{{ \ + _SHIFTL(G_TRI1, 24, 8), \ + __gsSP1Triangle_w1f(v0, v1, v2, flag) \ +}} + +/*** + *** Line + ***/ +#define gSPLine3D(pkt, v0, v1, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8); \ + _g->words.w1 = __gsSPLine3D_w1f(v0, v1, 0, flag); \ +} +#define gsSPLine3D(v0, v1, flag) \ +{{ \ + _SHIFTL(G_LINE3D, 24, 8), \ + __gsSPLine3D_w1f(v0, v1, 0, flag) \ +}} + +/*** + *** LineW + ***/ +/* these macros are the same as SPLine3D, except they have an + * additional parameter for width. The width is added to the "minimum" + * thickness, which is 1.5 pixels. The units for width are in + * half-pixel units, so a width of 1 translates to (.5 + 1.5) or + * a 2.0 pixels wide line. + */ +#define gSPLineW3D(pkt, v0, v1, wd, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8); \ + _g->words.w1 = __gsSPLine3D_w1f(v0, v1, wd, flag); \ +} +#define gsSPLineW3D(v0, v1, wd, flag) \ +{{ \ + _SHIFTL(G_LINE3D, 24, 8), \ + __gsSPLine3D_w1f(v0, v1, wd, flag) \ +}} + +/*** + *** 1 Quadrangle + ***/ +#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8)| \ + __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \ + _g->words.w1 = __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag); \ +} + +#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \ +{{ \ + (_SHIFTL(G_TRI2, 24, 8)| \ + __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \ + __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \ +}} +#endif /* F3DEX_GBI_2 */ + +#if (defined(F3DLP_GBI)||defined(F3DEX_GBI)) +/*** + *** 2 Triangles + ***/ +#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8)| \ + __gsSP1Triangle_w1f(v00, v01, v02, flag0)); \ + _g->words.w1 = __gsSP1Triangle_w1f(v10, v11, v12, flag1); \ +} + +#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \ +{{ \ + (_SHIFTL(G_TRI2, 24, 8)| \ + __gsSP1Triangle_w1f(v00, v01, v02, flag0)), \ + __gsSP1Triangle_w1f(v10, v11, v12, flag1) \ +}} +#else +#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \ +{ \ + gSP1Triangle(pkt, v00, v01, v02, flag0); \ + gSP1Triangle(pkt, v10, v11, v12, flag1); \ +} +#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \ + gsSP1Triangle(v00, v01, v02, flag0), \ + gsSP1Triangle(v10, v11, v12, flag1) +#endif /* F3DEX_GBI/F3DLP_GBI */ + +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +#define gSPCullDisplayList(pkt,vstart,vend) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | \ + _SHIFTL((vstart)*2, 0, 16); \ + _g->words.w1 = _SHIFTL((vend)*2, 0, 16); \ +} + +#define gsSPCullDisplayList(vstart,vend) \ +{{ \ + _SHIFTL(G_CULLDL, 24, 8) | _SHIFTL((vstart)*2, 0, 16), \ + _SHIFTL((vend)*2, 0, 16) \ +}} + +#else +#define gSPCullDisplayList(pkt,vstart,vend) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | \ + ((0x0f & (vstart))*40); \ + _g->words.w1 = (unsigned int)((0x0f & ((vend)+1))*40); \ +} + +#define gsSPCullDisplayList(vstart,vend) \ +{{ \ + _SHIFTL(G_CULLDL, 24, 8) | ((0x0f & (vstart))*40), \ + ((0x0f & ((vend)+1))*40) \ +}} +#endif + +#define gSPSegment(pkt, segment, base) \ + gMoveWd(pkt, G_MW_SEGMENT, (segment)*4, base) +#define gsSPSegment(segment, base) \ + gsMoveWd( G_MW_SEGMENT, (segment)*4, base) + +/* + * Clipping Macros + */ +#define FR_NEG_FRUSTRATIO_1 0x00000001 +#define FR_POS_FRUSTRATIO_1 0x0000ffff +#define FR_NEG_FRUSTRATIO_2 0x00000002 +#define FR_POS_FRUSTRATIO_2 0x0000fffe +#define FR_NEG_FRUSTRATIO_3 0x00000003 +#define FR_POS_FRUSTRATIO_3 0x0000fffd +#define FR_NEG_FRUSTRATIO_4 0x00000004 +#define FR_POS_FRUSTRATIO_4 0x0000fffc +#define FR_NEG_FRUSTRATIO_5 0x00000005 +#define FR_POS_FRUSTRATIO_5 0x0000fffb +#define FR_NEG_FRUSTRATIO_6 0x00000006 +#define FR_POS_FRUSTRATIO_6 0x0000fffa +/* + * r should be one of: FRUSTRATIO_1, FRUSTRATIO_2, FRUSTRATIO_3, ... FRUSTRATIO_6 + */ +#define gSPClipRatio(pkt, r) \ +{ \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r); \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r); \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r); \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r); \ +} + +#define gsSPClipRatio(r) \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r) + +/* + * Insert values into Matrix + * + * where = element of matrix (byte offset) + * num = new element (32 bit value replacing 2 int or 2 frac matrix + * componants + */ +#ifdef F3DEX_GBI_2 +#define gSPInsertMatrix(pkt, where, num) \ + ERROR!! gSPInsertMatrix is no longer supported. +#define gsSPInsertMatrix(where, num) \ + ERROR!! gsSPInsertMatrix is no longer supported. +#else +#define gSPInsertMatrix(pkt, where, num) \ + gMoveWd(pkt, G_MW_MATRIX, where, num) +#define gsSPInsertMatrix(where, num) \ + gsMoveWd(G_MW_MATRIX, where, num) +#endif + +/* + * Load new matrix directly + * + * mptr = pointer to matrix + */ +#ifdef F3DEX_GBI_2 +#define gSPForceMatrix(pkt, mptr) \ +{ gDma2p((pkt),G_MOVEMEM,(mptr),sizeof(Mtx),G_MV_MATRIX,0); \ + gMoveWd((pkt), G_MW_FORCEMTX,0,0x00010000); \ +} +#define gsSPForceMatrix(mptr) \ + gsDma2p(G_MOVEMEM,(mptr),sizeof(Mtx),G_MV_MATRIX,0), \ + gsMoveWd(G_MW_FORCEMTX,0,0x00010000) + +#else /* F3DEX_GBI_2 */ +#define gSPForceMatrix(pkt, mptr) \ +{ \ + gDma1p(pkt, G_MOVEMEM, mptr, 16, G_MV_MATRIX_1); \ + gDma1p(pkt, G_MOVEMEM, (char *)(mptr)+16, 16, G_MV_MATRIX_2); \ + gDma1p(pkt, G_MOVEMEM, (char *)(mptr)+32, 16, G_MV_MATRIX_3); \ + gDma1p(pkt, G_MOVEMEM, (char *)(mptr)+48, 16, G_MV_MATRIX_4); \ +} +#define gsSPForceMatrix(mptr) \ + gsDma1p( G_MOVEMEM, mptr, 16, G_MV_MATRIX_1), \ + gsDma1p( G_MOVEMEM, (char *)(mptr)+16, 16, G_MV_MATRIX_2), \ + gsDma1p( G_MOVEMEM, (char *)(mptr)+32, 16, G_MV_MATRIX_3), \ + gsDma1p( G_MOVEMEM, (char *)(mptr)+48, 16, G_MV_MATRIX_4) +#endif /* F3DEX_GBI_2 */ + +/* + * Insert values into Points + * + * point = point number 0-15 + * where = which element of point to modify (byte offset into point) + * num = new value (32 bit) + */ +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +# define gSPModifyVertex(pkt, vtx, where, val) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(G_MODIFYVTX,24,8)| \ + _SHIFTL((where),16,8)|_SHIFTL((vtx)*2,0,16)); \ + _g->words.w1 = (unsigned int)(val); \ +} +# define gsSPModifyVertex(vtx, where, val) \ +{{ \ + _SHIFTL(G_MODIFYVTX,24,8)| \ + _SHIFTL((where),16,8)|_SHIFTL((vtx)*2,0,16), \ + (unsigned int)(val) \ +}} +#else +# define gSPModifyVertex(pkt, vtx, where, val) \ + gMoveWd(pkt, G_MW_POINTS, (vtx)*40+(where), val) +# define gsSPModifyVertex(vtx, where, val) \ + gsMoveWd(G_MW_POINTS, (vtx)*40+(where), val) +#endif + +#if (defined(F3DEX_GBI)||defined(F3DLP_GBI)) +/* + * gSPBranchLessZ Branch DL if (vtx.z) less than or equal (zval). + * + * dl = DL branch to + * vtx = Vertex + * zval = Screen depth + * near = Near plane + * far = Far plane + * flag = G_BZ_PERSP or G_BZ_ORTHO + */ + +#define G_BZ_PERSP 0 +#define G_BZ_ORTHO 1 + +#define G_DEPTOZSrg(zval, near, far, flag, zmin, zmax) \ +(((unsigned int)FTOFIX32(((flag) == G_BZ_PERSP ? \ + (1.0f-(float)(near)/(float)(zval)) / \ + (1.0f-(float)(near)/(float)(far )) : \ + ((float)(zval) - (float)(near)) / \ + ((float)(far ) - (float)(near))))) * \ + (((int)((zmax) - (zmin)))&~1) + (int)FTOFIX32(zmin)) + +#define G_DEPTOZS(zval, near, far, flag) \ + G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ) + +#define gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, zmin, zmax) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1,24,8); \ + _g->words.w1 = (uintptr_t)(dl); \ + _g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(G_BRANCH_Z,24,8)| \ + _SHIFTL((vtx)*5,12,12)|_SHIFTL((vtx)*2,0,12)); \ + _g->words.w1 = G_DEPTOZSrg(zval, near, far, flag, zmin, zmax); \ +} + +#define gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, zmin, zmax) \ +{{ _SHIFTL(G_RDPHALF_1,24,8), \ + (uintptr_t)(dl), }}, \ +{{ _SHIFTL(G_BRANCH_Z,24,8)|_SHIFTL((vtx)*5,12,12)|_SHIFTL((vtx)*2,0,12),\ + G_DEPTOZSrg(zval, near, far, flag, zmin, zmax), }} + +#define gSPBranchLessZ(pkt, dl, vtx, zval, near, far, flag) \ + gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, 0, G_MAXZ) +#define gsSPBranchLessZ(dl, vtx, zval, near, far, flag) \ + gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, 0, G_MAXZ) + +/* + * gSPBranchLessZraw Branch DL if (vtx.z) less than or equal (raw zval). + * + * dl = DL branch to + * vtx = Vertex + * zval = Raw value of screen depth + */ +#define gSPBranchLessZraw(pkt, dl, vtx, zval) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1,24,8); \ + _g->words.w1 = (uintptr_t)(dl); \ + _g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(G_BRANCH_Z,24,8)| \ + _SHIFTL((vtx)*5,12,12)|_SHIFTL((vtx)*2,0,12)); \ + _g->words.w1 = (unsigned int)(zval); \ +} + +#define gsSPBranchLessZraw(dl, vtx, zval) \ +{{ _SHIFTL(G_RDPHALF_1,24,8), \ + (uintptr_t)(dl), }}, \ +{{ _SHIFTL(G_BRANCH_Z,24,8)|_SHIFTL((vtx)*5,12,12)|_SHIFTL((vtx)*2,0,12),\ + (unsigned int)(zval), }} + +/* + * gSPLoadUcode RSP loads specified ucode. + * + * uc_start = ucode text section start + * uc_dstart = ucode data section start + */ +#define gSPLoadUcodeEx(pkt, uc_start, uc_dstart, uc_dsize) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1,24,8); \ + _g->words.w1 = (uintptr_t)(uc_dstart); \ + _g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(G_LOAD_UCODE,24,8)| \ + _SHIFTL((int)(uc_dsize)-1,0,16)); \ + _g->words.w1 = (uintptr_t)(uc_start); \ +} + +#define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \ +{{ _SHIFTL(G_RDPHALF_1,24,8), \ + (uintptr_t)(uc_dstart), }}, \ +{{ _SHIFTL(G_LOAD_UCODE,24,8)| \ + _SHIFTL((int)(uc_dsize)-1,0,16), \ + (uintptr_t)(uc_start), }} + +#define gSPLoadUcode(pkt, uc_start, uc_dstart) \ + gSPLoadUcodeEx((pkt), (uc_start), (uc_dstart), SP_UCODE_DATA_SIZE) +#define gsSPLoadUcode(uc_start, uc_dstart) \ + gsSPLoadUcodeEx((uc_start), (uc_dstart), SP_UCODE_DATA_SIZE) + +#define gSPLoadUcodeL(pkt, ucode) \ + gSPLoadUcode((pkt), OS_K0_TO_PHYSICAL(&ucode##TextStart), \ + OS_K0_TO_PHYSICAL(&ucode##DataStart)) +#define gsSPLoadUcodeL(ucode) \ + gsSPLoadUcode(OS_K0_TO_PHYSICAL(&ucode##TextStart), \ + OS_K0_TO_PHYSICAL(&ucode##DataStart)) +#endif + +#ifdef F3DEX_GBI_2 +/* + * gSPDma_io DMA to/from DMEM/IMEM for DEBUG. + */ +#define gSPDma_io(pkt, flag, dmem, dram, size) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_DMA_IO,24,8)|_SHIFTL((flag),23,1)| \ + _SHIFTL((dmem)/8,13,10)|_SHIFTL((size)-1,0,12); \ + _g->words.w1 = (uintptr_t)(dram); \ +} + +#define gsSPDma_io(flag, dmem, dram, size) \ +{{ \ + _SHIFTL(G_DMA_IO,24,8)|_SHIFTL((flag),23,1)| \ + _SHIFTL((dmem)/8,13,10)|_SHIFTL((size)-1,0,12), \ + (uintptr_t)(dram) \ +}} + +#define gSPDmaRead(pkt,dmem,dram,size) gSPDma_io((pkt),0,(dmem),(dram),(size)) +#define gsSPDmaRead(dmem,dram,size) gsSPDma_io(0,(dmem),(dram),(size)) +#define gSPDmaWrite(pkt,dmem,dram,size) gSPDma_io((pkt),1,(dmem),(dram),(size)) +#define gsSPDmaWrite(dmem,dram,size) gsSPDma_io(1,(dmem),(dram),(size)) +#endif + +/* + * Lighting Macros + */ +#ifdef F3DEX_GBI_2 +# define NUML(n) ((n)*24) +#else +# define NUML(n) (((n)+1)*32 + 0x80000000) +#endif +#define NUMLIGHTS_0 1 +#define NUMLIGHTS_1 1 +#define NUMLIGHTS_2 2 +#define NUMLIGHTS_3 3 +#define NUMLIGHTS_4 4 +#define NUMLIGHTS_5 5 +#define NUMLIGHTS_6 6 +#define NUMLIGHTS_7 7 +/* + * n should be one of: NUMLIGHTS_0, NUMLIGHTS_1, ..., NUMLIGHTS_7 + * NOTE: in addition to the number of directional lights specified, + * there is always 1 ambient light + */ +#define gSPNumLights(pkt, n) \ + gMoveWd(pkt, G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n)) +#define gsSPNumLights(n) \ + gsMoveWd( G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n)) + +#define LIGHT_1 1 +#define LIGHT_2 2 +#define LIGHT_3 3 +#define LIGHT_4 4 +#define LIGHT_5 5 +#define LIGHT_6 6 +#define LIGHT_7 7 +#define LIGHT_8 8 +/* + * l should point to a Light struct + * n should be one of: LIGHT_1, LIGHT_2, ..., LIGHT_8 + * NOTE: the highest numbered light is always the ambient light (eg if there are + * 3 directional lights defined: gsSPNumLights(NUMLIGHTS_3), then lights + * LIGHT_1 through LIGHT_3 will be the directional lights and light + * LIGHT_4 will be the ambient light. + */ +#ifdef F3DEX_GBI_2 +# define gSPLight(pkt, l, n) \ + gDma2p((pkt),G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,(n)*24+24) +# define gsSPLight(l, n) \ + gsDma2p( G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,(n)*24+24) +#else /* F3DEX_GBI_2 */ +# define gSPLight(pkt, l, n) \ + gDma1p(pkt, G_MOVEMEM, l, sizeof(Light),((n)-1)*2+G_MV_L0) +# define gsSPLight(l, n) \ + gsDma1p( G_MOVEMEM, l, sizeof(Light),((n)-1)*2+G_MV_L0) +#endif /* F3DEX_GBI_2 */ + +/* + * gSPLightColor changes color of light without recalculating light direction + * col is a 32 bit word with r,g,b,a (alpha is ignored) + * n should be one of LIGHT_1, LIGHT_2, ..., LIGHT_8 + */ +#define gSPLightColor(pkt, n, col) \ +{ \ + gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_a##n, col); \ + gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_b##n, col); \ +} +#define gsSPLightColor(n, col) \ + gsMoveWd(G_MW_LIGHTCOL, G_MWO_a##n, col), \ + gsMoveWd(G_MW_LIGHTCOL, G_MWO_b##n, col) + +/* These macros use a structure "name" which is init'd with the gdSPDefLights macros*/ + +#define gSPSetLights0(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_0); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.a,2); \ +} +#define gsSPSetLights0(name) \ + gsSPNumLights(NUMLIGHTS_0), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.a,2) + +#define gSPSetLights1(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_1); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.a,2); \ +} +#define gsSPSetLights1(name) \ + gsSPNumLights(NUMLIGHTS_1), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.a,2) + +#define gSPSetLights2(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_2); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.a,3); \ +} +#define gsSPSetLights2(name) \ + gsSPNumLights(NUMLIGHTS_2), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.a,3) + +#define gSPSetLights3(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_3); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.a,4); \ +} +#define gsSPSetLights3(name) \ + gsSPNumLights(NUMLIGHTS_3), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.a,4) + +#define gSPSetLights4(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_4); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.l[3],4); \ + gSPLight(pkt,&name.a,5); \ +} +#define gsSPSetLights4(name) \ + gsSPNumLights(NUMLIGHTS_4), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.l[3],4), \ + gsSPLight(&name.a,5) + +#define gSPSetLights5(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_5); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.l[3],4); \ + gSPLight(pkt,&name.l[4],5); \ + gSPLight(pkt,&name.a,6); \ +} + +#define gsSPSetLights5(name) \ + gsSPNumLights(NUMLIGHTS_5), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.l[3],4), \ + gsSPLight(&name.l[4],5), \ + gsSPLight(&name.a,6) + +#define gSPSetLights6(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_6); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.l[3],4); \ + gSPLight(pkt,&name.l[4],5); \ + gSPLight(pkt,&name.l[5],6); \ + gSPLight(pkt,&name.a,7); \ +} + +#define gsSPSetLights6(name) \ + gsSPNumLights(NUMLIGHTS_6), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.l[3],4), \ + gsSPLight(&name.l[4],5), \ + gsSPLight(&name.l[5],6), \ + gsSPLight(&name.a,7) + +#define gSPSetLights7(pkt,name) \ +{ \ + gSPNumLights(pkt,NUMLIGHTS_7); \ + gSPLight(pkt,&name.l[0],1); \ + gSPLight(pkt,&name.l[1],2); \ + gSPLight(pkt,&name.l[2],3); \ + gSPLight(pkt,&name.l[3],4); \ + gSPLight(pkt,&name.l[4],5); \ + gSPLight(pkt,&name.l[5],6); \ + gSPLight(pkt,&name.l[6],7); \ + gSPLight(pkt,&name.a,8); \ +} + +#define gsSPSetLights7(name) \ + gsSPNumLights(NUMLIGHTS_7), \ + gsSPLight(&name.l[0],1), \ + gsSPLight(&name.l[1],2), \ + gsSPLight(&name.l[2],3), \ + gsSPLight(&name.l[3],4), \ + gsSPLight(&name.l[4],5), \ + gsSPLight(&name.l[5],6), \ + gsSPLight(&name.l[6],7), \ + gsSPLight(&name.a,8) + +/* + * Reflection/Hiliting Macros + */ +#ifdef F3DEX_GBI_2 +# define gSPLookAtX(pkt, l) \ + gDma2p((pkt),G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,G_MVO_LOOKATX) +# define gsSPLookAtX(l) \ + gsDma2p( G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,G_MVO_LOOKATX) +# define gSPLookAtY(pkt, l) \ + gDma2p((pkt),G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,G_MVO_LOOKATY) +# define gsSPLookAtY(l) \ + gsDma2p( G_MOVEMEM,(l),sizeof(Light),G_MV_LIGHT,G_MVO_LOOKATY) +#else /* F3DEX_GBI_2 */ +# define gSPLookAtX(pkt, l) \ + gDma1p(pkt, G_MOVEMEM, l, sizeof(Light),G_MV_LOOKATX) +# define gsSPLookAtX(l) \ + gsDma1p( G_MOVEMEM, l, sizeof(Light),G_MV_LOOKATX) +# define gSPLookAtY(pkt, l) \ + gDma1p(pkt, G_MOVEMEM, l, sizeof(Light),G_MV_LOOKATY) +# define gsSPLookAtY(l) \ + gsDma1p( G_MOVEMEM, l, sizeof(Light),G_MV_LOOKATY) +#endif /* F3DEX_GBI_2 */ + +#define gSPLookAt(pkt, la) \ +{ \ + gSPLookAtX(pkt,la) \ + gSPLookAtY(pkt,(char *)(la)+16) \ +} +#define gsSPLookAt(la) \ + gsSPLookAtX(la), \ + gsSPLookAtY((char *)(la)+16) + +#define gDPSetHilite1Tile(pkt, tile, hilite, width, height) \ + gDPSetTileSize(pkt, tile, (hilite)->h.x1 & 0xfff, (hilite)->h.y1 & 0xfff, \ + ((((width)-1)*4)+(hilite)->h.x1) & 0xfff, ((((height)-1)*4)+(hilite)->h.y1) & 0xfff) + +#define gDPSetHilite2Tile(pkt, tile, hilite, width, height) \ + gDPSetTileSize(pkt, tile, (hilite)->h.x2 & 0xfff, (hilite)->h.y2 & 0xfff, \ + ((((width)-1)*4)+(hilite)->h.x2) & 0xfff, ((((height)-1)*4)+(hilite)->h.y2) & 0xfff) + + +/* + * FOG macros + * fm = z multiplier + * fo = z offset + * FOG FORMULA: alpha(fog) = (eyespace z) * fm + fo CLAMPED 0 to 255 + * note: (eyespace z) ranges -1 to 1 + * + * Alternate method of setting fog: + * min, max: range 0 to 1000: 0=nearplane, 1000=farplane + * min is where fog begins (usually less than max and often 0) + * max is where fog is thickest (usually 1000) + * + */ +#define gSPFogFactor(pkt, fm, fo) \ + gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL(fm,16,16) | _SHIFTL(fo,0,16))) + +#define gsSPFogFactor(fm, fo) \ + gsMoveWd(G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL(fm,16,16) | _SHIFTL(fo,0,16))) + +#define gSPFogPosition(pkt, min, max) \ + gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL((128000/((max)-(min))),16,16) | \ + _SHIFTL(((500-(min))*256/((max)-(min))),0,16))) + +#define gsSPFogPosition(min, max) \ + gsMoveWd(G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL((128000/((max)-(min))),16,16) | \ + _SHIFTL(((500-(min))*256/((max)-(min))),0,16))) + +#ifdef F3DEX_GBI_2 +/* + * Macros to turn texture on/off + */ +# define gSPTexture(pkt, s, t, level, tile, on) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE,24,8) | \ + _SHIFTL(BOWTIE_VAL,16,8) | \ + _SHIFTL((level),11,3) | _SHIFTL((tile),8,3) | \ + _SHIFTL((on),1,7)); \ + _g->words.w1 = (_SHIFTL((s),16,16) | _SHIFTL((t),0,16)); \ +} +# define gsSPTexture(s, t, level, tile, on) \ +{{ \ + (_SHIFTL(G_TEXTURE,24,8) | _SHIFTL(BOWTIE_VAL,16,8) | \ + _SHIFTL((level),11,3) | _SHIFTL((tile),8,3) | _SHIFTL((on),1,7)),\ + (_SHIFTL((s),16,16) | _SHIFTL((t),0,16)) \ +}} +/* + * Different version of SPTexture macro, has an additional parameter + * which is currently reserved in the microcode. + */ +# define gSPTextureL(pkt, s, t, level, xparam, tile, on) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE,24,8) | \ + _SHIFTL((xparam),16,8) | \ + _SHIFTL((level),11,3) | _SHIFTL((tile),8,3) | \ + _SHIFTL((on),1,7)); \ + _g->words.w1 = (_SHIFTL((s),16,16) | _SHIFTL((t),0,16)); \ +} +# define gsSPTextureL(s, t, level, xparam, tile, on) \ +{{ \ + (_SHIFTL(G_TEXTURE,24,8) | _SHIFTL((xparam),16,8) | \ + _SHIFTL((level),11,3) | _SHIFTL((tile),8,3) | _SHIFTL((on),1,7)),\ + (_SHIFTL((s),16,16) | _SHIFTL((t),0,16)) \ +}} +#else +/* + * Macros to turn texture on/off + */ +# define gSPTexture(pkt, s, t, level, tile, on) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE,24,8)|_SHIFTL(BOWTIE_VAL,16,8)|\ + _SHIFTL((level),11,3)|_SHIFTL((tile),8,3)| \ + _SHIFTL((on),0,8)); \ + _g->words.w1 = (_SHIFTL((s),16,16)|_SHIFTL((t),0,16)); \ +} +# define gsSPTexture(s, t, level, tile, on) \ +{{ \ + (_SHIFTL(G_TEXTURE,24,8)|_SHIFTL(BOWTIE_VAL,16,8)| \ + _SHIFTL((level),11,3)|_SHIFTL((tile),8,3)|_SHIFTL((on),0,8)), \ + (_SHIFTL((s),16,16)|_SHIFTL((t),0,16)) \ +}} +/* + * Different version of SPTexture macro, has an additional parameter + * which is currently reserved in the microcode. + */ +# define gSPTextureL(pkt, s, t, level, xparam, tile, on) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE,24,8)|_SHIFTL((xparam),16,8)| \ + _SHIFTL((level),11,3)|_SHIFTL((tile),8,3)| \ + _SHIFTL((on),0,8)); \ + _g->words.w1 = (_SHIFTL((s),16,16)|_SHIFTL((t),0,16)); \ +} +# define gsSPTextureL(s, t, level, xparam, tile, on) \ +{{ \ + (_SHIFTL(G_TEXTURE,24,8)|_SHIFTL((xparam),16,8)| \ + _SHIFTL((level),11,3)|_SHIFTL((tile),8,3)|_SHIFTL((on),0,8)), \ + (_SHIFTL((s),16,16)|_SHIFTL((t),0,16)) \ +}} +#endif + +#ifndef F3D_OLD +# define gSPPerspNormalize(pkt, s) gMoveWd(pkt, G_MW_PERSPNORM, 0, (s)) +# define gsSPPerspNormalize(s) gsMoveWd( G_MW_PERSPNORM, 0, (s)) +#else +# define gSPPerspNormalize(pkt, s) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \ + _g->words.w1 = (s); \ +} +# define gsSPPerspNormalize(s) \ +{{ \ + _SHIFTL(G_RDPHALF_1, 24, 8), \ + (s) \ +}} +#endif + +#ifdef F3DEX_GBI_2 +# define gSPPopMatrixN(pkt, n, num) gDma2p((pkt),G_POPMTX,(num)*64,64,2,0) +# define gsSPPopMatrixN(n, num) gsDma2p( G_POPMTX,(num)*64,64,2,0) +# define gSPPopMatrix(pkt, n) gSPPopMatrixN((pkt), (n), 1) +# define gsSPPopMatrix(n) gsSPPopMatrixN( (n), 1) +#else /* F3DEX_GBI_2 */ +# define gSPPopMatrix(pkt, n) gImmp1(pkt, G_POPMTX, n) +# define gsSPPopMatrix(n) gsImmp1( G_POPMTX, n) +#endif /* F3DEX_GBI_2 */ + +#define gSPEndDisplayList(pkt) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_ENDDL, 24, 8); \ + _g->words.w1 = 0; \ +} + +#define gsSPEndDisplayList() \ +{{ \ + _SHIFTL(G_ENDDL, 24, 8), 0 \ +}} + +#ifdef F3DEX_GBI_2 +/* + * One gSPGeometryMode(pkt,c,s) GBI is equal to these two GBIs. + * + * gSPClearGeometryMode(pkt,c) + * gSPSetGeometryMode(pkt,s) + * + * gSPLoadGeometryMode(pkt, word) sets GeometryMode directly. + */ +#define gSPGeometryMode(pkt, c, s) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = _SHIFTL(G_GEOMETRYMODE,24,8)|_SHIFTL(~(u32)(c),0,24);\ + _g->words.w1 = (u32)(s); \ +} + +#define gsSPGeometryMode(c, s) \ +{{ \ + (_SHIFTL(G_GEOMETRYMODE,24,8)|_SHIFTL(~(u32)(c),0,24)),(u32)(s) \ +}} +#define gSPSetGeometryMode(pkt, word) gSPGeometryMode((pkt),0,(word)) +#define gsSPSetGeometryMode(word) gsSPGeometryMode(0,(word)) +#define gSPClearGeometryMode(pkt, word) gSPGeometryMode((pkt),(word),0) +#define gsSPClearGeometryMode(word) gsSPGeometryMode((word),0) +#define gSPLoadGeometryMode(pkt, word) gSPGeometryMode((pkt),-1,(word)) +#define gsSPLoadGeometryMode(word) gsSPGeometryMode(-1,(word)) +#define gsSPGeometryModeSetFirst(c, s) gsSPGeometryMode(c, s) +#else /* F3DEX_GBI_2 */ +#define gSPSetGeometryMode(pkt, word) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETGEOMETRYMODE, 24, 8); \ + _g->words.w1 = (unsigned int)(word); \ +} + +#define gsSPSetGeometryMode(word) \ +{{ \ + _SHIFTL(G_SETGEOMETRYMODE, 24, 8), (unsigned int)(word) \ +}} + +#define gSPClearGeometryMode(pkt, word) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8); \ + _g->words.w1 = (unsigned int)(word); \ +} + +#define gsSPClearGeometryMode(word) \ +{{ \ + _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8), (unsigned int)(word) \ +}} + +/* + * gsSPGeometryMode + * In Fast3DEX2 it is better to use this, as the RSP geometry mode + * is able to be set and cleared in a single command. + */ +#define gsSPGeometryMode(c, s) \ + gsSPClearGeometryMode(c), \ + gsSPSetGeometryMode(s) +#define gsSPGeometryModeSetFirst(c, s) \ + gsSPSetGeometryMode(s), \ + gsSPClearGeometryMode(c) +#endif /* F3DEX_GBI_2 */ + +#ifdef F3DEX_GBI_2 +#define gSPSetOtherMode(pkt, cmd, sft, len, data) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + _g->words.w0 = (_SHIFTL(cmd,24,8)|_SHIFTL(32-(sft)-(len),8,8)| \ + _SHIFTL((len)-1,0,8)); \ + _g->words.w1 = (unsigned int)(data); \ +} + +#define gsSPSetOtherMode(cmd, sft, len, data) \ +{{ \ + _SHIFTL(cmd,24,8)|_SHIFTL(32-(sft)-(len),8,8)|_SHIFTL((len)-1,0,8), \ + (unsigned int)(data) \ +}} +#else +#define gSPSetOtherMode(pkt, cmd, sft, len, data) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | \ + _SHIFTL(len, 0, 8)); \ + _g->words.w1 = (unsigned int)(data); \ +} + +#define gsSPSetOtherMode(cmd, sft, len, data) \ +{{ \ + _SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | _SHIFTL(len, 0, 8), \ + (unsigned int)(data) \ +}} +#endif + +/* + * RDP setothermode register commands - register shadowed in RSP + */ +#define gDPPipelineMode(pkt, mode) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode) +#define gsDPPipelineMode(mode) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode) + +#define gDPSetCycleType(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type) +#define gsDPSetCycleType(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type) + +#define gDPSetTexturePersp(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type) +#define gsDPSetTexturePersp(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type) + +#define gDPSetTextureDetail(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type) +#define gsDPSetTextureDetail(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type) + +#define gDPSetTextureLOD(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type) +#define gsDPSetTextureLOD(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type) + +#define gDPSetTextureLUT(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type) +#define gsDPSetTextureLUT(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type) + +#define gDPSetTextureFilter(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type) +#define gsDPSetTextureFilter(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type) + +#define gDPSetTextureConvert(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type) +#define gsDPSetTextureConvert(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type) + +#define gDPSetCombineKey(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type) +#define gsDPSetCombineKey(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type) + +#ifndef _HW_VERSION_1 +#define gDPSetColorDither(pkt, mode) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode) +#define gsDPSetColorDither(mode) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode) +#else +#define gDPSetColorDither(pkt, mode) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode) +#define gsDPSetColorDither(mode) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode) +#endif + +#ifndef _HW_VERSION_1 +#define gDPSetAlphaDither(pkt, mode) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode) +#define gsDPSetAlphaDither(mode) \ + gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode) +#endif + +/* 'blendmask' is not supported anymore. + * The bits are reserved for future use. + * Fri May 26 13:45:55 PDT 1995 + */ +#define gDPSetBlendMask(pkt, mask) gDPNoOp(pkt) +#define gsDPSetBlendMask(mask) gsDPNoOp() + +#define gDPSetAlphaCompare(pkt, type) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type) +#define gsDPSetAlphaCompare(type) \ + gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type) + +#define gDPSetDepthSource(pkt, src) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src) +#define gsDPSetDepthSource(src) \ + gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src) + +#define gDPSetRenderMode(pkt, c0, c1) \ + gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, \ + (c0) | (c1)) +#define gsDPSetRenderMode(c0, c1) \ + gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, \ + (c0) | (c1)) + +#define gSetImage(pkt, cmd, fmt, siz, width, i) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | \ + _SHIFTL(siz, 19, 2) | _SHIFTL((width)-1, 0, 12); \ + _g->words.w1 = (uintptr_t)(i); \ +} + +#define gsSetImage(cmd, fmt, siz, width, i) \ +{{ \ + _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | \ + _SHIFTL(siz, 19, 2) | _SHIFTL((width)-1, 0, 12), \ + (uintptr_t)(i) \ +}} + +#define gDPSetColorImage(pkt, f, s, w, i) gSetImage(pkt, G_SETCIMG, f, s, w, i) +#define gsDPSetColorImage(f, s, w, i) gsSetImage(G_SETCIMG, f, s, w, i) + + +/* use these for new code */ +#define gDPSetDepthImage(pkt, i) gSetImage(pkt, G_SETZIMG, 0, 0, 1, i) +#define gsDPSetDepthImage(i) gsSetImage(G_SETZIMG, 0, 0, 1, i) +/* kept for compatibility */ +#define gDPSetMaskImage(pkt, i) gDPSetDepthImage(pkt, i) +#define gsDPSetMaskImage(i) gsDPSetDepthImage(i) + +#define gDPSetTextureImage(pkt, f, s, w, i) gSetImage(pkt, G_SETTIMG, f, s, w, i) +#define gsDPSetTextureImage(f, s, w, i) gsSetImage(G_SETTIMG, f, s, w, i) + +/* + * RDP macros + */ + +#define gDPSetCombine(pkt, muxs0, muxs1) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24);\ + _g->words.w1 = (unsigned int)(muxs1); \ +} + +#define gsDPSetCombine(muxs0, muxs1) \ +{{ \ + _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24), \ + (unsigned int)(muxs1) \ +}} + +#define GCCc0w0(saRGB0, mRGB0, saA0, mA0) \ + (_SHIFTL((saRGB0), 20, 4) | _SHIFTL((mRGB0), 15, 5) | \ + _SHIFTL((saA0), 12, 3) | _SHIFTL((mA0), 9, 3)) + +#define GCCc1w0(saRGB1, mRGB1) \ + (_SHIFTL((saRGB1), 5, 4) | _SHIFTL((mRGB1), 0, 5)) + +#define GCCc0w1(sbRGB0, aRGB0, sbA0, aA0) \ + (_SHIFTL((sbRGB0), 28, 4) | _SHIFTL((aRGB0), 15, 3) | \ + _SHIFTL((sbA0), 12, 3) | _SHIFTL((aA0), 9, 3)) + +#define GCCc1w1(sbRGB1, saA1, mA1, aRGB1, sbA1, aA1) \ + (_SHIFTL((sbRGB1), 24, 4) | _SHIFTL((saA1), 21, 3) | \ + _SHIFTL((mA1), 18, 3) | _SHIFTL((aRGB1), 6, 3) | \ + _SHIFTL((sbA1), 3, 3) | _SHIFTL((aA1), 0, 3)) + +#define gDPSetCombineLERP(pkt, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \ + a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) | \ + _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, \ + G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \ + GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \ + 0, 24); \ + _g->words.w1 = (unsigned int)(GCCc0w1(G_CCMUX_##b0, \ + G_CCMUX_##d0, \ + G_ACMUX_##Ab0, \ + G_ACMUX_##Ad0) | \ + GCCc1w1(G_CCMUX_##b1, \ + G_ACMUX_##Aa1, \ + G_ACMUX_##Ac1, \ + G_CCMUX_##d1, \ + G_ACMUX_##Ab1, \ + G_ACMUX_##Ad1)); \ +} + +#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \ + a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ +{{ \ + _SHIFTL(G_SETCOMBINE, 24, 8) | \ + _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, \ + G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \ + GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), 0, 24), \ + (unsigned int)(GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, \ + G_ACMUX_##Ab0, G_ACMUX_##Ad0) | \ + GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, \ + G_ACMUX_##Ac1, G_CCMUX_##d1, \ + G_ACMUX_##Ab1, G_ACMUX_##Ad1)) \ +}} + +/* + * SetCombineMode macros are NOT redunant. It allow the C preprocessor + * to substitute single parameter which includes commas in the token and + * rescan for higher parameter count macro substitution. + * + * eg. gsDPSetCombineMode(G_CC_MODULATE, G_CC_MODULATE) turns into + * gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0, + * TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0) + */ + +#define gDPSetCombineMode(pkt, a, b) gDPSetCombineLERP(pkt, a, b) +#define gsDPSetCombineMode(a, b) gsDPSetCombineLERP(a, b) + +#define gDPSetColor(pkt, c, d) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(c, 24, 8); \ + _g->words.w1 = (unsigned int)(d); \ +} + +#define gsDPSetColor(c, d) \ +{{ \ + _SHIFTL(c, 24, 8), (unsigned int)(d) \ +}} + +#define DPRGBColor(pkt, cmd, r, g, b, a) \ + gDPSetColor(pkt, cmd, \ + (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ + _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) +#define sDPRGBColor(cmd, r, g, b, a) \ + gsDPSetColor(cmd, \ + (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ + _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) + +#define gDPSetEnvColor(pkt, r, g, b, a) \ + DPRGBColor(pkt, G_SETENVCOLOR, r,g,b,a) +#define gsDPSetEnvColor(r, g, b, a) \ + sDPRGBColor(G_SETENVCOLOR, r,g,b,a) +#define gDPSetBlendColor(pkt, r, g, b, a) \ + DPRGBColor(pkt, G_SETBLENDCOLOR, r,g,b,a) +#define gsDPSetBlendColor(r, g, b, a) \ + sDPRGBColor(G_SETBLENDCOLOR, r,g,b,a) +#define gDPSetFogColor(pkt, r, g, b, a) \ + DPRGBColor(pkt, G_SETFOGCOLOR, r,g,b,a) +#define gsDPSetFogColor(r, g, b, a) \ + sDPRGBColor(G_SETFOGCOLOR, r,g,b,a) +#define gDPSetFillColor(pkt, d) \ + gDPSetColor(pkt, G_SETFILLCOLOR, (d)) +#define gsDPSetFillColor(d) \ + gsDPSetColor(G_SETFILLCOLOR, (d)) + +#define gDPSetPrimDepth(pkt, z, dz) \ + gDPSetColor(pkt, G_SETPRIMDEPTH, \ + _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16)) +#define gsDPSetPrimDepth(z, dz) \ + gsDPSetColor(G_SETPRIMDEPTH, _SHIFTL(z, 16, 16) | \ + _SHIFTL(dz, 0, 16)) + +#define gDPSetPrimColor(pkt, m, l, r, g, b, a) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | \ + _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)); \ + _g->words.w1 = (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ + _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)); \ +} + +#define gsDPSetPrimColor(m, l, r, g, b, a) \ +{{ \ + (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | \ + _SHIFTL(l, 0, 8)), \ + (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | \ + _SHIFTL(a, 0, 8)) \ +}} + +/* + * gDPSetOtherMode (This is for expert user.) + * + * This command makes all othermode parameters set. + * Do not use this command in the same DL with another g*SPSetOtherMode DLs. + * + * [Usage] + * gDPSetOtherMode(pkt, modeA, modeB) + * + * 'modeA' is described all parameters of GroupA GBI command. + * 'modeB' is also described all parameters of GroupB GBI command. + * + * GroupA: + * gDPPipelineMode, gDPSetCycleType, gSPSetTexturePersp, + * gDPSetTextureDetail, gDPSetTextureLOD, gDPSetTextureLUT, + * gDPSetTextureFilter, gDPSetTextureConvert, gDPSetCombineKey, + * gDPSetColorDither, gDPSetAlphaDither + * + * GroupB: + * gDPSetAlphaCompare, gDPSetDepthSource, gDPSetRenderMode + * + * Use 'OR' operation to get modeA and modeB. + * + * modeA = G_PM_* | G_CYC_* | G_TP_* | G_TD_* | G_TL_* | G_TT_* | G_TF_* + * G_TC_* | G_CK_* | G_CD_* | G_AD_*; + * + * modeB = G_AC_* | G_ZS_* | G_RM_* | G_RM_*2; + */ +#define gDPSetOtherMode(pkt, mode0, mode1) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_RDPSETOTHERMODE,24,8)|_SHIFTL(mode0,0,24);\ + _g->words.w1 = (unsigned int)(mode1); \ +} + +#define gsDPSetOtherMode(mode0, mode1) \ +{{ \ + _SHIFTL(G_RDPSETOTHERMODE,24,8)|_SHIFTL(mode0,0,24), \ + (unsigned int)(mode1) \ +}} + +/* + * Texturing macros + */ + +/* These are also defined defined above for Sprite Microcode */ + +#define G_TX_LOADTILE 7 +#define G_TX_RENDERTILE 0 + +#define G_TX_NOMIRROR 0 +#define G_TX_WRAP 0 +#define G_TX_MIRROR 0x1 +#define G_TX_CLAMP 0x2 +#define G_TX_NOMASK 0 +#define G_TX_NOLOD 0 + + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif +/* + * Dxt is the inverse of the number of 64-bit words in a line of + * the texture being loaded using the load_block command. If + * there are any 1's to the right of the 11th fractional bit, + * dxt should be rounded up. The following macros accomplish + * this. The 4b macros are a special case since 4-bit textures + * are loaded as 8-bit textures. Dxt is fixed point 1.11. RJM + */ +#define G_TX_DXT_FRAC 11 + +/* + * For RCP 2.0, the maximum number of texels that can be loaded + * using a load_block command is 2048. In order to load the total + * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b, + * then change the tile to the proper texel size after the load. + * The g*DPLoadTextureBlock macros already do this, so this change + * will be transparent if you use these macros. If you use + * the g*DPLoadBlock macros directly, you will need to handle this + * tile manipulation yourself. RJM. + */ +#ifdef _HW_VERSION_1 +#define G_TX_LDBLK_MAX_TXL 4095 +#else +#define G_TX_LDBLK_MAX_TXL 2047 +#endif /* _HW_VERSION_1 */ + +#define TXL2WORDS(txls, b_txl) MAX(1, ((txls)*(b_txl)/8)) +#define CALC_DXT(width, b_txl) \ + (((1 << G_TX_DXT_FRAC) + TXL2WORDS(width, b_txl) - 1) / \ + TXL2WORDS(width, b_txl)) + +#define TXL2WORDS_4b(txls) MAX(1, ((txls)/16)) +#define CALC_DXT_4b(width) \ + (((1 << G_TX_DXT_FRAC) + TXL2WORDS_4b(width) - 1) / \ + TXL2WORDS_4b(width)) + +#define gDPLoadTileGeneric(pkt, c, tile, uls, ult, lrs, lrt) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | \ + _SHIFTL(ult, 0, 12); \ + _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | \ + _SHIFTL(lrt, 0, 12); \ +} + +#define gsDPLoadTileGeneric(c, tile, uls, ult, lrs, lrt) \ +{{ \ + _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12), \ + _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12)\ +}} + +#define gDPSetTileSize(pkt, t, uls, ult, lrs, lrt) \ + gDPLoadTileGeneric(pkt, G_SETTILESIZE, t, uls, ult, lrs, lrt) +#define gsDPSetTileSize(t, uls, ult, lrs, lrt) \ + gsDPLoadTileGeneric(G_SETTILESIZE, t, uls, ult, lrs, lrt) +#define gDPLoadTile(pkt, t, uls, ult, lrs, lrt) \ + gDPLoadTileGeneric(pkt, G_LOADTILE, t, uls, ult, lrs, lrt) +#define gsDPLoadTile(t, uls, ult, lrs, lrt) \ + gsDPLoadTileGeneric(G_LOADTILE, t, uls, ult, lrs, lrt) + +#define gDPSetTile(pkt, fmt, siz, line, tmem, tile, palette, cmt, \ + maskt, shiftt, cms, masks, shifts) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) |\ + _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) | \ + _SHIFTL(tmem, 0, 9); \ + _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | \ + _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) | \ + _SHIFTL(shiftt, 10, 4) |_SHIFTL(cms, 8, 2) | \ + _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4); \ +} + +#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, cmt, \ + maskt, shiftt, cms, masks, shifts) \ +{{ \ + (_SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) | \ + _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) | _SHIFTL(tmem, 0, 9)),\ + (_SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | \ + _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) | \ + _SHIFTL(shiftt, 10, 4) | _SHIFTL(cms, 8, 2) | \ + _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4)) \ +}} + +/* + * For RCP 2.0, the maximum number of texels that can be loaded + * using a load_block command is 2048. In order to load the total + * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b, + * then change the tile to the proper texel size after the load. + * The g*DPLoadTextureBlock macros already do this, so this change + * will be transparent if you use these macros. If you use + * the g*DPLoadBlock macros directly, you will need to handle this + * tile manipulation yourself. RJM. + */ +#define gDPLoadBlock(pkt, tile, uls, ult, lrs, dxt) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_LOADBLOCK, 24, 8) | \ + _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | \ + _SHIFTL((MIN(lrs,G_TX_LDBLK_MAX_TXL)), 12, 12) |\ + _SHIFTL(dxt, 0, 12)); \ +} + +#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \ +{{ \ + (_SHIFTL(G_LOADBLOCK, 24, 8) | _SHIFTL(uls, 12, 12) | \ + _SHIFTL(ult, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | \ + _SHIFTL((MIN(lrs,G_TX_LDBLK_MAX_TXL)), 12, 12) | \ + _SHIFTL(dxt, 0, 12)) \ +}} + +#define gDPLoadTLUTCmd(pkt, tile, count) \ +{ \ + Gfx *_g = (Gfx *)pkt; \ + \ + _g->words.w0 = _SHIFTL(G_LOADTLUT, 24, 8); \ + _g->words.w1 = _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10);\ +} + +#define gsDPLoadTLUTCmd(tile, count) \ +{{ \ + _SHIFTL(G_LOADTLUT, 24, 8), \ + _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10) \ +}} + +#define gDPLoadTextureBlock(pkt, timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT) -1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * siz##_LINE_BYTES)+7)>>3, 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +#define gDPLoadTextureBlockYuv(pkt, timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT) -1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * 1)+7)>>3, 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +/* Load fix rww 27jun95 */ +/* The S at the end means odd lines are already word Swapped */ + +#define gDPLoadTextureBlockS(pkt, timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1,0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * siz##_LINE_BYTES)+7)>>3, 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +/* + * Allow tmem address and render tile to be specified. + * The S at the end means odd lines are already word Swapped + */ +#define gDPLoadMultiBlockS(pkt, timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1,0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * siz##_LINE_BYTES)+7)>>3, tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + + +#define gDPLoadTextureBlockYuvS(pkt, timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1,0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, \ + (((width) * 1)+7)>>3, 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +/* + * allows tmem address to be specified + */ +#define _gDPLoadTextureBlock(pkt, timg, tmem, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES)+7)>>3, \ + tmem, G_TX_RENDERTILE, pal, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +/* + * allows tmem address and render tile to be specified + */ +#define _gDPLoadTextureBlockTile(pkt, timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0,\ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES)+7)>>3, \ + tmem, rtile, pal, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +/* + * allows tmem address and render tile to be specified + */ +#define gDPLoadMultiBlock(pkt, timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0,\ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES)+7)>>3, \ + tmem, rtile, pal, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +#define gsDPLoadTextureBlock(timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +/* Here is the static form of the pre-swapped texture block loading */ +/* See gDPLoadTextureBlockS() for reference. Basically, just don't + calculate DxT, use 0 */ + +#define gsDPLoadTextureBlockS(timg, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0 , \ + cmt, maskt,shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, 0 ),\ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +/* + * Allow tmem address to be specified + */ +#define _gsDPLoadTextureBlock(timg, tmem, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, \ + ((((width) * siz##_LINE_BYTES)+7)>>3), tmem, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +/* + * Allow tmem address and render_tile to be specified + */ +#define _gsDPLoadTextureBlockTile(timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, \ + ((((width) * siz##_LINE_BYTES)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +/* + * Allow tmem address and render_tile to be specified, useful when loading + * mutilple tiles at a time. + */ +#define gsDPLoadMultiBlock(timg, tmem, rtile, fmt, siz, width, \ + height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \ + 0 , cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, \ + ((((width) * siz##_LINE_BYTES)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +/* + * Allows tmem and render tile to be specified. Useful when loading + * several tiles at a time. + * + * Here is the static form of the pre-swapped texture block loading + * See gDPLoadTextureBlockS() for reference. Basically, just don't + * calculate DxT, use 0 + */ + +#define gsDPLoadMultiBlockS(timg, tmem, rtile, fmt, siz, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0 , \ + cmt, maskt,shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \ + (((width)*(height) + siz##_INCR) >> siz##_SHIFT)-1, 0 ),\ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES)+7)>>3), tmem,\ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +#define gDPLoadTextureBlock_4b(pkt, timg, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +/* Load fix rww 27jun95 */ +/* The S at the end means odd lines are already word Swapped */ + +#define gDPLoadTextureBlock_4bS(pkt, timg, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, 0 ); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +/* + * 4-bit load block. Useful when loading multiple tiles + */ +#define gDPLoadMultiBlock_4b(pkt, timg, tmem, rtile, fmt, width, height,\ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +/* + * 4-bit load block. Allows tmem and render tile to be specified. Useful when + * loading multiple tiles. The S means odd lines are already word swapped. + */ +#define gDPLoadMultiBlock_4bS(pkt, timg, tmem, rtile, fmt, width, height,\ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, 0 ); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + + +#define _gDPLoadTextureBlock_4b(pkt, timg, tmem, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, \ + cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \ + (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) \ +} + +#define gsDPLoadTextureBlock_4b(timg, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +#define gsDPLoadTextureBlock_4bS(timg, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1,0),\ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +/* + * 4-bit load block. Allows tmem address and render tile to be specified. + * Useful when loading multiple tiles. + */ +#define gsDPLoadMultiBlock_4b(timg, tmem, rtile, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +/* + * 4-bit load block. Allows tmem address and render tile to be specified. + * Useful when loading multiple tiles. S means odd lines are already swapped. + */ +#define gsDPLoadMultiBlock_4bS(timg, tmem, rtile, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1,0),\ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + + +/* + * Allows tmem address to be specified + */ +#define _gsDPLoadTextureBlock_4b(timg, tmem, fmt, width, height, \ + pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0 , cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width)*(height)+3)>>2)-1, \ + CALC_DXT_4b(width)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width)>>1)+7)>>3), tmem, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \ + ((width)-1) << G_TEXTURE_IMAGE_FRAC, \ + ((height)-1) << G_TEXTURE_IMAGE_FRAC) + +#ifndef _HW_VERSION_1 + +#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, \ + uls, ult, lrs, lrt, pal, \ + cms, cmt, masks, maskt, shifts, shiftt) \ +{ \ + gDPSetTextureImage(pkt, fmt, siz, width, timg); \ + gDPSetTile(pkt, fmt, siz, \ + (((((lrs)-(uls)+1) * siz##_TILE_BYTES)+7)>>3), 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile( pkt, G_TX_LOADTILE, \ + (uls)<>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, \ + (uls)<>3), tmem, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile( pkt, G_TX_LOADTILE, \ + (uls)<>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, \ + (uls)<>3), 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks,\ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, \ + (uls)<>3), \ + tmem, G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<>3), \ + tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, \ + (uls)<>1), timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_8b, \ + (((((lrs)-(uls)+1)>>1)+7)>>3), 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile( pkt, G_TX_LOADTILE, \ + (uls)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (ult)<<(G_TEXTURE_IMAGE_FRAC), \ + (lrs)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (lrt)<<(G_TEXTURE_IMAGE_FRAC)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \ + (((((lrs)-(uls)+1)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, \ + masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, \ + (uls)<>1), timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_8b, \ + (((((lrs)-(uls)+1)>>1)+7)>>3), tmem, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile( pkt, G_TX_LOADTILE, \ + (uls)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (ult)<<(G_TEXTURE_IMAGE_FRAC), \ + (lrs)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (lrt)<<(G_TEXTURE_IMAGE_FRAC)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \ + (((((lrs)-(uls)+1)>>1)+7)>>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, \ + (uls)<>1), timg), \ + gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs)-(uls)+1)>>1)+7)>>3), 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (ult)<<(G_TEXTURE_IMAGE_FRAC), \ + (lrs)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (lrt)<<(G_TEXTURE_IMAGE_FRAC)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs)-(uls)+1)>>1)+7)>>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, \ + (uls)<>1), timg), \ + gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs)-(uls)+1)>>1)+7)>>3), \ + tmem, G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (ult)<<(G_TEXTURE_IMAGE_FRAC), \ + (lrs)<<(G_TEXTURE_IMAGE_FRAC-1), \ + (lrt)<<(G_TEXTURE_IMAGE_FRAC)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs)-(uls)+1)>>1)+7)>>3), \ + tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, \ + (uls)<words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | \ + _SHIFTL((int)((float)(ulx)*4.0F), 12, 12) | \ + _SHIFTL((int)((float)(uly)*4.0F), 0, 12); \ + _g->words.w1 = _SHIFTL(mode, 24, 2) | \ + _SHIFTL((int)((float)(lrx)*4.0F), 12, 12) | \ + _SHIFTL((int)((float)(lry)*4.0F), 0, 12); \ +} + + +#define gDPSetScissorFrac(pkt, mode, ulx, uly, lrx, lry) \ +{ \ + Gfx *_g = (Gfx *)pkt; \ + \ + _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | \ + _SHIFTL((int)((ulx)), 12, 12) | \ + _SHIFTL((int)((uly)), 0, 12); \ + _g->words.w1 = _SHIFTL(mode, 24, 2) | \ + _SHIFTL((int)((lrx)), 12, 12) | \ + _SHIFTL((int)((lry)), 0, 12); \ +} + +#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \ +{{ \ + _SHIFTL(G_SETSCISSOR, 24, 8) | \ + _SHIFTL((int)((float)(ulx)*4.0F), 12, 12) | \ + _SHIFTL((int)((float)(uly)*4.0F), 0, 12), \ + _SHIFTL(mode, 24, 2) | \ + _SHIFTL((int)((float)(lrx)*4.0F), 12, 12) | \ + _SHIFTL((int)((float)(lry)*4.0F), 0, 12) \ +}} + +#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \ +{{ \ + _SHIFTL(G_SETSCISSOR, 24, 8) | \ + _SHIFTL((int)((ulx)), 12, 12) | \ + _SHIFTL((int)((uly)), 0, 12), \ + _SHIFTL(mode, 24, 2) | \ + _SHIFTL((int)(lrx), 12, 12) | \ + _SHIFTL((int)(lry), 0, 12) \ +}} + +/* Fraction never used in fill */ +#ifdef F3DEX_GBI_2E +#define gDPFillRectangle(pkt, ulx, uly, lrx, lry) \ +{ \ + Gfx *_g0 = (Gfx *)(pkt), *_g1 = (Gfx *)(pkt); \ + _g0->words.w0 = _SHIFTL(G_FILLRECT, 24, 8) | \ + _SHIFTL((lrx), 2, 22); \ + _g0->words.w1 = _SHIFTL((lry), 2, 22); \ + _g1->words.w0 = _SHIFTL((ulx), 2, 22); \ + _g1->words.w1 = _SHIFTL((uly), 2, 22); \ +} +#define gsDPFillRectangle(ulx, uly, lrx, lry) \ +{{ \ + (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL((lrx), 2, 22)), \ + _SHIFTL((lry), 2, 22), \ +}}, \ +{{ \ + _SHIFTL((ulx), 2, 22), \ + _SHIFTL((uly), 2, 22), \ +}} +#else +#define gDPFillRectangle(pkt, ulx, uly, lrx, lry) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | \ + _SHIFTL((lrx), 14, 10) | _SHIFTL((lry), 2, 10));\ + _g->words.w1 = (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10));\ +} +#define gsDPFillRectangle(ulx, uly, lrx, lry) \ +{{ \ + (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL((lrx), 14, 10) | \ + _SHIFTL((lry), 2, 10)), \ + (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10)) \ +}} +#endif + +/* like gDPFillRectangle but accepts negative arguments */ +#ifndef F3DEX_GBI_2E +#define gDPScisFillRectangle(pkt, ulx, uly, lrx, lry) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | \ + _SHIFTL(MAX((lrx),0), 14, 10) | \ + _SHIFTL(MAX((lry),0), 2, 10)); \ + _g->words.w1 = (_SHIFTL(MAX((ulx),0), 14, 10) | \ + _SHIFTL(MAX((uly),0), 2, 10)); \ +} +#endif + +#define gDPSetConvert(pkt, k0, k1, k2, k3, k4, k5) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SETCONVERT, 24, 8) | \ + _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | \ + _SHIFTR(k2, 5, 4)); \ + _g->words.w1 = (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | \ + _SHIFTL(k4, 9, 9) | _SHIFTL(k5, 0, 9)); \ +} + +#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \ +{{ \ + (_SHIFTL(G_SETCONVERT, 24, 8) | \ + _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | _SHIFTR(k2, 5, 4)), \ + (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | _SHIFTL(k4, 9, 9) | \ + _SHIFTL(k5, 0, 9)) \ +}} + +#define gDPSetKeyR(pkt, cR, sR, wR) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETKEYR, 24, 8); \ + _g->words.w1 = (_SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | \ + _SHIFTL(sR, 0, 8)); \ +} + +#define gsDPSetKeyR(cR, sR, wR) \ +{{ \ + _SHIFTL(G_SETKEYR, 24, 8), \ + _SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | _SHIFTL(sR, 0, 8) \ +}} + +#define gDPSetKeyGB(pkt, cG, sG, wG, cB, sB, wB) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SETKEYGB, 24, 8) | \ + _SHIFTL(wG, 12, 12) | _SHIFTL(wB, 0, 12)); \ + _g->words.w1 = (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | \ + _SHIFTL(cB, 8, 8) | _SHIFTL(sB, 0, 8)); \ +} + +#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \ +{{ \ + (_SHIFTL(G_SETKEYGB, 24, 8) | _SHIFTL(wG, 12, 12) | \ + _SHIFTL(wB, 0, 12)), \ + (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | _SHIFTL(cB, 8, 8) | \ + _SHIFTL(sB, 0, 8)) \ +}} + +#define gDPNoParam(pkt, cmd) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(cmd, 24, 8); \ + _g->words.w1 = 0; \ +} + +#define gsDPNoParam(cmd) \ +{{ \ + _SHIFTL(cmd, 24, 8), 0 \ +}} + +#define gDPParam(pkt, cmd, param) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(cmd, 24, 8); \ + _g->words.w1 = (param); \ +} + +#define gsDPParam(cmd, param) \ +{{ \ + _SHIFTL(cmd, 24, 8), (param) \ +}} + +/* Notice that textured rectangles are 128-bit commands, therefore + * gsDPTextureRectangle() should not be used in display lists + * under normal circumstances (use gsSPTextureRectangle()). + * That is also why there is no gDPTextureRectangle() macros. + */ +#define gsDPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{{ \ + (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \ +}}, \ +{{ \ + _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), \ + _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) \ +}} + +#define gDPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + if (pkt); \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + _g ++; \ + _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \ + _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \ +} + +#define gsDPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{{ \ + (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \ +}}, \ +{{ \ + _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), \ + _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) \ +}} + +#define gDPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + if (pkt); \ + _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + _g ++; \ + _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \ + _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \ +} + +#ifdef F3D_OLD +# define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ + gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)));\ +} + +#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + {{(_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)),\ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \ + gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ + gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) + +/* like gSPTextureRectangle but accepts negative position arguments */ +# define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \ + _SHIFTL(MAX((s16)(xh),0), 12, 12) | \ + _SHIFTL(MAX((s16)(yh),0), 0, 12)); \ + _g->words.w1 = (_SHIFTL((tile), 24, 3) | \ + _SHIFTL(MAX((s16)(xl),0), 12, 12) | \ + _SHIFTL(MAX((s16)(yl),0), 0, 12)); \ + gImmp1(pkt, G_RDPHALF_2, \ + (_SHIFTL(((s) - \ + (((s16)(xl) < 0) ? \ + (((s16)(dsdx) < 0) ? \ + (MAX((((s16)(xl)*(s16)(dsdx))>>7),0)) : \ + (MIN((((s16)(xl)*(s16)(dsdx))>>7),0))) : 0)), \ + 16, 16) | \ + _SHIFTL(((t) - \ + (((yl) < 0) ? \ + (((s16)(dtdy) < 0) ? \ + (MAX((((s16)(yl)*(s16)(dtdy))>>7),0)) : \ + (MIN((((s16)(yl)*(s16)(dtdy))>>7),0))) : 0)), \ + 0, 16))); \ + gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL((dsdx), 16, 16) | \ + _SHIFTL((dtdy), 0, 16))); \ +} + +# define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + {{(_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \ + gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ + gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) + +# define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) |\ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ + gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \ +} +#elif defined(F3DEX_GBI_2E) +# define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\ +{ \ + Gfx *_g0 = (Gfx *)(pkt), *_g1 = (Gfx *)(pkt), *_g2 = (Gfx *)(pkt); \ + \ + _g0->words.w0 = _SHIFTL(G_TEXRECT, 24, 8) | \ + _SHIFTL((xh), 0, 24); \ + _g0->words.w1 = _SHIFTL((yh), 0, 24); \ + _g1->words.w0 = (_SHIFTL(tile, 24, 3) | _SHIFTL((xl), 0, 24)); \ + _g1->words.w1 = _SHIFTL((yl), 0, 24); \ + _g2->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \ + _g2->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \ +} + +# define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{{ \ + (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL((xh), 0, 24)), \ + _SHIFTL((yh), 0, 24), \ +}}, \ +{{ \ + (_SHIFTL((tile), 24, 3) | _SHIFTL((xl), 0, 24)), \ + _SHIFTL((yl), 0, 24), \ +}}, \ +{{ \ + _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), \ + _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) \ +}} + +# define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{ \ + Gfx *_g0 = (Gfx *)(pkt), *_g1 = (Gfx *)(pkt), *_g2 = (Gfx *)(pkt); \ + \ + _g0->words.w0 = _SHIFTL(G_TEXRECTFLIP, 24, 8) | \ + _SHIFTL((xh), 0, 24); \ + _g0->words.w1 = _SHIFTL((yh), 0, 24); \ + _g1->words.w0 = (_SHIFTL(tile, 24, 3) | _SHIFTL((xl), 0, 24)); \ + _g1->words.w1 = _SHIFTL((yl), 0, 24); \ + _g2->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \ + _g2->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \ +} +#else +# define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)));\ +} + +#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + {{(_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)),\ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \ + gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ + gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) + +/* like gSPTextureRectangle but accepts negative position arguments */ +# define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \ + _SHIFTL(MAX((s16)(xh),0), 12, 12) | \ + _SHIFTL(MAX((s16)(yh),0), 0, 12)); \ + _g->words.w1 = (_SHIFTL((tile), 24, 3) | \ + _SHIFTL(MAX((s16)(xl),0), 12, 12) | \ + _SHIFTL(MAX((s16)(yl),0), 0, 12)); \ + gImmp1(pkt, G_RDPHALF_1, \ + (_SHIFTL(((s) - \ + (((s16)(xl) < 0) ? \ + (((s16)(dsdx) < 0) ? \ + (MAX((((s16)(xl)*(s16)(dsdx))>>7),0)) : \ + (MIN((((s16)(xl)*(s16)(dsdx))>>7),0))) : 0)), \ + 16, 16) | \ + _SHIFTL(((t) - \ + (((yl) < 0) ? \ + (((s16)(dtdy) < 0) ? \ + (MAX((((s16)(yl)*(s16)(dtdy))>>7),0)) : \ + (MIN((((s16)(yl)*(s16)(dtdy))>>7),0))) : 0)), \ + 0, 16))); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL((dsdx), 16, 16) | \ + _SHIFTL((dtdy), 0, 16))); \ +} + +# define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + {{(_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \ + _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \ + gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ + gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) + +# define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) |\ + _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \ + _SHIFTL(yl, 0, 12)); \ + gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \ +} +#endif + +#define gsDPWord(wordhi, wordlo) \ + gsImmp1(G_RDPHALF_1, (uintptr_t)(wordhi)), \ + gsImmp1(G_RDPHALF_2, (uintptr_t)(wordlo)) + +#define gDPWord(pkt, wordhi, wordlo) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + gImmp1(pkt, G_RDPHALF_1, (uintptr_t)(wordhi)); \ + gImmp1(pkt, G_RDPHALF_2, (uintptr_t)(wordlo)); \ +} + +#define gDPFullSync(pkt) gDPNoParam(pkt, G_RDPFULLSYNC) +#define gsDPFullSync() gsDPNoParam(G_RDPFULLSYNC) +#define gDPTileSync(pkt) gDPNoParam(pkt, G_RDPTILESYNC) +#define gsDPTileSync() gsDPNoParam(G_RDPTILESYNC) +#define gDPPipeSync(pkt) gDPNoParam(pkt, G_RDPPIPESYNC) +#define gsDPPipeSync() gsDPNoParam(G_RDPPIPESYNC) +#define gDPLoadSync(pkt) gDPNoParam(pkt, G_RDPLOADSYNC) +#define gsDPLoadSync() gsDPNoParam(G_RDPLOADSYNC) +#define gDPNoOp(pkt) gDPNoParam(pkt, G_NOOP) +#define gsDPNoOp() gsDPNoParam(G_NOOP) +#define gDPNoOpTag(pkt, tag) gDPParam(pkt, G_NOOP, tag) +#define gsDPNoOpTag(tag) gsDPParam(G_NOOP, tag) + +#if defined(F3DZEX_GBI_2) || defined(F3DZEX_NON_GBI_2) || defined(L3DZEX_GBI) +#include "gbi-poslight.h" +#endif + +#endif /* _LANGUAGE_C */ + + +#endif /* _GBI_H_ */ diff --git a/include/PR/gs2dex.h b/include/n64/PR/gs2dex.h similarity index 100% rename from include/PR/gs2dex.h rename to include/n64/PR/gs2dex.h diff --git a/include/PR/gt.h b/include/n64/PR/gt.h similarity index 100% rename from include/PR/gt.h rename to include/n64/PR/gt.h diff --git a/include/PR/gtoff.h b/include/n64/PR/gtoff.h similarity index 100% rename from include/PR/gtoff.h rename to include/n64/PR/gtoff.h diff --git a/include/PR/gu.h b/include/n64/PR/gu.h similarity index 100% rename from include/PR/gu.h rename to include/n64/PR/gu.h diff --git a/include/PR/gzsort.h b/include/n64/PR/gzsort.h similarity index 100% rename from include/PR/gzsort.h rename to include/n64/PR/gzsort.h diff --git a/include/PR/leo.h b/include/n64/PR/leo.h similarity index 100% rename from include/PR/leo.h rename to include/n64/PR/leo.h diff --git a/include/n64/PR/leoappli.h b/include/n64/PR/leoappli.h new file mode 100644 index 00000000..619fbc08 --- /dev/null +++ b/include/n64/PR/leoappli.h @@ -0,0 +1,274 @@ +/* + * F i l e N a m e : l e o a p p l i . h + * + **************************************************************************** + * (C) Copyright ALPS Electric Co., Ltd. 1995-1997 + **************************************************************************** + * Version + * + * ver Date + * ---- -------- + * 1.01 '97-11-18 Add MOTOR BRAKE definition for control bit. + **************************************************************************** +*/ +/*-----------------------------------*/ +/* DRIVE PARAMETER */ +/*-----------------------------------*/ +#define LEO_DISK_TYPE_MIN 0 +#define LEO_DISK_TYPE_MAX 6 + +#define LEO_LBA_MIN 0 +#define LEO_LBA_MAX 4291 + +#define LEO_LBA_ROM_TOP LEO_LBA_MIN +#define LEO_LBA_ROM_END0 1417 +#define LEO_LBA_ROM_END1 1965 +#define LEO_LBA_ROM_END2 2513 +#define LEO_LBA_ROM_END3 3061 +#define LEO_LBA_ROM_END4 3609 +#define LEO_LBA_ROM_END5 4087 +#define LEO_LBA_ROM_END6 LEO_LBA_MAX +#define LEO_LBA_RAM_TOP0 (LEO_LBA_ROM_END0+1) +#define LEO_LBA_RAM_TOP1 (LEO_LBA_ROM_END1+1) +#define LEO_LBA_RAM_TOP2 (LEO_LBA_ROM_END2+1) +#define LEO_LBA_RAM_TOP3 (LEO_LBA_ROM_END3+1) +#define LEO_LBA_RAM_TOP4 (LEO_LBA_ROM_END4+1) +#define LEO_LBA_RAM_TOP5 (LEO_LBA_ROM_END5+1) +#define LEO_LBA_RAM_TOP6 (LEO_LBA_ROM_END6+1) +#define LEO_LBA_RAM_END6 LEO_LBA_MAX + +/*-----------------------------------*/ +/* LEO FUNCTION DEFINITIONS */ +/*-----------------------------------*/ +extern void leoInitialize(OSPri PRI_WRK, OSPri PRI_INT, OSMesg *command_que_buf, u32 cmd_buff_size); +extern void leoCommand(void *CDB); +extern void LeoReset(void); +extern s32 LeoResetClear(void); + +/*-----------------------------------*/ +/* THREAD PRIORITY */ +/*-----------------------------------*/ +#define LEO_PRIORITY_WRK (OS_PRIORITY_PIMGR-1) +#define LEO_PRIORITY_INT OS_PRIORITY_PIMGR + +/*-----------------------------------*/ +/* COMMAND CODE */ +/*-----------------------------------*/ +#define LEO_COMMAND_CLEAR_QUE 0x01 +#define LEO_COMMAND_INQUIRY 0x02 +#define LEO_COMMAND_TEST_UNIT_READY 0x03 +#define LEO_COMMAND_REZERO 0x04 +#define LEO_COMMAND_READ 0x05 +#define LEO_COMMAND_WRITE 0x06 +#define LEO_COMMAND_SEEK 0x07 +#define LEO_COMMAND_START_STOP 0x08 +#define LEO_COMMAND_READ_CAPACITY 0x09 +#define LEO_COMMAND_TRANSLATE 0x0a +#define LEO_COMMAND_MODE_SELECT 0x0b +#define LEO_COMMAND_READ_DISK_ID 0x0c +#define LEO_COMMAND_READ_TIMER 0x0d +#define LEO_COMMAND_SET_TIMER 0x0e + +/*-----------------------------------*/ +/* CONTROL BIT */ +/*-----------------------------------*/ +#define LEO_CONTROL_POST 0x80 /* ENABLE POST QUEUE */ +#define LEO_CONTROL_START 0x01 /* START COMMAND */ +#define LEO_CONTROL_STBY 0x02 /* STAND-BY MODE(NOT SLEEP MODE) */ +#define LEO_CONTROL_WRT 0x01 /* READ RE-WRITE-ABLE CAPACITY */ +#define LEO_CONTROL_TBL 0x01 /* TRANSLATE BYTE TO LBA */ +#define LEO_CONTROL_BRAKE 0x04 /* SLEEP MODE(BRAKE ON) */ + +/*-----------------------------------*/ +/* BIT FIELD PARAMETER */ +/*-----------------------------------*/ +#define LEO_TEST_UNIT_MR 0x01 /* MEDIUM REMOVED */ +#define LEO_TEST_UNIT_RE 0x02 /* HEAD RETRACTED */ +#define LEO_TEST_UNIT_SS 0x04 /* SPINDLE STOPPED */ + +/*-----------------------------------*/ +/* STATUS */ +/*-----------------------------------*/ +#define LEO_STATUS_GOOD 0x00 +#define LEO_STATUS_CHECK_CONDITION 0x02 +#define LEO_STATUS_BUSY 0x08 + +/*-----------------------------------*/ +/* SENSE CODE */ +/*-----------------------------------*/ +#define LEO_SENSE_NO_ADDITIONAL_SENSE_INFOMATION 00 +#define LEO_SENSE_DRIVE_NOT_READY 01 +#define LEO_SENSE_DIAGNOSTIC_FAILURE 02 +#define LEO_SENSE_COMMAND_PHASE_ERROR 03 +#define LEO_SENSE_DATA_PHASE_ERROR 04 +#define LEO_SENSE_REAL_TIME_CLOCK_FAILURE 05 +#define LEO_SENSE_INCOMPATIBLE_MEDIUM_INSTALLED 11 +#define LEO_SENSE_UNKNOWN_FORMAT 11 +#define LEO_SENSE_NO_SEEK_COMPLETE 21 +#define LEO_SENSE_WRITE_FAULT 22 +#define LEO_SENSE_UNRECOVERED_READ_ERROR 23 +#define LEO_SENSE_NO_REFERENCE_POSITION_FOUND 24 +#define LEO_SENSE_TRACK_FOLLOWING_ERROR 25 +#define LEO_SENSE_TRACKING_OR_SPDL_SERVO_FAILURE 25 +#define LEO_SENSE_INVALID_COMMAND_OPERATION_CODE 31 +#define LEO_SENSE_LBA_OUT_OF_RANGE 32 +#define LEO_SENSE_WRITE_PROTECT_ERROR 33 +#define LEO_SENSE_COMMAND_TERMINATED 34 +#define LEO_SENSE_QUEUE_FULL 35 +#define LEO_SENSE_ILLEGAL_TIMER_VALUE 36 +#define LEO_SENSE_WAITING_NMI 37 +#define LEO_SENSE_DEVICE_COMMUNICATION_FAILURE 41 +#define LEO_SENSE_MEDIUM_NOT_PRESENT 42 +#define LEO_SENSE_POWERONRESET_DEVICERESET_OCCURED 43 +#define LEO_SENSE_MEDIUM_MAY_HAVE_CHANGED 47 +#define LEO_SENSE_EJECTED_ILLEGALLY_RESUME 49 + +/*-----------------------------------*/ +/* Command Block Header */ +/*-----------------------------------*/ +typedef struct{ + u8 command; + u8 reserve1; + u8 control; + u8 reserve3; + u8 status; + u8 sense; + u8 reserve6; + u8 reserve7; + OSMesgQueue *post; +} LEOCmdHeader; + +/*-----------------------------------*/ +/* CLEAR QUEUE(01H) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; +} LEOCmdClearQue; + +/*-----------------------------------*/ +/* INQUIRY(02H) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; + u8 dev_type; + u8 version; + u8 dev_num; + u8 leo_bios_ver; + u32 reserve5; +} LEOCmdInquiry; + +/*-----------------------------------*/ +/* TEST UNIT READY(03H) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; + u8 test; + u8 reserve2; + u8 reserve3; + u8 reserve4; +} LEOCmdTestUnitReady; + +/*-----------------------------------*/ +/* REZERO(04H) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; +} LEOCmdRezero; + +/*-----------------------------------*/ +/* READ(05H) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; + u32 lba; + u32 xfer_blks; + void *buff_ptr; + u32 rw_bytes; +} LEOCmdRead; + +/*-----------------------------------*/ +/* WRITE(06H) command */ +/*-----------------------------------*/ +typedef LEOCmdRead LEOCmdWrite; + +/*-----------------------------------*/ +/* SEEK(07H) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; + u32 lba; +} LEOCmdSeek; + +/*-----------------------------------*/ +/* START/STOP(08H) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; +} LEOCmdStartStop; + +/*-----------------------------------*/ +/* READ CAPACITY(09H) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; + u32 start_lba; + u32 end_lba; + u32 capa_bytes; +} LEOCmdReadCapacity; + +/*-----------------------------------*/ +/* TRANSLATE(0AH) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; + u32 start_lba; + u32 in_param; + u32 out_param; +} LEOCmdTranslate; + +/*-----------------------------------*/ +/* MODE SELECT(0BH) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; + u8 page_code; + u8 reserve1; + u8 standby_time; + u8 sleep_time; + u8 led_on_time; + u8 led_off_time; + u8 reserve18; + u8 reserve19; +} LEOCmdModeSelect; + +/*-----------------------------------*/ +/* READ DISK ID(0CH) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; + void *buffer_pointer; +} LEOCmdReadDiskId; + +/*-----------------------------------*/ +/* READ TIMER(0DH) command */ +/*-----------------------------------*/ +typedef struct { + LEOCmdHeader header; + u8 reserve12; + u8 reserve13; + u8 year; + u8 month; + u8 day; + u8 hour; + u8 minute; + u8 second; +} LEOCmdReadTimer; + +/*-----------------------------------*/ +/* SET TIMER(0EH) command */ +/*-----------------------------------*/ +typedef LEOCmdReadTimer LEOCmdSetTimer; + +/*-------end of leoappli.h--------------------------*/ + + diff --git a/include/n64/PR/libaudio.h b/include/n64/PR/libaudio.h new file mode 100644 index 00000000..3fffe9c0 --- /dev/null +++ b/include/n64/PR/libaudio.h @@ -0,0 +1,48 @@ +#ifndef _ULTRA64_LIBAUDIO_H_ +#define _ULTRA64_LIBAUDIO_H_ + +#include "abi.h" + +typedef struct +{ + u8 *offset; + s32 len; +#ifdef VERSION_SH + s8 magic[2]; // tbl: 0x0204, otherwise: 0x0203 + + // for ctl (else zeros): + union { + // unused, just for clarification (big endian) + struct { + u8 bank; + u8 ff; + u8 numInstruments; + u8 numDrums; + } as_u8; + + // used + struct { + s16 bankAndFf; + s16 numInstrumentsAndDrums; + } as_s16; + } ctl; +#endif +} ALSeqData; + +typedef struct +{ +#ifndef VERSION_SH + s16 revision; +#endif + s16 seqCount; +#ifdef VERSION_SH + s16 unk2; + u8 *data; + s32 pad[2]; +#endif + ALSeqData seqArray[1]; +} ALSeqFile; + +void alSeqFileNew(ALSeqFile *f, u8 *base); + +#endif diff --git a/include/PR/mbi.h b/include/n64/PR/mbi.h similarity index 100% rename from include/PR/mbi.h rename to include/n64/PR/mbi.h diff --git a/include/n64/PR/n_libaudio.h b/include/n64/PR/n_libaudio.h new file mode 100644 index 00000000..90ac3144 --- /dev/null +++ b/include/n64/PR/n_libaudio.h @@ -0,0 +1,352 @@ +/*==================================================================== + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#ifndef __N_LIBAUDIO__ +#define __N_LIBAUDIO__ + +#include + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include + + +/* + * Synthesis driver stuff + */ +typedef struct N_ALVoice_s { + ALLink node; + struct N_PVoice_s *pvoice; + ALWaveTable *table; + void *clientPrivate; + s16 state; + s16 priority; + s16 fxBus; + s16 unityPitch; +} N_ALVoice; + +typedef struct { + ALPlayer *head; /* client list head */ + ALPlayer *n_seqp1; /* for fade in / fade out */ + ALPlayer *n_seqp2; + ALPlayer *n_sndp; + + ALLink pFreeList; /* list of free physical voices */ + ALLink pAllocList; /* list of allocated physical voices */ + ALLink pLameList; /* list of voices ready to be freed */ + s32 paramSamples; + s32 curSamples; /* samples from start of game */ + ALDMANew dma; + ALHeap *heap; + struct ALParam_s *paramList; + struct N_ALMainBus_s *mainBus; + struct N_ALAuxBus_s *auxBus; + s32 numPVoices; + s32 maxAuxBusses; + s32 outputRate; + s32 maxOutSamples; + s32 sv_dramout; + s32 sv_first; +} N_ALSynth; + + +void n_alSynAddPlayer(ALPlayer *client); +void n_alSynAddSndPlayer(ALPlayer *client); +void n_alSynAddSeqPlayer(ALPlayer *client); + +ALFxRef n_alSynAllocFX( s16 bus,ALSynConfig *c, ALHeap *hp); +s32 n_alSynAllocVoice( N_ALVoice *voice, ALVoiceConfig *vc); + + +void n_alSynFreeVoice(N_ALVoice *voice); +ALFxRef n_alSynGetFXRef( s16 bus, s16 index); +s16 n_alSynGetPriority( N_ALVoice *voice); +void n_alSynRemovePlayer( ALPlayer *client); +void n_alSynSetFXMix(N_ALVoice *v, u8 fxmix); +void n_alSynSetFXParam(ALFxRef fx, s16 paramID, void *param); +void n_alSynFreeFX(ALFxRef *fx); +void n_alSynSetPan(N_ALVoice *v, u8 pan); +void n_alSynSetPitch( N_ALVoice *v, f32 pitch); +void n_alSynSetPriority( N_ALVoice *voice, s16 priority); +void n_alSynSetVol( N_ALVoice *v, s16 volume, ALMicroTime t); +void n_alSynStartVoice(N_ALVoice *v, ALWaveTable *table); +void n_alSynStartVoiceParams(N_ALVoice *v, ALWaveTable *w,f32 pitch, s16 vol, + ALPan pan, u8 fxmix, ALMicroTime t); +void n_alSynStopVoice( N_ALVoice *v); + +void n_alSynNew(ALSynConfig *c); +void n_alSynDelete(void); + + +/* + * Audio Library (AL) stuff + */ +typedef struct { + N_ALSynth drvr; +} N_ALGlobals; + +extern N_ALGlobals *n_alGlobals; +extern N_ALSynth *n_syn; + +void n_alInit(N_ALGlobals *g, ALSynConfig *c); +void n_alClose(N_ALGlobals *glob); +Acmd *n_alAudioFrame(Acmd *cmdList, s32 *cmdLen, + s16 *outBuf, s32 outLen); + + +/* + * Sequence Player stuff + */ +typedef struct { + struct N_ALVoice_s *voice; +} N_ALNoteEvent; + + +typedef struct { + struct N_ALVoice_s *voice; + ALMicroTime delta; + u8 vol; +} N_ALVolumeEvent; + + +typedef struct { + struct N_ALVoiceState_s *vs; + void *oscState; + u8 chan; +} N_ALOscEvent; + + +typedef struct { + s16 type; + union { + ALMIDIEvent midi; + ALTempoEvent tempo; + ALEndEvent end; + N_ALNoteEvent note; + N_ALVolumeEvent vol; + ALSeqpLoopEvent loop; + ALSeqpVolEvent spvol; + ALSeqpPriorityEvent sppriority; + ALSeqpSeqEvent spseq; + ALSeqpBankEvent spbank; + N_ALOscEvent osc; + } msg; +} N_ALEvent; + + +typedef struct { + ALLink node; + ALMicroTime delta; + N_ALEvent evt; +} N_ALEventListItem; + +void n_alEvtqNew(ALEventQueue *evtq, N_ALEventListItem *items, s32 itemCount); +ALMicroTime n_alEvtqNextEvent(ALEventQueue *evtq, N_ALEvent *evt); +void n_alEvtqPostEvent(ALEventQueue *evtq, N_ALEvent *evt, ALMicroTime delta); +void n_alEvtqFlushType(ALEventQueue *evtq, s16 type); + + +typedef struct N_ALVoiceState_s { + struct N_ALVoiceState_s *next;/* MUST be first */ + N_ALVoice voice; + ALSound *sound; + ALMicroTime envEndTime; /* time of envelope segment end */ + f32 pitch; /* currect pitch ratio */ + f32 vibrato; /* current value of the vibrato */ + u8 envGain; /* current envelope gain */ + u8 channel; /* channel assignment */ + u8 key; /* note on key number */ + u8 velocity; /* note on velocity */ + u8 envPhase; /* what envelope phase */ + u8 phase; + u8 tremelo; /* current value of the tremelo */ + u8 flags; /* bit 0 tremelo flag + bit 1 vibrato flag */ +} N_ALVoiceState; + +typedef struct { + ALPlayer node; /* note: must be first in structure */ + N_ALSynth *drvr; /* reference to the client driver */ + ALSeq *target; /* current sequence */ + ALMicroTime curTime; + ALBank *bank; /* current ALBank */ + s32 uspt; /* microseconds per tick */ + s32 nextDelta; /* microseconds to next callback */ + s32 state; + u16 chanMask; /* active channels */ + s16 vol; /* overall sequence volume */ + u8 maxChannels; /* number of MIDI channels */ + u8 debugFlags; /* control which error get reported */ + N_ALEvent nextEvent; + ALEventQueue evtq; + ALMicroTime frameTime; + ALChanState *chanState; /* 16 channels for MIDI */ + N_ALVoiceState *vAllocHead; /* list head for allocated voices */ + N_ALVoiceState *vAllocTail; /* list tail for allocated voices */ + N_ALVoiceState *vFreeList; /* list of free voice state structs */ + ALOscInit initOsc; + ALOscUpdate updateOsc; + ALOscStop stopOsc; + ALSeqMarker *loopStart; + ALSeqMarker *loopEnd; + s32 loopCount; /* -1 = loop forever, 0 = no loop */ +} N_ALSeqPlayer; + +typedef struct { + ALPlayer node; /* note: must be first in structure */ + N_ALSynth *drvr; /* reference to the client driver */ + ALCSeq *target; /* current sequence */ + ALMicroTime curTime; + ALBank *bank; /* current ALBank */ + s32 uspt; /* microseconds per tick */ + s32 nextDelta; /* microseconds to next callback */ + s32 state; + u16 chanMask; /* active channels */ + s16 vol; /* overall sequence volume */ + u8 maxChannels; /* number of MIDI channels */ + u8 debugFlags; /* control which error get reported */ + N_ALEvent nextEvent; + ALEventQueue evtq; + ALMicroTime frameTime; + ALChanState *chanState; /* 16 channels for MIDI */ + N_ALVoiceState *vAllocHead; /* list head for allocated voices */ + N_ALVoiceState *vAllocTail; /* list tail for allocated voices */ + N_ALVoiceState *vFreeList; /* list of free voice state structs */ + ALOscInit initOsc; + ALOscUpdate updateOsc; + ALOscStop stopOsc; +} N_ALCSPlayer; + + +/* + * Sequence data representation routines + */ +void n_alSeqNextEvent(ALSeq *seq, N_ALEvent *event); +void n_alSeqNewMarker(ALSeq *seq, ALSeqMarker *m, u32 ticks); + +void n_alCSeqNew(ALCSeq *seq, u8 *ptr); +void n_alCSeqNextEvent(ALCSeq *seq, N_ALEvent *evt); +void n_alCSeqNewMarker(ALCSeq *seq, ALCSeqMarker *m, u32 ticks); + + +/* + * Sequence Player routines + */ +void n_alSeqpNew(N_ALSeqPlayer *seqp, ALSeqpConfig *config); +void n_alSeqpDelete(N_ALSeqPlayer *seqp); +u8 n_alSeqpGetChlVol(N_ALSeqPlayer *seqp, u8 chan); +u8 n_alSeqpGetChlFXMix(N_ALSeqPlayer *seqp, u8 chan); +ALPan n_alSeqpGetChlPan(N_ALSeqPlayer *seqp, u8 chan); +u8 n_alSeqpGetChlPriority(N_ALSeqPlayer *seqp, u8 chan); +s32 n_alSeqpGetChlProgram(N_ALSeqPlayer *seqp, u8 chan); +ALSeq *n_alSeqpGetSeq(N_ALSeqPlayer *seqp); +s32 n_alSeqpGetState(N_ALSeqPlayer *seqp); +s32 n_alSeqpGetTempo(N_ALSeqPlayer *seqp); +s16 n_alSeqpGetVol(N_ALSeqPlayer *seqp); /* Master volume control */ +void n_alSeqpPlay(N_ALSeqPlayer *seqp); +void n_alSeqpSendMidi(N_ALSeqPlayer *seqp, s32 ticks, u8 status, u8 byte1, u8 byte2); +void n_alSeqpSetBank(N_ALSeqPlayer *seqp, ALBank *b); +void n_alSeqpSetChlVol(N_ALSeqPlayer *seqp, u8 chan, u8 vol); +void n_alSeqpSetChlFXMix(N_ALSeqPlayer *seqp, u8 chan, u8 fxmix); +void n_alSeqpSetChlPan(N_ALSeqPlayer *seqp, u8 chan, ALPan pan); +void n_alSeqpSetChlPriority(N_ALSeqPlayer *seqp, u8 chan, u8 priority); +void n_alSeqpSetChlProgram(N_ALSeqPlayer *seqp, u8 chan, u8 prog); +void n_alSeqpSetSeq(N_ALSeqPlayer *seqp, ALSeq *seq); +void n_alSeqpSetTempo(N_ALSeqPlayer *seqp, s32 tempo); +void n_alSeqpSetVol(N_ALSeqPlayer *seqp, s16 vol); +void n_alSeqpStop(N_ALSeqPlayer *seqp); +void n_alSeqpLoop(N_ALSeqPlayer *seqp, ALSeqMarker *start, ALSeqMarker *end, s32 count); + + +/* + * Compressed Sequence Player routines + */ +void n_alCSPNew(N_ALCSPlayer *seqp, ALSeqpConfig *config); +void n_alCSPDelete(N_ALCSPlayer *seqp); +u8 n_alCSPGetChlVol(N_ALCSPlayer *seqp, u8 chan); +u8 n_alCSPGetChlFXMix(N_ALCSPlayer *seqp, u8 chan); +ALPan n_alCSPGetChlPan(N_ALCSPlayer *seqp, u8 chan); +u8 n_alCSPGetChlPriority(N_ALCSPlayer *seqp, u8 chan); +s32 n_alCSPGetChlProgram(N_ALCSPlayer *seqp, u8 chan); +ALCSeq *n_alCSPGetSeq(N_ALCSPlayer *seqp); +s32 n_alCSPGetState(N_ALCSPlayer *seqp); +s32 n_alCSPGetTempo(N_ALCSPlayer *seqp); +s16 n_alCSPGetVol(N_ALCSPlayer *seqp); +void n_alCSPPlay(N_ALCSPlayer *seqp); +void n_alCSPSendMidi(N_ALCSPlayer *seqp, s32 ticks, u8 status, u8 byte1, u8 byte2); +void n_alCSPSetBank(N_ALCSPlayer *seqp, ALBank *b); +void n_alCSPSetChlVol(N_ALCSPlayer *seqp, u8 chan, u8 vol); +void n_alCSPSetChlFXMix(N_ALCSPlayer *seqp, u8 chan, u8 fxmix); +void n_alCSPSetChlPan(N_ALCSPlayer *seqp, u8 chan, ALPan pan); +void n_alCSPSetChlPriority(N_ALCSPlayer *seqp, u8 chan, u8 priority); +void n_alCSPSetChlProgram(N_ALCSPlayer *seqp, u8 chan, u8 prog); +void n_alCSPSetSeq(N_ALCSPlayer *seqp, ALCSeq *seq); +void n_alCSPSetTempo(N_ALCSPlayer *seqp, s32 tempo); +void n_alCSPSetVol(N_ALCSPlayer *seqp, s16 vol); +void n_alCSPStop(N_ALCSPlayer *seqp); + + +/* + * Sound Player stuff + */ +typedef struct { + ALPlayer node; /* note: must be first in structure */ + ALEventQueue evtq; + N_ALEvent nextEvent; + N_ALSynth *drvr; /* reference to the client driver */ + s32 target; + void *sndState; + s32 maxSounds; + ALMicroTime frameTime; + ALMicroTime nextDelta; /* microseconds to next callback */ + ALMicroTime curTime; +} N_ALSndPlayer; + +void n_alSndpNew(N_ALSndPlayer *sndp, ALSndpConfig *c); +void n_alSndpDelete(void); +ALSndId n_alSndpAllocate(ALSound *sound); +void n_alSndpDeallocate(ALSndId id); +s32 n_alSndpGetState(void); +void n_alSndpPlay(void); +void n_alSndpPlayAt(ALMicroTime delta); +void n_alSndpSetFXMix(u8 mix); +void n_alSndpSetPan(ALPan pan); +void n_alSndpSetPitch(f32 pitch); +void n_alSndpSetPriority(ALSndId id, u8 priority); +void n_alSndpSetVol(s16 vol); +void n_alSndpStop(void); +ALSndId n_alSndpGetSound(void); +void n_alSndpSetSound(ALSndId id); + + +/* + * for n_audio micro code + */ +extern long long int n_aspMainTextStart[], n_aspMainTextEnd[]; +extern long long int n_aspMainDataStart[], n_aspMainDataEnd[]; + + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* __N_LIBAUDIO__ */ diff --git a/include/n64/PR/n_libaudio_s_to_n.h b/include/n64/PR/n_libaudio_s_to_n.h new file mode 100644 index 00000000..de3e0f9c --- /dev/null +++ b/include/n64/PR/n_libaudio_s_to_n.h @@ -0,0 +1,120 @@ +#define ALVoice N_ALVoice +#define ALSynth N_ALSynth +#define ALGlobals N_ALGlobals + +#define alSynAddPlayer( a, b) n_alSynAddPlayer( b) +#define alSynAllocFX( a, b, c, d) n_alSynAllocFX( b, c, d) +#define alSynAllocVoice( a, b, c) n_alSynAllocVoice( b, c) +#define alSynDelete( a) n_alSynDelete() +#define alSynFreeVoice( a, b) n_alSynFreeVoice( b) +#define alSynGetFXRef( a, b, c) n_alSynGetFXRef( b, c) +#define alSynGetPriority( a, b) n_alSynGetPriority( b) +#define alSynRemovePlayer( a, b) n_alSynRemovePlayer( b) +#define alSynSetFXMix( a, b, c) n_alSynSetFXMix( b, c) +#define alSynSetFXParam( a, b, c, d) n_alSynSetFXParam( b, c, d) +#define alSynFreeFX( a, b) n_alSynFreeFX( b) +#define alSynSetPan( a, b, c) n_alSynSetPan( b, c) +#define alSynSetPitch( a, b, c) n_alSynSetPitch( b, c) +#define alSynSetPriority( a, b, c) n_alSynSetPriority( b, c) +#define alSynSetVol( a, b, c, d) n_alSynSetVol( b, c, d) +#define alSynStartVoice( a, b, c) n_alSynStartVoice( b, c) +#define alSynStartVoiceParams( a, b, c, d, e, f, g, h) \ + n_alSynStartVoiceParams( b, c, d, e, f, g, h) +#define alSynStopVoice( a, b) n_alSynStopVoice( b) +#define alSynNew( a, b) n_alSynNew( b) + +#define alInit n_alInit +#define alClose n_alClose +#define alAudioFrame n_alAudioFrame + +#define ALVoiceState N_ALVoiceState +#define ALSeqPlayer N_ALSeqPlayer +#define ALCSPlayer N_ALCSPlayer + +#define alSeqNextEvent n_alSeqNextEvent +#define alSeqNewMarker n_alSeqNewMarker + +#define alCSeqNew n_alCSeqNew +#define alCSeqNextEvent n_alCSeqNextEvent +#define alCSeqNewMarker n_alCSeqNewMarker + +#define alSeqpNew n_alSeqpNew +#define alSeqpDelete n_alSeqpDelete +#define alSeqpGetChlVol n_alSeqpGetChlVol +#define alSeqpGetChlFXMix n_alSeqpGetChlFXMix +#define alSeqpGetChlPan n_alSeqpGetChlPan +#define alSeqpGetChlPriority n_alSeqpGetChlPriority +#define alSeqpGetChlProgram n_alSeqpGetChlProgram +#define alSeqpGetSeq n_alSeqpGetSeq +#define alSeqpGetState n_alSeqpGetState +#define alSeqpGetTempo n_alSeqpGetTempo +#define alSeqpGetVol n_alSeqpGetVol +#define alSeqpPlay n_alSeqpPlay +#define alSeqpSendMidi n_alSeqpSendMidi +#define alSeqpSetBank n_alSeqpSetBank +#define alSeqpSetChlVol n_alSeqpSetChlVol +#define alSeqpSetChlFXMix n_alSeqpSetChlFXMix +#define alSeqpSetChlPan n_alSeqpSetChlPan +#define alSeqpSetChlPriority n_alSeqpSetChlPriority +#define alSeqpSetChlProgram n_alSeqpSetChlProgram +#define alSeqpSetSeq n_alSeqpSetSeq +#define alSeqpSetTempo n_alSeqpSetTempo +#define alSeqpSetVol n_alSeqpSetVol +#define alSeqpStop n_alSeqpStop +#define alSeqpLoop n_alSeqpLoop + +#define alCSPNew n_alCSPNew +#define alCSPDelete n_alCSPDelete +#define alCSPGetChlVol n_alCSPGetChlVol +#define alCSPGetChlFXMix n_alCSPGetChlFXMix +#define alCSPGetChlPan n_alCSPGetChlPan +#define alCSPGetChlPriority n_alCSPGetChlPriority +#define alCSPGetChlProgram n_alCSPGetChlProgram +#define alCSPGetSeq n_alCSPGetSeq +#define alCSPGetState n_alCSPGetState +#define alCSPGetTempo n_alCSPGetTempo +#define alCSPGetVol n_alCSPGetVol +#define alCSPPlay n_alCSPPlay +#define alCSPSendMidi n_alCSPSendMidi +#define alCSPSetBank n_alCSPSetBank +#define alCSPSetChlVol n_alCSPSetChlVol +#define alCSPSetChlFXMix n_alCSPSetChlFXMix +#define alCSPSetChlPan n_alCSPSetChlPan +#define alCSPSetChlPriority n_alCSPSetChlPriority +#define alCSPSetChlProgram n_alCSPSetChlProgram +#define alCSPSetSeq n_alCSPSetSeq +#define alCSPSetTempo n_alCSPSetTempo +#define alCSPSetVol n_alCSPSetVol +#define alCSPStop n_alCSPStop + +#define ALSoundState N_ALSoundState +#define ALSndpEvent N_ALSndpEvent +#define ALSndPlayer N_ALSndPlayer + +#define alSndpNew( a, b) n_alSndpNew( a, b) +#define alSndpDelete( a) n_alSndpDelete() +#define alSndpAllocate( a, b) n_alSndpAllocate( b) +#define alSndpDeallocate( a, b) n_alSndpDeallocate( b) +#define alSndpGetState( a) n_alSndpGetState() +#define alSndpPlay( a) n_alSndpPlay() +#define alSndpPlayAt( a, b) n_alSndpPlayAt( b) +#define alSndpSetFXMix( a, b) n_alSndpSetFXMix( b) +#define alSndpSetPan( a, b) n_alSndpSetPan( b) +#define alSndpSetPitch( a, b) n_alSndpSetPitch( b) +#define alSndpSetPriority( a, b, c) n_alSndpSetPriority( b, c) +#define alSndpSetVol( a, b) n_alSndpSetVol( b) +#define alSndpStop( a) n_alSndpStop() +#define alSndpGetSound( a) n_alSndpGetSound() +#define alSndpSetSound( a, b) n_alSndpSetSound( b) + +#define alEvtqNew n_alEvtqNew +#define alEvtqNextEvent n_alEvtqNextEvent +#define alEvtqPostEvent n_alEvtqPostEvent +#define alEvtqFlushType n_alEvtqFlushType +#define alEvtqPrintEvtQueue n_alEvtqPrintEvtQueue +#define alEvtqPrintAllocEvts n_alEvtqPrintAllocEvts + + + + + diff --git a/include/PR/os.h b/include/n64/PR/os.h similarity index 100% rename from include/PR/os.h rename to include/n64/PR/os.h diff --git a/include/PR/os_ai.h b/include/n64/PR/os_ai.h similarity index 100% rename from include/PR/os_ai.h rename to include/n64/PR/os_ai.h diff --git a/include/PR/os_cache.h b/include/n64/PR/os_cache.h similarity index 100% rename from include/PR/os_cache.h rename to include/n64/PR/os_cache.h diff --git a/include/PR/os_cont.h b/include/n64/PR/os_cont.h similarity index 100% rename from include/PR/os_cont.h rename to include/n64/PR/os_cont.h diff --git a/include/PR/os_convert.h b/include/n64/PR/os_convert.h similarity index 100% rename from include/PR/os_convert.h rename to include/n64/PR/os_convert.h diff --git a/include/PR/os_debug.h b/include/n64/PR/os_debug.h similarity index 100% rename from include/PR/os_debug.h rename to include/n64/PR/os_debug.h diff --git a/include/PR/os_eeprom.h b/include/n64/PR/os_eeprom.h similarity index 100% rename from include/PR/os_eeprom.h rename to include/n64/PR/os_eeprom.h diff --git a/include/PR/os_error.h b/include/n64/PR/os_error.h similarity index 100% rename from include/PR/os_error.h rename to include/n64/PR/os_error.h diff --git a/include/PR/os_exception.h b/include/n64/PR/os_exception.h similarity index 100% rename from include/PR/os_exception.h rename to include/n64/PR/os_exception.h diff --git a/include/PR/os_flash.h b/include/n64/PR/os_flash.h similarity index 100% rename from include/PR/os_flash.h rename to include/n64/PR/os_flash.h diff --git a/include/PR/os_gbpak.h b/include/n64/PR/os_gbpak.h similarity index 100% rename from include/PR/os_gbpak.h rename to include/n64/PR/os_gbpak.h diff --git a/include/PR/os_gio.h b/include/n64/PR/os_gio.h similarity index 100% rename from include/PR/os_gio.h rename to include/n64/PR/os_gio.h diff --git a/include/PR/os_host.h b/include/n64/PR/os_host.h similarity index 100% rename from include/PR/os_host.h rename to include/n64/PR/os_host.h diff --git a/include/PR/os_internal.h b/include/n64/PR/os_internal.h similarity index 100% rename from include/PR/os_internal.h rename to include/n64/PR/os_internal.h diff --git a/include/PR/os_internal_debug.h b/include/n64/PR/os_internal_debug.h similarity index 100% rename from include/PR/os_internal_debug.h rename to include/n64/PR/os_internal_debug.h diff --git a/include/PR/os_internal_error.h b/include/n64/PR/os_internal_error.h similarity index 100% rename from include/PR/os_internal_error.h rename to include/n64/PR/os_internal_error.h diff --git a/include/PR/os_internal_exception.h b/include/n64/PR/os_internal_exception.h similarity index 100% rename from include/PR/os_internal_exception.h rename to include/n64/PR/os_internal_exception.h diff --git a/include/PR/os_internal_gio.h b/include/n64/PR/os_internal_gio.h similarity index 100% rename from include/PR/os_internal_gio.h rename to include/n64/PR/os_internal_gio.h diff --git a/include/PR/os_internal_host.h b/include/n64/PR/os_internal_host.h similarity index 100% rename from include/PR/os_internal_host.h rename to include/n64/PR/os_internal_host.h diff --git a/include/PR/os_internal_reg.h b/include/n64/PR/os_internal_reg.h similarity index 100% rename from include/PR/os_internal_reg.h rename to include/n64/PR/os_internal_reg.h diff --git a/include/PR/os_internal_rsp.h b/include/n64/PR/os_internal_rsp.h similarity index 100% rename from include/PR/os_internal_rsp.h rename to include/n64/PR/os_internal_rsp.h diff --git a/include/PR/os_internal_si.h b/include/n64/PR/os_internal_si.h similarity index 100% rename from include/PR/os_internal_si.h rename to include/n64/PR/os_internal_si.h diff --git a/include/PR/os_internal_thread.h b/include/n64/PR/os_internal_thread.h similarity index 100% rename from include/PR/os_internal_thread.h rename to include/n64/PR/os_internal_thread.h diff --git a/include/PR/os_internal_tlb.h b/include/n64/PR/os_internal_tlb.h similarity index 100% rename from include/PR/os_internal_tlb.h rename to include/n64/PR/os_internal_tlb.h diff --git a/include/PR/os_libc.h b/include/n64/PR/os_libc.h similarity index 100% rename from include/PR/os_libc.h rename to include/n64/PR/os_libc.h diff --git a/include/PR/os_message.h b/include/n64/PR/os_message.h similarity index 100% rename from include/PR/os_message.h rename to include/n64/PR/os_message.h diff --git a/include/PR/os_motor.h b/include/n64/PR/os_motor.h similarity index 100% rename from include/PR/os_motor.h rename to include/n64/PR/os_motor.h diff --git a/include/PR/os_pfs.h b/include/n64/PR/os_pfs.h similarity index 100% rename from include/PR/os_pfs.h rename to include/n64/PR/os_pfs.h diff --git a/include/PR/os_pi.h b/include/n64/PR/os_pi.h similarity index 100% rename from include/PR/os_pi.h rename to include/n64/PR/os_pi.h diff --git a/include/PR/os_rdp.h b/include/n64/PR/os_rdp.h similarity index 100% rename from include/PR/os_rdp.h rename to include/n64/PR/os_rdp.h diff --git a/include/PR/os_reg.h b/include/n64/PR/os_reg.h similarity index 100% rename from include/PR/os_reg.h rename to include/n64/PR/os_reg.h diff --git a/include/PR/os_rsp.h b/include/n64/PR/os_rsp.h similarity index 100% rename from include/PR/os_rsp.h rename to include/n64/PR/os_rsp.h diff --git a/include/PR/os_si.h b/include/n64/PR/os_si.h similarity index 100% rename from include/PR/os_si.h rename to include/n64/PR/os_si.h diff --git a/include/PR/os_system.h b/include/n64/PR/os_system.h similarity index 100% rename from include/PR/os_system.h rename to include/n64/PR/os_system.h diff --git a/include/PR/os_thread.h b/include/n64/PR/os_thread.h similarity index 100% rename from include/PR/os_thread.h rename to include/n64/PR/os_thread.h diff --git a/include/PR/os_time.h b/include/n64/PR/os_time.h similarity index 100% rename from include/PR/os_time.h rename to include/n64/PR/os_time.h diff --git a/include/PR/os_tlb.h b/include/n64/PR/os_tlb.h similarity index 100% rename from include/PR/os_tlb.h rename to include/n64/PR/os_tlb.h diff --git a/include/PR/os_version.h b/include/n64/PR/os_version.h similarity index 100% rename from include/PR/os_version.h rename to include/n64/PR/os_version.h diff --git a/include/PR/os_vi.h b/include/n64/PR/os_vi.h similarity index 100% rename from include/PR/os_vi.h rename to include/n64/PR/os_vi.h diff --git a/include/PR/os_voice.h b/include/n64/PR/os_voice.h similarity index 100% rename from include/PR/os_voice.h rename to include/n64/PR/os_voice.h diff --git a/include/PR/ramrom.h b/include/n64/PR/ramrom.h similarity index 100% rename from include/PR/ramrom.h rename to include/n64/PR/ramrom.h diff --git a/include/PR/rcp.h b/include/n64/PR/rcp.h similarity index 100% rename from include/PR/rcp.h rename to include/n64/PR/rcp.h diff --git a/include/PR/rdb.h b/include/n64/PR/rdb.h similarity index 100% rename from include/PR/rdb.h rename to include/n64/PR/rdb.h diff --git a/include/PR/region.h b/include/n64/PR/region.h similarity index 100% rename from include/PR/region.h rename to include/n64/PR/region.h diff --git a/include/PR/rmon.h b/include/n64/PR/rmon.h similarity index 100% rename from include/PR/rmon.h rename to include/n64/PR/rmon.h diff --git a/include/PR/rsp.h b/include/n64/PR/rsp.h similarity index 100% rename from include/PR/rsp.h rename to include/n64/PR/rsp.h diff --git a/include/PR/rsp_ipc.h b/include/n64/PR/rsp_ipc.h similarity index 100% rename from include/PR/rsp_ipc.h rename to include/n64/PR/rsp_ipc.h diff --git a/include/PR/sched.h b/include/n64/PR/sched.h similarity index 100% rename from include/PR/sched.h rename to include/n64/PR/sched.h diff --git a/include/PR/sp.h b/include/n64/PR/sp.h similarity index 100% rename from include/PR/sp.h rename to include/n64/PR/sp.h diff --git a/include/PR/sptask.h b/include/n64/PR/sptask.h similarity index 100% rename from include/PR/sptask.h rename to include/n64/PR/sptask.h diff --git a/include/PR/sptaskoff.h b/include/n64/PR/sptaskoff.h similarity index 100% rename from include/PR/sptaskoff.h rename to include/n64/PR/sptaskoff.h diff --git a/include/PR/trace.h b/include/n64/PR/trace.h similarity index 100% rename from include/PR/trace.h rename to include/n64/PR/trace.h diff --git a/include/n64/PR/ucode.h b/include/n64/PR/ucode.h new file mode 100644 index 00000000..23b94102 --- /dev/null +++ b/include/n64/PR/ucode.h @@ -0,0 +1,260 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.15 $ + * $Date: 1998/03/31 07:58:57 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ucode.h,v $ + * + **************************************************************************/ + +#ifndef _UCODE_H_ +#define _UCODE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/* + * This is the recommended size of the SP DRAM stack area, used + * by the graphics ucode. This stack is used primarily for the + * matrix stack, so it needs to be AT LEAST (10 * 64bytes) in size. + */ +#define SP_DRAM_STACK_SIZE8 (1024) +#define SP_DRAM_STACK_SIZE64 (SP_DRAM_STACK_SIZE8 >> 3) + +/* + * This is the size of the IMEM, which is also the size of the + * graphics microcode. (other ucode might be less) + * This value is used in apps to tell the OS how much ucode to + * load. + */ +#define SP_UCODE_SIZE 4096 + +/* + * This is 1/2 the size of DMEM, which is the maximum amount of + * initialized DMEM data any of the ucode tasks need to start up. + * This value is dependent on all of the task ucodes, and is therefore + * fixed per release. + */ +#define SP_UCODE_DATA_SIZE 2048 + + +/************************************************************************** + * + * Extern variables + * + */ + +/* + * Symbols generated by "rsp2elf", included by "makerom" that indicate + * the location and size of the SP microcode objects. The ucode objects + * are loaded as part of the codesegment (arbitrary, could do other + * ways) + * + */ + +/* standard boot ucode: */ +extern u64 rspbootTextStart[], rspbootTextEnd[]; + +/* standard 3D ucode: */ +extern u64 gspFast3DTextStart[], gspFast3DTextEnd[]; +extern u64 gspFast3DDataStart[], gspFast3DDataEnd[]; + +/* 3D ucode with output to DRAM: */ +extern u64 gspFast3D_dramTextStart[], gspFast3D_dramTextEnd[]; +extern u64 gspFast3D_dramDataStart[], gspFast3D_dramDataEnd[]; + +/* 3D ucode with output through DRAM FIFO to RDP: */ +extern u64 gspFast3D_fifoTextStart[], gspFast3D_fifoTextEnd[]; +extern u64 gspFast3D_fifoDataStart[], gspFast3D_fifoDataEnd[]; + +/* 3D ucode without nearclip: */ +extern u64 gspF3DNoNTextStart[], gspF3DNoNTextEnd[]; +extern u64 gspF3DNoNDataStart[], gspF3DNoNDataEnd[]; + +/* 3D ucode without nearclip with output to DRAM: */ +extern u64 gspF3DNoN_dramTextStart[]; +extern u64 gspF3DNoN_dramTextEnd[]; +extern u64 gspF3DNoN_dramDataStart[]; +extern u64 gspF3DNoN_dramDataEnd[]; + +/* 3D ucode without nearclip with output through DRAM FIFO to RDP: */ +extern u64 gspF3DNoN_fifoTextStart[]; +extern u64 gspF3DNoN_fifoTextEnd[]; +extern u64 gspF3DNoN_fifoDataStart[]; +extern u64 gspF3DNoN_fifoDataEnd[]; + +/* 3D line ucode: */ +extern u64 gspLine3DTextStart[], gspLine3DTextEnd[]; +extern u64 gspLine3DDataStart[], gspLine3DDataEnd[]; + +/* 3D line ucode with output to DRAM: */ +extern u64 gspLine3D_dramTextStart[], gspLine3D_dramTextEnd[]; +extern u64 gspLine3D_dramDataStart[], gspLine3D_dramDataEnd[]; + +/* 3D line ucode with output through DRAM FIFO to RDP: */ +extern u64 gspLine3D_fifoTextStart[], gspLine3D_fifoTextEnd[]; +extern u64 gspLine3D_fifoDataStart[], gspLine3D_fifoDataEnd[]; + +/* super 3D ucode: */ +extern u64 gspSuper3DTextStart[], gspSuper3DTextEnd[]; +extern u64 gspSuper3DDataStart[], gspSuper3DDataEnd[]; + +/* 3D ucode with output to DRAM: */ +extern u64 gspSuper3D_dramTextStart[], gspSuper3D_dramTextEnd[]; +extern u64 gspSuper3D_dramDataStart[], gspSuper3D_dramDataEnd[]; + +/* 3D ucode with output through DRAM FIFO to RDP: */ +extern u64 gspSuper3D_fifoTextStart[], gspSuper3D_fifoTextEnd[]; +extern u64 gspSuper3D_fifoDataStart[], gspSuper3D_fifoDataEnd[]; + + +/* 2D sprite ucode: */ +extern u64 gspSprite2DTextStart[], gspSprite2DTextEnd[]; +extern u64 gspSprite2DDataStart[], gspSprite2DDataEnd[]; + +/* 2D sprite ucode with output to DRAM: */ +extern u64 gspSprite2D_dramTextStart[], gspSprite2D_dramTextEnd[]; +extern u64 gspSprite2D_dramDataStart[], gspSprite2D_dramDataEnd[]; + +/* 2D sprite ucode with output through DRAM FIFO to RDP: */ +extern u64 gspSprite2D_fifoTextStart[], gspSprite2D_fifoTextEnd[]; +extern u64 gspSprite2D_fifoDataStart[], gspSprite2D_fifoDataEnd[]; + +/* basic audio ucode: */ +extern u64 aspMainTextStart[], aspMainTextEnd[]; +extern u64 aspMainDataStart[], aspMainDataEnd[]; + +/*========== F3DEX/F3DLX/F3DLP/L3DEX ==========*/ +/* FIFO version only */ +extern u64 gspF3DEX_fifoTextStart[], gspF3DEX_fifoTextEnd[]; +extern u64 gspF3DEX_fifoDataStart[], gspF3DEX_fifoDataEnd[]; +extern u64 gspF3DEX_NoN_fifoTextStart[], gspF3DEX_NoN_fifoTextEnd[]; +extern u64 gspF3DEX_NoN_fifoDataStart[], gspF3DEX_NoN_fifoDataEnd[]; + +extern u64 gspF3DLX_fifoTextStart[], gspF3DLX_fifoTextEnd[]; +extern u64 gspF3DLX_fifoDataStart[], gspF3DLX_fifoDataEnd[]; +extern u64 gspF3DLX_NoN_fifoTextStart[], gspF3DLX_NoN_fifoTextEnd[]; +extern u64 gspF3DLX_NoN_fifoDataStart[], gspF3DLX_NoN_fifoDataEnd[]; +extern u64 gspF3DLX_Rej_fifoTextStart[], gspF3DLX_Rej_fifoTextEnd[]; +extern u64 gspF3DLX_Rej_fifoDataStart[], gspF3DLX_Rej_fifoDataEnd[]; + +extern u64 gspF3DLP_Rej_fifoTextStart[], gspF3DLP_Rej_fifoTextEnd[]; +extern u64 gspF3DLP_Rej_fifoDataStart[], gspF3DLP_Rej_fifoDataEnd[]; +extern u64 gspL3DEX_fifoTextStart[], gspL3DEX_fifoTextEnd[]; +extern u64 gspL3DEX_fifoDataStart[], gspL3DEX_fifoDataEnd[]; + +/*========== F3DEX2/F3DLX2/F3DLP2/L3DEX2 ==========*/ +/* FIFO version */ +extern u64 gspF3DEX2_fifoTextStart[], gspF3DEX2_fifoTextEnd[]; +extern u64 gspF3DEX2_fifoDataStart[], gspF3DEX2_fifoDataEnd[]; +extern u64 gspF3DEX2_NoN_fifoTextStart[],gspF3DEX2_NoN_fifoTextEnd[]; +extern u64 gspF3DEX2_NoN_fifoDataStart[],gspF3DEX2_NoN_fifoDataEnd[]; +extern u64 gspF3DEX2_Rej_fifoTextStart[],gspF3DEX2_Rej_fifoTextEnd[]; +extern u64 gspF3DEX2_Rej_fifoDataStart[],gspF3DEX2_Rej_fifoDataEnd[]; +extern u64 gspF3DLX2_Rej_fifoTextStart[],gspF3DLX2_Rej_fifoTextEnd[]; +extern u64 gspF3DLX2_Rej_fifoDataStart[],gspF3DLX2_Rej_fifoDataEnd[]; +extern u64 gspL3DEX2_fifoTextStart[], gspL3DEX2_fifoTextEnd[]; +extern u64 gspL3DEX2_fifoDataStart[], gspL3DEX2_fifoDataEnd[]; + +/* XBUS version */ +extern u64 gspF3DEX2_xbusTextStart[], gspF3DEX2_xbusTextEnd[]; +extern u64 gspF3DEX2_xbusDataStart[], gspF3DEX2_xbusDataEnd[]; +extern u64 gspF3DEX2_NoN_xbusTextStart[],gspF3DEX2_NoN_xbusTextEnd[]; +extern u64 gspF3DEX2_NoN_xbusDataStart[],gspF3DEX2_NoN_xbusDataEnd[]; +extern u64 gspF3DEX2_Rej_xbusTextStart[],gspF3DEX2_Rej_xbusTextEnd[]; +extern u64 gspF3DEX2_Rej_xbusDataStart[],gspF3DEX2_Rej_xbusDataEnd[]; +extern u64 gspF3DLX2_Rej_xbusTextStart[],gspF3DLX2_Rej_xbusTextEnd[]; +extern u64 gspF3DLX2_Rej_xbusDataStart[],gspF3DLX2_Rej_xbusDataEnd[]; +extern u64 gspL3DEX2_xbusTextStart[], gspL3DEX2_xbusTextEnd[]; +extern u64 gspL3DEX2_xbusDataStart[], gspL3DEX2_xbusDataEnd[]; + +/*========== F3DZEX2/L3DZEX2 ==========*/ +/* FIFO version */ +extern u64 gspF3DZEX2_fifoTextStart[], + gspF3DZEX2_fifoTextEnd[]; +extern u64 gspF3DZEX2_fifoDataStart[], + gspF3DZEX2_fifoDataEnd[]; +extern u64 gspF3DZEX2_NoN_fifoTextStart[], + gspF3DZEX2_NoN_fifoTextEnd[]; +extern u64 gspF3DZEX2_NoN_fifoDataStart[], + gspF3DZEX2_NoN_fifoDataEnd[]; +extern u64 gspL3DZEX2_fifoTextStart[], + gspL3DZEX2_fifoTextEnd[]; +extern u64 gspL3DZEX2_fifoDataStart[], + gspL3DZEX2_fifoDataEnd[]; +/* XBUS version */ +extern u64 gspF3DZEX2_xbusTextStart[], + gspF3DZEX2_xbusTextEnd[]; +extern u64 gspF3DZEX2_xbusDataStart[], + gspF3DZEX2_xbusDataEnd[]; +extern u64 gspF3DZEX2_NoN_xbusTextStart[], + gspF3DZEX2_NoN_xbusTextEnd[]; +extern u64 gspF3DZEX2_NoN_xbusDataStart[], + gspF3DZEX2_NoN_xbusDataEnd[]; +extern u64 gspL3DZEX2_xbusTextStart[], + gspL3DZEX2_xbusTextEnd[]; +extern u64 gspL3DZEX2_xbusDataStart[], + gspL3DZEX2_xbusDataEnd[]; + +/*========== F3DZEX2/L3DZEX2 ==========*/ +extern u64 gspF3DZEX2_PosLight_fifoTextStart[], + gspF3DZEX2_PosLight_fifoTextEnd[]; +extern u64 gspF3DZEX2_PosLight_fifoDataStart[], + gspF3DZEX2_PosLight_fifoDataEnd[]; +extern u64 gspF3DZEX2_NoN_PosLight_fifoTextStart[], + gspF3DZEX2_NoN_PosLight_fifoTextEnd[]; +extern u64 gspF3DZEX2_NoN_PosLight_fifoDataStart[], + gspF3DZEX2_NoN_PosLight_fifoDataEnd[]; +extern u64 gspL3DZEX2_PosLight_fifoTextStart[], + gspL3DZEX2_PosLight_fifoTextEnd[]; +extern u64 gspL3DZEX2_PosLight_fifoDataStart[], + gspL3DZEX2_PosLight_fifoDataEnd[]; + +/************************************************************************** + * + * decomp ucode names + * + */ + +// F3D ucode +extern u64 rspF3DStart[], rspF3DEnd[]; + +// F3D ucode data +extern u64 rspF3DDataStart[], rspF3DDataEnd[]; + + +/************************************************************************** + * + * Function prototypes + * + */ + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_UCODE_H */ diff --git a/include/PR/ucode_debug.h b/include/n64/PR/ucode_debug.h similarity index 100% rename from include/PR/ucode_debug.h rename to include/n64/PR/ucode_debug.h diff --git a/include/PR/ultraerror.h b/include/n64/PR/ultraerror.h similarity index 100% rename from include/PR/ultraerror.h rename to include/n64/PR/ultraerror.h diff --git a/include/PR/ultralog.h b/include/n64/PR/ultralog.h similarity index 100% rename from include/PR/ultralog.h rename to include/n64/PR/ultralog.h diff --git a/include/n64/PR/ultratypes.h b/include/n64/PR/ultratypes.h new file mode 100644 index 00000000..057d6ffd --- /dev/null +++ b/include/n64/PR/ultratypes.h @@ -0,0 +1,97 @@ +#ifndef _ULTRATYPES_H_ +#define _ULTRATYPES_H_ + + +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + + +/************************************************************************* + * + * File: ultratypes.h + * + * This file contains various types used in Ultra64 interfaces. + * + * $Revision: 1.6 $ + * $Date: 1997/12/17 04:02:06 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ultratypes.h,v $ + * + **************************************************************************/ + + + +/********************************************************************** + * General data types for R4300 + */ + +typedef signed char s8; +typedef unsigned char u8; +typedef signed short int s16; +typedef unsigned short int u16; +typedef signed int s32; +typedef unsigned int u32; + +typedef float f32; +typedef double f64; + +#ifdef TARGET_N64 +typedef signed long long int s64; +typedef unsigned long long int u64; +typedef u32 size_t; +typedef s32 ssize_t; +typedef u32 uintptr_t; +typedef s32 intptr_t; +typedef s32 ptrdiff_t; + +typedef s8 int8_t; +typedef u8 uint8_t; +typedef s16 int16_t; +typedef u16 uint16_t; +typedef s32 int32_t; +typedef u32 uint32_t; +typedef s64 int64_t; +typedef u64 uint64_t; +#else +#include +#include +typedef ptrdiff_t ssize_t; +typedef int64_t s64; +typedef uint64_t u64; +#endif + +typedef volatile u8 vu8; +typedef volatile u16 vu16; +typedef volatile u32 vu32; +typedef volatile u64 vu64; +typedef volatile s8 vs8; +typedef volatile s16 vs16; +typedef volatile s32 vs32; +typedef volatile s64 vs64; + + +/************************************************************************* + * Common definitions + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void *)0 +#endif + +#endif /* _ULTRATYPES_H_ */ + diff --git a/include/PR/uportals.h b/include/n64/PR/uportals.h similarity index 100% rename from include/PR/uportals.h rename to include/n64/PR/uportals.h diff --git a/include/ultra64.h b/include/n64/ultra64.h similarity index 100% rename from include/ultra64.h rename to include/n64/ultra64.h diff --git a/lib/ique/libultra_rom.a b/lib/ique/libultra_rom.a new file mode 100644 index 0000000000000000000000000000000000000000..2c9eeb42a26414ee2454a49ca2fb4ead0639dd44 GIT binary patch literal 1381082 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�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�RAV5c>mBwIEt~k(-#4lb=jNJ!oo5LOsY_gRdTBXwXocvY0`@ zgsFi+APGFj%+RxhfrBB1L8507$V(DJ49)_IQ(PdY94%SGAONaU7#IY=er{kOXOxuz zG&T>aS3n~*AWJ|PG|CD}pFYs}Kph4KMo{_!)hoy?H&Cx?2}lEIBm!w&6I2L^!r!Z+ zv|h0xSg$}MmehI$t}VaV7o0R02#=~FDTM_9C|!cspt=A=gUSRDjSa)p;;TufPqRG5Joowq#uM~ zr6QxAO}-|c+lwvEVT=$l@Cz?Az`%!dhLQs9eV8oQU}U!5Yr$n zZBV?S^;Q^mFfcHIN_up4=(P)|)*z;K`NP1#Kuqld8jC|N2S9EExdB8Y*DfHlh^bvb ztyoan1(^ZDAag)8PCUqJmk1(j7jVW;Pc2C*O+)M`0|O)I3>FjUjto#;08;~^ zL3IIa?3$9g0K5(WS{D$rwgXfy!s-GLn}c9ofE-bzRtczj!HW+egIZ3dX^`y@MAQ@R zsU_%|Kp_Ykl!VaWwGNkM4#(CZA4I%4XK3VeV(9i%zzAv~fb9cK zEiy1LbwD|k)F7bMNw6M-6v#YiZ30e73ZQfdEoq_a*TK09x|SNmCaMMjM-&;g2UH(w z%@Legl}gkY7ILD2Y65u>>K`m;1VLm`NpLuTgmBaxpnYy245~Fi7^D;#gY<*&Xw88f zDhT#atT{ln49o|hI0wZqdd&gq=@Zl20L^g{Q*(gKBBtg5B+ZYM;Hx)mn3k}ZI57zHI5RL9Bs0heB!Koc z3n+qmBq~e{j3630@EahjACZN?Yyv$KP)`>$N(E|dfYn1<$Bdv==%D!!(7Xt!XL19y z@q&SY3A8E|rVi9I0nM9%_>|NupnYtxdIdD<1Y?8K8J2nll)hm-6A)X2V9%tuK##O4 zrMN&JtOvZVtiUC;EHgRPskFF~@O%iS4p8ubG1x!Q{na1=PThS==L6pcTY0H6R++TS4!I;8KU)3jwJEmBS#j zKo}I4pm;+cx#}Qpo}CF)M}YDK$Se>BnFXTJ=S4t!!-=U&K%-2=)Fq(#RATB9(0U#t zkb|HY<~}GFlNw}o325qok>F4SMj=pK0P2I3B$hxc6v8!$ktwLgQBWXi3@ZkFT@Iv< z)?h$e&uqiIgvBHoGJD>W!~mL#LoUVPK~A8i0JQ=@y%=m`Sg;<50RsagtOo*GR|qp3 zR8xS?K>_h8sVOL3j|@894b(UXr#b}%a9Hq`KE@gsaE$?qEsUTZtuYuF z7!VOfMvVcBV_1y=x_^w68Uvvo8abd`24aFrdk_uE^&lD>hN;EX#{iizT4RjX7^5`? zcsVa33(V(SnwT2-7{Qjko}kQGcLqyrk9S`t9GQbJY>3LK<17O3~*BX$REOK(9qW{R!k&B}ffOJ^Dx$C@&M!?@%FfM+j&{ ziT#*&o6Psxd(GA)pgAK$d_oXr&fto&z+>1zo+% z1WMJQ8U{IKg7znZQVmECxQ1z9#(Flc0*%kc^&z5$fkiao>VX020weIW2tq3)@dPE7 z2c;∾*v1%7su5(T_a40tz}XhUGR`4g`faSONv3mNGJpK%S6hGUpI^iy&`=3$$oK|du2bbcLZJ_lwX$n7Bipr4WhG7DSH z2U=wYQV-S73<@XY@&zV`zETWyRxlB#Ag&8OuK<)$i859?=FagB}Xf?GH z)Da*GW-o}16=SLSKxV_$61mqASv|;o$b66+k=+4egWL{N1LA|y3yALnuK5@k;G>3M zg~W}(5h|R(r`Uk&$?~Gi66lgLf;}yBQqHtzzC%Gh$%OgEt>PgVOeXz9xpz~2-Y*1Rjwz~zq#sS(B1F;F8 zPJRgZ+AdI9H%mnENVR(4~;(%q)3F3CdfV6}2>1bU^R9y)j0bxL{13_gasO&?EFE-ej z0m$k=<^Eu*D?#-ZEY*PA4oVB?btNdD5>r=#+FQibl@-LD*ACvlNlaY{+7AxuvBLZT z@&k;Gl^$euCFJxR1_t<=4ASaKSaF86a6;6TDY=QzE~Ns&y3*3fg!q*YEH(t{${Xu9 zGsrMB%uodPEf+xgmJA0v6xVNJkXXN;K>?I07#>Uj^)Us&btlsj7A6G+MUeQK00su= z>Is%LNem2P2@K4jb$J{N43Z{J3_K=I3><3C|NpN6rvPw0tI)rhL8gBbMxPWk>cFso zp8m?$9lRzFrU%p~1=XRTJ}IbO906S)1nQH5`l>K>tPBj`b|i=o zscZSM_DMAe^hrU%0jpm@GvP2cIK5+8qX%9e4y|iJ>>lF!q@aXCUQG+p2}y@RiRHm1 ziA5zYxrxO0N#QymW+3%S^NYhWi%Lopb3*b1GAfHRlM_L!?Li@mSRW2*tAj*9fb1WDvvmgi?i5g; z59D_c1{aCY8|gv)5Re$?G*M700QKdN>sU~jq1DCgu$529>OlDky)Fjr(1Dr_reOA> z_gitPL+`hO)PdXwHVm?^7rZ+Sz26Et-E|5~5t2Iex)`)3n3%d46n4ba#h|e=BKoat zpxv_|zktFF6uzLm0SX&XT)^`J0|PtAZJ<6h%qyVu3}a)Z2U%U*1MRmO!yF6pBm)Bj z$p2s=FrVmtEXf6$3iO0l8wLg*P#A;i7M9|IlEmU{SnZ8C*}($Gn6R-SDQD%ecMzz* zUx4au8vzCeH386B2^xy)_cMrq5`qdFgF_z+gFrw718W}(bgYN~VbFkz>wwILifi<-Fz7(V4Uoij`dAnYpyC!t;s$*z z3>E?n46IBH0^s%o)Eo;Czkff<7`24@-v19k|*5u`<}KV`7k4$I2knr_8{j!t(zgLyCmTI%NiyJ|+eh11AO+0S5*) z&=`525`%?`6ZanmX93k77Y2rPEDQo5b3krYVP$Xt(=6HyDuVz2+pw^Jw>O)#2rvi) z{{IW&gTz%>7#M9>Sr|-~@*iMgFaY~Ug`L4cAn^Y$kQ~SikpDy+{{IE>L3%*y``8#b z`q&wGK=LL_!DfQhV;h4|-~0c?`uz+7Ahj^FKs1Q2!osN9zaKuP4=%?xFq7PV04M65Y?!N;ianNE|7SMdb2?hoh(6|>90|RRYR1JvYWnf^1?WKdXpCI?$ zp||5Cu(Y2*?K5W3IZ?#V12BTtWwV0yFko$`VY3HZ&O!Iwk#e>asQd(ns|9%ZFzC)A zhC9%98fcgE9SH@{o)ZRr1_nkJ1qBAs9UL|c42%yXAb0P9>Lt)@Hpm?Cia(Bg@a#U= zJy=)QBJS)0nFU%q1uk63Xz@Yy#bdP0LK2I!8S;yR3qTB?{KOPE2V5Sy=QEV#7Q}RLhiDD}caxG5le1l%6O%Jiq0562Yd0WGPRMjUgpJ&Ug@~Xu zNFm;X`3RIyk!I~-=MI4rI8+Xu0>=?Z5Jy`SWJV~oEdYvNkWyp}s&_$VK;jX}a%4qd zHi2;9{sc8J=X#5>W zX&uz=07;L)wlEX8*#YuA(yn_@KLsgWaD(PWL91(!+qj@GLu(83z}hm%>OjRkT3Z<9 z9w3m_FgJk89FV!7^at9K2AW?2rxTDOB=@1Ug~8^5%Q~n!P~HHg8ML-AQw9SA3-Spz zFm-5cVKz{m0%~tUjRUu#Jb53AjUJyk62yXHBsW1t(5OMy7QO@8#LmFL0K13Hfe})7IKrF_@-zbj zgF6~O8dN5L>MLkl8eW$})mNdZ??U5GL*s+aAqERU_3s3g3820p*nEO*@gY@#a4;}1 zgQ^1_1_ox(o=ngkhM@EXx}gC?gYGB<(J>4Rydb&+O7}qNB~W?~lzsz>2S|G52aQ)n zFfa&!=nMu1K@i=;z#s&o=P)n`gXld_{tGDo2S`1n|52HlngdytLU8=h+{l3V@k8bn z1p6P*_NfXB3uvtg_zY6@z2LSI=;BmpvH&L$IDvmWj{(&01+6gwz82P}h5K-xbbQE(g~wU0pk6xhCJkao~q9qeW%P+b7hGXmQu zko8_5&m-0UXzdd=(274$7$LViKzy|J2^;7v29Qz6>OlDvt$o6P+(rPYhm`|p?Gv2p z(Ap)YPS*5K4ArgGcogKAU}X^ zvH*o02!qlyh{lNrS^Go=T>mqG`o<6^gA)Lu_5iF~h`V3{-y^JVYGekf!yqK#I*+RB zOTc4puyHofdQ1i;B_;zWh6d31l0gdtBWS!yh57$q1{VQU24?}4bxaH_u<1`LdQ}->#Sh& zT;Q^oz zg9gKa1&S(c3>=_yn^c$?Sk`Z3kTLkk@PGY&27~pR8C2FWFqN!hV5(Thz?86#fvIL4 z15?U62BwU43`{xe7?=u{F)=VKV}`6%nY@|7TaAUGLXDMS0;pjMG8asRA^wB zsG!KeqR3#w1iIS^dMH#AWIYRbo`!{ig~>q!GM~f7G+Tv*ffI>8M}>uf4~ah)o zXPqDeOP@1S0)vBs;yPxCzt#mXCG_vdy52@XeeeGppfx@W4HLloNf;P9Am)SC11*>V znsZYC*#$DcFMugQ2xO##f?}9313ME#hoX=I19Kk}18Ct*!#X7>?ZlMOC&0iU#_<0e zC=G!0g6RJJ3^>>Qfc&Y_#89EW_x}M=!ustDCMx1gv)6B9 zFi;U=ngvQfDxyqtKxs!sglX>j{R|eMbjFmRps2nSGGC^`#=zLWm_b0GoIy|{iD{02 z17u03Kp6ukNF4_Q!#t2$fl^4C6)0igM;7N{U^oVfBMt_Jxgc>K21aHyz8x~Z&j1ug z{~v(TMjs0U3&igRiqP=*4HAc$rM~z7h4mX5RKR}S&!Dk>1A{`J5>w6k1q>qV7cfYu zI59A;Q(~&&U|_hSX24Lv!@xKTWEW_T669u>*(%Kc|BE>P|IxpcL7-2G3Do{%?^9wb z5pV$KB_{u=Fow5b0kAnmcA(4^j^@Lx_QavwuH>29tt@B36GYXn@vJYxHkqQ0d>m zpa6V32!Q;(PJyWe)NVF#Vh|8;U=Rk`2lA&H z3z*NR!VFGtEPX5t941Z-3I;6<>>|w!{GhgVpAu8XIwl5&K4qo?kpu>=bp}is91M&a z>kOC*K;|$pXn^O8Rha(&Wk`}x;bCAbU&qYA0tzcEVIlwx6A>I?BGA7Kl!qZ<0#4hg zc~%3fU)7l^RG9w%L-KD$&tnD_h6fsoFgLAv%)rv8##AD50JJ6?C7!6^CY1SfAq56b zSpEj(QBYWe=GMiSK&So)C~`0`7BMM+?h*p8+r!vH2A-P+?MDNZMf({tI|z`$VO#J~(PbIl?K7H}Mb%0kfE z$c+pl3=1G@A{h=$0GEwI3JgM^@at2C*e#O8z^rBfDSJTS3CgQ|N(?M2%>U1W`hXz! zuTz4Q3m`c$BL=2*g-j*uikK>d92odP=_n|Wfe*Akvd@*lre_%gL(g)E`aTy13l(Mt zMsQdtGcbT@1qK$7UXVVJ9&BqW!Ev;oL7=CFsidbF>`q3JBnCFnx`Cc12JrcbAa|{4 z0{2hhW4GY)2^6;v8o=v7!F2>EEI{?b76t`SeZ77wC|Fm3!a@VIPNOf7DWlH`Tn35s zIWwggF)=U+I52?wh(QVrZ0nL482XgJaV`+zz~H#9kbwa#=ERf&>MO5vU~1?A?TBD* zP!VZh@L1=TO43fy|`;-}243fZM!49<_ z93~)rpz;XhN05C6Nem!&a2YXyX$}?U|NlVdgUv>S3)4Cmri^tCOa(%s3~Zpb2UCKE zB2xos{RyPp2IXPsdK!)XtqdytTX5FBpf)=wse&-5Psy<1KLe?EQSvb`aDnEKR2dj} zk>?rZ7#R5eFfcHxFfj0!FfcHAFfa&!=0BMj7=%D`Zy-BCSc8E<7&O)eVnfF3?Xj-w zuwcNrGmH^5<_1|m!VcC08mj}D1H)MMkurkT{zBG|5WUWq2{iY}4q9^pGZ=%$a2peN zd=;dp;Xl}Iur)F;tqz#}VFrzFa)b3?-xq6usR!K5;Kic{%erM2kX!gk)58inIYJPR z9xP$a3Yyy$2J0bue2EQ|mPA2%U;%|eV}vyu=%yfXke&vj%hA1d7fWlxm0|VP03k3#{n%xWx3`Z0c7(i?6k1#N>H&{T_fKEZP zPynSu28MGC4D35BAZpHm?kZGJU;vFb-Ug*54u9|(tjC~nIw<=!C`_PiSX>~Fy@6^K zkXG1`9Vo0pd~kd+Fo44n#E12LL16{rgTe+xgTewtgZvJnLH+>IAisfVkY7MFXx@;4 z0n%Y7X+{vNMITJ+fo20Cx7Y@Qdj6$3sYRgq!DPpj6z81G)VvZfFDNxPzbq9=z&*9Z zIX5McAwIr1**7sW56tjL%uC5h4N5I3N=ybV$|_EViUbEB%ez2$pao^1jqa6TIS|h| zKer$!wFIKov7jI|FU2RbxCAWkT9FFc_E($?8|yDlhB=rar64{DbeM2T0px0vw9KO7 zl9J5aR6Qeboke&W0W$<3BEG4`>4BxGrKt?Ct3JareG~H%)4`z>mg$?Hk{Xhjlmn6v z%M4B}0SSOtusP)8#230MFBxaV(F_uRqyo^oKTxtNEh{gK``MgY!HC1A``n3+n$sS(p?|Ed#7DKvDvd z1DOG;UqR&us0>Gv1~Wl>azW}Kc^%(?CGqpz=zCN^?IPHCKFBUm*^bOl0l5TeogldV zg~SK10Yc)VuM3<8syC44-RGm3w+@ZJ2dTaSx#tv`{B@*y3nUNPZvm^XKz#5?xk&E$ z52~LK_A?5C>Lnz;Jg7cG;)C|82;kEWvC-CAaKiRHgVca9OdZ-<3$QwH`xK-I)J_7W2L=WP zw6zvopt*R^eru>QaJdNz541TXQINev%pr+^{Elr73AC;PWG?h{Trtr4P6e2yNNZZk zP{SD*huEdv@kF*f!AzH{390 z1_oGK1&c8=fcGqb*&u=$Jd6)wK`=8U-NO6{5(Ke9egUyT7{mvqTafczpld$R_h-3+ z6oN2RV>pNn!cacw3L+4f0m=vUEs*)uU=AXp(buF-2iHdo3~!)oV&QoZYTkM@{d+<6 z5d#AQ0AHm(jr~s~y z7#OBN<-zOHKxRPP#|Y}Hfw(M;;F~!aLGziQGy~&%g6ks&h7hR!2ylJGz+eI8CxPoD z2F4dqem=N9VqiD|<%8y2LFPllm$3s}A2BfWK;>tG>LXD94B|gV@H&5x2B`ZEg4iGo z<%8B;g7Oi}eNRDhAPkiU*VhO>6DZw-xKR6<#K0VQd@_OV>HrHt^fQ6-EP_AU*oXDH zMjQK}&IQ&zOGGvH3!wWpL018R@>d6R9rhds20l=8egOjmAE!oUDpkIk?Kw7!~w zfng71JvPG`D18S?zk#mD29(V7F1XW9a#LG5Ue_z@`o43xeCrSCv#sJWoEi*hWGx`+`( zgVs!gXb*@w<_L&A%neX}2b6}|$9w|Hf5N~3GKa;1fkBmpfq|t4BF-`cN<-DLK<#G* zoiNM7z`zPxs|}(HAnI6`FfeF<_-hy#G(j}fKWr=z^VxJ57?@ZY7}yLL7?{`?7}#te z;Sbv13>No*iu*7yXtOXduz~h^faos_3_2_f4D37%47wm%gn>a1M7uCB=!570h`H<` z5dG|+vmjU*7}#T={3Q$w2B0=6G<-Nb7#P$+`~n6B7FGrZjtT|_7B&V34rq9DfX201 z7#KKJApYXafzY5LixCuwptuInpf&6unumb_EG_`0MWD0>UQJ(15LFw8XK0 z*wB=!cW5=3I59|o<~aOmrC?E%vlk^668VaMnD*(7}ivVt_uOL8-VVe0`CQbvOzf<)YkxM0kfg%LA4BQ zT?mLx#6Bu`M3Y|Qz>)~8#zC9_O>qAdq{cyLfbdbeIv~G+FxY=Xv=#!n9lS1q=5uIz zG@c&=#RTyfTWtlZIbbHhY9Y`(7JLktfq@M)e+laAA@3mu@jBATp<5|T!cYD(~;CD3v9#MhND zEs*qyt+E9B7qnUe6rdFL*g$iUpz;}1?t(DXNH_(u3xuiFV*{B5URE+%SB~yC9-{k= z!Dm22a|kFsLz&nqGS+N><{;sQQFo070|n>VXQE%WfjsyKaxbE;1RXXGt|<}c;o_Rl zGBP%Wp5>9iRqyKK#>j*eq>SJ_JV*kp3Ml)HvD}en!?XlErv=~Jx}QM?v_A>7R|{pH zYe9!12Lpov=uCUi{xC5o2Jrq)Py-Wo1}tdLkqz^b2GH5|VGay@AU1TL8bg2s0|$r? zQV;Sxn09CY?;8f~?*hqjFfgc_Br~v>Br^!uFv%Y9W5!7b|^d^Y;V0A?F%|UCtnZb98K&-{JHWhr9DG_T^SwMI3U|XAtwnmf%v=5VS)?{>>3OVV84LE3=|Haumyz;C@!F30#XfHi^2ffvk2mVFepwzG)_Fo z+8Z|@YYG_%tqF~Uc?c8;3=9mgHMy|qk76`=&^|M;5LA61m;+l=NZeEyayd`WLfZhk zUdRP>J`3blUhsVaDGUs}poz5%1_oYGzAa&3-~*+L8t8ho7RY)i(D)Q+Jr~0k&^ol@ z%*5nkq$Naz#wLu+4M;fOg-wP)d+PoS{N8$XJCNL z1D%@>+OrS3*A}$j9i|3k2jc8}us!ho?Xa|hPH$jj0IeZM7iPe778@wLbuci1_DzEK z3B&YqFfcHI+D)J}-k@@K2lRY>CI$u;@EAW-AvXg93uvz+hzl7TA$qSYLkMW;0k}kDnif!LruouD)h8g~eR?qLP7 zZJ_7p+c7XOOn~lT1+hWvu0ZDafdYv1^Yg)(gY*U=C`-XcaUdH99g~w&i;E#!2SH7@ zV9-1oL=fD53(gEm&4KcZGa(G8(llb%azQkJjd#rhH3UR=k1_lW> zeefP&5Fgx@gqjE9=YtGEYD+ev@j?6GVd)m69$YsgsRyl{hoxUoy$;eo65E=fvJd2U z5QbLK3}|glE>PPCRCXe_Awgk=*4E?#^-DqKAgcrEMQ>|@)WGaQW}~+?L25u4qy~gx zZ1lD!NE}?offPZog9ojx9(0XVFBHEg)pnXO}v^7~l z=MfOm*5m-KQwGgXg2D_Gz99F3{07Q{pgae1Gid7+s6GLi3FYI?elP`~$`8f{(E~gW z!~)s~%D}*21#$}m149V3?Fotpke?+48UBAlYFmQ#uYl?zPMd>NP}91M~e6apL= z*i@1kKnL&gStK)vfW$%^7#J;*8AKUaHJn5i{Qm;dqr%F-3ey9VS6TZ1f5?LWzd_=l zwyHrA=sXGu(3yt{Dy$3*6WSRV7@i{A#|RoPNju`5oA8HI+bG#j5>!HI6@r${{qQD?fwr-zYPo|-xmeiG6p(dpNoM3<=zuE z1_mZjS)Rbazy#WV=K`M91zkzT06rTVW+iC<$rUIE+}?$K85lr`o7C1QL=ULx=A55b;+T?Blv-TuTm)&Jf`nWWOAv2e=Ibs{g@xALIxI1{P3W z24M&nk=8-u%%HRb6=wmB9}>|HV*#}vh-ingf!08P+QpzS1BEXrKY+pptsTY=>Qf-^ z!$5Kq)M;qcAZv%^K-)>6HZiEot^xCj8IvPiIDy)-pm3W48bi}JH8FI|*|Dxi9G35XAuWdLn5 z1^FLI1j58KmIR7t(0WqPTpcKlKs10?4l{znF@u2te8;s30|O&yoE~(pKXSeR-Q@_X zn?d?Wty@8M!|F*PkO9zo5>y7@t0zHmp$t+FttUZj5okRLHWTaJH_17viA9MeB}JJ@ zr6s8(?wczp$}CCM$1tL}z!_w!Bg|AH?!m#L1>_YF2D_aBaqm0GpCEB;7^W82oEm6; z3zQZ>W`Hod86f>24DXA9IOvMNeB$aqP}u@fj;Qb4ot>=|G~E3{H5F3RlZ$nY^ehea z%*+%FEiEk#j15f`G{C}!dWL#N3Pq_osfop@nhXpCmz&aN_6jsV3M{ zc?!|(VgRL0kUChnfzDKcDgjfVvK7PtwLd^%LP#C@E(nl$$oUHtcOd)FcR_&eoB^o? z*#*Kdb?CbwKzSQmy#rcL0x}n*7c@--TK5WSFG2a>It;`{n`>eQOzzV9zK=;mo&H@321IT@#utBSLSV8UsrB$dtxVJ1PRRHHy@5fe*u zNPR<0kCWL0UoA3u5rgo8RtAX$Z48nN+8LxkHOYb|@a!$fN1z+j;HPPT1)u~4wTKV2 z76Hvbf^KO9_2^(NJCNz1S_E`DCWuW*Edokiu$lv$i=Z_MI5yFGTc8vP+Q|T0tqEdF z5UxeQ5l32o3R-zUbru&mgII)nPH=^wP(id9K_l8A5s>>qG&T(OFGvF3y#a9`7$gTW zLkT*%h|L_38W4u(BoGIp9gQ5V9Y6sBD;+?k0w}0p;f7p7BdeoF?EpW~1{%*GccIq~ zpc0yx+5vRZDG{{;({ISkGRUi746+l%0MSULG&og)>?Tw@fYgA}D##2F2AKn*apFN% zJ4g^)JAg|Bu8ho-RHRBlfncp*W@bV{tx$ndD`2i;gx~uPx<>?bUOT8}fZrL$068}S zJ?JT@6+magfbP|_U|?Vbr7%#ffP9`dXuTk4?h9lkxK;pF5&!@H2c2~Z5`$qv^T(j} z2dq{ApMy)FRsgO2gVhQkHsO0U!4XGJr2y4fT;P$Jl1gyhA5>W}=!{Y1J_j@)V7UX- z_5ulEE7?KfAPiHBtN#Ep1JwQnnE}EeJ;)fOAB15g9qxu3aWw?UEKsS4d(9lJ`V;h9 zB1dc=18vTd4Rn?oC=DZzfr0p-+6F0Z*g)9>6i3MFKz(|&u`&i+wG!G`8BTR*V`X4< z;MNw%a-`Y@ZO#&WPbO$i3#ts)`Zy-gcpA1^32m&52{eXCM6JXO%JW2wm9c`tkBG4{ zHc;OXo4qi9VbEA=C8T%*_gTPIB1|KWvpitZpaFhR{3G*0EniR`f{B6HuvQ6348#Ye z7Z4kEPbMgjgZPm3ZiL3la2GzHGdWp`Q%ewoEBX3_>n>A6QpUwXQ0gvh<6^D?s-XG` zG$z)-zyKQi0Q(J@AW&CMCS=QP}wB zi@W$HVF^Q2b%rZw8K2=r|aNO~gqc$PqJg+~6}TROg*jM1jmN%- zI{^f(d??PyFDJ2&L&Dl&=FvV51NhDoLiGlyUqf0S2OM!^)fb=`2iFrB`Q=3Pae_h0 zFh)$l2^uj925Y-uE8n3?5nU3L#uY>sRQ`j^813WG{`^5u7(+sx0n*fj?i&NOS)t-= zpm6|Doq^nU0r5d?8l*U8Yk_J&RtG9?NBcMo4Ak!9fY&iY!yA-epiJx(mbwWk-oSMe zN;Vv%eH?s+52T+19?eJ8VDK?I9CsTV8k?FKfCuS_nYqzL?dPD~Z4B<;v@(b-X=Pvl zv)dS$zS7z#r2yRT$n+3 zEAC^6SihYiWc@aVfc0A$eAaJa@L0cz!D0PI2AlOu7!rDV85nFh7#Mmv7#R9jG8FW$ zVJPWe$57F~k)fu42SY=<76VfoKZ72_3jr+w2iAN>h6UigI6X@lSQu5oVp$9eCMbgT z$n>-@a4@zAXo)zmruFY*hydMH+;fb9hw&I#ERo?rgd)QekRApehIR?%{;dox?Me(R z45bVb3@i!_>z6P{Ffa)^Fa(0`2$c|GV3u^|U|{fJa28Mmt7ErlSic;hX8j@t0Y+`8 zc_+c*D`Q0F7N=;Hf-!1CdZf<7#BEz`HTx9 zz%&DwfHUZBN&_eU|28atIT&07R2dfpfaMq$Bq&Z|W-tJmW01_i&cH0|z>p-Ny5=zh zL%$LOhYia!hBc2ESSGPD7_=)fFxW7EO7X}+vc80YK3@q)+3@qR<2d!yM=Ks&Y zEDc)5*#L4U$c-R(tW9QMXjcKNV`x`q;9+P2-IuN4V9>(5J1oR}B{92oo=7ifUp2#aSM7IqGk7A6K8=Dz|U_fKMi#+wr;%tgUry=D;uL%%Wu z2ctiO#G1t*e`+X#)Y&k96dRWCmsi zW{GB%5c)C7Lxe?GcXA=*f6t$;zZSkZAYvk;4y`zChu) zmYIPC$|opc0S!Bl8gSS-kQR2Vjtop|nHU&UT^aZpSOuA7 z92l5XT-g7suy8Pd;)8)fKuE=jfti6xpc#}OHJmvZ0umS)RhZcSGdgG}g3~WF{6Jh9(9n26hHs6~_PnMI0GeY#19DL>fVNG&6v1RN)2L12*fB zfa+Q%P#RExrXxt2hldN(a|RV=1||k(nT9psT?U{uDck_ccP7b94CwK-rU4osOhOKz zw93K2ss)Naq%`Y8D9wVx7L;y4;g2osLE!`ndyqV_X?87Wz8aEdL2J&Pv8P#>-yvnA z4J!kO$x(x>6D#;Rp79M0|T?F4+A>~1Ct1r^vVb+*Z=<~CcQE? zXeffr9FX+N1BoYaI%Q!n0M$RBbPB4oK=qIfD{A=yiWAVi?F=lc4xl;%IetKK1Bz=7 z23E^8PZ=0M@eJBqERw|7ft21oaHV&HBv3gg>HsQhKz75*9#Go1;r=QBDrb?)X-Im1 z#sDg#;rYT_Ky?kQd_K&;07`F=w5}ke(gcYQkpu=NP#OZ4A<#MvRIY)<;Az|mTe%EL zbJ)^21IXSZ5c@#>rX+p0D>3j1I51p+l{pBveeEz=%E+K1$iM_k_Y4dLiimK6v|VhN z{&p}rcqoFx0Tf;~OwSnBJZ50AVg3xtbD%Z_%bG(Fw}Q${P_RGf5;y>EV;wS3W?+y|3{+rXWM(i>R9VWvVI%stW6jq8f7UDk@2BTr5EN+u#UBHo zasw#t43ZiD+lYScU?`PPWtgI%3TnfdI59AoI59CW#0jV}_z9@4S^WPG$nPNYRM#>{ ztl9Mc59qFY5FeH{Bpxs@ui5_p4+jIYh00_0|0>KJ3@S(d|JP{Z0PRC!RAB+tmj;TU z`ViFK0Qrd_L_w9Y!9bCLP2e!N>`8*wl}T9Y%0w)6WfP>X1i1qgPpaAf|Mf3pFi_QG zUF0F znz6TUh|5>1t_)x^z;Q+Ab`5f!j-{>;0F~F2)D_V7yC<$V!i*b8`WcLM0|S=;sBeeb zr=w#107{Fnx?wa8gZlE&{7krQjuJ26bj*rq^FZ6?0!VEYFI?%-hWW1qtlR*lL2#MC z{Z#_q4sjMx1(n&LvIA6qfyxfB8s>p%uM9+*L=Gd6-$8X1w(voO%~uIfTMl1;n}JLH zFr$lvGPqp_nyq6Na0a)<*D`Q$FtB`Aab^Fn!iwB?L@isveLQG?k=r|I# zzWth`44`%~xZMXHD`R9}Sfj$g02(JVS^EFK4f}rvljr>Z`%)NKRG1i^EJ|Wv=-OJd*w@t2h{@F2=PhW{olA3)<`|3Ur%r7cLg2p!jB ze!>9CpM4O2buhRnsDR=O6qcZV%d%1iKG66{UlOQYyoG^bk%r2erwlBhKBx`zW`=1= z3>?!^7`PaiL>NGA573yvT4m5!-gA%~&$JW((+bfW~C| zw=;zFZ(|7P-^$?AzlFi0e=~zi|0V{9{*4Sa{Tmo8m>)23sPAP+P~ZFifDO+s2Gbr9 zCL7+}45n)t7;QKk7)&)A7;M;fGMF4=V6tJ~#bEMWn9+t~7lSDW50eeoE(TLCPG%dv zT@0q@1et93cQKg07hqh!fkDDXU>Ad#03Xx(jSMn2f;$<^44GwZxcRwMm>C^V zSQ$Qm$F`w5tg;Gm%hp=Utp1yFhgl->ZPcR=X_Q2GRv{-D^ui9rBl#`;AJ9P6AJ z7*v=Q7}hy3u&i0bzyNCdtFZDgtjlF!SeMDbvaXGRVO;|Q%ev(Z4C@v!u&g`5z_9Kx z1IxNs3=Hd@GO(=YV_;a%z`(LzpMhb$0t3tX3k(eF4=}LwZ(`u+-^XClzn#IPe;b2A z|5gT_{w)j|{hJw7`Zq90m}VDntP5mdSmzB^tI)rZK?dX|(0C6tz8uu|{x4X+i6Mfa zVS?iN{R}1R_c0W#-_DS;ej7u^`mGEp>$fl@tl!KKvwkB($odTo0pE8pbbQ~&(C~c= zL&Y>F(0C;Si--d=H|WezQ24GOBf75W(znl2pTM6U=nd) zkTy8P&|t&5lfj1hCj(gjQU)fKCI$|WKUJ9iGp=c7U|7?{z|y}MbiOMCx)-?$bKf~=!X5d)A7;JBYfCB@&!6JqR5eEi-8>U?hCQdv| zAUio2*xFT?4M1VYi7XCEbI5*y`2iM&28S3pKxJ0{QU(JXrgsdWdVZQSgP6(^h+i3) zWf(wp8mKR1!~BZ@R5na!jx5o9=^p=i?b zPg!LVsQzQyufqKKCz3iYm^zRekb6P$Ahn=y2K7lf7}!pO+-kCPnz9Yce|>P6w*3FE zk_3qhP`Iy2fx3x_fk`BZ!5%cGW5cqG!K8(c31p@Ta{~jinIQAPerNhC02*iLb7fFa zISh#p8|D`bYmPFofWqH~jhz7&=ivBmU|<26*XG0^qq3NRL&b@a0W>E9ibosRnD-(E zhBeEe`q`f$^tUrGfZB5){Wi=WK;h5O=ENWeixbe;v4Iowe+DMu1_n29+YI6cP@AzC z;x=%cgWLd0b1?s>GcbVC7C26r7#Ks682mx$8P?nD(Sob*1my|#m^G~oEGA1unBew<>j_R~8?HB^re1$zZ8)tfOf{cq*)TH* z*l_$&2Zg;U$N&Fub6Ob~K=~UKcA&HmkIQ8Ypm1aX#ia@}7lX}khBKy`_IgG=KA1~-PK zZ8nT94K9tKIahlImqrB!H!+50Hx_{gHxUMAHx>p4HwK|z7s&tyHwLEO=c^b@1QQsQ zKxest$|X?R1jUs=5(6|(i-7aG4KsrRIDVTU?ttZK28IQSE>jp7+!`1Z+!z)xwK*{` zxilFtxHT9qaAPoJuwk^XH&Of_;nL{9;KrfQ0Jd8+fWc)dR1XUSB7njwRL!68OadBfc1!=TgV#NfoF)S>9o z12szobeX&XgB$2j>q8*-F!j0!1c20o+Gva*e}yD5FsccF&baxY*yhBbA>qKVYnm5> zhH5zjhiVxE&(sVC1_llh1_mY>W{Cub&5R5lAayKE$r6eT&Y*D^2GHH)3~kN~I!w(V zzY8$9H3%$l6A@@a@jDaD?>~#6erEvr4K!v2_8T}1pn6#Z8mGB1=uC5EU~^+S(8Sc7 z0J2jE6b_7!DipzCh9@jQ^Xd4)f@%Eni2+->!5U5s?<~OKDF8adJWm28 z96|FyeUBJGX-=HUK|^u<5(XLdB@71rI~YtD6ATpBZ)FfzznDP;)W%%DkwIboP6n0r zs~H^DuVZjozn;Nk{Z0lS9tH;f^*b0eK;>lrY6b^T`UIuR{+$dy{p%S#`qweIK+>oP zGgHzGMfH0OjB3{y1k}DW2(&pf2&iT=2rzI#;*9waXf4BkFUG?KFgJ66>S|D#YT_iq z#E_t%r~<9)!TB3B-v+8bnHU&Fk{ITzFflOMFz;e8Nk%FkS$8q?FJdqNmDvmq3gEUU zxIP56IY8zAA_fCcIfx<$Dw~@bSU~zzn0XjbY7yy42DaY z|AXviVAXD5aPWY~A2`pu2&jVQXAGM_b-h4?Q3~^aP`?e7UKm)E8yFG{;OWJN`5UC& zwMawN2&x{`Hw5>ck3i}%8`j+nC~2$lU!wgv{1V+{;8?0^27JpcdShV}nHh6WEs zlckk5y&9nP47(W^859&%IT$z?86*_Jd8v(oWeuqPlM3o1GcZg^W?(T$0{0oXA?hIN zZJ2j5m?SgH+A#5RnK(Is+7jTlyA3m34-@DdHjud>eW12Ga=RTNzJmeQmIt|eEoen4 zsB*x8KmYr<`_9-wX9_#~XJEjxzcYaWLys6}uMH<2Jr0<9BtZ6XgY+DL*aHqv<_~Z?Ct&JP z0iBD%3(^B}I#!I~HpseT=)H-cJpiz^*x)tS(7iq2^^|BQ5`fN!1MLxnt;+_nIiM#J zfL1?nK+k^zv3a29zkzl~i$KpV2C-ph7lY0sv$0TM08JnoGcbq+C@3(1*38;5Fo^X? zC@_H5-r6xRFm6y#0G%Vv;L5-tVIu)i; zGDrkD4ncfm3{#71&lboG&>3VPGeG$OSucnUO2;5GAaRXvvkYnbjbV8TWH#tba9Caf z@j)jja3G!2>m_U2PKz9Lx^n=nUDEt+{@eR|>U;?Xmk=0?@o1h9h`37beNH>fPs-HmS zLd!ojWI1Fu+Wu>>I&Ayq(Dq-eNq`!wAcLS7qP@IAC7>EPHAUDBisM|nX{VNO%jG(>Wpt1$z z9+17DI03Pd%rgY-Ia~zN0mU%$pj=Ffj6D$`f5Q!;@g4~d@aZHB44_skD4cnqe0>H6 z@R{KnP`)K-ga#A`j11u7+YMX}GBCi-vJQqi7{&*kF8~Td7(W+D9wZKG&)R_6B%n>y z3=9m-AhQ`57(lnMf#kbE<<~&@E1>)}Q2rh${{WPK0m{Du;WLUb zFo5oFVN8M2Q=s$)D1Cr|fr%Az4hs_-0|Vm&1_l-o{{;gB3mfD46LgN=bf(g5O4 z$ry;ZB?K^5d~5I+Ut z9#D>E1eKv6_kd_nx&YBU3=Cj#P<(>;pmfIsX_~u6z;;a$vu6r&u+iwAsnI=C45NFd zm`C?af!5rakXKHlM)aafm=)MlfJ`(UgztKHYPYCaeL|XgK&M>-XihXp? z6li}JWWO0`U&rX4DRu@>9s#XAW~6iv;OL&I(LGb6d#3(__O^lc(!=uA=$@&ev7dGz z_NRdM2Y}Y7HF+EXwTFY(26!F z2JM+jfwD*UOffLfd(RYTEjMh>6ll#pj169IO~Rfj&|Sr_{T(1SY|oT7Xniwu&lHFa z+cO2aLjbmC$_%tV8Mm9adsuYygpyHtQ>aaai{a|s(o~c=&HPSTNGvyjV)@|sJ zRh@dEn>`|+dy*oc`=%m-A={x)H%>)BcTPn>w@yXSfA17dhtgvE6fXaQq7{U}=^3;^ z0>lBuFOQ@Dq`nGm|5PhD%nwx&lG517RZet400dH zUFdtJKzoCT*)s(y_d)ppWEKd6%mUHm?wJCGA1L2}!Vk1}2;@Fc+D6|q1-sJ_Ssf^x z>9J>O1;~R?4D&CPi%AWUJyW2))}U~P?U^zJwJ8`F7+`y*Kxqaf58DIfiMD4d4C-^3 zd@{H!L+q(4K#~W=X*Ia)V-O2~?wM+Xs)y~F>I0R1ptcEkPZR^gG*H@OMD3eOLAg_R^scGVyQW6(nqmXr_2dk?BL{ll)977O49I7KgZ5s5&c-J8-X73d zqoBJdM(>(pV4>hHhS9sGpk)*6{s7ROJFxYzu=DJ(oz;$dmOXKIV2tjYBKuCX(S1`b z45Ry|(C$+k-8VJ5Z;D~`uBp+xreOEnLH8$v_B^eH+@%S=Cu;PrDQKSqbT{u2&>6ju zdkLZE9*o{Kg>-K$=w3(UyBvwRYjbqp6yAGa@$OL>-8VJ5Z))_esgZcs)I+qprapr1 zlNx}#rXDkx_HZ%U@LmVqHN}LuYw8h$$uT)b8}`QxCeL{oY&ae>m~sd)+HgH)0G;J- z!}plM^c*jv4gX^X)A#%gpnCvp1RgV(2?#Jk?wWeUU}nf5GkVw5=v`Bw`wKvKK;gb? z>Jfv96N3!lyQX03D7kCu5d-3`DLF>ioi)VWHT8%Abbo+}lN=-Le0tE`7BK(8?w%)MEw{Cm}}AeLJXkO(DcV_e_A#+DE&WX7sKpjd_ilJq5G!7Kx>qt`=&taqhWVVf!4;u?wZO2t)qtSl>)7a zW`MFgKDI&fG~7_0eo8x>>d=*-5(%%e0NQ` zMi^1Namom`bIJ&|b;=0)-YFy4<|!lC?kOW`Z=YfyVp%vI_tInw6>e{XVh4i3@yfu! z07{b}5#;y<@sTl1Ej+@JBtdc@GeG+lKxWWu9~F2n0n$DyBcyx=a+4j}J}Pfe9zfa` z1-h39c^_3OD9t0u7lHkV*e6vB-b;YsgYyoO`Uyz+7G(cSr2GovFG9+vpgj&C<45;V zfkFW{2JK@7g&pYb7mz9k1_om8o-zVmDhs;D2()hpq#u+nL1B)5_Y|xiMpg&f-!qu@ zQGxCc1o<6=LH+>w2YnwEXx}w4`=~&72obZ7>Hq@+12K0`fx?f7eN?6}w}HYLw%-aA z&glE79xyO4fcEl&{0hP#zrtwHy(l0y0|SHp6C&@P0)@*us3s5vGY`bZiigNPD$u=u zp!5veM+LgK5){U;eN^_~vJbH@3Y3OG;SJk26$$k`jGqQB`w;4jk>o*Xt`1!GA@)&$ z?xh5Y!}d{41eJYA`>1At%05sV1-x&HfnhPI>?36#)gY@dNB2{W?x$j9U>K?QP!%U9 z=A=S*QzfxdzB$~MMCdL2KTX`{Z`NgX!!cA zpt2g=x0O%;n*m}+K<`Kf*NIsBcf|#eh$ruIV3^+Gf?!bcVIZQP1W{OA;GC11Smanz zQk0ogS^~aNIJE@91qB?^RkonBNI*g$KZ0m%80<%o1n9Cr5RHUEav(E6eRhx;AdDmp zW`fj!Fs$DT4n(jFIsxe)fJ8y}Vj}l1!0jn$_=C&>oddzZa{m8+s9!+i0WdzOZU>ox z=pT@IEiJ9DnguzMNQ|W|&j7mf5~dw=cPNMrI+Fu7jsUvG8WbO({02(zpl}26LE(ee zmS+d0X^?(ob)fu*)|O`gjctI`!7$8T*xqwk9OF`lc8@IBJdpcf=7HP?awpn7vJ9X* z5kYr*qpL$}%QJ(<2tjQ*m^zSIAU3GK3S%=cFffDK@#Y{2D2BtFkxU|VB5jKzyR8pk8U1}k3o~sriS(R zzAfd>>E`HdC zhmpawhXb_cOMs!FLD7WeKlA$i3?l287#Y?vGqR{KG1#wTWe@>%tky9waI9lvlv&5Y zV6l#q!Dbx`qr^HUMvZkmj5_NW7$o`^GiZS3&6Y7S2rOe@5b9sVpu><5p~%1-epog8 z{|DWa{~uJn{{Lrm2~b?e#K5wSi{S$(0j}d__+rD%z|aFa;lV*c5wuQbjR6C=ZePdD zz|+5AJ$3gWqOdAUW0~4q$0o~mRDvJsj7?^q> zkbdK@L8kyM#O5~n_z0r|zw;G`P@PPzo^bu{Ji@%hD|3O=v20BQh8#3i#h zF)1h2Gp~dJ#C1$A$t+6^EKMy<1@nVai%as0z|x=~0%36YFfcHH#ved@P}qQIY#62% z*Z3vK3=jsH0mA5Jfb@efyc`5^&=rCC#Ml3z`=Vj>J;*pmkbb20KmZyaTvtNnVdWp9 zeL$^y><3YUfq{VmTblt?M}dL{gu!_SdKMU{o&t%1hCV=TIR^#?2IRH?D9k|l1u1?x zK;uIoJ;>@n#SdDWfe~g8NG%A%_-Jhgoa)fp3}AIcv>6yd_c9}&u?TWID6OEk89-$Y z5p4z*kh?+c29O^>7-SZRMr$*$fZ7^Fv>DirFfcHD0FSGKw%ss*=ZHXdfZ_t4R~Q)B zw}84-Ad8?FW-pYBNe!|#!v$!Y0aQkS9Sia#0|SE-m;-AwFff45Ed&ce<>6rn<`ZgD zP`{w$VPN0}b$J9B7`Q=gsyU!`2Ll7c5(WldkoXD)240Z(1}J|El)r<4fsaMs)XWgv zjfWBh+b70mB(zUhK~)$d1E{sjz@Wi^*6&x}`~SiE4GiG+$NK#Y5}-`Eej|g37^si$ z(4lA}z`)Qa08Vtmpa7r7%pd@2X9y&L(;!113j+s84-F|dR< z|NjjVhnXwJ!~jm~Ap1aW0ntnf3X1*v86^5QqO?=MeL#?!4a^Ln`6&<+1runm%m5W` z3=E8*^UGlRKbo#8Ffd!d6fuC?$e=U!z#@?L3NyI9@&hb_ zAQT9UJAldx*jNMDKLpw_k2bzySZtH-{NhEntD<4@NJpX_s4?4FECJ(B|K~5WqZ6DD57|8D+46ahJw0%x6 zFff4T`HM)q#pG^tKN;kAoCKG0a|2SpzZ`nr;|zsY7r3fYcGw z_OW1KU}ML1_uC?E`MB5YzU_fsDz*j02~85C>GALHz*YvVhtu@Om3MHV2Xb z*^M+_!mhx;0B*;D!VDA+pu7bN8??3$2PiL00~r9tAakHh?9?D@``m!GeL&?1*ufxA zGB7Z}(hp?3gnJnc$%z_?!!_u^~fqV>3uIjhL|^<~8`nhC~`5?HL;u28Ny%1_sa=OHUI6JdaIa zK(JwP2%_<~T^Mda+b*E|0#Xjbpg9vzzD!_XU<8egIxsLW-hqy_fW}}zYCss&#sST( zfY{)+3y6Ug%QDFShXSZPIKM&XOu%FE(DsTPNFK@ttHCnX0xo}`Z5I$*f?(SPIpW9} zYC+YXU+kV*0%)w95x_PP~ryBNEjps zGD8n)1}Oa^NrRanH6RQxV?i9S3_3x4`vPR&XnO$r8XZty08|G-Ll-<=4=S>e>v>Rp zh1MQm1GO7KdXUwD@+w+;0AD<;8cg!9ssK&qCEg=(=fs75NLV>B_&Y3 z!wzx)1T(z>tpkLx!6ZlxhyfbYfU!aICm=B*#zMgJEJU;iSV8Ru(7Gv5n1R9{yT|iRe%fQ!sHr$16bN7HsgM zu%IZDnE4Sya}&^XiGl)A^CQd~$fyHBaSHY`4eLPAnr~Pg2&!|y_CeA+(*`Jqk~$C^ zUC?@uocRV4>OfG$QB(;+3_z*{1Bx<9NopYFI4ePOqhh zAPh1CgweEv`x_uL;AH`bgRTh7C%zs8=Rs&c8C2$gw2#DoF>*cur*F)DF&k)(41X3HAkzObkdF zhgZN?52B32Z)6Z*SkR%kem{c@C_}8@#2_KYz`)GlFabUu-^awjA`r*`?z^oMWMBcE zozb(DfkB9sfd@1`4;rTzNCL0dKpCS)8Lww$U;ycXjj#7CW?<=YVPIiMk}N z-CM}Qz@X9sSr4#e5oC=YlLL6nU8a8%o^f|}22eW{9AC%;{=O?CG3x}DAl3;m!_x!< z186-XGblfRtOM8E4ea1?chH<2NDPJvjk|-B7X|h934(oBl!Qi3y^Ur-esM6Y_X?_r z3HM!5l!NMRGKSn;^Uw$3gG%!d3kjgoj(I7OnW;G`I2IRx%2QChz~T{9MuPa*Fih=W zURwa3Yl5~DK<-6fTL8L43f7+n$%FbR$oxi-$C31d_XXC)x)5= z4!J!63Ny5J2Pf!`BTzUZs{<9YXzdR0m@`Nn41>!B$o>olkh#$IB~Eo{{co^3BKqH; zwFoHliJ&|IN-JpX4i?Zl6(ZUlETA+-M7x6p)NUi9-N6nTj|H^@L16|82ax+fVT0EH z<^b8b6c%_xu-$P2+W&@?O|bEF@EjY+Um#C2V6H^~&#@uNgYQp7;=}h{LG{DuEWrGs zQ+P{2*IH^o$JceBZl42M>%hRkPy&^&fU2)yVBiOJ^%@u$_(AGt zK>2f^`~{$KdIkoD6$}i5EX5^>MbHs@&`<^8HX7{88KTB2SR06LqwQyq0kz9OnE1_m`l z1_qId4D28|kQg>SDol{I79cs0y&y9{>mL{#G!#L6P#S}^149-tu!7oiFmVnB2GD(n z4Dhxd720_l$ZO+)#y>%8L6O^Kpm~QF1_sa=B@<|#VhaNU6R3X(T3Z3ywgK`Q2y-(q zfY(-m*p#&KD4d^Q1f4kmO0%GH8MJm3R0e|F1j3Md0XdfL!2y zGupaUP*I8A1_Za?K^8(W%wAC67Gy3oT`}TPhu#JRsUxNhn8Con3>rUzT8nc{2B^PF zOdAliwiVPKgP8|Pryw@knhaJ@xDe9@>|kJE1htDmVFn5ZP~HQD4SE|8G)A=4Jv2Ajs7lF19ZJ_NvP`eP+z5~s>fYM6@R6GXS4lIE3LG443x(ev}jTQz5aQm?b z+J2k^g*32@n2qZD^Xe2SP3OGQ<=me4= zYjQal7*s*&2GmXzNMhgywMAiK3=9g2uzfxtaZtuxk_6tn3)TZ}OEN&(k+Ak9sBMXD zZS4kTvc~p6{ccdZZw|hYhE`<^ptuCJ13+S+rD&jb2dLdcpiRaBT5}K5gRBlzOrf>O!24i8>R=dV zFDMQ{aREywpz%PM8W0Urht?(on@3EWjDvxJ=?lmpC%>1a-ebp>|T&385kJA{VgD{kje_W23HWuv*SEMztjG*}QfVO2~ zpmYYb4U+?H!<0bVLN!o%SQ}{yXpJj!dj_;-6~3>?9LK(A15+cAI^x##uw>vHE9+@u zU=VPC%s+;>GO&R6^f*D*xPs2-?{Q*a5OMhb6BIw7b*~^A9fRt5bTJsefdRUs2_^ug z3Cu5o@;Rst0-9ro>Hzhv7(r`ZBcSJrfZ8CS{0nM>z{(_$S`G#VX7E`OpehKT+X(FI z0iU}9ZFfk542H77`4CGR1hhAk0on!uu}uihFG3@poc0G?E4clD(i9*#&7lmgbbCra%k<8-Usx0fiPAgTsn}fdOmUVcd`gI;oeZfKlUefc8azFo+Gp&|;ne zG}Z%B2a7Mz_%S&AL5dJvYzEL?El}ME6=nz3?I1Hi?GMoY6HrOkcZNDhQS=7Zdi?OYS&HVsT2diw)(J}9XC z0+|KEAhSR;XgmqV2Cd5l&G!-0{s7rSO#1`0-vVS0C@etX0MZBYGboHxd|$QMqz1xfZ_+PiW#(570v^7ni*he1T0GBb4@q|85ltJgT}wW{)F;D?GKRO zS)hDhXj+5u<3V{Cl$N0KgGmxOX& z2{eouHZYPkW&w&{PUxbr!Ua z2k}AnA&*gj${S=pp?N1zxeHSdO4lIk2cXRWZY`9gR+NC62RV8W7Nqq+pEd(%ECS?r z5C+vxAR2AVf*o{jAZSlNsE!APJt&SrVFqejfY=~Cps@{D{zg^@DzebWEa2n&P>nEq zLFEd_Tv$56r4GH#08&Rxn_&f!V-}$DjF>h9XuOArHUl&0tOH`&3@Om*U{IKW!T}Vv zps+!2Gl2Hwf!cA<-~;C`7#k~%rOf~`8?KhlZ3Yi;9nZi3DmTDx0C|#(c_dhy0kRf} zP@4g@B&J2d3YwY#g{uH`TtWmoE+GRw=R^T|&WQ$e?#2K#E}?H~4qZ158EqgmE@5bH zOv1PX^9u0Mn>fxpfvtamjX6w!oTUSf6J!GaI06H74GRNktPiFQ)Gh$c^@H{wgXW<@ z^IV{LS5UhEEw3_x+UOvC;C2CsffeK5V=DyG106d6l}oUB4N!RnT9X2j2D71ia+N^> z(E0?#79iLzNKY+E1fLHEUg=BL0U;PhfKs7*Y6*$9x=Kp5;_1_p57 z4#WqgO%RO@!_?whPYmiGg357_86b>q21q{$!^&>lg%a^~Jm`G!(K?y|QoKO}99mSO z&nvKj_JM-rkn3Jh9RkV=Nbv<47YCb!tPWJ)fZ`T8{*c=RAPpe1K{R?DjY}PR9Su^4 zmhZty1ifFM!N9a|z7?(E$okjtwD~UOCf`!l;)*I{hGpMZJ!l1BzGh_`bX#FZEazXuU5Y6DQ zK#{2dv0lJNh=HLmh=IXIn1P|Mn1KbX#<@Y6iJ?Q0fuTW>sZc_Zp-@4aDL_Dx!9@Uc z9+yi076yg>%?#M~2*JkC!RcayJY)|On1e*%uYVaq=^NB9hph*lkp#8j{bHPDt z2TB+im_T_KRR4m~Fh~sugZkyLaYJzZ+aQm1pO6NDaePpD0;_Y0ITswP23r4u*e%4= zza^lALRz0ZGdEQqmc&472tfP6Gjmgk>4(FVf>JP29~`_d*g3xxdS<9oVsR>%ms$iK zqjxSXDoV{O2?1FG(ut?<4LbiD6bGO(1Vm%Q@Nxr3-y38G=-f$=86b>q21q{$Q?p(M z%@M%rWsup(XNZIN;BpUXy#V+edL%xm{{qtwDnmhT9*KQ#P`?%AcMt~EAs`yP?+t2G zgYq{he}Tdl6vv=2L#x+0z+p~!4JY`lZIC@M46_$hHh|29r4!^mMj*8?b?EgvNF6ct z`U?gICeT?tAhSRin+fF9aL_B-3#(00|NunGG{0hgKZB9U5!DQwRT=!`5-eCa^@*#^*lwh8nsEDPvaST<0; z1C;Lq>VJcFkAkWd(3n1`RRQaN<7$5xnj4vb)DgEXfO!Vq{x>57!x|OPT_X$(Yg8Fn zVEu4#z%no}OhEMAU_xLTe|rG$nOC6p0H~b+Iujncr-TWV-ofUA=3^Kbm|*k#;PwDa z0)xii9|x6Jl(Yv3pZ5WaIMUk#2%V6_VkFkf;JF59e1VHM%)J$CpfO^QI#4 z4phgW_qRd&S3&Av7-lbey^Kp8dc6!%M@+q3!N9--QVX*eG`2otrP7Shp8Fs!EDBpt}3{C)q>s8R<1)%Z^ zN1=r1XM-kakk7e-7J@~P75<3%Y+Uu8kqIehJ+h_{n9qIy>Sr@FK+g35?HvX6x7R5! zFsxHxU;*7D-oKc^WSts=z&dpX5r$_5s_T>(IMyjM@Pr%y%Ui5dVh~uT%plUghyla~ z-T7ey%2?}^8Dv27|+LvuNf#Z92U?P zabN(S=_Zl}UN_3n$HXAQ@JK*gz<~jjw?TY?K4u0HhI9pOhI9#K1~&m^4h9Bu1{VQk z6($A-6=nv;bxaHb>zEltK=y(54A`(SF!UT_VCXr-z|i9YnVau%h00?&JA{EjKoQgq zP~VHV3v&ZI%Gf%{8(@sT9l!`0BLl6|1+{^}>Y?>JsQwRuo*OcSfq@BhzAtERDRR4( zi-Ca!R2G2rf!hIOo*x1V23R`)v}Os$2Io)0>-!i%_f~_tzA*JLH-X#*>8rpKGT9A* zB0bQ^05m6oE@mS-+d;bgNbOlrHUzbEi+nPROBle-Uhv=mcxV7D0p>!-3Ow_QQ;Wbu z1rUQ^PVmetfe2s@9)QCES|5SJ069EBd}It$i>r+R>T9Y&(gbMTC$d&B8>AnEA>j;K z=m{3aLJ&Wu4=&%3#sa|o4kSLf?m*%PgKR_MBaa<`+y+jwNb;>n>cM#y*JBtf$}w48-@`y z<_$F)Ou_6$Ys27Fht`Gxt0STf13D*(8Lf;1&n=*}VOT)>2#ILJuz>byg3}?`7tl$0 z1_lPSu?0}EM9dv$>^Te!;B(4BVFn6cP@V;a4Ja<)d5eL81GHWWe8vr$y-+SDHMrU^ zjIeuvLFEeAu^>+}K+jqL2|)Sqd)%OW@c1B-JnGm20|WY*A>ecQ;pzu(VI2Y8^O*o$ z50C;~4}i2!0ep6M19Uv%40PYZ6VSK>WG^Q8?C%dyeSaW(Izf9OKxcpC7l6jYVGTI= zxP>vUc@vWMXwD(nenYw^1=N=7V*>ASPyyXz0!rwh_~~P3V1Tu^1RgW+FgSE5_B>(` z=y}W_(#OIe(8tOk!jLMV$dGEF4Vo)qa1&5m^N2xU4M?7y0o2}NS>w(CIB9yln^z`&|^Yc>EGxb4fQ6E_^bOR>HB#@g4 z8HKDI)QZB{r~*j_r_8IW5*@@qV2~Wh4A49s z$P5rh$U;~kH6RQx%RwB76dFlltBl--OydF#BLM%wF_%4@@3L!_=X-dqDEUw0k5N7??o&7eVSl7?d_a zNe`{v!wf2ih-mjPgZ5Jp(e7aZg&h%NH*BEx7RXFc`G}|8!#;(9fdRD79pncP2KfO* zQrM5DT2;z zU;y2%hBj{kzE@2FI*+2jz_7-Nfn^QolwSu4#Wg7m0&7wkMAoD*aI8sX;929qAORX* zS(CsZ18YOT_E&($pg`>j0cQpm&|R+_3=H8Q`#}j9M8njB?E~E^1|CDwfQ}(4C^9r7 z#*ji%7=-#*7+An#NQ(rt0~{FmpnS*}5~$6SDxnM-I|7X(f%b$Vj~y{2Xn@YTNCde9 z)V2cc6YXPVfV6`aGqCirFi3#fLIMroHW5o7E987!1_lGgJ|+f^K4u0U24?|P0qB@k z9~%QlA3FojIyMG@b?ngbC(t<<(0l570vH&?nEoFH`4i$_=>4|}3=AMQAm4inKA(3p zgT(qx3?d8-6BHR1%mAOyE9St!4hlmt2L@)nB*rTO4v==4iVy>XiZJ69h`9`q$aQE? z1dYFe+zSg&kUUd5wEYIzzarDWnL(m|6Y70-VEZ>QNPz4HoeK2^;SC+VkneQ zW(W`f$MKp)3<7HwGl)Rdu&i@pU;&*;$M8TwaZM2DF|m18mL9_5@;qkFU2>tI2~*hvhP4vqxDVD z`Z1Uzx`^>5So;Cgjsr&@76P0GK;m!)hy%eOA&?nq&@o+5nuN$8NRZheb)c~)uqcQF zW}p+;`zjz+;4%oh{~E*x?Zr}H)Bpb;G}a0|6Bw2cK*odGqZ~-`pz~u`koce>cVs^3 zOjuZc0qF;ii6QlMKy!k~>Ng_gBar$-AV(poKZ}%~K=OCd#=2{Nk; zstH7a+yRHwd z3=5& zP+bMCR!2%j%LQs9u`n=jfyy%h=vqM$=vqMuC?B*}4{$vVRJc|AB!)7^MCOWXvCQ&bbNX%Xh_6I0q0G!}57GyCPJ8%RrIJ7V@IJ9ao^si(PQDOZ5Ur>>OMTLif zQH6^^P5^Wc#YqEI6)pyOhqeF)ki5V{s2S{$O^jI)st(-(pu7Pt^Bj5v82VQ;2!PZH zCPLM5!_-ND)Pc(+haL&ASt1X??RN$n?gj>jZcvrPz~BV36YM$!;m{EPzPl750%0v+ zkO!495DpRvopS)S+jJNh7(sIkFj+th}U2JrpC zpfww?Iu)drk%57I0)v2nfS`bYfPjJmm_lZN1QZm&k^;~&1gZ~2;lQ#CptB!Ad-Fi$ zAxIIp{D4%sIJ2%4hjxz;-Gz|*u+6~EGR6H>PZk64@R0g$w|_OX02j|{9@n4 zf)F1k1_u3%{M=Oig2d9CTzw~}Ab6hQL>s67H( ze*?-3P$?({(F8IB!eT&aOhOfb`zxS!FlbK>sGh-P4#=H^%mMAE2blxPTe!>t)nSCp znGN+PC@z7mIQ1H(FB%$CDwU6Q2qe99h3*4Sq8-pP&|MHKyd3p{)mE2aQXB&!GV+LUJ(3BBc1?1ohcKYo$PL z2IT{gc_6=l(hk%QAQL!2{XkGU0C7MVWDbbNiLvyvkn9DY1%_lkm=CfWZXWa;5STq% z!2J$*Ay`n9pOlK!{)4YL!PWXRHa8%Crwlvl30PQKe}rVu&^~cS?z;uFvff01l7HEb-fPn#gs}&~$ z0}E`W9>^9@>yL*)KnT>l17lEY56plPpq3v*7Q_N+0b`W#0gE6Lkk%i_FV0Y5uzG0g z4;;qe(u4sV-g|~&>ks5@lw1T7z=}~@c<}5~3?4QP0Oh99b{^ISEK-Av>~z+nX)Jq4*lZ+U@cTZw3Sae#Uh#I(FXE5AU!1(>}cJ7H|BG?iOkd%!I(&E;6FmS@g z%>)=!I2jlnIw8$!V#miC7{JGRVuUQTbp&c{NH8#f+Tm~|ps_Jf4g`&jf%k+!Wk6$N zp!N2kdy(fbfR|OUfaY94V`HFmq@l_{Wh%Q2XlxAH7($|8NFw!L^4MVg$1P~VQnUij)uX;0?BSAVHsmY zYJ7o88_>c`SQii+5s-KTr(-OwC{SL7s6ec1z}AX_sRNkzs+B>lA5hB#mpLFi2$?h5iUNl+uJJ}jP+WoHY%sKRk9E<@p&IFc#5}n7p_TVje*YaA*MA3I@<`eRs&`)JpaN3&}k~S#vtnfkPAVs(mY5- z1)B>c+!`|>WhT^vP-_e{6AEg1fm&b=4FU`f4Uh;Vrp48Ox{3!Lc+l1ss3`_YQJ_a?E{0PK=~9zgD^}DJUze!K+D}g z3ZSzQpnL?Xy+N%YP({Ke*g8RAwAOqXN)` zkF%wPd=fE8Ehrv9G$>9$X%>`MKzv;4&|6v{b&!f0qzlo4LT_o!U|;~BAPiB3P>0^q z0=a>hmKNy5S7KUPpq1UA*>;${@O%doK&PqP(gGc>%gB&l3@-#>6;)zR4!EfWYiAi7 z;8<~HWNbx<<#n5&aC~iS>eV{mnDFC&*K0t@c1 zdIS_MAa|jUFoAYkg2Z7MrVbRApm2xf6I|-h+dUw4#I$=>Ffg!!>M@wTpneJ{jzM`9 zW+wv!0~_dsT4LHgpf(;6?H&$L`v_Zq3g!+Bn#%1S7w~)^qTK^3z_`jX!A%}Wb4CHN z+8%WOkD-Bq3AhCW5;rg~Gci$6Ffu1)jEVIQO4|o*$31vQ{00UA8vzCeHSoeF1<(#} z@TrC>tPBZitPBP!Obm=m7BMg_V`5-}ow#Vj+`s_d&20c$dj&q#m|@Lg1{RS92G(`V z3@o7C(khTeS}JQ6F>t6bF))cVL9#Ep9E=ZA2itkC!o;Ak1hjuJ!9cO+2m^-=^Ad-i zRt6T6WCnpXM;UlPyZ3dR7`QoXV_m_hA& z&8zZ3c4&sAG z_>p(uf=^08+QAFjiH9r?-g$x~4;p($mLL45Kn~arUQlp@V-rNc>UGeJ4X7Oi5@TRs z-~x>SfM$ zkefi}f$RZckiDQe2M`;op9^$bGl-3>4rDK=od!}5P0Ng+dL5(=hCyb7*l0U=!RoNJ zPtbPof_B?6gW41zGe8*RCQ$gG?cikvxdAjr22umUAT=NwZ3izasBaG|gF*5zb!hD! zR?rF;B6jd{m_T=4gWAm?H-Ov+@-rxmps4qDJD z8zB9#1PB@zMdqWQLyEMl>nXS#K6D+x`7fT zZUWuaY6CqX+yQhm7Xt%>3-shl59oK*#66h*_4Io?4PzT2zz_X}%EA zGDB~cVHf~u6S=3BfEr$@c_m0KBSHtH;nE5b2bl*CMQ|7}Fff4Dd4dE{$}*4u5{9XT zbW)Hcpk)-u3{ZOpWCjSMs-V1m1+pKUKA>>};)71$gSB@+ffc)TTgd%P=61pMcbZ%m&e*HVVjG zSUrnN9olJ+VDqrGJ+R%3*#WW$ia~A%r3KLGI-p&UP+_JI3=Ht~0U$Au8W0USbqmG@ zomv9YPej{;8MJDah|?ZfL48Zm?sHI>fx-b~J}7L^+8%769q!=vKFCqfJOpK8r-*2K zfa)H&W@gCgEXaJM@B#071Gx`b9^^)(umN|aKyHVr0m*^V3y2T9855M}L3~JCf@*~m z;>Hee@tT&Inv((<2O?MxnwpwJYD{8ITVSq08UNvi+;9Q*5aXU%1p`=~}wT)qQA!yzT z#sTTqe+#=9Z-C*iL=^W%H5QgM^q=+Nw*fsD#MS5xpB+fy1QiNq9YC<~;_z8N<}#s`o%Z#tk52un;~-FLJ#H%d-Pe&p}SwqH>i6N>?C1g4)HP@B;NK!Ttqt5Et)(PZ|KJ zgM}lgzXMeQreJvleQX|=I`px5kUDJj5Biz}&`nXGIs|MfWSkLPCVN7yaSwUl| zpmsB;UkOSppfm{z8&KH}3p>y-80fYeQ>Z2o1u_Rj0ngXN)qhSfhJ;JE^F3IQ&CGegpPR+gmP`NX1vQls!PfMNpX z0|xMn!hXoPv*2@DnHd;*K;w80kn>)93K&>GBk`c~Pm#}>g&DAck(|4c89=L8L1*@Z zQW4B3(0NIqyEZ`Qn1S{PfqI>w&<6FyKqDhCb!-d_%&?dQ*EqzVR|?J4bEI$0Q2*xw8c46s~_?0--gAY+(XT(uU+3{XoQWCjQ$ z>jkkv`au{HuF$LplEA=_S_&kLuhs&Y1s;V$8m&e@yB|F21eFJsTp%+Cpq2v&-EPMj)}(rl6V_q#mRf)SCnKs)*^$fqG~}^yb(=;SQ=PL16|82ax+fVFQW_ zSeSs~10)Y}Bh(#`au3GAMq{Z>L1x315?Na!s|UFcnGbR!QrLjq1adn}4M+}@UO;@< zS&iWPH9!JTh2R+|BtGi>$0XLiNF^sJg&zm>oPGi5sHq5a)Kms^F2BB+F|@Y_>GQ#R zhdA#4F|;%yVFwC}%n+-~L8Gdmx*Rl;3`&!rx*Rmh3W`DyW@BJrf}M{!1nTm<)QS?M znwU^}!!oRjW&*T22F+o+Atgt`GvPQiVok>&)4`MFn3Xsv&w=6rRR4l#lspd-K*BJ! z`08-b=nKdU5Ju7pW`gvCFua@salkU@1o3saIY=wCjs_X$hQ3u2d&N_rVaL`m zl$8EBGw2Rx*c_Jz1C9}1(C98`bsU)^x}Y6Xp!OH6ZUu!esDBMg^DztzjG#IgG@=Vq z$Hc(Eh^!7Yq6_MWgYEa@yW~sU35ugGDOt`@)2Za5yS%RSOd|Zd<>$oVX*%}5}<(u z5RHUEav(E67-R+rBT0jqAT=ONtvVHyW)00GfR7$gTW1B5|lfH0CYmF0skh@c1^%>6vj%4ComK^T-4 zL1_WhpFo=VWCpEj!B$tIkJWMZd6d_?r~*g*GO#ezHl#UOK_ zOzaevx)S7fxMDhw)k1cM!+JD`DRNL-1neeggUb)hfyt9rw~|xn;p*clK*niJq2sP- z-v2E|6NHR`IMD;MJ_4vlc=57qlB4bVmuO-UYSsU{L^C%}VY)k>K96nTB#R{4m1LbcJhS>q5 zL3V*KHS1dNSTMA%9m#bmwAca%HH;0Ke*?{9fdv^D*tS56GvqoF6lS1#ETs5igN;Wb zs{=L1L2-*5f1rLM)NC*XvlrAZ2bl|tXI$#g=RHB{(DFUFFNQwv3F>!(=19SoBCR4q zt4o<)5VwjIJf}lUT?(q3iKt6iL48ip94RQwK;ZxiTTs}5;sO>Xpw+^lv06u%C-5~r zVQL0hT?*-UGBAMB1=xuoPZC_z0V#vrQ%gX_5Uf0d2!cew27w8*RjkD&i6!V`oMt%s zsisE8pxRGCfvEZqbZZ2xMSyjT6E?mHauyB7I6?RQf$Bd41_nk@-UE$sf^KC1SqH+P zF;3X64B&nzNDwQg?HDHyajRCr5k*$N6RHzB#u;3aSW*hQACX{^!q5N-98g&WVuAX9 zAR3epK{PfDQ;Tc95M%~ur!>e65Jooxq#uOg`5VMRR|Mu0H(v-UH$ciq$2LKsfWY7) z26|>ND2!m?4XQg3su+PaHi#gyKZooN5F6xnkaiFT@j-185SxdTm8#GZgR3kvH@yg2 zSAgmP_?#Gy`oh$}h=f~)xETnHYhGBti9rF>(Nqg!U|7GOL1+CI295Qb8C2G9WRO|E zfkC3riGe}Hfx(-hVSys3k)R^{|G$kO1B05O;0`7Q1w|WH1_qU-f)~K2U?@PgNvNo$GSiUj&*?yJPZyUicAg`it7RxSk^f( z2&{8p5LxHIAhCWig8<0v^;;n8c)^hj${`GpHM}7IgKj?(N@8G!yCXqEv41~U$Xs)c5|s019VNn1aI`6yBQ{6kuTvwsQf4z!YZ& zCQ!I8QD$H;NdEs{B!Pj2fuTbYbP@?zT#11}MVNtCMTmh191ewLe zpaG6Muo@Nk=_xFrxa$M000UbJ6$h;f4rovY>4BLKio>2{PQ!c7;b34W0r?$bKlsWlFdu3KPHKZZ!#`}2c*gBPr;dQe1q2xw!1pk~ zw6ifVu!5}Lz`($&!oa|Ihk=0=bRIMl0|Ps#Y=o&(U|`^YttkPwpBm&D82^%Ip2fGJ)pDM_GAPg(>A;avD0+#eP9;jFb z%_}$;r6!i7hGqID<|U@57BQ4%`lc88CT8X_lx4b>rRJ3cmZp}b!Z=Q)X$)nVL8&E0 ziOH$H#pw)Xna=s8c_pbu5Kc%&QEFleLs=$-5nPg(oXt=KQLYD?*duPN#3i-NH@%1< zK0YxeC9@a@6kY9}MW>A*}eD`&5YEfBca%!<>USGw@7 zPKQb2@=<iYAUV)!H=xsBKxTl;Yg8rhyM-Zn0bj=*ds`o59B5910eYGZh!5&t$UylZ zH-OrYu>Bh#K6vdgbes#s&j#gt=xI41KIqhh3rKv>J@T+QCXoD8PzJSUrB=i4)${GZp5mas?>1PD3eL&`ePkutU zhY^&Gk>$bRgJd4^oEqrVKG3olWc8r27G!=Cs(%=J(fD)G_~7wpB=>;U&mo%!YTv{7 zp!PUO`vCOa26|2pR!xAskLZIjFhFj-1dB2Vg7!***4ZJCFM`4h)aD1}Ifya_VbEMW zh>ffclx{%dO`tRewG4ck4mdx76hp^2K}@u9Nah4^s|h3n!LU9D+BhUg9o9Qt(Z(T} zD;OBq!0`?-4%BV}7b$4tkX)d)2dKXWRR&fAVuR-JK>h%+K_@1G)*2AeN8|#93lZax zyr2_XK;xvKFaw1zC~QG~2DM3`VF$9BzXQ^C0tYBvU-sF zkoh1tBD({`2Du%k2E+%Y7Z6_t)G&nZNCvI>ft}m~8m|SF&K2N3Bm+YjNHGXQ4axzR zp$rTXjF4+;Dnach(3mll4;yoXCFE(~G8CbHF}Msx@ZoJvsQLRrc7ZUI4?5Wt#D$r6 z7tBEPlDJW4CaqE+CZ(^;o4~9U|`?^wV!wx7`Q+?nGHbm+zbp1 z77Pr`AaNT824;}B3zY8x<@-QSmkNNME)~MSAOI?RQlRQGpz2DX{0b<43iOnyB~W?| z1A_=i-w6f=Q4oEBfk6yJ-+=171J(C}fq@a^o;M5(j3D>?fXe@Y$TO-iFi3&cD(f&X zNP}n-1_l`rZNtDI3!(!c<}=PyfDF@a8NXJueu5`pqnAm%eUFfb^A)cZiy2SDXR7#Ng6>LVB!ltJs* z5}^DPD8GP#K?S6*g@Hj8q^^U3K^3H~2g;uS)K$#6ZV5Ky^B3Oazn)H^?AVRKxGNoFr+mVXnh{g{e4VJV2Y5` zq4jx~LH;G8&%+GrmlM(FVFvZLiRkmNk+NSc9LXP`^o_*DWDc@EPYkqA11cB5j)f)w z(EKDaA0D<~c|vV!&_p_U1)dCapScQjpScEfpScaFT?a0{!HdfC^@*8}GcqtV0;wZz z{RT?_f%&)>pn7{f^xPOw{SB+9!E;^?28w-53@j?l_y03E3#hDPf}Ai9o^N4hU|bUb z*^jUU)Z1~;Q0!U6z|rH(z`}3O>Ued?eSi$LooVP{o<;+`FPT04jhsnK^3rWYF3`>xX_nFqBVlNw}oeF?O#2bB|G$AUZwI$#sbK_ozwxSd+xSW5mS3B;dfnro!_7J8aEFk23=gLyCmT z8fUOPi+}?IyAc!URvF0IbWr^)Q2iWG{l9VO7l7(lfVEMe`URl+6`=ax{-mfqr&v(KSPp)3aIU3#Kh1b;K0CV!}R|jXiZPg zF$RX7!yrHZhp0Ksz{7ArL$PNG14mC20}DvMffF+WLz09lNI%S-pmi|}4-^zZVFk*N zpc{4ww2NS458yNkBk+%RFhSczDB~EQ@gY#V2sEz*DpL~}7{GHvpmigl{ZBBX*%%mD zK;<%sPf5E7oV}oJA$gEtP&TLx1&v>Tgura*z7y~XvCuUgvJ4E2M7E1y8H22*5kfPx zbrcNAW^Sp8C8b5F#l*Ig(6wP{G7;5If`vP%j0S}dHVh6kkOZip0MSSoBnL7BG!G0i z1B8*J!Ay`E5QdliAP!gtoq)_!gG33nlSa?%0fiDO2F=xjf)-ScgJc{S7#N9Y7jb~* zEkXGaxxE9bx6#@~oS=3M$XsM~pdtlr41^KXjsdBIVQ{{L){7u>q3HmpI<$5XSRE1V zB1R(HMJzl zw0aj*oPowgK=}o9XB>zRx)lY)Pk@e>q(IwApzS3f`4%XD0aSholz#xqKLX`HfbyR} z_>9nY7bCRY#R$4}1vFRe1C@_~kH=ILCnx4WPJSTR?lLeUq20yOKwv!P!S^lTc@ywD zU^j+THdtHb$rJ_&h6WAADT^5xOp+OxmMmsq0Jl4u859hX`Tx5#D=@e0rd^R+96}7;HB9y3=B-5@s$V$1}2a?(0C5$EEJeJ&>6z8 zF=j}+1+*C8|9?>52Ymm||Ns9%=T#7zrvcY>(6$QbHaFP1R8U!tt=$506Ku=?#NI*N zcn&mSk=1O0>xH&jB7#AQ6ci9dc3+?xNNuLThg4vDC9t(GK+XVRaCm_jpo|KlkuXRO zWCrNgSdbYYj3fS?y`2J5L`*wHf`NevylxSs0aD(8(>Z8d0Qt-bkbj98zX7eS2d5*bc`yf~ zjo+|<$_i}l3XpoFy+mxFvl)qKr?7+0dIYs;pw@!@0ApjN2if?|4(Rv|s9XTM7n%Sd z^$248#uF?Fl-C#-1fU@g4QK*&HYjg`>THN!h#nRO21Zan z26RRgs4fT9*&ubGIvZ9;gH(dnRzT`!28MyGvptBbv!M}9R-Fyk3$3#wNv*S?8b<4E zP{J9lv%%#%s5}A%2Wagy^4?xp21cKA0jUAC(UI$7P`*U3vq9?(K;|N=0~H@=bv6U2 z?+#K2!!Ub6WdX=sXq}By9a^0YR!2mg&9H*VIveC)V(M(relH^GY-UhdMogUz@&gfd zHXEovGL-9V4_emQWE6O~>TK}3*|N;y^27qrl`X`ruOP9m<{?m5W3I1YVPNQKVPIG@ zfq@0Bt_Jt{p>;L#8c0yO0_QdI&UIu2@$3MmGbbAB17$Gq^HAR|Mu0-?s+0+mY&JaJwCe4{ovxgNYM^z-U2jpiJmJbY|^&A`w41o-bCE#k9lmrxeoEdc1F*E2u^i61B zGEz|NGiH#P#>T(^I!iffG-7}k7YVCZpXFflpCV6wKEfuYBR!GejwL2>O8 z28KQ+1_fBysB$tGfX@*zU|?A5#K6$U!l1*jzyfl%h$;ianj;Jheas9zpftM1nSr5~ zpMjxQl!2vJjDe$m4iV*l=J^LmFEls{h;$5KzZvUZ8+bVZDjzn~|A(DLLc&}QGic8*Xdf2x`V|%i1{P48GKGPG1+-?j zgn@wtG>5~)z`zRIX9=>B9ePFyhz)6L)??jsgXJs|NK*#7rUW$R3Y)(H^?PA#aQTg8 zZ7z7e2f7AD4s<6aG2=qzi3Q{zWD4q%AasM;jA5C`M?w&>{{~YNLi#*(;ToB&wHHBZKp3P3M1#g}U~Et~8N?@|jmidE<3mInl@kvuUprE0M>wFm}Ffj0d=1lfLXwdowKG6Q*8U_YF&>Tq%0|S`f0p-tt*vB*nWM5fkNfLNr zFlbsyK|uk&P6bC>+0@*GgmYhoZ=jrej&`>dIN%wC_!t-%9hjdgSu!v%@iH**h=L$P z4rsgxHkHZL06qdymGM6V9}_5SK;ugoVvvj^t5cAQKD%@<`@UKSJ)~VgQE~nt5O`r0@f8nunGzEFp4M3=B+#4B|YQJo!Ai z3=N>%2+83L4AAl=p2?DdlPMc~R3;WN@Zv6TdSP^cnpc3!JaGPqWim%L51c4iG(69N~|kn#n;`#>cJ3j+hlZ}9NL6cYxU2Pt2m=HUoG zX!(K?e$es-WCt|-Kq-iU0aCs|&BGCXm~H{3S#X^KG7suzQLy_UudK#Q;#VC74y z9Hjli!XwBd$sd_gMz zzylHt(DDUh9xnq0?gMYcft4>1^C)s3cu)n}eu4TIhx?%U7s+q%{EH+8>O4Z?mr(dY z%NLaJgO)Ey=7Emyg_kc7|5D^WWk~)2w_l+C#SwnQxes&@1Ejsd%7EQGwDJYTztB8` zl%2$YE>H@`VcS11&&>wO{auA2h5` z{0l8#ko*gpG=-!;rUpXhfx`;TJg^v&d7uT(@bZP2_KQAKCUScNTs|X-X~W}}$o7FQ zQ#!JF;PM4z9<)3K4eBt!$`>lQ4>EZTieKuu54>O-R=(hMAGCY{`3>3@fR`^wV&F+? zaQl>y`=I$3CH$b}3&=cZ_<;sA;pGbz+y@#YWndto{X)Qf-~mu@eMDsY1;spQo;s6VQXU#55H46iS5PVM< zWV}!aG?u2rz#s&gn=xQu5SjrM2hHWc^f5Cq2!pyk;Gr7mJPWwn4BayWZjwUTU^UQr z76t~$Kot>da)`S>6|@IGBrz!me26i`bzu9baK1IfH0*0%Kyu(_5A+;r$Pfer17aWT=OM0koDBep7R6E?LdZ?z%s%he}FO|m>HN4g-TQ=saOawuFel zoBXZgT%>{tgVg@iUFoMpe41r!x1L`A!)P|ND)tZC61yQR5=HMlaWtmUMf*d zNF?Q?R_Nd`U;v*00S;vM1) z0jd5T-B*GA%t_>SF*rXkfYuD7+^NG3s<()#&p~^aL2)~n>vPZ^2ap><7?c)4=?=X< z2ZaeS^*QKx83C%#L3c*1-_IZcs;dn){s;BXxj^@~!p=T2 zQfB_Yq?thjykBw=1A~bZLjwl`gZPp~kh@iTk{KAF{q=fKT@Nw`bOv?*e(d*2fFf-J zGu6+Y_JN)~4eGap@&c&dhn-muvJzD9gPjH%mjd6L$qZiK{sSb5gbAHh1R7(4t!W2O z-4m$y!OIVz^*)FVyEhY5c7V<{0+k~$>mhYmStdAPkY3|MwSnq-x5O0C7%ef)Sg=x3 zYk0)bK;XVFbgeJUALumLuOLAjeRhx;pguJyEI=5f6d8l`gD@m~KoN*6i_9jzjt5UW zBGvJrIttcD2iXN0vxMTjRu{Q2r9l{_eX%v76qkq z=sAX~3iN3Mxxr^)5I)W9egq`{B^K7Q_}HVvIbsq9iphrK}iq z!>}IdbuOBAP~GbaHZcr*XE70b$uP8FzvmeibYQ4l)DOjs~S;5Qfi$e0qv2}H#datd4kkz@H)@}`*{L}#-=2UTQhAzsRL=e zM+zKRSO`3IC`>h|&IF|?7#}qM3~DQzFfcHJ+Or@Ul&(PH$me!|k`CzXA8;NZp*{qy z`2k%&lvh%moKuizNKBnZR1yF!Dex;PPWCCt1DD}Y4}slBYJCLL1T_OeVeh|z`fj7>21sTmJ)AhpqfZTmJ((`;8Ga zUI{Y~R6c^D5N-Vr_^fDb-(<>u|v5 z8i2}h(AW$pZGhYd@-tfb4LbY+-fn`K1EO(aP$oo{WCpFjK@wmFF9AXbFr&4{h@9&L z`3GhQhz)W(G9OgmgZKd?t^a{%R(*40Lr576A?aBXgS-P-Z4ckA3R)eHb+;;fcLvgK zRq*O*q}AP^V8Dh4eMy`~i;_5Pv?MM~XVA;bFG*$4OU}>DP0d3tr?4dyR51!xVvd%? z(9yoplDHrF@I#y&ccXT+dyVSs(c&XV>scA#lP$SEL%+QiUPB0#5r zz{iQ9r$nHPSb!2fCLZ)9aT+a3;xt&P3kncWNdcl^VxuK7C^Ycn(Q#r1hS3>225^HK zw0jelhd`+Y#D>+dFg~b82C>PRu}cG$#75X>?C4MugEl0>&ey>|P7EruQO}};pZ_xq zO5#LXw22e*V5Kf7b%0V1h=z%cmc*dYz>h~u;?a^AoI;ox7-(D)gEFhWg)#OSJ35ra zAn(CWCWDs5IMz-K?>2EFE!xD1qiy2RapKW&Vo*^!_*b!kGONCYDfSsVI+VnqMTL-6 zY}7eZ9u(@>@E{+Z$e_h~Vvo`F#Hpht@n}g5Dh~#INes@c`WEKcXYA-u5`&g>LrP*o zw_QL_n?)HXhMw>`^hYN$3TUu)!lPhx?ZjwFJX#VDk&+m+cEZAPz-H_~n{8m{h+`j} zfDLCt$BEHOV(?a(VNep&Vm+}3Xo(^y8A9;rIPvJt4oFI17~Nwx==RuwGpoL(;egH9 zfwuiaO5%~-CZ@%DVvo`F#G|7Vkkiga*As)6KR_!Y$XWh3E%Ar4puD0;2$TZ{wg+)g3+}TqoWg}qZ6RwU?_|e8!_lxnhe;C z9kp*o28B8{Jm^be8myi0C>UKkF{zJObl@D?0}9d6LTIZ z(*}HJu~GXzc~Gch!&E4V4Hy_0VP~M4!bLkeGvf6dTxH1_lP$i9jelGms~cFib5t3nPgmn4|ma zKw$w})el))OzmhX3>jaA zY&?SOUIqsclo&0A!2!WES_(tb38*#(g$QYT>%gUOnjr(1zNIDB@nL$D!jPm4IfIP_ za<_RQgE&tnPd-mBLj$OJ0Xe0OfdP8n8mPqOWXfg$pF4_83=|NUc#xOE#4ed2sT4+9 zG65@DM@wPMq=8FhDDJBpZ3{zY;b4UZIBo~^hygDO`Z76duNHVPcm{kX8zhwuML9dBmfo@Q^Hp!EIqf17qkwFWpOF@a0Yn z!u$*j@DT|dZDHv8VU)HoHZgGZhd~VTwlJ|ruaQ&=BQ2E}Z3~Z#wZo&O@K7v;K^Ya) z7B)2im%k8#o^4@aaCs@@k5mfdXbVHnm_Qj9hMv0yDw&7+xG-@G)<`Rb5z8b-OX1N{ z7@X4>7{E7Wj?T_OLjyz&=(=Ihhy-Xo6Q~qMITD_pr7$Ep2*@Lq!XvRQOze?sB$dLT zQ=CAl4CxHw(Q#pDfDl2Ajtdia-rDHw9Hp~!po|JCg)K}V&0sJ|&r(kxJo_ z*cK-CxHZyB;nBA6=(sQg!{|!2!MukK)D{LEwZ^4yXlQ`Eotd7cuo$=$2CY28}cI(L?5+AN+}FJy$Kw=kh&Vg9Bm7OLV-9u+7=#d3xiV%P0t<< zNX!9eR8T2wXaQ~oLkN17!s1|mf=Xeg212DU69WeW16nBz78?eoFb&oVBOkLiIxajq zE)33TqvOKhhB2&Z2M&{g9v22@R8T2wjJ$acUJ4u1e(xM;qYUI^pAp>_rp0<;@TpDU zWH#CsP980Vp($Z>c8+0Cov#LJ3q#in8=4|-o}*_eED25=p!LEdx-CqL^}^s2o4~<4 zS_+Sr!q9{;+7=#!ZDG(kh@iHx8S>^idX~ac;M5`P54vLx|A+*13>alZ0<^+{g@Iuh zj7Si9EggyD!mumo;G2<0$A!V^jVNMtTzGU`7@Sb(FfMGw04jwou)tusr7(0dkEk=% zw%|KcO$MAcg!sTK)l%gw85o#&8CZA(c_ewH7;>22fRBp+tAU;wfpX6VHZibb41x-K z=S+~!R9k{%0q97lH?TFi&@L61n5VfGV1KDR<0O~|S#6aW<1_s6w5Ce)~>d;rKfwCQ_BMDUo?<+YYr4!Im zEd~t4wTIJ*JXbA;fq{XTbJalZgQZiD8$o^r(KsKAZuSfK#I-F(@ctCFf{K%)sCS3J@rUB^wY8 z%BxUemeGvnh&S3M289A~c(hGCI!+8uDKuR-0WOI_nN{D=$P(*}oe|ER98@cbAgU_?xQm_HpDt( zM~9MF30&hq&su|QmzOzdH6B$dRVGn~NT3noU}#3N%B+h|EVBuipYX4N+|Ho`h% zM~9MF8C*y}&s&3(#3QmzOzeScq?N>@ZQ{{!;?Z$pP!ThzZ$tvOi9v_1=^GlGV4bm} zLrJUx3MK~7DmGRI?5o&di>;tz!YHE?(EWBpe{_QAL)SxseVIf26$OpKPqqa`soA&i#9;Dr>hCLTCU20=*-UOQoIF;FvhYT$4Ho%%Df z+r+e3PmFx{+UShk=!_jWtAUBpHu0ca#Rkr-`i3UhPlTsKn;5kH6LJdX$ZiwUVm&eP z0c@is@n}g5E`-6vXh}Q>OJZ=F*u-$4X6!V;DFb>28`c>+SSJEHCX6yV0UGKW7Q3A@ zh`qF##BpNS+F?*AkB&}^j!uBm0q8u5(Q#t%<^*VPK-OA-CZga1%#d?GkooLLtr?Iw zC_lmWSi<;_MY#+Nr0=owfUGArF&?NHJ57)u7(nZZ3AKr#=dhub#KUKtnELC9kq=@+ zN=2~J8CJ!CV*rf+r82M(oB`$`5u@i$fC2-S6G1r;6jY-p0D(dUvhx?j0)@%wxf8@3 z*9Fe3`i3T^SZC~vX}_~W3lv`r(6iV=lcC)T`LwnN{D=#2o949UV$yZBQ_Q z*G@1xU_T)qR;4mEfX`ynWlBdbiNR;Ffl6Xtrc6lb3^ovh81yAEmDf%{B6sxMiP4gH zv?K-<21B4EhKv(iV%=j$hmu$a6if`zv)D#(o0!^bC%`2!=y)e^_<{*gPZ7iz9i0G$ z0&#fs+= zv)I5TF=#p#5fY3V7iBRpK+j?u z!EIt{pT!0)i9yFZfs!EvkG6?N+r*HRFnaC;=psRsRh$F5+Zmo&^$kreu+G@gp(KV} z_YOUa4N?*pFo^SH^5pa6GBkjeXTsJ_4DU8Ewa;RMMDA#tc(hGC+9n27KZCzb3^|L< z)Dr8A9UV$y$V5K$EHjtQfTPC)nF4gJvxs-MLMDv80zJAslR1dq0fN87}Z zlrY*R9(-+LaAwsvG&96HV@HRQ*chBPKqWC#1NQaAh>{q*pAM}g28#`cl9&eTiAT?3 z8{OFf-CH?&j~)2}ACI;P%9XPY<8=4toow1`sNo)cR7tks;Rt7>PF?c^6T1gBR z8wMpYE!Go*k9PuxFPIo@6OXou!3kmXR7`NO3~S*|GPW%~cB{6u9otgPS&DfcN!v=a58{TnZ z=$J4{n;3c)+c0PoQ~NA7=r}QC7#pTU|{e8Ga&>l{eWoLlso8d_8bNVh7Al144}-+0TN(fU;u?7C!}zMXl7tw z1)UWKOQ#?~kU1b4CuT;RIs{h3%)o$TFSrdn$V+0-;(vWZGmC+mu`>sU8)!W-p*At} zEH<=~c=(JHQ-3`%_;@F9_<{*oYKEoo(UKS(EO?30-Oi)Coxur&=DVH2nKiehA~Pj5 zuS73jUjYOR4GoNpO$`h!ag7sO8k>RCDJUdx)w}w*F*3n2Ik+zbs_T#hSl1|kT2_z& zVGRaO1~#zQpo9Vk10w^655t;H28J~a3@mFp7&z86Fz~EtU=Uc-$sn?(fk9$T2ZPL- z1_p&S4Gb!48W=RzG%)C_X<#r|)4*V|rh&nN`2kpu4amp_24+wl3u2;R=pH*^1_lNZ z1_nlu8)5Q{3=E8*I#_^#fiVCk$iTqB$-uw_5>sJdU;??Ghk=1Pf`Ng7oq>Tl1xXzv z0|RRegMfkn1i)yxGmydpNf(SM%OKCdzyP|=&jKn0RAX#AW#-I zN>5KeH$N{mJySn7y;L8b{E8XUOMOc!JV9xZfk8hbKQ~psAh9$jSKrAg$lpIizqGhW zKQk{mr!*y1Ke0GhFN2_};>u!TRiVFI81zySOA;CMl8TEN^oml`GxO5&;Rh0eO(B}V z)&fB;8zChR0|WYLuoKX1fE9wE3qe5sg!M~ssnaQdoC^&LE08(~Br{=Y$+Q49Nv>dE zU^#+Cogi{vU|?Vc^~pf9*D$59a0k&aJ3&P}Xt1S#fq?9(o*$eUuTHlSmg@J(q zlt$3agYhwFD)rq!?gg3cBLwOTA{7>}!ZZz9nG>$dO`yYJMAhXRz|{|^He_JHsLO3Q z>>Ji}Kv9Fff9`9K=My(7IfRjJjL{sVKxR;* zKKF&z!=N$`sXT;O2(=vKPLQ2oK`iwZNUj`e4ygRZWe!LyNG(2d7E-A`KSibb{QGEq z4vsERdIQBREM0=?X|M#8fR)>n)aRf!7}Pj$UkH>|(Cc$h9ZgJq4r)Vy)Pmd$O530` z400oSecr*qz`zT$6sbLpB!tSOa((WBR-d~uaOIX%q#5Nvt8)bf1wu8tkpW3H`X9VC zI-`4oOCtk=jpYCTDmxeyjVPeaN(T5z$h7@ z!oV5B#OR%%x@HZi{glICsQ3Rr+jSq@N2?hp6$fZUQ1)$!$0|NttAOizq2}B4?f_m=`3=E7q3=B-5-ns|_ z12ZUuz$zdF69WV597X|9_gw)*BI3JRc+2uPWX*2@Q_YOoqKac-Dh zXyTw0k4-&4$TO%dXs8G>h0&V_C0A(m?`Gt~kdv5{niHRspIxy&6@b{FFcM$@%{UKiZy!`!g4_ebxO)4b*-el<41;P^5F5R9 zfJ+^E>j0z~2Oc)Wr**f5n_2Pxpz0c1uQ1JHRKq<1_9{a zYA{D>HT0}tVCY%Npn%*uVBkQs3|x8?7~C2Z7q~GPF}d^yFt{~@D7Z1SG(G8HV0bc# zfn`v)8o-SPq}Bsztp?B-<7le^JO=3j!1w7FZ~P#v6`2V_DS7{~88?{NR6KOtdTxg0v;4Q}{sJilxgAC$#UFR$PVBid4V&HON0IkPh z;0$3{)5W0R(uS_ag$cCY(opOF|216<8ZPbV@^CXmpk|n;a4;}J*JHB4*J*;*XhPOz z!q#QN*JL&@uzvytB?AN2Rt{(;M}vWZ5wxxnq72-pWdx1Jf!1DbfeAv_W0o*5Fe)%G zFwKCB)-mq@4a+ewFdslt2U^3i1Eh)p+>QZdI1mFy3n+j_Yd|6b0TeUvI>+^KrI?j>IRRzLrWnLdjYgX16G5l1&M&-7DR*6 zH;4vdm>PJv!vq)@7(k^wObuu~FsKCrG6Sh(1xbS{3NQ^a1FjuZ{ewjj1W3*m+HwG; zCtT)$>;S0+>%?JBKGYmg`om=oNGl<8Wqb0%3R$ zoxK6&2VCZW{EW{%;BW)y{ehjWSpaqjga8$EAQoB+g8|fX1Bt^htndS+J&->^X$mBV zOC4GZ18g3swgl+`VOUy1Yhf__U|?Xm08#+OFm-4x3|7#34^ZnHstjHxgTfyve%L`{ zOdt$$Gbp`)%meuat%bo3@&`x^-8>i{gQju|V*$8@kzNWZC?Kr_#Lx=CR)V3Wu>lFY zELPxaC9G-1vMRF;%c{(F$f`{6N>2107N{#Tk=wNJkc5t1fL5lFy2}DotAo~+f_7Pe z+M}R#8VPWN!L0(;2vCg<8kK-y0a#iG%Oj~qXClTVAje@q)kAk#fKxFz7c($`*u!yU zCb$NNEXxEZ$PvFL6PhvM%Q4|~D`ZtWCJ2yz14#UOXW+y!4a0#yN`Kyrmpb3mmgE^~;f#b;Bg76+}?2hDy` zT8n=iMzuI-%oY@1APg(nKRW^4VHi~Nf!OG^I4*VQwKzx}sLTVI0m87f zgkFn-c32?yvS8}aYjMzOdSYsEkh_Vg#X&tmP>T`dHV_7d1&GFpsa%W0R%Aj8&Aj}g z+{B#BDp-G?&2IFfuZL>Om~~E5NfM%NQ7roM2#ZV^L}X)zWTkCQNPu zAq{REE=+DhO${y`6ByhWLRj1cCN;Zpsep638<$BFD7f6X9GRX>U|@K%iGcyM`tk`V z4}v71xPgHY6eGB1BtR=)K&vm2QwwND0@N=C_0>VEXrLy6_fD!nR%$YNK=#NmgUkli z>Y&wNFm<55dIMG6c^vVoNzpwbc~0xHEoG$?I@Xb^^}ft9$(H9SlmNDasgYSi$c z^*^AQ0!nN6(LEQS*u%aG6)Xd8;SX#-9l1w?tA@H-e7Sk8bff?}9D^co(t=aHBi9<(M2ROW-+3`*M|^FV$9^~qs= z01e-QW)?uRK~QUvvl~nZm8NnH9|G;CBMJ+ylA^@C;+(`1VrzLLLjw|OdA0z2eRW(T z`Y5CK+=vl=2JR3hMlJ`{H608R44f_u4BR0M3|w$A3tXf6s?d>q=*Yg!ng%Rm1P$OZ z0<0%5*l;i~nsP9JXBgIWFo@W2Fff>MFff8z7NA)LSe!L5@Z*~S0PXiMVPIec?Yx0$ z0ktYXYj;7d3gmGH&^m_=&{hR#{s=Ty09r!tWk~wj7#KmV2oQDvjrD^V0tS#q z2FeToxY+@k5rAb!c&`d(8afSWaez*2NP`v2naCsWup$m^OaWt;J*buj=?A4ZP`L_CmpIj-wK%})h-h(u_VKa2 z09gdZpu7Q!N3<3P8^}Gxv^YSs!9=t;I6$*<1KHv@0c~+03JXMwBMq{Ufbh722`OhV zZNb~(Am`kMRtAGLZ44%B+94|%*U)x$0CsMJ00RRv?A!*>Ssu`Y18Os}rciip11NVu zj%bDCB3O+M8e4$X=pgoRoE?DI=#Uu#c)}c=B|y~Z*k%eqXAObUAgJU5(d5h&fXtvq zt?myU;Rlue;Bh~YgWwocu0qa?g0OJcqLol{KqWsebBLKKSWKmv0#Kin8Z!kyM`sGa zsR6B42d~xxOF#)wZ3|+e)#_k%MAYgGpqT$VNl)xr8%@(ofWh)otRo3ROS*< ztF!koFff4Da)9gvVUV358YiamI09^@0IBfIEvZOOEI}OJ0I$_eaop5yVPQf1oIi^I z%4`8I_@rUDZ`JqyS72xmP*h*SAh3P|!v%%~4T=m78j9;TG2CD{FhOzseug`s$+z_z z8Lp^rWC&nVP*4Q%nHV&{dYBY66xBB{On`_PC^9iX`}Z^4>EFa~qkkjAmHrJ3 z7eIY}^}XN~A#nQ_urq*S7|w?=plbwRTx1&5?+2Zn#KFM8h+Mm~FfcHJQd9r~1LGYA z1_loX1}4zx5)%Uh6S5s_3=GVm)CMw>@&Et-{~OpD82~fY>Dp3gBs2n0k;Js5Q`?L9m38 z%#fa(Y!siIpIeZblbWK(5FekOR|@CHCo?dhF2qC92s$g#Ik5zE6g443V9Qv2AR7-r z+kRj|ZV(~R{$ZFCAz{J5z@QBkL3Te>2u^|h2;#AV2viJ`1DOHZ+W|5Igi%#MT3R4= z&^`u409_H7584wCW-x&E+cSXIbwiYcT5hoL2bl#LO=n;^4?kN2d@UdnA6)7{`Jh@3 zWGbV9p`HP_v+eHeY^9*#?iZ@5keZ%ctZSraX{cvrreJ7kX=z|=XriD27BIZ`6Q9*1FhL`Y=Rka`?5M~Fd1BE3h{e$#_;tLc$p#CC=4N?Rev4xFdBdY@y6QI^J zNFOXNk>`s+dSUj0_GN&~C8W*~?KD7;dDvOpLfx(WuO&Ld`C&%nTt2-O6lU}k`5q?QyL$Pb{^ zX`nCzg#*Zaps+z38E5;!z`y`n{{b=!ghA$jXq*^JjRrCsuAa!-kdW1b+=t8uxe?hN zAU4SDFf|}PD7}FACE$K8q8tGqf6u_c0GZzgZTJGIVqma?P>|#C36_Ykl8bO*rozC$ z4f4MUl=fg?-~sVN7#Mh2a!V>I(sD_un@vbqkH-R9wU3y|$E=$xzVBdYaA`fj@O=wI zflJ#0hVR=LDqPw(Fs$FekkG$@VFsw~UcZqcrGF#C9Q7p(3hOs9Wb|)hSg?LSLk=k6 zfa-D=)&mSKYzr7%*f%hM)ofr8Sig}$1SG$H6N5zmeukWWkUo$(8yFI3~vk$7Pk!SQlbv3At2G!MX7#J8F z7#Ns9`5jbOBdcR&U|K=%+1l83M zZoWj<)nK*YgbuH(Biwwk^*}-OD<}*>=^8|1!=O9~79S#YG_1@S?sYO~?G-p)5Je#a zs9g&xW1-^gp!yh8z9QGPpzr~eu}E>w4qAl+(u1rHl)upHWaRN+kb02WAR3fMLFU5h zWL)ad>tv8RP<;k61B5|t0;MnnnDg`n00!fjxel6hAw zSTBfRhMY?YQY!C+VLFom=?jfp9CaOb$w~%sx*0~9wIu}yc zra^|bkxwJS)enYWTuaOjIpzx}{a|kJsm&n2g0V|$0>hCe1_n1CfhL!>0EQ!N3<7Rk zhD|Q*4h%;c7!=$%7?|AH1RC5J1R9RCFc`S82sHFBVi0)Z!~l|KapPfNI?}=*;>M-O zbfk$v#f?Lt$&H19!HtOlWR{5=8v{fCA_kEs4h$fBI6(FsXE1#sPhyibQbh}P+Ys#w!{eCdeOsDzW5K6ngTf!V z9}8N|1WO~ZG7eO>fz-juX;2vrQv;%5>d;3%aj8Qe`2?xMR>z^Qp!&hUzy#_;gX{!h zP#pqt7ihczx!(yIK( zeXw>V$R8j-fM}c;OTQDTzY9KW5*9aLGsvt1k=+4egWL`_4;pTubO7Q*cU~pqA6Wx8 zufYWaS5bZmVzCzy^^=jQ0SV)@te`V?@%06Ftlz*Oz|hbD8g~u&zJ)=;rF8*=`cj6F z^~)Fn)R!?ttl!Td@_iqJ!}mQ57TTH!ws%^}@!q7;O4}!B&!k(h|c0Mh5Wuwa|c2 zV(Vv6eG96exfvLkKx0;5b3lzp1_ox(`3N!4S?ml32JjAcCI$u;P&*%{j*EeT1(Z)g zd~p5TzzFUSgT}xa{v-Ov9+-V&Mo^i-463i8dO+;}kU21%fT;&E-m3!{vj&w7usR(y zmJMTr$5c7|;bW={Xyf3ZG8$Y)f>+rxfcDWbf^I7Ui7PQMF#1R+fa`S7?Fcps3g9*x zC=Y|oVTCyk(p(1fAY#yrNx1q?DakL=GeRFNM`$k%0%vj1Xg7pKaF_{dVmgve#0t^k z%)B&)@GWf8L3p#DC}kUAuck=AoT{0H_b1_2HikSG>KAUV)5HK=?BNrS={ zq!by0%3hENsS+6UY$g7&}Nm zcpMXnAB>bHK=Pn|A51@}ZUSi^=KX(0BKrTFp!PkeO#y0agTe_^XM@5ARM&ynpl|{W zf<8Un=m$7|DO@m=7E|GreNyO`u|{c;Cv5Og;-&L*8gYx z0lhs9stnxL2l)rB{|`PT1Y6q(RGxy=L-n(Q#_ow|8?l1+D-tm#&jA{@1f_XUn1R9< z6t*BgqqU7VLF<0gppF1hNNxggF)^055y)(~LOPGhvoJ#92($(c)NF#>AjH661alC` z(+uci@(c{1wkcQ%R30?;i_8xJ)3LM&JkHn2sg<3+u~)&?}*z`(%Z!oa`; zD*r%p#h@}W05s;$z`zj0z`zFz{}~Jn{Gd2bfs9jtcD@O+Br z=t*W^P+?+X5J_TSQ(@v@&{JY?2ykFvRT23Ap96Y6bx0Beqly3nhZy*FDg#9ZL5%}8 zObiS?P7Dl8ZVHMFiv$!I+yoR=jxjJ!aAsi8IK;pq;_(0bf@ZJ=aMUp|2!Q7KW%@z$ z2pbthKy58(TM3j;7&fpoAdlyR^?(Qh;})R(p`dXK(5?@Vau5c^1E`&nz`y`*zBVv0 zFoEX(LG38ecm_xf2y-wnFvIMGw2QFM?*ZX#l;LDzEcv!yx`2LR1^Wnl$0WvqTtM+)Ep#DuBin9nQ1|Zxu75e zVQ_dsS5<-dps)hb*f2~jcwq#Z0+1Z&EI1GbnE}FRO2F+WkUDrj62w7Q1m;89EFdO0 zp7E>`0Ie#6wK+h>p|@fDK!zZ-S-|@}koZNQ`7Jic9Uh=M1Ed_$W>E=BEz2y<%+Iq@ zFw`?tP+=JQ3kw(^H~1?2V#D9q5>F&waU z3drg}#UENbh5>nB5VE~!?HHWu(AqIzb;Pt|I2ah1z;mS_OQE;AgTe!?9m5PN&xmNp zuz~YCW?a~!~ahNJB9QqSY;q>640%{ zJfJp=1_J{RD8IQdFffARGl7AD7bKp-z`zRq+}v1~*u9_x#=yW}59UA{9t;c&@N=J_@}MprSP7UvFoh+dHVCNg0cwL}U}=LC6y+y@ zk4_-e1~IfWH6mfZg8_jy$P3W;323eil&}~W8sKdP=y(Y;XuO1jfq_p&fPpapGDZR( zZ~z51bi4z3oCCQ(z_5W4<)&|t7BD6--T^WLG~NN4mjSDX^cfgIc_4*>ff01h0chL< zG^PS-Gr;;kAhn?V4B#XH8mPlFrz1gNyaQ|o1#JeolN^Pe{a5)MkJg z0c$e^fYK5uFo?|t5Di4N8IT7!KvsY-*pDNmeK3;S1MvA?L@|us9$*KpnF5WIBiHkw zFhd)&V27}3Z~ z_kqF&ear&nSLApD`4!|JoOqD62OuX6F))zU9-w`}#{(U25Mf{dk2gp_#~VN=^Mm5T z0yKA`Z)gsh27y%9h&3`s1{OHxMvRS2Ac~1u!^x^apl&~~elvp(!+{x!>o+o}Fg)l0 z&5>vrY-0GoeglI7sIFhXjlqJUVFPGiqs{uQ3?@+rUr@E|P!62}HC4Cc7%cj?GMMylVKC_5%%Ic1i9w@(BZEr+1_lM_+zO}-&9I@K8F`Em zp1ujRH9&Vof!Z2qZGZ6oivk7)CQuushk=0!)aGDfU|>eh!<-BZ%r~GGLB=QQ!D~)H z%-qzXK=1?$l7MeTx6~dt4WhAHphb9Y>1DRn7X_JEIqyM%z!q0jiTh`5w8g0tz#>pgt2w4G6>3p|xpPK=aKozkt+%%mUG%`4ku%l>9;S z%Ajxo$$>CT4tR(FUWl$Kcls2I6&onH^@RLhS>|{Vp4;w zP4fmi4+Gv~4RS5WlaTcnARcs2Cj&z`ga_xRqVY@7`0#!(*gQf7JghjSPa$l>z`zYE zPC5?=sWbHcEJfkA*p-_YC$dU+9m41_{OWn;B#n8fGX; zF);A1-_M}Hl%SvpIu8Prn3)_vZ6*mtkpu>g{{0LJY6Aa%s3|cp8U!-@mt*+eZvoK-+;z8VQN6M27$2@VUQwd`v$ZYgi!kibg~a@{sqKtAfI1eC47T3}{?IiQdLV_2C5D+54f9asVj0aJ@>P6cEJXk8!3 z3=l>)0;C^=so5R@&Ede-fq=?tkews3{Qxg>@r;Rp>ReD55okZKgT_rj;fSmbRD7V1 zi6F0!2dM`a_gKb6aH&IUKQMsQ!SXrCJWv_}r5CjJ0|V%c2xR}l)Sm_h9XBH9nk zpfU+m?tttBVUV358m;}n47$;di1q^;D4aol0fiYTyg}{*g$-K!fekcn0-sMn>KlOU z#)=17`=J5aegO9gKn@0ZlB7--xGcgbm@GhJ8v2IjuwxQY>R3ZF>|+*&=4K>}Suh_! zIaLvDJtu6vC8%Ey^4A2&JRFFLg7MdR44_-FK=F@UUxL<4g4WAdK+j3?VPIec&EoW`-NIRNKVkbc+Q8g8;!gFFmy+ zxwNP#EwMDGq$C4cVG(Ndq4w&Fit>x}v6=(wUAw22IF}X`xq&Q5O$h;8LAY;^Qzu9Q z%`8y3Amu+$IR_E~D@Ofa6Vx&44tuKw3FGf>` zUKfJQBc?9QfZnJIH4dECK<+}X3qkV4)P*25#MFhLGK`425PUNrF?AuRy$>4W1i2H0 zL4E+yIPoB>3k9Hcp%u)*pu|P6E(DcDSc^B11hzs7+;?SRVBlucH#9ecZe&HRA93w> zFfbvZeq`w(FsA4|Njdl zG4QFd{{KIXi9yJ~iGeA=fq|t@fPqI$5VRNK|9=p>kC}lbB=!FfkQ$I4kt7DtemGEf z96aU^3R~!SyhJ~ieGMRa5Z=Jd0LphDCJM%1UxRNl2K7-v`?g^EK=n0f9|Neq2G!%B z{017s1l8BbWA&iFL4BLix}JdnG>;C7Ul0ZtxtMi5J1C!m`eev;IF`De9hAR8 z<{+!XR@a02Z6I|p46_$h=77wFwFz*kL$B*W>WHc9L1$Ee+AT19L1`M4Hqh&O&^!UC z9*3y|sR6M;X$HmyZPy0b3r<%cNu>5KTECYC)F&XKu4kLVzyLl+78GWnZ~(av6gFu6 zUUpFV2^!mnS__`1g0ZpEgRHKfg0-$^VDN-F9^`2T28Ku!KK%+n0Z{*$fdOL=LJ4Rs zKx##DYC%b2aV~h5qyp?NV z!0h0l3o@raihj%oQx9xJsBnLa)Q-I+~s6Q0O`BS$&m5ilOf~36NAQo zX9k1+E({j`T^StyyD@nDcV`Ir@6Ax~--n^%zb`|>e?Nwf|NaaU{s%D3_#eoy;C~Rq zivPh38~%qd?D!wbaNvI!!-@al3>W@KFx>bb$?)KR48x26u?!#n$1(i)9}mh_4nqGu z7&#ai90dM*FbecXGfEg|{$~(WU;yVu&>c&u91IM-91ILLjQ{_eDE|M?$QYnz==Gn0 zQ7b_eBF6BaIWaQ=d3Vjap+Fa0);>5oO}-59xVn1 zMrc}8VZ8refZ_iKCdLL86~_G__FE9!fir@^p)-O(g$1%!1eBN|;ad+<^8}Hu|AB;2^8j#F!P~mid zsj-2oIbfv8h-8l40UJ&RMyNS3H7ATTnUK`jg4D2}skvaJ$%3TD8l*-5P0bA>O%5bA z<{&i=Xlfn^F#Mm46c!xlX_-l*L&Zpwff1IEj0_p4?EW zL01Htj-Yls2q{3$k2lg}P(Z{#gS-kS2Q2=Ev1^m;Kc^n%NCi1`8x z43cZX{J;Mh868v{Ix;|ciUXt<6#puWe?jgN0O?m@{D-Ut>~@Hne;_sNU^Sc!jLSV4 zgh2XLSQr8Xplg}>JsDWw_Ioq1FluvX2`E778)gR$UC?^4lorH(Gf+bXWH!t{pfF$W z1v#j3traLAGBB*MVqgHpIjAfH#S_S02QCMO^I`ZUWCi_Ubb5Fs{x}6m4K&VqC)@#lX(MtHSvIzi1-^ ziw$D~gXltNADE4Smw_QepjU@MM1_%og>fP1oSqCJ#@+}ss#)Op0hc|! z-V6+a36L}kawDUHf-ZwYfG#7JFkpg~fi{c=42+B(Dh!^^*dX_RUIB+C@?hs^Jvw~6L&jyAWe>O5K__K*&#h=X# z8~$uz*zsp8!+}5B7*71z&T!$+9)=fx_A-3@nr|&gfF`oXMEYixZuk^#uYug;dLwc)(GS>15!4_>OOG&iBz{j z>d!U186|9_ml*U{Gw=u}K#~`zO#y0~fZ7!dQdi)0D6``QHRC7-`<@ky8q6LSRG6!7 zs0uVNFt6For~wLBP}+gTJww9@-JTf?3_a@^So--GSQyW9Xo*0}b!LVWy8RLi3@~v4 zh5x@ndiyOH7}o4yU|6pTx!HNm5(bW*CI*I{NGN|Mga)ZaPrINxZH*EGg9--&%MuR; z0S1Q)y5KnCU|@i?H9&0$P&))$I|9_ky6?!KaNmhR+O`L&1F?hKl>X3=Q}F7&`9zGfcQ2z%b)}Aj5+DK@2PI2QzHA zAHuNXekj9%`(X?x?uRp6xF5lA<9;N=gZnWIFYd=Oe7GOS@Z)|wBg6e@Mh@l#2I2eB zi~`IF41)d9j4}?h3mE#N!D#?oCiX`&>bTtg!EoJy(crohqs4U>Mu+Qej2_oL7z3_* zF-BbXVNAI0$CzKuBN!)Kk7As0J%(|?^*F{A{n3mX=yA(j zbwhlhgLk=KZMGcZU;BF5ONR@ z5-1cD1hWMM6dVK+AQy0==>*wRAke^|C?E)ei68?&N(2Q93D4+mh2?_`#Di{a~LP=0?2{tfr z3knD+2!b5T1+uo0fdh0qDd_5RK?XsA06_zRqyz!U1R((dfdqj90Z=F_2nrf93V^Is z5EN)&;9x8O-DL{W4aEt9ATvOm0+7X!z)nO2bbz2DgMfg5kOBk?2rvi;I50AT6bLjh zNP_(@1d0!k5%{n|0k#NB02=@bFVI!0Ak#rf6of&Y8W4>gL+(;N#=roc=LD$%b$dZ$ zAK-QaNB{$a^)L!DFtC8`dt_!{0MD2FZiYRuq7q z5g5wAz;;Ce(l1K}#jgb9Y(mgp<~`7{>0D48NTxJQ*jqs1 zCZWIp8sFN&z`)p`0AU{og^dKHEq)xdpGN`0z6lB(&iCMR6JIhgFepIT-xwI!QXq5c zjEoEnY#LBDD+2=?3zW^tz`!B{WrNbg4JccPfq``blr71?z%&QSR$^daS^;HiGcYi1 zfwDnss$8IKdj^>y+LB!e*y|V=n9o4X--g8A z&A`C?0V;kFiG7TLfkgx=euja81r}E485md^pyKx!7+7KUzF}Zs*#Q-Q&%nU)1j_!z zz`)7_Wq)O0V1@bR2Ll7^0f;ygDDI%)&m_RWz&-;iF2%sW0gW#v6$S=QXt+VfDbdzU zfaa$_c>r`4CMb`9**Xf~HanQD0O^B**=XXRqpGoqgT`dBiG#`%Y~rAKQ*7d(@&ubW zsLa474jM2fXhkDRHGHmKWXFOpO2aPjf z69=6Ih)o>Se!?c6g~L6dc|UCG^KhsK?bXAk9&{!ZHgV8+IX3Y!9Oi@eK4Mc}g+o1P z{X91HbvV?6*4|-L--JUwXwM-w^=&xRgVq9IQ{RO{J*ZB=roIn{deGUO*wjzLp&m4^ zfld819O`G_5TAuZ9CTI!HuFJs8a8pzoEJ9nML5g{^$W16Uxq_HXfGNz^{a5G2i38l zsuI-p1JU5IHqd2bAP(q&Qz#9pvq4PQ{mqaw-Wb63F-RQT?_+?Tg9s8BmRLU{KQ~ps zAh9$jSKrAg$lpIiKOjgyCo`!ur=%!RA90uVP?VaOo0J2Y z1c!?<6sP8;#OH#xon<8ErR1c>I~Rn4=gnR73PE$`j(I7OnW;G`$YRiCb)d=ifcyd^ zo?m_eSe;8|aY159at4x=b53evUMaF-&%6@HmXI=?}Qc=SX9DLP?VaNo5|oAU>5I@l2gRs8DI`!By5UyY-$c#@dDuPlK45h_M24DirGz2jXD;UZ$8Hx+y^Gh;Pi{c?p z@XPnjFG>wcF7V7NDP~B_WGK#LD9B_;DPTy;EGjMm`7;#~2|=ZKd6{|XkjP5O&r4;< z%ZJ7fIOtHrJ2a z1C<;^d#!+|cpyk#?t4`0%Ct7V$ zD)Fu;t}HG|%_Z7s$kDn)D+d?vM61roFD@ZkadLiMS!xmS>Wfkeh&H>Zn0U3h`Jj6f z2$#)}#F~?tluWcU%2JC!hu`8*k5o7oB@^jhe1$Wzc`3LGEF?uq#9E5mbx5Y=7sn?N zVJTQya$->m;XnZ^CAJ(%N+Mn*(KS|lX)&>0N-QB(Wokt#t`vk6oJmO}6h^pXlIRw3 z1_J}6+J!cLz-=emG($mcV~=uplNQ7c$VB17o8UMa<{&MQ_A|IWhup3ONkN;05Eby2 zZhX9duzOB^Qeuv0UWspFaW(_CwlB2R3u@^@n!z9ggELA?Qu535Fx$k)vY^8%7>cu9 zD>5xIi7iRx`-KL8W<+HNR+0XpkJV=?o1!kO*o68k{armn4G}xt68ol>~!s zkP1mmLTZbH{yj(x)`~oS8xK1=?2#8uP_vjtt>&W}XOHPs#uqBgSQpED`2_;tLc$ zpfP1!=78>XAQV2JeOVxXfySV5nFCs9MZg>u(ArGU{#DSJH7;{NYsU$h14_rB^IAY- z+_=mE?JXl@4rmM*bUzemOdOXvpmjrp%$W{a-8Bc`F0qtQ0xd$}nj>{Ys z!tu`X8R{O;7(Fg?K>Je(xQ7*#HbD6lG^UTs98ft&$Q*BIeh19~;4%l4{|K1_8fyo| zJ7~@TmpPz0VM6AB#%Mw3LxbiRaG3*IUr5NDOAHJQAag)-61dC(mAeGY0nHnO%>m6} z;4%l4E(nYHO%N&qBgv{B- z0NGOtnuEb*4yc?XWX>b#9W0=9gv%UIIY+=8cF>$Q$Ue{<4=!^+XJrsF2ehsL z*uO)~0nKUQG6%HhjDUMMKxHo|oI!J7xXb~ar9#M@KxjDznlr;?4rqM|A#*_S1PW(R z{=j7pXn#2&bJj61Fo4Q&(3~7Db3knyLgrkC))$~TJY430+Qo#-0j;+Kxd$}ohszw$ zzAXagaDw6sWDaPK5SKZiJBSFG18S#&%5l(~A}(`4_W}?yr;vex0aQPM<{)vI16rd) z$Q;mIC8!(+(YVY3l?jB*ISg%wgXTDKnFBfxfsi?%y|$qG2{b2)%N$T2hJZO-pgstw z`~l6O;xfmXaDL|ksR7mBpgC7u=79P_gxr%2+Hu0bzyO+~#bu5w5$>4^%@?5d0xokv zZBat*0j&iCr9;phFfMc4iEs~ST@=V1(3~+Yb3kdHfP1(>`+`8}6*R|;%N$R_?%@WN zhoJdo(3~_bb3lDOeC`4Fr=WL_f!LsRjS5J7Sou zVPIgofyB22tqDWogU&&lgT(g)tqnus2Z7dyA@M7 zK=Pn66}Dav#0TXy*j{1~e>M0FK*U{a+d+cRy~iNtNzghpB>OLd1d-$)gVv@Y$-e@v zPebB=M_T^}ic%)fnl*$xXb&9&l6x3MLF?F%``Ug4WR?@lSx((joCr zgVxg_@y~(Q)FJV&qoxPY`9^F=>6!5}(t1wNI29|>x=ausG+u)gpG=_o0GV$CTC0b! zkI4;b9VkeD2+}%I5I+O7o)1ZV5z_ilkbD(rjUSRcXsiR-z6D6@LqX~{!Tl#9At56p zBLhBwLjiQV0tW{V4-XG)5jMD-U|<844=ms^0F>_;SSNtieS-5e0~6>>F_3W(tXEu_ zTauW>pjTW{1fervtdi7<5(d4Z)SN^;I1|cBNi0cZ&`T;V2Fa&q=B4E`=;eZk;TiOb z@*%QdjYu4r1jJtANZ5E2xN``)Kaqif3v?$jOgE^U1hGN=E6|>A5SxL4!4-67251}s zv|R>N?t<2bgSO0o#zR1Cs5%c&`xC@QRtI9k+SAbWMcg2JU}{0?L3|JmYR7@hg{cFz zTR`G43{!`;|DGG94xHwo3PElHxfAW&IqnDs27Tnc88CIAF)@&OXnkW1vIjKY1~rZW z#0RlK$3P>63)sJ)x)J0@kh?+VfoM>94q}7!FfcH9fXiu8+Z7uzvXNA<#w# z1_lPum=35730mj|3hPRUQU=(WLH(e$>!5Y>&~pVqV|QRBph#h0U;wpcKy6Hr7|4Ej z8idN90@ueNS;!tp&=?Sy2bF&Uu8+YYVE4TS*T)F{4^Vx~z`$Svv7ZqX4X|tnD8$UH_+KLpH!%7glw$b5TneGC=>s|T%D2aVtEf!Y@Vu8$G&ap3wF z!B0iwXMpQpgnSMfzW`kSBIHZa_?6)L7a?DV#%~4JzXdZ z`WP$%ieDyoP<;$a(@_1Pp!%4BfsqHw&ji=U2=&FF`WUqD0xDk(u8$G&pguR42ep48 zs6IwgzZonEvJk`oO|Xql04IYdJVz&hQCF-EsR>|F(3Bnv1A{22y(PfFAO_-#FffRL z_#O-l5+J@01A_#J|A&D=3bc=ofq_Aaje!AlmKm5I1K~3%FfhooGBAMlv&geCFff@g zFerlf77PrEAbtb`gA(Y>(HaH@7La%g0|N_4yaUPy9f1nsA7Efm0jYbyz#s%t_k@8# z2z2(D2}B%p<}OGcbk{qWUH}yb?N4Q4U|@a$;j{2SX%&dOL1zqs+zmSOAEb|^0V=-& zN?(D}e;_og1_OgID+2?o4g-TQ8v_Gt093pNN-u!;mvspP1IWLuXCVG%y#Vnq>kX*7 z7Yq#6AamX@Fj%uOFtCY0#MvyMbO@BrfT&~3fvRhP@;jjX9tH+m76t~;8Azb^6{vg# znaj2SD!+z-0W7|Sfx#ZMPizMRgFVPTsK40mK;>UBFgSqZ-!L#ZurV-z?y+)WVPIef z*~7}fz}^Efk9`8fKG42KPdZ9iO5s>iYfW|w=94LPQBpq;Efav460kIFXj}YWe zP8W!|oE{7eAp1B2AnA)U1Y#~{2E-iB9Edqw6%amG4U|8Dfx(@Xfq`oZ1A{voqloVf_CObWVapX99yE69Z$f2Ll6WpS>VA10P(y zC!>U+)_(>@j{x}jJ&cMTDvVkls$l(!9x5RHAUi-9cGfWH90f)e2UUj-P;(w6gV_HM z;!R-S2aRolm?#)}wjpSo8WiTBeg#aPiGhI;G(RcHz`%&yU*lt7VEO~O$B-E`hZ4cS zzyjK1&c(pMimacNfq_GUQ9!`JP{6=IK)?{R85y*7TEGCb6&cjoh1mpdk03Z0Eb#tP z2GDu~&{#Q08Z<8m>T`g^KzvLL(E}Qb^kraR0Qnu%24>KK>=_057dEy9VizcY4|Zk% z%~2IV_oRZ@GSEG#pfTtS$UZ+%TZI9%Zx3WA%uG<)1hb)gQo(GreQcoiFg9_}+7E2v zpneuManSx3Y~rB)4K{Jm{upfH@O3+A?gXu$0r?FSz91S@Uw~-BSWgezJ`_YYgzQ5> zJCzaX6h^=Nc;}47y!6y~$jY^N(8-OX+ZV8H{DE!Wz_&scZL0z5_65}CkKkq>O2nYA z9>f|qphh$5@ux~l2sC~GqCt5NM1wFW4}oZSdIKj~kO%_w;Sasrn*AU_i@2Yj{~Xl($f zT)|}yXayi4b3pt2L4AEtIfTm`P}mVN2NYkR@jFnth07e!_!c2^K;t5yFb0)#xXb~` z<1+`G9-wC$fY_k0MjHEN0F6;*AjXCnKx2`}@}PPWQqNF*>=xu4qA`}SSq9LYH_QM? z*BP>A1(ar>;@qIP0F9-A#6aN$YO{gTCdl6)HcTCCyZ~7pD2_nk0n!JnV?b#iss~KL z>_r=!Wx%BlZEO~-j)<{Yh8GMB?4UIwU`wIr?t|O~O7k$cfrbn~?I6&2EleFq4Tue* zkyGP5&82eeI<|al4khvCO&LWl4L21|XK+Zw~ zg#idV@FXx8HvMM=ogJnMI+v3hbk-a6T+T$$xtaeN7(4`2ZMc>g^m;My2s$vZF>w39 z&jn*t^iVU@WUy!S3{Yj@3SnUI5>T~aWUyywbWmaBc2Hs9a6Sa;3ov>FC{FbPnZ3kd zjTQrsLC1ea!_5B-jGPXLenDe`3S&otszVRvq73Aj9vHA`AlH z^Pdz!$38h22sjD|2njlXIG}bvG%-QO5nc9g zF*b2fJYy3Fm4n#C;p@rK!U5E$!loXyh8CMRs2;#34k}BqiG$(_n>eUVhfN$b2ZBu; zlyWyD|+!ru2qs;Y`1cl^S3V~uueY0|C5a@GOTHbdN7JJI^e_`20d z=8f+1M>U|;~XOJQn2W`Np}ATvO1FpxL` zLo|WRfUp=CaNS7@y1N==Kd4WD%N&p$gv@D#uHOdrA#j-k>emu72eh^pG&Tt8bKo)u zHC?Rt|YZXELD^T9WWezA! z5Hbfe?f~lVf%>4h%mIz%5i$p~HVzbDpgt=ub3kc}kU5W``z%0lhRYn#I5+`wm_cy? zau291!(|RAjS?~kwD$^R4yX@}%N)>nIw5mF`({Dq2B=KLWezB<6EX+1MjB)eD9&)1 z0~(hnWX?Y5emYQ}9+x?wJVVHwSI~X0pfruk9MC#80_L!Q>;kz3l%{c+1Il}Z%mMYm zLFRzQ7;u>b8?y)3YoN*l%s>!~3=AxwacGb^pfL$t=791rA@_jx9f8aNjbY$22Q)WF z$Q;nPJt)pWV;;E70hI-W%mLlC1~LaUMuN*6BKGft)&YU*FVL6@E^|O-3IX@9g6bVm zxe6MC!DS9;PK1y-p#7Yna0ZRp;4%kPHW4xhwEh;9zd&O=xXb~~xe_wxAp-*gC{KXW zBQA45WgG!>*g$13D84{rNVv=a?T;j64rtv6$Q;m^6E1T=WhEhVKzp1(;S3t1!etJq zJwnKw>Cib=(3lo3b3kP-A#;vE!x=ONhRYmKyN{4LUl>W zA?KEZ*r0kGHogwxgUSo!IZTik18XR27;7YJ6l*GL8fzwN7VA{jX{<9@XR$72UB9iL2YnQxPZz7&^#cB4Z@(d42TA$VNiP(#AaY%kb&JX32U2z`V^pcGpNh} zv0>^!vnTXio~LO%Cd}fZPW%6BNcs=E;EC6X zZUw1X0iI7qtaE`(%!1}uN$XH^K<7z$K=Y&w3=Am@4B&ax90mqoqiZ^{Y3qmUCm#|lchSnekT-Al*-T59SgpbA?D z2?|UQp1{Bk%Znf`97E?lL2WS+1_nk@84Z&I^^-tp7&Pw*n&XCvgXTRGp!1%f^rpbT zzzd2u(7Y$8j)bXWVqlQi0iE{*T`MCXB;WwL;squTk9(K^3Jsa-1hsuZ^%F=6tX@X} zd^bC&u7#DwAa=&+Tqk55CfeK+sH}p88>pNBvlSE=K=BP`qp1hgY1qW!ZBaD!@HQcu zIJ|9!CJu@#Z05t;Dro9K=@FZHc-@Vr9#o%TQx8f**u+8U6`MGy--1mX)DOWX4y$)Y z=Q^Qlm(k({)GovpZlL-Pn>eVR1m$_8It#=dq!{~LCsOqSn(K5=ErAXGj?Q(C&UNO( zZY{u^1j$V;9zD?ZU|@jU^9)@lIXbrq4KeIv-VCF2n|Q;Aadd7IZ}^PP zZ9;6zZVy9S95O+7sr{xlL%0VGrlg zxlL&B;K-+=bDIRhXLN288bH|d7u&F%+eF&030gA+naia5{2?@OiKDR18zRp=faV!M zCV}b{(3}>C&A`AQ4LU~}G!_jK1Jx&>c`wi`3EI4&H0ZonkRD`ppg9cK_${o@fjn0U zQV+8iG#>&omykO2c|(wSps{$6Ss)B@AIP0(^M;^1;3Z&oA*(~150n6%MFkrp1*rp> z1*4JbS}D+ZSD^Vt&^#$<{s&|)$b69hVSWIGA80)jDEvTXfH2HF5F0C|(tIGyo($-G zA84Hy*glXW83=bOIiT}-JfQhJ(AjHHz6FS{Z)k1_-RKCOwuA4BG{e3x($LZZs+^d8 zkt_}<`yzSacgTREFO00GiiR-^-w| zft>+#WRk_Ta^Ajp@Xxe-wM1FaimfSw%! z%AYVcSPj}fMUZ;X91v`-55!JTPyko;F!dlcP-_?U0%tkUpdUCQ+d~$wn zL1s>BiXKCJe0p9foFAXez<_-OAHy8b1axp}iAT6+UP)0CMTAD$OL zd#^$Mhl(?U?gRj>uY>a8>d@*?X3$zA(7jIR>Of{8)uC)4vmT(G8w&~>P+Y+C1_J{- zsBB7x8HO*rz|>Hw4uu&9D*Qn4kIVEsWJ2D@XUO@Z=XdMh{3xW8sgaC&R$N4NB7*3=BM=;>>`7fd|x{F@f@JpnL}g23{6@ zLkj~7aE%Wk2-f@NmL!~W#(V)^z0bg+aKHwXdRzn)dz=^;)+}ORumPo#6bZ$iWCj*c z{k;b1G~fvg44|_^z~PBZ;IGF)=X8M1S7QXN*MMmQ)#D(uK=n9iAAk!310$$z2G!%B z^>;|>m_X~vKzwjL4q{-%w5`WA2-f52RI0}@%mJl8ce3hn3|%0jkScCyID+yShzY7= zK{P1sf@o|QrWV|&K~n&d1DP?9^)#$Z8Hx2UXnhbYN?_$CsBH`?SE1r;pt=Fn&OxqU zL16|eSCQf!UX>xM!&VO?_jf^d!0bh@hjFPxuZKbEh^dD=7#Ns9=bV7-1YwZdLFo^@ z9tOFGn0gqr)(cd3g3JP8kXaxay&eYLu|`Ba3_5F+0d(IAD9k|N3vwUGEugpnm9QYQ z85kJYKzH!K>#QMI4{Knphl#0Yi7T8~7#O%gbtn%512?D+6@l_Wbu62{p@k82kt?|J zBv^M^nn0^sqWa7R`07sez5ic;`poP1Gl+m98Ps>~V_{&hVP#-YS<1k$W(fmBA2S0B zs9y|{U$dBjrGGz4zZf~4Gi+c4w_Ty>0zu)gTS05L!F4Mrzri$t>Q>O%U7)%Z)K>=e zkwJAYsBQ(dOJV9jePmFY1o6RjYXc+JKC%Rj`^YW?>(=7bl7dX?^pR1`0ab{>sU-oP zUv`8X3%&!F?I791_lNq>SoY6 z-wdF35U5xNg#*YRps+!!o7q8r9m;)V7p!$N0|UIh0rE5h0|QxoWC{yEP<;*xcL`{p zSO(fB)`9kkO-#TwI)orxubYuF7Op{Ry$b zrUfX^!7=`NoZ$!Pph^Y?Mo@blrUz7ygZjoL3=E8*JP*242^3|ZdK`8?5J)Yk9tWjk z5Sx;E9Gn-SW8I*Ari8}2LHinDW8EOO12Oe@dQN^)Vh-#GNJ>V#(M~{kkhB( ztJjHXiel&j8HG}pqaUaYQh=>GhmYTZ_FjPE1C+)=G&T$>JHg_h1}>O^AV6{;GeGwv zg3JJ6ge-&wQUk)UavW|sL>h^t-k3M&{ASn~I6Tdbz%g&+F)C1=1O+xI?}F+O5SsyV zj{{L--k^IlL3#+)=g4h$kb0QC==C`+b?EguNFAt-1DOTFpfmUtH>d^f(j9vsLF44}R{XwM;x3#akd`FQ*8HPCr(P@NB& zs{z&dp!PS+Y*3vK>MMZwl+^j4b6;TfJm@S37#ma$px=`LDjz^)9IVap^@_IS%8GBC7-SOF{7u3UgTeg3JS{gJE#dj%B_Zmpb&iAEb_$x*yb+2d&?N z*$YaGAa|kH{h+o4F?Ihy&Ub^_Coq42`~YKPr3YEv?*Xm*L1#IE-3v_spgWR~`H^4_ z>`nke#Vn|#qfP+`tNTIycuLev?RgAi9w*pnSsF|nSog#0kjlBKoK<8t-{2>2%=$O2%;OH zU40N68RM_p@y>bsFfcHJ`t_ju&p>$#RJVijJj{4zT}RJ zaWFPG?PFQH237-I{{&(ap7Soq)FZJ6Uy!K})&xp<0hunTWtqvTPNl__L^V@UG$29& z>>maO2GF?-AW={m1){NGm|9%(*B~=M7-R+rqniQJ55ll=8FwdwxIQLF@K=mNVk01;!w!nAnAcrGpEEpsY!!UKA^SnS|1PgCm>U0Vq_dS7D zvw+M1sl!&knHHcP8w;982CwS_X+m1}1zN)Zp9E)MU;>RTW2@glZ8VTSpxT*0{ZL~1 zwxBjW^14=-86XD>%%~6FQD$goh)Gr zu+(oz_A-D9MI`gVe30ER?I3wjIgiW-mp3p0v^#4+!XUqa+zw)cFo+Lo4}sW_d1PYh zE0jW@ATvF+q@=PS6-+1MKVtTUn~e3hht#SU_e_n4O%$`S~Uf$F(xp8 zPx}G+1_cwSDL|_UK`{$j{RGno8uo>~H_I6^85 zh*;5#sU^QSC_fjX84_5aln7#hb^wBCOS~qFzaAMG1pmQECp9MU!dw&6*r)n6p$Qpj|&uLpppnFzSux3CqR0T)qz@R=sh#!-XKUl z$ZQaeJ}Qe#9eU3Uqz+rng+3|^8W{qW4IsNf802odE=I2f7&=H0lq!y%=;VDkwNX7}O&ItpWhC zhd@0CjwmwgIjCM}`UoybEGaD}Jd%l~928C<3`(~k8dN8NXq0>c5;?CP;AtG>FlMxNKauqh$Uh+MAPi!I{0(A* zFo=&@zYtlUK+6lRg3O}C@}ktl6k_WOb2AcF#xh?)8DYcd7ePnZoER7koEVq|92nSa zpmhkS{s4)IIQ;($@+hniWy8FHfx$&UmBCp+wFlfEhm6R9R?$v??CJt3N5S~}Rd{FD zK>aFE`_6`efeBR3fcjNnTcH+!`cE9>K{;B9#js2FvwhF46+M^;dv9pK~?}~6IcI$ zw1e8ZqcdI%#H?Or1C3;Z$}r^q5-4wh$}yz)VgvOvKv99L4%A0L?^l6ls6gsq7-Tkx zjoz=qr4GGc1yYBt-b3$Kfo8mj=vOg=>K_mWxe0_p=>*b=|KBb2B6&};5xFrD6<4Q zcnBXm#Bmd~;Xu`q%nS^m)u%R03m6zuBvcuaBvcs~p!FlPupPp6B={5!=-4CZHX1@> zk6<;>u}2WwhqyWt647K}ylLJ6~uOvz1zb|VohHE`6CMh1o?oKC>ffv+D4I+X~vS_8Dx z612k-bSe?Uf(eQY2NV=RrxSrrD+0~If%=pJ4h-xJ4>}Za^)*3_Oi&ovuq{b2ImW3w!h3Wr)4h9AT z&`C!e3=BFZP7FLCc@rlF4mIWf|JQ&o&y*dm_X`4{aRRi8>E(%fq@yea|GP4CG%7ya8N?)Y|ywC zp*kC^23lu>*jI?Fvq1@u%o-b_6<%Klmn0UIxa5M{*F-lV;hOS`!!nCXN)vNJ@&hs| zi!+lGa~Loxa#+~`iU&|wW2=8b;vfuDi>n?7nE~oEgUkS7kRD_V(htJatjED+2(%st znT@>q6V#6b**^edu>(G*2wKqr@;eBFi&reC8-d0^LH#`BJ}oHB(E7gYpuQW(9AtH% zyoA>GWrVHl2B`&Mn7yF94Kf!R?>N<=^?kwWi0Jz=TA-bx21HC8G zOGMw71$6oXIB$YH3vH)@m>|26#$MS#eR$AmFrY94g#*Zaps+!kQ)CC7NEHY&0E$88 zK$+O7K~}F{f!6D&bBYWMsH;6`Q;-EfPcO=V?%K$KuH2l#z`zI!?*$+lJRg~yn^FjE z7{L3^xK1lHhi&L2YCduYzIFkqzE(+QU;vFJ3pjwLcNrK!YjAp!7&t&QsBerM%M+-- zf)g};3|hhIz`(!=s$W6%EGYlOtOeD_pj(MSd~iJrVqnFzU6-RmL_M3HS^|zpaw=Mc zUg!j*b8bptX=*8WRDw|QMArhTtX)#eeAA1N!U~pmLG>X>7?cJqD*nE|R> zL1ut3x)~t-APg;EA;Oge@T0P1D8dC+SgJF=_AU0Y(ic=k0JqlJw zL_Nv?T2+c{Hz=)v!UL@yWdiN`CZ-+*`HhHrlo_;>pNM*t6%@`O3^ErKz99F3!Uhx< z@U+jszy{jY0lH-w6lNd{@&ky*i3eFdssgP?!DCb)M}s^`aL|sZf(d*o5p-=%Zh8^4 z9t5qpAygL{Tbh&5N9IUDsSEiTKye203K*;J{eNQp76uK5h6Rf2w=(E3ELfq)a6kie zdar_w5Cel+5Cg;d{R{@{H#4ZL-^d`deglI=sIV|_fW$$TgV;jD{A)`c=~ ztaE0NSihV>fXTrEY}fiNkW-pK_JG~Mpr8oq%L^re+7Aj~HB1Q_pnkhS|5gT_{w)j| z{hJw7`ZqBs^lxO4>EFO00cu;Q?`44RzyZ0RRJ_5SoIXDjXy+0S(ykDYwJZz_%%JkK zg@J(?v_5zN0|PTCPctzvu!7pZAT=N?#lXM{x(OJ>2De2T?7^ozfyy3`7z|qwIOPdc zHo*G%;4%=}{|A=|XuC;3WeQjgw9hZWz`$4nZHs6zFbHno$p8PJfq}uCfkE&DlnuH) zodL@BW?*21sezdfDx+X-g_KbRnV^hEPP+x7FTdEiC^fMpH6YVBF)uMawTPi0)3q!$ zuLRPBfpVNm(-;aeLoz_CDd3FYlEma}B6paA7p#NYG>`^PNMce>Dg%h^Tv}9=npfhH zn3n<;ammj$3@%7bO$kUWO3Y=5k9Wz>H9``=bT3TAH?=q&#nC7nkPkri1!OuVC#Mz{ zgC$+_K<-EZJ0u_z5)eqz4Ee>usU_gh02vNB-5e4K0Y#Y*Sp*kkI?|3=cyNKm!3{d! z#LPUXUC6e86a-`jC6>d-T0kPMs6sH~Ab}3^GsJd~OF&~gP##D(mUB74X^4S=0dyNX zC=DT}B@iDO!_;EiLIIKknE~2m2QmYc&XM(k*dR3^3`wI%omr413dY`s1StXc|5^OO zc?84|>Ni)z1i;(}JzT0G$jEYEL5b zLG3DJek!Q^Kr*iw%{86{sL(H16&V* z9K*l>HV@<`ka-|GK^PQ&p!Pk84N=Cx4_iBotPW%^Xp9J?9-3DfKQJ%|!ul20*%!;Ffa&!(!U1-12ah6hk=0^Bpw3gM?m>8 zP<1H`48kCF84L`zv$z+#sQR1Y@0bf9wB>@tAL z!R&&$pToq7K?5W=k%@t2!6OD1ke?Pn{K>Z95d+&qW(M{Jj~PH_ax8enzyS&i@VatW zEbGcay8;*(7$z_iS3Ql(b)!DHAIA|Rlj18&>v7OumRs-z=$TBc6)Vtv83>3Z~_ksM3)-PZO?U6y=Hv{qm)a}?QBKifO zdL6Er8FH!zG9M{?zJlfU(wTHlM4Q9|f zzy%Bpsc7r-knDz!}k0Jc_0#KO-avVN9$l4nf(DnxEx<2CD8?f>WSK)-G%>h~v z4Qg=^(dMuurOm+(IwOmb0mm6x>U;lhSihOUgyFyp#r0blEEpavPy~$~fKFgszmY+Q zp`k-@{dNWyh6Ou7>-jy_Z)0#+zm>se{U!#3^&1#8kk|J2Z(>NmwYGnf8UrT-n?M6- z?E=Fh4aJ_N3=ET$8CWJPVPFwxW&p3s7dgNnGhs0U>m((_xX2`Bq;ZkO3~ZB>5aS|~ zlo=4?B8wT=Cn+JuMJ6dTAjU-&GjL2&LX3+{Qf2^+i$sCOMX=Zf85hBB7i3%nyIqiR z5rkdfaS@PRuyK(|N(?Lu7BR4Z{Ime#Pqqb%7}!8=T>vqYW5FT@4zULeQ7SA9j3B?N zI59AR_UD7vTQE3iD5@kgFfuF_&=vsg&u39^P?`GwKU1lMib~V}e5CZ@)QTBcmNhdlOk)D;`LnEvfl0`Lfm>|~0}IF=WcA4APhZ5K0J3Ar zA_fMKn;5nVs8~2LFzGlkFj_e?FzJB&;Vhsk;J_edun6o&ZjgB@OaK1^*{{BgK|#&! z|3A>4N~R_ORR%T*CkAE-2Mz{?9n+UED5xy`{|DKBV71H(7?_$RR2kR=z@avcg@K77 zNkef7XjbOH1Vu3iaDR_MMTmhzeGBM9(ixC-B@GISHb{F;K>JKU`%XZ6P5P7>c=R4I zFfkM(_MC(`FfjKiG4OCOFgymWQDF!cP}Ol_VFd4QVPIeod%(a9$_E?_3=d3_8DgMx z1e!RHNiqY6n$!RPYmz`EBzRAXNB?#Pm;P-G4*gphZ2Gq_SoCjZFzMgKV9>vjL8pHM zg9dbs3#c9dX=2#$pPcn7ETFoEgMonsRQ`j_fwVvc#=yV^>l;JXtNh2hUL}CQdKJ)IA8bqvWFL$TuG7%gtAOf5uo`HaRfd6qc?Xeg zR#3r8Zi^M77gU-<+N3! zG&T$lLy!bYXB{K}8H@*+0czWV%m87C41xsd2VrWqYr%CYv|S4_8{AGn;*Z{3!oc7F zT_XmI30U7yhXHct8C0ALw5A=jeigYri>2Mm4QdyH^dPGP<#DujFGdo8*$e8kg3N`c z1Dxv6#@WE?Ky5~l-5?AS0L3}lI2(%u0|OK6MsZ|yXzgA$&^Q(m?OyQN6-2aq*+G3e zBHF#2pfegk`-?zf1_}p|KR{sv8pDEy3CP)8p!oyPax)MIgh74<(KzwoYWFhlfVO)f ztwi{IGXr>!8OReLPctwukbZLsqybQT4CLoSW6{X!KzR(UeZYXc zwhUwk%wDwi0Zw&j?E|nnko!PpfiNhIf#MvkeZa7Tfq@A$Ck9dj!Z3Ac?E_{|m=MuE z0F~_wM6?f>L1h^c?E^MY9wDNAzzzy~kQ+gM0AY|{K{QT0xY`E{5zzJlXzm^CW@rL{ z?>&O@;r&uDpY{bG=$3I%ngHEi0-{YoHh~qUvsxa*fo2 z4_Dm{8gqsAx(V0aMh2vui_B7huip*ZN2|W~Klt`hh6N3ZA`T49>-RH=a4;}{_oIp& zU|?Ry0_O9nFfs6}Ffj-$V`5;K#LU11I)h3i34AvJViT}~f+A=SE~rt>z+j-r!N8yd zx{(~hXJ7!`P>w7QlI!09Im=&tFUlSk&@HB*aVAg{p_vKL49ygza7+e1NGZMXLiHXu`@6*gZFZQ=5j&nQyLht_S+>0^xMIEL!kA&B*<_m z8=RN0)cs&J(7GSQo26s}Mjbap?832MiJXlxi9ULXk^bw9`q(7E#CT4(%=+7El-v(~k$ubAtBZ zgVck<0pvbV*nq}VU||9qSHWf;$PHNWAZrUuf%fA;bAMp>f;@^BH15eSQW82I%-b1L!;~Q2f;}Fz|uK z@nLt9f!h@Dy+gRh0!&Rw*gM2rfzqBpyO(D|6L`G`Lr*iPIRHHmdNE`T0w^pS$htRy z0kp;nRG)*=D##cR2G!@Fy)Fr$eIpDEpw&K%pmnF9`Wzf(AVr{z!@vMKq#DcvkHdpm z*a-aRUh#pnKSqG2%ORp31fN3#FVm6QoFKD6 z`z)d6v4YYfs163T*FoU`avvyc(CR@}P`wYID@HO8Y7Qoar5;4G7rajd7Up2hG`_P( z0$dLgRga;T9QuY97SIX;bd(ek^TNhZ<;3hoWsyOtPtf+F!uqA4{wTQcZ)i{iowWqI zdjQmrv|(gmSYrS=OmQ7E0|Trt2|8~Px^4_Pje`1<;C%q#07oJS^d~{-0#yHi+Kez= zp!x^2RsvK9gXV)ldn`fe22}rm>Lr*uHU z^$&>cLQMUWlbM&D0Y3YOj7zjr3o=pkgDVuD%)D&qX+p&IFOjr>dYDLu_<*TSoK0L^1=0?(54rDX z4>AMVcLd2J_box`5+pqUbsPBbmw~)j6*P7O@;eBF@*Ri4n4y)Ow;hg?2^+ysha z^f_VB{Xd}doI!SiFiahKUlMf261F-NRR4m^1?dGfi9zdBh^a$C{a0*#Kag2Sbr~Dz ztYlFA2nsV$IDp&-3L8*dz`_I+A0Y8)s3SlW$Q%%j6Jx1EL1w_!6M3&4vU-sFkoh1t zBD({`2Du%k2E+%Y7ZBeCT!%6+fXW3BAGDwvM1$I3AR5Mpw>!WF5mo1sUFh*Z&qfBV z1p^I{NkGp=R)C(BtODh0fclKdiA5zv`MH^SnUGss3H1$)%t%?|#ftY1KJXf^{R|SI z`w>71W&H*Q0oeGnfCGc84buh&P~EPQ%)p|O!XTi+%8&rA-xU}b79=n*tVv?vSdhQ~ zUa-9;0kpRf=}tdq24;Z-Ja_tWEJ-ls0G-XaB*El4gA8=-yMhhtk_3~b3=%5L4F6S_ z7?^uG85nwAF);L;W?<-9!@vMJgOY(~Ei(hdng~6rd zoD2+WUNJDNInBVZ2Gkm05n(cLV&G?Bk!3PSX5e4M^8Y6TixSf!rvJYdG5`M!^8X^1 z|9`-380cL}YJ&g2fcFcph#-xZgX(sW5)cNZRS*rv z8<^$)ff;B7{!^6I?Uj)bI>_lATb!mx8@C$hH>rf1drixK+d28`xQ&S8{EEwwtGPPJVA5l zpuQ4JJ;;2RJ0N8fa;6~M@lMMuDlXA8VqnnI)6dJyD@n~u$=5H))JHWXzt}mks3a&q z*E27(gz#OtFhfzbL7F?rlT1)Up$)2}s??%za}HhL-7~=^B24;A@4((Tf+=bQ#1K$BmL>r71lxB%&gRz3zYDBcb zK=*hsg4(*EFaw1HC~QG~2E_$5Oh7@w36h@rW?2dod-Hc zAi}`F1S*3;`%OUgp9%v5FNhCn2ZHz}PcGXzqZ4fnf_&-3|r@UeGyaJPZu{ zps@}K1_l9E1_nkM1_l9;xC)f70p;s3FbIOwnJ_R2foL0uIgAb9k!j2fYz)i-2N;|YZUwtj1$^eYY)CVMcFz(97SR1>Fnd7e z+pr0MCV3b@=7Yq+_Oc=D1-plp73?09rK}t<_oy#pQ0ZUHpkl+s#K4dwp(2pLzyZ<^ zR?o%=Ru3{CrXFlQ6Qr#V^0Nvv1B(hP1JgQX28K1RkhZc(3lAgMPfK72nHea8_796C zgThqnW;mESIQ{>odC5Qju z_(D(rXnqp`r5&LL1|d)ywqa>V=y3-1KmUJFNoL>&o0qDg0+Q=-W#H&>gXBAqI>47X!0v~BgxG#pLA-^~%HMtDDdI=;GlvA&K|lhD!(`~Gc_j#>BM-aB+p`}B!>KA&%Cn492e)r& zbVXo3q@M<2g8TJ|Gte2p{Wzq48@PXu)XxH)g^b*f1D%bH%ufaxiliRA#}A3$i6%b< zjlT$uzZQ+Z8;ySui4SUHgSgc1_c1WPVPIgYVPIhT!oa}%1Bx{m7??qQ6$S>q;>z5T z#3Tm2;*uf=odILP2jmm=;7lls_{nI!qI`&A@EAW52POgXHqjW%d^HOZ>%jOT7#J8q zWfy4O1t@8O(jX|z(fW=2u)R{q>Oe&{TECIy0h)`U&3p#5ej`qGX#Ga8IwJawETH%U z%@e|`2l)f!AGCfW2Pkb4(Qo7c`4?Ni5!6QnnF}44=K!tk0_QKN#W4StfjZ?-F$M+( zaQK1FiUNfnXbv3YK2SJkqLv^0u<%1x2MTAJls-UQ*qj1vTouMI1xv#EqYMmPX#A;Y{KaVeb!dFh{y(q~ z)PC@N8Xy5MpHP1nR5c>ivO}cO1g#tZrMm;r^>r7Zedjx%xe^8jP`iu|)R%?!sTpG+ zePqTGDBT0?8}EVgA3)9^2i?U0>I*Z0?id1%ovT3l#!N1dzA=*z#6Hj+N-V4l3`_+K z3@o5^0xb~xnR*~+m@`d)oM8?+!x?mrIMW-bzCRFk%nA@bGt?iTvz|L3c|)&wd7-C%_^Cu@`hk1xP=O1LW*45yl z(gE=o%LIsdpwz+$%HyCg1JR&06Cj$0fdMQo0Hr~BA0!S6AEtuL#N=YgG3TJ60mS+e z9Ag7U=A_)`%|__lffu0u4R|gJeBT%Y1L&Lq(3xE-OTqV)iGb&1lpy^~P`?`_4{Fnc z3O{h4aX-p@j09+|26RRkXub=&mqG%fmVv>Bg@Hk(1>7%$_v8Eb!|(A@0Ihd{sR7xs zem|^VVF0=ZOaR-O7Eq|e@CHVdJ2qg#`0nop6_=plM(P52RhfzyRq>5WimnbT=R~c#j1Gxc@=SJP~NloE48ALi;j6 z^$Tnr4Y>ZsvyKL&7OV!^Mg_4$pnVol`5hvm0J;W*0mQaZPypYr0h$Y*AfW(mR)g3Y z3JT!;F`%{#>@G2I9j2gwSQiVLl!rzZXp9cTgshE&WDe51KQMiuav9rIS`cyMsU^_< z4aC$?0rXxj&^=v5tlNPY2iXKl)Ky*>8W@mmgx#kF>UDvQ16`>F+d~4;if}qwU4w16 zDLA~Tc-Izaz6exrfYJvju8=XP?E2G-d!xyCD7G_9>G3<)CW_plKM?76fUhem{rS z{TPs|iN{#_DWLPQ;Rb-4L74MfTp)2!`H4Jl1qw5?ehL?84h&=%vN}+;fYwg|MF*^j z2T~4aqxDl5LH2?$SP`Nb$bi;Q0jmR*TQGH?bPKWsZH*D51_J{Ns2_l?4%7~Xr)B6p zjzsiRSV4VpZ2c6p{sJqg-3jWu!0ZLN4a5e~pf&=C4LUzxgMopl`7O}67--!RR3B&@ z6~@F)gDOB|88X-5!i~UjZxqNsFf|}Ha@>LVp!5QgN4^IN#1Db?7eMg0-EkhVK$8~`-W1qvhZ{X-E@ z`3&g#ssiYGsuHNVHITM11L({xkbN_t;!8k%f`UxQu}H89FGBNOh9sSD%YyezeNej- z)ShK%Xix;LwOYTQ0n+|l&;dR}3smU9&e1|TKMUu&q6N&Ly*04Zf}ruQBLWS{gXTaO zLFE=q6R2MRs%t=da6zl2KzndOa-cQS$ZH8eeId~J1xOCkrX+nG5h$;K%34@k4|JXe zj15Zv*v^OttAW~DH7$m{9=1_nk@`UagD3Ys4V)zzT#0+z=>bv5X0UJ##>x*9wN4;_mE zoqs{7t_G`t*3}?3F?BUKqRFYMp&CI|FLXwi@H{e-Vw|ZJY8XTwG5P`uOArQ?aUdEr z7Ym|6X%<9d!!WhrfhRNtAUTj3pz%GB86b?N1l&&ose_k8AP%}BFdzH41xPt~+yWXW zAU>#FfIMFdp5s6oXBgef1U~gBH;p!>FS{YfnM-2XfsDszX5iMx^*;2h~|1 zvyjz+>YKq-MgP6_F-&dUOoO&~s`{wIF^2b^bgAoC!gHZZKt2m1%w767Zkvd;&s23psE*ei(W ztAi2}In_TzAE-iyAMrw5{SQ|Tso^0r5(}10Gm?<`5#&|W3&lC>taB2jL3C8D9q5>1Vo>e1*+3P_Q5dBUi5xDE_LYrc91$y z-h`P4N^_v}h1PEejTJJ%)}w;d!qlO+2|(ozF>M0SSt3NV2|(){7>H>TfYu;^`~oTm zLE#H>A1G``3EN+WNm^K(0)7Uj2^I?L7v32HVNEr2PuHc zgU`2v^NDFAP+Tx_gNiuxbFva3>suHKpzC)kpzBf^pyCriWBvMumIlU<4m_BIjm?`G zV{cCwno{q4EYSK56(&R%t$_i1d5*unW&rKQ1*Jn!{R|3r5C+xPp!&Ihfq@aUm&t^I zfu`qSf%74>j#dUa0LliZc`WrcXnYv9M-#;6AXs0QR8AsV=7L|AQoO)E6K#K;x{Sasz}xN|7;0KM2FhIe2A-tO(2= ztuH{q0P0U6mk}^FsGL9!M^O0=QV+v0b@Zq&koz{EI0v~4y}khTAHi)jr~^T2Kuq-W z6hV0!**us!^zl6%12PAu4n!lZ(_#gM1ITXBd=98>0dgNm46U!k3R+tXO1mJl zKp12Wh{lPr^p%k81y>gEG!8OkFx3~}%+IB7XlaDC=V5}Q=V4@IN_OeDoAe%tDO+mX5Kr=s#3=E*%{xEHz(}5U4D_a z0%4f@Ky0jdP?V5_G9suHG#M=g8DMiAgi68uyb|z2K_i3FQZTVNRg;MQ&vYACK+c7* z(hZbjK{*xH76Fx7*wl@df(+n0F-LAG2pS-OH18CUMh$Sa1x?KjA&QAvb;jH>z@rAB zk$2FjfdvBtBk06-(5x}IR}ak!piu+RsxlCll2HS3kO9#4BxqC_R;q$>AhuBh&>a~3jwfMF1HBms1ghzr~TB6i&2(gz9; zq!9+#sc4|K2~-M$0*4hy6vqey$PCaa)F3lJ7^D;#gY<(iti%KLLXhPVZ0zl2kX}&# z0TwTy_7O0tPZ{Az@-ko{R~n^O#2x$A`P0!1lb9~pg0G` z5nB7133S^E5$$It(99_j?Pt*Lbp|5Z&#a)?XktbfKz&nC+6DOmgh74)(Kzv-Xg@Q6 zXC^>yBxyt%tpEYFva#OU06JIC(7*sv%Yf<~0|PS?5YNmj z>nP7JN}-@?K{f+gJ2-=eP{Q+zQixft1ex7L=m7Z~jA8l42+YGVV-1yqsl_&C0+Iun zVG14b29+yNZEy;t282iJ5_piHFoxpnCi03HP@IF}7rib4t!N;oE&NzOw!Xg9Y2N)YGJ(TMbM6sc71g$fwQFf{B?T)&AyfnmV}#r0bmbPTRC{9nJH!D9V327~om z7&O*zWRL+()vn*bAYmiIz@Rn-d}^@-gXo3>DohM4VoD6oObG&tEDj8gYQ_KmgLXJf zaAIIkVPW7EabaL(0^P92#J~VL!73n#L7XX|L6Lz$LJ@Qd)&dm<1`xf*h=D=Mfq_kp zmB9vdgr-U|10zF`fR>2E|37L142+;tg+aHes4z3|u35ssu!xC)L4}Fo-y#+U#zo8w zOp6#8SQjxdurVD_Pz1SkkthQ*NDotk287SVz{2!EK@oHU7Dyg+>K5p9V-Opp23>9v zGXtYRGQ$A|=1!(Ch5yG?1Q{47F)^?jI598^IQ%~ZQqSZ7FO-_Bstzm375e=CDd{}u*~{>=<3{hJsR`ZqGj^lyNl)CDgoHvDI( zgJc?163@IUBlJc@&Ae(=oiP$Vy%#+2Rh(Lqn39~ISC(2-l3GMe&4_%n3fKt9*cpaF zpiLFvUQ2LliKB}%%nE`xo#N655)aNq+p&~Z9FUn7l$Z-X<`=YN)F-hRv~>f_4@fHp zb2Ae2@=|laLLeoMDJey%#l_A=$zY-2%%H?__=;z=^Qyoea8E4>E=epYErzK_Kd=E* zB7@=^Hl9IlD*$8;$P7n1_Q61Qf=?Dg+T{Um!z1z0Z)8aWc@{~&5{(beH%RjH(BxO5 z@j-LAqq|BNz_+J>f(C?Ptsu}2K+x(OkQf640~csF7-;MSw5kvkcc8QeY9WHgKR|4# zI*>G&31Yz1fr@Cfou-VS-IQR3Py%KzXdDk@F0`+YQyto_60kaKY@5sK|4sn=@u#glS5l61wMhDh+QQdpmhqMavc3f3AhAX7+t$B>F6K_GQ+QDuBd6I#F z!4u3uY`?NGuj`bGw@fo1S00(`fPDULO7 zrsgEHotZlZc%HKcIt~q*=LD^Z1C2w2=dz$_4Kxl78eal&!EH4V11rYAIvQNwK}R7# z^FM^fp+ToTz{a6LY+}cub5awFs4~%+jA0UNOd2GCGSx}2y@p#SI3!`^A-IhJZP$P$ zun;h{xW=bJX3(>31Sb$sv=NX-d(7I|+xer=bjU2b29XOyJH=uON09{uNYD2>6 z1kfB2j15+UHcDNTOhhM~Q1b|ypupxsPsIfZp|mqW0!SF97F*d1QHFhe$Vez7A^wMu zu<{br-vWghtSb8l+UbvM9>^?^8_@bujG!?vBIfWw&LL_gA!yAtC`>_ifiTQo5F0BV z6lEl#jK~Ep{fbjdz{>~n_2K8^nBi<;8?qNa09#ryy)Q`5HL7{-a;PlMEz<^#mfK~w_R58F?$TZbu?9EBuhwcYsa;H6o(@Ot>tDCMsAugRL$C z@{gVi;-)S;J=xYVJSksx)%l#!qo zG^jjO!z|jcG-5>^Nk35J5<#-T{ z4a3x8E7d`AATvO7XCN~`7~Kqz8W4t+a-%J3)DQxVhk?Qexwe4S5FnK>HhOJ=Tw)`u zL$57xsY9TF-P7nsgImrEJwFMKX#Y#+z8npk8m=-l?+>w|THK>(L zOp6*cW)4cbAU}XG$PXYICmzZzYUH9r-^kE_wED!1lo6SR0UnVlfsV+4<~%`h3>uL^ zPS>Cj8PM4Upm?TaL`Do`0CYqKbZRZ35gE{0e%PERh)wK>Oi5x9HENV%G;^S}19;sR zqE;cYPC?TJ3JEZVNFib73dIe+#s7wKw0mA5Jfb@g#XuX0SG7$by ztXE(+_<(!>igQr>g3Qi)-;V?8Dj1s)(@`K)GDDLWEVYg9$AJb25frwP z5?LFr7C2~p1)Dnb7C0_-=q+%NI^>oLtOUe1;|Xf5!|aBsLn|pq$7=>^yvESP5iXRBc~K3VbnT3wWJulw}6;Jkl&;TKV8Z8AGh*=vqdX64={T`v_ z2$#N*p&9fbX>c(}uoN^kg(@fN1gVMv9%Z1{sI@34=R!vrK&J)}8f5^rJz%2@AU4sX z4EY71wkUzN@ zy6+EU1_+~@0n!h`qoWJxAp_xKt1V#dWRMCNdvw&AfvA<#q>NgF(k>{BK^T-qK{QT0 zv_}_^3Jy?>f_)woSG(HOl!WuCnM?4kqXwNBg&f471h&46`!{lk-dS zN{TCUauSnrQj3Xc+~b%E#V`n3LpXyh2!>fe{F#Ip`k-+K%SoX9#~>kWwE{>SgkfrN z)h-}22KG!scV}lS1r2w`vp^VR7Klb$bIuHE(GfFN4Vo(@ zW~>@?UKKWbL3U%sL%B9V%lKUSMn;CvLu-lap$xy#YVbS?w0D8~q;JsmWXX^-B#Kgt zQ%CPR7|_BJTUm*mS8=txL8Hsq)Pc$r&?kFtK1)BKayLjGu?J=7w+=!6fnjj` zF+g%BD2xb|Wb`QUkXvb>I0d;2t#!xDprE_epG_=+s<9i08 z#u}KvFc5dQ!4znig4_hcF!zDjSn&`l@rqKxcje{lBknf9S>l$Z*Jb^MY zjdorh=sY_WCkCDcF8_am&Xil=`u~p&>jH)aZvTHRaR2{%fy@8D{fij{Cb<0n!H_DU zs?x&1xW<`*VS&s4AD}S^6{r88*n@}u1_lPuK2$g##=uj8f=WbCiNL|Yz=&Kjf^O)Y z!@$6hz`(!=y8FO^fq@CMZyU6J4lOl<`!yh|C|N%TKH(Eu>dJu(gR;S?47w*A%!ZcI zppit_$To=WLhy!OaET3#Xu<_H%AE*ct@>aRZa{vq8>p@fN(En+MtBDes(R4DJYfAE ziFqkGsYM_kgE82T3=9nVU>;}& zA)+>82A!`3-sb?-2r~mjBb^1p3JPb??oCjbfx-b4wxF;9#RV)(K=A?cFLK`oWDeA5 z>=c&T3}iN3F@4V|V{ifA0E{RnAX{SzH8Y7Sgb=sYgG)S6Uq3w+)ER*9*2h^lni`VO z8(*Bb!UZ}7lnU;y3AfXs!n@z-s5$Jjx28|dC2&~E)R3=H5qAd%}&(AseD*^Qvt z#{d8S|A$+O&cJ^j7NvC?;aOYch$6pkgT{0+12ma9XC&sOrxG=m4zA1K>Y>2{%Tu5_ z2qc7(UqAv#7^Zfx)McQu1LQo~*IhKJriSDgdI%`Mp%|1_KxqQ4m&61*8x>o8c*UIDEoM{du8>;yRhL?hQLp!$TEF?5joVCfxZ4v5ByvD7O__72*!t&lT3WYh@W zgCg9AGBP3M%yCu`e0?bOz5id>urM&Fv@kH(ure^HEM;I&VPjxizn?(_6lv=>FbLQP zFfgbIF!1y-F)-LLuV4^xW{^~4Vc<|#Qgs+$lP@d3@mB_|G$9PObiN&AbIe464k44G~5t3rj63&dkq42>2GKBRHNepvZt?P&ou*!fqc2m5U%g zHVjjXs}2R3p-sorZb0q<^@AkX^ucW>5Z?}DKN8;$oz{wU~7N2u9g3S>Trf!-g*r4GG63Q~t$hJn&OD1D&yM;SR77??r+ z0NDk?Fm-7CQ5I17iLKp$)*of5VPIe&qTRr3FHAN2Kg1r#7<#pH-OBBE2eXQbOW?M3Mykj?vM~<`2UH4fdRhm1>G&@cq4FM-O#N5Y`;@bgZg{0>ll2VtoCnIJX;0|U&yWl+8VSbk_0{45L%;66A9 z0|Phc8~`5Z8QB8RGqPnE7juaf*9<)j41%D8&n7T12!hO+ z0yP~Sd>fq@Z}r$Oh6gZ5&A#;-wTA(A?9 zp8~|EWc-?#o3}u2g`I&4-Xjh@6%NE!Ag*l$T9r-w1{vfvbl@QZeK3h)2(+C9T9FOC z)q{kw?8FqP9#E^vDGA(43eKzojTwLf6f|xEr77Kk2nsup8KANml=eXwYBZbzsR3bl zxeDUIWsw=!XGTHFK_{@m<`qDE@SY)P`vg>egG{0Qn83icAHZP%@+he71f@ZF22^K3 zxon_wQ9(sAa=QQ&K4|R+wj)pt$m&4(6utd`T!(|SfXoKb=d@N{Aaz8v9~eOQ z7lBp)fb0TcP`U!eJ6ijJ3Dj3YE}KAVKpsv} z8b}VgPQzCB!SWHZI&5_xsO*N>38Fz}gJ|@+50^Uhx(}p|n7Xfnfq@C67GxI)gVGf! z4WZY4KNuJoh^hNPej}#t1JzSR^qpBj>rRNN`#|k{(C$5uA3zx72M~=D53;&X16uci z@;BJc-~>Qf0R-whg8F_upgyF&k&!915(9VT;Hx@u)p@2SP~}AJz6G7S&H%p?l$!yR z7r_1i5uiE^M8hx*_Da!f_boUNK-VSVS|1Nid(bsXY9K#D`*=)5G50I2K$(bzCJOh6K#1PP*%Fh~w$#=xE# zIrLY+f{P4jxWd?=z8ENcVQm8BbxI(mFm>oFU~#EKU-J)AhpnDLKcR*eXG9WH&w%zu z5Hq(6>hFU3S%mH_0A0KIemfp zSfDlw=oS#rI)D(+P0f(`Sd=w$tPBjyu=0|UJ{D+90d@ieC=J8d;B<*)%`CXig4RbM zb_j8Oti+t0)S|@VR8n{CBK5M6jDXfejyXB5AVZ1m;=|RWckq$;(3^~5F$k}tKsS7V z1YuzgVxwbln1KXw)KMTaKw}diGe8)m6d8l`gD|YDg=E1-fsQ?b%m%Ml zgz{l+tl>Tu2^z-(2OI9ONOsWJBq*$q`&ppy0o8v5>!rr%!S1yyI|kJELR;SfPDW_`F=o&@DR5g9 zY9Pog5EFeY5;W&YOg#y@ih7=|rlQ!4rZ=eDrD>T*iT{ z0-dP~qEYfbNB{}L%MwtgKoSQrL2@87K=~A81_*=1kugXO2*b-O5C>TSoK1W^4K8D$ z^)kpf(A*9Kln+XuAR~u+Jq_v$g8T`>(BhH-R4;?-29Ov70|Pr~T^lj=G;Dtfp?Vs$ zhXZOhn1b00Dhoj24vS-4>d@hbm(Lr8AH^^m-aJ zjQ}fOKx#p1Ks0(i4O-&@PD3C`q&ag?`yS>8&|aDK#LXG9f&4&BJq?;CiiX+=qG0X= zv9aPoR!{pt>uFG)2fG)V0O03*gZVTsz(}dDjj^6FVu9<-DsvO))eOYc*UVdptgo3t zePB>u7}h5S1>OWmdIvF4F#h_N0o2w5)xV%NAxs~r{soQ6gYI4c%{h87FffAF^MUGL zcw9l&X)&FEYNDk6rS$FvBG=v|XQU=)gL}fMd6Y~!qMHM)d!0eXgZsp;c_~D%!9mr9 zRLg>EU1;DUl_{XU4oDPKW`SsI7+wzGsAEB9fc9m8%m86@GeG)57+!XPIOvMNeB$d^ z@F{mAtWE`w>43wD0kXXh%UmRAeGRCXL#``9bst*amko4NCCDgbb)Y;8ic3)Rz~TzI zzYS6kG8;sr*QvPFq1UM(b)fnPWCjR>(hJBw^g0!^4hK~Kg4BR8OdWci3i2B z12J`KFmZJ%E2zFFW-by`-noH10L37`LYdg9K~|^2*5QEC1=zvh1VCgRN?c)ts4w-6 zjE#-KJy!?;pO?f{A6l4`uojiTxH4=UIe~$nfkp8EL$iRkfCB>$1A~Mjd@Pyu|9=J- z1;sV33=AsC42&8{3<@F+|Np48V2&x1IgSiU&!GAfl)u2?4XGCyLH$?Iye6ps3fkWT zO3$GB6V^5csRi|4LHPv4rlkG^=O<|Y6*MkPsQ(I@%Y^k`LF@qH`me>Q$tC$k;0lz2 zzALIJ(7H1iY&5v?1O*0>$rV`_dd-Q%$Jt+n%>}{Y0Aw{fhUb4Abt%XUdd_`<+yffN zhV@TDe9(Ff7$1}#L4FwRuQITM`l_Hh7`e^_g%4WY$`0%MBCEqzw<6bXpfCm(tqhR) zCy=?YIvAHa^tu(Kj+nX?)L#XaBOp6L7?fT?@s3`%g2rsYWdTSLQkxOIzdDfP%HdGA zfhdq4Kr~J~$m-SrXnz%y=fQ4fX0^fjf_o6s*5cR zNvVrf@byjA_x^u?v`?48hRK_Op~*lMw6Avkeg=v48yQ6USQ&V11Q{4X8H-_~23QU( z##RBUv>8BR{redt`ZuENw*}>2h7HUN$n_>TtU(0+zAfH4-WCQ1Mo^m&R5yd>99TAX{vUAbW1Zi!w`6 zJ@a8<3=S&>1_sy~K~VVzlS8LrYH_W@1(^XF-vyZg!r1hK%z%~U@WE|#g$%^^eXT%x zp?zPF+1^NeP`v@-4)^*R)Q<%D6NI6~CdT+OsGb7lcjS5)6h7$nHE6sQWDc@AP_Y8) z^MJw^7I&a|TaY>!hS>{htAorXqz=8l2AM}peGQri2K6;z_JYzG$X)35HOL>t)YqW( z{>1c!4-?lHW&@4u6EnUH+A|Xg^8`|R0!av!Imqhk7-)SB%JX1{LK6Ud%@3GQsFcKA z@DWpZp{(PDjQ{X}(t`s70}qS7k+B7Ip)R-sO{o8DWI)pVuLFTP`vt6@%y2+Kas37c z0fq++iXsjS%%HP3I2ag&K;z7?GdVyROoff10aT|mFlZ=(_zVmNisTFe5(#9t%A;bBJ-RKaGs=~KOI3_ zom~#9<&sL%(o%~k=ue}X0!^&o3e*W~G$?S0OybD8KxrF!Lnsm-YHm_;enBNeesOSW zUJB?a4Uk0;3@YnDELb}kl-@ynY#62%SA7jKV=(lu8=z-UfZQ7j@(5CW4xWR9@qTl2D0|U;_b(S&W8ZC2?~(bh#~jmL2Uxmemn!# zemtSGvnV|ug2;Y6xHeBLDoU)Rv`GLn1i3}v2r`)XeM8{(07MT`^$(tyM&iSU*O7!! zS_q(shhSJ42p+$N%#%PQu#hmdxY`9EGeBi1C_jNPx)C7#APg`6Kpb>MU_SBvc;vGr zK*l+N^h4`?5Ffo=04{5x@}P1VqSn4;T(ODE2R7 z(15iWK;sAf8yIvL9w;aZBrx!S#t<0U1QZ#V1P?&l4x9`P8j1{Th6mu|4jhUHKp7e| zN6*2)AO#v*0Q1>24}jRjj5B~Da04SFXsimvM8O2c8bIx4(A+&}%?C^$Xzd%Qt)Brs zUn7TsfeAFP1{!NX9@7JzTL+srgv<|+cP1w>cdLW*BXmzPczgr82Mok+A#SVzbYv8) zML?(ljB8o|*$il_0(5!?Brg!V4-BCLsl9-!NdXyRfE~t(G0*@G7X}6faJ@`ndjezz zXpI`E3osQv^= z5BK&3XwDquPY{L{>lpJ0pgNC;_5}xMeE`TDLhTFCSUE@?48!aN)tjJjhouQz>d@yA zKIoIY7)2~a1t#bm5l~w~0JQInfq?-u{{Z5cagcy@BHZW9Bz}D6G~}3=E+01_mZECkrPAMgu1XM$j60(3#yJGvH$t3>u0E z^T6{L@Uy)^>OgYHYC-mb&LaoWQ2RmQ2Hvke!3n&NoddKEA0`i@MI0EIRKVwt|Njqi z7tAf7whu@jc+JFq1{o0t2A%aA7$l%)oHKyhJMR$zdd!J@{(AOJlZoo&rw28KmU3=HcS7&sO&FfcA+U|?Cqz`(SKfq{7u z0|P6_taS_wJRn+)<^Lb3-%Frw=mCj?+@Qk5fCzJ@B?%@@3?6G77#KkD08+C+0W~gc zSeO_XTm)1={IeJLhCm%h^*hpAR)%Yz_NY`gA9{`0(kyRg_Q|D zh6V~3P&hI%7$`D1D1iMB;)B9ojDdl*e?Nl>vOW;Me-nd2|3(I#{tXNoP&Znj7p@!F zng4;(3OdHqHU_PI0j+ZpVPIfEZdda#FtCF92H-8+J#UCa4c6p}+uYcYxTSv-Uvu zV1V{?O!)F!e}4)Wk7>lDq-~ z=#Bu;nPL+-^1s57Gf9!1Ylw_~1ULB*ZX#l=Ws?x`hE zvHW6)KF_>NWKAx)iO!&jO^`(pm7qHVAayUu8rVW5gosOSBIJ?*hs&|Bb z=(RgY0{MAqnUD(wAVy+(%`K<2IK#Cpm7sqiUVvP4fHYT&unajsf>M*qz*D(6!Uh~v zr~!lhG6jgULCVqH2n#+~rw;Rm1&ChkfeLdMs22%6wGpD+DJMTU8#$g~(U@Nh9>q>d zOwM+3PE5{7g{&|OE=epZamh_&$S?NHD@)9Q${~Wqw=}0Dvmhri56fA|ptT2}WQ?5N zL40Hk&J!R3I0M9iV2}{V4A7ZHATvOD9U_AuLHP!x4w6qm1t~%fm4$u$8l(oamWqMJ zADoXtd~ko0^*xvmG8^1}g_bWMKDf+=_9sF7Or&xK#IFUN(~dL`J{e>vlKOcJ3=FXH z2c#Z+9zK%%UZipeB!3FzEhO`9GJuW{hxi91{~XQypQwCBP+7$QU55v{2NQhTFTy@X z(7D`5{bxo{|GorCJ*ckfLE?kk?@0PV`+u1b?qe)PDlb9yf$pwAHXn4BJu-hentQh* z`4`k*0!btK>mVK!m)hC=e^VyF;36+?|E5v_OwTA2U?{bdw^x9QgJY3_;Xebd&ORga z4C|tN$c0$R`MJ5E;tA>{Vkl6Z2#R;mSSLum1N44D5F3PH`2>`AK=m3(jDdkc$cKS} z5tNre^(#m}C{KaH7i~U47*<~+s{^so<`bAf^&iYGkR32KT7RDzbQB_JjRQyx2*cE& z_4mQ*i0JP#&tPC+M;nU-&(Wjx_qjoReGmrO3Bn*hgJ{?~1LzrL+@SFd5C+MCFwA|R zaU+->1_lOh5TA&72kz+%3=E($0b~{k!^{BDP&+}wdQ&gQ#Z&?I8nkq3&Y@;~R|W>qT^2C=7}4fo7(rDmDE%-& z+{ai3DrZ6MQHc8)L3f5An?DQ8LAVceo-bGk>Yi<&au$Ta=8ZPQQif4Oi~~9@B>_E0 zNd`Ke<-x!p0BSS&Ffa&!>W>Hp20>6BDuIeuK*bvv7=%IM9nkTv8BlZPK+RbJ8t(!v zUxmtFU| zEDYjI3L4;j!zxY;It&g5p!)y?q2p;TOPs;?3kof8U|?F~z`(MMnSlW`h6d6Px<^oj zg+UIaAH)ZZ-(cIvq`vq64bV8>`uz+F>o+pUz}&^a(4Yt!*MW`yfYwy2F#rD_;{5-Y ziU0#6=pMrU{R|5I8yS$tqBKC`htRP)29REue?a3!pgZTMBr`CmFfj-UBr&k6Ffj;0 z=>PvX7#RFP?&Dx!@B@uo!tOm>pbS#~{|`tGI+g@4=Rt+*24<4)Jp|pq3u=c6FfcGJ z0hs~Cpt(~}+jkhTGIZWi2EgRUEw0y!GW2GzX`XyZGeqyj$o1ls=su_r+1 zazXpVCP2q`Ky1+dY|z*Z=q|1Y(D5A*8#cZJIs<_LIu?@z>Z3u~pbblcL z+yg2HLCyqWSi1~VmVx*n`xqEt8JP6p8Bn%I9-YBf1z{b;2v5u`feadeEC;h7qZe>4 zXmka{0q+|F-Mk3m_@;nZM67K?bny{R0vUkICd>g2kZLS;gGN^%E(Z^xAnZZ%W_~ez zhy@{!@G(LRIwk~)2?z$q83O|Y=>A8L2y)zk_{bQh7TmZ)mH@Shpk}l|=gUFq5KReq zToGgjBn?0{p(_IOA$@fa6MSC?qA$$=E<2!U8)Oz_%`QYeh!1KLOCYHS^%s!(&J3V* ztb-&EO3N-t{7R6eh`u@lsEr8AGa&QlqRE5Wh_Ji^k_W9Bh1mxya}a%Tm7vtJOwbjd zRtkoCh6*Z!t&>eg=bC{5+nv&k;BW_p6}&mkfIgqj4N?ONKT!Dw3Oi8R1BDr=-veSp zwR3~!0zhnJb)fVG>JNbQLCY9W+XbWyjv>usEx#e zyoLwlc96T!`qylrbz%7W*HHJcfyz|S8X_nkQWr2VFrcm11K*(qpZi71P9VEM{T`@( zPS8E}ps)so87O=~?gRN5t>4TA8h1Dc)dZqI=74CNm`?p>WOsnrAh*NZ1mc6z3y41f z(ywCxjmLrb(0(F#9X}`@MIik~2GG0(NFLg+WJreWpJRZj2aVH!#_(YLDzIWiLhgk2 zb7A}TLF1EPB~XX0WME(b)%mb~G-!MhAy0h2ai~-zpmrCieh1wr4eG0iK-%yO5|B1L zg9^0IV*(YofQq|7`5sVy3iN(TP~QraMi)Tkmq6vWFfa&##6f)nkbN(p;$I-*p!NKW zpgsz8KLn!=1A_=F0|TgUB*F%&T|q0&V4Vg+eFh^70}}cSY%lQj8Ehc))CD%|OA<_; zGkDlA-DfayYG7bs)pB59Gj3pDQD$IhQcz_$VxVerj7tD?Zat{2yyh7LgZke82i9)_ z)q4{Z*KcDmV0f?rw5L+SV8j3a>-RI*tl!6Av3@&)$@;AfI_tMEXsqANpaSX#tY5$& zuzm@H11Qt4U&i3U;4njxErB7se?Nnb&;igI0*3#K4uPuj4n-R|mPGS=EDSc{OA^e! zGkEl`X7FGTSlpmm`j4T134;TJh?Wz`93}??MIi+S0jmH||3N{KX#r$^2B>c#bbx`2 zK|qj!Ax=P1#fgE%hI;`6gSUWck23?qq$3Qh49rqY49yBEi;ggW*9L$y1jJ3?@%6sP z3=9TIETHrI*;Kgy{}VdEV6}cVgMbP*gS?P71E?L#V35QCmIv7nTJHe5GgQS1vVLHV z5(5Jh!vsaOtxTYP8Ka&O_)Mk?YEzgPtXvov)l@-q_*xENzcCnq=gApUH57#oFeoq` zuu!yNW=S+j1|_c!MH{XK3@V%qj8;wzj0{YI3=GZ=iYm_-m{p!KFfnoosP=$L2NpRd z1{M*f1&qm--gMp!*!C63sfklXE!6F8R1xLX5&$Fl;V_;Ev z&cLE($N+L5i-^PjH>w;AETFIjg-8D)27v$v21cd?0nq+eoBn+a7X8~9O!~Jm81!#t z(COd8pwYjXL8X5aM!yZTE)8S^7=QTBPwLz}69WS?Xg>=V0|PUtj{`P`fq{XIfq?~7 zXCyE%uz=cLa~K#{K=lNuPX#)A3Z{;efdPCk6NnG)Q-K&*G3H(Jpz&{TpX$JWtn=Rv zSo&0;avyeQDmeI{eIn3UKfd{IQ27L!^JcJ60N1M^whgp@1gb}Dp#397(7qo9$lNyA zE(Hbfd9E-oLE9Xl{KEk0&wvXT(mOOzZ6GSXATb>@j|iE11kFW)rymKQgMm*oqV12E zkwu8XrZW*D*m@1YNv=gjNR!=&32<0&fWs2R0nMR+Xi!E1(bzCJJV6qmLL5XRVUQfi z4A7c;kQt!(LXrkEL2Vn5I=FTa2P}h5K>7tBQLOz4q;@~3KMad|ka3_i32VoL_@MR^ zG9T2BK<1Z$az0{Cj{(#Vg2{vO56BIOe!w7`TO*^{56WktaDl~-1KOQ&(54W2o1Y7G zejR8&3Arr~3LjA31I0HeoER7wxL|wyk=23nIa-^a2{bl+a5Wj=v5X$%Yk4;c7tSe6)=v@lrMurV>f^xCjCF!VGr zFfh1**NlSe4A7ch23HXOKX~m2sI3i(Y`7k#0|MaoIka8ACWV24dS*9(?)qhbwfU)G zHhBH$76uIlh6ReCegH$m3Pn&qfZ@Ola9;s*{tBoMVXz6@XD|WvBR~ZMsGq>#(4okt zz>o-9_bCJ#s%P*}1kD}T@USGB_OLM6@GfAm;buuR&1Ml$)nZ^))nH(n$ol{PL^cKn zP}_B)I|GBN7X!;gWd;USO$HVw9sxxrZUsd(0R|QZUjbEyUIkSKW;q51RviY0R0&lE zHX{axGznFPbP3fp&I}BCObh~Rni&{E9R9xsnajbzFcoxv7Y75wE)~K5|G;ixWl1zy z%EDm7zJNi6?f-up7M4Vl78U^}RslsO772)5?g9`q-JoWsF))ZY{Qm(`12T^(0n%3i z&0~PfR1sr1pjOPpz#ufafoXw)B7=~Y6H^1EU!cMcK2J^#B(BHAATQv+z+%+`YL_F- z0EHhY%|OGC7o=8wDT4q=9Au7&0|Uq8MGOKWVgJusO<`aJ*`+4Hz^KOr?w34P3u1zt zPY1dPOaa{9C#Icmp}zP3j`bTD6#6$XM6BNmx?OVxXx+KX`h5%z>$fx5tl!39v3?7K z!TQY%I_ozvXsqAJpt61mgU9-%3_k0ZF$93zw|+T82#W*5-t~(ZM1&X^G?>6~-l0f# zoa+cEGHEL)su>a)=St{t&M4Nujv+vW@BbeT2F5At*D;8w@PX!(AZ!MP4n-SWX+Tv# zkx4}YVmERc0NDXc1F8awAoB$eFw`u zz_h?Xk%0m19-sat3?5*=xH2&GuVav4VAXD5SO+nWfmO?iNkl+Pz=46oY6%0Q8Y=@M zNFHQAC_gYBg{s@Gq1cziz+l72#K7PODj&gRYJy1%gNF@U1E@>|?}@NsWrCNf0uGQq z5UflUaDbGlVj|!*Dxfqj2XY%I-GTB8ivxoUDBW=|FxG+G!o$E|3X%u0!R}hnpvWX7 zpe5q)|2U`|1IfYi6=iU0-%F3?ywOdT%+12<^y62vF9KMgwn4cwmwX~v2%`{1B+;K6g0Sk;3BG4z1O z)fgaa-RrUT+p(-$X9kTKfY-X?=<9nB=<9>le!=?pAhTd>P#X~2Tqw9L5AExN*cH&e zz7hiiLxlxotviSfI!6OEF9kXq^NIyztviSf5(l-JEkWam(6#O$_8aJ0cOM1@W*O*O zcM!Wk0kYN|<{nVH8x(pV4DE|R@(bRz>yU;Q>4OO{eQB9FIgrr=un00Ur8GAebi5X1 zkO91i88XTMTLX;{Dh4^4P}7$js}Q3N6pTrfB$kvSugpdaN?`K|!b;2)*xc{K;eTn_93_h6kwnQw9v5!kUCIWLL2*F z1MM|}Dg{$8dqMRI$XsZ7gHs*a*aui0sEh;~2JH`n+=({!!S;fIffY0sjIIuC?1Km7 z1|r5jctGVi5n~@bp!Fz3jD7I!VPF8yKZC*yiifeACyi&^*N011j_%Qb0?r7#EKp0aXYeyOXK*nE~Ky#3waTL&a3y22Y zHwmIa``SVD9LQQw(AqTt5PuJ3O($qiK4^ZE8M;TB89E-r3^f-t4+9$C0nNXF<~3Pb z7#KuA^D}=S=COkIE3hyyu$DmiXCUrjy#gA~VPIf=0_DGf&}vF z3K{SrG~Q!u20KoUm~&q^4&a?1Wny3e^|wI#q(S`&&|Ya!<^?4p(7CZ78nhW2boQGK zR4r^DG-$0M@;+$r`bDT3h6W2o&{|Ee~ zQ2$*9uK-w6fc8m0HKs$eroq^Q(Mm7cp zCQz9r#K6FeJciH5z`z1pbG3$n0kozDG^fuB+LOS z|NsAotrdc)!*>22s6PhoACYkOKB(>n_m3K|@6pAwhLaK0{{#1rV2;6{G5b`Yxe;*x zhyK>ZG9<7tt3bdbPXPe4ZEin zv}f1{I)4gcFM!UUg3hUb16^MVV#E4Wo(v3(9?(9OCn!##eX0ls2F3_zp9&NnD$qU^ zXf1h-1Z0mfC`~vhC@_HL^vx3aWh539R3c5727?P$2ABdgE_6{QOx8IkHL(ay4BSN{sy_xZ1=A6r zTVRmEa!`98i?5{!Xhna#W91xZx0tOVDkoFLW zr3WIQZCEH1g94`;kSHvXfY?wBk^`9mY72qV6)4?9rQj53?h~XAl7^s-b+{}tgFs&n znwLOkf%nxR^|e6jv61^);I(T=@}PNWSe^sv2d5Dvc~Du3tRFQ03d@Ti^{YY7L{h&W zjei*_kAl=cLdu&U{x=2&Mp&K%?Og>2CDc4n+Z$xuFz@>@BCq`fH+iA!31MXo0|Nsu zXiNZ9&w=^}M@01fIO2&ro097U z0|O(d>I8)uD11Tg1BDGJE}&rtat06R?pe^<9}owGk=z90V&Xy8_k-PW4BmSWaxKV{ zkn@*7Jov?+pm+fbK;=PeT|w=i1<<}4d<_Fs9<;UAt{$o&i!N9R4^d*bEIromVoBB3T#-HB$zA(t=>7`fi|d5TuM@13$_8;Xw5+s4oRNa}=IG zA#EQfko5r!3{0Rgwg$+4Oa{=Iqo6zuwhuB7!3^p{fcTKU6hC-A2fZ(aZEqX6+=TWc zxIhL#`wpOf0lv8zP+AlPsfV_GKS6R_%^FPNGr6>2Qm({2Mf8)3BH>VNgmX9gUN&HXpr_{ z-bQ4A*OQ>S5#(XaHX^vq1S$uR+kT+%L2Dy&fZBKkV`?H zgq{fk;==Ynf!gHA{9G^xmQV*rA*sN?zzvG05J>w2v@a9XE&-kY0Y1Zg0;nAWsvaQs zNJ9=3g||D5ahwZaY-9pzpAdI00LKJ;?GEVLLHJm*4O3r&i4zNh4aX7#Qw|0T8!jdW z`2HVG(B2a9!H-h=GB@6U6`j6KcMP4by=O;I)ZO z0;+407#Lt-XOa{Yn&Juz-|G%4YIyRpIop2v2Jod19+Vz zXpJPuOo&^-YbC8gYbApc7_>oawp7Fz7#V~D92i3c6x9M47(r{vVB_%M^<-rZECLP; z!r*me+|YGo0s;;UAr^{E!jLs&AakZXV_+~i#K6qpt-->u0=kBb4Z4Pm6=@9_=CLsf5kozFv1$G}lXde_)FnImbEs)zl<|D76LJGf4DuPJiCx{e&B&NN&@a{yS{$Bdx%ICu`A zf#@|-;5l8`-X`$aBD75nYQy7eQ-jJ3aQ%$5-l+lFrUtbM8=&i*Kya8Nua|R8Iah;@DX*_qQv4<@K`VwA@GE=d1cBzaJK55yhj{S8=_1bG$K z%ma-PLDuAgMHzTN=MIDRy2J7{D6T=_gVx{RftBmX>OfTvT7QEXWe+N>`N)8A{sK;Q zX#EYaI&gUgaW8oPB`7}8)*~@TFfg!y`~p=5SBKW$UPx`P1K9~; zqn*FN0qXY>(cj>j0at13LW(GE(7GAWUCSW5Kp18(h>aBwvi?Q` zbo~)%4J4?3odM-rf$A6r28Jon{)jKkGoU~~9@mHROVQ-PdnrL;Q2AM){0&;;1vPIS zNDhR-^24H_2d%9J-QCCts(V4}iF`o)8wLi@S|ffCA3B~3I>QjOhKLcm=Lfw zO@M(x2(-oms*b4!q93&82&A8B3uN4w=>%vz7}RenD9TStg$~&g>Ngn~lX5l!s|db+ z6L{~^b_N|AaR!D--x(OzZ)4C{zn{Ti{ZXcW+oG&xY1p91 z;4ndv&4EGF1~z`nGNHhvg@I8;2y~KdgQAV#k_0nD1`iwI1_m3EC5bAc3H0p&}EKG2>qCNUB+E-hWUV z0HzRho(JsgPH?-r0kSV2R4&5QfM_i1`yp);=y)(GZC6m42rlcPqK{N|N0gTk# z0+p#CAy7DhXlxi9P9O;!W5XabKxe9g%m87KQe+I$55n*|3B*BG0A~|u>p|lXq#d+| z0=eymzMcWJrWaWreJwh2TMtxsf}AkS+ir++aFNV?!Kc&W2{@B+PX)-vJ*}0~zJgVBlr|r9n{egE6$dk)XoNAP5=< z2JNRt5(D2q1rh@*W?%pfdV$h0j0>mnv?V|z(xA2g7pT1r*8n~jh!NCZ0j<>pjm?41 zUI4XOKy%CBG8?KEG{y(YGaxRwEdgR+#Tesl450i@;usxD`va6mVdG`svIshk1}cX@ zV^|<(fY~|h;j_AAU}gJ*zF7q44`$oAU-UPKx}jjQwty9 zLs9^e1DOG8TY$^}%Wfzvmv-T{r>Acr8d zNM=w6Evy4gutFtqsnaO{=VQ=%5U@&+I&eM#^B{K)fTGH@0G6I15*-W-OyF})AzXN! z4LWlLHuej$9&}0?C?7$Uf!z*bgVqOt%muMQ>Ok!nBI;~r&^{#a*dSCR%nT3>N@GxA zR?xi$p!s&tcqS-qfYK!>Y(V7!EbKr>n}O;w(0X*JKDhf}d<+^(osDEK1L%NTB=f<1 zklk=|m{G$Kq#h-|Ff)Mf(gOJhrU%3ZxgD7gYU6?UptBo5@}Rs23TFtPm^v40;gFPH zfxKu-0X7PNvnDe&G$4NVlsN!p6ac*@gPf3<06IkgRFg3@b> zXfK!%xz+=Xo`8D6pxsiS)*|S1R8UO@8mvO@;et*X2d|z6wdO#(D^M&(=3v%bAiH5R zIG|KVY%K&zEufghRttg6#9G@xB963L2Brs8%ebeOIOSImy&?)pIV=>wZlhvt0!rba zumEA09WWYX7YM_18i)gvM4^eRO+Y0CNZW9#JwUA#ke@&pR(gQK6ckjja0Ab(fD}M6 zOdWddflD2F?Ez9pOzi>c@gdI?fZ`bBF0|T%2{bbd&I?fYfz*JQXtf6u==2O?Y7daV ziK#t6=>fD-pFr)w3UVKKbOYolP#FQGaZ-b__8_LVfM@vBqN4nwoK*PAUU&^*f_;6B zp@j(v>uXpPP-+NX@Eu9;(1i7CdR#$wX8ixF!u0<>!(t5;kp>24hD91Gpw6AiA_gUs zMGOiyj7t(gwa6MJh6L#P6mZSLz$D-V5(nMk+rYp;>bNSXh5)4wP+thtR)V<=wC)+y zM@j*$I)U_=nLx`+L46_Q^$MWA5TqwZ`g#RW--?pH5V!_}_J2TUH^OQpaIQkz;|FS! zfcHi~`$8bL1+*^&Djh7KeIXEAg6O^wJn@iLQ6Xsq)m6c%C9a@U=#!cP?iINs@fnCo z%y2*8Px0>f!5Bz;s}&p zL3YxA*%!BAG9%32GIIYs2(r{vlnfBElzc4W2Rtr*lJL;F;j*W3=H5}4{Rx9 zoj5e93Njn6kjVZOvU-sFkoh1tBD({` z2Du%k2E+%Y7ZBe9I%W!5Hw7x6A!Df2DTKgh*ry~F6clCVl|ZLu5j`?o^{tt)AqhRQ z6Daj9T8~WN0O-tl2SppsC3&WrEDSbWOOkBZm*kl|Z(va2VPI4Nsb2xP51oNYjDdkk zjM>DAm0_t814FMf1H%%~8d4VqhAEF27z~^kI7A#6*i|_g7;TuBpnD}jWeBLgMy}VH!99484$|vuP&$G2073ZxR^NikE*KlE2CeP| zrDsrm3+n-b*gep?7p5Mh2I4B11K|mUw7L~Z8)P~%AfU9QB((@+IH6>Wp#h``vHu!W z)`CQk-3sC(W3Ycf0`STY#DQRt9LNmNUArJNKo}x}AVF$C7+$7;I0$JZ*2wJ%BG*x{ zatu^{fr1JaZlE;)NPz`kF9vGgfyzfh>d^ywG!_G$54pGj)VGvZVPd$b!o+Z4@gfF+#S0h&L4~>*3&Rm8 zeSm>shN7Ao1EbIZ230e01_v`yh6XbM1{d{Z3<4^04D9PSFvzT5#vswZ40JEf1Vx6+ z3lt|cF)%P+l2B$y5?}}QNg-z%f#&!G6qyz^sG12v?r&jIPypXoV#dPY0FK6V>%6uysDRFN1+C{Y*u?N3y7x8#bgzucq5uC4g23@( zvVI?f!TRkCI^eZnur**C86bAILhKeez@W^qc!7%9bOr~rX$&rA^B4};2ro%6D`rRl zo$m}fGZ^G1CTN&29Z*nY5NL1!oo@?1Ggg^_gMmrl5IEcu{(og+YEWIYfq_BHfq_|V zD+4131H&8@0fr700fq*UIm`zX6yf3DqM*v;Afc#|^#8v|!v7~Ack?hXM1u-4(B6># zeGEje^Fj%i%?vUIn~}mL!9WolF2Oj$WfOx0Y+YOrB3x7$7AvTjOlN2?na1E?GLON< zMr28X*%XF^Nt+lLKz;*-jgb>W14?>()SwFTrx^=_11Q~s*h~zN^aP^8VWtFX$Nm4v zAT$AduMj9qLFzzZ16nT!VuQq(65wI;*dUnUKLug)0-k^OGYIrR^SMb211Nog=eO1O zGDv{V{4(fb_;15~=8S3fnX@V^42%X#8U8bRGe{a7WB70I92|ZUix)76GcZU9FfdCT zVqo@UU|<$#U~m>tWLV80$-pGwz~~g9%&6s|x_Bk%z99zz1`dZq3>=;e3>*Rt3?2fC zATb^5Fx<89dU?(Tatl+TcCl#8|o*Jz3CF5_~%-@ zm_a~&3HTiI%_^)69R2$lBtY$O=-Fi_KzB^_Z(;BNoipFRmB9zRFRGydd^c79HiiID z*n{>=fzMn6?fW_~0lcSb{eA`$9?-q#4`zVMGA_`W>`;4hLH0~u#vnF%DT62||1hvg zGQs19Nx;G27z00pn}8w%t0EHvi$nuMii9EqvxI}eQU?A-ObiT@mobPiq)I3*Qf6S7 zyp%y0cBd@^8%VuC1A`01pLor20-GZQHYb^ZVe)bYLD*eOIL%=PnUCb2=M4Odn!s)l zU`UrxT(p>h0d{W_#O+9KS<1i)+VhjwNU^AeagcumOKz*Aj3=CYLetruB12<@`5)%Uh=z=b&Dh38_1_mBbI|d{G zUZ(+S{1ADb8mPYy9-AcoOlL;W3>;)H713vwF@nxT1@EQ8VGow|sNiuD@Of&)>tP0s zOF+(3W59Y20+#dCSU_!SUeGKdj&Q?rJ{&9P%m#k29`g2vf#=$xW4hq`(V%Ql8ybCm zix30&s6qzVy;mT<2DD!ZN)H;)y3XwTRd3&`DA zAU0?W7&KM}S_5>(LV*D^hGN6Oz$gPfw+(c^-wWuuZJ_o($X?L7Z6OQ{ECLdc^Rh!2 z7#K4Y6u@^}#xpRmR!Bh3c8dqCc~?*Xm4}dVDXcS~h_8Z0AB}_R9TW*%m7gd zVS~o6gG!RY=deN9!Koz-P^Nn-c-<7CW;nz^kkybLIAjGe)tvzfBXBxmU;wWt0r5fo zGZ2jp!_?v$2M48}Ea+GzDD9z}0qSRh%z(rTzD^W@zC6;tGSFEV$ZLy1Zh@Xd)enI?7q;w1N56F+heB7N4wDu3=PY?!` zfgl<*ZUZU}IP zjy$^!(hIW}ZQLEFI<#?jusUqx6=>t`>=q0Rte|z*AUi=Afcm&#CYWG`l-J01fY`8j1*rk?LFom=)&Nb!Lhl;~@nHj2ps>_n zU|@8C%7f0m2DLLhpnOm|1nqm0fbzq^`I~`J2Fg!nU;x+s8sPB|28Mi4{sz@cP<|CC ze}n2HFn{nA)FRNcF$$pTm7(WMgU-ePo%6*2J@1*}3sfF@o;0Hfgbz9c45W_H1j_G$ z(xCJN8Y`az;WL547PN;5v|I3b|1o4@n>X{fND4ph64OFIQpa-oeDoAPKsA7qoYbfuTWwfuTc)L9nxlK|rj5 zNvT7XL7=gTNudGMCjzHs1_uR2hRG7zA_)vEYR(Ld43hp3-}p8Z9O<2#=z6B0L`I*_FjPIP(Wvg z!nAFq*N}e2z??0%1lraGl_Q|GF>?6@saK#0 ziL~Y*ToZC*jNm#1WX1W#?x`it`K5W_)*m={!ER(=U;wvYplv3w1Qr6O7FW9qWCp0* z1o;<)(TxD<2VqDU;HwNE?I4hTP}`jWshtFlU+7v9kXfMmAJ*;y)$<@d!@L~?+A9L` zCK$u&El@ZhwS(9}#R90Ef!w|Ug%2!#z?vBt*g@xWfY`|DKzh;IK@7OV2Z7ar+y^oXghA;A6rX7AAkfe#IIn}$fG|uQT04jtv?7p*b`W@-0;ui=nFYci zJ3%z4F91)M3=GVmvx+#f3`RE0OB_J;EOYYi zO`QJ!?-OKT0I6kC>HyDMtb_8+lpuFItYZR?|FfttF)-N(GH`M*FsPXsnz@KMf%%d) zf()8whE6UBa~T>;oER8E^G-}k0;(YWAh-1~gY02`0Wu%PXG%~|v|(amKv&nlALkx$ zjRpMRv-&X7B7yoEv@#V`UxU^*!1RLJYoPvB1Oo$830-1z#29F;SA5;c|xWl{+015_>H^CTG-+&nCZ2-^?6VP}( za@`IJAG9_A2drK~RtL&cXl(#SkXaymU>IgES{neTIqv`ANjl(q~FfeR^@{d4i@HsZA6{*Q-nK`iI zXb7%*G_fG%E-D@Y0&R{3>o+rmfcn*-`N{Pg8GJx?iaA06szl6cShLu5J{Za-CkUi=fKzBle&zEEXowo@J2L=WR zALRGGbOsB72Mj_Cp9Hi892f+c7&H_?`oL;8fY--pt>3_))0fO(!{jcYynYdb$@=9C z79cmTU(8?tT2Fv%9!MONIBi%Oz=venure_AB{ArL&iYxS1P(V7Fk6{{p)ZNS0L)f` zwDBgTFgSz!+`pe8rhf}VME_=nkp4{!0sR{peEK&qctGb>6Ts_OAoqNQ*sw2|V)C3p zz=n0n5|gFiyM+I%Ff%ZM?!f}JD?w+mg2EPj<~tJu_+Bp^Ck7@F2L>L{SP%3rcpDqm zB?cx-8ANQD7#VDsnHbhIF)-LLF*AVfGv{Dnm;pLh$cAZ&fr%4?hz&C%186Tk%&$xg zKR{&>1D16%6V`8HNMHc9c{eabFo5nuW>8REzl9-#;lKjW8LBZ14>~}1hUI|FTECeg zMZ=kaMI?bC3v`AmLx6%}Lo@hHPrZ;NhE$MPL-YT?DohNCAxR90Q2sv^CWh3IB!*Zh z|Gx?oL$OE_LnMf=zJx(SeJSLwa8P`M#g;M%Fe$+9M;Bm#p4+;xe?LPG=w4+8CgUcS z0}Nc?G!Hsk7MA8)7<54HR5=DZ`xJb)*%Xi-kQg}5A?MZx*btZYL)I!VFrcLW4Ga?C zIA6>lqQWG=uznGP4JeH-Ucg|qeglJvO7aH=24`?OWm>mKJ2;)&_pe|OVR!*H!v>VjVftWp^ffcsFtUTwxy}0JkTqND7c*F( zo5#Vx=-SuBprgJNbgwidEJ62oL&MS+6waW0fe2>@a5$@}2r%?1GjOPYmKr9^P=wuO zzkV@8NdF>+5EVfO1{Eg*&>;pw>lcB=e3+EL?&SfQ35t{cWeg!8f2y!U%#>naUe&*gHl z;aD=ol!HOQhJDErP~KBvV)$>v+`s_NYoNOop!rONg@JJ`3j@QNCkzbGJjVpiUrfvl zHjGOQKz>-G#2~_y0M9=;{aY9^`ZqJA^lxHF=-OB$_xw)E1>HL^cfhK8lY#)>N7AfgU*r#m3^Rg3#gw5YMa5r z1lC6Z_5DC%ka;6`gMhTY9+EcDB)d<3Vv1uy0RxEbT9KNJ%y!GnNhLUL3(|-%#JMOn zu_Vnp_4lgdx8eeD!uxVsf^Nb7FEvs$)(LLw>PmURh#}Cs+WaIzQJbu^42TZ)$FE zW)+APQWjEK0Ae^LIhIzqB$gxwr4J2AK`s4~o=>^#+-O#E(Sdr=szT(fD;}{K;tig=l=x_$G3n zdMldzJ~aL%r2GbQ|2;JMmuUPSNcj*nuLI6w2>(G&NkHO**AyY~!Q=c;J}i!gd7qvY zw3h)Cj35l{N}->lD`>#LzzCZ2Lhh@B!UwHSF9g~X2Qmj)9jNR@>(jHr>;b6-VHh8j zKS1V!@&c%j3lj&a0bv;55%pXbuz8^VHAoEzgYpzyKQ01#w}0{wOd9abOVWs3@=yR6Tr#5z4Oz zOCr>R&dmV}LFE^LIS6_9cn?&58=5?5e<)Z8Di69l64ahq0rk&)uq48~S7`j7pz;aS zK7go4yBm&y5w?a8>R(21I|O6~#6Ct)egknK@`T1XK$YHTWey523+Q}L3Umyn1bY76 z3h23a7a(Ibp!$IyH1971Iy0DofiVVh&p2o;FZc}N63Bhxp!*lWcgyuKFbIS0hMT~^ zAPhPqVFm*O=-zV1IgoqH8J93Hh=Sx-FffRMFfd4f&M*eu z)d&(#U|^60(Q6nOq(SQnKApT=j zf%uPA2jV|g1Bm}vO(5aJ>HxVrkF^5gPu3cUKUo)m{0F*C7(Vc&fOMXqDfTlqEG>*k zIE6_H^^6TZ(7JC>5`bWpV+_m;YzEB|2SCF{7K)&|?o?VBSX7=fFfu$7&;pHzh&cTJ zrLvTP1=PO+=~CbO|AGzEk`*RSpfQkL`%ID8^RFhh~yfQBM?pTL6# z(71)h`b`W9puHR-%?xt=n;0BySeC3XX<=jm73?Z(3_4K00cczaDkcCGa{%>a(ZmAO zH$cXqpyEtWwIQH>`ZOj6CKWaYu-VI!zzfgZ`}Z?wFf4%VZBb!m&;i{mzmAE4XB`s* z$2ukk7SKE%=x+CA2@DMD9Kd(EYrysb^lxO4>E8g~6Jemf_dnu3_YDjJpz%S_{w9V8 z6BKQj|NjTw1p~Sl-iBq@J_ct26%iK(r}g_8WMJZJ7BR5cFf%apBr`C8!WT)L2T7a* zCJq`eShEN;o&?dOvW!7u&0+=tn7j=O1A|Hn_)KdJ_v z(qv#?rNzLpON)WKGlPL=W(EWQDh&pnT^bDhFgJ2AFf3aKnlU0G4xr(W?ao96(A`2d z%u807Br`JDFzwoB;)F@kX{uw1}60-3>Hu^$oL8y0}FUg7d4$| z!14$v->h+9U}$J&U{GOV&=W`k-G5`CsKU;m*U-ekAmG5jH34+T(SP42DN2pfW{UL7#bFU@}|rBeGCrkw=>wR z-^O6Eej|g*`V9;U>z6Y4tY5|uAk@IXvVJ*3NK+F7gNOrY87L?}F?NCSkBt}ugW5I7 zm@H@yn2O*5hW@1t0sV^^BKj9GB&aO4|Ie^dLq#Ro{y#&ZgbKrA4Mi0v`~M7q0xArP z3={l&*r5p03l3XW_;{gq|8j-^fd>p+pm+j}kEuMj|KGoi!3U&{;iH90|6+!K z{>=};p z$d1jBF@CW80Z7@w)S#g#wt#_|sR7DQfQ*rY_8c-WEKszOYhbVut^aSf_5XkMO$;gh z8yPA<=gg~c{Qn=|!Jw%Y#K6+$#J~{Xz@P?VgY@+;V<=H!WnfehKER-I%pSCNj)CE_ zfeLtxkcmMCtd2oJ5fl#n%Na`g+!z=@{sV`_XAAJU29O&;X|>OQfx(8Afk9;{0}qp^ zfC__yfg+O}WY6Y0B?bmqScC3{3S(ek1)1IF3W-CIeh^=63In5769bEg!~ctFhM;l- ze2%?K|2_tX{_PAl{o5EU`a$Vx3xh%bW(J-9O$-|S8yQskH!vuG(w_QW1`qYU|1;Ka zV3+_JI|t<#h6MtO>dP2B)R!|PluljOu zILukUiD3pPEO;0geEWnLKzRt^_C*XG>o+nOfaX*BL1Vuw7$W*tGQ{++Vn_gm*ZLI< zBI{Q&NUUGQAk)8?A*Fu>Lq`8fhMfLY3?<`GICg37Tfz#+8m1IyF)lgJn`Trm0-Zd%UJiv&o24)X9-Wb4jJo0{0gY_F2 zRzTCMgu&AP|JN^NSfB!$BiqJsfZ@OfP+56q{XT{h>$fu;S-+KG&-yJ4JJxSz*s^{T z!-n-68PXJ-Zjf8SvS z7Og%m>LGVh{lN6~-3>pF`TA z$dJ&WC>Y}?Y0mH2A00#3@j=f z4226 z@=M=Q29|&Y3@m*|8F)bE_8nnh0I{KBU_bU9Vc_UH${-@J0F<^?fY)mG9RYPSS179Q zW3aFhVPH_3!obkKk>O7NN`@t%yG+!+L*qdc91j|5mlz~q;R~t*);(eX&FL_xaQ*)u zkj0?4u7QC8R2K+1Fla&MUlkPBf#wsT@HB+f`+{?cn>zT>;{R8I54n+ z!U1F#Xr6_^SwIz3=7aJvC_MTOGiZS8j$~*ZlWw8H!NAO?HU-jFR$*nx=yL&wg$Bs( z^;;qHS|EF1>OgJ=sRz{yYTp@H)V4A(YC-bhaZugSznWnQC{6S)WmwP;$_od;b6#uK zuVxVF-_LNSe;>n%{_PA$`nNG0=-j{eOITlzOKZ0O&}u%;iB2N?vw=K!hi zWw-$9Yk>A2gWD<_8Dy9mIuva{TQAuR92kxoD1z#-_4^rg)^BD|0rfFJ?Y$|7|NjHE z)0Qt_5CZvQ`C^T%czMde|_@GnhDa|6j9!fdOIiDzicU28A)mTu_=<6JTJ`Vsc;*arpleByYpy>}cZT%h1=%;Gn|tpMfDoLIr$J zrO^NXY>o`vpgUpUZeV3_v0-9x0L??MYhp05VcNj3u9?ALT@!;2NL~Ma2A%#b3^@BC zp!VR0|NNxRb@4DT@PWqZJ=n#(=OC1A|Zi19+)|&<+L$(0PW!pnXH26_Ut% z3N#rQ#6W9pKzhJ)T_6TlEXyDdn%4qhs61%R3S_Pe`TIFk;zf%LF>Z z1-x&#ff+mx_XBD_jKXqnBQt1?BzWI2Oc4f+;UCcc76$OXVGOk}0ZcuhbEv@khH>mq z_P`7SHqhEB$i89hbA&T6^{|8V2!g`CfgKzM=yQ<^F!gYNhSh|@dWhZ!4O%kGAPUlh z!#@`=?co94$1D!g(|~>c5=%NjnZE>$|H9@k!QGo zshU9dK}&;{XhP>N^%xi!LE@nK5)iuvx)0iwfq`iQbRV=U0|Ubv1qJYUN*DtJa}0DJ zbQoy36S@yNoq>TFw4WL@{-4gkz)+w7+2dTtz`%UR06GN2n45}4I2c`>b53ev5sJpt z5-=AuE1H*>3o|b`u`CrV4xSiA<$>&S&d<%wgy;mT08IcR)PqKx5j^+Q5}(A z&|EV_4VaIrB)BLM*%S~LRY5>vHh8ugVnRS-HiooQW?o8WUOLQDa3J|11$#+iNvca` zQ3>q2EGk8yn@eg=Y6)ca+zm3N4~{lB@MJuM>70`fo^p3eatlfYCk4>tL2zbz9w==v z6oU_GOarT>EIqjS7eJ@p!%~Yf(<;HngY1ILzk>qLJ+;IWe)KI`;sL27Vg&*y|A8<# zpHuPFcF=9*pgB2E84EHW8H1WgAp0Qsor3v$qn)1Co3%n)xlDd?xT5FCsjc(87laytfre zUJa>!V`N}p0?%zD$$O%ikDNY0^UEM<#QFvXST$9W3pylJH77-{ATgT(d{`z(B?!Aa zJ6kDexch}_Dx{_-7wa17SsLn@nJE}rT3Q+y8=5F+fQ1e94E2l@ic)h@6N^(d85s16 zD|1T{lNj`hONtmbT2TVJY$hjB56*kQ|7Owibd9qy`zo>;=Uo z$Xsxm0AC@Gtcn5DHwO!#t%U%a2W}&RWg%l5Aa{D9-f;t3YrqXV4+*3cy^!GbGayM&n-EHa#6jwyTuIPcJ|fmkNN#6f zV1VDfhE$w_%!1kpGEydhfq@xhFKF%@)J_KZ0~CfJHZ<%&>f{R`eLN5wj6vpr8Mp{C z)=Yrxgc}E1WC`bhZUF+1IUz)_oDl)KkpbCVAU4P^FijvnD4l`$CeSk-Kz&uvxdxz( zZXkJUkR%90HGf1oqe4GN+5ey6rJD~h~pgMwqf#C;~{{~b?fch{{{x7g$aQm1*=^HErF`o%7e3)dx zk_h$cpgIC{Ru#lNCeYclU?oufUSJMFJ!<+Ow8jK?-(r7(*Bs_(AJyA{ZF>LF;RB7#IXV`~n6B0T91}fk6<& zuVG*i1o2xK7(jQ2gYFau-5m~E(+FO_GX=7~1-xztq<#TpeGB6n$odw>4UqLMjC&Xu z#6a=~7#PGr<{e>R5C`#3FffRN_+KFFT^N5r*1IrCFfd4h*7?XVFi3*d`6MtfNP+k% z3=C2rK6w8*0|OIuJrd}iSdf32L2Hme>wQ4$0YS75#NW)I_C9F64yZf_(KZYWEUXL+ zEDj6|ENl!6pmjg;An^_c1_cnkfq_90L_dJgtRhfafq_8@w7y4&fk7EW+kkd+Gcd5a zFff4hgYK6D>1W*oReuDk9@O?>Wnf^v0kMzu1p|XBNdFgzIcyvdbJ#i{?q!3XtHTa; zFFWYWJQfB9cIde{?9g+2I20h^$e{uWM-ClGymA;o;+4Y$5{{rfqo8o)sDZ>YM*}3D zIa(m`%+UdfXO137JabHd+!4W{{0r3ZC4#Xdv1rUF5 zmO#=2=N^bZI1fPl!FdAW56&|Xe{f!b_=EEX#2=gwAnUO>pFsS<`2n&X3$zzQgbj4` zC?vgdu|U!*mj)z#aOptei_3t4L5qcffy;$~K^sI@FfizV=oL`<4wQZZiEl1w{D6k@ zcv%=2xJ4lTVOw+AGgxP2hu#2o+$C+-kPIB_RH@(*ZzEhztRPl33P zdj`aP+;br5iF*lDd<9f|4aD8tMa zJkax%cpfk?=!3++FfbUfFfj01FfbT`=n9a&;>`3s#3@UJ*QJ>olXCZyZ~@AmOtf`r z>U;lR0Ifv$CBSQI z79=q+faE}H*a(=zE#mMWY!1kL@O%x@T8IS>3=Giq0H8Hv2i9+7FoEtX6#%(={eI~F z$PEkzpgm^l8yFNob4qZ3ErG0Y1F2PE|K9-ea7gGv7e1_P*_4&X4{z@PxyPsq@qp$J;vu^u#6wuu2UzqgS=1-2FpG`|ZnOJyko z2Wampn*!*bSjZkv(3&x@9J>RkWR+JFvfsia1m0@~?teEif!8oeg61GW^KoFcYz*9> z`#(TpY~b-`0q`6u$e$bx4BfCjupspyb!q|(K5PmMyedrK2`C1bIuIXZSBS&^=OBC7 z6c|`QYeGPFfYgB4=;03aKPb#Mtlz@m0Nz6h3gd+Z6AoD@zk-^Ljarplk6o()=0S5+Au(^nR!Q4y>6cp81A@k@eY&iV_ z-owL|0J`4|nhwD8@u2RR04S^wahd=Q*Z=+d89e&8GPv|_VQ}c*%wW^M2_t<6fX`6} zrSAhs@d{es23mg#iB|*Ax;K!YKxGM@w5|k>7X=0I`bdy^XxvC3rFBtIzW|g51soWJ zKw$z>2a1aj2L^6Xc&V{4@WA$Ig2Dono?+=6ltwrh80|rPXnKAJG7Cp~#LVfT5 z1E4j1ptK7r7nv4-{0`6C7RdJ+fZT_}-#p+vuE@X!a+eCz{~uyX4B8;KaWF7~$3Vg1 z!GMxZm65_iN=^9x78MZ(29O^FK(W4FV!`^&3@xBF%Ahh2RNk%M z#L&P1I$Ep96oBf|_4^r0L>w4| z)^A|Q0NcM5d=5MV=zazk2L?Wndq8Vbz;0sDP!w@s-~yLx;JgA|`{-bx$O2lc%Jly~ z2Lt0rkQ+g2`u8)G^lxG)=-$A;A_%A=?fQLV9$U)pAS}w=bR{R1_n^O8FU^b5AygWsEr8P-v#PJ9${br^#%Dr zV>X~#9W>?&HkW|`l->nEH?M;DjNrL@?CT1!&E13c)IrvLU|)~nfVoD15p=f?D{1yH zf%HJueb|H7JfN@p2*9+5MFn(rIM^QSYf`YBF%R1R0a^FafZZM}{sFJy0I&OKz;4e3 zOt-Q7fX*)myA69-S76a|2Xp{4X?i$7(;JX=AK2HIV2M*u9}u$cqXD}fENA9}@*o53 zjx^9%J_B^!26$}%lnrVWfcA)k(;0}+Q2^ba16fZ1J#!K?#&-d_h66O-djYx!9mFny zuHmp`U|@8C?m-8!L1u!+qrDgym_Xv7Hi;Jl1LFhe8jdIi1{M_w$XWKFeRW@;YdEqP z7+58sXW3^lFfckm*KkyU#xbF1*@MQ2LFz&4GddX<*nOaDI64^^7$!i^vY*Dlzac=n(3}8>hU}AO0H3`N;)B8yM1$Kn3=H5kBn%AT4j_q3G(deu z*ir+x;?TUb{G!~%669I^%ybaXIky11Ai=XZI5Qo2n%^_8IJKxGI5Qopz$ZUHyR-no zhfLoi_#TPH8SrUy_!K>8W*luw9l`}^1WCe;$xBTEYbQ9g8xPWk<|)VqdC)YyQ&KR( zYe~tt{pVKfh6og}k?=JDkV${Am@{|<0>ofMh(M&k#}F_;29&`fkd+G%#Uuq6WWRr~ zhofOoYH?}_1Bm6BS5OLJ1*I03=D?1(^UDv;hAeo1uY$-1g*GVo!QznM1qWquHiUyF zhcoEGo`6IMC>eq=IGr;vfcC9``N-)VEPzD7)WS0WnjENHH~~6zjDZ1MmLN%knV|du zG6P%=fkZ$Y5RHL}KWo4gq!%&w47#(20ai|dj0ctNNOR{5fk@>QNInToe<>Otyq6cr zd{9|~Y~B>4at>r3_>4y+_2_FEzWc@Zs>itlq3f5Tz?VhH2z^d&(8^&`T`{|22dXc%s`vx zmz=@Czzmv42Q^ng@eRt4pl}1tzk=9cO$-b&;B>_RS>g{<2hxK!&(8_EzZsjopf)GS zTU2;&4~hej-5@qJ>_F-y1R!mC5F3m^=71Tvh(SKje*rRY%K%DGU@w3? z4LVAXfq?-O#wAdBU$7*69+x2qRK6nSof(qR4l|a>_uLA(B-$0f>1S(${7#O}l^Z1+z9Pw^tqWlI4K@t!9!Ahw zWv~#$enwau51OGFVQchQ1i@=y7*#>#E2w=6v5(ORtQldREvS42wNs(;;Q9)r25NpJ zsC)&rSE2Ihpz@W0fx!gIhu^;pRzKRff;6cHzHy}jJ@erOl>P&u88skhKQJah&PZU) zfXq38&UygNr7{*k`4x~kC`Q=X51=_k(ERKksQxPq48kBjbdH+w31}{ffr0T4L>#nU z1Jo8^Qh@R+AohXIGy~1uGPOX=XX=31$J7JmPk@}I06N236m%xU8R*#&4;UE4LHr+( zGZsK~6liV^bQcLXXs$Q`Vh-p|5|BSYXGI8t#48~7GlNbJ2k|#R!hsnyhYjN2fyzVY z*gH+YHFr8*D2eXJxRR zfY`$ZJtKqd59G`Y&|L>0bJ(GG%z*AR0P}qq801+Q7}x_C806U)7}#qV7^FaR-V-2m z>Fg^Q7(_t)9T0!8-+`)s08!5YN=qyZ3>*>+3=$w(2cnEQzHRpoNq0=}!2aGC0oQFf%YA;Z7O; z5BTOfVdJ6Tvm+2^MlgfM7C~|l zRoEEx8j`^Cd0Z1x7#NsTA@iot{kD)Z36dEYL25+YAZHRVscL}dO;wl~N*63GP@;~SffOUf4Fo^@*Z3VF?SDW z;j;tyJXcB3ovp}j2aUx;=S$$@^2lTGpndY7umY(Aoj2OQfkA|Wf#DFyZqQvwAlf9E z!DCGk0|RtFy-EKj27~^M3_AUYadgo9*9mysfX=j70KRKhhvC2sMX>w#L+|#6o@3Dy z!oVQpz`$(e#J~?qizZABpm`=nP#Rze2HmH`pa^0cCE5QMabS=Gu|bCnf#L}2A1QRd zLgEP=4qTvdd+>Y~bgqXf!9o$F5A0V4(0mocKak&;7&;U|^Q>U;1Pw)y7}&oh@VGMR z$9fR=y* zgQW`7|8GJK49rGNDB%(Y@;@|O3_xsXxafk|AipBQ2JC+gP@1$6VqgI6{RR8YK>_Sf z*nBusf&n-@Kx+U%aSskF==?V%tRVMbf#k%588~2J1PT8JMK)#zE~W%feqsy;`5$Hn zC=ICy{Qt+n01-z?L#6OEL`?d>0ZUJy^aHYY{eH+9C?LOr?mcI5U|{Rt&j3DW0~Gf* zj7t*M7%+H%#E{Os&;aSzX<`rr&4;QmF$jS7eyf1;E+e=t4CaH*0Dzu*3z{1O#R+I$ zx~Bznjx^}}f?fL0!mBW!v==lSBB3&Ju-1G>+S0lWto$DUa%b3x1? z|A6-ZH(=k(ibW52&IvLXMD+X-=*%$C&Yu7Oam=@1+0)Dl8uJA20md3PAVG}yVFQVR z=Yl{CtQbQN%DfI}EEP7d1MYL;nb!fGHwwbAvxPxy9q7D{F6f+D=-ylq`ww(p$Blu3 zQ3E=!;|A(~Ligr|fyOx`Aa@jl_TYl%V?b_61?{he&g+2AZ`}Z$*C}OSVAg@o>wv~q zL3?LGedbnBzZ^QR)5^fW7y;dzJC%WfwFWw`GZl0eBXnM8IRgXh3Fy2IXzjZNbY2Iv z7YgJr(A>&y1_lPuyb)-889e?%)4jH^#w=-5Hwayjc?8hTR(I%zSkR0ObT-C4wFG+P zFleM7zBLjm2HN@xo(zETQ;Lzf;0>Xm!G5STXm2cvd}0}7UnW!@IwgRl1Ld4!s4CE& zTJYJ&MC_#n&*9+k8hC#x@?P0s&<<46{qBY>6p&_X5Ys)7NgibHf%e>j_>hSi5DV%_ zcu*nch@di{4XDV02oDaBZerHYBkgd78i^;|A&CR34szr)qL2WmZKQizL1U5#SyUEG zEv`8m(5U-)2Jl!F1E^d;)eTwP3o-*XX9+2U&{cu>#LwA)$7d095}-5tk>@NJKx4l; zpi&q*E?bCH7J=N-2(k`Ie>YN@1d>PFPsso}2LUz*0g_*Zrhh9^*#(k6iY9*^sSE?j zqwhC;iBy(>4nZUgXTa$W5-DLGeYKI&co+mR8j3?1n-YS_>a*BsZ0c!=Z91l zg80aDSfDX|kZ~ycD?tLFZbeCIZh;4)%K3mbea8*Dscjt6b71*bZ+xfZZGBIa5^V@II9 z2T)rfc^Tv%w7C|3&>9>f=34kccVEH63}h&bjW*Z951Ly7=Vg#0XkG;|LF+S+=0^D2 ziQ7{tqyXxrF)%QI@(XBw1r#43yFqLu^F%=VQQ-3kNcMv4#)=2|T#F85ES~|?Cjh%2 zcQvaBk{L^%0YfXrauKnIkO6&<iEboFz|x-3JeUqAbtpBOqwAEdR}%7lno8mkA*m4L>U z8TUZO#u<-5)H6cI_8Fo3h8X`q#`HncxS+WR&|C;;jGRdYVlI;bWGtL%36#GBs(ue- z%%AB1WbB^l4s`D01ynusoN8w1z3j}OzB_0R1G;YrbS^f?KISzL{mdsIW9iISAo`i1 zb2ZFwAnpgvVSvWWLHqha{$g1JaSzJ@hcHY} zpyD4G7{L555I!iXK=H^1jYrU&21uSw2PB_XoD5zt1smLljqMv7V?STp*vQC40Spqj z>Ro-@7@0s-7C3u@rjJ4OFp>a=1IpMwFKE3wR4tftP;6KX-iIW>(BJ_cCl^R!;02Ad zGb~V0)MNsm^UKMoA)p940~mDPFX#+l(3!uW@k&(=21XIL|KCCC7#R!{q2~g#fzAPD zR1;8CImW=KahQQaB;o%b(0-!^=o!NzNeqG-hZwj)`WaSOC^kF-kLmM(#6TFd=LsY? z0d#`P3JXO>H3>z~zNdyKpt*tn-@)b{V&DdiAA-DrWEVHgF39*30|WS+;ccKgVuK=R z>=AUvB51!6=uBaT13MIr9@+n2zn{SYG;RqWJKx9v+CIPr8oLBFazNv1&5J-|*|0N) z86JSf96@p*`@#Ee5*T_^g#Z5noxRux9(|gi$RH%pzz`&$$iURlz%-#lagwqEw?F~| z7sxy{Rs{y8R>&H46*jP6zOtpSg2v{iI59AQ&iPew z`v2d+_5XhprvLw!En?tNdu;!ofmymqAb~+2bOy5t*Z=~=p2}OfN{Qnu41RNNWBou`XFmNr&VqjnplV&nV{tt2w zSdGykgc=S8hILC)85ou=W#EB@1CuA%j;jm{Hh}j{F)cuZCj$d$uMPv_qD2hcpm zKnkFkn}LDt36xFhSSm;#WGwYR*7fdK&Ju)llgYRT3{=R1``XYo*dX>3=vWN$(6KsjIf-|y3tl)AJy?}itdFD#G8}=qq!xOv7jaE1oZ4Zgg9g2llabCxODthP zTH@Nvw~?sKEhJ2iFebfMw7L;>Sur_d&zr9Aq5$t{TMH0BAic%GgOX z$SNdxP@X^L zP`?u-2I~5Q#6f*2&{#Jp9zbaT6h3HU1w1pL8j#h2ifzz3I*>kSKb9H1ju)yHM1jl) z(P(1@IMtzz6@b+dF;>9B!N9-_nri~t1;QYIfZT;PR=^Ib`SFbvfb=pjFo4#TFc2{Y zzz!NSON43yQ6M{EG$`MI*bEE|T%bE?K;vJaFaw1z$bF!&0mTJ0>_AGvcVL0$2S6MU zhM5OqW5r~Q0ifh@X2Rzvf!v7f4iFpUc9?rWd{BA;@t;8Ys0^U;nXup7$0`N7mN=NQ>aCtwW?qZP(FN|1j+~9fPs)7v;{Y#3IhY^JPAe%NZ$l> ze>x9njZz4t?+99V4(dBHwm{dzfzDY4$wT`xj4vQ(V1W9B{Gc;WWFUOddN?p2+Sg*b z0$FFq^a8TZiy7KSWG(^q(b9@D^D;|dJsQN>48|td`!r_ere@$SjRG-!8o>=HeHzTO z8D4<)L$2SzAYdZ^I#Yp#1GF{(vL1wm1+>QzG}paAi3Pl_MTL!l5hM?q`v+wn(7F)x zy^f%J2S9fWK;*%9jqvvGN8E8E;K0BR(hr&|S7~7Z?^_3%%fY~)23jYj!u0<)NIj@e zqP~|w0%RUcEl3~2Yy(APbqoy#;CnR~7$g+IZB;i&J6k20ff3YB)=5%eU|6D{DB|${ zhe7NA{~+_hcUeI100Ny8&}YcN0J{GNx()(#SAq;EY+!2{R9Hbpg@qymyFdejJE#pT z(4gX^z`&%`pg4({0n}fyQ+dR|IE|Ho2ipFXXJBwpwBcc3Q0-x0P~m1^g!L~#eFqiK z{~vS~F*t}gFlaKY1h3~%XJ8d{Vqg+zVDK?eG+4|a-vc_iJ6nQfpSAhjF}43k0r0+|DfR~1$U?sW_d0*e?J zxH%XYyp}OA@EExN|F82H+}GL(3LhIb28Joe7#Ki(E0sh4KQJr;`%ezs$AaEFVZ#3Z zAKbs5pgt0VJm_vIh76E@6;wnT7(D^`B2fP!5TpjJAJxvl0#XC&KfvrXNd5mG zW~Ye5{}*687%UV`IR5`LVf+6V76&R%85kK{1(X?>l$jY=lp7c(DkvH_LHkin3W`&j z85lw`7#NqdF)$b`|Nmd-5vX7L|APtZ|G%L9$R=$6|1q#b`*XU)e9{9`;&>0Au7$iV@+d*e|fb0g{Lj{Tp z&>A|>Iwdg$242uwF&+j6V^BPqFrT^(T6+S@-)b!OUl9A%L3eF1FoDED>T$UP7Dk|Z znm~4_2!iieS6RP>L1F!71{qL3VPFzwVp4*{E6A-XQ|f=HOt$}_GQs|j$|MJdX^=E0 z0kUfv3j+fvepDcLMmz<%2ee-uwDzVinSr4XbbnG31GCx`2hh4MV~`%TVh0A$zIvEj zKx^e-c7oznEeKSVf%}Fk{aY9m`Zr?@Qw@;*2~I4a@r@Jfw=$@xi2nZ%@&g0I4A5CL z65#vV_cIu*-_D@3ej9@Z*pC|-L_li*LH+`TGpIsCE{8y3pmGaDgXI`OhlnHAXMxtq zi7_yM)-^Cd)F>!|%F-oD3=9TN|NpCm{QnQVYk~u`PEked|39XQ3d#m8|Nn!+hKGUS zDboYcnyUuTJsw~qco-PjL1hutY|#D^hCXNe9}LCd^>5&|3zNbMMTUeKifoJw%%JcR z6Jr3+{pl%z)9wq99iTn^Vv9iIGoW>CjPpV3ub8H4D1+`w0i72Bwv537R94;sxec7A z9268GY3lz~kXWCS{SUFE|Cd4ThPg|`;r}_194PKUeqCb(xkqD(DTH321PdR?S}{<# zLDvWx^lxX->EFhn(Z7`eUtEIL&tcntZw0E0K;tky&q1atC^E1JG(g5F1R59~2`El* z29GDPfXX+OLkx@tZvX#-*pRXgTyA{<=}}=~oXOxOpu7y+GBZ$I#ssAUFn561 z;PIdp5?Ue&|6ha5UB<$|1d5MkY@jRR!D(Ft*VzJ~#vjP{FudWvJgMu+I3Z_=fzB4- z0-reyHA{qnfqM^V(3AmuL=0mO0|PI}SxgKJe6aoqNGYfd1R6sCvB6^?IMz5}+fxo2 zOM#4m5PfF>186TKEhIvYrh4o_{QQ zSU~46LDrLDUxS8aZ5Rt^ei?G71op8bEbG?TK<7e$*OQSDKj7pA9d81i=L%aJ23~7` zXKfg$&j?yO#Q?px0mKf0jyHkIrV!|O6NnAEUmjGhf%VxKZqZt^Or&vJlb^wiAbU^p~XEQLc$UyIH$Ohe~ z09_l_z`(%r0=hN~bavwz1;`oKT?`CtTcB&hx)>N31)yugrZF(EaB$><*IBG$U|?Z^ zvbTVy$f0addSigH!C{DZ91YP21oibm$rI#15DoGVhz6}~1JR&4a1ad&PX-2PM}oA` zH*nu0nE^7b0vXi`EKMzi-Iw52j4@tTj2Qk(E-uZ5t|fDG&PYwphH;8PH_p2y!uFfH z!T3IzdD)OvWQc`T;N?+nu$u$iijf_W2p(p0DoukMj3f(Qnw6Vapl1l`%QFz$&2%g+ z$p;VT;r26 zDiTW=@{5B~lgm)Fp@lWnx6n~ZNRUHTqd|pWqn9u)EFNH%g81M8PSi0^kg!`~3AX3~ zITakzFeAX);n9^?0_KAkt-)dvlqA6zoYol_7_`7VP=z$8R33LeN^{=?lfSLK~nF@ zfGA5rYsiAp)T50XGlIsAk?pTTDsw^ObRg}BabgAr1}7&s@LpCYCpWO!!+X6MJMx?q zbf}F1G+zL#Cm0wQ#P={TFoDt$sBH#{W6*#FDC|IEf*>|13>g?0q(J9Hf!N6EKy0)z zWbi#wFuOqNVQjQ9WY9UcEa3bDQUu?6%)o#)h73}Na&8C6O(1uo?d=Dhhs%LHW)4$_ zHiito_YB_{GIZP*Tvfu{4ss%l4N8L``$1x$B0K)!m?Y0{H`E2Z)Vio|pjx10%S6fS3=r7s|z?$QWw|*$Fp@#%K65LiVOJ z!1khtK-ZJGfXh$@1_?&UeN>=5x1ca#f%22UWhes!Ba{z1j|uE%P@pj|Fu>;(p#13! z3=E)tLjZJadnH&gA_4A%))_2<4F5kdFfbfOlRpP4LqTWLK=p&xmx0=A7Et#-g{Wr% zMF?ol4Z8k^X#!L|_?{Dx8mN2zL-yD(FhT4Ctv>_z13Dn)F@nz;M5u?X!$snog4(5^ z_9#@n7pM$nU|>80u@7`EI7l^Y;U^>7*gR-&H|V+qxc&8@G8EKa1?wMeBsnF)r+5dv zk;KEmzzj-L0t^hypwR{iC|?H3SAp_1pnM(3JOYCaWF7&umJPJ#j3EbdRyIQc?sbfljs;hvQ!vu0KNZ$ph z{1vGD4=Dc+gwK2cvL+3*)(zAj2hB&yf%eFV@NO*zv z^@HMrHG=_i27Lj+; zl^}i$B!1WuAohXw`71;B`749=`R6b&aD(^-3=G^LKIklVkiHto8bh`Np!p^S2DS@O zb3khbLHqbMAns(>fw+?$y7mw>?<&TUR-9juigbE7e9aw>`6(j$`qSx*KUa{%pq6@l!+=mvI%5|BD{jOQ#*P`enk=7@uV0dz+LTqkIr5ww2Eg8?%92fE`2RL?On zFff5;gkTCmbL}8;5Faw$hJCCF%ejxBDh+;yBPruKpfUv9&w{QW0Ik@p#B7ii|C6D%QZWoJ6S>A1Y>CP z4!yqxUSkN#`=Bv8P&k9)6BIsZ{VmYFA7FEk)q#o?wEh;u2e2vx0kapazlBpBT7L_y z4tcx;H2-v&J&W($J>@;Y}=;zMe87^1d27AUecFzBd={Qm)(SGEyl zVCdV*z+fWw|G(Ns1qQWE3Os5X6u6=5FeJfk5Cy~<><|YAQBZqh8fb0!GzKmc*8l$* zSfFbQLIo5Jn)y-IkBhYa{{dR_06K32b(Zk@dKoMk~S`dSXS}_Bo zRuZ^P^FU1irjCJusR2BnXw$!qf#CTXu=E6?H`Igr7$6oZCeY3Sl?kA71~kV7(+E26 z3v{MN00RT)d@xX20PTqZ^>5?VNh>I%!ZF2`mUDu$%>f(#`<~ z5p=Ff8l(rx2A2~G;93(!J!ow-XzxErUX+1>Q3X101>%Fwp$3&hAY(unQVzirGHERx zXzGWyb)eg}83^x#2WMTVa%f`)`BY+<5Y844>ihwCW(1}OqY;EuK7+;`L4HQ|KZuWv z!C?dvz|jr@nE|UOv6%zX55kaeMY0@ZCJKhMdq6^j+Cd;Yk=r$tu60fWS&GzdDn{ai z>M0O+n75M>`Q zH3HhUs)4qx4uINL3=9k>pks#@AY)CSet{rMT5&SyY)1Ee2>q4f)7MI5>!FrWA~3CK?5HVOLJ3}~(qCJ!ppLB_s1Y0qy;S zsR7Y2b!cr0uz5tZDHv`rFfh#l83e^3e}Mc0s=L7B(hzabei5R^UO;0YM2x*K?AIQ&WZ3=df9DE!CUvnMe9|q6@WRO2$To4~*HZmV2o02hS4RRy0 z9UwNy?Jzq)d{BA;@oS)M3UD6*Bmh;2KK26I3k;Hm?2jUR>(3*ON11l84_4xzHdB&i7 z(ZFl$7tB!9V*=Oj;C1!jI(`#_1P22{0%{#UL6OaY!MA@ug9d|uKm$VnWPc6pi~#UH zn~f3KbL?CWF_+n=+&bXoom3FftT( zD2FL9Fi+XQ0J>B+7PNn#L0G#~v}PVO zJ`GY1#v4e#Z;p|HfeF-K0FB+Cl~YWh@fQzhp9nOM3z~~!VqjoKUaQ2xz`z1pX9Kby z((b{2Rwj+-s2GW{Xn3(1LU?4D11P5AX426zJmu8X2|NWw3!%* zoUg*E4z0}uR!2mei3wB|-2gcdia~A%rDL=<6AP%_0_yWXl|lMZ3=H7&A3^G&;-K@6 zh#7}r1+~?Q8Hbqy?HPc=3>3Z~_krRB)EAcs;PC(dOw8c+jx9q%0HXcmiQ0aGopr>- zE}#g~$HWD0OML~kgP7RB`gIuul$oZcGw=vJW#Beq3Etz| zsi4TfX5hfUjxgWg5t8|!lcn1f6qmGuk|X4v^(CMcb`A_ICQP7n>KP(H<4Pblmc8#A z)^BHUVR*0ubf<>~xDC9C!2onWGqertvwk0g$NFsy4(qov*sR~eV6lEPg9+%a25`H0 z8AAjI1H*sRc5w&jj_lt4{R}=R?P3lFhF%T^22i`0kx4*t{R#$^^@|u3COCuJ$F(Yg z|Nj~}f$u`7>R-X2(96Ogz~llB?=sLiULp<*B~0NGiVQ{Ic5)#@GnfXg!DkSA0P2c? z_J)G)ChkyV5CXT8d8Udo@Gyu%+Q~-H^Q`(;FsOjr$Q}ZUptG%@ZRKxMLKzr@9xy~P zFnmxHdcdFnYHx$qV}aVr>dP1;R9ydm&~sv7327&s^4>90G)j$ z_Tc|B&^cfrJJgplNPr4t&>mONo@qAl9kB|EAo2d?3=tr4ko@`u3<6+zMFzG06$}w7 zO#lChDM9Y96mkIhWrJe>7KRA*%?uLLz^7qA(g~=|57wsuYQBT+px01jg5Hq;=>v2q zvMDq0fc7}6aQy!#rokZGzl1>nqz_~-Xg@hC5nLPS%q-BE^`JAe zKy~m91_tnXxl9ZU?8x;yFZ6sDkVZ(~fap7j!E-j?{h|jT`ySEVj^&PMNc|7p!w72I z5Ic?v>T84B5r}bA#sX-60<=yObnh>yUe{n?VA?~%nOTs^fwT?>Ob@j45R{sjlarqe z=@Wo^A&^UC3HL*=82}YS+Pnug7{24H7(7LcWDQgU(oR8;B&et2T9jCv3e^o013L{( z451FZ&<~^)p$uNbV~+fSDqv8$fwetAZ7dKU8-}UH)yDyu0Xhc@WCkd%(aiv@MFN=t z8hZiDfjD3WIzjxnFX&tz*tjmpIPf?Vw9f+KgYP{=;zuzsFv8LqNFG#EA?q&(IR!~Q zcs~gee?FT0CNw_sndG20D@b~n_nBCb$3~z{RrEd+FKA2yRF;9t3sAU&(g-Mg(E3b# zuyrlS>OjRh+Bh?4eL5&;;TUEwsE-RW7gUaby6oVZ1+EId^b37Y71%uFG8N=LkUP=V z_<_!V1+AHfn+Q{f)@S0VU|=9-oEdx`I1%H_9H2cnMD&@sbr={JLG=(Q%s}A)avvyc z(E3a~p!Gt?eLs+2;hw_A7-VzT1<*bd_+Dv{dqJLLU|;~RMM2{Gf!H7nm5&DHe^C7b z)el~Kf+P=$HxL)rr|JQ75OdkEGv;CPpu6b7N}%SWp1n<|4+bswQEDHk*dVVw6d?N~ z7(ip{pt9Zq+P?$MrGxmOv)@5!&jTv%1L^mHk{P&P2U@=fn)8L8Da{D$5AK1?wKLv< zn9ukCvJZm^Y97-Bhnb=O#!HXvwkx}N&jYs z1<-y@&-#4~9qYFE7)GUTjZ&M*gbuh#ly3^Ujq7?`!3Kj#PCrpP9MK(nSR#0DtgMpE$e?LPH2Lr=D6~X^Mk^4fRJ`jVDL<2(+ z=8KV`XpjvnmK6BI#V$iTI`0Z%^) zY&NKW)W4Ep4yX?WGMmxd0CE?dG6V0j0tN;ZuK)kUv_O3zNS_O&2Go}V^`T5S|Nj%> z1f5|D?$3hui-Pv~!2Jd4Pl4Pg)&*)BPEee_h(SU{h=FnWAqJl5TNorj{s*10jfevc zMNqgfh#=y@2)Z_R3g|Q%X92|}E({D)wlFY&^n&&gsVrq+!WI82T>t-r&U5Zx$uL7u zfkCW)6=-a7f}+#{2HvTz3_J|1h;)N|&Kt-LQ$Y86h6-pc0qqEL`2Q8Oh8doQMWq{- zsxt5}I14DR1*K_G;fDTI40HNdG9)lM1t_iuu@5r{sA@7OtY68H0P0JxKg=M|zltG- zQALk8%aJ@vf|6F_+lhCh&gHZvmw0}JT90uBZS(Ao1alNeYS7+68|TmS#0H;_HJp!;p%>OlQW&>jVl0Jxutqt7^jK^EhlJ5a&T0PQn^_Ho1djNtYj zf%U`S`;MS}Mll8k787Wn5o{)oeNwQ3owQydLKmp7F5M9|*D&xgQ5^2O{;`K<6AG%Y)M~l00}V8WJD8b_R(*8RRG= z{xUTFE;RmeBtEDe4&n~?ejw-|L6AQ|7}^}h=m&zr0u;8${X38tT0f8%wEhNU4zfB> z(TUy<1epa=2g5LX(ffh8)S=Ctv4GSO(+`}%zyP{e1ZFL$3wdsvUQm^w zbPr;J(jSZsx}h56USj%zptbQt^aHs-cbE{<4+O2#xdn0%6eGC_DuPB0u6`hk3A7)l z2XiJg0l?EDl<$Qm58j&z5`)U;g4iGo<%938L*j$hqJy}wejn&=OJqLiPD^AyXsiRl zC)5uFRRr+b23AayFda9r6-WeRE)O)v2cGLIf%0MZ1A%U#096%BAbmE*1&}>#j7uQv ztU<$qe4sr{3Xr}ZQw(ICHRwzOL6Gj3mj)CUt3q3g0i=MFQ2<_tL)80=B! zroemcbwOvi!q#Pj&MpS^KS1Yjg8OBUBorqkf%{(aDgyuiE^1<6=t*J_5K3T>TGzzD zBILjz0Xi#rN(uvyKocm5YJkq^{SUrxdJ}j)NPvMwnrX=q1_p2+1av0~=$uXDK2!<= zgGdLY@4^7l!_2@c;J^?ppa|L{2RaJ?Q~-k#HE8Y*f-yk=s}Dfymq39^NxKka z#$a9p1!{+Y{5Z_pY2dw0Ab)}|w7NrYr-Aq6gW4|0?JrRHptaLDKzCJw%t2NM%C~6k zG)CCkMUYw$hS>{h_khfW_62aNLu;pj)e+H71KrsU8Y=`@3C5uG3rf>y?KBpUn~7+r zfzHPvW{nd|IFakZ4=^x*?_&hn4+;m6`#@oXHeSyT8h3`bS%%;mCmCov4KzmxjtGz^ z39fM>uH6JG2gxbiOrY%)8|b?57|7T%s2u}d7ybdVF1)xhFB!h{2(d04NBhFq(3pg~ zCD?Nav@Z^<-^d^Xx>sQu=w5~G3?`uS&ilSIFs$DU8hf9ixPCu_&H8-|7VEb$7_8sQ zptF7pgU0$z3<@F*46N%nFi6-iF))DcDG+dA2nF2@0pf$!k1#MzW>O3K|DVl)!3VSs zLdDtsA4B;DMTYPNiYhJ+3=Gp16jhw<|1gwGD5^Nw|6mATp}2ktgTVU5pm{COnhXWS zzC{cS3__n9RGb(X*DYdTP-}8v=wHDg!qg<7y;K-{P7uek0}KrP%NPWvG%+x!v@kF+ zv`J_)ED}%@N%;R8bWXPk$EoX#tOCl*z$bGyfcD!ng3eh7jkki%L5I7SK|zrrP(T@c zpIq?&|DX)Rl%Sy);=sTII&TPc-^P@sproas$n+0%kA;OI!$u8dm8B51ptW0|^;sab zT1?<`+@FEYcIRMV$OMh6s$Dz4pf=?I$o&FpTMsa(avWe-zk)#k4MYfoT?VbB=kh>W1~SRrSX6TQZT>~mdE0 zGpNA@4vFnTP#J}|UJbFn1b$RAq#an92iopQs91#+reI^B9M~zva4vjN3ET>(6zl+H zkd3ILo7k47fK<7`jR5nIt;HNh#T>o_hb^gRB!fDnpg>2$Aag)%RM7rZP(2KaeOe&} zTAP>&*V+_N{DaH|r8Uqr3@&wOZDO!_M6`*SIv5yOKxrK8S?Cx&C>@}+i9u%_GJxs; zm^zRe5F2gmlI;ou12Ju4c2IZ_F?Pub8b2ap?2-#~hTln$gP<7ZJ}4KH8eC(Sj8~v- zVo*H+b}TgE5nA^T3V&qv;C(tE0jPfXUI-|^7gSe)mastWn+?kUpmQFed~mA?N&j{b z8-&67hgW660a;f9YVUx~_XMSH@Lo^}$k-(KTrE)5-~kz%1f2=N2jWLCFz~TK`U@aF z=&Uy|A9Pm>XdR0V0|Qvx0IJRdGKR^R0@1@b17a`ed`ghLptcWq-@^@vJ)ryVK4Em|}Qc&nQ;vnluY`dehsX=2Eu=#v&{X<|rUkGF&bUq(c1m!^6)Zp?P$9z60Baqf4 zhUfq{C_%fNTr!J@o5zPKhP7s~O~WK5=OeBi!EBHsH48yIgFxN|wI@L|HVpPRNCH&Q zfM_HPk^`AR@AEWBoli$T`xMl60eNAVw;92ECqVuLVQ^K6dAETHv9M9g=y5V`IdbnZ6jJSI@R4jNYh&&Pwp22?gd+tDB& za)9QFl0Ymd2Kg1r#7+&eHe(K`z+_-xKyNd``W&FiKafYz=et4eX^=QXo=}?(rPL(5 zAT)rEtD>y|W_SS_S7l&e_yKJjf!a(gpz}BK5_4foaS69|Oif6b$7MZ2psllE{T2oX z6_Nk{85#r>LFbCD-vHWk*r3P&x;Jz`gU9-<3@+<8GuW)(#9#r+nCmw(n5ZvdPyn%+ z7&H{2=cu!Q?!}zEh(Q6g7ZDWT91INcSmt}3Ky4TsVFrf2Vg?4aLIno3A_eYAPT;l* zFUVXbq;pL{W`W$q!N6e1#IQgSSq?N#%EYh&G;WG~?)qC$I|Xz{rO+Y<70~(XLQM?f z3?dp03|k;)f-ofsC{A%v;4xwT|6ib)fy;yq>8#XXEN7**LC#8L*aEs2QlUYmMS+1S z1+r%kbZ#oh%?zR%4Gdc~6d71G8dR1lFfgSe&SnLL6J!k}#=Vsu{aYDa`nNDR^lxUc z>EFa)(Z7+wq<;g00d&kXV1qq5XQeWM`bnU+5vZ&IMFj|h=8-{b8v_^^z~^rCFfcHK z?mq&xjX?9xAT=P&&A`9{+fNN{8#Q1*Z-dbOIIy>&?ICi`N?kxi+o&iNoN-8N9>Fz1 z^E$`~kjIHE8o5p6M6(9{7D<9F<57#P6k*@D6h z6uzK*1_~QcT)^`c0|N(WuQ77jj5DjjJUYnQVhf;cF>qfAc3M@jUdkiKydygR8)XwfT_d)Is~L7(nNKfYLz)WbGfQJ_num z!7u}I-Uq`9NL!F$3xv;T16d2m2we*Z8b<@I1qAiEgurdZf<(m77<}KBnSz3$fdS-J z9R)Dk4Ae?AHX!9Z5Ox;=ZN(GdHGd39XSD4DwG}@og4g~%fS=W7vL1F9`c?+Wo$s3% zBtUJs^~)F>I2ag~p|%UbXPfo+?`JSU-j{`XcH0KUNr%B_Q`CdbZZkdvKAQrx9*&{! z2!jCg5%5~S3Kb>?2C*cDGWEj_3=DPPGbxIpXHyh1$n9>Lc7cIM=m8ODwoM10GXgoY zje!B&Zvu_yfz}VGAkJ!wF%kvcuc@HOv_M0#e;I=VDC2|n89~o$3t?iIp~!RqA`g)> zP-JjW0IgB{C(ywlYcLVi?ru;7-@DELX;XsQxKRBZpmrmOk72em1FwpZ0|RLOUd)Ms z2XvkY=u8yw-Y)br=s3XVj`%I{U|=v2{{Ii8RwxN_ud0wRg9d}JG86c0lPL;{Mrr*2 z!RMO@K+eu!D3MS!LOwqQv}+uCzKQq&24>LSAr1zHdCM*{@PNWr?a}}L0uG?Qr~F-VS9? z5Xe!4=jCBW)46S~21!TY@f)P11!jWU2Otb@Lx4D78FYg9xp(j?9_U;*$T(+^QAm9B z^CQ6H>`3x?XzH8L_*2pNpnGMJ+v;19g-<4y~;YRtIWdgUkY9P}>HSe$d8E znL+nXg8Tte1Hv$Mpf(|V4G9AS+YI8)i(p$r+*~``W8&7Ia)QoV2aO$q!VDC?Aoqd7 z2Cc2m1!||m_p~6*Z-D%S6%VeqI@1YgTOD?nF0AeC0&_gb(+ms@=;uYmqRE5zUW3G- z>YG7q5Qg$W_mP9RF!Ryx(gm-r0Vx2hC$jB61S$j2of)9C6966aEr712ErHCdgR%yA zzMBO)->m{|=Q}{#`6F1JnZA`%|2qSdfWjUfjeI+~&t< z|C^bbn-YJ|m1qh|`=65mbe;t$%D`BKiGjg}V~K$&2ZKm2D3^e4Y6Gw3WMEKXVqnB0 z$Am|Y8IK$b9ywM#a%_0y*zw45;F06RBgchDjvJ304<0#QJaT+^D4=?g5tPS3`~7(t7z9A`UNEI%3=G0YKrLxTIuI~RiK#Of7{K?5z}yO=L2W&x zdJ@Sr1QWEU2!ugHzMyq&Aes*$jg=+G06BXcw9gCF)&SW7zNZYUYKS0c4jzO-rx@I*hwV@ z1_lrY`3ux00=W^~w#BX-EDCZ541>lV1sNC^K;Z|L#6hSqFo5Gg3iBZ$i$`)Ner}Z0EE367#KnOgg|Kml(4#EKp44^ZV z7(nq0KGP0EB|-qyCIaD51_nk@c>#*6I)pS<7U-Nm5RPJCU;?FWP`HCnd&R06A_$5{ z5RPYH0I#pUInp1;-GvB3i~4x3Jjq92x5c8L2S@oiw6=444^y*VuQp% z?0yCYhCdPt44`}kVuQp%Y|uUD5)umFyaT#F03;5|M{7a(LqdT8lt0#j%1;Fd`!FaE zNGLFX@&ITJ1xP)JeGZh)B^1Ev{2Ww0D9v95rDX{P22fhQ3Ka*jAA-`W1o*xNhKEpb zP#O3IlqMw<7(i+A3shW@fq@aUfA@}r0w~>q*x-0kW?*3C1f?wr1yDHvVuQt185kG^ zLFq?A0hDh+Y_PaG0|TQxD2+%cFla*9U~y1-0mU(B9|b72fY~|(V(;hqCsf~M1#@_hz6w%5DiKfAR1KufM`&e0-{0X1c(O3C5VRa2Ly45#(H}C zNlE&}+4_*4KruscwtH%cX9`1cwohVdUUEioYDsAUoX1d{9h90}R9R5slUZC6mY9`5u&bnApOCa>3JTB#Tg96*LJDWBmr;_Tqm5}(Z6%o2v;Y}X1f z<(-;Z;FyzH2C~ULwInDpFC{-sNTb64#*xt=77#UhPKba^)Hfh85qE=6v!GyLgs+x zfk5qIP`!%FJs|fIFoy}G7i12o9tN?oxd-HDLgs+N5ELJveh@BmKsY+Tn!U16sQaN{66!1TJ$xaX`qNn+yyLpzr~; zJ8+o;YOfP82R!BhN@t*U3NCX%af#0yP_V)F=7QMZF%pUMpt)!e7u@EC^#wozpf(Du z4*=qW(l4y-58_)gFfhQ{{2)GP&Jxzv2k}995Z1;A@j>gZU~PL4AGGcY)}{yXLG5~2 zTOP!p2kNmX^Vrn4F3>qa1fu74bk=n^F`ooZoT5l+>*p32EF2vA_$!UW0j;&{!bIFQE20l6exKJ-o2C zG{^#wogf+~#xnncWH0#MNF?*Ye30F6^Ozz2hS>u!3V_#D4|KV@Uk(pge}e z{}0Mz2tFe_D32lWML~HC&WCqfMjK@~dM{jwB}qs#JqqxB0j37n=X#8c%t<(Zg%$4^ z-8Rfi5>1j>S$dKf7(n+Uf!3pg))uMn{r`c1Aw!X&!9tN?!3jkbrUMKNj|5cKZ)V_G zzlnik{YC~B@H(#zp!2vH>Okx8ZCI8hn6xlB*sv~1G+D~Zpu)w#$nYRSQH7b&fPr1O z33RT>nq~%uHH#P+rYnQ@IfAbDR8%?k|39;WgrZ>E|FXpgLgq6!}a zqe>G46GNndBEw4oEdd7xK9$D|jH)1gc>*jT_cJmHsDSn(FeF$gg3g%(o!JaF>oDk! zB?d+T=l`ETdKo_(sH(naU{UpAU}X3tz{0>J)WDb&p=k1$!GK|=f+E954Hm|w8H($e z85lt4#xSmt&;k!LMrf$6Im*BglJNgD$X_;0OA<_+7#vhs7!1~cM(MbPn?PZw>B4Y; zfmwz@pn-vhAxT5khKVK7#EF%`hGhW*1D8Yt=$vMT6am#Wt_%zyH)uLB91wB%|63&) zRGtec_HSn3>EFb_(Z7*_rGEnh11R3r_c919=Kl{WYry3nG69{dK^B6snHU(DK=bBY z3=GVm_8?3gbdNcxoQq&!0G&w>x+jeVRR4hP0s`$@fT?3)U|<2=4FuwY*GhpHSTV*~ zDd74Ha=r>b1H=FS7;YCJa85ILtO&Zk3Va4Llnt&E6hN~Y(4%{G6u@(&pgIuN9s{u@ zpzEtZbvJ125>(%S#t459eYX!N^Ao-FDzPLBI;O!a)297(R19=%3z+?QN zUfQ0Fh@DvxCAJ)b<6187Le;?gNDlC@!F30cP2v1KByqbO(3^Jxu7u{@Z1Q9F9B_f zg2oL%>sfw)`NXXK!CwfufY!!jpeqH|?`Mz!t&Ly5fk9xB6N455s}3{6BGBCz49rXp;JYJa zRG1k28CV4w7+eJu`vMpQKxf@DF*PVMF+lbTP7-9`oW#n&0#d(@fk6Y5I2JK5a6;EO z%k*zzkm%pYAkx2qK>%7WLuw)h28IRf44^R#u-lLcJoPhZj1JV#=U`x9MC;dq=T8$D z7(i!pFjO!wFhTbTGJ*OdFymPn7??r*8xS8{KR2*rt!qIuYx4i00Hhd}&!BfAfV>Gi zLjlw$hOt5E3N)_;(gJ2f)r00XVRbEt-2ts@!D_Icp#V=PL|3S##Yy^!MalX|I^#== zlj0$K(3D0_d`VGaUU6C~;jx9T8XU3P67AF}R#wVkh43P&V^U?y)SZ#cAX;D#X zUP*jLY9eS_7!)+%{03rx%5o5mlHWlBNEjSOAU?b@1#uu4BnL7Bl#W1VfG|V`L4wqP zFuaTcaS+l-EaK~8P`?;?U2qi06zDo*SlNT9n^l5R%QA~I^Yg3}4D}2ZR2bZyovjo! z-2Fl|6;jiai*=3kEDiO{%oGeQEiDa<4NVj@z`}-lhI&Q{MX5QdiN&d!3=9Ovd5ThV z67?WMK1HcHP!^uSAHBT%l2iu0T71ud2K}0*UX@`VW6@NW-rK25F6Ashxq}z+@1ln zW&tDz!Z39p8r1FtiGhyR290-u{0s^+P&k160g4k)Tp*dp4r(WW#zLX`zUl#=C6RN)v#TNDgjj{sI095xgFfhQ@+k*GkfeYr8%siso z0>-4Ah0of8vMv@|TVNxD2>86H4GaPdtSt=d_e1UqW)Ns$W)M(hV3+_oJD^XAK|qC- z!3C6%7+fIxy+C2zzaO)1SKs>|amN0B1_jU_J5ZYgq!--IP+|a$MTpr5fznxnqKz;E zBglLvCIQ7BX9k6U1O@@n_{#)W25FEUCItn>J{2VUCnzW~IY=ln1y4|%q{N`bz%0Ye zkOXS8{C}q=z~BPX3(~hti6N$cKZ8R5W(I6+5RC==;PL_F4HS&0?ZL#rzzE8tT%g;a zkTikDmhVLJ}5|FZ4^+s4P%4K4D|L2s5}R?QIOj!5zzJuXl^e8x?T&!UP1KO z06eji*Pa1olVk>@Oq!EloEl${S&)h$n3$6TmH_o@2%aH@-9)fxaY0T-W_kt#BLD%(Nv2C)G_g6ad1 zeek9eh=Y(uViDi=0nHa8w|&s}V1e9&EDvgL!_o}MdgMJ=pn3`9h!NOU0tE%g>tGD7 zqM&I4R6m0S85lT0?GVuX400O?6lQ2`B~I9w1+qF&o=0mdF@oA?P_w}l%wA9%0Awz- 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
  • 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

    CHr)~Xy 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