From de4d8761f16ad57579ba402fdf92b6114fe5a3bf Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 27 Dec 2024 01:22:47 -0600 Subject: [PATCH] add DreamcastVideo example --- Makefile | 4 +- Makefile.dreamcast.mk | 10 ++-- c/decode.inc.c | 6 +-- c/execute.c | 10 +++- c/execute.h | 2 +- c/main_dreamcast.c | 12 +++-- gen_decoder.py | 2 +- generate.sh | 3 ++ java.mk | 6 +-- java/lang/Integer.class.h | 15 ++++++ java/lang/Integer.java | 67 +++++++++++++++++++++++++ java/misc/Memory.class.h | 15 ++++++ main.bin | Bin 0 -> 61748 bytes opcodes.ods | Bin 32992 -> 26276 bytes p/DreamcastVideo.class.h | 15 ++++++ p/DreamcastVideo.java | 23 +++++++++ regs/Foo.java | 4 ++ regs/csv_input.py | 27 ++++++++++ regs/generate.py | 42 ++++++++++++++++ regs/holly.py | 24 +++++++++ regs/register.py | 54 ++++++++++++++++++++ sega/dreamcast/holly/Holly.class.h | 15 ++++++ sega/dreamcast/holly/Holly.java | 76 +++++++++++++++++++++++++++++ 23 files changed, 414 insertions(+), 18 deletions(-) create mode 100644 generate.sh create mode 100644 java/lang/Integer.class.h create mode 100644 java/lang/Integer.java create mode 100644 java/misc/Memory.class.h create mode 100755 main.bin create mode 100644 p/DreamcastVideo.class.h create mode 100644 p/DreamcastVideo.java create mode 100644 regs/Foo.java create mode 100644 regs/csv_input.py create mode 100644 regs/generate.py create mode 100644 regs/holly.py create mode 100644 regs/register.py create mode 100644 sega/dreamcast/holly/Holly.class.h create mode 100644 sega/dreamcast/holly/Holly.java diff --git a/Makefile b/Makefile index fb8cc25..923ae72 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ CC ?= gcc ARCH = -m32 CFLAGS += -Wall -Werror -Wfatal-errors -Wno-error=unused-variable -fstack-protector -std=c2x -g CFLAGS += -DDEBUG -CFLAGS += -DDEBUG_PRINT +#CFLAGS += -DDEBUG_PRINT OPT ?= -O0 DEPFLAGS = -MMD -MP @@ -21,7 +21,7 @@ main: $(OBJ) $(MAIN_HOSTED_OBJ) $(CC) $(ARCH) $^ -o $@ clean: - rm -f main print_class c/*.o c/*.d + rm -f main print_class c/*.o c/*.d *.elf *.bin .SUFFIXES: .INTERMEDIATE: diff --git a/Makefile.dreamcast.mk b/Makefile.dreamcast.mk index 0e32c28..304bb94 100644 --- a/Makefile.dreamcast.mk +++ b/Makefile.dreamcast.mk @@ -1,6 +1,6 @@ all: $(patsubst %.cpp,%.elf,$(wildcard example/*.cpp)) -OPT = -O0 +OPT = -O3 MAKEFILE_PATH := $(patsubst %/,%,$(dir $(abspath $(firstword $(MAKEFILE_LIST))))) LIB ?= $(MAKEFILE_PATH)/dreamcast @@ -9,6 +9,7 @@ CFLAGS += -DDEBUG #CFLAGS += -DDEBUG_PRINT CFLAGS += -I$(MAKEFILE_PATH) CFLAGS += -I$(MAKEFILE_PATH)/dreamcast/ +CFLAGS += -Wno-error=strict-aliasing -fno-strict-aliasing CARCH = -m4-single -ml include dreamcast/base.mk @@ -47,11 +48,14 @@ LIBGCC_OBJ = \ libgcc/_div_table.o CLASS_FILES = \ - p/Native.class.o \ + p/DreamcastVideo.class.o \ java/lang/String.class.o \ + java/lang/Integer.class.o \ java/lang/System.class.o \ java/io/PrintStream.class.o \ - java/lang/Object.class.o + java/lang/Object.class.o \ + sega/dreamcast/holly/Holly.class.o \ + java/misc/Memory.class.o main.elf: LDSCRIPT = $(LIB)/main.lds main.elf: $(START_OBJ) $(OBJ) $(MAIN_OBJ) $(MAIN_DREAMCAST_OBJ) $(LIBGCC_OBJ) $(CLASS_FILES) diff --git a/c/decode.inc.c b/c/decode.inc.c index a347c7c..2823d7d 100644 --- a/c/decode.inc.c +++ b/c/decode.inc.c @@ -679,8 +679,8 @@ uint32_t decode_print_instruction(const uint8_t * code, uint32_t pc) case 132: // iinc { uint32_t index = _u1(&code[pc + 1]); - uint32_t _const = _u1(&code[pc + 2]); - debugf("%4d: iinc %u, %u\n", pc, index, _const); + int32_t _const = _s1(&code[pc + 2]); + debugf("%4d: iinc %u, %d\n", pc, index, _const); return pc + 3; } case 133: // i2l @@ -1910,7 +1910,7 @@ void decode_execute_instruction(struct vm * vm, const uint8_t * code, uint32_t p case 132: // iinc { uint32_t index = _u1(&code[pc + 1]); - uint32_t _const = _u1(&code[pc + 2]); + int32_t _const = _s1(&code[pc + 2]); vm->current_frame->next_pc = pc + 3; op_iinc(vm, index, _const); break; diff --git a/c/execute.c b/c/execute.c index 5b43ee1..4e51114 100644 --- a/c/execute.c +++ b/c/execute.c @@ -140,6 +140,7 @@ void op_bastore(struct vm * vm) int8_t value = operand_stack_pop_u32(vm->current_frame); int32_t index = operand_stack_pop_u32(vm->current_frame); int32_t * arrayref = (int32_t *)operand_stack_pop_u32(vm->current_frame); + debugf("%d %d\n", arrayref[0], index); assert(arrayref[0] > 0 && index < arrayref[0]); int8_t * bytearray = (int8_t *)&arrayref[1]; bytearray[index] = value; @@ -1027,9 +1028,9 @@ void op_ifnull(struct vm * vm, int32_t branch) } } -void op_iinc(struct vm * vm, uint32_t index, uint32_t _const) +void op_iinc(struct vm * vm, uint32_t index, int32_t _const) { - uint32_t value = vm->current_frame->local_variable[index]; + int32_t value = vm->current_frame->local_variable[index]; value += _const; vm->current_frame->local_variable[index] = value; } @@ -1227,6 +1228,11 @@ void op_istore_0(struct vm * vm) void op_istore_1(struct vm * vm) { uint32_t value = operand_stack_pop_u32(vm->current_frame); + debugf("istore_1: %d\n", value); + if (value == 1) { + debugf("istore1_1 == 1: %d\n", value); + (void)(value); + } vm->current_frame->local_variable[1] = value; } diff --git a/c/execute.h b/c/execute.h index b1adedd..4bf72a3 100644 --- a/c/execute.h +++ b/c/execute.h @@ -125,7 +125,7 @@ void op_iflt(struct vm * vm, int32_t branch); void op_ifne(struct vm * vm, int32_t branch); void op_ifnonnull(struct vm * vm, int32_t branch); void op_ifnull(struct vm * vm, int32_t branch); -void op_iinc(struct vm * vm, uint32_t index, uint32_t _const); +void op_iinc(struct vm * vm, uint32_t index, int32_t _const); void op_iload(struct vm * vm, uint32_t index); void op_iload_0(struct vm * vm); void op_iload_1(struct vm * vm); diff --git a/c/main_dreamcast.c b/c/main_dreamcast.c index ccced72..b248071 100644 --- a/c/main_dreamcast.c +++ b/c/main_dreamcast.c @@ -7,26 +7,32 @@ #include "sh7091_scif.h" -#include "p/Native.class.h" +#include "p/DreamcastVideo.class.h" #include "java/lang/String.class.h" +#include "java/lang/Integer.class.h" #include "java/lang/System.class.h" #include "java/io/PrintStream.class.h" #include "java/lang/Object.class.h" +#include "sega/dreamcast/holly/Holly.class.h" +#include "java/misc/Memory.class.h" void main() { scif_init(0); const uint8_t * class_file_buffers[] = { - (const uint8_t *)&_binary_p_Native_class_start, + (const uint8_t *)&_binary_p_DreamcastVideo_class_start, (const uint8_t *)&_binary_java_lang_String_class_start, + (const uint8_t *)&_binary_java_lang_Integer_class_start, (const uint8_t *)&_binary_java_lang_System_class_start, (const uint8_t *)&_binary_java_io_PrintStream_class_start, (const uint8_t *)&_binary_java_lang_Object_class_start, + (const uint8_t *)&_binary_sega_dreamcast_holly_Holly_class_start, + (const uint8_t *)&_binary_java_misc_Memory_class_start, }; int class_file_buffers_length = (sizeof (class_file_buffers)) / (sizeof (class_file_buffers[0])); - const uint8_t * main_class = (const uint8_t *)"p/Native"; + const uint8_t * main_class = (const uint8_t *)"p/DreamcastVideo"; int main_class_length = string_length((const char *)main_class); int class_hash_table_length; diff --git a/gen_decoder.py b/gen_decoder.py index 418bf03..a635ce7 100644 --- a/gen_decoder.py +++ b/gen_decoder.py @@ -49,7 +49,7 @@ def parse_arguments(types, arguments): assert size in {1, 2, 4} assert signed is not None - if name in {"byte", "branch"}: + if name in {"byte", "branch", "_const"}: assert signed == True, name else: assert signed == False, name diff --git a/generate.sh b/generate.sh new file mode 100644 index 0000000..c19247e --- /dev/null +++ b/generate.sh @@ -0,0 +1,3 @@ +python gen_decoder.py > c/decode.inc.c + +python regs/holly.py ../dreamcast/regs/holly.csv > sega/dreamcast/holly/Holly.java diff --git a/java.mk b/java.mk index c0ff2ca..7ac51c9 100644 --- a/java.mk +++ b/java.mk @@ -1,7 +1,7 @@ -%.class: %.java - javac $< +#%.class: %.java +# javac $< -java/%.class: java/%.java +%.class: %.java javac --source 8 --target 8 --boot-class-path . $< OBJ = \ diff --git a/java/lang/Integer.class.h b/java/lang/Integer.class.h new file mode 100644 index 0000000..bde1496 --- /dev/null +++ b/java/lang/Integer.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_java_lang_Integer_class_start __asm("_binary_java_lang_Integer_class_start"); +extern uint32_t _binary_java_lang_Integer_class_end __asm("_binary_java_lang_Integer_class_end"); +extern uint32_t _binary_java_lang_Integer_class_size __asm("_binary_java_lang_Integer_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/java/lang/Integer.java b/java/lang/Integer.java new file mode 100644 index 0000000..8da7e24 --- /dev/null +++ b/java/lang/Integer.java @@ -0,0 +1,67 @@ +package java.lang; + +public class Integer { + public static final short[] DIGITS; + static { + short[] digits = new short[100]; + for (int h = 0; h < 10; h++) { + int high = (h + '0') << 8; + for (int l = 0; l < 10; l++) { + int low = l + '0'; + digits[h * 10 + l] = (short)(high | low); + } + } + DIGITS = digits; + } + + public static int stringSize(int n) { + int sign_digits = 0; + if (n < 0) { + sign_digits = 1; + n = -n; + } + int digits = 1; + int cmp = 10; + for (int i = 0; i < 9; i++) { + if (n < cmp) + return digits + sign_digits; + digits += 1; + cmp *= 10; + } + return 10 + sign_digits; + } + + public static String toString(int n) { + int pos = stringSize(n); + byte[] buf = new byte[pos]; + buf[0] = (char)'0'; + + boolean sign = n < 0; + if (sign) { + n = -n; + } + + while (n >= 10) { + int div = n / 100; + pos -= 2; + int mod = n - (div * 100); + + short digits = DIGITS[mod]; + buf[pos] = (byte)(digits >> 8); + buf[pos+1] = (byte)(digits); + + n = div; + } + + if (n != 0) { + pos -= 1; + buf[pos] = (byte)('0' + n); + } + + if (sign) { + pos -= 1; + buf[pos] = (byte)('-'); + } + return new String(buf); + } +} diff --git a/java/misc/Memory.class.h b/java/misc/Memory.class.h new file mode 100644 index 0000000..1883bc3 --- /dev/null +++ b/java/misc/Memory.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_java_misc_Memory_class_start __asm("_binary_java_misc_Memory_class_start"); +extern uint32_t _binary_java_misc_Memory_class_end __asm("_binary_java_misc_Memory_class_end"); +extern uint32_t _binary_java_misc_Memory_class_size __asm("_binary_java_misc_Memory_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/main.bin b/main.bin new file mode 100755 index 0000000000000000000000000000000000000000..d3e8978f978394dc58ed9f577fead84cb21d25b0 GIT binary patch literal 61748 zcmeEv33yY-weY=?Y+qRtwj}Quti{;I7_7w$ivimLvnE&;m?b2=TD)Kku`R;tfQe;d zMOH;{o}2dZ`fQ+SngypJ%}e`|G!173rdF6?vc2F)?-^SF(A zPz(XX@Qxe-{rkkVSMZMP0lWkK=D=^><>2q^MhzWDX%}*@?Ypvd*m|lF8_Jc(!Z*@S zqga|bVt9T@jvm2);={I6O}Q0#Q?8uOtICo2g7;?8?@g^p zpx={G%0roQ355-%%eh_){t|nK@4mVfwat(DaT#<3hPrzUb@_o@?0h_>StThsw=a&8 zr^QhU2ucWX5aJ;uKuCm;1VM}`Yg=qtnlF5KqoVIhHSz8hhoo4vEtV2i#lF#6GwP6( z)E1`i%UC7BuGZ%LC*C1?74KO1JG=vb9q)MU|KJ^&6yEXF8N8$XEZ*_ypYe|V_wkN~ z2k?%=kKi3=;aRiFLaxMdVzO*pP~mJQXIO_n4ypM5R~{$MXs2Vbcy@LXVJ)g z*(=6~S5x&xul+xy?49Y{lvjka?g8nq{?tuS);tze-LgEb~8o$Jtg%k#! zrPVFN!7IMTVY#2I@$`1Dm8Z6{MZv_1RPOqpTkxB$?N~APh ziTz0dYyw^YsR}BoOVO_gq>c}Y?n$1uF|Widy(h_;s87aJLSE$020b1{F2c`4@Um}4F=axC9g=HlRPFlEcw2qMbad3NGc^uC37V?lBtqd zi9j+IeIfd-=-)*@AALN!JNi(xD|&l$ZS;odmC*~Lb zDbc>oWEm!}?%0TZZX_f3WGV?0r7|H6Zp!Ghq3qW*X@P$D=Q5fhHa9|9$B z)VHtPw8XD(TH-%$TH>jjmU#50C3o0jtP3F@XLUb|_Dm)Q~wwQ*d6iM_zf`xP(t9540@UhD)f#&Hd%&f~ni z$9b`z@nVngV#jzfj*BpL{yQ)4FfaBaUX0I8{)Lyv=Ozc)y!!mI3M9{jAj4CuJXEzp zSRE?++j(`g@nWsKSPL(>3uDtR#rFUDyqOr5v$@>cR<%XqORyx1aMtdtj9$cxSA#pbfHvl~FpqX2aJ z7K9vlKCH((o-x22crnm<8PN6?kojhy<#N2E4`}`g&;iD0;vK6YJXZqoQs5~N9KaK> zO?byc5L%#YEWEP~!dcKG2KIpNPy>9yiFdfHz;8C=9Xl;h&u+Zq!)o9g+o3)Od>44n zDLdYwD+C_26nF=eF9#lW4&ox@+Xd$BX@*7yEBs>=ZA?X)6q5CwY0l z;l*C$#h&NIe#wjd2QT&vFZMJq*2{}M$%{S4i*ecv1Lse8c}ID%ZeHxiyx70;VtnnU zitLQy0lLTmpy`EpN8AFuW8-|_KgB@z5Q@vv{!_UTiuqmdVD%*fo%m0}xI@cnX3D_H5Q^7;9EOktK?LCv z(CJ$cR>N~G)PE4@`arIwwky}Z>5<%Lb6?5T_Pvp7+G266%)5}gF%PW$#l)icr8=K* z^Jy#gaq1t1^>WwAs#u$#QA#Ri=GZ!`333Klj_@3O?`f;t6>FE0giQe!94R?Z1J)&t z(j{ulDpt%)Dn{kRB$Q2+EI;iKqz=sfO@*}iv^7V6)~A?xf`oOItyi~Pt-reYYTeaM zXkDNkXgnze!Pu3{!1o5MZ8DNjt@bL` z9(mhY<*XLk1>K#FSQF`X*cMrHY^l~*!>8`UXHmMTI@Yw+z1rpor2nAbS?#P9+AR)I zw`EhT3HQwDS&6%B53waaaXV{8-9kIc>7a8~2Xfp{r>NUh#pP|Y1@l__QJ$p+<+*w` z;tt!kz2-Q(E~Yhr@)m(9XD=xwm& z9VJ;ij#Zw0eLXAToleiDwtJwHF+mO{DCZ0@rO_DHQiPXovuGt!qjOyq42 zV$mb}CCgUkiBg1BkF@>Cj$I^FLf@B8efQ5@$JYGZb;9;kb&&yVie!Ctl65mcA0L75 zc-nQWQd)Jwl~Vw%w%(ymBCY$Mq0@d5l4jfgtV>$`AE;;0o8&Qbj$XO{5x}q=x;`(l z=jX20>ZbxQU2!B;&6u{X%0fQ2e^TF_RcN&l9Y=n^`&R7aM|af|XcrNwpFr*oUn%NvSSgh&OSiWMro9L$6@x z{?&w9tb#@dtc%2}MaKC;Ev!I26=c(Bc#g_s>i(}+unS7q1U#5z*5mtwBSWMJ?Z@Fu0w4C#nw~55SLz@C6W&cUKWcf$ z`k+f`%Q2)H&^JyxSXwG2fF}Vh-FwLOs6|@S>B=!8J_FcH>i0iHr~OMvnqhwzwBQFW zreEmQ5%N)*A3eJMXl2fv&Nj&kS(PC9I6(ZS?xc5g{e!NfTMpV(K~7J~tfyIs1-lLb z<`Rpd0qWBL^#V8Ejg35J@qRU|I}f=Yn*dgnb~9KXqhWoF2kU8o^?nxClaBEIePh3@ zO0wc;r8MOzDMj)zOgE6b#Cu|E0FUenS98tNX|wHnw9*=-D{INTOrbr_m1RmYNvq>s zC^f;gvqnm06>rXzWG1?1TM=FEQ6&RcOR|fthGf8qcQjkWV!1^O{`70gX39Aq-^V<{f*GO!;XNe` zXb+N)&w+f*_w51sXz&d?#EXbUPP-{68>?bVDrng_kQWQG@jX>D$Uqaw#$lb<>)g!5 z1P~Lr(X(^&hx49JTXEc${BzesEexHALU_o6mSME&NaK z9VeQ_7?L~4^8B+$TWt5^^c#80i4=ZfKZFAD4c~V2ET!Lvy&8jGBd|wps_9!Z< zp8(#HNb`1-hx}eH0sky#dCGZKwrN(CRgCY;H2WLnB|2ZCBE5nr@n6i*E9_0`vI-`B z7Mm_NLAtF;oub#&%uy#6MtccUJe2_7OP~_^69XDinK{RpSgyCkRS?Amf<*9k$&_>J zACssUC?8Et>X$(IRWy8JDjL!vC~<#eAZ_&!$lQ+^IlL5}ksQu~-;I!#3csOn&*b19 z2KcHC0l4$obV#iUrmDEsEJ3X?pw`%TsS}M^USbL7Q;iCoLY7;01bSG1|joQV3&RAj)04I0#M5-bz^fy&Ip zVhgFPm?cas5B4dSr>saU*VrdcSBH!NulxS!&# zlUOP#ZgmiMloj4#FmVMCeUS0tcbG^rCPFD7{m^4 zb|Il8(2o*I+7C_%EQT;?k(8uA3epxaScCQ5AH)fyuOYlZc+w2N#n8_PZ_3J54Y*56 zu56ci?`W5}ucwg;y0%Da2KXb1u?~1AFKmpkV^9xE3$X#5@((HO8g-f3U=JS^&8i5X z!w4FuBSLVR!{1O?xq79cIBX*p8`KuE%&as^unhcfsV|yWA7DRSmqz`~)uonyb9HIH z!Me0xtFG(Ya4(Gy=Kv3~!tfxJ3JjtB8^T>U9x4yxE)s9EA(2V~oJgXwx)}b#_`j8z z(_KLKl|ma~GLjjQL5e^;KZc5>sUaqW8lq_miKL=wYG62x3(6w?k{SjxhjZaPlcQok z;+bTSI~D}+JCtXt+0^h>O{ZJM_+e%7{IC*e?<@t#g&@~te6wVfJcMgXS*|G!;hO0! z9M3#Rw<-23+5|k4=82WGoMCtzc&GyXMMA$tQW0H|GzBt!eHi-?`UnfFFLYeVa6L10}|m@ z$Mz^YwqqaNnmqi*#%HKg>R9@SKvYUy75L{j|O*ntY6J+nN0EogyJ@N2;vq7+1Nf-n>Htb*y& ztF>RhPq)3q$o=p>MY;-tc5Gi^rJWxCl|g8u?DY7rr=cBh($s?FWlJqWG;cvzvOvs~ zGJB&Gsm8L(I(*#OS!HlI?K9qNwe3cjFi@FWMq^1qZbt5BpL{kpt`jvl%*CVGm*!on zDZgwXibpF7@S1Xm8QPmb6ldTysJ#hwIC`I+GtpL5jqV}{qpN)05R+gASPr65Y5g2qC>Q$w`t!0Oc;HK$umUj z>?ne^&(S(P)=^4-`$DgO7}2_>n$xp#*fuk|f7zO~bc^Tv6605|K`q{>S5%=nL4_S! zY@7})o=Q!H7Eh(}yQcQ11zJ3XPEDq!^rt}DPFiP3qWcCs?a@vKmftCLd&f9C9o5r18xv>6FW2mmfKf987`m<3))7ff-?R6#TVk*mcM}W8LTE>hfhAuaZF~l;Jd-||LvEFV$6&) zY#vHevhYlhmXVePTTm8qef(YUThl)Yzb!LcNTL|#?om?Ukj#7>xFc;7;dEEVM#7t) z*QkM};wo-j66SL-?^mzY+)_EsTJ0^B)2;jTM45pL{iMmClY2p$XXKAMkmrkx$*okAV;gNlOIhJ$d5ZiTE)nZI=WSJPa~bF zY@NZLt+uCaOVg)Sq#>xC(6>UgFA;TXwyIEACbQoRhb5U!XZ0)iexn>g5rlxz^}vP^0zm`| z0W();t-|!Y3F$bY_OibXh9(*Yb-)V!UBKXE`r$i;VH*vD_8WqM;~n3H{4e<@kp*Su z$TMgzRHP${X9=YSy@J!SU^lPdzc3V^x%CSF1)v_gEwGMZ4AN8$q_P&TiFJca7-7aD zcB6cb6MSq zUVCPjwMn_|{2~O9HqBYHG+PV?6dDgS~Oo+`hpvxo#Xh>n(P>R+N z%gnON^DifsZx9C8GK1^Jd>w`P64GbGzd_q817G1ZBW0hd7PXrBlB8Jn$*tKYCvM+U ztiBii?NDBx9_VkTw>OlQRmd(gW5MZhT#jrscC^eqW%NdE=j&`t+i$f$LSfQ#Fon@# zE}MS++6G}_)^QT4OjzAPEBuVs%C7KN#K9aTBPx8wido^mnSJjQ9IaQ8VLES^eJ?PQ zyfuvwO8mO(Rm2j`9`#MGX#`jKF#)p_b+h%R4d8PjyNtXpHk8Un<3^=E>^hqp z#|`60FMDyw^$&qGfq6VQ%ApX ze4zbY%5K5duv;)2Yz<4p_*1Bl%m4bKe0~3&iT!Q9t}jZ^*7NoFjQm@pD>TP{1g)x? z71b8l*m%j_I!hMgnQcCovh zS_U;Qqn7tChniJ%&C0gWlBtCawj7%l_L;2q)XsIIDQEmFqrk@?KE$dk!v7oejcq{Bu`E54@Qi%m z$nS$a(Fc2vAl@kw2)p6;IS8TpmFPUTa)K%2M`N29%#9qlTwaC6j}&YH;8s{`W=X`2q1kG3h$cw0h8v4|b-<&+8PHBpQD z7eT!fj<-=)_e9-M81JRN6IBcQ^l6OOVTSjz#b8bzVn#YcZ}Co9KATF)Ug%kWkjP%? zez5!mXhcSl?%P{4isk zHsQEF2;+JJ@Jd)6XVH>-1;`hO(aruFMpj9`12YXcu_|b<7va|gHyhW(J^Zod#uH=5 zv#es8d81x}#Vf#vl=sZYD$bXYw&8*tD>Kisg=&ry%SZ-;IXnur&2lpM`g&*nUG*Z_ z8$ORsI)mgZGoPyyl$qyh>PkgJGXwKjqIllu-#U-w?9ZI<&R5x>ub;=xybN=>Tb#$< zye|{ObPZacq;-3&6z1y&SihycEEs$WAF-R;({DUxxqtVVaqAY`EIiz=Je6%5j3jLX zst2#}iRS)%J(=k<{`~jG{fKafgX14-{#ztO^WU)#Z_TGK(1%Fp3|adL=|h@=cWFW? zIA}llruy)oWgfl?c2c4K9r=p>1zNhn{16`w#Y99^WoE$yX~GH8L=&V%OpxZkE)8%M z`7_a4jE1!j`!AYoU{9_B8!2mLPGfVFeUJ{PcQ&arDumUU7VxtJ|KaMWQ13c1#`p?@ z|9pu5a0ItPOv@XFc8;A4>IR`aJ(PZUyeI?*rv&NP)?k?AH3U{0C($0DVAl-s3S}fw zJnR1_#=gC^zXpQ{U&7aCYko6h1>^s1)EPoSUms4373>&mQu8aU^)N?LO#5#4+1+^0$}G`r zn5Ul$(_?O2-Y8lM<@>HHAJl_EgJAY~hUtTeKM4z=j-Q* zGycvw$Bp)iED^1PK6&Z7KDkl(m7;nm|HLhqH;Y=J{KH}8Z(uvC7;DS{dq*^FJ7fIF z!N;8TEzhMbL5eohCQB`{rc7q7DN3)fPQ0eIhFG20*Tq`TAgwx{I$G7~KlTx^DWN>12$^puY^34Snmj!yU_e4uFqKoIkYE}q}b@#fn`>vm#5%FS(33J^4puI z1pSVfJ-SJQWffYI-UnRs;*NwubQ1xyV=EeVYz1#3hKNT8vwWdFw5*IRn^``emmU>J zU%*Sp*>tp)Gm(8R6o)t;1llG;!t9bAI}W$fUPB`X>1LUUvx*mlt@M9WHU(~XX*evL zoMK>+ASlh!8$$EV$fW;W`}*$JzBn8V_bm>$b?r2KySA>cgO@j^lD`ixLuvL_`(^jH z!uM~aD}5;%06k${7_YpsekzRk5X!F%D<8hk6l4pxn~&YOJB{9jkU)($m93MMXdDv% zWdHr;S8Z4AF5s`Q10b*)pa6CQpuGT$-^fq%vY0} z<>4@~cu_8-ck{)A#Qm}%-4dnnw=r3x_Q06Ood%o5o>)H1Xt(V(Ab&ED zGT^-wx~jp=JFeF9{Z|>t`Tna+8lUEv*6{6&T>nng#!#C3$KE5G8G&rv#bLC>$$sQ_ z89rX%xyoTKyCZtR1mi_}xbVg+KV-aiWuOsSuc1B6=-q*6Zy@KZ%Te9`*jW94y9an~ z1ha;bH^KNKx(x0C28<2q1z6__8{-WVjBysy(s^Ud?0P2)$DQe3gSDnm=d&03hv^kZ z*wr2C1A$HfokmTAwfbpPMt=sZ)iZRbqEwKkqSXEBKw516+aB0;%3JLSQncEu$cK|% zZ;&fxceu&=Wl$eOvv9T*d;`v0pwC)h(%$j;hac}PGmGgxL*YE@*7m%H!VugQ8+sB` znFV>k7^;y6jLkOIh+ouJpqads6x#mUlw;d&(E5mWL~#=EisA5I!`ov9b9;JbFQ;er z2h2j?eb=vfUac)GmsjM`at)nBA;A)rH4*6i!<;Z&7A>7Y$a0jrpDyy!hdJ z29@=%^!EsNVYxaC_V6zR{Ty}yju*WPXGn*ABb;xA@9yX1jH#C0-M`vIOTy6ImL?LN z_)!3yOVx+up`_U0xHZ4;cq$%n418|-;U+>Bw`1v(cw*u78hId%FUJ{NoLG*({+|=e z@&Et!2lIK+-0OJJVvZMuoJK&e%rm@*J&m9UMy)0SjhexlB1nvagJktZhG;w`D%HUG zKx`M@SW{rmT>u)S_jfYfiNC*sN#pB6%n079F2rvs%&5b-u9|LXnHew?sC=${x9zL- z8?;)BPQv5%MlulIy515_GhZR=L;5~M*0X)j$a>WCd!|j!;P^kt_kgUgWWA*RXJvhO z`~KN^Le7gf;0d%Z@A6ylIy7^4Y%rG^eSxw4#-zQZ-J!wl`V2L4HNPKL&!=~G}h zzXS%;m3E;GHw`w;G}&#k(s>%C{l9u;CPt=*`(Pm%AF8JZ_ko1B5zclAYhyOhCEG^p zKqIuVB;Tj8*=>`pSXpXmT>-~mz^5vJ@qFzT?onlTkTd*+vENOiJ^5fh5^~mynD&4G zx~6wKGwqbv?N$kys!wyyFOk6+-mmmZ%Q&4qblw@>#(>Q(Y~6;l3;gf?Z^p0j`aS6X zyZ;;f9bgy!H@*LxF9C1Fk3s(3vMnI7Tx;I|wt(ILfVKc=AHA+|Js&N)j>n)=(fB+j z4|vREtKEiOm{NKx9EO`e@b~JXQ}(#Mx*R7(r|j`{hU+y5UCxSp0_5j4_DtlZU@t+w^Wn1{fc~9_~YV)al81H<_+Lhm5 z5P&R?(m|?@THB@T*9B4yZD0V*Yb2FsgBdSjJ1Yf)a8^#;;ir5l^;tL)^9PCSqI@j z?)W`jxlx0Usa&|#Xl9Mh*HGp{s%%e z7h2e96*eAGDM_q2S|@x>s#lk&OX8OizW5R+oLH=YbBek1iYII>dl$-wz4#z^W?u^L z%)W`vh>i_8DKfb3cz@*gBOTCo)J8PNe<`dVINbo*dzvB8zC zQ20r~H}@+7?rk35$J8Sa)RTcD?u6>*(lT&H&kvuUFj^0Pe!`?p%xiAoOTgPpbT73R z@OUq^w|^gC4!5&}+e@^E^@q5d-AlAHu(zZE?Il`!w57a%)PznzXq2NpNYw(G zidei_L=^$FMO0D$e1MkOaZ*ebLRukJ*gqT6m>nlY)O<)YPQc zi-#Re$U4HLO{LNxEf)M(kadJfW6oZZP{|>_$ISd766WQ|2E>#T;eU?2*Jxqv3 zo&g#`{2J|f38jx)-@~+p+5!-7p|mst_!hOrM%5p(cl53EU?D za72RrEfh;L4QEr zo(>Xb3hd|x=hUG)PPkR^3C;rlmd}gU!T6(gxxS)Zv}O&f6^w-n?c6}V#=*8u3!@#b zt=b^%pwlJ7^cyZ7ZUx}m>lki!>+&!ZF3#75o?DRUoS>+J7;k>X4xQ9HYOaOTqo(5Y z{o>YC!!#u)k2i)q-}-kCRrJk-eRmm1x>N|=Oin4s` zrr{r97qYzgz#V6Mf3*H>F=n!3L-j_uIn5ed0yn31zcn+jW@qL#FWw|*$315uuF4ns zatg8vo`mP0W!SA7^<8@0gEwFo26~~kkFbHae67`Q&BWdIT6_KCv%*1>t-~h z-sbgRXe9;1c_J+-IMv`ak|tJ!JvtB+BWL&CYvF}8%LPP9Qrv9o>v-L$vA=2CWJhx zd!+$Ai{LrZ8?j@h!B!~n#tBvy#znoJ*Gl@g;e)a15rb2TQ>j$lj0ay+D`wF0ns+lE z=C;icw6F4D1J~#A*QqmTFHG#+AN67v@ppgFi(eGH`%tgoqJJOU2Xk58fwf@RZ1@$x zzuAq7j)#CBwXkR5HN!KSr--~3(o$bvWUmFwPrIf1F|U97m-j>rCgfum1zzmk{k_n7 zx?hEZsAqAvrMH#*uU_okr)w?s=X*Pf9&`V!*EWNjeP~v}I!<0OtY_ivO2CQIko~mr z-YLZjDoHijllEYeYLZt#w-9Nf{5?KX>2^(`#K6D7woae?o=d0Ufj30B7(?>>8ED6& z|CjN#=w{o5WIHRv9gpO$%tN;yzL9$Y=1LUx`o79ENy+B4Kb)473LSqqBZPa_h%||b zSah`_Yw&kx5(Q$2rHHPY<4d6ZgUfraS?*7ZNJ~lk?U_$2G8__9W|{!*Wcy7YW)OHk zso2yb#;^f}CcP!OO<5r$g|L1mg|$7#KR2o!ci#pj(A|Z>99ZXq-hsExd61`RgB{?N zvYO+kKU*Uyy|(%j%TFo8){oJ>Z6z!7esUT?C`^--5{pD>AGh_Kk)fO6Oe^z*bsx78 zD%=y>gNp# zQ}?*{r{MScs6%bTt0g6}szce**$bG*t@~(g6M|>Ux%txh#BF2u z7R~RY`=Qfu3?RB2Aj0=NP%-Q{)b@m73#CaD)|_s;x8}+k8HuNzuF&L4N)A=RcSzy9 z688)C2i6*4uYZxD)uOE%;> zv9#8WnTh3BDw34bm2=NXOh+B@OOINGwrC$<0i2pCrf0puduu+a(4W!N3KcHYUx0PO z8dn=O=(G_k!ix=~a(E-;kwX1vFnj#O{CUOIa=fWYp4FJ0rqT(#@oB$;+x4zlzNq-D z+@Q%rUfW@}XJzo#&o|SMW< zPBBGijx(u`V?V>tJrYHo%zcK3r{Wzi{_4x$)k3^Q3wNNp;l8DR0iJRZ=9pnL`3%If zARW!o&%raAm!F4cNguk2bbKG761fHCoJ``@=OcLY{C@cMv4`M}Q>cdwtDo_&n(?;H z+zjL2Nlq1HX(C}(uO(?NN}uCuvnnf`K%dPa^eOS$YngdR8fEB83pt&gww>6Ej74;5 zhGwJPNvzF&3arSZn=6=}(X`2Glz_jQO1d2to#cJy-+%_o@M{A4G1N!+0`@+J+Jeq* zME#%(YYXb5&~|>EK8nDDeH0f~FVjZ_U$c+I?Wm8YQ`vwg+0@dm?EdUPyXkW@0)0gL zF|@~fChEC(_f+pDizybJz&amM66!nW{)wO+*ePd>M+7+}HB9~BMfPZLqgXEDItN#I#A$B;+ zLbGZ?SdU!;tfJ>ZH^3^`mEkr}M(8giwV}({Zw$2dhW%CJgkEem5~eX{4sE52cW1I^ zgUp554>}!$#WePG5M9@l{waY}y55@RLI$&gxT*jc6hQHcenp_Hp-ot$0ltd3s>U4K z2lr$Z8vt+NjxD#K;y!aH>4Tm&j0qJ17uh4tw{wojjjU#71@wZX-_9z*B5 zuyn}NbZj<;8nqi}?+-W&2B&eYfVELry9)aY18^7g6}%xSj)hxb^W1_v^4>XuIOuK2 z5?AOI)Vd~QaxTXGw5o=|0ag|??v zzllY(+6ygKv-p|G!_QQ@zvC!Ay(hDKl9gSPLQZ*(V>K2robnvB%$HinC3v1SwiLV} zte^RIt2e2M5~3tEUyNDmENj+H`@(a?n)jz9wa_hD5qlo446T!_=yb#{W9|j+r0+dk z<`WDGZ4Vd{42ygomGD%Fud@o>2;3TSBd{0?xf6Jf9PT~*p{fIJH$*FqQFEewSItZe zZUvqrWMfy&w(JK}6e%?C4%md5yPv=&O5bWSo0e>H)=tdarBg_!*=?Oxmp!&bN8g9| zcJEd2>H4pKOWogzV>r44)&>2VcZty%H^MX0gX`fJ^_^yw33|;`>)*LFD-ZfC1NzKD zPNVGhX`y`R+n;Z03p%#g!wW>DX z?hs>(YMZG`)zw^zrO*yuYm%jYP)@hcGaJb}jvIqZpF z!NeHsVPf$s3Vqzo)kd4eci14fsI7jWV0*!BKCQJC?!p$HS`Jn-8dGa5F!K|a;=nK9 zTctKN++E%HRDPoO3p2XCx&t?o8+CDF^t}@>kNyI%Rd7#{Ztc7XA4=u&zc3qes8mHN zjj>@G8UKDu=59F9xPUjy!4nK|=4N_qwN^3avc;}Y0StKK8@*qcJFUk8cNjm^3!`uy z9>;yGU;#iF0Xuo&%#iX99eVUn=%owY1s{XW8**@jQ9DvyNEi z+>GWFgsNjM;QG8w7T2|ILDjlx^8wepX$9i1KJ!2;LCStbM?I5u_Ko|BaD<9KBECtqZYp$WEU-C+>Y113I_PPtX&RWf?OZ%>D{b1wlg;%z`UJt7{_ntHQFLZ_2 z=G&p|$TlCl1lhW6>Px;1ZH1Md0oskAVIrL|M?co6XtPX(bp%>N>O6y_oM9^5G!B}- zd}>eI@EVzI$Wl?Gt*$SqH#j#CrDIJwbI}}P(2Qn`%Jxm(*!GPcg*le2YhUM)yR7YN zJPOzL_6m;@o>zI|T)FKlJ@KwB?aMp~u1)P_o}srYomVAW$U*EM#f56A$22V?Y|S!7(3SYSUYx4*IL?= z&5WUgrWF^4#Jd8#ey@oNL+R`=DcL(Nb?E1_Uy6k(sU>TsF&cjn>yV0%WJovg8+XqwgRV)@C!EjuF6Zof? z3*^{`fY-!jMvlD>&q$6T`|Ksab+pch>>$rU`dbjLK@hzMzQ5o@nhGHu0@I=-Xpx+5 z5qHnU4BkB#$#ApA8OM)%#aJT!^h0<`pr0Osr#Sk_2TzsICkj>rlJM@ikkMuCg)-w9 zx|0gQ6%KbCz$1bng>dax49p+GFSpLkS#T<>;1%5_t8LE`dq3N#T>pA~%{!6Z*axvo z@jU{cbk_mE1vK-&>N(UV+d499)O)D>u0IajMYdxsw!KGV+c0?!Pf`zi>}~iSnGKyS zVYB=zygTldI`wdq{8KRhjx9B;YtOpkE-5cvFSO!~^0*)9%PL53sa**B{uw(@k=|ra zh?6?+lkacSua{X3<%jiUcbGOr>Fd05CGg9+MLrTf zmq_QFBp*saK5>O`Hjt`O2R36>W1LUkV(jyeG=sgCS%(G>JKD=Wb_tx;W518~!YRNn z`NkW-D}87hyjuZjR{2D-N6pS6X2UE(6TouD7LW=)_Gk`~O-r9t`ZlseDwV#scrKmB ztgD3ITa0FG+`Yw2Ipu_F(h2xv{3#e~G%rg6+#6tdFo&x}koG!@tIxwPhr2nD&WyXM zj@u4ccx#T{xQ?DL%x>9qcvB~gwbD1X?>^v{UAiRCeZa%A+NXM39kA{R zaKhRq%?}vOu!x;m%%)dA^XWFurVLOH=4`{*VzI?cM{rSf6mqGxwgWFDt^mW%CW5batLLg+9e` zE&Zh~-4)-94bu7(ccfaW7!!eR>wjuK#evKMa<(omfMx_+cr zFd)WeAO6Q2w+Fff1GhGA`db<|?S$j@w~iX;W+o|pSJAkV&mdAUj zMo4R<8vC0dt%jz9MjCIP0eLC_S&p|K?8XNKzNfbw>FzSOlFzi9ZIgjUS?$F}YR`(g z&#aAIjPLxOSGuDCzH-ge1W*yGF>g~P`A4DM5#Z~L7O@hz`UTIQ+wh$m{wRYLrAQz4 zVQIH;5O039aDh)a_`V1uS2T#l`H=v>{9Wf2@%#e|9wvE9Qf+ikN}_x$W1z zvKrxFL7zO0xL80HyrIbb_B~{|@<*S-!?NCoO@S^`$jL$+^a6y-MHcO^8cadyhPMQ11dROD5>< z^x}i7&d5q;tCxGaI%lg>eR1s;Po_CZUCqwB#n@8zbl_$5>A)p)51FW?Fb<301lh%a zvwAv>yXSQ^D~pxn0(S4?_X4{b6Uz;7IxBeLfX_GDdy1Z6e~ATm{bKMVgby-IE#>`g4sqWvf|)ZDJj5c}UW+9zTPr2}~$wEwATX_E*y zlrhqq!5qeR#o0?3zwt!c$_019hTNac_@04Pm9|>3`&aNsaVP#bj@H;z@55NLas}y? zNYC5`aax|hFOugvC{qrB_76a1Ap~_d7=3g68iiS2p~+8&(N8^>`X^DhsTQSF8YX)r zD;28`m|Gq3>*X61=FV!#3dNfJ<#>Ct`v8>aHoWhPUsFEkq9>tZn*0D;Q>9_p9oXB) z!)00zst?X2PvT-MM*uo!1i+2pMDRVzz>V61;6(h-0@?<$k{J7*+b1c$vXxL7s0#4k zQPwm7e?W8cTq>zBmr~kPpnszHOloFdl0lKHPRn|Oqv%;c(bLZiTZ%~ML^Fbgr{zRWW(LF3M{gOw?uj;=%g& zZ%qk?D35BOv+CiN2$;u+?)j)!=n%e|W0;9+q36X|`{U5>m;<}u5B+H?M+WUP`uL|7br2Y6pXEB>Kh7Gv>? zV?E58GQyONb0Yr;>sHHMj)Swm@BmcojE-45I0kc=1G(3R0IO;r$qlYPKfLdXm1vx< zzOq?qOKRFJ7d5SuEA5-)#d{tbRXP82RB4NC5;f)j;DOP99UU)J0#=Bc>PAJ4dq$UE zzT>iDa!#XhvSEgN^0vvvj-}}q_mw*NI}zP^yCt`Yu@*>K?lzIr+CTN-JEd=8L)f4? z1shUiYf@Srk|js0x~)+|sn!hrdtPB}#H*?LDfH;H!}uV0U-~K7n(z7zJ)Tv5|) zZ^t?$%QRYVZ;K;XP5|W&bYHP5>NVPz;7kA4i#MA9Vlnnxh<)za9wV#Z0uB)Geb%kHReEK*9phIl% zK(1n1F*&nc=)*@!T>cS!TVI38F13jV6AZW$89ls%O($m0#V=rHN~7>Y)8^?pLa%=}c(KgI-I|`xEm~4| z3amz_r0^{8HKYsS*GZPNoCIA?;5BU}P(85s*hzM75$-K*QRMpXZHC!q60EIg$x{Vc z#S*p9W+%nPNu@;b40uL1CPg~!E3}Q&rFe%OqgH7ip;yA%h}Nj^Hl+KToTSz$ z^Om%r6tTCI{*CaOTE1vp)S@(E?!_(bSwdK`GFl(j;+I0PA$A)=rpmjD)JlI6Gf=kHEKDGQDJw_$@*9P`|$jxDLjXGz&H&2A#9iQ;sJK1-?px=$@#!F)|FTz>K{?~pq&p+@< z#J;YFv4y2E*uNjZvERS``s-R=-3!>dKcBGfT(<7dCWK4HzI$!LcjfH6pK|ZgI7+Be z^-0hs0lcegQl)poihsCIgi$Z>DK}j>UZ^jGC*!7fk9XE}T5p4ytN&ip*3-E}FTVE> zjJc@SwDrASqy8dgoYYXhPnA=!eSb)1B&ssRU zb<_07*>mtg%+qQ0?=saz46Ufom?Qi^;CpRGs}c7+*wb1M)I?L+I(SA@c6*Nr{7*|- zPB2tvEAJ6B34tQiX{~V9L2ErwL$fBg*`_45*5`CdCEBes)LFMbpC{ZbUNLO@Kn=9E zVut!eV10(8wWomAF0UT7KBs>^@9WW8Z3aVY?LcdrtCO%FW*l|AuHTyX*33xv%psFq zl^$E7_5!DIq?|_7H*G@di}kJ+Db66u%QvvJS3@i*DkN0Rg*$=v1io}pYj-OthC2S* zFwKZ4a1u*JctO=~@wDjA_iw84|K^2De(SC;{WJ|h4LM8=fXjBkh395eYu_H$uwRtSn=s`RYt4z5%`9( zpulIZmCz7v@18k`Ad(E<1`sI=Wg*4PxxVx%5nub4mxPUI5 z1UXTV6GfLkc06i?fjDv`5>g|FKY%)Zcsz3CRIg;@4Ak|f-sq7Fy-_1Od&Ps|k(ARj zVT7F4X-0ozsFX;;>I-f!tTleQL+8|Gx{u@AK7G;%90BzOF+u>m2)-A*_(zW8#K?Pr zyr_{VIxlLt7xF3r8q4vwX1)#iVp>krR99CUt76k7pmW>-qw^v_vz|%-4yeeNU~vPu z=f~Z!jsPj>M3+?e>Oh_X^6rB?b09?yDJ_t48>GZQ>1g-;4<_VG>6&5&mQe|LfAL5# z<-ihnx(rXT19!T2KndnslLpN0#z0Iqu-Kaj9bpIPX zO@$}ivkjhhK$uL&w!_md2;jE|dF$Zm4hUB^B#B2bMs|y|uRd_%*#X(k#ddu3fEL^9 z6@ven{iptYuN<35*7%1dtNjk2o{bs}#Y(B7WP_BWm&m7u-#w4fBR_XzzP;XT^& z#g1bwPSDl2wUNCd;s4X@-wyXwx zkF<5=?;LfMpQ+C)KZkuB{qFe>I>B?b)e52Jg_0jEcwGH<=G*FKeP_+|CE14LC0eps zk9HO2>!YK@OPnN8EG--#5NkTgo%+_A9DU+~Yy*L%6lUw9gelk#X-af{;S)OS{phF^ ziL}s3V#U+pcKH`|d*=#rd(v9T%XhTajMk}FOk2KYF1#20n2x}74Jn14)@;2fJyDn< zfI9H}!c+rx5l%@VV5QoIl};BB*!K-n3pHuZv@7dJ*Qu9HTN+!|?HMaqO)#%Z=&RcV z^UdPUDxn?hUTMZ6%$=8p4;B^)d}2{>zl{R!KU9yIE>Y^L=fyWeRv&~px_lQbIWIR~WBa}M|o%sC9f zIfvF-%g#A|n01t%bBKp6WXx+8TY*koDzuAB*E%ux+fF4JTU-mWJ!aTaGe;vHE{pX=cC-|AvKKC`Gt`G;SFl|f-Zq{ z6Rw8oOZZTHPM3&>66c4UA@>v6+iUgemcyGSN8t>IL#-^W~ zNH^JnJN@?>a%cBaY1XvTT)@10-|Nk6{PMWnFb?5!2==W47_~3=8gd8I(jnh&T?qew z1UVl-5M!kdw9Bik>Lsu-maGnWt|+y_oLOCJEvb-TYW7zJzi@Uu3GZ3uqy&?ZrPf&Z zm6FN*Xtu5-EwyX*t9I_+A31R6ekEz%Zz3yOlovGz6=&D)U*s|YR{Zs~MJ=L%*mVEk z?fVmyiONMT!GAAmDXfHfa)sTRrQfdq+_T7q4We>N^3MIbfi+N5>we@%CiQ>mzX%xr zmOqlZ-I3g;IyLT2ZWEoJu1bb438~Z;B*##hzd$Jr8}WzQb>)k3x2Jo#0~@he(Afcg_8^POzBT!NY8(PiapmSm&$F*m^nxG#Io;s2-k@hA?;R(2VL%a!c{1H|n9a zIXVeB&@Qw^dR0wM`^*xVY38!Y+L=p?B=)}TOlQ?D$NFlCDXVN5c+Vu;Cu>FBMn{5S zk`J7z&$nlpNbn%DE+-$ef;BG0_FI0Yz_8G#C0D_3(lC5;cwV&@zPXbAW)btvx&=Pf z?hLRlVDBF)e9MQOf1?*aZ}sdylraamUulkEhP{)VU%c>4Q4mi12A|4VbVg~z-+$Pk zC9j9?nO>t~LzRET*=w;#M#5~d>Kyy`8*GkM>B*{j<9WNGJS*$St9#tfxRX39AC zBs$YYt0kXYcA{zyYWGUI-78VM^XH`C(c(k8D4)^cbUe98k(cc~sLS#g9oYN3d;Qxo z4%rO;p={8TSM}x?Vxg~p-=eO5xO)n3OaORvy|y&6CR>uhWw2&N!=n7}^KW(->H{VGN4fvv7AbnSwBjxB6b77y3-qCi3H6 zqqXdGhJLY6NiKn37PqT_(uzy^H%32EmoxWqgxi}J`BZxnjJUUH4(|DWcW1So?1Oi= zd+HxdD4dSd@Y;ZT73ZDK0ZilI6#%^Vf^TH*pNzJh1_Uh&>k1kxRwQqpJcEJtXT47r zBb=-2wb)A!W$0P#t-7-~jR(i`Ue%r#N}Tnwl}6j-oKCB(H0d2#iI#l9G+Fz?l9LS1 z-A31b8;x^?DS~KRp?hJO(k}98t7CPMzAl5vLtwiNztb!2+Uoz@EVL0=-JH3G7nW)5 zPnxt=Bl$v!wfA3D4E}JqgYYN;jg;F3avnS*3z7zbDhFG8C)?zKSbFc|YN)#)#b_rN zLJuJbC4WK?K52S#$z<)5%bX01To1r#H37z=JrxYDB0R0bC!L=3s`!d{RI@5uU01Sr zROCj#lD-+m8LR5>$kVrtp?DOmT8KeYV#b)kK@8&Dzn5M@bxl1zm97iDQ93IARD88+ zG|lZ8o#LK9x&hx%A}T-1EnzXEtDU0(93P z`jT}trVqXU=UzBHVoZ8kbY}k81}sMxECKt=0?F&4ft7QV5PQGgHLSUeizUNj2ujfTND2JpfA2)>e0 z8otr53tuwjA0n{iGq)S=(i`*0<_vQa9?rMOWx~}w7J=_EVb*^nkpn3V03 zna;p$vdzzAXR@1ShU}(0=}dNpFe#g+3G8?7eNVprBQWjEK9BX@ciuVoo_o%@=brnX zFdwcyX{}g#eAra@&K@^uU;9};x7i+7o@?N<+AHkg{wq1}G++6rE5oLo%f!JwGgVSy zo%*lm%PN*^`0&wT)BA{`>lXGovy$&u;P+11Ud~~YjoW6AJI`h1Bdxu%$5nf|1?@Lq zPJhR7dDvvME!o+5;?v$w(@)_4*x|8aMuc?!UXGA`ubCeC{Zt8S?JsFwvT47%__(j3 z>bR-duU5L->H_sk@EfQ4 zj;`5QSN+w{n&vE4-n~NGg zI!^C!RJt-w7rWZ(DqU7q?CPtlaHXq(hSvUyW`8KqP|-Z!?^Vs!a5a?0Dw^ByEc5u3 z>qH(T_iC;aOE&Ec?eBl;xUZf@`SV9JH$m#1v|!Sg#D6PSgSu2#Gg@Ix+um2Ljtt6GKg?dM(f z>^d_c9IxT{NF3UzJ%917_bz>W8FR>9?5M2Y(%j+O)ju>kK5^`!M@~NW#FM9=dG4oYUOId3 z{I4#)@z%TV{pQj~AAfTBv(LX|W^1;+uy~oHqOzub>g(<8eg4~TeKTRZ zyDM|}s~z_h{$u-H55`&>8FTS~Q)8B1u+VK9)p}K#6>Bluc z&i|OnOFSzZ(k@XoZMHCpO=^S&wXz$ z{<84#>}Tymwg>Dj*7^@BGBccZbDq_lwh`Z(5%1U;`i*Ru8Fl5jA?Cu6tlu3noo0voRbEC!0(xy|M~ryp=7oFk3dmwqORk|41UKjesjQ z2B9J^ZzvqA^Tor_q(2$g)RApgw%Ek7+FFzz#oyi5u+?E>c9v&h`Pr<16`EMVJVGXx zF-lFK%}UWI*A6X)qX)KC^;y^w6Dv(<2h_R{brMt)$-1FfByyy#gFe$wD-%8&D`BM; zR+f!-%H@XIBjH4_u2UO{#gCwq16s0oqluX-JyjkXTfrO_wlbToVyjIoZ`vrHXi__% z#ZAnbj0qJ;FHhB6&1h(AvhfBRIPjQqD!3>xeTm{U>lrIy0YP zq;Op}t7i=~{xPmvMy1C?S5_(3ix^D?sM^n%B|qn7mYcuyEGynd2p7v=W)-+BO^~cPnXRm)ks-$sMwz9>z zwordIg->86wFoB z)C^Z=iLezeUI`PCb4@S=CN!?hxE8L?0jj}W@@h7@x;p)w_2ql3LE;lIvb#mU%>N5T$Ojxu{(it=2_tLUbOv#gNN|Z%HB#s*5hC;}X4{ zLEk1G1|lvCfC@lMV}&UXuDnGL+9;r=liz%4!It2@^oQ@InMb*VGUnoJsB1?mb$Qx7 z0Y7=zkE~}TA}OKSFrGrn#YNK&U2ta4p3+~NlPqkR9$nVPV1%c23+Xi@K(h55H#%>J$21`;IG7`45b2UtE(0s1L~eT&e`Qc#PbAQC-( zRrRC53CCf5hV;0Qp+%F)5R~6tF8eZd}%-Fq1NtVX4bJot9 zbbEaO+FH!dGIM%U`6-qOtxN5;zhxUs?V-qK^D)!4(jv1xG!)vL@iUfFl(A`ZW=&a9 zrrmn)RG_BJ++UPA6(}-qd-nPprKi~9W2WmhW%l~g{;2>O%M!3Q@C%l=yXF;EKw&FJ zxrf_qH7r&E9oHa~*J1>f7*iF-QUgjYMz$V5b;wx_>`r9s4t6{9Ap`nhqdp|8J?sv) zpKWCt+s?wQiABJ54>BKFBA;b`g{2dVVzcQ>m}B!|n!@GWbL6eZVGHt>(;hmvXlHt3 zncem@+W^)3?bh+_Fa_ad<-nWG)wnrS-oLEKJn@6RW9dl7A00E{^ViicvK*0?$#K<4 z#S|JD$QL=>ZHv&M4UWpfN=NI4g*9TJ&4@Hov5=X+VipTqZu*MlnoNIS%fEoE3BxBN zIa2fZ&zOmCqKL6j5i?(d;7O+R%ie*|!qs zS&MHT$dt)w#WTZvYoh6swVwRj$ zBF<+iR76qjFcOeh>?p4qDKg`5Je&kstY$V0rNBZNv53k%sX8@^ueqz;g6Yzz!WOC| z(Wzc(&d7&$se+xI6OC2V0=o$xQJgpMC`B2;7clcV>+W>BEs$ErD71yyQFp_0c4ozw zQ$=z$AsdnJsF@0!$<@|stY>G%L^AP-A-tW7=|U@D3I8OC8X$^;>~&zDBPIGQK%a$} za7A2_G9O9S>5{qYUS@d<3m2oy5-3k%WvOl{CaK#D>Q;mnjZtV>j{cT&cB3yE7mrrG zuh|kS(a9?CEJGV6Y{zq!SUVu9apv~z)#JTBzem%E2Z*okBX-2Q;#cYEEfoU0hQ$mi^Fb}B7S zznhpGVCr$VquCUxhIS7=XBReYJprY)t)2MlLG0^RTDp7Cy3*S1C1NwQ;M+Ue-Vg!$ z6X7n!Aar1h!U{432 z9v`(aBnZ1xga}H+Heave?{K;lf2-5WTTYr-Hc?x9y!W)b)D~`n7eplXny}K!RsTKb_R)?%}<@q_er)U4Bns zH?f^X`<%_|?DQ#}&Rs-2HKn06YsBJSt56|c%5B46;BuM z>7q{Un?Zd8{S$9%cUPcC1kziyMyAB6!FLhxMDcbzx&7YLIYd*$@f#XGIPUVe0^CTK zFxG&37eaQr;g2AOu$3quLktu?SNJeLkqF!vm#HfX4#atYN5f}m+2`a&H6nY`sw;$s z0=;B|$!xN9i_+5D;}7WZKWWD>Kx?H3AjDIMJc4-acDHd@ObrJVr`OlvB!3gjGBg}; zD)6B`M<**_Fi=EH@o76*DM(=QdOAI1?8zD$zTisH>IGXDS*6?8LTnr16JiVa5b!<7 z7F>7>c2=Oad%IhdfXC}Lrp#m`f&e$1UT=46YV6ITE3XI1#nUCacOfvqxVyJcffG`? zcg!RkcJT@=4DME;g->diTt@o#V+}yN#t>5dh2S;{*?_Z!PviTUXc8vzbtC@VJ>--J zLCu2e+<|~wpA#oRTCixCv1Zu#6D4EGz;c8YpdE_@{**K|%h!W!;2a4r2F{f*?NIV0 zoDWdd2`>R&D&b<_5($?Al}UIRFcsB?KFfhuNZ0|qQo^f%S4+48c#VW_170iP zO5iF9R|Bt;a1C&+gx3StNw^-kLBbn=ZUZ9^kza-Uqy2!gm8J67C09B|HEelyC@Glkgz$0SONQhb24=d{Dv>;1LN& zfnyRL1-?hZao~i6lfYvVJ_LMN!sEb4Bz!OMeG)zj{4EK88~86IJOMl@;roIAQo_f8 zACT~az~7PZL%7>_)!U;1fG)c_kn*P;m3ggO2R(`eq6#&U}hVe zjZ?@tHpv(M~Nn6bmJY)}xXd7uWFlO zqgq^zh7@eSf(I4IH*I&+Q-8raZCndtJQ$oBkE=)G+Th;${f;I_z2mmq9N}n48+SB1 zq+76o&gWPu8aXsl+Y}s&L$#!$_ZQcaWAUhxJTj`0ifg@V9Y>EkZh~>|T09+E6&qF5 z?WFaq3N69Ya_mtU6dg$0^^Y}2g6zf zZ|4S;puUft>;5*Kg;fi$z$Eb_WT)s@1n+R;teQ8X%%M{>!9irO8#LbqE@w0p02g$u z)Ef(FiC{cDnvBI$qE&NM6OqYn86Fu8X`>BfNC|J4#(bL|)MA6vwhl)R#SUtrBTzIP zT&2r#8eF2q2i2fP%p*LkZ)_wH`rrY7wGdFk(ZQH(C$86UBA(I-*9yX6VbgnK(E}7@ z3v;+)V|bSc-!AAr{iVT;n`w*0R6bX4BIb5bEb+07#PI$(Msq}?LCv6zhj~y7+E^qR zR`Fnw&oXX*5lRbd-AWk>{Rlpaq*NR%6b3r)oG@fD{=OW(k)2_T0kfJELSEwUn-!j& zRE&x;Bg0=nyjL@Ff{{1lS|S!Xg!uyw5&H8)>jGMe@lfWiZ5mMzgoBhy>c@lXpf;cm zXzXT2dh@;E{qC$W3w>{<7bEWZqVToG*F*kRRAXaUSH7;{=@kC4sg zbqqORy*_*_o>1imd;|36nwC*o`zk317;h@6eS8BYm4o=p^11P^CnE4l`LVW14F)wT zMj|Qo)9#kv!riC(wDEUx*V=KZ`f#8N)(C|jtHIDNGd16kSGnN323+V{ilph9-aiZTrsV{5+ z41dbS^C+?1PV*lZCa`rPE_C;F&3PbSEegs(a(Uy zHz4teN?PzBvJHKeRFR?gqfX1u8H+Jq)o6ES1)%Bmgt6Kykyz~D7^VdO9tpKC{4@K$ z9!)%u#5GlpB9a!85#Hq@{Bl}i{yv1C=f5YYB98es&**vqeL4T^dqM0>upboqCzR>+ zkH#&urOIf|cyu|=F+*&Qt}3Nz%(a2B!9m&>;+XCQThnNW!cnHFA&_SA$Qbu2pVNLY zuGg|gj$JsG!Hmr#kAK=HmoI`NnUUljTEkYRsCu#-G}GYI(trWa|Q{U1AP5Rd=> literal 0 HcmV?d00001 diff --git a/opcodes.ods b/opcodes.ods index 3d9760cfd8006d3bdc90ba8f5f15c9085cbb754b..7e19be43eece456a4d7edb33e251d2437c0e0465 100644 GIT binary patch delta 21616 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 dq<~ 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%0APOu*Ph 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 D7C330 diff --git a/p/DreamcastVideo.class.h b/p/DreamcastVideo.class.h new file mode 100644 index 0000000..729dcb8 --- /dev/null +++ b/p/DreamcastVideo.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_p_DreamcastVideo_class_start __asm("_binary_p_DreamcastVideo_class_start"); +extern uint32_t _binary_p_DreamcastVideo_class_end __asm("_binary_p_DreamcastVideo_class_end"); +extern uint32_t _binary_p_DreamcastVideo_class_size __asm("_binary_p_DreamcastVideo_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/p/DreamcastVideo.java b/p/DreamcastVideo.java new file mode 100644 index 0000000..7a52e4d --- /dev/null +++ b/p/DreamcastVideo.java @@ -0,0 +1,23 @@ +package p; + +import sega.dreamcast.holly.Holly; +import java.misc.Memory; + +class DreamcastVideo { + public static void main() { + System.out.print("FB_R_SOF1: "); + int a = Memory.getU4(Holly.FB_R_SOF1); + System.out.println(Integer.toString(Holly.FB_R_SOF1)); + System.out.println(Integer.toString(a)); + System.out.print("FB_R_CTRL: "); + int b = Memory.getU4(Holly.FB_R_CTRL); + System.out.println(Integer.toString(b)); + System.out.println(); + + int red = 0x000077ff; + int fb = 0xa5000000 + a; + for (int i = 0; i < 640 * 480; i++) { + Memory.putU4(fb + (i * 4), red); + } + } +} diff --git a/regs/Foo.java b/regs/Foo.java new file mode 100644 index 0000000..4e2aa21 --- /dev/null +++ b/regs/Foo.java @@ -0,0 +1,4 @@ +class Holly { + public static final int + +} diff --git a/regs/csv_input.py b/regs/csv_input.py new file mode 100644 index 0000000..e694b84 --- /dev/null +++ b/regs/csv_input.py @@ -0,0 +1,27 @@ +import csv + +def as_dict(header, row0): + row = [s.strip() for s in row0] + return dict(zip(header, row)) + +def read_input(filename): + with open(filename) as f: + reader = csv.reader(f, delimiter=",", quotechar='"') + header, *rows = reader + + rows = [ + as_dict(header, row) + for row in rows + if "".join(map(str, row)).strip() + ] + + return rows + +def read_input_headerless(filename): + with open(filename) as f: + reader = csv.reader(f, delimiter=",", quotechar='"') + rows = [ + [s.strip() for s in row] + for row in reader + ] + return rows diff --git a/regs/generate.py b/regs/generate.py new file mode 100644 index 0000000..ad924f9 --- /dev/null +++ b/regs/generate.py @@ -0,0 +1,42 @@ +import io + +def should_autonewline(line): + return ( + "static_assert" not in line + and "extern" not in line + and (len(line.split()) < 2 or line.split()[1] != '=') # hacky; meh + ) + +def _render(out, lines, indent_length): + indent = " " + level = 0 + namespace = 0 + for l in lines: + if l and (l[0] == "}" or l[0] == ")"): + level -= indent_length + if level < 0: + assert namespace >= 0 + namespace -= 1 + level = 0 + + if len(l) == 0: + out.write("\n") + else: + out.write(indent * level + l + "\n") + + if l and (l[-1] == "{" or l[-1] == "("): + if l.startswith("namespace"): + namespace += 1 + else: + level += indent_length + + if level == 0 and l and l[-1] == ";": + if should_autonewline(l): + out.write("\n") + return out + +def renderer(indent_length=2): + out = io.StringIO() + def render(lines): + return _render(out, lines, indent_length) + return render, out diff --git a/regs/holly.py b/regs/holly.py new file mode 100644 index 0000000..a1d4925 --- /dev/null +++ b/regs/holly.py @@ -0,0 +1,24 @@ +from register import parse_row, group_by_block +from csv_input import read_input +import sys +from generate import renderer + +def generate_register(base_address, register): + yield f"public static final int {register.name} = {hex(base_address + register.address)};" + +def generate_classes(package_name, base_address, blocks): + yield f"package sega.dreamcast.{package_name};" + yield "" + for block, registers in blocks: + yield f"public class {block.capitalize()} {{" + for register in registers: + yield from generate_register(base_address, register) + yield "}" + +if __name__ == "__main__": + rows = read_input(sys.argv[1]) + blocks = group_by_block(map(parse_row, rows)) + render, out = renderer(indent_length=4) + holly_base_address = 0xa05f8000 + render(generate_classes("holly", holly_base_address, blocks)) + sys.stdout.write(out.getvalue()) diff --git a/regs/register.py b/regs/register.py new file mode 100644 index 0000000..8f51410 --- /dev/null +++ b/regs/register.py @@ -0,0 +1,54 @@ +from dataclasses import dataclass +from collections import defaultdict + +@dataclass +class Register: + block: str + address: int + size: int + name: str + rw: set[str] + description: str + +def parse_address(row): + address = int(row["address"], 16) + if "offset" in row: + offset = int(row["offset"], 16) + address += offset << 16 + return address + +def parse_rw(row): + s = set(row["r/w"]) + assert (s & {"R", "W"}) == s + return s + +blocks_names = set() + +def parse_block_name(row): + global blocks_names + block = row["block"] + name = row["name"] + key = (block, name) + assert key not in blocks_names + return block, name + +def parse_row(row): + block, name = parse_block_name(row) + return Register( + block=block, + address=parse_address(row), + size=int(row["size"]), + name=name, + rw=parse_rw(row), + description=row["description"] + ) + +def group_by_block(registers): + groups = defaultdict(list) + for register in registers: + groups[register.block].append(register) + sorted_groups = [] + for block, registers in groups.items(): + sorted_groups.append( + (block, list(sorted(registers, key=lambda r: r.address)))) + return list(sorted(sorted_groups, key=lambda g: g[1][0].address)) diff --git a/sega/dreamcast/holly/Holly.class.h b/sega/dreamcast/holly/Holly.class.h new file mode 100644 index 0000000..8c8e18b --- /dev/null +++ b/sega/dreamcast/holly/Holly.class.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_sega_dreamcast_holly_Holly_class_start __asm("_binary_sega_dreamcast_holly_Holly_class_start"); +extern uint32_t _binary_sega_dreamcast_holly_Holly_class_end __asm("_binary_sega_dreamcast_holly_Holly_class_end"); +extern uint32_t _binary_sega_dreamcast_holly_Holly_class_size __asm("_binary_sega_dreamcast_holly_Holly_class_size"); + +#ifdef __cplusplus +} +#endif diff --git a/sega/dreamcast/holly/Holly.java b/sega/dreamcast/holly/Holly.java new file mode 100644 index 0000000..eee13f0 --- /dev/null +++ b/sega/dreamcast/holly/Holly.java @@ -0,0 +1,76 @@ +package sega.dreamcast.holly; + + +public class Holly { + public static final int ID = 0xa05f8000; + public static final int REVISION = 0xa05f8004; + public static final int SOFTRESET = 0xa05f8008; + public static final int STARTRENDER = 0xa05f8014; + public static final int TEST_SELECT = 0xa05f8018; + public static final int PARAM_BASE = 0xa05f8020; + public static final int REGION_BASE = 0xa05f802c; + public static final int SPAN_SORT_CFG = 0xa05f8030; + public static final int VO_BORDER_COL = 0xa05f8040; + public static final int FB_R_CTRL = 0xa05f8044; + public static final int FB_W_CTRL = 0xa05f8048; + public static final int FB_W_LINESTRIDE = 0xa05f804c; + public static final int FB_R_SOF1 = 0xa05f8050; + public static final int FB_R_SOF2 = 0xa05f8054; + public static final int FB_R_SIZE = 0xa05f805c; + public static final int FB_W_SOF1 = 0xa05f8060; + public static final int FB_W_SOF2 = 0xa05f8064; + public static final int FB_X_CLIP = 0xa05f8068; + public static final int FB_Y_CLIP = 0xa05f806c; + public static final int FPU_SHAD_SCALE = 0xa05f8074; + public static final int FPU_CULL_VAL = 0xa05f8078; + public static final int FPU_PARAM_CFG = 0xa05f807c; + public static final int HALF_OFFSET = 0xa05f8080; + public static final int FPU_PERP_VAL = 0xa05f8084; + public static final int ISP_BACKGND_D = 0xa05f8088; + public static final int ISP_BACKGND_T = 0xa05f808c; + public static final int ISP_FEED_CFG = 0xa05f8098; + public static final int SDRAM_REFRESH = 0xa05f80a0; + public static final int SDRAM_ARB_CFG = 0xa05f80a4; + public static final int SDRAM_CFG = 0xa05f80a8; + public static final int FOG_COL_RAM = 0xa05f80b0; + public static final int FOG_COL_VERT = 0xa05f80b4; + public static final int FOG_DENSITY = 0xa05f80b8; + public static final int FOG_CLAMP_MAX = 0xa05f80bc; + public static final int FOG_CLAMP_MIN = 0xa05f80c0; + public static final int SPG_TRIGGER_POS = 0xa05f80c4; + public static final int SPG_HBLANK_INT = 0xa05f80c8; + public static final int SPG_VBLANK_INT = 0xa05f80cc; + public static final int SPG_CONTROL = 0xa05f80d0; + public static final int SPG_HBLANK = 0xa05f80d4; + public static final int SPG_LOAD = 0xa05f80d8; + public static final int SPG_VBLANK = 0xa05f80dc; + public static final int SPG_WIDTH = 0xa05f80e0; + public static final int TEXT_CONTROL = 0xa05f80e4; + public static final int VO_CONTROL = 0xa05f80e8; + public static final int VO_STARTX = 0xa05f80ec; + public static final int VO_STARTY = 0xa05f80f0; + public static final int SCALER_CTL = 0xa05f80f4; + public static final int PAL_RAM_CTRL = 0xa05f8108; + public static final int SPG_STATUS = 0xa05f810c; + public static final int FB_BURSTCTRL = 0xa05f8110; + public static final int FB_C_SOF = 0xa05f8114; + public static final int Y_COEFF = 0xa05f8118; + public static final int PT_ALPHA_REF = 0xa05f811c; + public static final int TA_OL_BASE = 0xa05f8124; + public static final int TA_ISP_BASE = 0xa05f8128; + public static final int TA_OL_LIMIT = 0xa05f812c; + public static final int TA_ISP_LIMIT = 0xa05f8130; + public static final int TA_NEXT_OPB = 0xa05f8134; + public static final int TA_ITP_CURRENT = 0xa05f8138; + public static final int TA_GLOB_TILE_CLIP = 0xa05f813c; + public static final int TA_ALLOC_CTRL = 0xa05f8140; + public static final int TA_LIST_INIT = 0xa05f8144; + public static final int TA_YUV_TEX_BASE = 0xa05f8148; + public static final int TA_YUV_TEX_CTRL = 0xa05f814c; + public static final int TA_YUV_TEX_CNT = 0xa05f8150; + public static final int TA_LIST_CONT = 0xa05f8160; + public static final int TA_NEXT_OPB_INIT = 0xa05f8164; + public static final int FOG_TABLE = 0xa05f8200; + public static final int TA_OL_POINTERS = 0xa05f8600; + public static final int PALETTE_RAM = 0xa05f9000; +}