diff --git a/client-64tass/Makefile b/client-64tass/Makefile deleted file mode 100644 index fe86588..0000000 --- a/client-64tass/Makefile +++ /dev/null @@ -1,8 +0,0 @@ - -AS = 64tass - -ASFLAGS = --nostart --flat --s-record - -# Build the object files from assembly -hello.s37: hello.s - $(AS) $(ASFLAGS) --list=hello.lst -o hello.s37 hello.s diff --git a/client-64tass/README.md b/client-64tass/README.md deleted file mode 100644 index e03c6f7..0000000 --- a/client-64tass/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Foenix Toolbox Function Bindings for the 64TASS Assembler - -This folder contains the assembly (*.s) files needed to call into the Foenix Toolbox using 64TASS assembly. - -## Foenix Toolbox Assembly ABI - -Foenix Toolbox functions are called using the Calypsi "simplecall" calling convention. - -1. The first parameter is passed using the accumulator for 8 and 16 bit quantities, and the X register and accumulator for 24 and 32 bit quantities (with the X register holding the most significant bits). -2. Additional parameters are passed on the stack, pushed so that the left-most parameter is at the top of the stack before the call. -3. The return value is passed in the accumulator for 8 and 16 bit values or the X register and accumulator for 24 and 32 bit values. -4. The caller is responsible for removing the parameters from the stack (if any) after the call returns. -5. The Foenix Toolbox will preserve the caller's direct page and data bank registers at the start of the call and restore them just before returning to the caller. -6. All functions are accessed using long calls (`JSL`). - -## Files - -The files that are included as part of the client bindings are: - -* `toolbox.s`: the main include file. This file includes `bindings.s` automatically and also defines the `alloc` and `free` macros that can be used to help manage the stack. NOTE: the `free` macro uses the first two bytes in the caller's direct page as scratch storage to preserve the return value from the function while cleaning up the stack. - -* `types.s`: this include file defines some structures to match the data structures used by some of the Toolbox functions. - -* `bindings.s`: this include file defines all the function labels as well as labels that may be used to treat the parameters as locations in memory, rather than as values on the stack. This may simplify coding in some cases. - -* `genbindings.py`: this Python script is used to generate the `bindings.s` file in the case that Toolbox functions are removed, altered, or added. It uses the files in the Calypsi bindings folder as the source for what functions are present. The general user of the 64TASS client files will probably never use this script. - -* `hello.s`: A simple "Hello, world" example. It also demonstrates using the program header for programs to run from RAM, flash, or the cartridge. - - diff --git a/client-64tass/bindings.s b/client-64tass/bindings.s deleted file mode 100644 index 543ead5..0000000 --- a/client-64tass/bindings.s +++ /dev/null @@ -1,885 +0,0 @@ - -; -; extern SYSTEMCALL void sys_proc_exit(short result); -; -; result goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_proc_exit = $ffe000 - - -; -; extern SYSTEMCALL void sys_int_enable_all(); -; -; 0 bytes needed for the stack parameters -; -sys_int_enable_all = $ffe004 - - -; -; extern SYSTEMCALL void sys_int_disable_all(); -; -; 0 bytes needed for the stack parameters -; -sys_int_disable_all = $ffe008 - - -; -; extern SYSTEMCALL void sys_int_disable(unsigned short n); -; -; n goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_int_disable = $ffe00c - - -; -; extern SYSTEMCALL void sys_int_enable(unsigned short n); -; -; n goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_int_enable = $ffe010 - - -; -; extern SYSTEMCALL p_int_handler sys_int_register(unsigned short n, p_int_handler handler); -; -; n goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_int_register = $ffe014 - -int_register .namespace - .virtual 1,s -handler .dword ? ; pointer to the interrupt handler to register - .endv - .endn - -; -; extern SYSTEMCALL short sys_int_pending(unsigned short n); -; -; n goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_int_pending = $ffe018 - - -; -; extern SYSTEMCALL void sys_get_info(p_sys_info info); -; -; info goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_get_info = $ffe01c - - -; -; extern SYSTEMCALL void sys_int_clear(unsigned short n); -; -; n goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_int_clear = $ffe020 - - -; -; extern SYSTEMCALL short sys_chan_read_b(short channel); -; -; channel goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_chan_read_b = $ffe024 - - -; -; extern SYSTEMCALL short sys_chan_read(short channel, unsigned char * buffer, short size); -; -; channel goes in A[15..0] -; -; 6 bytes needed for the stack parameters -; -sys_chan_read = $ffe028 - -chan_read .namespace - .virtual 1,s -buffer .dword ? ; the buffer into which to copy the channel data -size .word ? ; the size of the buffer. - .endv - .endn - -; -; extern SYSTEMCALL short sys_chan_readline(short channel, unsigned char * buffer, short size); -; -; channel goes in A[15..0] -; -; 6 bytes needed for the stack parameters -; -sys_chan_readline = $ffe02c - -chan_readline .namespace - .virtual 1,s -buffer .dword ? ; the buffer into which to copy the channel data -size .word ? ; the size of the buffer - .endv - .endn - -; -; extern SYSTEMCALL short sys_chan_write_b(short channel, uint8_t b); -; -; channel goes in A[15..0] -; -; 1 bytes needed for the stack parameters -; -sys_chan_write_b = $ffe030 - -chan_write_b .namespace - .virtual 1,s -b .byte ? ; the byte to write - .endv - .endn - -; -; extern SYSTEMCALL short sys_chan_write(short channel, const uint8_t * buffer, short size); -; -; channel goes in A[15..0] -; -; 6 bytes needed for the stack parameters -; -sys_chan_write = $ffe034 - -chan_write .namespace - .virtual 1,s -buffer .dword ? ; -size .word ? ; - .endv - .endn - -; -; extern SYSTEMCALL short sys_chan_status(short channel); -; -; channel goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_chan_status = $ffe038 - - -; -; extern SYSTEMCALL short sys_chan_flush(short channel); -; -; channel goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_chan_flush = $ffe03c - - -; -; extern SYSTEMCALL short sys_chan_seek(short channel, long position, short base); -; -; channel goes in A[15..0] -; -; 6 bytes needed for the stack parameters -; -sys_chan_seek = $ffe040 - -chan_seek .namespace - .virtual 1,s -position .dword ? ; the position of the cursor -base .word ? ; whether the position is absolute or relative to the current position - .endv - .endn - -; -; extern SYSTEMCALL short sys_chan_ioctrl(short channel, short command, uint8_t * buffer, short size); -; -; channel goes in A[15..0] -; -; 8 bytes needed for the stack parameters -; -sys_chan_ioctrl = $ffe044 - -chan_ioctrl .namespace - .virtual 1,s -command .word ? ; the number of the command to send -buffer .dword ? ; pointer to bytes of additional data for the command -size .word ? ; the size of the buffer - .endv - .endn - -; -; extern SYSTEMCALL short sys_chan_open(short dev, const char * path, short mode); -; -; dev goes in A[15..0] -; -; 6 bytes needed for the stack parameters -; -sys_chan_open = $ffe048 - -chan_open .namespace - .virtual 1,s -path .dword ? ; a "path" describing how the device is to be open -mode .word ? ; s the device to be read, written, both? (0x01 = READ flag, 0x02 = WRITE flag, 0x03 = READ and WRITE) - .endv - .endn - -; -; extern SYSTEMCALL short sys_chan_close(short chan); -; -; chan goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_chan_close = $ffe04c - - -; -; extern SYSTEMCALL short sys_chan_swap(short channel1, short channel2); -; -; channel1 goes in A[15..0] -; -; 2 bytes needed for the stack parameters -; -sys_chan_swap = $ffe050 - -chan_swap .namespace - .virtual 1,s -channel2 .word ? ; the ID of the other channel - .endv - .endn - -; -; extern SYSTEMCALL short sys_chan_device(short channel); -; -; channel goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_chan_device = $ffe054 - - -; -; extern SYSTEMCALL void sys_text_setsizes(short chan); -; -; chan goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_text_setsizes = $000000 - - -; -; extern SYSTEMCALL short sys_bdev_register(p_dev_block device); -; -; device goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_bdev_register = $ffe05c - - -; -; extern SYSTEMCALL short sys_bdev_read(short dev, long lba, uint8_t * buffer, short size); -; -; dev goes in A[15..0] -; -; 10 bytes needed for the stack parameters -; -sys_bdev_read = $ffe060 - -bdev_read .namespace - .virtual 1,s -lba .dword ? ; the logical block address of the block to read -buffer .dword ? ; the buffer into which to copy the block data -size .word ? ; the size of the buffer. - .endv - .endn - -; -; extern SYSTEMCALL short sys_bdev_write(short dev, long lba, const uint8_t * buffer, short size); -; -; dev goes in A[15..0] -; -; 10 bytes needed for the stack parameters -; -sys_bdev_write = $ffe064 - -bdev_write .namespace - .virtual 1,s -lba .dword ? ; the logical block address of the block to write -buffer .dword ? ; the buffer containing the data to write -size .word ? ; the size of the buffer. - .endv - .endn - -; -; extern SYSTEMCALL short sys_bdev_status(short dev); -; -; dev goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_bdev_status = $ffe068 - - -; -; extern SYSTEMCALL short sys_bdev_flush(short dev); -; -; dev goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_bdev_flush = $ffe06c - - -; -; extern SYSTEMCALL short sys_bdev_ioctrl(short dev, short command, uint8_t * buffer, short size); -; -; dev goes in A[15..0] -; -; 8 bytes needed for the stack parameters -; -sys_bdev_ioctrl = $ffe070 - -bdev_ioctrl .namespace - .virtual 1,s -command .word ? ; the number of the command to send -buffer .dword ? ; pointer to bytes of additional data for the command -size .word ? ; the size of the buffer - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_open(const char * path, short mode); -; -; path goes in X[15..0]:A[15..0] -; -; 2 bytes needed for the stack parameters -; -sys_fsys_open = $ffe074 - -fsys_open .namespace - .virtual 1,s -mode .word ? ; the mode (e.g. r/w/create) - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_close(short fd); -; -; fd goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_fsys_close = $ffe078 - - -; -; extern SYSTEMCALL short sys_fsys_opendir(const char * path); -; -; path goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_fsys_opendir = $ffe07c - - -; -; extern SYSTEMCALL short sys_fsys_closedir(short dir); -; -; dir goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_fsys_closedir = $ffe080 - - -; -; extern SYSTEMCALL short sys_fsys_readdir(short dir, p_file_info file); -; -; dir goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_fsys_readdir = $ffe084 - -fsys_readdir .namespace - .virtual 1,s -file .dword ? ; pointer to the t_file_info structure to fill out. - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_findfirst(const char * path, const char * pattern, p_file_info file); -; -; path goes in X[15..0]:A[15..0] -; -; 8 bytes needed for the stack parameters -; -sys_fsys_findfirst = $ffe088 - -fsys_findfirst .namespace - .virtual 1,s -pattern .dword ? ; the file name pattern to search for -file .dword ? ; pointer to the t_file_info structure to fill out - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_findnext(short dir, p_file_info file); -; -; dir goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_fsys_findnext = $ffe08c - -fsys_findnext .namespace - .virtual 1,s -file .dword ? ; pointer to the t_file_info structure to fill out - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_get_label(const char * path, char * label); -; -; path goes in X[15..0]:A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_fsys_get_label = $ffe090 - -fsys_get_label .namespace - .virtual 1,s -label .dword ? ; buffer that will hold the label... should be at least 35 bytes - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_set_label(short drive, const char * label); -; -; drive goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_fsys_set_label = $ffe094 - -fsys_set_label .namespace - .virtual 1,s -label .dword ? ; buffer that holds the label - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_mkdir(const char * path); -; -; path goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_fsys_mkdir = $ffe098 - - -; -; extern SYSTEMCALL short sys_fsys_delete(const char * path); -; -; path goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_fsys_delete = $ffe09c - - -; -; extern SYSTEMCALL short sys_fsys_rename(const char * old_path, const char * new_path); -; -; old_path goes in X[15..0]:A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_fsys_rename = $ffe0a0 - -fsys_rename .namespace - .virtual 1,s -new_path .dword ? ; the new path for the file - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_set_cwd(const char * path); -; -; path goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_fsys_set_cwd = $ffe0a4 - - -; -; extern SYSTEMCALL short sys_fsys_get_cwd(char * path, short size); -; -; path goes in X[15..0]:A[15..0] -; -; 2 bytes needed for the stack parameters -; -sys_fsys_get_cwd = $ffe0a8 - -fsys_get_cwd .namespace - .virtual 1,s -size .word ? ; the size of the buffer in bytes - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_load(const char * path, uint32_t destination, uint32_t * start); -; -; path goes in X[15..0]:A[15..0] -; -; 8 bytes needed for the stack parameters -; -sys_fsys_load = $ffe0ac - -fsys_load .namespace - .virtual 1,s -destination .dword ? ; the destination address (0 for use file's address) -start .dword ? ; pointer to the long variable to fill with the starting address - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_register_loader(const char * extension, p_file_loader loader); -; -; extension goes in X[15..0]:A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_fsys_register_loader = $ffe0b0 - -fsys_register_loader .namespace - .virtual 1,s -loader .dword ? ; pointer to the file load routine to add - .endv - .endn - -; -; extern SYSTEMCALL short sys_fsys_stat(const char * path, p_file_info file); -; -; path goes in X[15..0]:A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_fsys_stat = $ffe0b4 - -fsys_stat .namespace - .virtual 1,s -file .dword ? ; pointer to a file info record to fill in, if the file is found. - .endv - .endn - -; -; extern SYSTEMCALL uint32_t sys_mem_get_ramtop(); -; -; 0 bytes needed for the stack parameters -; -sys_mem_get_ramtop = $ffe0b8 - - -; -; extern SYSTEMCALL uint32_t sys_mem_reserve(uint32_t bytes); -; -; bytes goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_mem_reserve = $ffe0bc - - -; -; extern SYSTEMCALL uint32_t sys_time_jiffies(); -; -; 0 bytes needed for the stack parameters -; -sys_time_jiffies = $ffe0c0 - - -; -; extern SYSTEMCALL void sys_rtc_set_time(p_time time); -; -; time goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_rtc_set_time = $ffe0c4 - - -; -; extern SYSTEMCALL void sys_rtc_get_time(p_time time); -; -; time goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_rtc_get_time = $ffe0c8 - - -; -; extern SYSTEMCALL uint16_t sys_kbd_scancode(); -; -; 0 bytes needed for the stack parameters -; -sys_kbd_scancode = $ffe0cc - - -; -; extern SYSTEMCALL short sys_kbd_layout(const char * tables); -; -; tables goes in X[15..0]:A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_kbd_layout = $ffe0d4 - - -; -; extern SYSTEMCALL short sys_proc_run(const char * path, int argc, char * argv[]); -; -; path goes in X[15..0]:A[15..0] -; -; 8 bytes needed for the stack parameters -; -sys_proc_run = $ffe0d8 - -proc_run .namespace - .virtual 1,s -argc .dword ? ; the number of arguments passed -argv .dword ? ; the array of string arguments - .endv - .endn - -; -; extern SYSTEMCALL short sys_txt_set_mode(short screen, short mode); -; -; screen goes in A[15..0] -; -; 2 bytes needed for the stack parameters -; -sys_txt_set_mode = $ffe0e0 - -txt_set_mode .namespace - .virtual 1,s -mode .word ? ; a bitfield of desired display mode options - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_set_xy(short screen, short x, short y); -; -; screen goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_txt_set_xy = $ffe0e8 - -txt_set_xy .namespace - .virtual 1,s -x .word ? ; the column for the cursor -y .word ? ; the row for the cursor - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_get_xy(short screen, p_point position); -; -; screen goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_txt_get_xy = $ffe0ec - -txt_get_xy .namespace - .virtual 1,s -position .dword ? ; pointer to a t_point record to fill out - .endv - .endn - -; -; extern SYSTEMCALL short sys_txt_get_region(short screen, p_rect region); -; -; screen goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_txt_get_region = $ffe0f0 - -txt_get_region .namespace - .virtual 1,s -region .dword ? ; pointer to a t_rect describing the rectangular region (using character cells for size and size) - .endv - .endn - -; -; extern SYSTEMCALL short sys_txt_set_region(short screen, p_rect region); -; -; screen goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_txt_set_region = $ffe0f4 - -txt_set_region .namespace - .virtual 1,s -region .dword ? ; pointer to a t_rect describing the rectangular region (using character cells for size and size) - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_set_color(short screen, unsigned char foreground, unsigned char background); -; -; screen goes in A[15..0] -; -; 2 bytes needed for the stack parameters -; -sys_txt_set_color = $ffe0f8 - -txt_set_color .namespace - .virtual 1,s -foreground .byte ? ; the Text LUT index of the new current foreground color (0 - 15) -background .byte ? ; the Text LUT index of the new current background color (0 - 15) - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_get_color(short screen, unsigned char * foreground, unsigned char * background); -; -; screen goes in A[15..0] -; -; 8 bytes needed for the stack parameters -; -sys_txt_get_color = $ffe0fc - -txt_get_color .namespace - .virtual 1,s -foreground .dword ? ; the Text LUT index of the new current foreground color (0 - 15) -background .dword ? ; the Text LUT index of the new current background color (0 - 15) - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_set_cursor_visible(short screen, short is_visible); -; -; screen goes in A[15..0] -; -; 2 bytes needed for the stack parameters -; -sys_txt_set_cursor_visible = $ffe100 - -txt_set_cursor_visible .namespace - .virtual 1,s -is_visible .word ? ; TRUE if the cursor should be visible, FALSE (0) otherwise - .endv - .endn - -; -; extern SYSTEMCALL short sys_txt_set_font(short screen, short width, short height, unsigned char * data); -; -; screen goes in A[15..0] -; -; 8 bytes needed for the stack parameters -; -sys_txt_set_font = $ffe104 - -txt_set_font .namespace - .virtual 1,s -width .word ? ; width of a character in pixels -height .word ? ; of a character in pixels -data .dword ? ; pointer to the raw font data to be loaded - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_get_sizes(short screen, p_extent text_size, p_extent pixel_size); -; -; screen goes in A[15..0] -; -; 8 bytes needed for the stack parameters -; -sys_txt_get_sizes = $ffe108 - -txt_get_sizes .namespace - .virtual 1,s -text_size .dword ? ; the size of the screen in visible characters (may be null) -pixel_size .dword ? ; the size of the screen in pixels (may be null) - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_set_border(short screen, short width, short height); -; -; screen goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_txt_set_border = $ffe10c - -txt_set_border .namespace - .virtual 1,s -width .word ? ; the horizontal size of one side of the border (0 - 32 pixels) -height .word ? ; the vertical size of one side of the border (0 - 32 pixels) - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_set_border_color(short screen, unsigned char red, unsigned char green, unsigned char blue); -; -; screen goes in A[15..0] -; -; 3 bytes needed for the stack parameters -; -sys_txt_set_border_color = $ffe110 - -txt_set_border_color .namespace - .virtual 1,s -red .byte ? ; the red component of the color (0 - 255) -green .byte ? ; the green component of the color (0 - 255) -blue .byte ? ; the blue component of the color (0 - 255) - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_put(short screen, char c); -; -; screen goes in A[15..0] -; -; 1 bytes needed for the stack parameters -; -sys_txt_put = $ffe114 - -txt_put .namespace - .virtual 1,s -c .byte ? ; the character to print - .endv - .endn - -; -; extern SYSTEMCALL void sys_txt_print(short screen, const char * message); -; -; screen goes in A[15..0] -; -; 4 bytes needed for the stack parameters -; -sys_txt_print = $ffe118 - -txt_print .namespace - .virtual 1,s -message .dword ? ; the ASCII Z string to print - .endv - .endn diff --git a/client-64tass/genbindings.py b/client-64tass/genbindings.py deleted file mode 100644 index 4fefc50..0000000 --- a/client-64tass/genbindings.py +++ /dev/null @@ -1,285 +0,0 @@ - -# -# Create the 64tass parameters structures for the Toolbox functions -# - -import re -import sys - -class FunctionParameter: - def __init__(self): - self._name = "UNKNOWN" - self._position = 0 - self._type = "" - self._description = "" - - def set_name(self, name): - if name.endswith("[]"): - name = name[0:-2] - self._name = name - - def name(self): - return self._name - - def set_position(self, position): - self._position = position - - def position(self): - return self._position - - def set_type(self, type): - self._type = type - - def type(self): - return self._type - - def set_description(self, description): - self._description = description - - def description(self): - return self._description - - def print(self): - """Print a simple version of a parameter""" - - print("\tName: {0}, Type: {1}, Comment: {2}".format(self._name, self._type, self._description)) - - def size(self): - """Return the size of the parameter in bytes.""" - if self.type() == "char" or self.type() == "unsigned char" or self.type() == "uint8_t": - return 1 - elif self.type() == "short" or self.type() == "unsigned short" or self.type() == "uint16_t": - return 2 - else: - return 4 - - def emit_asm(self, output): - """Emit the assembly reference for the parameter.""" - - size = self.size() - - if size == 1: - output.write("{0:<16}.byte ? ; {1}\n".format(self.name(), self.description())) - elif size == 2: - output.write("{0:<16}.word ? ; {1}\n".format(self.name(), self.description())) - else: - output.write("{0:<16}.dword ? ; {1}\n".format(self.name(), self.description())) - - def emit_accumulator(self, output): - size = self.size() - if size == 1: - output.write("; {0} goes in A[7..0]\n".format(self.name())) - elif size == 2: - output.write("; {0} goes in A[15..0]\n".format(self.name())) - else: - output.write("; {0} goes in X[15..0]:A[15..0]\n".format(self.name())) - -class Function: - def __init__(self): - self._name = "UNKNOWN" - self._brief = "" - self._description = "" - self._type = "void" - self._parameters = [] - self._address = 0 - self._prototype = "" - - def set_name(self, name): - self._name = name - - def name(self): - return self._name - - def set_prototype(self, prototype): - self._prototype = prototype - - def prototype(self): - return self._prototype - - def set_brief(self, brief): - self._brief = brief - - def brief(self): - return self._brief - - def set_description(self, description): - self._description = description - - def description(self): - return self._description - - def set_type(self, type): - self._type = type - - def type(self): - return self._type - - def set_address(self, address): - self._address = address - - def address(self): - return self._address - - def add_parameter(self, param_name, param_type): - """Add a parameter to the function.""" - - param = FunctionParameter() - param.set_name(param_name) - param.set_type(param_type) - param.set_position(len(self._parameters)) - - self._parameters.append(param) - - def parameters(self): - return self._parameters - - def stack_size(self): - """Return the number of bytes needed on the stack for the parameters""" - - size = 0 - if len(self.parameters()) > 1: - for parameter in self.parameters()[1:]: - size = size + parameter.size() - return size - - def add_param_comment(self, param_name, param_comment): - """Add a comment to a parameter""" - - for param in self._parameters: - if param._name == param_name: - param.set_description(param_comment) - break - - def print(self): - """Print out a simple description of the function""" - - print("Name: {0}, Type: {1}".format(self._name, self._type)) - print(self._description) - for parameter in self._parameters: - parameter.print() - - print() - - def emit_asm(self, output): - """Emit the assembly reference for the function.""" - - output.write("\n;\n; {0}\n".format(self.prototype())) - if len(self.parameters()) > 0: - first = self.parameters()[0] - output.write("; \n") - first.emit_accumulator(output) - output.write(";\n") - output.write("; {0} bytes needed for the stack parameters\n;\n".format(self.stack_size())) - - output.write("{0} = ${1:06x}\n\n".format(self.name(), self.address())) - - if len(self.parameters()) > 1: - m = re.match("sys_(\w+)", self.name()) - if m: - short_name = m.group(1) - else: - short_name = self.name() - stack_parameters = self.parameters()[1:] - - output.write("{0:<16} .namespace\n".format(short_name)) - output.write(" .virtual 1,s\n") - - for parameter in stack_parameters: - parameter.emit_asm(output) - - output.write(" .endv\n") - output.write(" .endn\n") - - -comments = [] -functions = [] - -def process_comment(line): - """Deal with a comment line while we're in the middle of a block comment.""" - index = line.index("*") - if index > -1: - comment_line = line[index+1:].strip() - else: - comment_line = line.strip() - - if comment_line != "": - comments.append(comment_line) - -def process_definition(type, name, parameters, comments, prototype): - """Deal with a function prototype.""" - - func = Function() - func.set_name(name) - func.set_type(type) - func.set_prototype(prototype) - - is_in_func_comments = True - - for param in func_parameters: - m1 = re.match("^\s*(.*)\s(\S+)\s*$", param) - if m1: - param_type = m1.group(1).strip() - param_name = m1.group(2).strip() - func.add_parameter(param_name, param_type) - - for comment in comments: - m2 = re.match("@param\s(\w+)\s+(.*)$", comment) - if m2: - param_name = m2.group(1).strip() - param_comment = m2.group(2).strip() - func.add_param_comment(param_name, param_comment) - else: - func._description = func._description + comment - - functions.append(func) - -# -# Read in the C header file with the extern prototypes and parse all the function names, -# return values, and parameters -# -with open(sys.argv[1], "r") as input: - is_in_comment = False - - for line in input.readlines(): - line = line.strip() - - if line.startswith("/**"): - is_in_comments = True - comments = [] - elif line.endswith("*/"): - is_in_comments = False - - if is_in_comments and line.startswith("*"): - process_comment(line) - - else: - m = re.match("extern\s+SYSTEMCALL\s+(\w+)\s+(\w+)\((.*)\)", line) - if m: - func_type = m.group(1) - func_name = m.group(2) - func_parameters = str.split(m.group(3), ",") - process_definition(func_type, func_name, func_parameters, comments, line) - -# -# Read in the Caylpsi Toolbox jumptable assembly file and extract the addresses -# -with open(sys.argv[2], "r") as addresses: - for line in addresses.readlines(): - m = re.match("^(\w+):\s+.equlab\s+0x([0-9a-fA-F]+)", line) - if m: - func_name = m.group(1).strip() - func_address = int(m.group(2), 16) - - print("Name: {0}, Address: {1}".format(func_name, func_address)) - - for func in functions: - if func.name() == func_name: - func.set_address(func_address) - break - -# -# Create the bindings file with the relevant information -# -with open("bindings.s", "w") as bindings: - for func in functions: - func.emit_asm(bindings) diff --git a/client-64tass/hello.s b/client-64tass/hello.s deleted file mode 100644 index 117aa32..0000000 --- a/client-64tass/hello.s +++ /dev/null @@ -1,57 +0,0 @@ -;;; -;;; A simple client program for the Foenix Toolbox using 64TASS -;;; - - .cpu "65816" - - .include "toolbox.s" - -setdbr .macro ; Set the B (Data bank) register - pea #((\1) * 256) + (\1) - plb - plb - .databank \1 - .endm - -setaxl .macro - rep #$30 ; set A&X long - .al - .xl - .endm - -* = $10000 - -header: .byte $f8, $16 ; Signature - .byte 0 ; Version - .dword start ; Starting address - .dword 0 ; Icon address - .dword 0 ; Icon palette address - .null "hello" ; Name of the file - -start: clc - xce - - setdbr `start - setaxl - - alloc 6 ; Set aside parameter space for sys_chan_write - - lda #33 ; Size of the message - sta tb.chan_write.size - - lda #`message ; Pointer to the message - sta tb.chan_write.buffer+2 - lda #<>message - sta tb.chan_write.buffer - - lda #0 ; Channel #0 - - jsl sys_chan_write ; sys_chan_write(0, message, strlen(message)) - - free 6 ; Reclaim parameter space from sys_chan_write - -loop: nop - bra loop - -message: .null "Hello, Foenix Toolbox (64TASS)!",13,10 - diff --git a/client-64tass/toolbox.s b/client-64tass/toolbox.s deleted file mode 100644 index c8027b4..0000000 --- a/client-64tass/toolbox.s +++ /dev/null @@ -1,69 +0,0 @@ -;;; -;;; Definitions to connect a 64TASS assembly program to the Foenix Toolbox -;;; - - .include "bindings.s" - -; -; Allocate space on the stack for parameters (count = number of bytes) -; -; Affects: A -; -alloc .macro count - - .switch \count - .case 2 - pea #0 - - .case 4 - pea #0 - pea #0 - - .case 6 - pea #0 - pea #0 - pea #0 - - .default - sta #0,d - - tsc - sec - sbc #(\count) - tcs - - lda #0,d - .endswitch - .endm - -; -; Remove space from the stack previously used for parameters (count = number of bytes) -; -; Affects: Y, #0,D, #1,D -; -free .macro count - - .switch \count - .case 2 - ply - - .case 4 - ply - ply - - .case 6 - ply - ply - ply - - .default - sta #0,d - - tsc - clc - adc #(\count) - tcs - - lda #0,d - .endswitch - .endm \ No newline at end of file diff --git a/client-64tass/types.s b/client-64tass/types.s deleted file mode 100644 index 767e509..0000000 --- a/client-64tass/types.s +++ /dev/null @@ -1,100 +0,0 @@ -;;; -;;; Types used by the Foenix Toolbox functions -;;; - -tb .namespace - -; -; An extent or size of a rectangular area -; -s_extent .struct -width .word ? ; The width of the region -height .word ? ; The height of the region - .ends - -; -; A point on a plane -; -s_point .struct -x .word ? ; The column of the point -y .word ? ; The row of the point - .ends - -; -; A rectangle on the screen -; -s_rect .struct -origin .dstruct s_point ; The upper-left corner of the rectangle -size .dstruct s_extent ; The size of the rectangle - .ends - -; -; A color (BGR) -; -s_color3 .struct -blue .byte ? -green .byte ? -red .byte ? - .ends - -; -; A color entry for a color lookup table (BGRA) -; -s_color4 .struct -blue .byte ? -green .byte ? -red .byte ? -alpha .byte ? - .ends - -; -; Type to describe the current time -; -s_time .struct -year .word ? -month .word ? -day .word ? -hour .word ? -minute .word ? -second .word ? -is_pm .word ? -is_24hours .word ? - .ends - -; -; A description of a screen's capabilities -; -s_txt_capabilities .struct -number .word ? ; The unique ID of the screen -supported_modes .word ? ; The display modes supported on this screen -font_size_count .word ? ; The number of supported font sizes -font_sizes .dword ? ; Pointer to a list of t_extent listing all supported font sizes -resolution_count .word ? ; The number of supported display resolutions -resolutions .dword ? ; Pointer to a list of t_extent listing all supported display resolutions (in pixels) - .ends - -; -; Structure to describe the hardware -; -s_sys_info .struct -mcp_version .word ? ; Current version of the MCP kernel -mcp_rev .word ? ; Current revision, or sub-version of the MCP kernel -mcp_build .word ? ; Current vuild # of the MCP kernel -model .word ? ; Code to say what model of machine this is -sub_model .word ? ; 0x00 = PB, 0x01 = LB, 0x02 = CUBE -model_name .dword ? ; Human readable name of the model of the computer -cpu .word ? ; Code to say which CPU is running -cpu_name .dword ? ; Human readable name for the CPU -cpu_clock_khz .dword ? ; Speed of the CPU clock in KHz -fpga_date .dword ? ; YYYYMMDD -fpga_model .word ? ; FPGA model number -fpga_version .word ? ; FPGA version -fpga_subver .word ? ; FPGA sub-version -system_ram_size .dword ? ; The number of bytes of system RAM on the board -has_floppy .byte ? ; TRUE if the board has a floppy drive installed -has_hard_drive .byte ? ; TRUE if the board has a PATA device installed -has_expansion_card .byte ? ; TRUE if an expansion card is installed on the device -has_ethernet .byte ? ; TRUE if an ethernet port is present -screens .word ? ; How many screens are on this computer - - .endn \ No newline at end of file diff --git a/client/src/Makefile b/client/src/Makefile deleted file mode 100644 index ca5cb66..0000000 --- a/client/src/Makefile +++ /dev/null @@ -1,68 +0,0 @@ -# VPATH=.:../../module/Calypsi-remote-debug/src -DEBUGGER=../module/Calypsi-remote-debug/src - -UNIT := F256K -MEMORY := RAM - -# Define OS-dependent variables - -ifeq ($(OS),Windows_NT) - RM = del /F/Q -else - RM = rm -f -endif - -# Define model-specific variables, including tools, source files, compiler flags, etc. - -ifeq ($(UNIT),F256K) - CPU=w65816 - C_SRCS_DEBUGGER=$(DEBUGGER)/agent.c $(DEBUGGER)/c256-uart.c $(DEBUGGER)/low_level_WDC65816.s - SRCS_FOR_UNIT= - CFLAGS_FOR_UNIT=-DMODEL=17 -DCPU=255 --code-model large --data-model large - - ifeq ($(MEMORY),ROM) - LDFLAGS_FOR_UNIT=C256/f256-flash.scm clib-lc-ld.a --rtattr printf=medium - else - LDFLAGS_FOR_UNIT=C256/f256-ld_lc.scm clib-lc-ld.a --rtattr printf=medium - endif -endif - -ifeq ($(CPU),w65816) - CC=cc65816 - AS=as65816 - LD=ln65816 - AR=nlib -endif - -INCLUDES=-I. -I./include -CFLAGS=$(INCLUDES) $(CFLAGS_FOR_UNIT) -l # -l -D_CALYPSI_MCP_DEBUGGER -ASFLAGS=$(INCLUDES) --data-model large --code-model large - -ifeq ($(MEMORY),ROM) - LDFLAGS=--rom-code $(LDFLAGS_FOR_UNIT) --list-file toolbox.map -else - LDFLAGS=$(LDFLAGS_FOR_UNIT) --list-file toolbox.map -endif - -SRCS = stubs.c bindings.s $(SRCS_FOR_UNIT) # $(C_SRCS_DEBUGGER) -OBJS = $(patsubst %.s,%.o,$(patsubst %.c,%.o,$(SRCS))) -OBJS4RM = $(subst /,\\,$(OBJS)) -LIBS = - -.PHONY: clean - -toolbox.a: $(OBJS) - $(AR) toolbox.a $(OBJS) - -# Build the object files from C -%.o: %.c - $(CC) $(CFLAGS) -o $@ $^ - -# Build the object files from assembly -%.o: %.s - $(AS) $(ASFLAGS) -o $@ $^ - -# Clean up after a build -clean: - $(RM) $(OBJS4RM) *.o *.a *.lst - diff --git a/client/src/bindings.s b/client/src/bindings.s deleted file mode 100644 index 57e395a..0000000 --- a/client/src/bindings.s +++ /dev/null @@ -1,147 +0,0 @@ -;;; -;;; Bindings for the Foenix Toolbox public calls -;;; - - .public sys_proc_exit - .public sys_int_enable_all - .public sys_int_disable_all - .public sys_int_disable - .public sys_int_enable - .public sys_int_register - .public sys_int_pending - .public sys_get_info - .public sys_int_clear - .public sys_chan_read_b - .public sys_chan_read - .public sys_chan_readline - .public sys_chan_write_b - .public sys_chan_write - .public sys_chan_status - .public sys_chan_flush - .public sys_chan_seek - .public sys_chan_ioctrl - .public sys_chan_open - .public sys_chan_close - .public sys_chan_swap - .public sys_chan_device - .public sys_chan_register - .public sys_bdev_register - .public sys_bdev_read - .public sys_bdev_write - .public sys_bdev_status - .public sys_bdev_flush - .public sys_bdev_ioctrl - .public sys_fsys_open - .public sys_fsys_close - .public sys_fsys_opendir - .public sys_fsys_closedir - .public sys_fsys_readdir - .public sys_fsys_findfirst - .public sys_fsys_findnext - .public sys_fsys_get_label - .public sys_fsys_set_label - .public sys_fsys_mkdir - .public sys_fsys_delete - .public sys_fsys_rename - .public sys_fsys_set_cwd - .public sys_fsys_get_cwd - .public sys_fsys_load - .public sys_fsys_register_loader - .public sys_fsys_stat - .public sys_mem_get_ramtop - .public sys_mem_reserve - .public sys_time_jiffies - .public sys_rtc_set_time - .public sys_rtc_get_time - .public sys_kbd_scancode - .public sys_err_message - .public sys_kbd_layout - .public sys_proc_run - .public sys_txt_get_capabilities - .public sys_txt_set_mode - .public sys_txt_setsizes - .public sys_txt_set_xy - .public sys_txt_get_xy - .public sys_txt_get_region - .public sys_txt_set_region - .public sys_txt_set_color - .public sys_txt_get_color - .public sys_txt_set_cursor_visible - .public sys_txt_set_font - .public sys_txt_get_sizes - .public sys_txt_set_border - .public sys_txt_set_border_color - .public sys_txt_put - .public sys_txt_print - -sys_proc_exit: .equlab 0xFFE000 -sys_int_enable_all: .equlab 0xFFE004 -sys_int_disable_all: .equlab 0xFFE008 -sys_int_disable: .equlab 0xFFE00C -sys_int_enable: .equlab 0xFFE010 -sys_int_register: .equlab 0xFFE014 -sys_int_pending: .equlab 0xFFE018 -sys_get_info: .equlab 0xFFE01C -sys_int_clear: .equlab 0xFFE020 -sys_chan_read_b: .equlab 0xFFE024 -sys_chan_read: .equlab 0xFFE028 -sys_chan_readline: .equlab 0xFFE02C -sys_chan_write_b: .equlab 0xFFE030 -sys_chan_write: .equlab 0xFFE034 -sys_chan_status: .equlab 0xFFE038 -sys_chan_flush: .equlab 0xFFE03C -sys_chan_seek: .equlab 0xFFE040 -sys_chan_ioctrl: .equlab 0xFFE044 -sys_chan_open: .equlab 0xFFE048 -sys_chan_close: .equlab 0xFFE04C -sys_chan_swap: .equlab 0xFFE050 -sys_chan_device: .equlab 0xFFE054 -sys_chan_register: .equlab 0xFFE058 -sys_bdev_register: .equlab 0xFFE05C -sys_bdev_read: .equlab 0xFFE060 -sys_bdev_write: .equlab 0xFFE064 -sys_bdev_status: .equlab 0xFFE068 -sys_bdev_flush: .equlab 0xFFE06C -sys_bdev_ioctrl: .equlab 0xFFE070 -sys_fsys_open: .equlab 0xFFE074 -sys_fsys_close: .equlab 0xFFE078 -sys_fsys_opendir: .equlab 0xFFE07C -sys_fsys_closedir: .equlab 0xFFE080 -sys_fsys_readdir: .equlab 0xFFE084 -sys_fsys_findfirst: .equlab 0xFFE088 -sys_fsys_findnext: .equlab 0xFFE08C -sys_fsys_get_label: .equlab 0xFFE090 -sys_fsys_set_label: .equlab 0xFFE094 -sys_fsys_mkdir: .equlab 0xFFE098 -sys_fsys_delete: .equlab 0xFFE09C -sys_fsys_rename: .equlab 0xFFE0A0 -sys_fsys_set_cwd: .equlab 0xFFE0A4 -sys_fsys_get_cwd: .equlab 0xFFE0A8 -sys_fsys_load: .equlab 0xFFE0AC -sys_fsys_register_loader: .equlab 0xFFE0B0 -sys_fsys_stat: .equlab 0xFFE0B4 -sys_mem_get_ramtop: .equlab 0xFFE0B8 -sys_mem_reserve: .equlab 0xFFE0BC -sys_time_jiffies: .equlab 0xFFE0C0 -sys_rtc_set_time: .equlab 0xFFE0C4 -sys_rtc_get_time: .equlab 0xFFE0C8 -sys_kbd_scancode: .equlab 0xFFE0CC -sys_err_message: .equlab 0xFFE0D0 -sys_kbd_layout: .equlab 0xFFE0D4 -sys_proc_run: .equlab 0xFFE0D8 -sys_txt_get_capabilities: .equlab 0xFFE0DC -sys_txt_set_mode: .equlab 0xFFE0E0 -sys_txt_setsizes: .equlab 0xFFE0E4 -sys_txt_set_xy: .equlab 0xFFE0E8 -sys_txt_get_xy: .equlab 0xFFE0EC -sys_txt_get_region: .equlab 0xFFE0F0 -sys_txt_set_region: .equlab 0xFFE0F4 -sys_txt_set_color: .equlab 0xFFE0F8 -sys_txt_get_color: .equlab 0xFFE0FC -sys_txt_set_cursor_visible: .equlab 0xFFE100 -sys_txt_set_font: .equlab 0xFFE104 -sys_txt_get_sizes: .equlab 0xFFE108 -sys_txt_set_border: .equlab 0xFFE10C -sys_txt_set_border_color: .equlab 0xFFE110 -sys_txt_put: .equlab 0xFFE114 -sys_txt_print: .equlab 0xFFE118 diff --git a/client/src/genbinding.py b/client/src/genbinding.py deleted file mode 100644 index 59de67d..0000000 --- a/client/src/genbinding.py +++ /dev/null @@ -1,38 +0,0 @@ - -### -### Generate client bindings for the Toolbox -### - -# with open("toolbox_bindings.s", "w") as output: - -table_entry_size = 4 -table_address = 0xffe000 -syscalls = {} - -with open("..\..\src\C256\syscalls.txt", "r") as input: - for line in input: - # Remove comments - index = line.find("#") - if index == 0: - line = "" - elif index > 0: - line = line[index - 1:] - - line = line.strip() - - if line != "": - name = "sys_{}".format(line) - syscalls[name] = table_address - table_address += table_entry_size - -with open("bindings.s", "w") as output: - output.write(";;;\n;;; Bindings for the Foenix Toolbox public calls\n;;;\n\n") - - for name in syscalls.keys(): - output.write("\t.public {}\n".format(name)) - - output.write("\n") - - for name in syscalls.keys(): - address = syscalls[name] - output.write("{0:<30} .equlab 0x{1:06X}\n".format(name + ":", address)) \ No newline at end of file diff --git a/client/src/include/constants.h b/client/src/include/constants.h deleted file mode 100644 index dd79519..0000000 --- a/client/src/include/constants.h +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @file constants.h - * @brief Define the major public-facing constants for the Foenix Toolbox - * @version 0.1 - * @date 2024-09-02 - * - * @copyright Copyright (c) 2024 - * - */ - -#ifndef __CONSTANTS_H -#define __CONSTANTS_H - -/* - * Miscellaneous definitions - */ - -#define FSYS_SECTOR_SZ 512 /* Size of a sector */ -#define MAX_PATH_LEN 256 /* Maximum length of a file path */ - -/* - * Definitions of special characters - */ - -#define CHAR_ESC '\x1B' /* Escape character */ -#define CHAR_TAB '\t' /* Vertical tab */ -#define CHAR_CR '\x0D' /* Carriage return */ -#define CHAR_NL '\x0A' /* Linefeed */ -#define CHAR_BS '\b' /* Backspace */ - -/* - * File access mode and open method flags - */ -#define FSYS_READ 0x01 -#define FSYS_WRITE 0x02 -#define FSYS_OPEN_EXISTING 0x00 -#define FSYS_CREATE_NEW 0x04 -#define FSYS_CREATE_ALWAYS 0x08 -#define FSYS_OPEN_ALWAYS 0x10 -#define FSYS_OPEN_APPEND 0x30 - -/* - * File attribute bits for directory entry - */ -#define FSYS_AM_RDO 0x01 /* Read only */ -#define FSYS_AM_HID 0x02 /* Hidden */ -#define FSYS_AM_SYS 0x04 /* System */ -#define FSYS_AM_DIR 0x10 /* Directory */ -#define FSYS_AM_ARC 0x20 /* Archive */ - -/* - * Block devices - */ - -#define BDEV_SD0 0 /* External SDC */ -#define BDEV_SD1 1 /* Internal SDC */ - -/* - * Channel devices - */ - -#define CDEV_CONSOLE 0 -#define CDEV_EVID 1 -#define CDEV_COM1 2 -#define CDEV_COM2 3 -#define CDEV_LPT 4 -#define CDEV_MIDI 5 -#define CDEV_FILE 6 - -/* - * Block Device IOCRTRL commands - */ - -#define IOCTRL_CTRL_SYNC 0 /* Complete pending write process (needed at FF_FS_READONLY == 0) */ -#define IOCTRL_GET_SECTOR_COUNT 1 /* Get media size (needed at FF_USE_MKFS == 1) */ -#define IOCTRL_GET_SECTOR_SIZE 2 /* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */ -#define IOCTRL_GET_BLOCK_SIZE 3 /* Get erase block size (needed at FF_USE_MKFS == 1) */ - -#endif diff --git a/client/src/include/errors.h b/client/src/include/errors.h deleted file mode 100644 index 58b7e47..0000000 --- a/client/src/include/errors.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file errors.h - * @brief Error codes returned by Foenix Toolbox calls - * @version 0.1 - * @date 2024-09-02 - * - * @copyright Copyright (c) 2024 - * - */ - -#ifndef __ERRORS_H -#define __ERRORS_H - -// #define MAX_ERROR_NUMBER 16 // Largest (absolute value) of the error number - -#define E_OK 0 // Success, no error -#define ERR_GENERAL -1 // A general error condition -#define DEV_ERR_BADDEV -2 // Device number is bad (too big or no device assigned) -#define DEV_TIMEOUT -3 // The block device function timed out -#define DEV_CANNOT_INIT -4 // The block device could not initilize -#define DEV_CANNOT_READ -5 // The device cannot complete the READ -#define DEV_CANNOT_WRITE -6 // The device cannot complete the WRITE -#define DEV_BOUNDS_ERR -7 // The buffer provided is not big enough -#define DEV_NOMEDIA -8 // There is no media present for that device -#define DEV_WRITEPROT -9 // The media is write protected -#define ERR_BADCHANNEL -10 // The channel number was bad -#define ERR_OUT_OF_HANDLES -11 // There are no available handles for channels files etc. -#define ERR_BAD_HANDLE -12 // The handle passed was not valid -#define ERR_BAD_EXTENSION -13 // The path to load did not have an extension that matched registered loaders -#define ERR_OUT_OF_MEMORY -14 // Unable to allocate more memory -#define ERR_BAD_BINARY -15 // Bad binary file format... i.e. binary format does not match expectations -#define ERR_NOT_EXECUTABLE -16 // Binary file format does not have a starting address -#define ERR_NOT_FOUND -17 // Resource not found - -#define FSYS_ERR_DISK_ERR -18 /* (1) A hard error occurred in the low level disk I/O layer */ -#define FSYS_ERR_INT_ERR -19 /* (2) Assertion failed */ -#define FSYS_ERR_NOT_READY -20 /* (3) The physical drive cannot work */ -#define FSYS_ERR_NO_FILE -21 /* (4) Could not find the file */ -#define FSYS_ERR_NO_PATH -22 /* (5) Could not find the path */ -#define FSYS_ERR_INVALID_NAME -23 /* (6) The path name format is invalid */ -#define FSYS_ERR_DENIED -24 /* (7) Access denied due to prohibited access or directory full */ -#define FSYS_ERR_EXIST -25 /* (8) Access denied due to prohibited access */ -#define FSYS_ERR_INVALID_OBJECT -26 /* (9) The file/directory object is invalid */ -#define FSYS_ERR_WRITE_PROTECTED -27 /* (10) The physical drive is write protected */ -#define FSYS_ERR_INVALID_DRIVE -28 /* (11) The logical drive number is invalid */ -#define FSYS_ERR_NOT_ENABLED -29 /* (12) The volume has no work area */ -#define FSYS_ERR_NO_FILESYSTEM -30 /* (13) There is no valid FAT volume */ -#define FSYS_ERR_MKFS_ABORTED -31 /* (14) The f_mkfs() aborted due to any problem */ -#define FSYS_ERR_TIMEOUT -32 /* (15) Could not get a grant to access the volume within defined period */ -#define FSYS_ERR_LOCKED -33 /* (16) The operation is rejected according to the file sharing policy */ -#define FSYS_ERR_NOT_ENOUGH_CORE -34 /* (17) LFN working buffer could not be allocated */ -#define FSYS_ERR_TOO_MANY_OPEN_FILES -35 /* (18) Number of open files > FF_FS_LOCK */ -#define FSYS_ERR_INVALID_PARAMETER -36 /* (19) Given parameter is invalid */ - -#define ERR_NOT_SUPPORTED -37 /* Device does not support the file or operation */ -#define ERR_BAD_ARGUMENT -38 /* An invalid argument was provided */ -#define ERR_MEDIA_CHANGE -39 /* Removable media has changed */ -#define ERR_NOT_READY -40 /* Media device is not ready */ - -#endif diff --git a/client/src/include/sys_macros.h b/client/src/include/sys_macros.h deleted file mode 100644 index aa728ee..0000000 --- a/client/src/include/sys_macros.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @file sys_macros.h - * @brief Macros needed for the Foenix Toolbox - * @version 0.1 - * @date 2024-09-02 - * - * @copyright Copyright (c) 2024 - * - */ - -#ifndef _sys_macros_h_ -#define _sys_macros_h_ - -/* - * Define the machine-specific system call function prefix - */ - -#ifdef __CALYPSI_CORE_65816__ -// -// System calls on the 65816 pass parameters primarily on stack using the Calypsi -// simple call convention and save/restore the direct page and data bank registers. -// -#define SYSTEMCALL __attribute__((simple_call)) __attribute__((saveds)) -#else -#define SYSTEMCALL -#endif - -#endif \ No newline at end of file diff --git a/client/src/include/sys_types.h b/client/src/include/sys_types.h deleted file mode 100644 index e73111c..0000000 --- a/client/src/include/sys_types.h +++ /dev/null @@ -1,163 +0,0 @@ -/** - * @file sys_types.h - * @brief Public-facing ypes used by the Foenix Toolbox - * @version 0.1 - * @date 2024-09-02 - * - * @copyright Copyright (c) 2024 - * - */ - -#ifndef _sys_types_h_ -#define _sys_types_h_ - -#include -#include -#include "constants.h" - -/** - * @struct s_extent - * - * An extent or size of a rectangular area - */ -typedef struct s_extent { - short width; /**< The width of the region */ - short height; /**< The height of the region */ -} t_extent, *p_extent; - -/** - * @struct s_point - * - * A point on a plane - */ -typedef struct s_point { - short x; /**< The column of the point */ - short y; /**< The row of the point */ -} t_point, *p_point; - -/** - * @struct s_rect - * - * A rectangle on the screen - */ -typedef struct s_rect { - t_point origin; /**< The upper-left corner of the rectangle */ - t_extent size; /**< The size of the rectangle */ -} t_rect, *p_rect; - -// -// A color (BGR) -// -typedef struct s_color3 { - uint8_t blue; - uint8_t green; - uint8_t red; -} t_color3; - -// -// A color entry for a color lookup table (BGRA) -// -typedef struct s_color4 { - uint8_t blue; - uint8_t green; - uint8_t red; - uint8_t alpha; -} t_color4; - -/* - * Type declaration for an interrupt handler - */ - -typedef void (*p_int_handler)(); - -/* - * Structure to describe the hardware - */ - -typedef struct s_sys_info { - uint16_t mcp_version; /* Current version of the MCP kernel */ - uint16_t mcp_rev; /* Current revision, or sub-version of the MCP kernel */ - uint16_t mcp_build; /* Current vuild # of the MCP kernel */ - uint16_t model; /* Code to say what model of machine this is */ - uint16_t sub_model; /* 0x00 = PB, 0x01 = LB, 0x02 = CUBE */ - const char * model_name; /* Human readable name of the model of the computer */ - uint16_t cpu; /* Code to say which CPU is running */ - const char * cpu_name; /* Human readable name for the CPU */ - uint32_t cpu_clock_khz; /* Speed of the CPU clock in KHz */ - unsigned long fpga_date; /* YYYYMMDD */ - uint16_t fpga_model; /* FPGA model number */ - uint16_t fpga_version; /* FPGA version */ - uint16_t fpga_subver; /* FPGA sub-version */ - uint32_t system_ram_size; /* The number of bytes of system RAM on the board */ - bool has_floppy; /* TRUE if the board has a floppy drive installed */ - bool has_hard_drive; /* TRUE if the board has a PATA device installed */ - bool has_expansion_card; /* TRUE if an expansion card is installed on the device */ - bool has_ethernet; /* TRUE if an ethernet port is present */ - uint16_t screens; /* How many screens are on this computer */ -} t_sys_info, *p_sys_info; - -/* - * Structure defining a block device's functions - */ - -typedef struct s_dev_block { - short number; // The number of the device (assigned by registration) - char * name; // The name of the device - void * data; // Device-specific data block - short (*init)(struct s_dev_block *); // Initialize the device - short (*read)(struct s_dev_block *, long lba, uint8_t * buffer, short size); // Read a block from the device - short (*write)(struct s_dev_block *, long lba, const uint8_t * buffer, short size); // Write a block to the device - short (*status)(struct s_dev_block *); // Get the status of the device - short (*flush)(struct s_dev_block *); // Ensure that any pending writes to the device have been completed - short (*ioctrl)(struct s_dev_block *, short command, unsigned char * buffer, short size); // Issue a control command to the device -} t_dev_block, *p_dev_block; - -/* - * Type for directory information about a file - */ - -typedef struct s_file_info { - long size; - unsigned short date; - unsigned short time; - unsigned char attributes; - char name[MAX_PATH_LEN]; -} t_file_info, * p_file_info; - -/* - * Pointer type for file loaders - * - * short loader(short chan, destination, start); - */ - -typedef short (*p_file_loader)(short chan, long destination, long * start); - -/* - * Type to describe the current time - */ - -typedef struct s_time { - short year; - short month; - short day; - short hour; - short minute; - short second; - short is_pm; - short is_24hours; -} t_time, *p_time; - -/* - * A description of a screen's capabilities - */ - -typedef struct s_txt_capabilities { - short number; /**< The unique ID of the screen */ - short supported_modes; /**< The display modes supported on this screen */ - short font_size_count; /**< The number of supported font sizes */ - p_extent font_sizes; /**< Pointer to a list of t_extent listing all supported font sizes */ - short resolution_count; /**< The number of supported display resolutions */ - p_extent resolutions; /**< Pointer to a list of t_extent listing all supported display resolutions (in pixels) */ -} t_txt_capabilities, *p_txt_capabilities; - -#endif \ No newline at end of file diff --git a/client/src/include/toolbox.h b/client/src/include/toolbox.h deleted file mode 100644 index b8c422b..0000000 --- a/client/src/include/toolbox.h +++ /dev/null @@ -1,722 +0,0 @@ -/** - * @file toolbox.h - * @brief Public-facing calls for the Foenix Toolbox - * @version 0.1 - * @date 2024-09-02 - * - * @copyright Copyright (c) 2024 - * - */ - -#ifndef __toolbox_h__ -#define __toolbox_h__ - -#include -#include -#include "constants.h" -#include "sys_macros.h" -#include "sys_types.h" - -/** - * Quit the current user process - * - * NOTE: at the moment, this relaunches the CLI. In the future, this - * may cause execution to return to the program that started - * the user process. - * - * @param result the code to return to the kernel - */ -extern SYSTEMCALL void sys_proc_exit(short result); - -/** - * Enable all interrupts - */ -extern SYSTEMCALL void sys_int_enable_all(); - -/** - * Disable all interrupts - */ -extern SYSTEMCALL void sys_int_disable_all(); - -/** - * Disable an interrupt by masking it - * - * @param n the number of the interrupt: n[7..4] = group number, n[3..0] = individual number. - */ -extern SYSTEMCALL void sys_int_disable(unsigned short n); - -/** - * Enable an interrupt - * - * @param n the number of the interrupt - */ -extern SYSTEMCALL void sys_int_enable(unsigned short n); - -/** - * Register a handler for a given interrupt. - * - * @param n the number of the interrupt - * @param handler pointer to the interrupt handler to register - * - * @return the pointer to the previous interrupt handler - */ -extern SYSTEMCALL p_int_handler sys_int_register(unsigned short n, p_int_handler handler); - -/** - * Return true (non-zero) if an interrupt is pending for the given interrupt - * - * @param n the number of the interrupt: n[7..4] = group number, n[3..0] = individual number. - * - * @return non-zero if interrupt n is pending, 0 if not - */ -extern SYSTEMCALL short sys_int_pending(unsigned short n); - -/** - * Fill out a s_sys_info structure with the information about the current system - * - * @param info pointer to a s_sys_info structure to fill out - */ -extern SYSTEMCALL void sys_get_info(p_sys_info info); - -/** - * Acknowledge an interrupt (clear out its pending flag) - * - * @param n the number of the interrupt: n[7..4] = group number, n[3..0] = individual number. - */ -extern SYSTEMCALL void sys_int_clear(unsigned short n); - -/*** - *** Channel system calls - ***/ - -/** - * Read a single byte from the channel - * - * @param channel the number of the channel - * - * @return the value read (if negative, error) - */ -extern SYSTEMCALL short sys_chan_read_b(short channel); - -/** - * Read bytes from the channel - * - * @param channel the number of the channel - * @param buffer the buffer into which to copy the channel data - * @param size the size of the buffer. - * - * @return number of bytes read, any negative number is an error code - */ -extern SYSTEMCALL short sys_chan_read(short channel, unsigned char * buffer, short size); - -/** - * Read a line of text from the channel - * - * @param channel the number of the channel - * @param buffer the buffer into which to copy the channel data - * @param size the size of the buffer - * - * @return number of bytes read, any negative number is an error code - */ -extern SYSTEMCALL short sys_chan_readline(short channel, unsigned char * buffer, short size); - -/** - * Write a single byte to the device - * - * @param channel the number of the channel - * @param b the byte to write - * - * @return 0 on success, a negative value on error - */ -extern SYSTEMCALL short sys_chan_write_b(short channel, uint8_t b); - -/** - * Write a byte to the channel - * - * @param channel the number of the channel - * @param b the byte to write - * - * @return number of bytes written, any negative number is an error code - */ -extern SYSTEMCALL short sys_chan_write(short channel, const uint8_t * buffer, short size); - -/** - * Return the status of the channel device - * - * @param channel the number of the channel - * - * @return the status of the device - */ -extern SYSTEMCALL short sys_chan_status(short channel); - -/** - * Ensure that any pending writes to teh device have been completed - * - * @param channel the number of the channel - * - * @return 0 on success, any negative number is an error code - */ -extern SYSTEMCALL short sys_chan_flush(short channel); - -/** - * Attempt to set the position of the channel cursor (if supported) - * - * @param channel the number of the channel - * @param position the position of the cursor - * @param base whether the position is absolute or relative to the current position - * - * @return 0 = success, a negative number is an error. - */ -extern SYSTEMCALL short sys_chan_seek(short channel, long position, short base); - -/** - * Issue a control command to the device - * - * @param channel the number of the channel - * @param command the number of the command to send - * @param buffer pointer to bytes of additional data for the command - * @param size the size of the buffer - * - * @return 0 on success, any negative number is an error code - */ -extern SYSTEMCALL short sys_chan_ioctrl(short channel, short command, uint8_t * buffer, short size); - -/** - * Open a channel - * - * @param dev the device number to have a channel opened - * @param path a "path" describing how the device is to be open - * @param mode s the device to be read, written, both? (0x01 = READ flag, 0x02 = WRITE flag, 0x03 = READ and WRITE) - * - * @return the number of the channel opened, negative number on error - */ -extern SYSTEMCALL short sys_chan_open(short dev, const char * path, short mode); - -/** - * Close a channel - * - * @param chan the number of the channel to close - * - * @return nothing useful - */ -extern SYSTEMCALL short sys_chan_close(short chan); - -/** - * Swap the channel ID assignments for two channels - * - * Before call: channel1 = "Channel A", channel2 = "Channel B" - * After call: channel1 = "Channel B", channel2 = "Channel A" - * - * @param channel1 the ID of one of the channels - * @param channel2 the ID of the other channel - * @return 0 on success, any other number is an error - */ -extern SYSTEMCALL short sys_chan_swap(short channel1, short channel2); - -/** - * Return the device associated with the channel - * - * @param channel the ID of the channel to query - * @return the ID of the device associated with the channel, negative number for error - */ -extern SYSTEMCALL short sys_chan_device(short channel); - -/** - * Compute the size information for the text screen based on the current settings in VICKY - * These settings are needed to correctly position text on the screen. - * - * @param screen the screen number 0 for channel A, 1 for channel B - */ -extern SYSTEMCALL void sys_text_setsizes(short chan); - -/*** - *** Block device system calls - ***/ - -/** - * Register a block device driver - * - * @param device pointer to the description of the device to register - * @return 0 on succes, negative number on error - */ -extern SYSTEMCALL short sys_bdev_register(p_dev_block device); - -/** - * Read a block from the device - * - * @param dev the number of the device - * @param lba the logical block address of the block to read - * @param buffer the buffer into which to copy the block data - * @param size the size of the buffer. - * @return number of bytes read, any negative number is an error code - */ -extern SYSTEMCALL short sys_bdev_read(short dev, long lba, uint8_t * buffer, short size); - -/** - * Write a block to the device - * - * @param dev the number of the device - * @param lba the logical block address of the block to write - * @param buffer the buffer containing the data to write - * @param size the size of the buffer. - * @return number of bytes written, any negative number is an error code - */ -extern SYSTEMCALL short sys_bdev_write(short dev, long lba, const uint8_t * buffer, short size); - -/** - * Return the status of the block device - * - * @param dev the number of the device - * @return the status of the device - */ -extern SYSTEMCALL short sys_bdev_status(short dev); - -/** - * Ensure that any pending writes to the device have been completed - * - * @param dev the number of the device - * @return 0 on success, any negative number is an error code - */ -extern SYSTEMCALL short sys_bdev_flush(short dev); - -/** - * Issue a control command to the device - * - * @param dev the number of the device - * @param command the number of the command to send - * @param buffer pointer to bytes of additional data for the command - * @param size the size of the buffer - * @return 0 on success, any negative number is an error code - */ -extern SYSTEMCALL short sys_bdev_ioctrl(short dev, short command, uint8_t * buffer, short size); - -/* - * File System Calls - */ - -/** - * Attempt to open a file given the path to the file and the mode. - * - * @param path the ASCIIZ string containing the path to the file. - * @param mode the mode (e.g. r/w/create) - * - *@return the channel ID for the open file (negative if error) - */ -extern SYSTEMCALL short sys_fsys_open(const char * path, short mode); - -/** - * Close access to a previously open file. - * - * @param fd the channel ID for the file - * - * @return 0 on success, negative number on failure - */ -extern SYSTEMCALL short sys_fsys_close(short fd); - -/** - * Attempt to open a directory for scanning - * - * @param path the path to the directory to open - * - * @return the handle to the directory if >= 0. An error if < 0 - */ -extern SYSTEMCALL short sys_fsys_opendir(const char * path); - -/** - * Close a previously open directory - * - * @param dir the directory handle to close - * - * @return 0 on success, negative number on error - */ -extern SYSTEMCALL short sys_fsys_closedir(short dir); - -/** - * Attempt to read an entry from an open directory - * - * @param dir the handle of the open directory - * @param file pointer to the t_file_info structure to fill out. - * - * @return 0 on success, negative number on failure - */ -extern SYSTEMCALL short sys_fsys_readdir(short dir, p_file_info file); - -/** - * Open a directory given the path and search for the first file matching the pattern. - * - * @param path the path to the directory to search - * @param pattern the file name pattern to search for - * @param file pointer to the t_file_info structure to fill out - * - * @return the directory handle to use for subsequent calls if >= 0, error if negative - */ -extern SYSTEMCALL short sys_fsys_findfirst(const char * path, const char * pattern, p_file_info file); - -/** - * Open a directory given the path and search for the first file matching the pattern. - * - * @param dir the handle to the directory (returned by fsys_findfirst) to search - * @param file pointer to the t_file_info structure to fill out - * - * @return 0 on success, error if negative - */ -extern SYSTEMCALL short sys_fsys_findnext(short dir, p_file_info file); - -/** - * Get the label for the drive holding the path - * - * @param path path to the drive - * @param label buffer that will hold the label... should be at least 35 bytes - * @return 0 on success, error if negative - */ -extern SYSTEMCALL short sys_fsys_get_label(const char * path, char * label); - -/** - * Set the label for the drive holding the path - * - * @param drive drive number - * @param label buffer that holds the label - * @return 0 on success, error if negative - */ -extern SYSTEMCALL short sys_fsys_set_label(short drive, const char * label); - -/** - * Create a directory - * - * @param path the path of the directory to create. - * - * @return 0 on success, negative number on failure. - */ -extern SYSTEMCALL short sys_fsys_mkdir(const char * path); - -/** - * Delete a file or directory - * - * @param path the path of the file or directory to delete. - * - * @return 0 on success, negative number on failure. - */ -extern SYSTEMCALL short sys_fsys_delete(const char * path); - -/** - * Rename a file or directory - * - * @param old_path he current path to the file - * @param new_path the new path for the file - * - * @return 0 on success, negative number on failure. - */ -extern SYSTEMCALL short sys_fsys_rename(const char * old_path, const char * new_path); - -/** - * Change the current working directory (and drive) - * - * @param path the path that should be the new current - * - * @return 0 on success, negative number on failure. - */ -extern SYSTEMCALL short sys_fsys_set_cwd(const char * path); - -/** - * Get the current working drive and directory - * - * @param path the buffer in which to store the directory - * @param size the size of the buffer in bytes - * - * @return 0 on success, negative number on failure. - */ -extern SYSTEMCALL short sys_fsys_get_cwd(char * path, short size); - -/** - * Load a file into memory at the designated destination address. - * - * If destination = 0, the file must be in a recognized binary format - * that specifies its own loading address. - * - * @param path the path to the file to load - * @param destination the destination address (0 for use file's address) - * @param start pointer to the long variable to fill with the starting address - * (0 if not an executable, any other number if file is executable - * with a known starting address) - * - * @return 0 on success, negative number on error - */ -extern SYSTEMCALL short sys_fsys_load(const char * path, uint32_t destination, uint32_t * start); - -/** - * Register a file loading routine - * - * A file loader, takes a channel number to load from and returns a - * short that is the status of the load. - * - * @param extension the file extension to map to - * @param loader pointer to the file load routine to add - * - * @return 0 on success, negative number on error - */ -extern SYSTEMCALL short sys_fsys_register_loader(const char * extension, p_file_loader loader); - -/** - * Check to see if the file is present. - * If it is not, return a file not found error. - * If it is, populate the file info record - * - * @param path the path to the file to check - * @param file pointer to a file info record to fill in, if the file is found. - * @return 0 on success, negative number on error - */ -extern SYSTEMCALL short sys_fsys_stat(const char * path, p_file_info file); - -/** - * Memory - */ - -/** - * Return the top of system RAM... the user program must not use any - * system memory from this address and above. - * - * @return the address of the first byte of reserved system RAM (one above the last byte the user program can use) - */ -extern SYSTEMCALL uint32_t sys_mem_get_ramtop(); - -/** - * Reserve a block of memory at the top of system RAM. - * - * @param bytes the number of bytes to reserve - * @return address of the first byte of the reserved block - */ -extern SYSTEMCALL uint32_t sys_mem_reserve(uint32_t bytes); - -/* - * Miscellaneous - */ - -/** - * Get the number of jiffies since the system last booted. - * - * NOTE: a jiffie is 1/60 of a second. This timer will not be - * 100% precise, so it should be used for timeout purposes - * where precision is not critical. - * - * @return the number of jiffies since the last reset - */ -extern SYSTEMCALL uint32_t sys_time_jiffies(); - -/** - * Set the time on the RTC - * - * @param time pointer to a t_time record containing the correct time - */ -extern SYSTEMCALL void sys_rtc_set_time(p_time time); - -/** - * Get the time on the RTC - * - * @param time pointer to a t_time record in which to put the current time - */ -extern SYSTEMCALL void sys_rtc_get_time(p_time time); - -/** - * Check for any keypress and return the scancode for the key - * - * @return the next scan code from the keyboard... 0 if nothing pending - */ -extern SYSTEMCALL uint16_t sys_kbd_scancode(); - -/** - * Return an error message given an error number - * - * @param err_number the error number - * @return pointer to a string describing the error - */ -extern SYSTEMCALL const char * sys_err_message(short err_number); - -/** - * Set the keyboard translation tables - * - * The translation tables provided to the keyboard consist of eight - * consecutive tables of 128 characters each. Each table maps from - * the MAKE scan code of a key to its appropriate 8-bit character code. - * - * The tables included must include, in order: - * - UNMODIFIED: Used when no modifier keys are pressed or active - * - SHIFT: Used when the SHIFT modifier is pressed - * - CTRL: Used when the CTRL modifier is pressed - * - CTRL-SHIFT: Used when both CTRL and SHIFT are pressed - * - CAPSLOCK: Used when CAPSLOCK is down but SHIFT is not pressed - * - CAPSLOCK-SHIFT: Used when CAPSLOCK is down and SHIFT is pressed - * - ALT: Used when only ALT is presse - * - ALT-SHIFT: Used when ALT is pressed and either CAPSLOCK is down - * or SHIFT is pressed (but not both) - * - * @param tables pointer to the keyboard translation tables - * @return 0 on success, negative number on error - * - */ -extern SYSTEMCALL short sys_kbd_layout(const char * tables); - -/** - * Load and execute an executable file - * - * @param path the path to the executable file - * @param argc the number of arguments passed - * @param argv the array of string arguments - * @return the return result of the program - */ -extern SYSTEMCALL short sys_proc_run(const char * path, int argc, char * argv[]); - -// -// Text screen calls -// - -/** - * Gets the description of a screen's capabilities - * - * @param screen the number of the text device - * - * @return a pointer to the read-only description (0 on error) - */ -extern SYSTEMCALL const p_txt_capabilities sys_txt_get_capabilities(short screen); - -/** - * Set the display mode for the screen - * - * @param screen the number of the text device - * @param mode a bitfield of desired display mode options - * - * @return 0 on success, any other number means the mode is invalid for the screen - */ -extern SYSTEMCALL short sys_txt_set_mode(short screen, short mode); - -/** - * Set the position of the cursor to (x, y) relative to the current region - * If the (x, y) coordinate is outside the region, it will be clipped to the region. - * If y is greater than the height of the region, the region will scroll until that relative - * position would be within view. - * - * @param screen the number of the text device - * @param x the column for the cursor - * @param y the row for the cursor - */ -extern SYSTEMCALL void sys_txt_set_xy(short screen, short x, short y); - -/** - * Get the position of the cursor (x, y) relative to the current region - * - * @param screen the number of the text device - * @param position pointer to a t_point record to fill out - */ -extern SYSTEMCALL void sys_txt_get_xy(short screen, p_point position); - -/** - * Get the current region. - * - * @param screen the number of the text device - * @param region pointer to a t_rect describing the rectangular region (using character cells for size and size) - * - * @return 0 on success, any other number means the region was invalid - */ -extern SYSTEMCALL short sys_txt_get_region(short screen, p_rect region); - -/** - * Set a region to restrict further character display, scrolling, etc. - * Note that a region of zero size will reset the region to the full size of the screen. - * - * @param screen the number of the text device - * @param region pointer to a t_rect describing the rectangular region (using character cells for size and size) - * - * @return 0 on success, any other number means the region was invalid - */ -extern SYSTEMCALL short sys_txt_set_region(short screen, p_rect region); - -/** - * Set the default foreground and background colors for printing - * - * @param screen the number of the text device - * @param foreground the Text LUT index of the new current foreground color (0 - 15) - * @param background the Text LUT index of the new current background color (0 - 15) - */ -extern SYSTEMCALL void sys_txt_set_color(short screen, unsigned char foreground, unsigned char background); - -/* - * Get the foreground and background color for printing - * - * Inputs: - * screen = the screen number 0 for channel A, 1 for channel B - * foreground = pointer to the foreground color number - * background = pointer to the background color number - */ -extern SYSTEMCALL void sys_txt_get_color(short screen, unsigned char * foreground, unsigned char * background); - -/** - * Set if the cursor is visible or not - * - * @param screen the screen number 0 for channel A, 1 for channel B - * @param is_visible TRUE if the cursor should be visible, FALSE (0) otherwise - */ -extern SYSTEMCALL void sys_txt_set_cursor_visible(short screen, short is_visible); - -/** - * Load a font as the current font for the screen - * - * @param screen the number of the text device - * @param width width of a character in pixels - * @param height of a character in pixels - * @param data pointer to the raw font data to be loaded - */ -extern SYSTEMCALL short sys_txt_set_font(short screen, short width, short height, unsigned char * data); - -/** - * Get the display resolutions - * - * @param screen the screen number 0 for channel A, 1 for channel B - * @param text_size the size of the screen in visible characters (may be null) - * @param pixel_size the size of the screen in pixels (may be null) - */ -extern SYSTEMCALL void sys_txt_get_sizes(short screen, p_extent text_size, p_extent pixel_size); - -/** - * Set the size of the border of the screen (if supported) - * - * @param screen the number of the text device - * @param width the horizontal size of one side of the border (0 - 32 pixels) - * @param height the vertical size of one side of the border (0 - 32 pixels) - */ -extern SYSTEMCALL void sys_txt_set_border(short screen, short width, short height); - -/** - * Set the size of the border of the screen (if supported) - * - * @param screen the number of the text device - * @param red the red component of the color (0 - 255) - * @param green the green component of the color (0 - 255) - * @param blue the blue component of the color (0 - 255) - */ -extern SYSTEMCALL void sys_txt_set_border_color(short screen, unsigned char red, unsigned char green, unsigned char blue); - -/** - * Print a character to the current cursor position in the current color - * - * Most character codes will result in a glyph being displayed at the current - * cursor position, advancing the cursor one spot. There are some exceptions that - * will be treated as control codes: - * - * 0x08 - BS - Move the cursor back one position, erasing the character underneath - * 0x09 - HT - Move forward to the next TAB stop - * 0x0A - LF - Move the cursor down one line (line feed) - * 0x0D - CR - Move the cursor to column 0 (carriage return) - * - * @param screen the number of the text device - * @param c the character to print - */ -extern SYSTEMCALL void sys_txt_put(short screen, char c); - -/** - * Print an ASCII Z string to the screen - * - * @param screen the number of the text device - * @param message the ASCII Z string to print - */ -extern SYSTEMCALL void sys_txt_print(short screen, const char * message); - -#endif diff --git a/client/src/stubs.c b/client/src/stubs.c deleted file mode 100644 index 9b38075..0000000 --- a/client/src/stubs.c +++ /dev/null @@ -1,239 +0,0 @@ -/** - * @file stubs.c - * @brief Stubs for Calypsi I/O routines - * @version 0.1 - * @date 2024-09-02 - * - * @copyright Copyright (c) 2024 - * - */ - -#include "include/toolbox.h" - -#include -#include -#include -#include -#include - -#define MAX_FD 16 - -struct s_file_descriptor { - bool is_open; - int public_fd; - short toolbox_fd; -}; - -static bool is_inited = false; -static struct s_file_descriptor file_descriptor[MAX_FD]; - -static void init() { - if (!is_inited) { - is_inited = true; - - // Define stdin - file_descriptor[0].is_open = true; - file_descriptor[0].public_fd = 0; - file_descriptor[0].toolbox_fd = 0; - - // Define stdout - file_descriptor[1].is_open = true; - file_descriptor[1].public_fd = 0; - file_descriptor[1].toolbox_fd = 0; - - // Define stderr - file_descriptor[2].is_open = true; - file_descriptor[2].public_fd = 0; - file_descriptor[2].toolbox_fd = 0; - - for (int i = 3; i < MAX_FD; i++) { - file_descriptor[i].is_open = false; - file_descriptor[i].public_fd = 0; - file_descriptor[i].toolbox_fd = 0; - } - } -} - -/** - * @brief Find a free file descriptor - * - * @return int the index of the available (closed) file descriptor (-1 for error) - */ -static int find_fd() { - for (int i = 3; i < MAX_FD; i++) { - if (!file_descriptor[i].is_open) { - // Found one that is closed... return it's public ID - return file_descriptor[i].public_fd; - } - } - - // Return an error - return -1; -} - -/**************************************************************************** - * Name: _Stub_open - * - * Description: - * Open a file. - * The oflag argument are POSIX style mode flags, e.g O_RDONLY which - * are defined in fcntl.h. - * This function is variadic as it optionally can take a mode_t that - * are permissions, e.g 0666. If the file system does not handle - * permissions you can ignore that this function is variadic. - * The return file descriptor shall be a positive number, larger - * than 2 (as 0-2 are used for stdin, stdout and stderr). - * The actual number does not matter and they need not to be - * consequtive, multiple numeric series with gaps between can be used. - * - * Return the obtained file descriptor or EOF (-1) on failure and set - * errno according to the error. - * - ****************************************************************************/ - -int _Stub_open(const char *path, int oflag, ...) { - int fd = find_fd(); - if (fd >= 0) { - int mode = 0; - - if ((oflag & O_RDONLY) == O_RDONLY) { - mode = FSYS_READ | FSYS_OPEN_EXISTING; - } - - if ((oflag & O_WRONLY) == O_WRONLY) { - mode = FSYS_WRITE; - } - - if ((oflag & O_RDWR) == O_RDWR) { - mode = FSYS_READ | FSYS_WRITE; - } - - if ((oflag & O_CREAT) == O_CREAT) { - mode |= FSYS_CREATE_NEW | FSYS_CREATE_ALWAYS; - } - - short toolbox_fd = sys_fsys_open(path, mode); - if (toolbox_fd >= 0) { - file_descriptor[fd].is_open = true; - file_descriptor[fd].toolbox_fd = toolbox_fd; - - return fd; - } else { - return -1; - } - - } else { - errno = ENFILE; - return -1; - } -} - -/**************************************************************************** - * Name: _Stub_close - * - * Description: - * Close a file - * - * Return 0 if operation was OK, EOF otherwise and set errno according to - * the error. - * Note: This will only be invoked for streams opened by _Stub_open(), - * there is no need to check for the standard descriptor 0-2. - * - ****************************************************************************/ - -int _Stub_close(int fd) { - if (file_descriptor[fd].is_open) { - sys_fsys_close(file_descriptor[fd].toolbox_fd); - file_descriptor[fd].toolbox_fd = 0; - file_descriptor[fd].is_open = false; - } - - return 0; -} - -/**************************************************************************** -* Name: _Stub_lseek -* -* Description: -* Change position in a file -* -* Returns the new position in the file in bytes from the beginning of the -* file, or -1 on failure. -* -****************************************************************************/ - -long _Stub_lseek(int fd, long offset, int whence) { - return 0; -} - -/**************************************************************************** - * Name: _Stub_read - * - * Description: - * Read from a file - * - * Returns the number of characters read. Return -1 on failure and set - * errno according to the error. - * - ****************************************************************************/ - -size_t _Stub_read(int fd, void *buf, size_t count) { - if (file_descriptor[fd].is_open) { - short n = sys_chan_read(file_descriptor[fd].toolbox_fd, (unsigned char *)buf, (short)count); - return n; - } else { - return -1; - } -} - -/**************************************************************************** - * Name: _Stub_write - * - * Description: - * Write to a file - * - * Returns the number of characters actually written. Return -1 on failure and - * set errno according to the error. - * - ****************************************************************************/ - -size_t _Stub_write(int fd, const void *buf, size_t count) { - if (file_descriptor[fd].is_open) { - short n = sys_chan_write(file_descriptor[fd].toolbox_fd, (unsigned char *)buf, (short)count); - return n; - } else { - return -1; - } -} - -/**************************************************************************** - * Name: _Stub_rename - * - * Description: - * Rename a file or directory - * - * Return 0 on success, -1 otherwise and set errno according to the - * error. - * - ****************************************************************************/ - -int _Stub_rename(const char *oldpath, const char *newpath) { - short result = sys_fsys_rename(oldpath, newpath); - return result; -} - -/**************************************************************************** - * Name: _Stub_remove - * - * Description: - * Remove a file or directory - * - * Return 0 on success, -1 otherwise and set errno according to the - * error. - * - ****************************************************************************/ - -int _Stub_remove(const char *path) { - short result = sys_fsys_delete(path); - return result; -} diff --git a/client/src/stubs.lst b/client/src/stubs.lst deleted file mode 100644 index 23cb937..0000000 --- a/client/src/stubs.lst +++ /dev/null @@ -1,603 +0,0 @@ -############################################################################### -# # -# Calypsi ISO C compiler for 65816 version 5.5 # -# 24/Sep/2024 17:04:27 # -# Command line: -I. -I./include -DMODEL=17 -DCPU=255 --code-model large # -# --data-model large -l -o stubs.o stubs.c # -# # -############################################################################### - - \ 000000 .rtmodel version,"1" - \ 000000 .rtmodel codeModel,"large" - \ 000000 .rtmodel dataModel,"large" - \ 000000 .rtmodel core,"65816" - \ 000000 .rtmodel huge,"0" - \ 000000 .extern _Dp - \ 000000 .extern _Mul16 - \ 000000 .extern _Vfp - \ 000000 .extern errno - \ 000000 .extern sys_chan_read - \ 000000 .extern sys_chan_write - \ 000000 .extern sys_fsys_close - \ 000000 .extern sys_fsys_delete - \ 000000 .extern sys_fsys_open - \ 000000 .extern sys_fsys_rename -0001 /** -0002 * @file stubs.c -0003 * @brief Stubs for Calypsi I/O routines -0004 * @version 0.1 -0005 * @date 2024-09-02 -0006 * -0007 * @copyright Copyright (c) 2024 -0008 * -0009 */ -0010 -0011 #include "include/toolbox.h" -0012 -0013 #include -0014 #include -0015 #include -0016 #include -0017 #include -0018 -0019 #define MAX_FD 16 -0020 -0021 struct s_file_descriptor { -0022 bool is_open; -0023 int public_fd; -0024 short toolbox_fd; -0025 }; -0026 -0027 static bool is_inited = false; - \ 000000 .section zfar,bss - \ 000000 is_inited: .space 2 -0028 static struct s_file_descriptor file_descriptor[MAX_FD]; - \ 000000 .section zfar,bss - \ 000000 file_descriptor: - \ 000000 .space 96 -0029 -0030 static void init() { -0031 if (!is_inited) { -0032 is_inited = true; -0033 -0034 // Define stdin -0035 file_descriptor[0].is_open = true; -0036 file_descriptor[0].public_fd = 0; -0037 file_descriptor[0].toolbox_fd = 0; -0038 -0039 // Define stdout -0040 file_descriptor[1].is_open = true; -0041 file_descriptor[1].public_fd = 0; -0042 file_descriptor[1].toolbox_fd = 0; -0043 -0044 // Define stderr -0045 file_descriptor[2].is_open = true; -0046 file_descriptor[2].public_fd = 0; -0047 file_descriptor[2].toolbox_fd = 0; -0048 -0049 for (int i = 3; i < MAX_FD; i++) { -0050 file_descriptor[i].is_open = false; -0051 file_descriptor[i].public_fd = 0; -0052 file_descriptor[i].toolbox_fd = 0; -0053 } -0054 } -0055 } -0056 -0057 /** -0058 * @brief Find a free file descriptor -0059 * -0060 * @return int the index of the available (closed) file descriptor (-1 for error) -0061 */ -0062 static int find_fd() { - \ 000000 .section farcode,text - \ 000000 5a find_fd: phy -0063 for (int i = 3; i < MAX_FD; i++) { - \ 000001 a90300 lda ##3 - \ 000004 8301 sta 1,s - \ 000006 a301 lda 1,s - \ 000008 8301 sta 1,s - \ 00000a a301 `?L15`: lda 1,s - \ 00000c 38 sec - \ 00000d e91000 sbc ##16 - \ 000010 5003 bvc `?L82` - \ 000012 490080 eor ##-32768 - \ 000015 3005 `?L82`: bmi `?L14` -0064 if (!file_descriptor[i].is_open) { -0065 // Found one that is closed... return it's public ID -0066 return file_descriptor[i].public_fd; -0067 } -0068 } -0069 -0070 // Return an error -0071 return -1; - \ 000017 a9ffff lda ##-1 - \ 00001a 8031 bra `?L13` - \ 00001c a301 `?L14`: lda 1,s - \ 00001e a20600 ldx ##6 - \ 000021 22...... jsl long:_Mul16 - \ 000025 aa tax - \ 000026 bf...... lda long:file_descriptor,x - \ 00002a d023 bne `?L18` - \ 00002c a9.... lda ##.word0 file_descriptor - \ 00002f 85.. sta dp:.tiny _Dp - \ 000031 a9.... lda ##.word2 file_descriptor - \ 000034 85.. sta dp:.tiny (_Dp+2) - \ 000036 a301 lda 1,s - \ 000038 a20600 ldx ##6 - \ 00003b 22...... jsl long:_Mul16 - \ 00003f 85.. sta dp:.tiny (_Dp+4) - \ 000041 18 clc - \ 000042 a5.. lda dp:.tiny _Dp - \ 000044 65.. adc dp:.tiny (_Dp+4) - \ 000046 85.. sta dp:.tiny _Dp - \ 000048 a00200 ldy ##2 - \ 00004b b7.. lda [.tiny _Dp],y - \ 00004d `?L13`: -0072 } - \ 00004d 7a ply - \ 00004e 6b rtl - \ 00004f a301 `?L18`: lda 1,s - \ 000051 1a inc a - \ 000052 8301 sta 1,s - \ 000054 80b4 bra `?L15` -0073 -0074 /**************************************************************************** -0075 * Name: _Stub_open -0076 * -0077 * Description: -0078 * Open a file. -0079 * The oflag argument are POSIX style mode flags, e.g O_RDONLY which -0080 * are defined in fcntl.h. -0081 * This function is variadic as it optionally can take a mode_t that -0082 * are permissions, e.g 0666. If the file system does not handle -0083 * permissions you can ignore that this function is variadic. -0084 * The return file descriptor shall be a positive number, larger -0085 * than 2 (as 0-2 are used for stdin, stdout and stderr). -0086 * The actual number does not matter and they need not to be -0087 * consequtive, multiple numeric series with gaps between can be used. -0088 * -0089 * Return the obtained file descriptor or EOF (-1) on failure and set -0090 * errno according to the error. -0091 * -0092 ****************************************************************************/ -0093 -0094 int _Stub_open(const char *path, int oflag, ...) { - \ 000000 .section farcode,text - \ 000000 .public _Stub_open - \ 000000 _Stub_open: - \ 000000 d4.. pei dp:.tiny (_Dp+8) - \ 000002 d4.. pei dp:.tiny (_Dp+10) - \ 000004 5a phy - \ 000005 5a phy - \ 000006 5a phy - \ 000007 8303 sta 3,s - \ 000009 a5.. lda dp:.tiny _Dp - \ 00000b 85.. sta dp:.tiny (_Dp+8) - \ 00000d a5.. lda dp:.tiny (_Dp+2) - \ 00000f 85.. sta dp:.tiny (_Dp+10) -0095 int fd = find_fd(); - \ 000011 22...... jsl long:find_fd - \ 000015 8305 sta 5,s -0096 if (fd >= 0) { - \ 000017 a305 lda 5,s - \ 000019 1003 bpl `?L103` - \ 00001b 4c.... jmp .kbank `?L26` - \ 00001e `?L103`: -0097 int mode = 0; - \ 00001e a90000 lda ##0 - \ 000021 8301 sta 1,s -0098 -0099 if ((oflag & O_RDONLY) == O_RDONLY) { - \ 000023 a90100 lda ##1 - \ 000026 2303 and 3,s - \ 000028 c90100 cmp ##1 - \ 00002b d00b bne `?L29` -0100 mode = FSYS_READ | FSYS_OPEN_EXISTING; - \ 00002d a90100 lda ##1 - \ 000030 8301 sta 1,s - \ 000032 a301 lda 1,s - \ 000034 8301 sta 1,s - \ 000036 8004 bra `?L30` - \ 000038 a301 `?L29`: lda 1,s - \ 00003a 8301 sta 1,s - \ 00003c `?L30`: -0101 } -0102 -0103 if ((oflag & O_WRONLY) == O_WRONLY) { - \ 00003c a90200 lda ##2 - \ 00003f 2303 and 3,s - \ 000041 c90200 cmp ##2 - \ 000044 d00b bne `?L32` -0104 mode = FSYS_WRITE; - \ 000046 a90200 lda ##2 - \ 000049 8301 sta 1,s - \ 00004b a301 lda 1,s - \ 00004d 8301 sta 1,s - \ 00004f 8004 bra `?L33` - \ 000051 a301 `?L32`: lda 1,s - \ 000053 8301 sta 1,s - \ 000055 `?L33`: -0105 } -0106 -0107 if ((oflag & O_RDWR) == O_RDWR) { - \ 000055 a90300 lda ##3 - \ 000058 2303 and 3,s - \ 00005a c90300 cmp ##3 - \ 00005d d00b bne `?L35` -0108 mode = FSYS_READ | FSYS_WRITE; - \ 00005f a90300 lda ##3 - \ 000062 8301 sta 1,s - \ 000064 a301 lda 1,s - \ 000066 8301 sta 1,s - \ 000068 8004 bra `?L36` - \ 00006a a301 `?L35`: lda 1,s - \ 00006c 8301 sta 1,s - \ 00006e `?L36`: -0109 } -0110 -0111 if ((oflag & O_CREAT) == O_CREAT) { - \ 00006e a90400 lda ##4 - \ 000071 2303 and 3,s - \ 000073 c90400 cmp ##4 - \ 000076 d00d bne `?L38` -0112 mode |= FSYS_CREATE_NEW | FSYS_CREATE_ALWAYS; - \ 000078 a90c00 lda ##12 - \ 00007b 0301 ora 1,s - \ 00007d 8301 sta 1,s - \ 00007f a301 lda 1,s - \ 000081 8301 sta 1,s - \ 000083 8004 bra `?L39` - \ 000085 a301 `?L38`: lda 1,s - \ 000087 8301 sta 1,s - \ 000089 `?L39`: -0113 } -0114 -0115 short toolbox_fd = sys_fsys_open(path, mode); - \ 000089 a301 lda 1,s - \ 00008b 48 pha - \ 00008c a6.. ldx dp:.tiny (_Dp+10) - \ 00008e a5.. lda dp:.tiny (_Dp+8) - \ 000090 22...... jsl long:sys_fsys_open - \ 000094 aa tax - \ 000095 68 pla - \ 000096 8a txa - \ 000097 8301 sta 1,s -0116 if (toolbox_fd >= 0) { - \ 000099 a301 lda 1,s - \ 00009b 3038 bmi `?L41` -0117 file_descriptor[fd].is_open = true; - \ 00009d a305 lda 5,s - \ 00009f a20600 ldx ##6 - \ 0000a2 22...... jsl long:_Mul16 - \ 0000a6 aa tax - \ 0000a7 a90100 lda ##1 - \ 0000aa 9f...... sta long:file_descriptor,x -0118 file_descriptor[fd].toolbox_fd = toolbox_fd; - \ 0000ae a2.... ldx ##.word0 file_descriptor - \ 0000b1 86.. stx dp:.tiny _Dp - \ 0000b3 a2.... ldx ##.word2 file_descriptor - \ 0000b6 86.. stx dp:.tiny (_Dp+2) - \ 0000b8 a305 lda 5,s - \ 0000ba a20600 ldx ##6 - \ 0000bd 22...... jsl long:_Mul16 - \ 0000c1 85.. sta dp:.tiny (_Dp+4) - \ 0000c3 18 clc - \ 0000c4 a5.. lda dp:.tiny _Dp - \ 0000c6 65.. adc dp:.tiny (_Dp+4) - \ 0000c8 85.. sta dp:.tiny _Dp - \ 0000ca a301 lda 1,s - \ 0000cc a00400 ldy ##4 - \ 0000cf 97.. sta [.tiny _Dp],y -0119 -0120 return fd; - \ 0000d1 a305 lda 5,s - \ 0000d3 800f bra `?L25` - \ 0000d5 `?L41`: -0121 } else { -0122 return -1; - \ 0000d5 a9ffff lda ##-1 - \ 0000d8 800a bra `?L25` - \ 0000da `?L26`: -0123 } -0124 -0125 } else { -0126 errno = ENFILE; - \ 0000da a91700 lda ##23 - \ 0000dd 8f...... sta long:errno -0127 return -1; - \ 0000e1 a9ffff lda ##-1 - \ 0000e4 `?L25`: -0128 } -0129 } - \ 0000e4 7a ply - \ 0000e5 7a ply - \ 0000e6 7a ply - \ 0000e7 7a ply - \ 0000e8 84.. sty dp:.tiny (_Dp+10) - \ 0000ea 7a ply - \ 0000eb 84.. sty dp:.tiny (_Dp+8) - \ 0000ed 6b rtl -0130 -0131 /**************************************************************************** -0132 * Name: _Stub_close -0133 * -0134 * Description: -0135 * Close a file -0136 * -0137 * Return 0 if operation was OK, EOF otherwise and set errno according to -0138 * the error. -0139 * Note: This will only be invoked for streams opened by _Stub_open(), -0140 * there is no need to check for the standard descriptor 0-2. -0141 * -0142 ****************************************************************************/ -0143 -0144 int _Stub_close(int fd) { - \ 000000 .section farcode,text - \ 000000 .public _Stub_close - \ 000000 _Stub_close: - \ 000000 5a phy - \ 000001 8301 sta 1,s -0145 if (file_descriptor[fd].is_open) { - \ 000003 a301 lda 1,s - \ 000005 a20600 ldx ##6 - \ 000008 22...... jsl long:_Mul16 - \ 00000c aa tax - \ 00000d bf...... lda long:file_descriptor,x - \ 000011 f05a beq `?L50` -0146 sys_fsys_close(file_descriptor[fd].toolbox_fd); - \ 000013 a9.... lda ##.word0 file_descriptor - \ 000016 85.. sta dp:.tiny _Dp - \ 000018 a9.... lda ##.word2 file_descriptor - \ 00001b 85.. sta dp:.tiny (_Dp+2) - \ 00001d a301 lda 1,s - \ 00001f a20600 ldx ##6 - \ 000022 22...... jsl long:_Mul16 - \ 000026 85.. sta dp:.tiny (_Dp+4) - \ 000028 18 clc - \ 000029 a5.. lda dp:.tiny _Dp - \ 00002b 65.. adc dp:.tiny (_Dp+4) - \ 00002d 85.. sta dp:.tiny _Dp - \ 00002f a00400 ldy ##4 - \ 000032 b7.. lda [.tiny _Dp],y - \ 000034 22...... jsl long:sys_fsys_close -0147 file_descriptor[fd].toolbox_fd = 0; - \ 000038 a2.... ldx ##.word0 file_descriptor - \ 00003b 86.. stx dp:.tiny _Dp - \ 00003d a2.... ldx ##.word2 file_descriptor - \ 000040 86.. stx dp:.tiny (_Dp+2) - \ 000042 a301 lda 1,s - \ 000044 a20600 ldx ##6 - \ 000047 22...... jsl long:_Mul16 - \ 00004b 85.. sta dp:.tiny (_Dp+4) - \ 00004d 18 clc - \ 00004e a5.. lda dp:.tiny _Dp - \ 000050 65.. adc dp:.tiny (_Dp+4) - \ 000052 85.. sta dp:.tiny _Dp - \ 000054 a90000 lda ##0 - \ 000057 a00400 ldy ##4 - \ 00005a 97.. sta [.tiny _Dp],y -0148 file_descriptor[fd].is_open = false; - \ 00005c a301 lda 1,s - \ 00005e a20600 ldx ##6 - \ 000061 22...... jsl long:_Mul16 - \ 000065 aa tax - \ 000066 a90000 lda ##0 - \ 000069 9f...... sta long:file_descriptor,x - \ 00006d `?L50`: - \ 00006d `?L51`: -0149 } -0150 -0151 return 0; - \ 00006d a90000 lda ##0 -0152 } - \ 000070 7a ply - \ 000071 6b rtl -0153 -0154 /**************************************************************************** -0155 * Name: _Stub_lseek -0156 * -0157 * Description: -0158 * Change position in a file -0159 * -0160 * Returns the new position in the file in bytes from the beginning of the -0161 * file, or -1 on failure. -0162 * -0163 ****************************************************************************/ -0164 -0165 long _Stub_lseek(int fd, long offset, int whence) { - \ 000000 .section farcode,text - \ 000000 .public _Stub_lseek - \ 000000 _Stub_lseek: -0166 return 0; - \ 000000 a90000 lda ##0 - \ 000003 a20000 ldx ##0 -0167 } - \ 000006 6b rtl -0168 -0169 /**************************************************************************** -0170 * Name: _Stub_read -0171 * -0172 * Description: -0173 * Read from a file -0174 * -0175 * Returns the number of characters read. Return -1 on failure and set -0176 * errno according to the error. -0177 * -0178 ****************************************************************************/ -0179 -0180 size_t _Stub_read(int fd, void *buf, size_t count) { - \ 000000 .section farcode,text - \ 000000 .public _Stub_read - \ 000000 5a _Stub_read: phy - \ 000001 8301 sta 1,s -0181 if (file_descriptor[fd].is_open) { - \ 000003 a301 lda 1,s - \ 000005 a20600 ldx ##6 - \ 000008 22...... jsl long:_Mul16 - \ 00000c aa tax - \ 00000d bf...... lda long:file_descriptor,x - \ 000011 f035 beq `?L61` -0182 short n = sys_chan_read(file_descriptor[fd].toolbox_fd, (unsigned char *)buf, (short)count); - \ 000013 a5.. lda dp:.tiny (_Dp+4) - \ 000015 48 pha - \ 000016 a5.. lda dp:.tiny (_Dp+2) - \ 000018 48 pha - \ 000019 a5.. lda dp:.tiny _Dp - \ 00001b 48 pha - \ 00001c a9.... lda ##.word0 file_descriptor - \ 00001f 85.. sta dp:.tiny _Dp - \ 000021 a9.... lda ##.word2 file_descriptor - \ 000024 85.. sta dp:.tiny (_Dp+2) - \ 000026 a307 lda 7,s - \ 000028 a20600 ldx ##6 - \ 00002b 22...... jsl long:_Mul16 - \ 00002f 85.. sta dp:.tiny (_Dp+4) - \ 000031 18 clc - \ 000032 a5.. lda dp:.tiny _Dp - \ 000034 65.. adc dp:.tiny (_Dp+4) - \ 000036 85.. sta dp:.tiny _Dp - \ 000038 a00400 ldy ##4 - \ 00003b b7.. lda [.tiny _Dp],y - \ 00003d 22...... jsl long:sys_chan_read - \ 000041 aa tax - \ 000042 68 pla - \ 000043 68 pla - \ 000044 68 pla -0183 return n; - \ 000045 8a txa - \ 000046 8003 bra `?L60` - \ 000048 `?L61`: -0184 } else { -0185 return -1; - \ 000048 a9ffff lda ##-1 - \ 00004b `?L60`: -0186 } -0187 } - \ 00004b 7a ply - \ 00004c 6b rtl -0188 -0189 /**************************************************************************** -0190 * Name: _Stub_write -0191 * -0192 * Description: -0193 * Write to a file -0194 * -0195 * Returns the number of characters actually written. Return -1 on failure and -0196 * set errno according to the error. -0197 * -0198 ****************************************************************************/ -0199 -0200 size_t _Stub_write(int fd, const void *buf, size_t count) { - \ 000000 .section farcode,text - \ 000000 .public _Stub_write - \ 000000 _Stub_write: - \ 000000 5a phy - \ 000001 8301 sta 1,s -0201 if (file_descriptor[fd].is_open) { - \ 000003 a301 lda 1,s - \ 000005 a20600 ldx ##6 - \ 000008 22...... jsl long:_Mul16 - \ 00000c aa tax - \ 00000d bf...... lda long:file_descriptor,x - \ 000011 f035 beq `?L69` -0202 short n = sys_chan_write(file_descriptor[fd].toolbox_fd, (unsigned char *)buf, (short)count); - \ 000013 a5.. lda dp:.tiny (_Dp+4) - \ 000015 48 pha - \ 000016 a5.. lda dp:.tiny (_Dp+2) - \ 000018 48 pha - \ 000019 a5.. lda dp:.tiny _Dp - \ 00001b 48 pha - \ 00001c a9.... lda ##.word0 file_descriptor - \ 00001f 85.. sta dp:.tiny _Dp - \ 000021 a9.... lda ##.word2 file_descriptor - \ 000024 85.. sta dp:.tiny (_Dp+2) - \ 000026 a307 lda 7,s - \ 000028 a20600 ldx ##6 - \ 00002b 22...... jsl long:_Mul16 - \ 00002f 85.. sta dp:.tiny (_Dp+4) - \ 000031 18 clc - \ 000032 a5.. lda dp:.tiny _Dp - \ 000034 65.. adc dp:.tiny (_Dp+4) - \ 000036 85.. sta dp:.tiny _Dp - \ 000038 a00400 ldy ##4 - \ 00003b b7.. lda [.tiny _Dp],y - \ 00003d 22...... jsl long:sys_chan_write - \ 000041 aa tax - \ 000042 68 pla - \ 000043 68 pla - \ 000044 68 pla -0203 return n; - \ 000045 8a txa - \ 000046 8003 bra `?L68` - \ 000048 `?L69`: -0204 } else { -0205 return -1; - \ 000048 a9ffff lda ##-1 - \ 00004b `?L68`: -0206 } -0207 } - \ 00004b 7a ply - \ 00004c 6b rtl -0208 -0209 /**************************************************************************** -0210 * Name: _Stub_rename -0211 * -0212 * Description: -0213 * Rename a file or directory -0214 * -0215 * Return 0 on success, -1 otherwise and set errno according to the -0216 * error. -0217 * -0218 ****************************************************************************/ -0219 -0220 int _Stub_rename(const char *oldpath, const char *newpath) { - \ 000000 .section farcode,text - \ 000000 .public _Stub_rename - \ 000000 _Stub_rename: -0221 short result = sys_fsys_rename(oldpath, newpath); - \ 000000 a5.. lda dp:.tiny (_Dp+6) - \ 000002 48 pha - \ 000003 a5.. lda dp:.tiny (_Dp+4) - \ 000005 48 pha - \ 000006 a6.. ldx dp:.tiny (_Dp+2) - \ 000008 a5.. lda dp:.tiny _Dp - \ 00000a 22...... jsl long:sys_fsys_rename - \ 00000e aa tax - \ 00000f 68 pla - \ 000010 68 pla -0222 return result; - \ 000011 8a txa -0223 } - \ 000012 6b rtl -0224 -0225 /**************************************************************************** -0226 * Name: _Stub_remove -0227 * -0228 * Description: -0229 * Remove a file or directory -0230 * -0231 * Return 0 on success, -1 otherwise and set errno according to the -0232 * error. -0233 * -0234 ****************************************************************************/ -0235 -0236 int _Stub_remove(const char *path) { - \ 000000 .section farcode,text - \ 000000 .public _Stub_remove - \ 000000 _Stub_remove: -0237 short result = sys_fsys_delete(path); - \ 000000 a6.. ldx dp:.tiny (_Dp+2) - \ 000002 a5.. lda dp:.tiny _Dp - \ 000004 22...... jsl long:sys_fsys_delete -0238 return result; -0239 } - \ 000008 6b rtl - -########################## -# # -# Memory sizes (decimal) # -# # -########################## - -Executable (Text): 627 bytes -Zero initialized __far (BSS): 98 bytes diff --git a/progheader.md b/docs/progheader.md similarity index 100% rename from progheader.md rename to docs/progheader.md diff --git a/roms/f256jr/README.md b/roms/f256jr/README.md index 39bdc81..878b3e2 100644 --- a/roms/f256jr/README.md +++ b/roms/f256jr/README.md @@ -1,6 +1,6 @@ -# ROM Files for the F256jr +# ROM Files for the F256JRe -This directory contains BIN files for programming the F256jr flash memory with the Foenix Toolbox. +This directory contains BIN files for programming the F256JRe flash memory with the Foenix Toolbox. ## How to Install diff --git a/roms/f256jr/toolbox-20.bin b/roms/f256jr/toolbox-20.bin index 1bc7080..976056c 100644 Binary files a/roms/f256jr/toolbox-20.bin and b/roms/f256jr/toolbox-20.bin differ diff --git a/roms/f256jr/toolbox-21.bin b/roms/f256jr/toolbox-21.bin index d1fc687..4a7e5fe 100644 Binary files a/roms/f256jr/toolbox-21.bin and b/roms/f256jr/toolbox-21.bin differ diff --git a/roms/f256jr/toolbox-22.bin b/roms/f256jr/toolbox-22.bin index 2dd0305..1d5a8c7 100644 Binary files a/roms/f256jr/toolbox-22.bin and b/roms/f256jr/toolbox-22.bin differ diff --git a/roms/f256jr/toolbox-23.bin b/roms/f256jr/toolbox-23.bin index 267c9c5..5ad492b 100644 Binary files a/roms/f256jr/toolbox-23.bin and b/roms/f256jr/toolbox-23.bin differ diff --git a/roms/f256jr/toolbox-24.bin b/roms/f256jr/toolbox-24.bin index b326b2c..516c4c8 100644 Binary files a/roms/f256jr/toolbox-24.bin and b/roms/f256jr/toolbox-24.bin differ diff --git a/roms/f256jr/toolbox-25.bin b/roms/f256jr/toolbox-25.bin index 2b833df..89881d6 100644 Binary files a/roms/f256jr/toolbox-25.bin and b/roms/f256jr/toolbox-25.bin differ diff --git a/roms/f256jr/toolbox-26.bin b/roms/f256jr/toolbox-26.bin index fba3519..54992dc 100644 Binary files a/roms/f256jr/toolbox-26.bin and b/roms/f256jr/toolbox-26.bin differ diff --git a/roms/f256jr/toolbox-27.bin b/roms/f256jr/toolbox-27.bin index 528bd24..5d4b28c 100644 Binary files a/roms/f256jr/toolbox-27.bin and b/roms/f256jr/toolbox-27.bin differ diff --git a/roms/f256jr/toolbox-28.bin b/roms/f256jr/toolbox-28.bin index cdb75fa..d718964 100644 Binary files a/roms/f256jr/toolbox-28.bin and b/roms/f256jr/toolbox-28.bin differ diff --git a/roms/f256jr/toolbox-29.bin b/roms/f256jr/toolbox-29.bin index 3b2728b..20e3b3f 100644 Binary files a/roms/f256jr/toolbox-29.bin and b/roms/f256jr/toolbox-29.bin differ diff --git a/roms/f256jr/toolbox-2A.bin b/roms/f256jr/toolbox-2A.bin index 7da2c98..9486ee1 100644 Binary files a/roms/f256jr/toolbox-2A.bin and b/roms/f256jr/toolbox-2A.bin differ diff --git a/roms/f256jr/toolbox-2B.bin b/roms/f256jr/toolbox-2B.bin index 1552f4e..55fd692 100644 Binary files a/roms/f256jr/toolbox-2B.bin and b/roms/f256jr/toolbox-2B.bin differ diff --git a/roms/f256jr/toolbox-2C.bin b/roms/f256jr/toolbox-2C.bin index 53cfaae..b2f838f 100644 Binary files a/roms/f256jr/toolbox-2C.bin and b/roms/f256jr/toolbox-2C.bin differ diff --git a/roms/f256jr/toolbox-2D.bin b/roms/f256jr/toolbox-2D.bin index 5feafd6..7c9653c 100644 Binary files a/roms/f256jr/toolbox-2D.bin and b/roms/f256jr/toolbox-2D.bin differ diff --git a/roms/f256jr/toolbox-2E.bin b/roms/f256jr/toolbox-2E.bin index 3481e3b..42159c5 100644 Binary files a/roms/f256jr/toolbox-2E.bin and b/roms/f256jr/toolbox-2E.bin differ diff --git a/roms/f256jr/toolbox-2F.bin b/roms/f256jr/toolbox-2F.bin index ee70acb..6c11dec 100644 Binary files a/roms/f256jr/toolbox-2F.bin and b/roms/f256jr/toolbox-2F.bin differ diff --git a/roms/f256jr/toolbox-30.bin b/roms/f256jr/toolbox-30.bin index 9e27814..5d043a5 100644 Binary files a/roms/f256jr/toolbox-30.bin and b/roms/f256jr/toolbox-30.bin differ diff --git a/roms/f256jr/toolbox-31.bin b/roms/f256jr/toolbox-31.bin deleted file mode 100644 index 9738909..0000000 Binary files a/roms/f256jr/toolbox-31.bin and /dev/null differ diff --git a/roms/f256jr/toolbox-3F.bin b/roms/f256jr/toolbox-3F.bin index 6568b59..9ff3b29 100644 Binary files a/roms/f256jr/toolbox-3F.bin and b/roms/f256jr/toolbox-3F.bin differ diff --git a/roms/f256jr/toolbox.bin b/roms/f256jr/toolbox.bin index b9ee8c1..23da074 100644 --- a/roms/f256jr/toolbox.bin +++ b/roms/f256jr/toolbox.bin @@ -1,61 +1,43 @@ -9;<=>?@AB /,123456ABCD - -> OK.*111213141517181920212324303132OVsd0sd1 RAMROM%d:/fd38668K86088K960ARMELFM32PGXPGZPPCRCESPU 0ODDSD0SD1INFNaN %s -None%02XGenXEVID/sd0FILEFR20MIPSNONEPGXRH32S370S390V800COM1COM2EVENMARK %s/ -%02X %04X /sd0/%s%s -%04X:%d:%sIAMCUPPC64SPARCSPACE %4ld %s%08XC256 UF256 PGenX32M68020M68030M68040(null)dev = PARISCVPP500SCREEN+,;=[]%s%s%s +9;<=>?@AB /,123456ABCDOK.*111213141517181920212324303132OVsd0sd1 RAMROM%d:38668K86088K960ARMELFM32PGXPGZPPCRCESPUODDSD0SD1INFNaNNone %s +%02XGenXEVID/sd0FILEFR20MIPSNONEPGXRH32S370S390V800COM1COM2EVENMARK%s%s +%04X:%d:%sIAMCUPPC64SPARCSPACE%02X %s%08XC256 UF256 PGenX32M68020M68030M68040(null)dev = PARISCVPP500SCREEN+,;=[]%s%s%s %s: %s %024lX:A2560 KA2560 MA2560 XC256 U+F256 JRF256 K2F256 KeM68040VUNKNOWNi486DX4*float*CONSOLE%s: #%d no mediaA2560 U+C256 FMXF256 JReF256 K2cF256 K2eM680EC30M68EC020M68EC040ReservedWDC65816rtc_init*:<>|"?FAT32 Sector: -not foundCartridge(g(5(''X< em]mUmMmEm:K:K:KJIA2560 K40A2560 K60M68SEC000chan_openChannel: PSG Muted.bad handlei486DX2 50i486DX2 60fchan_readCPU %s +not foundCartridge!!n!+! ( Ӹ8l0l(l llDDDCCA2560 K40A2560 K60M68SEC000chan_openChannel: PSG Muted.bad handlei486DX2 50i486DX2 60fchan_readfile lockedCPU %s Model %s -file lockedA2560X - LBA2560X - PBGenX32 - LBGenX32 - PBchan_free: MIPS_RS3_LESPARC32PLUSfsys_mkfs: MSDOS5.0fsys_opendirbad argumentExternal SDCInternal SDCprint(%d,..)fchan_read_b /sd0/test.txtfsys_closediraccess deniedgeneral errorinvalid drivemedia changednot supportedout of boundsout of memoryunknown errorA2560X - CUBEGenX32 - CUBEchan_read: %sآɢ[&[ [[[ [[@ /sd0/hello.txtHello, world! -Memory %d KB -file not foundinvalid objectout of handleschan_alloc(%d)chan_close(%d)chan_alloc: %dloader found: bad binary filenot enough coreflush error: %dFATFS Error: %dfsys_setlabel: /sd0/renamed.txtClock %lu MHz -Got channel #%d -device not ready/sd0/fnxboot.pgx/sd0/fnxboot.pgz/sd1/fnxboot.pgx/sd1/fnxboot.pgzBooting from %s -0123456789ABCDEFcdev_init_systemcdev_register %s -Contents of %s: -bad device numberinvalid path nameprohibited accessunknown file typeF%d-%s -proc_exec stack: proc_exec start: ߋ͋q+.,;=[]/*:<>|\"?ukaWMCCODEC initialized.Console installed.Interrupts enabledTimers initializedbad channel numberCommand not found.Mounting drive #%dfsys_mkdir error: directory not foundfile system timeoutoperation timed outtoo many open fileschan_read(%d,%p,%d)chan_seek error: %dFile system error: fchan_write error: fsys_delete error: fsys_load_ext ext: fsys_open error: %d -` ]sf'fNO NAME FAT NO NAME FAT32 low level disk errorno file system foundchan_get_records 1: chan_get_records 2: chan_write error: %dchan_write(%d,%p,%x)fsys_set_cwd error: -Directory for /sd0/ -Foenix Retro Systems -SDC driver installed.Wrote %d characters. -chan_status error: %dCould not load file: Could not open file: uart_open: Bad parity}`C& -Trying to create: %s -Indicators initializedInterrupts initializedToolbox v%d.%02d.%04d -file is not executableCouldn't load file: %dchan_write_b error: %dFPGA %04X %04X.%04X -volume has no work area w#h+]-N0?1Xopux PGZ 24-bit count: %06lxPGZ 32-bit count: %08lxSetting default loader.uart_open: no BPS token}}}l}l} l}Could not open file: %d -File system initialized.Text system initialized.drive is write protected +A2560X - LBA2560X - PBGenX32 - LBGenX32 - PBchan_free: MIPS_RS3_LESPARC32PLUSfsys_mkfs: MSDOS5.0bad argumentExternal SDCInternal SDCprint(%d,..)fchan_read_b access deniedgeneral errorinvalid drivemedia changednot supportedout of boundsout of memoryunknown errorproc_exit: %dA2560X - CUBEGenX32 - CUBEchan_read: %seVG83*!*UoTiTcT*UiT*U@ file not foundinvalid objectout of handlesMemory %d KB +proc_set_shellchan_alloc(%d)chan_close(%d)chan_alloc: %dloader found: bad binary filenot enough coreproc_get_resultflush error: %dFATFS Error: %dfsys_setlabel: device not ready/sd0/fnxboot.pgx/sd0/fnxboot.pgz/sd1/fnxboot.pgx/sd1/fnxboot.pgzBooting from %s +Clock %lu MHz +0123456789ABCDEFcdev_init_systemcdev_register %sbad device numberinvalid path nameprohibited accessunknown file typeF%d-%s +proc_exec stack: proc_exec start: VD2 ׄĄ+.,;=[]/*:<>|\"?R;1' CODEC initialized.Console installed.Interrupts enabledTimers initializedTop of memory: %lxbad channel numberCommand not found.Mounting drive #%dfsys_mkdir error: directory not foundfile system timeoutoperation timed outtoo many open fileschan_read(%d,%p,%d)chan_seek error: %dFile system error: fchan_write error: fsys_delete error: fsys_load_ext ext: fsys_open error: %di 6 + 'NO NAME FAT NO NAME FAT32 low level disk errorno file system foundchan_get_records 1: chan_get_records 2: chan_write error: %dchan_write(%d,%p,%x)fsys_set_cwd error: SDC driver installed.Foenix Retro Systems +chan_status error: %dCould not load file: Could not open file: uart_open: Bad parityW0 |_?Indicators initializedInterrupts initializedfile is not executableToolbox v%d.%02d.%04d +Couldn't load file: %dchan_write_b error: %dvolume has no work areaFPGA %04X %04X.%04X +S ?#0+%-0XqodpuxPGZ 24-bit count: %06lxPGZ 32-bit count: %08lxSetting default loader.uart_open: no BPS token{}{}{V{V{ V{File system initialized.Text system initialized.drive is write protected Select a boot source: Default boot source: %s -Error while printing: %dCouldn't get channel: %dReached end of PGZ file.fsys_open out of handlesCould not find screen %duart_open: Bad stop bits -Creating /sd0/hello.txt -%04d-%02d-%02d %02d:%02d could not write to devicedevice is write protectedCouldn't execute file: %dPGZ 24-bit address: %06lxPGZ 32-bit address: %08lxfsys_open out of channelsBlock device system ready.Could not create file: %d -could not read from deviceBooting: /sd0/fnxboot.pgx +Error while printing: %dCouldn't get channel: %dReached end of PGZ file.fsys_open out of handlesCould not find screen %duart_open: Bad stop bitscould not write to devicedevice is write protectedCouldn't execute file: %dPGZ 24-bit address: %06lxPGZ 32-bit address: %08lxfsys_open out of channelsBlock device system ready.could not read from deviceBooting: /sd0/fnxboot.pgx Booting: /sd0/fnxboot.pgz Booting: /sd1/fnxboot.pgx Booting: /sd1/fnxboot.pgz -Returning a bad extension.uart_open: no parity tokenCould not open directory %dEG%{u͠ XYwChannel device system ready.FAILED: Console installationfile system assertion faileduart_open: no stop bit tokenfile system invalid parameterCould not mount device %d: %dfsys_mount called f_mount: %dInitializing the text system...FOENIX DEBUG OUTPUT------------creation of file system aborteddevice could not be initializedNo bootable device is present. -PGZ 24-bit start address: %06lxPGZ 32-bit start address: %08lxuart_open: Bad data word lengthuart_open: no data length token -fsys_delete("/sd0/renamed.txt")Scanning for bootable devices... -FAILED: SDC driver installation %dFAILED: file system initializationtxt_get_device: number mismatch %dkQ<'~~~A valid boot record was not found. - AAA 22222 55555 6 00000 X XA A 2 5 6 0 0 X X A A 2 5 6 6 0 0 X X A A 22222 55555 66666 00000 X XAAAAA 22222 55555 66666 0 0 X :99999 9@99:u:i:]:Q:E: 9:@-:!:;::::: :@:: PC: %08X Address: %08X +Returning a bad extension.uart_open: no parity tokenY W[ЎՌʌ۞ОÞXYÞwChannel device system ready.FAILED: Console installationfile system assertion failedproc_exit: Attempting rebootuart_open: no stop bit tokenfile system invalid parameterCould not mount device %d: %dfsys_mount called f_mount: %dInitializing the text system...FOENIX DEBUG OUTPUT------------creation of file system aborteddevice could not be initializedNo bootable device is present. +PGZ 24-bit start address: %06lxPGZ 32-bit start address: %08lxuart_open: Bad data word lengthuart_open: no data length tokenScanning for bootable devices... +FAILED: SDC driver installation %dFAILED: file system initializationtxt_get_device: number mismatch %dxxxxpx[xEx/xxA valid boot record was not found. + AAA 22222 55555 6 00000 X XA A 2 5 6 0 0 X X A A 2 5 6 6 0 0 X X A A 22222 55555 66666 00000 X XAAAAA 22222 55555 66666 0 0 X Q3D383,3 33 3@22333333 3@v3j3]474+4444 3@33 PC: %08X Address: %08X Press SPACE for default. Could not load /sd0/fnxboot.pgx: %d Could not load /sd0/fnxboot.pgz: %d Could not load /sd1/fnxboot.pgx: %d Could not load /sd1/fnxboot.pgz: %d - _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / / / __/ //___ \/ __ \ / / / / / /___ / __/____/ / /_/ / / /_/ / \____//____/_____/\____/ \____/ PC: %08X       _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / __ / / __/ //___ \/ __ \ / / / /_/ /_/ /___ / __/____/ / /_/ / / /_/ /_ __/\____//____/_____/\____/ \____/ /_/ Unable to mount drive %s, FatFS Error: %d ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / //_/ / /| | __/ //___ \/ __ \/ / / / / ,< / ___ |/ __/____/ / /_/ / /_/ / / /| | /_/ |_/____/_____/\____/\____/ /_/ |_| k9k;j<j=j>j?j@j;j=j?j ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / / /| | __/ //___ \/ __ \/ / / / / / / / / ___ |/ __/____/ / /_/ / /_/ / / /_/ / /_/ |_/____/_____/\____/\____/ \____/ Address Error Bus Error Division by Zero Error Illegal Instruction Error Oh dear, something has gone wrong... Overflow Exception Privilege Exception Range Check Exception Spurious Interrupt Unknown Exception Ŀ + _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / / / __/ //___ \/ __ \ / / / / / /___ / __/____/ / /_/ / / /_/ / \____//____/_____/\____/ \____/ PC: %08X proc_exit: Attempting to call into shell      _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / __ / / __/ //___ \/ __ \ / / / /_/ /_/ /___ / __/____/ / /_/ / / /_/ /_ __/\____//____/_____/\____/ \____/ /_/ Unable to mount drive %s, FatFS Error: %d ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / //_/ / /| | __/ //___ \/ __ \/ / / / / ,< / ___ |/ __/____/ / /_/ / /_/ / / /| | /_/ |_/____/_____/\____/\____/ /_/ |_| i9i;i<i=i>i?i@|i;zi=xi?vi ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / / /| | __/ //___ \/ __ \/ / / / / / / / / ___ |/ __/____/ / /_/ / /_/ / / /_/ / /_/ |_/____/_____/\____/\____/ \____/ Address Error Bus Error Division by Zero Error Illegal Instruction Error Oh dear, something has gone wrong... Overflow Exception Privilege Exception Range Check Exception Spurious Interrupt Unknown Exception Ŀ Foenix Toolbox v%d.%02d.%04d starting up... ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / __ / /| | __/ //___ \/ __ \/ / / / / / / /_/ /_ / ___ |/ __/____/ / /_/ / /_/ / / /_/ /_ __//_/ |_/____/_____/\____/\____/ \____/ /_/ -;E"@[]{|} GGGGGG EEEEEEE NN NN XX XXX 3333333 2222222 GG EE NNN NN XX XXX 33 22 GG GGGG EEEEE NN NN NN XXX 33333 22222 GG GG EE NN NNN XXX XX 33 22 GGGGGG EEEEEEE NN NN XXX XX 3333333 2222222 ,` %Kؒ͒’@=hAIBC˜D;GJgK hPiHmEAAEEEIIIOOUUYAIOU~r%DDDDDx*DDDDDDDDDDDD/  }c,Z 0@QYR[T]V_`pN!2!p!!!$0,/`,g,u,,d-&A (((( AAAAAABBBBBB #%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%")"a"e"d" #!#H""" %ax029J.yMC= (": e,;;=f,?@AAF +EXbcdefosVuxS _________ ___________ ________ ____ __ / ____/__ \ / ____/ ___/ / ____/ |/ / |/ / / / __/ //___ \/ __ \ / /_ / /|_/ /| / / /___ / __/____/ / /_/ / / __/ / / / // | \____//____/_____/\____/ /_/ /_/ /_//_/|_| hVD2 ׅą +[!] Incompatible CPU arch: expected %s, but found %s + !#*-<n>[@H[5]"{|} GGGGGG EEEEEEE NN NN XX XXX 3333333 2222222 GG EE NNN NN XX XXX 33 22 GG GGGG EEEEE NN NN NN XXX 33333 22222 GG GG EE NN NNN XXX XX 33 22 GGGGGG EEEEEEE NN NN XXX XX 3333333 2222222 ,XQ` JC%8K-" @fAܕBGCUDΖGJlfKfPNhH!m&EAAEEEIIIOOUUYAIOUPDJ +}c,Z 0@QYR[T]V_`pN!2!p!!!$0,/`,g,u,,d-&A (((( AAAAAABBBBBB #%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%")"a"e"d" #!#H""" %ax029J.yMC= (": e,;;=f,?@AAF S@UXZ\]^_abdefgjb,lmnpqstvwxyz{|d,~DE{ 0 P`"6Da&C?=;<XDB@>)8*,.- 9/!10#"2$ 3% 45&' ( :6+ORSPLMHEWNA\^[[]lmficbejkhgd`l@N# @@ -71,128 +53,131 @@ fsys_rename("/sd0/hello.txt", "/sd0/renamed.txt")   $$8~~8||88TT8 @@ @@|$BB$8||8(((((|(|((P(8DDD8(8DDD8 8DDD8(HHH4 HHH4(DDL48(8DDDD8(DDDD88TPT8$ x "|DD(||8D@D8$ p 8DDD8HHHHp4X|(D(|8DD|DD88DDD((l< DDD8ll$JR"\@<@8@<8DDDDDD|||||  8 8 `| T T(P 8$$$8 <<<<< -  !kkkk::kkkkkkkkkkkkkkk?kQ?k"mZk"kBkkkk k)k -Ck -Bk"sk"sk?")k"Ek)"‚k)"ݐk kkkc8k k -k k%'kikS?U?kH"hk -kk)!8kH"hkH"Kvhkik - kki-k -H :Hkwwk:k)k)k i +  !kkkk::kkkkkkkkkkkkkkk?k"Xk"DkOkkkk k)k +Pk +Ok"rk"rk? )k"k)"Uk)"pk kkkc8k k +k k%'kikH"hk +kk)!8kH"hkH"thkik + kki-k"-"^"6 +H :Hkwwk:k)k)k[?]?k i k -"Tk -"Tk -kH"~qhkkkk  k"oZ"Sc)k"S."`">"U -wk:00k'' ɀ k:k 8k8[dH )"[kk )"[kk ) "[kk )"[kk )"[kk )"[kk )"[kk )"[kk )"[kk )"[kk )D"[kk )"[kk  8 k [𫫘 H (+k [𫫯U?S?+k>"ok [𫫘Q?"H]+k [ h )X+k [ h )x+k)kkZ"^: czkZ"]:czk)8kZ$"f8ezkZ"n:zk8PI"vZkk"Rk"Hf")"4]k  " " )kZ)))zkwk    k) +"k +"k +kH" phkkkk  k"X"a)k +wk:00k'' ɀ k:k 8k )"Ykk )"Ykk ) "Ykk )"Ykk )"Ykk )"Ykk )"Ykk )"Ykk )"Ykk )"Ykk )D"Ykk )"Ykk  8 k [𫫘 H (+k [𫫯]?[?+k>"_nk [ h )X+k [ h )x+k)kk8[dH"U?Z"\: czkZ"9\:czk)8kZ$"d8ezkZ"m:zk8PI"Ykk"k"d"S""[k  " " )kZ)))zkwk    k) #e - k"i"\i,"kHHHH"ahhhhk  :i:<i<k -7k"Rk)k)kZ   ;"zk"}0HzzkkZZ  "oZH"+chzzk:   / k -   "HkHHFf ee&hk!#%'k [ D J B "+k/ + k"h"-[*"ckHHHH")hhhhk  :i:<i<k +7k"k)k)kZ   ;"zk"{0Hzzkk [𫫩"Y?+kZZ  "XH"ahzzk:   / k +   "ۂkHHFf ee&hk!#%'k [ D J B "+k/  JJJJ / -  k~"_:~"kZ8PIzk"]p +  k~"n]:~"kZ8PIzk"n  H -H"[hhQ?"H]z -zk [𫫘";+k)  -  k"\   k"\  J kZ) :8zk"\  k:% -   k   " d" k kZ  HH )H )"thhhh".ezk88(PI +H"}ZhhY?"]z +zk [𫫘" +k)  +  k"[   k"[  J kZ) :8zk"[  k:% +   k   "d"k kZ  HH )H )"hhhh"czk88(PI -MHM kj> j> +ZHZkn> n> -l>n>j>j>kk -"o "ok"Z"lp??"k# k +p>r>n>n>kk +"_n "_nk"6Y"kzo??"k# k  -" +" - " z z -zk""S  )   k"\  J:kkdHHJee&hzk)8PI&"f0ekZ  )  zk#ɀ8 -ek [𫫘8S?S?U?U?U?S?+kZZ JJJJ JzzkZZ;"^  zzkZ   -)HHHHH )"n;i -".ezkZ   -)HHHHH )";i -".ezk + " z z +zk""=}  )   k"[  J:kkdHHJee&hzk)8PI&"d4ekZ  )  zk!ɀ8 +ek [𫫘8[?[?]?]?]?[?+kZZ JJJJ JzzkZZ;"W  zzkZ   +)HHHHH )";i +"czkZ   +)HHHHH )"};i +"czk  -8PI" -z +8PI"mz zk  -8PI"z +8PI"z zk  -8PI"Үz +8PI"cz zkHZ H $   ()h  zhhhk  -"z +"Fz zk   ):kH &H) -H)*EJ&h)jh)jhkZ"\"    zk>"ї"R8O?kk +H)*EJ&h)jh)jhkZ"["    zk>"d"8S?kk  -8PI "z -zk~"\z"\ y wkZ  B )8 -"_ J ) "_zk"_*"_#"_,"_"_"_E"_"'jkZ  8     գI)8zk" !  kZZc( -" -"f8 +8PI "z +zk~"-[z"-[ y wkZ  O )8 +"n^ J ) "n^zk"n^*"n^#"n^,"n^"n^"n^E"n^"hkZ  8     գI)8zk" !  k + [𫫘 +n"U? +W?+z +zkZZc( +" +"d8 zzkH)ɀ))ɀ)zh @zzkhk -"/x"NPHP -Nh"[z +"mv"NPHP +Nh"}Zz zk     ) zz z -zk4"um"ib:HT"umh"\:1"umkZ  ) +zk [𫫩 އ    +kZ  ) - +$ e) -e"5qzk +e"ozk ZZ ; -" zzz +" zzz zk -Z"\ +Z"[  -!"uH"Hih  zz +!"tH"gh  zz zk Z -d" ' ; -"azz +d" ' ; +"zz zk:0 -H`Z&Mk +H`&{k  ;iHH ->>"[hhz +>>"~hhz zk  ) -H"+ch H"+chz -zkH"+chH +H"ah H"ahz +zkH"ahH )+' )  - h((kZ  i  "$ H"hzzk + h((kZ  i  " H"hzzk  - )"^: zz z + )"x\: zz z zk i -)"p)  z +)"")  z zk   H -"o zz z -zk"um4"um"p) H"h"\:1"umk +"_n zz z +zk [𫫘ZZ -)  H"hzz+z +)  H"hzz+z zk ZZZ : @@ -200,343 +185,345 @@ ZZZ zkZ8PI0zk - -e"o"7lZ"!]18 PI"e  zzk [𫫘ZZ"Z"Z ` )%zz+k +$ +e"_n" +kZ"[18 PI"e  zzk [𫫘ZZ"mY"tY ` )%zz+k ) -H"+ch -ک H"+ch -H"+chz +H"ah +ک H"ah +H"ahz zk Z :Ȉ  ަzzz z zk - [𫫘"/x":< H< -:h"[+z -zk@ H@ ->h"[+z + [𫫘"mv&>@ H@ +>h"}Z+z zk - [𫫘"/x&BD  D -B"[+z -zkZ8PI08$"f8!8$"fezk - [𫫘"/x$ H -h"[+z -zkZZ"\4   ))   7 zzkZ    =) + [𫫘"mv&BD  D +B"}Z+z +zkZ8PI08$"d8!8$"dezk + [𫫘"mv$ H +h"}Z+z +zkZZ"[4   ))   7 zzkZ    =) -? +?$   #  ) -  - "7lzk/):#):k + $ + " +kzk   - )",_H)",_h8 ) Պzz z + )"]H)"]h8 ) Պzz z zk -Z )"\  w"\  zz -zkH??/???2?>>?>>?>>yK?M?k [𫫘Z""6 -""4]z+kZ8PI9V"f>eH|"hzk -  "/x&JL HL -Jh"[zz z +Z )"q[  w"q[  zz +zkL?!?3???6?>>?>>?>> O?Q?k [𫫘Z"u"b "F"[z+kZ8PI9V"d>eHG"hzk +  "mv&JL HL +Jh"}Zzz z zkZ     J  jj) ec  :  ȈǣzkZZ   JJJJ ))#) 8PI0 8PI0 -"fczzk7 _ ZȗȗȗȗkZZ:2      zzzk - [𫫘"/x* HHH -h"[hh+z +"dczzk!7 7^ YȗȗȗȗkZZ:2      zzzk + [𫫘"mv* HHH +h"}Zhh+z zk - [𫫘"/x*68H H8 -6h"[h+z -zkZZ8PI0zzk8PI0Ӣ"^rZ  CC  CC    :zkZZ  "Hf7  ;iH;i"]hh -"4]zzk - [𫫘"/x( H -h"[+z + [𫫘"mv*68H H8 +6h"}Zh+z +zkZZ8PI0zzk8PI0Ӣ"pZ  QQ  QQ    :zkZZ  "d7  ;iH;i"%hh +"[zzk + [𫫘"mv( H +h"}Z+z zk - [𫫘"/x(&(  ( -&"[+z + [𫫘"mv(&(  ( +&"}Z+z zk - [𫫘"/x(*,  , -*"[+z -zkZ;  )H)h8   :zzk -Z"/x  -"[H "hzz -zkZZr " yy I /yy  Oyy zzk - ["4"s"s"i -" + [𫫘"mv(*,  , +*"}Z+z +zk +Z"mv  +"}ZH "hzz +zkZZ " yy I /yy  Oyy zzk + ["4"r"r"Di +"D PI0+z zkH) H )87IJj(hk( *(zzk [𫫘  -"g -"SEhh"4]+z +"- +">hh"[+z zk - [𫫘"/x*24 H H4 -2h"[h+z + [𫫘"mv*24 H H4 +2h"}Zh+z zk -ZZK?M?M? -K?"[j>:"Zzzz +ZZO?Q?Q? +O?"}Zn>:";Yzzz zk -n> -l>"[:Ӌ [𫫘ZZZ"Z"Z'  l    l zzz+k [𫫘ZZZ"Z"Z'  `    ` zzz+kZZJJJJJ)?HJJJ))H#H JJJJJ)H J))iH "um;i -zzkZ"HfC  )zk:,:#!#%'!# %'kZZZ  o!o#"fc @ -` "zzzk +r> +p>"}Z:Ӌ [𫫘ZZZ"mY"tY'  l    l zzz+k [𫫘ZZZ"mY"tY'  `    ` zzz+kZ"dC  )zk:,:#!#%'!# %'kZZZ  o!o#"dc @ +` "zzzk ;8 -;"tyHH -;i"`hh;iz -zk;8T?8PI0:HHH;i "hhh;i";iTk;8 -#JJJJ  #   ;i";i +;"wHH +;i"_hh;iz +zk;8T?8PI0:HHHb;i "hhh;i";iTk;8 +#JJJJ  #   ;i";i k ;8 -;"qHH -;i"`hh;iz +;"VpHH +;i"_hh;iz zk -ZZ8PI6""f<e +ZZ8PI6""d<e -"[zzz +"}Zzzz zk ;8 -;"q;iH -;i"`hh;iz +;"Vp;iH +;i"_hh;iz zk -"i> -> -6?"_?"_?"_z -zk"vZ -;8  i "yf  i "yf;i k;8T?8PI0>HHHH`;i " hhhh;i";iTk +"h> +> +:?"^!?"^?"^z +zk"Y +;8  i "e  i "e;i k;8T?8PI0>HHHH2;i " hhhh;i";iTk ZZ  -  "  w O?zzzz z -zkZ8PI0zk""f<<""fe [𫫘ZZZ"Z"Z.' l I%   l zzz+k +  "  w S?zzzz z +zkZ8PI0zk""d<<""de [𫫘ZZZ"mY"tY.' l I%   l zzz+k [𫫘Z  -"g -"cy""4]z+z +"- +"\"F"[z+z zk [𫫘Z  -"g -" ;, ""4]z+z +"- +"i4"F"[z+z zk Z  -  "] +  "[   ::zzz z zk  - ?  2)(d"bhhz + ?  2)(d"hhz zk Z -Hg"h -"^_H -HH"8hhhک "hzz +H+"h +"]H +HH"8hhhکZ "hzz zk Z   -"^_ e  +"] e   ) zzz z zk  -  [𫫘"/x .. 0 "0 -. "[+zz z +  [𫫘"mv .. 0 "0 +. "}Z+zz z zk -  [𫫘"/x .R T "T -R "[+zz z +  [𫫘"mv .R T "T +R "}Z+zz z zk ZZ -"oZ"e: "oZ"c:zzz +"X"Qd: "X"=b:zzz zk ZZZ  -")/;i -" zzzz +"S"/;i +" zzzz zk ;8J -;"o)  ;";"?;iJz +;"m)  ;"o;"Ҋ;iJz zkZ    N#) - +$ e  !) - -e ' "7lzk +$ +e ' " +kzk   -"_:<w +"n]:<w  eɀz -zkZ    P') "f e  %) "f e ' zkZRMH)h8PI0 " 'e zzkZZZ  | )"@"U}"U}  "U}) -( -"-zzzk;8T?8PI0FZHZHHHHH;i" ;i ;i";iTk +zkZ    P') "d e  %) "d e ' zkZRMH)h8PI0 "'e zzkZZZ   )"@"?{"?{  "?{) +& +"zzzk;8T?8PI0FZHZHHHHH;i" ;i ;i";iTk ZZ  -"2`:<w +"^:<w  eɀzzz zk -  [𫫘"/x 0" $ $H$ -" h"[+zz z +  [𫫘"mv 0" $ $H$ +" h"}Z+zz z zk ZZ    -   "]: +   "[: :оzzzz z zk Z 0B;H -i"]hhzz +i"%hhzz zk - [𫫘ZZ8PI2""f<e -"[zz+z -zkZi  8PI0  zzke  Z    NH + [𫫘ZZ8PI2""d<e +"}Zzz+z +zkZi  8PI0  zzke  Z    NH$ ) -ehH +ehH$ ) -eh"7lzzk +eh" +kzzk ZZ %;i -"a zzz -zkd"\: +" zzz +zkd"Z: Z -"  ; -"a -"֎: -"lzz -zkZ&"S   )  6HH"D9hh    "HzkZV            I%  zkZ    PH ) "fehH ) "feh +"  ; +" +"i: +"kzz +zkZ&"=}   )  6HH"2hh    "ۂzkZV            I%  zkZ    PH ) "dehH ) "deh zzk - [𫫘ZZ8PI6""f<e -"[zz+z + [𫫘ZZ8PI6""d<e +"}Zzz+z zk 8ʆ8ʆ  $2 0 -d"aeHe +d"k`eHe hz zk [ Y )d Z )Ȉ & [ )+k -ZZ8PIG6"f;e% -"[zzz +ZZ8PIG6"d;e% +"}Zzzz zkZ   0 P9  E a 0f  % A F  )i)i )80zk ZZ -"HfC;iH -"]hh  ""4]zzz +"dC;iH +"%hh "F"[zzz zk;8 - ""Q?HH  "bhh;i + /"F"FY?HH  "Lahh;i k - Z "Hf + Z "d  < - "L "^_)"4]zzz z + " "])"[zzz z zk P X Y Z [ ] ^ _ X \ X k ZZ -t" -"Hf/;H;i"hh) -"4]zzz +8" +"d/;H;i"Ahh) +"[zzz zk - [𫫘Z"w_ -)&"f0e" -"h `% z+z + [𫫘Z"] +)&"d4e" +"=g d% z+z zk Z  -0 2  "  - "zzz z +0 2  " + "zzz z zk ZZZ 8PI - ;iH"uhhH:H"thhzzzz + ;iH"shhH:H"Pshhzzzz zk ZZZ  8PI0zzzzz z -zk "oZ -cH"+ch8PI0/8PI0    .      " k +zk "X +cH"ah8PI0/8PI0    .      "k [𫫘 -HH"hh8PI+ -6"f;e6"5q+z +HH"hh8PI+ +6"d;e6"o+z zk ZZ\  C7 -"i0 +"h0 zzz zk ZZZ 8PI - ;iH"uhh8HH"thhzzzz + ;iH"shh8HH"Pshhzzzz zk ZZZ 8PI - ;iH"uhhcHH"thhzzzz + ;iH"shhcHH"Pshhzzzz zk ZZZ 8PI - ;iH"uhh8HH"thhzzzz + ;iH"shh8HH"Pshhzzzz zk ZZZ 8PI - ;iH"uhhcHH"thhzzzz -zkOy.wy aw~y)))"$~y))) "k -ZZ"eP8,"% + ;iH"shhcHH"Pshhzzzz +zkOy.wy aw~y)))"$~y))) "k +ZZ"dP8,"% ) )JJJJI)8 zzz zk - ;8R ?8PI0B;i^H ;i"ghh;i? -?"[;iRzz z + ;8R ?8PI0B;i^H ;i"hh;i? +?"}Z;iRzz z zk ZZZZ   -"^_e) +"]e)      zzzzz zk - ZZ  "0< "`0* "Z%zzzz z -zkZZ8PI*8PI Ȉ :H:H"thhzzk + ZZ  "60< "X_0* "JY%zzzz z +zkZZ8PI*8PI Ȉ :H:H"Pshhzzk [𫫘;8R[Hک>;i "hhh;i"m "F"[;iR+k Z 8 -PI0@ "f  4 - "fe"j: zz +PI0@ "d  4 + "de"/i: zz zk - [𫫘ZZZZ;i;"I:;$ -"[zzzz+z + [𫫘ZZZZ;i;":;$ +"}Zzzzz+z zk ZZZ  8PI c   zzzzz z zk -"9n +" m Z - X"H H",hhh8PI  e ӊzzz z + )"FH H",hhh8PI  e ӊzzz z zkZ  )  @@ -549,129 +536,125 @@ z e) e  zzk - [𫫘ZZ8PII""f<e%HH -h"[hzz+z + [𫫘ZZ8PII""d<e%HH +h"}Zhzz+z zk - ;8R ?8PI0B;i^H ;i"ghh;i? -?"[;iRzz z -zkZZZ  )""U}2"U}%"U}"U}  "U}) -& -"-zzzk + ;8R ?8PI0B;i^H ;i"hh;i? +?"}Z;iRzz z +zkZZZ  )""?{2"?{%"?{"?{  "?{) +$ +"zzzk ZZZ   -;",8PI2 +;"%8PI2 '7) -"Rzzzz +"zzzz zk ZZ  -" "Hf*;iH -"hh -"4]zzzz z -zk"R"umb|"rhh""umb"" "um|"""x|"xkZi:] -DH`"t\M"t\D? ' 0 @ ! '   zk - Z#ɀJ=ɵ6% +i" "d*;iH +"Ahh +"[zzzz z +zkZi:] +H`"[M"[D? ' 0 @ ! '   zk + Z!ɀJ=ɵ6% e 8 ֊i)zz z zk - [𫫘ZZ8PIN""f<e*HH -h"[hzz+z + [𫫘ZZ8PIN""d<e*HH +h"}Zhzz+z zk - [𫫘ZZ8PIN""f<e*HH -h"[hzz+z + [𫫘ZZ8PIN""d<e*HH +h"}Zhzz+z zk    -L       "5qȷ   "o i +L       "oȷ   "_n i zz z zk Z   - "@ + "@ :)0 -i2 0 "3hzzz z -zk -ZZ - -HH."umhh -"h0/"H"h"):ܣ"YH "umhzzz -zk;88PI0! ;i";ik%ک8;ie  FfFfFfFfZ  )az8 ʆɀ8/ )zk;8 +i2 0 ",+hzzz z +zk;88PI0! ;i";ik%ک8;ie  FfFfFfFfZ  )az8 ʆɀ8)zk [𫫘ZH"hY?U?W?:"dW?U?"Lahh"j+""jz+k;8 cJ iH he   ;i k:  ;8 -JJJJ))  ))  JJJJ)  )  ;i";i +JJJJ))  ))  JJJJ)  )  ;i";i k ZZ  8PI0 -"]zzzz z -zk8PIH ch  [𫫘;8RZ;i"h -;i"hh""4];iR+kZZZZ  8'PI0zzzzko#"f8%PI0 !ce @  +"zzzz z +zk8PIH ch  [𫫘;8RZ;i"h +;i"hh"F"[;iR+kZZZZ  8'PI0zzzzko#"d8%PI0 !ce @  `  Z -"Hff -""4]W% -eHeh""4]+ eHe -h""4]zz +"df +"O"[W% +eHeh"O"[+ eHe +h"O"[zz zk ZZZZ  8PI0zzzzzz z -zk "oZ"ScH +zk "X"aH c h  ZZZ +   zzzz zk -cH" h +cH"h Z  - i  )     "p    @' ) -"9n)zzz z -zkZZZi0  :  ;8"f'e"H"h)H;iH"hhh"4]zzzk -  [𫫘ZZZZ;i;"I:G0H   - h"[zzzz+zz z + i  )     ""    @' ) +" m)zzz z +zkZZZi0  :  ;8"d'e"H"h)H;iH"hhh"[zzzk +  [𫫘ZZZZ;i;":G0H   + h"}Zzzzz+zz z zk ZZZZ  -i"`  7i -"`Hhzzzzz +i"^  7i +"^Hhzzzzz zk Z  - "7O + "z7O )   $  zzz z zk [𫫘ZZZZ -CC"Q +QQ"Q G -="s -  "i -" +="r +  "Di +"D PI0zzzz+z -zk;8 8 PIx;i H"u;iH"| c c 8;i H"Z| d8"x;iH!"Z|;i;ik +zk;8 8 PIx;i H"s;iH"Ez c c 8;i H"z d8"v;iH!"z;i;ik Z  -H "^_h+ "^_e  zzz z -zk c)"E_H -ch  [𫫘;8T"t hhhh]H]HHl;i "hhh;i"\tR""4];iT+k +H "]h+ "]e  zzz z +zk c)"]H +ch  ;8: -;i;i":O;i"5+1  +;i;i"f:O;i".+1   -;i"e;i:z +;i"-;i:z zk ;8T ->8PI/"zdH -HH;i " hhhh&ڥ -HHd;i "hhh;iH"$hh;iTz -zk [𫫘ZZZ;H"&ahhhhF&HH"bhh1H"hH "hzzz+k +>8PI/"cH +HH;i " hhhh&ڥ +HH5;i "hhh;iH"hh;iTz +zk [𫫘ZZZ;H"oZhhhhF&HH"hh1H$ "hH +"hzzz+k [𫫘;8 -;i;"I >&("( -&"[ H -"h ;i +;i;" >&("( +&"}Z H +"h ;i +z zk [𫫘;8 -;i;"I >*,", -*"[ H2"h ;i +;i;" >*,", +*"}Z H"h ;i +z zk @@ -685,28 +668,29 @@ z zk Z  4  6 -g "oO - i8 "qgh +g "?O + i8 "fh 4 6 zzz z -zkZZZ -8%PI008'PI08'"wq':o!o#zzzk [𫫯CLRC"{:#"{:4"{: CV"ZCC ɿ 4CC    C"ZC+k +zkZZZ -8%PI008'PI08'"j':o!o#zzzk [𫫯PLEP"Ly:#"Ly:4"Ly: PV"{YQQ ɿ 4QQ    P"YP+k [𫫘;8 -H"h;i;i"I:B "  -"["h;i +H"h;i;i":B "  +"}Z"=g;i +z zk [𫫘;8 -;i;"I B"$&H $ -"h"[ H "h ;i +;i;" B"$&H $ +"h"}Z H +"h ;i +z zkZs8 PI0_ h i j l m n ` a b zzk -eL +eL ZZZZ  -8PIV "oZ"Sc   +8PIV "X"a   5 + c  zzzzzz z -zk +zk/):{):n): ): ): $): / k )Ȉ &)d  @@ -716,88 +700,76 @@ z Ȉ &)dz zk - O?L>~ f8ʆ + S?Lٷ~ f8ʆ 8ʊ -"z +"z zk Z  - i e )8PIF cH"h c   zzz z -zk;8 8PI0L;iH"uhh;iH"|hh8PI -cc8  ;iH"Z|hhd "x;iH"Z|hh;ik8HHH + i e )8PIF cH"h c   zzz z +zk;8 8PI0L8;iH"shh;iH"Ezhh8PI +cc8  ;iH"zhhd "v;iH"zhh;ik8HHH **** * * * 8Hh hhhzzz****Jh;i(khhhhhzzzz(k ZZ -."}  v 8PI0\    +)"E_H +."  v 8PI0\    +)"]H ch c  zzzz z zk Z  -  W  N  )<   !  "[J    zzz z +  W  N  )<   !  "YJ    zzz z zk ZZZ  %;i -"a S 4  -"a;i -"azzzzz z -zkd"\:L +" S 4  +";i +"zzzzz z +zkd"Z:L} ZZ - )"\::   "*\:S))e:"f  zzzz z -zkZ?8PI@8PI0PG"8 A":P8PI0"PG"c A"zk + )"Z::   "Z:S))e:"Ae  zzzz z +zkZ?8PI@8PI0PG"A8 A"A:P8PI0"PG"c A"zk  [𫫘;8 -;i;"I K.0/H  0 -. h"[ H"h ;i +;i;" K.0/H  0 +. h"}Z H"h ;i +zz z zk  [𫫘;8 -;i;"I N243HH  4 -2 h"[h H"h ;i +;i;" N243HH  4 +2 h"}Zh H"h ;i +zz z -zk -"Zix -d" ""dd"^r"^r"^r"Z -PI0d"^r"^r"^rz -zkZ "8PI0T8PI0zk$"f88$"fe6"f;;6"feL*;864 CJ\r!ja#%+-/1')35;"Z:9;"Z;i6k +zkZ"8PI0T8PI0zk$"d88$"de6"d;;6"deL;86 G ԧ=`[!`#%+-/1/')35;":#;";i6k ZZZ -##"Z["e\ʆ"V"e\ʆ"V 8PI00c +##"Y"Zʆ"&"Zʆ"& 8PI00c 7cWc     -"Z[Ёzzz\ +"YЁzzz\;8 / ;i" ;i" H;i"]h;ik;ic   A +Z  )"]H;ich  ZZ     -"֎:L  ; -"ڌ [  -"ڌ; -"a; -"a#  zzzz z -zk/)$" L+&" c@+&" 3@+&" k -;8T - -HH "umhh - -"h8PInH"um;i";i"^_H;i H "ک -"um ;i -"H"umh;iTz -zk +"i:L  ; +"m [  +"m; +"; +"#  zzzz z +zk/)$"L+&"c@+&"3@+&"k ;8 cJ  cic    Ȁ ;iz -zk:L;8"         n J"Z^*?!;"#:"  ;"#;i"k +zk:L;8"         g ,2YV]s8!;":"  ;";i"k Z  V 0 E X - x $ȷ )"h:  E% 0 6 X + x $ȷ )"8:  E% 0 6 X x ! 8PI08PI0 zzz z zk -Z8PI0Lʣ$"f8e +Z8PI0Lƣ$"d8e r 8PI/ -6"f;eE " "zz +6"d;eEx "F "Fzz zk Z   -     Lʠ)L  w   +     LǠ)L  w   ) e    @ Z   a "z   -"mG  H"hzz z +"@  H"hzz z zk Zi  @@ -806,9 +778,9 @@ z ȗ i8 8ʠȗ Hȷ -h"z\! +h"z\ Z  -" g +"e  c i @@ -820,7 +792,7 @@ z ȗȗȗȗ ȗ ȗzzz z zk;8  - ;"^ Lͣ + ;"W Llʣ  @@ -831,22 +803,20 @@ z    ;i -;i";ikZ A"SPG""PG"c A"?"ASń'7"A"PG"8 A":zk +;i"f;ikZ A"SPG""PG"c A"?"Sń'7""PG"A8 A"A:zk  [𫫘;8  H -HHH! -"hhhh;i;i"IJ  . +HHH "hhhh;i;i"J  . H  - h"[H -"h;i + h"}ZH "h;i +zz z zk ZZ -)LJ64 -i8"ghLE  84(H6*h "H  ;4 wH6"wh -i8"ghzzz -zk;8;"8 +)L64 +i8":fhL  84(H6*h "H  ;4 wH6"wh +i8":fhzzz +zk;8;"8 ) @@ -854,23 +824,23 @@ z ʪʠ Ȉ & ʠȈ -& ʆFj;ik;8 c  g       )   ;ik ҋ [𫫘8PI0LӘ""f<e +& ʆFj;ik;8 c  g       )   ;ik ҋ [𫫘8PI0LϘ""d<e -  +kZ 9 Lӯʆʆ"ʆʆ"  s  i ) -ʆʆ" ) -ʆʆ"8 8 zk +  +kZ 9 LЯʆʆ"oʆʆ"o  s  i ) +ʆʆ"o ) +ʆʆ"o8 8 zk ZZZ  ; -" Lԥ  -"~Rt -"k A  -"e -" \ zzzzz z -zkIIڅd*8&zzkHCh"H"Ik$8$8 +"Lѥ  +"Kt +"*e A  +"- +"iU zzzzz z +zkIIڅd*8&zzkHCh"H"Ik$8$8  ddd d & &&8& & zz -z zkEH"0z8kk;8  L֯H h 8PI0j ) +z zkEH"z8kk;8  LvӯPHP h 8PI0j )    @@ -880,73 +850,72 @@ z e  %  ) -e  4e  e  L;izkZZZZX +e  4e  e  L;izkZZZZX -c  :Lsף -H`HHC "hhnHH? "hhRHH/ "hh6HH; "hhHH7 "hhH "Kvh)"p"zzzzk +c  :LCԣ +H`HHuB "hhnHHu> "hhRHHu. "hh6HHu: "hhHHu6 "hhH "th)""Ozzzzk ;8      - "Lؠ + "oLRՠ ic  8<PI0S;iH -i "]hh  ;i +i "%hh  ;i z -zk;8V1 Z v ӃŃ斃O`!㊃#%c79a;=a')+-Cb/1l`35?A\CEGIwqKM,OQ$dSU;"ƙ;iVk;8 -;H"Z|d""HHH"i;i dd"td""% 8PI0"" -"thh;i -kHH "hhdd "pd "  ZZH"h0V8PII$"f88$"fe$"f8ew8PI0Y$"f8J$"f88$"fe$"f8ezzk +zk;8VV) fY 嵃σƒy^!v#%gb79$`;=`')@~+-`/1^35?A[CE~GIjKMOQbSU;";iVk;8 +;H"zd""HHH";i dd"d"" 8PI0""m"Pshh;i +kHH "hhdd "d "O  ZZH}"h0V8PII$"d88$"de$"d8ew8PI0Y$"d8J$"d88$"de$"d8ezzk ZZZ  -   , .7  . , "~R t -  "oI      " \zzzzz z -zk;8 / ;i";;i";H;i"^_h?;i"|:"thhhh;ik;ic   A +Z  )",_H;ich L +   , .7  . , "K t +  "bI      "iUzzzzz z +zk ;8    -"o:LRޥ - "G 46 -i8"o +"?:L"ڥ + "ڎ 46 +i8"_n i8 -6H c "gh c  +6H c ":fh c   ;i zz z zk ZZZ  -  "~RL<ߩ -  "oj    ) " " \Lޣ zzzzz z +  "KL ۩ +  "bj    ) " "iUL{ڣ zzzzz z zkZZZ: -8PI0.80PI0/"?[PI0 -80L]$8PILP80PI09"B[PI080^8aPI0V"?[PI0i28API06"?[PI0izzzk +8PI0.80PI0/"YPI0 +80L-ܩ$8PIL ܊80PI09"YPI080^8aPI0V"YPI0i28API06"YPI0izzzk  [𫫘;8  H -HHH"hhhh;i;i"Iq HH6"hh . +HHHr"hhhh;i;i"q HH"hh . H   - h"[H9 "h;i + h"}ZHs "h;i +zz z zk -;8   - 8PILw"f 8PI0Lw8 :8PI0m - "8 PI02 c +;8   + 8PILGޣ"d 8PI0LGޣ8 :8PI0m + "8 PI02 c -SDQD " -H "4h  H "4h H "4h:L;i z +ZQXQ " +H "4h  H "4h H "4h:L;i z zk -  [𫫘ZZZN""8PI0L~6"f;eL"w n ` +  [𫫘ZZZ""F8PI0LNߣ6"d;eLQߣ"G n ` E H  -h"qh"[  zzz+zz z +h"g"}Z  zzz+zz z zk [𫫘Z8PI0 -z+zke  ie  ie  ie  ie  ie  ie  L;8@;i ;i":L ;i "5_7  ;/+)  "H h 7  +z+zke  ie  ie  ie  ie  ie  ie  Lz;8@;i ;i"f:L ;i "._7  ;/+)  "H h 7    :  ;i@k ;8   -  "@\"o ) - ";i +  "Z"_n ) + ";i zz z zk: @@ -955,24 +924,26 @@ z  c i -cH"8\chȗ +cH"Zchȗ  c :  c i -cH"8\chȗ L - ZZZZ    L) +cH"Zchȗ L + ZZZZ    L) -)oHoh8PIL +)o +Ho" +h8PILv$ ) e  ) -? +?$   # @@ -984,45 +955,46 @@ z  ) -  - "7l4e - e   Lzzzzz z -zkZZK -"umZ"8PI0L3"A"FhhL A L A L词AeAA"AHAH"umhhAAH"umhhA"umhhA"FhhL4"=s"Hy"hzzk + $ + " +k4e + e   Lzzzzz z +zk ZZZZ)* -  ϧ) L)*  ϧ) +  ϧ) L)*  ϧ) !   zzzzzz z zk - ;8$8PI0L.8PI0L.$"f8e -$"f8e    -i;i "5q i -i "5q;i i "5q;i$zz z + ;8$8PI0L8PI0L$"d8e +$"d8e    +i;i "o i +i "o;i i "o;i$zz z zk [𫫘;8;i# - ' LU;i4"fh%e" "4]LX   8PIL;ic + ' L;i4"dl%e" "[L +   8PIL;ic i c   i c);i+z zk [𫫘;8;i# - ' Lx;i4"fh%e" "4]L{   8PIL;ic + ' L*;i4"dl%e" "[L-   8PIL;ic i c   i c);i+z zk [𫫘;8  -"g8PI ' L ' L)B;i"bh;i4"fh%e" * -4"fh%e" HB"h"4] ' ;i+z -zkL +"-8PI ' L`  ' LO)B;i"sah;i4"dl%e"* +4"dl%e"H"h"[  ' ;i+z +zkLt  [𫫘;8! -CC -  "L -L#eHe +QQ +  "L +L#eHe h - L8#PIcHcheHe + L8#PIcHcheHe h - "s  -  "i " PI0LE;i+zz z + "r  +  "Di "D PI0L;i+zz z zkH )&" ) @@ -1035,151 +1007,151 @@ z ж0 8 𚰥hkH88HdR8W)) *)(j)J(j zzkJjfȀ( -  [𫫘ZZZ"/x L,F H L,h )"L,;iH"uhhH"thhL,;iH"uhhHJJJI)8 +  [𫫘ZZZ"mv LF H L)"L;iH"shhH"PshhL;iH"shhHJJJI)8 -H"thht;iH"uhh8PI=H:H"thh HH F  -h"[H:H"thhHH -F h"[zzz+zz z -zkZZZZP8<8;H"Z|a -"umBHBH"umBHBH"umBB"VHs"umBHBhZJJJJH"um;iBHBHBH "umBHBHBHV "um ;i H"Z|"t;izzzzk@"Hk"iH̢:dFfc c  e +H"Pshht;iH"shh8PI=H:H"Pshh HH F  +h"}ZH:H"PshhHH +F h"}Zzzz+zz z +zkZZZZP8<8;H"z "Hl?H?H"Hl?H?H"Hl??"&H"Hl?H?hZJJJJH_"Hl;i?H?H?H "Hl?H?H?H +"Hl ;i H"z"Ps;izzzzk@"j"gH̢:dFfc c  e * &ؘ8ce~hhhhhh/FffF8&/y$0&&ddZddQH)hF8&H)h)H)h) J Jȥ -Z먊JjzkZZZZL S! -$LL)#cL~ -H`8`f8P\cR8H80>8 48*8)88 +Z먊JjzkZZZZL  +"L}L})#cLj~ +eH`8`f8P\cR8H80>8 48*8)88 e  -eLzzzzk +eLzzzzk ;8    -i"`:L'): "f  1@')" ɀL +i"^:L'): "d  1@')" ɀL  e j -)e"`; ɀ9    +E)e"^; ɀ9    e';i zz z -zk  LA -;8;i H"uhh;iH"|hhLQL? c ;iH"Z| H"k;iH"Z|;i -L? c  ;iH"Z| H"k;iH"Z|;i -L c c8  ;iH"Z| H"k;iH"Z|;i +zk  L +;8;i H"shh;iH"EzhhLQL c ;iH"z H"Uj;iH"z;i +L c  ;iH"z H"Uj;iH"z;i +L c c8  ;iH"z H"Uj;iH"z;i ;iz zk ;8  -:  8PI0L?;iH;i "hh ] ) E      -E L  +:  8PI0L;iH;i "Ahh ] ) E      +E L;  ;izz z zk ;8  -"0LvL  : +"'L(L7  : ;i e /  -;i e"0;iz +;i e"';iz zk iH -he"H +he"H -;i ehL +;i ehL [𫫘;8        JJ -              #   ""yd"f ""ye ""y""y# ""y0   ""y""y +              #   "`wd"d "`we "`w"`w# "`w0   "`w"`w ;i +z z zk ;8   - La;i;i"LJ  -"5L*+ 0G7)+ " + L;i;i"fL  +".L+ 0G7)+ "  ,  -"~R  ;i +"K  ;i z -zkZ"_:"L"ibL):L))  )  <)H"w  hL )H"w  hL@)H"w  hL)H"w  hm?)H"w  hC)H"w  h')H"w  h "ibLzkB(B"Hk"*kI"Hk"*k"iHhڥ -E\;8~FfjJ8 +zkZ"n]:"Lq"aLn):Lf))  )  <)H"  hLq )H"  hLq@)H"  hLq)H"  hm?)H"  hC)H"  h')H"  h "aLKzk"j"kI"j"k"gHhڥ +E\8~FfjJ8 Fl$ zzzku **Ji Jȣ fjhhzkFeeJjj8j ЧгH JhȈkЗF@ - ZZ  L7 L  L    L  L  L"Y^ȷ   + ZZ  L7 L  L     L  L  L"\ȷ    - "Ϫ  L + "`  L  e8  Ш    5  ȷ  -ȗ  :"Y^zzzz z +ȗ  :"\zzzz z zk ;8         -i"yf ): "f)  +i"e ): "d)  e -)e"yf    L& +E)e"e    L  e :  @    ;i zz z zk ZZZZ - :8PI0LA -"]LC8PI0L6) c q -W = c  c ] c ] c J8PI": c L#zzzzzz z -zk + :8PI0L +"L8PI0L) c q +W = c  c ] c ] c J8PI": c Lzzzzzz z +zkO ? ZZZZ -  Lk;i"{n"$[ - "$[ +  "$[  "$[   -"$["1A - N"O?D -.8"O?    -%  "[  "[zzzzz +  L;i"Nm"Y - "Y +  "Y  "Y   +"Y"z: - N"S?D +.8"S?    +%  "Z  "Zzzzzz zk @ -ZhhJjhzkک"Hk"iHҘ8i0 +ZhhJjhzkک"j"gHҘ8i0 *$ &$8 &ccd&8&&&8j$Ff19Ffj  ,&JȀJ dd ZhhhhJjzzk ;8   -i"`:L3 ?'): "f  4@')$  -e:L3 L3  -)e"` ] ɀQ   "  -e"  , +i"^:L?'): "d  4@')$  +e:LL +E)e"^ ] ɀQ   "Y  +e"Y  , ;izz z -zk  Ll;8:\ Z - []!#%9n')E/1Z35_+-l79;i"Z:L - Z - []!#%9n')E/1Z35_+-l79;i"Z"hhh;i:k -;8;i H"uhh;iH"|hhL L H"khL  ;iH"Z| H"k c  ;i H"Z| H"k;iH"Z|;iL c c8  ;iH"Z| H"k c  8:;i H"Z| H"k;iH"Z|;i;iz +zk  L;8:- "Y Yo!#% m')ස/1&Y35^+-79;i":Ld "Y Yo!#% m')ස/1&Y35^+-79;i""Thhh;i:k +;8;i H"shh;iH"EzhhL?L H"UjhL ;iH"z H"Uj c  ;i H"z H"Uj;iH"z;iL c c8  ;iH"z H"Uj c  8:;i H"z H"Uj;iH"z;i;iz zk - ZZZZ=Lo 87g0f + ZZZZ=L87g0f g   ȷ   ȷ g7 80] -"[ȷ"[ȷg7H h"zzzzzz z +"Zȷ"Zȷg7H h"zzzzzz z zk ;8  - "# 7)L7)$ + " 7)Lz 7)$  Ȉ & -8 PI0     "#)_ +8 PI0     ".)_   - ":i:У    "# "l;i zz z + "W:i:У    ". "k;i zz z zk ZZ  -"oL@  L  L -i8"o -i6U"yf -i8RRaA"ͳ -irrAa"ͳ -i "ͳ -i$"ͳ&$4664 -i8"gh  H"Odhzzz +"?L +  L +  L + +i8"_n +i6U"e +i8RRaA" +irrAa" +i " +i$"&$4664 +i8":fh  H"bhzzz zk - ;8 =Lc)   " g + ;8 =LJ c)   "e  ci @@ -1187,199 +1159,188 @@ z   ȷ  -L +LJ ȷȷ8 Y g  -c    7 H  h" +c    7 H  h" i;i zz z zk [𫫘ZZZ 8 -PI0L "f  L "f  8PI0L8PI` -c   A)"E_H "fech  "fezzz+z -zk "fec LL +PI0L~  "d  L  "d  8PI0L 8PI` +c   A)"]H "dech  "dezzz+z +zk "dec L L  ZZZZ  - L{ L{& -"L~ "i LvE L~ %L~ -"p8ʆ'   Lzzzzzz z + L' L'& +"zL* "db L"E L* %L* +"zp8ʆ'   L[zzzzzz z zk  [𫫘ZZZ  -"g8PI% `% L `% k "L"w L H"h  -&"f0e"   WHT "h `% "h"4]!l" `% zzz+zz z -zkL -;8 -"um - -8PI0';i H"umhh;iz -zk8 -PI= -"#:0  ;i H"umhhLd8 -PI0L\ -c -  )HN"umh)"r]:3)"]:&;i c . $;i c   - -L7 +"-8PI% d% L d%  "L"G Ln H"h  +&"d4e"Թ  WH"h d% "=g"[!r " d% zzz+zz z +zkL{ ZZZ  ) zzzz -zk$)"   L   L ڃ  L ك  L   L   L Ã  L   L ă  y ۃ  g Ń  U ƒ  CH"4h [ [H"4h     H"4h  L +zk)"   L    L  ڃ  L  ك  L    L    L  Ã  L    L  ă  y ۃ  g Ń  U ƒ  CH"4h [ [H"4h     H"4h  L ZZZ    ;iH;i -H "܇hhhh8PI0!HH "~hhzzzzz z +H "ohhhh8PI0!HH "|hhzzzzz z zk  -e8PI0%8PI08  L]8ZPI0a8PI08R  L]8(PI0/8PI0 8(  [8dPI0k8PI0 8\  3 -   # # LD - ZZ    LH))"f8PIL ) "fe  ) "fe  ) "fe   ') "f e ' %) "f e  : +e8PI0%8PI08  L8ZPI0a8PI08R  L8(PI0/8PI0 8(  [8dPI0k8PI0 8\  3 +   # # L} + ZZ    LPHP))"d8PIL ) "de  ) "de  ) "de   ') "d e ' %) "d e  :  e H  - e hLzzz z + e hLzzz z zkZZ   -Lm - -H` w a"-Lt -Lt  Lt Lt Lt w Lt  Ltd"oLtd"G| "GU   3  "ozzk - ZZZ   ɀ L  L)8 +L +e +H` w a"L +L  L L L w L  Ld"}Ld"ڈ| "ڈU   3  "}zzk + ZZZ   ɀ L  L)8 -CC  )"]: ["6)8 +P~P  )"\: ["6)8 -C -C))"x;" JJJ ))" k  (#)JJJJI)8i0"#)i0" )"~"!  "zzzzz z +P +~P))"x;" JJJ ))"i  (#)JJJJI)8i0"#)i0" )"~"!  "zzzzz z zk  [𫫘;8 ;i-  -"g8PI ' L ' Lx ;i)HH -HH;i  4"fh%e"hhhh"4]Lx      8PIL;ic i c  i c);i+zz z -zkLd - "!] +"-8PI ' L  ' L;i)HH +HH;i  4"dl%e"!hhhh"[L     8PIL;ic i c  i c);i+zz z +zkL + "[  -L=" ) )  )       `  "Zi "Z PI01   "Zi "Z PI0驇!  "Zi "Z PI0  "Zi "Z PI0   "Zi "Z PI0   zz z +Lv ) )  )       `  "@Yi "@Y PI01   "@Yi "@Y PI0驇!  "@Yi "@Y PI0  "@Yi "@Y PI0   "@Yi "@Y PI0   zz z zk - ;8    "#7)L#7)%  Ȉ -& ? "#)   "P:L# 7)ʆ "# "#)^ + ;8    "7)L7)%  Ȉ +& ? ".)   ":L  7)ʆ ". ".)^  - "P:i:Щ "P: "l;izz z + ":i:Щ ": "k;izz z zk ;8    -C #  7"#    L%     " "l "=:L%@   -                  ; "ڌ ;i  "a -  ;i  "a:  )ӣ ;i +C #  7".    L     " "k "Ќ:L@   +                  ; "m ;i  " +  ;i  ":  )ӣ ;i zz z -zkZ  ) "fe) "fe  ) "fe) "fe  ) "fe) "fe  ) "feH) "feh ) "fe -H) "feh -) "f H) "fh  zzk - ;8   :L) -H`;i H"Nhh ;i H"NhhL)L);i H"Nhh ;i H"NhhL)L)H} +zkZ  ) "de) "de  ) "de) "de  ) "de) "de  ) "deH) "deh ) "de +H) "deh +) "d H) "dh  zzk + ;8   :L;" +H`;i HL"LGhh ;i H]"LGhhL;"L>";i H*"LGhh ;i H;"LGhhL;"L>"yHw  -"h: - L)L){Hy +"rg: + L>"L;"uHs  -"h: - oj"^EH +"rg: + oj"\EH  -"h: - ouow;izz z +"rg: + oooq;izz z zk ;8 ;i -" L*@7)L* K -i&   "ghL* 7 "U  "oL*$"      -"Ճ i "ͳ i"ͳ i"yf   " 7 ;izz z +"L#@7)L# K +i&   ":fhL# 7 "%  "bL#$"      +"h i " i" i"e   "  7 ;izz z zk ;8  -Le,7 -"iO?   >> - >> ->> -  Lm,>eLC, -LC, ȷ   ȷ ȗ"_ O?  7)"  -" (  L~+ O?;izz z +L%7 +"hS?   >> + >> +>> +  L%>eL|% +L|% ȷ   ȷ ȗ"^ S?  7)" +"(  L$ S?;izz z zk ;8   - O?L>.7 O?L(.& "Ϫ O?L(. -"L$.   L. 8 8 ȷ  ?ȗ + S?Lw'7 S?La'& "` S?La' +"6L]'   LV' 8 8 ȷ  ?ȗ  -"R b L?-       :   L-8    ;izz z -zk"e"Z!"hhhB"="u[""^    ""} ""c( ""? ""zl""b"_j""""""d """">-""^"":H6"hw -""T:Y" "k +" b Lx&       :   L&8    ;izz z +zk ZZZ  46 -"o:L1 -i6"`8  L1U+ -i"y:L1 -iC"` E :#:L1L1L1  L1)):%:L1 -iF"`:L1H):r -iI"`:Z -iK"`ɀ$ -iX"iN -"`:Uzzzz +"b:LL) +i6"^8  L=)U+ +i"x:LL) +iC"^ E :#:L=)L=)L=)  L=))):%:L=) +iF"^:L=)H):r +iI"^:Z +iK"^ɀ$ +iX"iN +"^:Uzzzz zk;8 -  9 )+3C57-C/1L3"v"H"l`hG"Hd"chd"HH"O`hh 9 "  ;i" ",d";i -k +  9 )+3P57-P/1L*""H"^huF"vHd"gbhd"yHH"^hh 9 " ;i"@~ "d";i +k{ eH eh - +{ - +{ eH@ eh - +{ -@Lf2 +@L) ;8 - # :';i"L{5 : Ч) - L{5 -   ? _ * M;i" ;i "  L{5 L[5L{5   ?   ?  * :H  "3h4  ) ;i" L4;izz z -zk + # :';i"L, : Ч) + L, +   ? _ * M;i" ;i "  L, L,L,   ?   ?  * :H  ",+h4  ) ;i" L+;izz z +zk"c"6Y"?"ރ"Z""]    "_"z ""\H";i +"b{ +"" +""x=""&a"hw""""~ """F""ё""&]""g:H"h ""N:$"F "k ZZZ   / : \ (   - : / LS7 \ LS7 -  & + "~RL -7;i "n "B+ 8* LP7 +  7 )zzzzz z + : / L0 \ L0 +  & + "KLS0;i "n "+ 8* L0 +  7 )zzzzz z zk i8H7 he -" - Lt6L6 +" + L/LK/ [𫫘;8  -d" H d"fh8 " k  " k  " k  " k  " k  " k  -" k  :0 :        " k  -" k                   :     #   ;i +d" H d"dh8 "i  "i  "i  "i  "i  "i  +"i  :0 :        "i  +"i                   :     #   ;i +z -zk [𫫘ZZ"Z"Z:L:L: L;"RF:#.'"+/ -3L:L;"7R;F?:C.G"KO -SwL;"WR[F_:c.g"ko +zk [𫫘ZZ"mY"tY:L3L[3 Ld4f"RF:#.'"+/ +3LB4Ld4"7R;F?:C.G"KO +SwLd4"WR[F_:c.g"ko s  zz+k ;8r -;i;i"L=? A;i?"5 -j L=i  EJL<][ " -EL<  +;i;i"fLX6? A;i?". +j LO6i  EJL5][ " +EL5  x  -;i "~RD;i "k  h;i?"l, +;i "KD;i "*e  h;i?"<, &;i? -"# ";irz +"  " ;irz zk - ;8 8PIL?8PI0-;iH"umhh;izz z -zk c  "#:Lj>;iH"umhh8PI0L$Hf"umh$$ H"umhh&;ic )"]:&;ic  $;ic . "#:"um)H"umhLf=;ic LI= + ;8 8PILP88PI0-;iH"Hlhh;izz z +zk c  ":L7;iH"Hlhh8PI0L$H8"Hlh$$ H"Hlhh&;ic )"$\:&;ic  $;ic . ":"Hl)H"HlhL6;ic L6 ;8  -7)LAL@L A  L A - "#)L@; -":L@ ***)  v ) +7)Le:LC:LV:  LV: + ".)LA:; +"W:LA: ***)  v ) )Ȉ &e?# )ʪeHeh Ȉ -&  L@## **) e# +&  L>:## **) e# e  ***) ) ) @@ -1387,121 +1348,120 @@ z )eH)8 hȈ &   -"=: -"l;izz z +"Ќ: +"k;izz z zk - ;8"6[  -  LB;"["{n"-[ - "-[ +  "-[  "-["6[  ;"["nO?LB"\ʆ"V "\ʆ"V -;i )"h:y  + ;8"Y  +  L'<;"?Z"Nm"Y - "Y +  "Y  "Y"Y  ;"?Z">S?L<">[ʆ"& ">[ʆ"& +;i )"8:y  ]  8PI0E -"\ʆ"aeHeh"-["6[ -LA"O? - II -    5  "-[  -"-["6[  +"F[ʆ"k`eHeh"Y"Y +LH;"S? - II +    5  "Y  +"Y"Y  ;izz z zk ZZZZ ;i -" L@E)L@E7)LBE L)L>7)L> L>:  -"# -LD -"i  % E  > & - "#  @ j [ -i&   "gh  7    +"  +L= +"db  % E  > & + "   @ j [ +i&   ":fh  7    zzzzzz z zk ;8F -TR ;i;"LF -LF;i"~RLF;i"k LF C1/c)   +TR ;i;"fL? +L?;i"KL?;i"*e L? C1/c)   c    e : -e ţ   LRG LRG&$"o_      'd Ci8c"  ;iFzz z +e ţ   L@ L@&$"b_      'd Ci8c"  ;iFzz z zk ;8  8 -PILvI  LWI [ LWI):8PILH -):e  "f   "ELcI"f ߳ M"fe +PILB  LB [ LB):8PILB +):e  "d ?  "LB"d ? M?"de  -;i "[LcIL'H -c  )"]:I +;i "}ZLBLpA +c  )"\:I ;ie -"f)80eH -;i eh ; LG "E;izz z +"d)80eH +;i eh ; L"A ";izz z zk -;ieLG +;ieL@ ;8  -:LK -&H`;iH"Nhh0?("um"W?"hhhک"umhZ;iH"Nhh0= "um"W?"hhhک"umhLK;iH"Nhh0?"um"W?"hhhکv"umhZ;iH"Nhh0="um"W?"hhhکQ"umhLK"4mH"umhh -J >  1)'"W?d"bhh"umS"um;i z +:LD +H`;iH]"LGhh0?"Hl"R_?]"ڮhhhک"HlhZ;iHL"LGhh0= "Hl"R_?L"ڮhhhکf"HlhL E;iH;"LGhh0? "Hl"R_?;"ڮhhhکA"HlhZ;iH*"LGhh0= "Hl"R_?*"ڮhhhک"HlhL E"lHn"Hlhh +J >  1)'"R_?d"hh"Hl?"Hl;i z zk ;8  - "5qLL:d&#eHehJ)  II! #i0  JJJJ9  c      :;ic    А;ic ~ S + "oLE:d&#eHehJ)  II! #i0  JJJJ9  c      :;ic    А;ic ~ S c : -c"\::    '   ;ic)  +c"Z::    '   ;ic)  c  ;iz z zk  [𫫘;8, ;i;  -"g8PIL$O;i -"LO     8PIL;i-c i c  i c)L)P"4]L)P;i "k +"-8PILmH;i +"LdH     8PIL;i-c i c  i c)LrI"[LrI;i "j -QkOk;i ";i ;i"k;i";i  -"v:(;i -"v: LSN      +l[j[;i ",;i ;i"j;i",;i  +")u:(;i +")u: LG      -QkOk i "k;i,+zz z +l[j[ i "j;i,+zz z zk -;8    @ "1  ) |LQ  +;8    "ā  ) LJ   8 -PILQ -A%B "| -C"u| -"h0;"[" -" -";iz -zk "f  LbR   "fe"j:f "fe "fe"1 +PILJ +A% " +."u +";h0;"}Z"# +"F9 +"F;iz +zk "d  LK   "de"/i:f "de "de"ā     -LP +LJ ;8   -  LT )LT   -  "  .,Z ȈFjdLT, .  L@T +  LN )LN   +  "  .,Z ȈFjdLN, .  LM  Ȉ -&   g "i%LT3#8 H h  LT -"G       _ ȈFj eH eh  +&   g "db%LN3#8 H h  LN +"ڎ       _ ȈFj eH eh  i8H%he  ;i zz z -zkZZ"k8PILW8PIL W8PILV8 -PIL*Vѩ"oz"Y";i ZZ,.l Гa{(*V "_$&"Zzzk "f   "fe8PIL3U "fec "l09Hf"h"ڣH"hhLU `% LU ' LT -;8 ;i"^;i ;i":LY / 1;i/"5 -ZLYMK;i "5q;i/;ic4"5q ;ic"5: 7k9m?s AuLqY;ic"YwLoY +zkZZ"j8PILfP8PILVP8PIL P8 +PILsO˩"c s"c R"c ;i *Y.Y02z@cy "H,.}$&R^(*"zzk "d   "de8PIL|N "dec "l09H"h"~ڣH"hhLcN d% LKN ' L9N +;8 ;i"W;i ;i"f:LR / 1;i/". +ZLRMK;i "o;i/;ic4"o ;ic".: 7k9m?s AuLR;ic"pLR ;i -i "5q    7)     7)LgYk7 m9LgY -  "  "G X  "o iX1 . $  mk"Ճ   : ;i/"l:  ";iz +i "o    7)     7)LRk7 m9LR +  "  "ڎ X  "b iX1 . $  mk"h   : ;i/"<:  " ;iz zk ;8  -"߿4;i{H"l ;i s  L\t E L\u L L\v F L\= +"z4;i{H"< ;i s  LWUt E LWUu L LWUv F LWU= - H H H H;i"hhhhL\L\L\   ßL[ "fcHHc"߿ ;iH"l ;i  L[  -RH`L\L\HH"߿HHHH"l ;i û㽰8㷅Hc"o dcHch c d c    LZ;iz +=H;H=H;Hz;i"hhhhLZULZULZU   ßLGU "dcHHc"z ;iH"< ;i  L3U  +H`LZULZUHH"zHHHH"< ;i û㽰8㷅Hc"_n dcHch c d c    LS;iz zk ;8 - i  L^ )L]^N ȈFj dL^L]^ ȈFj  -:d%%L]^ -"iL^%L^ L+^L^ -"֕L^CL^#L^ "g:o "G   i8H#he;iz + i  LW )LWN ȈFj dLWLW ȈFj  +:d%%LW +"dbLW%LW LtWLW +"+LWCLW#LW "7:o "ڎ   i8H#he;iz zk - ;8   La   + ;8   LZZ       : ʣ : p 0 7 9 (    )808PI - La / L -a / ߩ + LZZ / LSZ / ߩ  -QkOk  +l[j[    @@ -1513,612 +1473,618 @@ a    a !z  8      a !z  8        -  L_   / + 8PIL_8PI +  L)Y   / + 8PILY8PI  );izz z zk  [𫫘;8T -;ic 8PI0Lc;i -"VLCc LCc -;i?"k:;i?";i?H;iG;i"hhhhLb;iU)|;i;iU"V;i" :';iU;i?"k%;i?;i "Lb;i "ul" "Lyc9;igHH;i ;iC "@PhhIS"6;igHH;i  - "@Phh;iT+zz z -zk;ic L|a -;8V ;i;i":LFf#% ;i#"5: -N LEf;i"֕ +;ic 8PI0L\;i +"L\ L\ +;i?"j4;i?",;i?H;iG;i"!hhhhL\;iU)|;i;iU";i":';iU;i?"j%;i?;i "Le[;i "Hk""FL\9;igHH;i ;iC "IhhI"6;igHH;i  + "Ihh;iT+zz z +zk;ic LZ +;8V ;i;i"f:L_#% ;i#".: +N L_;i"+  E % - "U Le -"gLe i8 "o .8  C iN "ͳi8 -"Ճi8iX "5q .Y +-iX"Ճ  ;i#"YwrA?i "ͳA? -"ՃA?    "";i -"#;iVz + "% L^ +"7L^ i8 "_n .8  C iN "i8 +"hi8iX "o .Y +-iX"h  ;i#"prA?i "A? +"hA?    " ";i +" ;iVz zk -Z `   LgJsuu -s"[JJoqq -o"[kmm -k"[gii -g"[cee -c"[ _aa -_"[@[]] -["[WYY -W"[ ` a   Lqhg J0SU&g U -S"[CEE -C"[ ?AA -?"[@;== -;"[799 -7"[ a b   LiJ355 -3"[JJ/11 -/"[JJ+-- -+"[JJ+-) -'"[ b zz +Z `   L`Jsuu +s"}ZJJoqq +o"}Zkmm +k"}Zgii +g"}Zcee +c"}Z _aa +_"}Z@[]] +["}ZWYY +W"}Z ` a   Lag J0SU&g U +S"}ZCEE +C"}Z ?AA +?"}Z@;== +;"}Z799 +7"}Z a b   L\bJ355 +3"}ZJJ/11 +/"}ZJJ+-- ++"}ZJJ+-) +'"}Z b zz zk ;8  -  Lk  Lk    Lj  L=j  Lk ȈFj -(cH*ch"o:  Lk +  Le  Le    Lc  Lc  Ld ȈFj +(cH*ch"b:  Ld i8H -)he"%H%hLk -*(  ȈF j eHeh"o:  Lk +)he"%H%hLd +*(  ȈF j eHeh"b:  Ld i8H -)he"`Lk Jc -*(H J)he"o:  Lk +)he"^Ld Jc +*(H J)he"b:  Ld i8#e) -*(H J)he"o: +*(H J)he"b:  Mi8#e)) ))JJJJ;iz z zk ;8   -         L}n -  "oL}n  +         Lg +  "bLg  - L}n  ? 7   - L3n - . L3n#   L3n  Lm + Lg  ? 7   + L|g + . L|g#   L|g  LDg @Z   #    ,  .     -     M   2   ":):     P    "x  , . J    " \   L/l  ;i +     M   2   ":):     P    "w  , . J    "iU   Lxe  ;i zz z zk ZZZZ  - '"\  -   LHq   -"#  Lp -"#  L'p;i -"a  L$p ɪ L$p@ -"#)e_ -:"#)A;i -"a@    "\:LoLp -"#          -"#)/ -"#)  "\: '  )     -"l )zzzzzz z + '"Z  +   Lj   +".  L9j +".  Lpi;i +"  Lmi ɪ Lmi@ +".)e_ +:".)A;i +"@    "Z:LhL%j +".          +".)/ +".)  "Z: '  )     +"k )zzzzzz z zk;i -"a:   Ln;8&!!06#!c'o#8!6'o#:!c#:8!06!c%o! 8 #6%o!:c!: 8 #"f%"f8%"f!"fe8%  Lsw"f8%U%c  cԣc @ c -` #c!w"f8%U%c cԣc @ c -` #c;i&k%c%cc8#cc8# c  Lr#c#c @  @  `  ` #c;8X;i ;i":LPw ;i "o Lu;i"q "" Lu "ay   -X &;ic  ;ic LtLPw LPw%:;ie :ף % '-/;i%"~RLJw;i%"kY;iCA "5qCA    "LDwL{  L#}ȈFj +(cH*ch"bL#} )  i8H -)he")  +)he")  i8H -)he"ͳ  Lڃ -*( ȈF j eHeh"oLڃ +)he"  L#} +*( ȈF j eHeh"bL#} i8H -)he "yf  LڃJc -*(HJ)he"oLڃ +)he "e  L#}Jc +*(HJ)he"bL#} i8H#he )  ')      -*(HJ)he"oy +*(HJ)he"by i8H#he)')# ) FjFjFjFj   ;izz z -zkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkH)hkH @hkڢkڢ"k"Ȅ"Ȅ"Ȅk"Ԅ"Ԅ"Ԅ\Ȅ""C"""a"""" "%"k8k""n"Rk"R"C""""n"k"6"a"""{\\C"{\k, H"shk"Ԅ"n""{,"{N""ڢ"a"J"""""n"""a"{k"P""{ -"P i0""""8kڢ"P"P"{j"""""", kx0"(k(kx0 @""((kx0"R""C"n"P(kx0 ""((kx0"R"C(kx0_"a"5(kx0?""5(kx0"()k0(k(kx0, H"h(kx0"""(k +zkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkH)hkH @hkڢkڢ" ~k"~"~"~k"~"~"~\~"*~"}"}"a}"}"*~"*~"*~"C} "n}"*~k8k"}"}"~k"~"}" ~" ~" ~"}"}k"}"}"}"*~"}\~\}"~\~k, H"~hk"~"}" ~"},"}N" ~" ~ڢ"}" ~J"}"}" ~" ~"}" ~"}"}"}k"}"}"} +"} i0"}" ~" ~" ~8kڢ"}"}"}j" ~"}" ~" ~" ~" ~, kx0":~(k(kx0 @"~"q~(kx0"~"}"}"}"}(kx0 "~"q~(kx0"~"}(kx0_"}"~~(kx0?"~"~~(kx0"G()k0(k(kx0, H"~h(kx0"}"*~"}(k ;8   -"~RL   ,.   "oL} L}? 7   L)   L)  L@+7)Lf @Z  #   ,.         U  :   ": ):          L  !"x L}+7)0 -i  "y:L}  ,.     (  ,.    -" \    L;i zz z +"KLɃ   ,.   "bLǃ Lǃ? 7   Ls   Ls  Lӂ@+7)L @Z  #   ,.         U  :   ": ):          La  !"w Lǃ+7)0 +i  "x:Lǃ  ,.     (  ,.    +"iU    L;i zz z zk -ZZZZ -!&"@$  ))*(,. " $L -H`8L&L&Pà|@j耠XaF N47"p"L&LL&L&L&L&<|jXF4"DDLՍ9 + [𫫘ZZZZ +&"@$  ))*(,. " $Li +AH`8LyLyPà|@j耠XaF N47"pF"LyLy^LySLyLy |jtXF}4~"L(9 -C -C D - L+D+ - 4 - " -  - V:@) - 4( - " -  - zzzzz +Q +Q  + L~D+ + 4 + " +  + V:@)w + 4 + " +  + zzzz+z zk -;84;i!;"Lᑣ><!##!8ʆ#!&#!Lߑ#!  L쏩!%#' -;i%"i%  -LޏE  +;84;i!;"fL6><!##!8ʆ#!&#!L4#!  LA!%#' +;i%"db%  +L3E  i   - #!L% L#!#!*(   -  I  #! "o   - L     #!  8#!i8c"`: + #!Lz L#!#!*(   +  I  #! "b   + L抣     #!  8#!i8c"^:    - W#!i8c") + W#!i8c")  c # : -     LM  >#!#!  ;i4z +     L  >#!#!  ;i4z zk ;8X  - "oZ"l -;i P";;i ;iH;i "hhL"V\y" J?(4Q)G | "oZ"u;iH;i "hhL"G\ʆ" ;iH;i "hhLf"G\ʆE -ELP;iH;i " + "X"k +;i P" ;i ;iH;i "hhL"Z" J?(4Q)G | "X"t;iH;i "hhL"Zʆ" ;iH;i "hhL"ZʆE +EL;iH;i " hh -L: -"j: L - -"j: {> -"j: PC -"j: (% -"j:08 "oZH"HihL -"L^"q "[\"E"/"Z ";iXzz z +L +"/i: L_ +"/i: {( +"/i: P- +"/i: (%V +"/i:08 "XH"ghLO +"LI"q "[H"E"/" ";iXzz z zk ;8   R     -_ "i L%L  L -  LL闣 -L闦 -   "iEL◥%L◥h  "   +_ "db L%L  L +  LL> +L> +   "dbEL7%L7h  "    -  L - L  ii  '   L +  L + L  ii  '   L   -"i?E'%  - L -LL +"db?E'%  + L +LgL   -"'! - "e +"z'! + "ze    8ʆ    :     =;izz z -zkZ8PI0L䝧HV"fh>>V"fe>V"fe>V"fe +zkZ8PI0L9HV"dh>>V"de>V"de>V"de - >V"fe>V"fe>V"fe>V"fe>V"fe >V"fe""$$>V"fe6688>V"fe::<<>V"fe&&((>V"fe**,,>V"fe..00>V"fe2244>V"fe>>@@>V"feBBDD>V"feFFHH>V"feJJLL>V"feNNPP>V"feRRTTzzk + >V"de>V"de>V"de>V"de>V"de >V"de""$$>V"de6688>V"de::<<>V"de&&((>V"de**,,>V"de..00>V"de2244>V"de>>@@>V"deBBDD>V"deFFHH>V"deJJLL>V"deNNPP>V"deRRTTzzk ;8  &$;i -"  L>)  L>7)L@8 Hhd -  L@77L ȈFj +"  L)  L7)L8 Hhd +  L77L ȈFj :d%%z  -"i  L@%  L@"G  L@cJ)LΠ +"db  L%  L"ڎ  LcJ)L# c -8H   "qgh  L@ X8Hhd2 +8H   "fh  L X8Hhd2 i&8 -) e"5q -) L L W -i&  "gh  L@ 7  -i&  "qgh  L@78 +) e"o +) LE L⚠ W +i&  ":fh  L 7  +i&  "fh  L78  -i&H7he  "5q 8 &$ g c c   L;izz z +i&H7he  "o 8 &$ g c c   L ;izz z zk -;8|_? p Jk?_?_?     -k?    -k?   -k?  -k?_?_?" hhhh7    8PIL"d"pAE""H H*HO"idd"t""%D4;iH"Z| ;i "um 8_?PIL8 PI0Lͤ "um8_?PIm -a?X -k?"4mHH;i3";i3"^_H;i5H" ;i ,;i-";i-"^_H;i/H"hhh"i -" -PIO"ibC"j -,8PI: -a?: -k? - -;ie"I;i|z -zk -a? -k?" - -;ie -k?"`':L"[ -a? 8 -k?"4mH "umhh -k? - -;ie   L* 0 * JJ 4 LQ - ;8"  H;i"OdhLt ?"    O )"V")"V -         "oi") + ;8"  H;i"bhLM ?"    O )"&")"& +         "_ni")  - L7 -L7 - L7 + L +L + L -ed`dC5 d"V"a  +ed`dC5 d"&"k`  cHc h % cHc h 8H" -hL7 i -"ͳ i "ͳ .  -")"V)"V +hL i +" i " .  +")"&)"&  -")"V)"V   -")"V   +")"&)"&   +")"&   JJ))   -cHch:")"V)"V +cHch:")"&)"& -cHch:")"V)"V  -cHch:")"V   +cHch:")"&)"&  +cHch:")"&   JJ))    i  cHch  - LiU"yf"gh;i"zz z + LϜiU"e":fh;i"zz z zk ;8b  - ;i;i"L*;i/ ;i7 ;i7Li;i/ "~RLi;iG"oLi;iK"H;i;h;i/"~RLi;i/"kV;iK" ;i/" \ Li;i;i/"e;i/c)L]  y :::;i/cc  £:c /  L+LL " :c /  ) + ;i;i"fL;i/ ;i7 ;i7LB;i/ "KLB;iG"bLB;iK"H;i;h;i/"KLB;i/"*eV;iK" ;i/"iU LB;i;i/"-;i/c)L6  y :::;i/cc  £:c /  LLL餣 " :c /  ) -QkOk  c )L Lq +l[j[  c )Lݤ LJ   /    H c    Z    -c       LȮ +c       L    ;ibzz z zk +;8|"\8ʆPP8 +ʆPP8ʆ +" +g? p Js?g?g?     +s?    +s?   +s?  +s?g?g?"3 ";t "y;i    8PIL"jc"nHR""H H*HuN"dd"""D"4;iH"z ;i "Hl 8g?PIL8 PI0L!( "Hl8g?PIm +i?X +s?"lHH ;i3";i3"]H;i5H"Y ;i ;i-";i-"]H;i/H"Yhhh"Di +"D +PIO"aC"ii +,8PI: +i?: +s? + +;ie"B;i|z +zk +i? +s?" + +;ie +s?" :L٩"3Z +i? 8 +s?"lHA "Hlhh +s? + +;ie   Ln( 0 ( JJ 4 L ;8  &$;i -"  LN)  LN7)LPc8  Lر77L\ ȈFj -:%LE, +"  L)  L7)Lc8  L77L$ ȈFj +:%L ,  -"֕ -"֕ @ LPE  LP%  LP +"+ +"+ @ LE  L%  L   W -i&  "gh  LP 7 "G  LPcJ)Lⳣ +i&  ":fh  L 7 "ڎ  LcJ)L c -8H   "gh  LP8Hhd?8 +8H   ":fh  L8Hhd?8 ) e -i&"5q 7  -) L Z D -i&  "qgh  LP78 +i&"o 7  +) L Z D +i&  "fh  L78    -i&H7he"5q   8 &$ g c c      L';izz z +i&H7he"o   8 &$ g c c      L画;izz z zk ;8 -  Lt,.7L  +  L<,.7Lְ    -e:Lᶣ   +e:L     -e!ؐ L8ic +e!ؐ L¯8ic  d - " c Lie  Lc) -  5 .i c . i c  Li c )L-ic ? B    i c)Zie  ) Li c).     A@Z9 ))%: cic    Lv? 7  i"Hhi"`i"`;izz z + "5 c L¯ie  Lc) +  5 .i c . i c  L簣i c )L|-ic ? B    i c)Zie  ) L|i c).     A@Z9 ))%: cic    L>? 7  i"Hhi"^i"^;izz z zk ;8  ;i -" )   L  %7)       LӾ +")   L  %7)       L Ȉ -&L= :"V :"V x::II%%8 HhL߼ +&L :"& :"& x::II%%8 HhL ` -"֕E  L%  L -  L      L8 HhcHch7)C -"֕L -"i%  L9!  L  LcHch)b"G  L ȈFjeHeh !  @ 77L L U -i&  "gh  _ 7  -i&  "qgh   ;izz z +"+E  L%  L +  L      L8 HhcHch7)C +"+L緣 +"db%  L9!  L  LcHch)b"ڎ  L ȈFjeHeh !  @ 77L L U +i&  ":fh  _ 7  +i&  "fh   ;izz z zk ;8N     - L ?# ;i;i "Lţ ;i"5DL^8;i"Yw   !  -  LL£LL"U 86i "ͳ86i "ͳ86" 86 86"Ճ86i"ͳ  LB£64;i "#9"o :Hh  ) JJ J  W @    46 6"8$    Lţ86" -86i"     -i&"o LŠ LŠ  + Lx ?# ;i;i "fLa ;i".DL&8;i"p   !  +  LL"% 86i "86i "86" 86 86"h86i"  L +64;i " 9"b :Hh  ) JJ J  W @    46 6"8$    LW86" +86i"     +i&"_n LM LM  Ȉ &     x n -"i +"db  #   8Hh - L{ť )L{ţ"G } ȈFjeHeh -i&  "qgh  ;iNzz z + LC )LC"ڎ } ȈFjeHeh +i&  "fh  ;iNzz z zk ;8     .   -"m%     Lʣ  -"A1 -" -    +  -  "mLȣ"mLȣ& f Lyǣ8"'@""qh"" c8 PI0 j Lȣ"mLbȣ"8"'@""qh" +"l%     Lqģ  +"1 +"s -    +  +  "lLh£"lLh£& f LA8"¼@""g""u c8 PI0 d LN£"lL*£"u8"¼@""g"  -"c8PI0\c8 PIK8PI  -H"'h"j -   "  Lʣ - $           "' +"uc8PI0\c8 PIK8PI  +H"¼h"d +   "  LQģ - $           "¼  -""Ha" -""  0cH  h  :  88PI0Lɣ& f Lwʥ & $8 -  +  -"i0   -"#i0        Ls  ,           )Е ;izz z +""_"5 +"A"s  0cH  h  :  88PI0L£& f L?ĥ & $8 -  +  +"i0   +"i0        L;  ,           )Е ;izz z zk - ;8     "^ Lъ + ;8     "W Lˊ   - Lѥ - # )/"[  J   -LѩL  "[  JL   -Lѥ -"Lѣ LѠ64 -iC"` Lѥ -iN"`# -i\" " H      LѠ)"a + L˥ + # )/"Y  J   +L˩L  "Y  JL   +L˥ +";Lˣ Lˠ64 +iC"^ L˥ +iN"^# +i\" " H      Lˠ)"k` E)  -:LѠ +:Lˠ : -7:Lѥ -iI"`7: Lѥ -iK"`# -iX" -iF"`  Lѣ -c JJJJeHeh   L8 Hh -"V Lѩ    LѦi$&c (* cHch02e -ib"`: LѠ: Lѥ -id",.&&LLР: L(cH*c h,.G"aFj77eHeh&i ȈFj " Lѩ  Lѥ -ih"`Lѥ -"o:L   -i6"`ULѥ -i8"RRkaAd -i"rrEAa> -i " -i$"    ;izz z +7:L˥ +iI"^7: L˥ +iK"^# +iX" +iF"^  Lˣ +c JJJJeHeh   L8 Hh +"& L˩    L˦i$&c (* cHch02e +ib"^: Lˠ: L˥ +id",.&&Lʠ: L(cH*c h,.G"k`Fj77eHeh&i ȈFj " L˩  Ll˥ +ih"^Ll˥ +"b:Ll   +i6"^ULl˥ +i8"RRkaAd +i"rrEAa> +i " +i$"    ;izz z zk -;8B57 1"K +;8B57 1" +  -L٣-/) + % '!#  1L -HH"lhhh383PI0L٩-/))++%'!!## 9? A;=%%83PI0?-/))++%'!!##9 ?A ;=Lң)+LQԥ +Lӣ-/) + % '!#  1L +HH"<hhh383PI0Lsө-/))++%'!!## 9? A;=%%83PI0?-/))++%'!!##9 ?A ;=Ḷ)+LΥ c% Z /    F -c% z d    !#  LU٩L٣Lգ?ALգ! # " -c%))#H#hHHR"hh  Lե -c%)#H#hHH8"hh  Lե +c% z d    !#  LөLӣLϣ?ALϣ! # d" +c%))#H#hHHX "hh  Lϥ +c%)#H#hHH> "hh  Lϥ c%)Ȉ &#H#h  5 -c%)     Lhأ?ALף;=Lף 8?HCh" -c%))Hh92,75!#7H7H"hhHH* "hh Lץ -c%)Hh92,75!#7H7Hs"hhHH "hh Lץ +c%)     L0ң?ALѣ;=Lѣ 8?HCh" +c%))Hh92,75!#7H7H"hhHH} "hh Lѥ +c%)Hh92,75!#7H7H_"hhHHe "hh Lѥ c%)Ȉ &Hh 5#H#h c%)    u8;H?hC  -c%     ! # L ;cH?ch8        9 ?A ;=%+)!#!)#+!# 9? A;=%L2өR "1;iBz +c%     ! # L;cH?ch8        9 ?A ;=%+)!#!)#+!# 9? A;=%L̩ "1;iBz zk ;8   - ;i"q%LT)H + ;i" %Lۥ)H  - e h   f/_\Xɀ"aLT LT   + e h   f/_\Xɀ"y_Lۣ Lۣ    -eL.ڣ    f / L \ L            +eLӣ    f / Lۣ \ L             : -e.I Lܥ +e.I LG֥  : -e.Lܥ +e.LG֥  :: -e.Lܣ -e , Hi eh LT  .i e   2 +e.LG֣ +e , Hi eh Lۊ  .i e   2 : e . :ʦ  -eLT  +eL۩   -e L % +e Lۣ %  e.     ' : -e. :բ i  "o  )       +e. :բ i  "_n  )        -e  L` L.  L L LɀK  "#:#/ )    } :.      L   i c     LߣLߩ"a{AZ     a'z  8        $_         i c     L    4       Lf      +e  L(ڣ Ldۣ.  Ldۣ L٣ L٣ɀK  "z#:#)    } :.      Lۣ   i c     L٣LU٩"y_{AZ     a'z  8        $_         i c     Lۣ    4       L.          # #      JJNJ              + ;iz z zk  -     '         Lݣ  LܣL - ;8   ;iO"o;i -    LT % ;iO" LV +     '         Lף  L֣L + ;8   ;iO"m;i +    Lߣ % ;iO"o L       0 0 0     " O - %         "  * .    %  n    0 D9  9 -"f)e80      -%   . L    * 4 +"d)e80      +%   . L    * 4      s   0 D9  9 -"f)e80      +"d)e80           -   l d    l '            %;iO"?;izz z -zk-)"L -i +   l d    l '            %;iO"Ҋ;izz z +zk!)"Li - ;c)L0 -# :#%;iO""ԣ -)/:"  ;iO"ʣ%;iO "إ  + ;c)L0 +# :#%;iO""oԣ +)/:"  ;iO"oʣ%;iO "oإ  -LVLEL= -7;iO" LV # :Gi +LLߩEL +7;iO"o L # :Gi - -+)'L# :L( d EiGiʃL d 7;ʃ + -+)'L# :L d EiGiʃL d 7;ʃ -+)' d L-H;i;i'8  -+)' ;i;i;i -"  ;i;i;i -"  3 x  'c      #0cH;i1ch # # L_#:&##;i/c - ##:#%;iO""ԣ:;iO;i/c"ң%;iO "إ  +"B  ;i;i;i +"?  3 x  'c      #0cH;i1ch # # L'#:&##;i/c - ##:#%;iO""oԣ:;iO;i/c"oң%;iO "oإ  -LViH -;i1"h;i/"^_ +LiH +;i1"h;i/"] # :# -%;iO"" +%;iO""o  ԩ;i/c)6 -%;iO "إ J;iO;i/c";iO"  LE - ;88"Z[DF HJ "Z "Z  L % L2 "Z "Z    % L"  -  +) '+@a  )"+"Q[6+"Q['++"Q[ "Q[ )L+L 0 {9 p 80  #+-' +%;iO "oإ J;iO;i/c"o;iO"o  L  + ;88"YDF HJ "_Y "XY  L % L "_Y "XY    % L  +  +) '+@a5  )"+"Y6+"Y'++"Y "Y )L+L 0 {9 p 80  #+-'  -c)c"Q[+ )L) +c)c"Y+ )L)  -c)c+"Q[ L * L#+3 +c)c+"Y L * L#+3   +)L - + 8  ' L . .#+;i8zz z -zk+"Q[L z  t  . "Q[+L l h   j +#"Q[e l *#+ ++#"Q[3 h LT#+ ++#"Q[ )'"Z "Z   -   +)'"$ &   L$& p :#&"$ - & +)'ǩ & E G & & e 7g & ,"["l[T L, &  S L c L: s L& d Lu: i Lu# &"["l[ L # # )   # "$  &)"#  -"c[ L$""Z $""Z  V ;  # @ LHh HH"H["`hhL"c[%# `  "c[ #   $;"[ "H;i/h8  #    Lh"H[%H"[h"["H[&)H"[h"["$ L# "[iNʆ# (# + + 8  ' L . .#+;i8zz z +zk+"YL z  t  . "Y+L l h   j +#"Ye l *#+ ++#"Y3 h L#+ ++#"Y )'"_Y "XY   +   +)'"$ &   L& p :#&"$ + & +)'ǩ & E G & & e 7g & ,"WZ"Y% L &  S L c Lb: s L& d L=: i L=# &"WZ"Y L # # )   # "$ M &)"#  +"Y L$""_Y $""XY  V ;  # @ LHh HH"Y"_hhL"Y%# `  "Y #   $;"cZ "kH;i/h8  #    L0"Y%H"KZh"}Z"Y&)H"KZh"}Z"$ L# "WZiNʆ# (# I)8ʆ# "8    #   % -;"[ "H;i/h8  "$    #NJ - )8PI)  # @# #      # c):;i-e 0 #  %   @#     "#     # L# E) )8PI "[c      -    )8PI' "H[ H"[h"[  ȣ     )8PI0  "[ # Q "H[0H"[h"[@# .  # xX"H[H"[h"[  [# N #  +  #  -  "H[ )H"[h"[  )8PI#"H[0H"[h"[:    = : "H[ );i-e)H"[h"[    L - ;"[ ]"["l[   #  "|c  # 1  "H[ H"[h"[ : ۣ    L  "H[)H"[h"[: :  "$ "H[ H"[h"[:ݣ L    "H[)H"[h"[ L +;"cZ "kH;i/h8  "$    #NJ + )8PI)  # @# #      # c):;i-e 0 #  %   @#     "#     # L# E) )8PI "Zc      +    )8PI' "Y H"KZh"}Z  ȣ     )8PI0  "Z # Q "Y0H"KZh"}Z@# .  # xX"YH"KZh"}Z  [# N #  +  #  -  "Y )H"KZh"}Z  )8PI#"Y0H"KZh"}Z:    = : "Y );i-e)H"KZh"}Z    L - ;"cZ ]"WZ"Y   #  "b  # 1  "Y H"KZh"}Z : ۣ    L  "Y)H"KZh"}Z: :  "$ "Y H"KZh"}Z:ݣ LR    "Y)H"KZh"}Z LT @!#%')+-/7:=@CFILORUX[^a@@0 PiYG pbkQD!Z 6_1aB +6b1\'''''''''######''# ##'# '# '# ##'## ##'''# #''''''''''######## ########'''''''''''##'# ''''''''######## ''''''''######## gcJ''##'; #''# '''# ### ### '''# '#                                                                      gcJ gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; ; #' #''' ### ### #''' #''''''''''######'## #' #' #'## #''## ##'''# #'''# '##'' ########''''''''gcJ; ########'''''''' #'##''''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #'''# #'''## ##''# ##'# '# '# ##'## ##'''# #''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''## ##'''# #''''# #'''## ##''# ##'# '# '# ##'######'''''''''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''######'''''''''1`J > + PH +N 2"RA n c 6t^e|gk ;8N -;i"^ L: +;i"W L:  - G  G"[  JL: + G  G"Y  JL: L: -b -CECEH;iEI"OdhCE(CEEC:E%C% -CEH' 4   " ) 52$HJJJJJJh":  "8:77 -H"VH"7979L:\ +3 +CECEH;iEI"bhCE(CEEC:E%C% +CEH' 4   " ) 52$HJJJJJJh":  "8:77 +H"&H"7979L:\ Z L:JLJ -L H;iLI"OdhL:4??JL!?8JJLL +L H;iLI"bhL:4??JL!?8JJLL   ? A ? AJɀLL:   - 4JJ4J   4JL:   "UcJHcNh$&  + 4JJ4J   4JL:   "%cJHcNh$&  ; ==;  L|LHLhZJ h  -n= -nd - '&LJ"V(**(&& +$= +$d + '&LJ"&(**(&&   i i Hd e e -:H"V +:H"& (*7(*+    , .(*LpL:LNLJ ȈFj  -`= -`d - '&LJ"V += +d + '&LJ"&  .  &  i  <   -"aFji  cH:H"V +"k`Fji  cH:H"& "Ȉ -&H"V    -, .(*?cHCch.,5"acHchc(Hc,h020cCH4cGh +&H"&    +, .(*?cHCch.,5"k`cHchc(Hc,h020cCH4cGh :EC:II%%80H4h  9cHch cc - ,,..L5"VF: + ,,..L5"&F: iiii     - 5"Vc,Hc0h + 5"&c,Hc0h  ,. &&&&  0c H4ch 8 -?HChJLL:8JHNhH209"ah8Hh8(H,h "V +?HChJLL:8JHNhH209"k`h8Hh8(H,h "&   - !;=Ff   L} L:  L r;=& &@ &  p4JJ   =; P;= &   0L: 7;=+ &    ;=LPL:   L:H -"o' - "5q -i H"yf   -i"yf 5   +"_n + "o +i H"e   +i"e 5   "  -i"yfJL -iJ"yf -i LJ"ͳ   -i?"yf -i"yf -iA?"ͳ  L  -iC&$"ͳ -i$.,"ͳ -i,"ͳ -i0"yf -i2"yf @ )B  -iG"5qf -i'&$"ͳ -i,"yf $ )&  -i+"5q -iU"yfCA -I"ghL:  LH CAi -I"ghH -"o -RRaA"ͳ -irrAa"ͳ +i"eJL +iJ"e +i LJ"   +i?"e +i"e +iA?"  L  +iC&$" +i$.," +i," +i0"e +i2"e @ )B :  +iG"of +i'&$" +i,"e $ )& &  +i+"o +iU"eCA +I":fhL:  LH CAi +I":fhH +"_n +RRaA" +irrAa" i -:"ͳ -i"ͳ -iU"yfCAi -I"ghCA -I"gh7H"f -"o +:" +i" +iU"eCAi +I":fhCA +I":fh7H"d +"_n    5L8  ( * @@ -2137,13 +2103,13 @@ H  H -I"ghL:cHch +I":fhL:cHch 8Hh  L      ZJL   4          49JL H -;iI"ѦhL:HI"OdhL:L:  H -"ͳ -i"ͳ -i"ͳA   +;iI"hL:HI"bhL:L:  H +" +i" +i"A    @@ -2151,7 +2117,7 @@ H   -"ͳ, +", .  79  @@ -2161,33 +2127,17 @@ H  H -I"gh;iNzz z +I":fh;iNzz z zkH -"ocHch +"_ncHch 8Hh  L - L{  @!#%')+-/=@CFILORUX[^adg@@$v 0:,4]! -/Ty\@Bk=m w/SBn=h'''''''''######''# ##'# '# '# ##'## ##'''# #''''''''''######## ########'''''''''''##'# ''''''''######## ''''''''######## gcJ''##'; #''# '''# ### ### '''# '#                                                                      gcJ gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; ; #' #''' ### ### #''' #''''''''''######'## #' #' #'## #''## ##'''# #'''# '##'' ########''''''''gcJ; ########'''''''' #'##''''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #'''# #'''## ##''# ##'# '# '# ##'## ##'''# #''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''## ##'''# #''''# #'''## ##''# ##'# '# '# ##'######'''''''''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''######'''''''''7@3 m@wvm  ?Rd  "y@R+R(R$R -R S UWYZ ] acgkmmmmmmigc_ -] [YX V T -S"R%R)R+R 0R0R0R0R0R0R0R0R0R0a0R0R0R0v trponnnmnnnnnmnnnnnnprt v0R0R0R0~R(R(R(RRRRRRRRRRRRRRRR0R0R0R0R0R0R0R0R0R0mphc!_$]&[(Y*W,U-U.S  S R%Q(Q*P*P,P,P,P,P,P*P*P(Q&R R  S.T.U,W*Y([&]$` cho~~~iiiiiiiiiiiiiii0R0R0R0R0R0R0R0R0R0^O:3P:2Q:1R:~:~:~:~:q  BK:o BL:mBM:lBN:k:j:i:h:gBG:fBH:eBI:dBJ:c:b:a:`:_BC:^BD:] BE:\ BF:[:Z:Y:X:WB?:VB@:U BA:T  BB:S -:R -:Q :P :O:N:Md1ru6:Lb]f:Ka?|Q:J_f u6:J_J f:J  -  ^$liPzQ:TnYX0Pzu6:6xp[X0Pzf: `t\X0PzQ:Cy_X0Pzu6:g}b X -0Pzf:Qe X 0PzQ: X0: X0:  X0::M X0::M X0::M X0::M X0 X0 X0  X0! X0"ǝM X0#ƝM XU7, 0$ŝM -XK  0%ĝMXV> * 0&XN&/0'XWD'0(eXR/-0Pz)}M Gz*ˠMV*! -!+^+ʠMs8*) -!*=s,ɠMwA*' -!*Ew-ȠMh2*' -!*7k. R*% "*/a /L q< *S O0 `d, *Ew ]2(j}H*7kf5ϞRB{m4*/al.8ΞTQXV u9;͞Uc~I>̞W3o T@,F| -cC,Zg#F-fr5I.;vx@LӟҟџПi  - -      !#%&' ())*+%'./0 *12 3 4!5$/"6#6&1$8(3)>,8-9+@,A/<0>.C/E1G4B6D4J7E7F5K7N:I8O;R>N>N>VAQ@XAYDVB[EVD\E]H[F_G`HaIaIbL_KdLfOcNgOhSgQkRlUjTnUoXn[qZt[u^u]w`x_z`{c{c~de~fghhhijklmmnnopqqqrrssstttuuvvvvwwwwxxyyz{mq\^\^\^\o^\S\H\D9\p\\\\l\~\\\\+\߿\\\Y\$\^u\Z\#\n\\ݐ\\t\\\\=s\F\ \i\S~\ \\\r\w\b\&a\\N\^\f\\h7\\ib\zd\\\s\u\{\&t\t\u\|\Z|\~\܇\jz\~q\u\<\tt\z\\o\b0HZ + L{ \\&]\>]\\\=}\ۂ\2\2o\}\ރ\\<\\\Y\|\\z\3\T\L\\s\\\\}\p\7\\;\\>\q\\F\\=|\\8\\p\oZ\c \LG\\\re\D\0\\a\c\c\ڮ\fr\;t\y\r\Ps\s\Ez\z\|\o\x\ p\\υ\s\Vx\\n\`\j\i\_\\=\J\\\\\\\\-\z0HZ  - [dH"Uf+z + [dH"_+z zzz z zzzzzzh@0HZ  - [dH"lZ+z + [dH"X+z zzz z -zzzzzzh@8[dH\rP \ No newline at end of file +zzzzzzh@8[dH\qP \ No newline at end of file diff --git a/roms/f256jr/toolbox.csv b/roms/f256jr/toolbox.csv index f654ac5..9f2c660 100644 --- a/roms/f256jr/toolbox.csv +++ b/roms/f256jr/toolbox.csv @@ -15,5 +15,4 @@ "2E","toolbox-2E.bin" "2F","toolbox-2F.bin" "30","toolbox-30.bin" -"31","toolbox-31.bin" "3F","toolbox-3F.bin" diff --git a/roms/f256k/README.md b/roms/f256k/README.md index d0523cf..7068d20 100644 --- a/roms/f256k/README.md +++ b/roms/f256k/README.md @@ -1,6 +1,6 @@ -# ROM Files for the F256K +# ROM Files for the F256Ke -This directory contains BIN files for programming the F256K flash memory with the Foenix Toolbox. +This directory contains BIN files for programming the F256Ke flash memory with the Foenix Toolbox. ## How to Install diff --git a/roms/f256k/toolbox-20.bin b/roms/f256k/toolbox-20.bin index 7118adc..aedf1b3 100644 Binary files a/roms/f256k/toolbox-20.bin and b/roms/f256k/toolbox-20.bin differ diff --git a/roms/f256k/toolbox-21.bin b/roms/f256k/toolbox-21.bin index 56efc41..2390c4f 100644 Binary files a/roms/f256k/toolbox-21.bin and b/roms/f256k/toolbox-21.bin differ diff --git a/roms/f256k/toolbox-22.bin b/roms/f256k/toolbox-22.bin index 1eb7764..1926589 100644 Binary files a/roms/f256k/toolbox-22.bin and b/roms/f256k/toolbox-22.bin differ diff --git a/roms/f256k/toolbox-23.bin b/roms/f256k/toolbox-23.bin index e1ad735..c14d2a8 100644 Binary files a/roms/f256k/toolbox-23.bin and b/roms/f256k/toolbox-23.bin differ diff --git a/roms/f256k/toolbox-24.bin b/roms/f256k/toolbox-24.bin index eaab397..5a9bfa8 100644 Binary files a/roms/f256k/toolbox-24.bin and b/roms/f256k/toolbox-24.bin differ diff --git a/roms/f256k/toolbox-25.bin b/roms/f256k/toolbox-25.bin index 8c26f19..626c8d8 100644 Binary files a/roms/f256k/toolbox-25.bin and b/roms/f256k/toolbox-25.bin differ diff --git a/roms/f256k/toolbox-26.bin b/roms/f256k/toolbox-26.bin index 38069ec..ee79933 100644 Binary files a/roms/f256k/toolbox-26.bin and b/roms/f256k/toolbox-26.bin differ diff --git a/roms/f256k/toolbox-27.bin b/roms/f256k/toolbox-27.bin index 0ad5d88..8e45d4f 100644 Binary files a/roms/f256k/toolbox-27.bin and b/roms/f256k/toolbox-27.bin differ diff --git a/roms/f256k/toolbox-28.bin b/roms/f256k/toolbox-28.bin index ec22b46..b6f988a 100644 Binary files a/roms/f256k/toolbox-28.bin and b/roms/f256k/toolbox-28.bin differ diff --git a/roms/f256k/toolbox-29.bin b/roms/f256k/toolbox-29.bin index 7e246c1..5874034 100644 Binary files a/roms/f256k/toolbox-29.bin and b/roms/f256k/toolbox-29.bin differ diff --git a/roms/f256k/toolbox-2A.bin b/roms/f256k/toolbox-2A.bin index 9982269..8532168 100644 Binary files a/roms/f256k/toolbox-2A.bin and b/roms/f256k/toolbox-2A.bin differ diff --git a/roms/f256k/toolbox-2B.bin b/roms/f256k/toolbox-2B.bin index 8d20948..2223522 100644 Binary files a/roms/f256k/toolbox-2B.bin and b/roms/f256k/toolbox-2B.bin differ diff --git a/roms/f256k/toolbox-2C.bin b/roms/f256k/toolbox-2C.bin index 56670cc..4cec4c7 100644 Binary files a/roms/f256k/toolbox-2C.bin and b/roms/f256k/toolbox-2C.bin differ diff --git a/roms/f256k/toolbox-2D.bin b/roms/f256k/toolbox-2D.bin index 61257eb..c3e3ed6 100644 Binary files a/roms/f256k/toolbox-2D.bin and b/roms/f256k/toolbox-2D.bin differ diff --git a/roms/f256k/toolbox-2E.bin b/roms/f256k/toolbox-2E.bin index 94c187d..f7fa620 100644 Binary files a/roms/f256k/toolbox-2E.bin and b/roms/f256k/toolbox-2E.bin differ diff --git a/roms/f256k/toolbox-2F.bin b/roms/f256k/toolbox-2F.bin index 6fabd8a..0bcbd29 100644 Binary files a/roms/f256k/toolbox-2F.bin and b/roms/f256k/toolbox-2F.bin differ diff --git a/roms/f256k/toolbox-30.bin b/roms/f256k/toolbox-30.bin index 9f92b80..e46db4d 100644 Binary files a/roms/f256k/toolbox-30.bin and b/roms/f256k/toolbox-30.bin differ diff --git a/roms/f256k/toolbox-31.bin b/roms/f256k/toolbox-31.bin deleted file mode 100644 index 9738909..0000000 Binary files a/roms/f256k/toolbox-31.bin and /dev/null differ diff --git a/roms/f256k/toolbox-3F.bin b/roms/f256k/toolbox-3F.bin index 2bfa923..c6d0aec 100644 Binary files a/roms/f256k/toolbox-3F.bin and b/roms/f256k/toolbox-3F.bin differ diff --git a/roms/f256k/toolbox.bin b/roms/f256k/toolbox.bin index ff8db04..6de00da 100644 --- a/roms/f256k/toolbox.bin +++ b/roms/f256k/toolbox.bin @@ -1,62 +1,45 @@ -9;<=>?@AB /,123456ABCD - -> OK.*111213141517181920212324303132OVsd0sd1 RAMROM%d:/fd38668K86088K960ARMELFM32PGXPGZPPCRCESPU 0ODDSD0SD1INFNaN %s -None%02XGenXEVID/sd0FILEFR20MIPSNONEPGXRH32S370S390V800COM1COM2EVENMARK %s/ -%02X %04X /sd0/%s%s -%04X:%d:%sIAMCUPPC64SPARCSPACE %4ld %s%08XC256 UF256 PGenX32M68020M68030M68040(null)dev = PARISCVPP500SCREEN+,;=[]%s%s%s +9;<=>?@AB /,123456ABCDOK.*111213141517181920212324303132OVsd0sd1 RAMROM%d:38668K86088K960ARMELFM32PGXPGZPPCRCESPUODDSD0SD1INFNaNNone %s +%02XGenXEVID/sd0FILEFR20MIPSNONEPGXRH32S370S390V800COM1COM2EVENMARK%s%s +%04X:%d:%sIAMCUPPC64SPARCSPACE%02X %s%08XC256 UF256 PGenX32M68020M68030M68040(null)dev = PARISCVPP500SCREEN+,;=[]%s%s%s %s: %s %024lX:A2560 KA2560 MA2560 XC256 U+F256 JRF256 K2F256 KeM68040VUNKNOWNi486DX4*float*CONSOLE%s: #%d no mediaA2560 U+C256 FMXF256 JReF256 K2cF256 K2eM680EC30M68EC020M68EC040ReservedWDC65816rtc_init*:<>|"?FAT32 Sector: -not foundCartridge%%_%%$ӲӖz^Ӕiii|itidHdHdHGFA2560 K40A2560 K60M68SEC000chan_openChannel: PSG Muted.bad handlei486DX2 50i486DX2 60fchan_readCPU %s +not foundCartridgeFЂfJ.gh_hWhOhGhAAA@,@A2560 K40A2560 K60M68SEC000chan_openChannel: PSG Muted.bad handlei486DX2 50i486DX2 60fchan_readfile lockedCPU %s Model %s -file lockedA2560X - LBA2560X - PBGenX32 - LBGenX32 - PBchan_free: MIPS_RS3_LESPARC32PLUSfsys_mkfs: MSDOS5.0fsys_opendirbad argumentExternal SDCInternal SDCprint(%d,..)fchan_read_b /sd0/test.txtfsys_closediraccess deniedgeneral errorinvalid drivemedia changednot supportedout of boundsout of memoryunknown errorA2560X - CUBEGenX32 - CUBEchan_read: %s{lg^U YPXJXDX YJX Y@ /sd0/hello.txtHello, world! -Memory %d KB -file not foundinvalid objectout of handleschan_alloc(%d)chan_close(%d)chan_alloc: %dloader found: bad binary filenot enough coreflush error: %dFATFS Error: %dfsys_setlabel: /sd0/renamed.txtClock %lu MHz -Got channel #%d -device not ready/sd0/fnxboot.pgx/sd0/fnxboot.pgz/sd1/fnxboot.pgx/sd1/fnxboot.pgzBooting from %s -0123456789ABCDEFcdev_init_systemcdev_register %s -Contents of %s: -bad device numberinvalid path nameprohibited accessunknown file typeF%d-%s -proc_exec stack: proc_exec start: - ӈ+.,;=[]/*:<>|\"?CODEC initialized.Console installed.Interrupts enabledTimers initializedbad channel numberCommand not found.Mounting drive #%dfsys_mkdir error: directory not foundfile system timeoutoperation timed outtoo many open fileschan_read(%d,%p,%d)chan_seek error: %dFile system error: fchan_write error: fsys_delete error: fsys_load_ext ext: fsys_open error: %d. - NO NAME FAT NO NAME FAT32 low level disk errorno file system foundchan_get_records 1: chan_get_records 2: chan_write error: %dchan_write(%d,%p,%x)fsys_set_cwd error: -Directory for /sd0/ -Foenix Retro Systems -SDC driver installed.Wrote %d characters. -chan_status error: %dCould not load file: Could not open file: uart_open: Bad parity -Trying to create: %s -Indicators initializedInterrupts initializedToolbox v%d.%02d.%04d -file is not executableCouldn't load file: %dchan_write_b error: %dFPGA %04X %04X.%04X -volume has no work area #+-x0i[Xop uxJPGZ 24-bit count: %06lxPGZ 32-bit count: %08lxSetting default loader.uart_open: no BPS tokenCould not open file: %d -File system initialized.Text system initialized.drive is write protected +A2560X - LBA2560X - PBGenX32 - LBGenX32 - PBchan_free: MIPS_RS3_LESPARC32PLUSfsys_mkfs: MSDOS5.0bad argumentExternal SDCInternal SDCprint(%d,..)fchan_read_b access deniedgeneral errorinvalid drivemedia changednot supportedout of boundsout of memoryunknown errorproc_exit: %dA2560X - CUBEGenX32 - CUBEchan_read: %s&ERQQ~QERQER@ file not foundinvalid objectout of handlesMemory %d KB +proc_set_shellchan_alloc(%d)chan_close(%d)chan_alloc: %dloader found: bad binary filenot enough coreproc_get_resultflush error: %dFATFS Error: %dfsys_setlabel: device not ready/sd0/fnxboot.pgx/sd0/fnxboot.pgz/sd1/fnxboot.pgx/sd1/fnxboot.pgzBooting from %s +Clock %lu MHz +0123456789ABCDEFcdev_init_systemcdev_register %sbad device numberinvalid path nameprohibited accessunknown file typeF%d-%s +proc_exec stack: proc_exec start: q_M;)߁+.,;=[]/*:<>|\"?vlCODEC initialized.Console installed.Interrupts enabledTimers initializedTop of memory: %lxbad channel numberCommand not found.Mounting drive #%dfsys_mkdir error: directory not foundfile system timeoutoperation timed outtoo many open fileschan_read(%d,%p,%d)chan_seek error: %dFile system error: fchan_write error: fsys_delete error: fsys_load_ext ext: fsys_open error: %d> + NO NAME FAT NO NAME FAT32 low level disk errorno file system foundchan_get_records 1: chan_get_records 2: chan_write error: %dchan_write(%d,%p,%x)fsys_set_cwd error: SDC driver installed.Foenix Retro Systems +chan_status error: %dCould not load file: Could not open file: uart_open: Bad parityIndicators initializedInterrupts initializedfile is not executableToolbox v%d.%02d.%04d +Couldn't load file: %dchan_write_b error: %dvolume has no work areaFPGA %04X %04X.%04X +n Z#K+@-10"XopuxPGZ 24-bit count: %06lxPGZ 32-bit count: %08lxSetting default loader.uart_open: no BPS tokenFile system initialized.Text system initialized.drive is write protected Select a boot source: Default boot source: %s -Error while printing: %dCouldn't get channel: %dReached end of PGZ file.fsys_open out of handlesCould not find screen %duart_open: Bad stop bits -Creating /sd0/hello.txt -%04d-%02d-%02d %02d:%02d could not write to devicedevice is write protectedCouldn't execute file: %dPGZ 24-bit address: %06lxPGZ 32-bit address: %08lxfsys_open out of channelsBlock device system ready.Could not create file: %d -could not read from deviceBooting: /sd0/fnxboot.pgx +Error while printing: %dCouldn't get channel: %dReached end of PGZ file.fsys_open out of handlesCould not find screen %duart_open: Bad stop bitscould not write to devicedevice is write protectedCouldn't execute file: %dPGZ 24-bit address: %06lxPGZ 32-bit address: %08lxfsys_open out of channelsBlock device system ready.could not read from deviceBooting: /sd0/fnxboot.pgx Booting: /sd0/fnxboot.pgz Booting: /sd1/fnxboot.pgx Booting: /sd1/fnxboot.pgz -Returning a bad extension.uart_open: no parity tokenCould not open directory %doqO  *r 6r :; [. \! Channel device system ready.FAILED: Console installationfile system assertion faileduart_open: no stop bit tokenfile system invalid parameterCould not mount device %d: %dfsys_mount called f_mount: %dInitializing the text system...FOENIX DEBUG OUTPUT------------creation of file system aborteddevice could not be initializedNo bootable device is present. -PGZ 24-bit start address: %06lxPGZ 32-bit start address: %08lxuart_open: Bad data word lengthuart_open: no data length token -fsys_delete("/sd0/renamed.txt")Scanning for bootable devices... -FAILED: SDC driver installation %dFAILED: file system initializationtxt_get_device: number mismatch %d||{|f|Q|<|&||{A valid boot record was not found. - AAA 22222 55555 6 00000 X XA A 2 5 6 0 0 X X A A 2 5 6 6 0 0 X X A A 22222 55555 66666 00000 X XAAAAA 22222 55555 66666 0 0 X 27%77 776 6@667777{7o7 c7@W7K7>88 8877 7@77 PC: %08X Address: %08X +Returning a bad extension.uart_open: no parity tokent(rv*'*6:[\Channel device system ready.FAILED: Console installationfile system assertion failedproc_exit: Attempting rebootuart_open: no stop bit tokenfile system invalid parameterCould not mount device %d: %dfsys_mount called f_mount: %dInitializing the text system...FOENIX DEBUG OUTPUT------------creation of file system aborteddevice could not be initializedNo bootable device is present. +PGZ 24-bit start address: %06lxPGZ 32-bit start address: %08lxuart_open: Bad data word lengthuart_open: no data length tokenScanning for bootable devices... +FAILED: SDC driver installation %dFAILED: file system initializationtxt_get_device: number mismatch %duuuuuvu`uJu4uA valid boot record was not found. + AAA 22222 55555 6 00000 X XA A 2 5 6 0 0 X X A A 2 5 6 6 0 0 X X A A 22222 55555 66666 00000 X XAAAAA 22222 55555 66666 0 0 X l0_0S0G0;0/0 #0@0 0000000 0@00x1R1F1:1.1"1 1@ +10 PC: %08X Address: %08X Press SPACE for default. Could not load /sd0/fnxboot.pgx: %d Could not load /sd0/fnxboot.pgz: %d Could not load /sd1/fnxboot.pgx: %d Could not load /sd1/fnxboot.pgz: %d - _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / / / __/ //___ \/ __ \ / / / / / /___ / __/____/ / /_/ / / /_/ / \____//____/_____/\____/ \____/ PC: %08X       _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / __ / / __/ //___ \/ __ \ / / / /_/ /_/ /___ / __/____/ / /_/ / / /_/ /_ __/\____//____/_____/\____/ \____/ /_/ Unable to mount drive %s, FatFS Error: %d ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / //_/ / /| | __/ //___ \/ __ \/ / / / / ,< / ___ |/ __/____/ / /_/ / /_/ / / /| | /_/ |_/____/_____/\____/\____/ /_/ |_| 7g92g;-g<(g=#g>g?g@g;g=g?g ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / / /| | __/ //___ \/ __ \/ / / / / / / / / ___ |/ __/____/ / /_/ / /_/ / / /_/ / /_/ |_/____/_____/\____/\____/ \____/ Address Error Bus Error Division by Zero Error Illegal Instruction Error Oh dear, something has gone wrong... Overflow Exception Privilege Exception Range Check Exception Spurious Interrupt Unknown Exception Ŀ + _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / / / __/ //___ \/ __ \ / / / / / /___ / __/____/ / /_/ / / /_/ / \____//____/_____/\____/ \____/ PC: %08X proc_exit: Attempting to call into shell      _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / __ / / __/ //___ \/ __ \ / / / /_/ /_/ /___ / __/____/ / /_/ / / /_/ /_ __/\____//____/_____/\____/ \____/ /_/ Unable to mount drive %s, FatFS Error: %d ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / //_/ / /| | __/ //___ \/ __ \/ / / / / ,< / ___ |/ __/____/ / /_/ / /_/ / / /| | /_/ |_/____/_____/\____/\____/ /_/ |_| e9e;e<e=e>e?e@e;e=e?e ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / / /| | __/ //___ \/ __ \/ / / / / / / / / ___ |/ __/____/ / /_/ / /_/ / / /_/ / /_/ |_/____/_____/\____/\____/ \____/ Address Error Bus Error Division by Zero Error Illegal Instruction Error Oh dear, something has gone wrong... Overflow Exception Privilege Exception Range Check Exception Spurious Interrupt Unknown Exception Ŀ Foenix Toolbox v%d.%02d.%04d starting up... ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / __ / /| | __/ //___ \/ __ \/ / / / / / / /_/ /_ / ___ |/ __/____/ / /_/ / /_/ / / /_/ /_ __//_/ |_/____/_____/\____/\____/ \____/ /_/ -eEfX3b(cdefosux _________ ___________ ________ ____ __ / ____/__ \ / ____/ ___/ / ____/ |/ / |/ / / / __/ //___ \/ __ \ / /_ / /|_/ /| / / /___ / __/____/ / /_/ / / __/ / / / // | \____//____/_____/\____/ /_/ /_/ /_//_/|_| -fsys_rename("/sd0/hello.txt", "/sd0/renamed.txt") ?- Ӊ -ubKeyboard test... press RUN/STOP or CTRL-C for boot: -[!] Incompatible CPU arch: expected %s, but found %s - L!:#(*-<>@[]{|}l GGGGGG EEEEEEE NN NN XX XXX 3333333 2222222 GG EE NNN NN XX XXX 33 22 GG GGGG EEEEE NN NN NN XXX 33333 22222 GG GG EE NN NNN XXX XX 33 22 GGGGGG EEEEEEE NN NN XXX XX 3333333 2222222 ђ,-&` % K@dABlCzDGJ@[]{|} GGGGGG EEEEEEE NN NN XX XXX 3333333 2222222 GG EE NNN NN XX XXX 33 22 GG GGGG EEEEE NN NN NN XXX 33333 22222 GG GG EE NN NNN XXX XX 33 22 GGGGGG EEEEEEE NN NN XXX XX 3333333 2222222 ,sl` e^%SKH=2'@;cABC DGJJbKcPdH`meiA;=?hj,* .!-" 0#/ +$ 2%1 &:4'3 (c6\5k9[aEAAEEEIIIOOUUYAIOUPDJ +}c,Z 0@QYR[T]V_`pN!2!p!!!$0,/`,g,u,,d-&A (((( AAAAAABBBBBB #%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%")"a"e"d" #!#H""" %ax029J.yMC= (": e,;;=f,?@AAF S@UXZ\]^_abdefgjb,lmnpqstvwxyz{|d,~DE{ 0 P`"6Da&`l@N# bz@c`[WOؓhG'${jJ۝uW~:g5^-Q'E1ڨˆyk\Q?I9?05(~#swVlN^EP;6*ԁO)шwWހM&Լd`ˀM&{ky\i@MrrAB++$% @@ -71,137 +54,129 @@ fsys_rename("/sd0/hello.txt", "/sd0/renamed.txt") ?  $$8~~8||88TT8 @@ @@|$BB$8||8(((((|(|((P(8DDD8(8DDD8 8DDD8(HHH4 HHH4(DDL48(8DDDD8(DDDD88TPT8$ x "|DD(||8D@D8$ p 8DDD8HHHHp4X|(D(|8DD|DD88DDD((l< DDD8ll$JR"\@<@8@<8DDDDDD|||||  8 8 `| T T(P 8$$$8 <<<<< -  !kkkk::kkkkkkkkkkkkkkk>kb>k"sVk"ikAkkkk k:k -0Bk -Ak"ok"ok?")k"k)"~k)"k kkkc8k k -k k%'kikd>f>kH"hk -kk)!8kH"hkH"rhkik - kki-k -H :Hkwwk:k)k)k i +  !kkkk::kkkkkkkkkkkkkkk>k"Tk"kNkkkk k:k +/Ok +Nk"nk"nk? )k"k)"q|k)"(k kkkc8k k +k k%'kikH"8hk +kk)!8kH"8hkH"Iqhkik + kki-k"*"["Q +H :Hkwwk:k)k)kl>n>k i k -"k -"k -kH"mhk.0kkk  k"uV",_)k"}+"\"" -wk:00k'' ɀ k:k 8k8[dH )" -Wkk )" -Wkk ) " -Wkk )" -Wkk )" -Wkk )" -Wkk )" -Wkk )" -Wkk )" -Wkk )" -Wkk )D" -Wkk )" -Wkk  8 k [𫫘 H (+k [𫫯f>d>+kO"Alk [𫫘b>"NY+k [ h )X+k [ h )x+k)kkZ" Z: czkZ"Y:czk)8kZ$"Lb7ezkZ"/k:zk8PI"|Vkk"k"|b"D&":Yk  " " )kZ)))zkwk    k) +">k +">k +kH"|lhk.0kkk  k"U"])k +wk:00k'' ɀ k:k 8k )"Ukk )"Ukk ) "Ukk )"Ukk )"Ukk )"Ukk )"Ukk )"Ukk )"Ukk )"Ukk )D"Ukk )"Ukk  8 k [𫫘 H (+k [𫫯n>l>+kO"jk [ h )X+k [ h )x+k)kk8[dH"f>Z"X: czkZ"?X:czk)8kZ$"`7ezkZ"j:zk8PI"Ukk"zk"x0Hzzkk [𫫩">j>+kZZ  "UH"]hzzk:   / k +   "~kHHFf ee&hk2468k/ JJJJ /  kZ8PIzk"[k  H -H"Whhb>"NYz -zk [𫫘"+k)  -  k"Y   k"Y  J kZ) :8zk"Y  k:% -   k   "ċd"ċk *,kZ  HH )H )"hhhh"bazk88(PI +H"Vhhj>"Yz +zk [𫫘"+k)  +  k"W   k"W  J kZ) :8zk"W  k:% +   k   "Wd"Wk *,kZ  HH )H )"hhhh"_zk88(PI -LHL k{= {= +YHYk= = -}=={={=kk "Al"Alk:     )  k"V"h\m>>"0kZ   yy I /yy zk# k +====kk "j"jk:     )  k">">kZ   yy I /yy zk# k  -"A +"ԋ - "A z z -zk"0"o{  )   k"Y  J:kkdHHJee&hzk)8PI&"LbAekZ  )  zk#ɀ8 -ek [𫫘8d>d>f>f>f>d>+kZZ JJJJ JzzkZZ;"[  zzkZ   -)HHHHH )"/;i -"bazkZ   -)HHHHH )";i -"bazk [𫫩z"[:z"9+k + "ԋ z z +zk">"Yy  )   k"W  J:kkdHHJee&hzk)8PI&"`EekZ  )  zk!ɀ8 +ek [𫫘8l>l>n>n>n>l>+kZZ JJJJ JzzkZZ;"U  zzkZ   +)HHHHH )";i +"_zkZ   +)HHHHH )">;i +"_zk [𫫩z"tY:z"̃+k  -8PI"z +8PI"z zk  -8PI"z +8PI"=z zk  -8PI"z +8PI"$z zkHZ H $   ()h  zhhhk  -"}z +"b{z zk   ):kH &H) -H)*EJ&h)jh)jhkZ"Y"    zk=""8`>kk +H)*EJ&h)jh)jhkZ"W"    zk>""<8d>kk  -8PI "z -zkZ  A )8 -"\ J ) "\zk"\*"\#"\,"\"\"\E"\"VfkZ  8     գI)8zk|"ȡ !  kZZc( -"f -"Lb8 +8PI "Oz +zkZ  N )8 +"tZ J ) "tZzk"tZ*"tZ#"tZ,"tZ"tZ"tZE"tZ"dkZ  8     գI)8zkp"Y !  k + [𫫘 +n">f> +h>+z +zkZZc( +"6 +"`8 zzkH)ɀ))ɀ)zh @zzkhk -"t"NPHP -Nh"Wz +"r"NPHP +Nh"Vz zk     ) zz z -zk4"i" d:HT"ih"X:1"ikZ  ) +zk [𫫩 އ    +kZ  ) -1 e) +5 e) -e"mzk +e"3lzk ZZ ; -"ʷ zzz +"e zzz zk -Z"Y +Z"W  -!"lrH"eh  zz +!"pH"Fdh  zz zk Z -d"ċ ' ; -"}zz +d"W ' ; +"zz zk:0 -H`Z&Mk +H`&{k  ;iHH ->>"w}hhz +>>" +{hhz zk  ) -H"_h H"_hz -zkH"_hZ  )Ȉ +H"]h H"]hz +zkH"]hZ  )Ȉ I  )/) IzkH )+' )  - h((kZ  i  " H"hzzk + h((kZ  i  " H"8hzzk  - )" Z: zz z + )"~X: zz z zk i -)")  z +)")  z zk   H -"Al zz z -zkw"i4"i") H"h"X:1"ik +"j zz z +zk [𫫘ZZ -)  H"hzz+z +)  H"8hzz+z zk ZZZ : @@ -209,338 +184,331 @@ ZZZ zkZ8PI0zk -1 e"Al"fhZ"'Y18 PI"e  zzk [𫫘ZZ"V"V ` )%zz+k +5 e"j"9gZ"W18 PI"e  zzk [𫫘ZZ"sU"zU ` )%zz+k ) -H"_h -ک H"_h -H"_hz +H"]h +ک H"]h +H"]hz zk Z :Ȉ  ަzzz z zk - [𫫘"t":< H< -:h"W+z -zksVȗȗȗȗ:ȗ  k + [𫫘"r":< H< +:h"V+z +zkq$Uȗȗȗȗ:ȗ  k [𫫘  -"   -"WT:":Y+z +"   +"M:"W+z zk -  "b % +  "` % % zz z -zk;8J  ;"sk;";";iJk"qV"3"shj<"/"X\{ [𫫘Z & )4"Lby$e"h & z+kZ  C -C UU C -C U* C -C UU zk - [𫫘"t +zk;8J  ;"Fj;";";iJk"T"";r><""uV\y [𫫘Z & )4"`}$e"wg & z+kZ  PP UU PP U* PP UU zk + [𫫘"r  -"W+z +"V+z zk - [𫫘"t# -"W+z + [𫫘"r# +"V+z zk - [𫫘"t& H -h"W+z + [𫫘"r& H +h"V+z zk - [𫫘"t&>@ H@ ->h"W+z + [𫫘"r&>@ H@ +>h"V+z zk - [𫫘"t&BD  D -B"W+z -zkZ8PI08$"Lb7!7$"Lbezk - [𫫘"t$ H -h"W+z -zkZZ"Y4   ))   7 zzkZ    =) + [𫫘"r&BD  D +B"V+z +zkZ8PI08$"`7!7$"`ezk + [𫫘"r$ H +h"V+z +zkZZ"W4   ))   7 zzkZ    =) -?1   # +?5   #  ) - 1  "fhzk/):#):k + 5  "9gzk   - )"2[H)"2[h8 ) Պzz z + )"YH)"Yh8 ) Պzz z zk -Z )"X  w"X  zz -zkY>.>@>>'>C>==*>>>>>>\>^>k [𫫘Z""" -"}":Yz+kZ8PI9V"LbOeH:"0hzk -  "t&JL HL -Jh"Wzz z +Z )"wW  w"wW  zz +zk]>2>D>>+>G>>>.>>>> > >(}`>b>k [𫫘Z""} "b{"Wz+kZ8PI9V"`OeH">hzk +  "r&JL HL +Jh"Vzz z zkZ     J  jj) ec  :  ȈǣzkZZ   JJJJ ))#) 8PI0 8PI0 -"Lbczzk7 [ VȗȗȗȗkZZ:2      zzzk - [𫫘"t* HHH -h"Whh+z +"`czzk=~7 =Z $UȗȗȗȗkZZ:2      zzzk + [𫫘"r* HHH +h"Vhh+z zk - [𫫘"t*68H H8 -6h"Wh+z -zkZZ8PI0zzk8PI0Ӣ"nZ  C -C  C -C    :zkZZ  "|b7  ;iH;i"hh -":Yzzk - [𫫘"t( H -h"W+z + [𫫘"r*68H H8 +6h"Vh+z +zkZZ8PI0zzk8PI0Ӣ"\mZ  PP  PP    :zkZZ  "a7  ;iH;i"@hh +"Wzzk + [𫫘"r( H +h"V+z zk - [𫫘"t(&(  ( -&"W+z + [𫫘"r(&(  ( +&"V+z zk - [𫫘"t(*,  , -*"W+z -zkZ;  )H)h8   :zzk -Z"t  -"WHB "0hzz + [𫫘"r(*,  , +*"V+z zk - ["u4"o"o"ii -"i +Z"r  +"VH| ">hzz +zk + ["h4"n"n"i +" PI0+z zkH) H )87IJj(hk( *(zzk [𫫘  -" -"}Bhh":Y+z +" +";hh"W+z zk - [𫫘"t*24 H H4 -2h"Wh+z + [𫫘"r*24 H H4 +2h"Vh+z zk -ZZ\>^>^> -\>"W{=:"Vzzz +ZZ`>b>b> +`>"V=:"AUzzz zk -= -}="W:Ӌ [𫫘ZZZ"V"V'  l    l zzz+k [𫫘ZZZ"V"V'  `    ` zzz+kZZJJJJJ)?HJJJ))H#H JJJJJ)H J))iH "i;i -zzkZ"|bC  )zk:,:#2468246 8kZZZ  .o20o4""Lbc @ ` 0."үzzzk += +="V:Ӌ [𫫘ZZZ"sU"zU'  l    l zzz+k [𫫘ZZZ"sU"zU'  `    ` zzz+kZ"aC  )zk:,:#2468246 8kZZZ  .o20o4""`c @ ` 0."Ŭzzzk ;8 -;"uHH -;i"\hh;iz -zk;8T>8PI0:HHH;i "9hhh;i"0;iTk;8 -#JJJJ  #   ;i":;i +;""tHH +;i" [hh;iz +zk;8T>8PI0:HHHb;i "|hhh;i">;iTk;8 +#JJJJ  #   ;i"̀;i k ;8 -;"8nHH -;i"\hh;iz +;"lHH +;i" [hh;iz zk -ZZ8PI6""Lb;e +ZZ8PI6""`;e -"Wzzz +"Vzzz zk ;8 -;"8n;iH -;i"\hh;iz +;"l;iH +;i" [hh;iz zk -"e > - > -G>"[.>"[>"[z -zk"|V -;8  i "b  i "b;i k;8T>8PI0>HHHH`;i "9 hhhh;i"0;iTk +"}d> + > +K>"#Z2>"#Z>"#Zz +zk"U +;8  i "Da  i "Da;i k;8T>8PI0>HHHH2;i "| hhhh;i">;iTk ZZ  -  "  w `>zzzz z -zkZ8PI0zk""Lb;;""Lbe [𫫘ZZZ"V"V.' l I%   l zzz+k +  "  w d>zzzz z +zkZ8PI0zk""`;;""`e [𫫘ZZZ"sU"zU.' l I%   l zzz+k [𫫘Z  -" -"`y"}":Yz+z +" +"Z"b{"Wz+z zk [𫫘Z  -" -"J8, "}":Yz+z +" +"1"b{"Wz+z zk Z  -  "Y +  "W   ::zzz z zk  - ?  2)(d"hhz + ?  2)(d"hhz zk Z -Hg"^h -"d[H -HH"8hhhک "0hzz +H+"h +"YH +HH"8hhhک ">hzz zk Z   -"d[ e  +"Y e   ) zzz z zk  -  [𫫘"t .. 0 "0 -. "W+zz z +  [𫫘"r .. 0 "0 +. "V+zz z zk -  [𫫘"t .R T "T -R "W+zz z +  [𫫘"r .R T "T +R "V+zz z zk ZZ -"uV"a: "uV"_:zzz +"U"`: "U"^:zzz zk ZZZ  -"D&/;i -"ʷ zzzz +"n/;i +"e zzzz zk ;8J -;"sk)  ;";";iJz +;"Fj)  ;";";iJz zkZ    N#) -1 e  !) +5 e  !) -1 e ' "fhzk +5 e ' "9gzk   -"[:<w +"tY:<w  eɀz -zkZ    P') "Lbe  %) "Lbe ' zkZRM&(H)h8PI0 "'e zzk;8T>8PI0FZHZHHHHH;i"9 ;i ;i"0;iTk +zkZ    P') "`e  %) "`e ' zkZRM&(H)h8PI0 "R'e zzk;8T>8PI0FZHZHHHHH;i"| ;i ;i">;iTk ZZ  -"8\:<w +"Z:<w  eɀzzz zk -  [𫫘"t 0" $ $H$ -" h"W+zz z +  [𫫘"r 0" $ $H$ +" h"V+zz z zk ZZ    -   "Y: +   "W: :оzzzz z zk Z 0B;H -i"hhzz +i"@hhzz zk - [𫫘ZZ8PI2""Lb;e -"Wzz+z -zkZi  8PI0  zzke  Z    NH1 ) + [𫫘ZZ8PI2""`;e +"Vzz+z +zkZi  8PI0  zzke  Z    NH5 ) -ehH1 ) +ehH5 ) -eh"fhzzk +eh"9gzzk ZZ %;i -"} zzz -zkd"X: +" zzz +zkd"V: Z -"ċ  ; -"} -": -"#izz -zkZ&"o{   )  6HH"n6hh    "dzkZV            I%  zkZ    PH) "LbehH) "Lbeh +"W  ; +" +"!: +"gzz +zkZ&"Yy   )  6HH"/hh    "~zkZV            I%  zkZ    PH) "`ehH) "`eh zzk - [𫫘ZZ8PI6""Lb;e -"Wzz+z + [𫫘ZZ8PI6""`;e +"Vzz+z zk 8ʆ8ʆ  $2 0 -d"]eHe +d"\eHe hz zk [ Y )d Z )Ȉ & [ )+k -ZZ8PIG6"Lb!:e% -"Wzzz +ZZ8PIG6"`%:e% +"Vzzz zkZ   0 P9  E a 0f  % A F  )i)i )80zk ZZ -"|bC;iH -"hh  "}":Yzzz +"aC;iH +"@hh "b{"Wzzz zk;8 - "}"}b>HH  "^hh;i + /"b{"b{j>HH  "%]hh;i k - Z "|b + Z "a  < - " "d[)":Yzzz z + "u "Y)"Wzzz z zk P X Y Z [ ] ^ _ X \ X k ZZ -t"0 -"|b/;H;i"hh) -":Yzzz +8"> +"a/;H;i"\hh) +"Wzzz zk - [𫫘Z"}[ -)&"LbAe" -" e q$ z+z + [𫫘Z"Y +)&"`Ee" +"c u$ z+z zk Z  -0 2  " - "zzz z +0 2  "I + "Czzz z zk ZZZ 8PI - ;iH"qhhH:H"2qhhzzzz + ;iH"phhH:H"ohhzzzz zk ZZZ  8PI0zzzzz z -zk "uV -cH"_h8PI0/8PI0    .      "k +zk "U +cH"]h8PI0/8PI0    .      "Rk [𫫘 -HH"^hh8PI+ -6"Lb!:e6"m+z +HH"hh8PI+ +6"`%:e6"3l+z zk ZZ\  C7 -"e0 +"}d0 zzz zk ZZZ 8PI - ;iH"qhh8HH"2qhhzzzz + ;iH"phh8HH"ohhzzzz zk ZZZ 8PI - ;iH"qhhcHH"2qhhzzzz + ;iH"phhcHH"ohhzzzz zk ZZZ 8PI - ;iH"qhh8HH"2qhhzzzz + ;iH"phh8HH"ohhzzzz zk ZZZ 8PI - ;iH"qhhcHH"2qhhzzzz + ;iH"phhcHH"ohhzzzz zk -ZZ"bP8,"% +ZZ"`P8,"[% ) )JJJJI)8 zzz zk - ;8R >8PI0B;i^H ;i"~hh;i> ->"W;iRzz z + ;8R >8PI0B;i^H ;i"|hh;i> +>"V;iRzz z zk ZZZZ   -"d[e) +"Ye)      zzzzz zk - ZZ  "\0< "]0* "V%zzzz z -zkZZ8PI*8PI Ȉ :H:H"2qhhzzk + ZZ  "0< "|[0* "PU%zzzz z +zkZZ8PI*8PI Ȉ :H:H"ohhzzk [𫫘;8R[Hک>;i "|hhh;i"j "b{"W;iR+k Z 8 -PI0@ "Lb  4 - "Lbe"f: zz +PI0@ "`  4 + "`e"^e: zz zk - [𫫘ZZZZ;i;":;$ -"Wzzzz+z + [𫫘ZZZZ;i;":;$ +"Vzzzz+z zk ZZZ  8PI c   zzzzz z zk -"j +"|i Z - X"}H H",hhh8PI  e ӊzzz z + )"b{H H",hhh8PI  e ӊzzz z zkZ  )   ) @@ -550,126 +518,120 @@ z e) e  zzk - [𫫘ZZ8PII""Lb;e%HH -h"Whzz+z + [𫫘ZZ8PII""`;e%HH +h"Vhzz+z zk - ;8R >8PI0B;i^H ;i"~hh;i> ->"W;iRzz z + ;8R >8PI0B;i^H ;i"|hh;i> +>"V;iRzz z zk ZZZ   -;")8PI2 +;""8PI2 '7) -"zzzz +"<zzzz zk ZZ  -"0 "|b*;iH -"hh -":Yzzzz z -zk"_"ib|"nhh"_"ib""_t "i|""_"9|"9kZi:] -DH`"zXM"zXD? ' 0 @ ! '   zk - Z#ɀJ=ɵ6% +i"> "a*;iH +"\hh +"Wzzzz z +zkZi:] +H`"WM"WD? ' 0 @ ! '   zk + Z!ɀJ=ɵ6% e 8 ֊i)zz z zk - [𫫘ZZ8PIN""Lb;e*HH -h"Whzz+z + [𫫘ZZ8PIN""`;e*HH +h"Vhzz+z zk - [𫫘ZZ8PIN""Lb;e*HH -h"Whzz+z + [𫫘ZZ8PIN""`;e*HH +h"Vhzz+z zk    -L       "mȷ   "Al i +L       "3lȷ   "j i zz z zk Z   - "k@ + ";@ :)0 -i2 0 "0hzzz z -zk -ZZ - -HH."ihh -"Kh0/"ØH"h"J):ܣ"HH "ihzzz -zk;88PI0! ;i":;ik%ک8;ie  FfFfFfFfZ  )az8 ʆɀ85 )zk;8 +i2 0 "G(hzzz z +zk;88PI0! ;i"̀;ik%ک8;ie  FfFfFfFfZ  )az8 ʆɀ8)zk [𫫘ZH">hj>f>h>:P">dh>f>"%]hh"f">"fz+k;8 cJ iH he   ;i k:  ;8 -JJJJ))  ))  JJJJ)  )  ;i":;i +JJJJ))  ))  JJJJ)  )  ;i"̀;i k ZZ  8PI0 -"zzzz z -zk8PIH ch  [𫫘;8RZ;i"9h ;i"hh"}":Y;iR+kZZZZ  88PI0zzzzko4""Lb86PI0 2ce @  `  +"zzzz z +zk8PIH ch  [𫫘;8RZ;i"|h ;i"hh"b{"W;iR+kZZZZ  88PI0zzzzko4""`86PI0 2ce @  `  Z -"|bf -"":YW% -eHeh"":Y+ eHe -h"":Yzz +"af +"j"WW% +eHeh"j"W+ eHe +h"j"Wzz zk ZZZZ  8PI0zzzzzz z -zk "uV",_H +zk "U"]H c h  ZZZ +   zzzz zk -cH" h +cH"h Z  - i  )     "    @' ) -"j)zzz z -zkZZZi0  :  ;8"Lb!&e"WHs"0h)H;iH{"0hhh":Yzzzk -  [𫫘ZZZZ;i;":G0H   - h"Wzzzz+zz z + i  )     "    @' ) +"|i)zzz z +zkZZZi0  :  ;8"`%&e"'H_">h)H;iHo">hhh"Wzzzk +  [𫫘ZZZZ;i;":G0H   + h"Vzzzz+zz z zk ZZZZ  -i"\  7i -"\Hhzzzzz +i"Z  7i +"ZHhzzzzz zk Z  - "7O + ";7O )   $  zzz z zk [𫫘ZZZZ - -C C"uQ +PP"hQ G -="o -  "ii -"i +="n +  "i +" PI0zzzz+z -zk;8 8 PIx;i H"q;iH"wx c c 8;i H"x d8"t;iH!"x;i;ik +zk;8 8 PIx;i H"p;iH"v c c 8;i H"w d8".s;iH!"w;i;ik Z  -H "d[h+ "d[e  zzz z -zk c)"K[H -ch  [𫫘;8T"t hhhh]H]HHl;i "9hhh;i"qR"}":Y;iT+k +H "Yh+ "Ye  zzz z +zk c)"YH +ch  ;8: -;i;i":O;i"2+1  +;i;i":O;i"++1   -;i";i:z +;i"H;i:z zk ;8T ->8PI/"S`H -HH;i "9 hhhh&ڥ -HHd;i "9hhh;iH"$hh;iTz -zk [𫫘ZZZ;H"P^hhhhF&HH"hh1H "0hHZ "0hzzz+k +>8PI/"^H +HH;i "| hhhh&ڥ +HH5;i "|hhh;iH"hh;iTz +zk [𫫘ZZZ;H"WhhhhF&HH"hh1H ">hH +">hzzz+k [𫫘;8 -;i;" >&("( -&"W H -"0h ;i +;i;" >&("( +&"V H ">h ;i +z zk [𫫘;8 -;i;" >*,", -*"W H2"0h ;i +;i;" >*,", +*"V H">h ;i +z zk @@ -683,30 +645,29 @@ z zk Z  4  6 -g "O - i8 "ch +g "O + i8 "h ;i +z zkZs8 PI0_ h i j l m n ` a b zzk -eLu +eLh ZZZZ  -8PIV "uV",_   +8PIV "U"]   5 + c  zzzzzz z -zk +zk/):{):n): ): ): $): / k )Ȉ &)d  @@ -716,94 +677,80 @@ z Ȉ &)dz zk - `>L~ f8ʆ + d>L~ f8ʆ 8ʊ -"Rz +"z zk Z  - i e )8PIF cH"h c   zzz z -zk;8 8PI0L^;iH"qhh;iH"wxhh8PI -cc8  ;iH"xhhd "t;iH"xhh;ik8HHH + i e )8PIF cH"8h c   zzz z +zk;8 8PI0L;iH"phh;iH"vhh8PI +cc8  ;iH"whhd ".s;iH"whh;ik8HHH **** * * * 8Hh hhhzzz****Jh;i(khhhhhzzzz(k ZZ -."  v 8PI0\    +)"K[H +.",  v 8PI0\    +)"YH ch c  zzzz z zk Z  -  W  N  )<   !  ""WJ    zzz z +  W  N  )<   !  "UJ    zzz z zk ZZZ  %;i -"} S 4  -"};i -"}zzzzz z -zkd"X:L +" S 4  +";i +"zzzzz z +zkd"V:L> ZZ - )""X::   "0X:S))e:"b  zzzz z -zkZ?8PI@8PI0PG"8 A":P8PI0"PG"<c A"<zk + )"V::   "V:S))e:"ua  zzzz z +zkZ?8PI@8PI0PG"8 A":P8PI0"PG"c A"zk  [𫫘;8 -;i;" K.0/H  0 -. h"W H"0h ;i +;i;" K.0/H  0 +. h"V H">h ;i +zz z zk  [𫫘;8 -;i;" N243HH  4 -2 h"Wh H"0h ;i +;i;" N243HH  4 +2 h"Vh H">h ;i +zz z -zk -"Vix -d" ""dd"n"n"n"V -PI0d"n"n"nz -zkZ "^8PI0T8PI0zk$"Lb77$"Lbe6"Lb!:!:6"LbeL;864   X*!]#%+-/1')35;":9;";i6k +zkZ"8PI0T8PI0zk$"`77$"`e6"`%:%:6"`eLȹ;86 b fW!%\#%+-/1K')35;":#;";i6k ZZZ -##"`W"kXʆ""kXʆ" 8PI00c +##"U"Wʆ""Wʆ" 8PI00c 7cWc     -"`WЁzzz\ +"UЁzzz\;8 / ;i";i"H;i"Yh;ik;ic   A +Z  )"YH;ich  ZZ     -":Lп  ; -" [  -"; -"}; -"}#  zzzz z -zk/)$*,"L+&*,"c@+&*,"3@+&*,"k;8 +"!:Lt  ; +"% [  +"%; +"; +"#  zzzz z +zk/)$*,"RLR+&*,"Rc@+&*,"R3@+&*,"Rk;8       ;i -k"&j) +k"h) _vH) -hT#:.#:  )" -JJ   L -;8T - -HH -"ihh - -"Kh8PInH"i;i"9;i"d[H;i H "کy -"i ;i -"ՐH_"ih;iTz -zk +hT#:.#:  )"xJJ   Lq ;8 cJ  cic    Ȁ ;iz -zk:L;8"         k < tV[T<!;":"  ;";i"k +zk:LP;8"         e 8U\Y5!;"i:"  ;"i;i"k Z  V 0 E X - x $ȷ )":  E% 0 6 X + x $ȷ )":  E% 0 6 X x ! 8PI08PI0 zzz z zk -Z8PI0Lţ$"Lb7e +Z8PI0L|£$"`7e r 8PI/ -6"Lb!:eE "} "}zz +6"`%:eEd "b{y "b{zz zk Z   -     LƠ)L~  w   +     L[à)LN  w   ) e    @ Z   a "z   -"D  H"hzz z +"=  H"8hzz z zk Zi  @@ -812,9 +759,9 @@ z ȗ i8 8ʠȗ Hȷ -h"vz\ +h"Fz\h Z  -"Ac +"a  c i @@ -826,7 +773,7 @@ z ȗȗȗȗ ȗ ȗzzz z zk;8  - ;"[ L/ɣ + ;"U Lţ  @@ -837,23 +784,22 @@ z    ;i -;i";ik         -      y "`8 PI0(z"X\"n6hh"dk -Z A"\SPG"\"PG"<c A"<?"Sń'7""PG"8 A":zk +;i";ik         +      y "p_8 PI0(z"3W>["/hh"~k +Z A"SPG""PG"c A"?"jSń'7"j"PG"8 A":zk  [𫫘;8  H -HHH -"0hhhh;i;i"J  . +HHH ">hhhh;i;i"J  . H  - h"WH "0h;i + h"VH ">h;i +zz z zk ZZ -)L64 -i8"chL  84(H6*h "H  ;4 wH6"wh -i8"chzzz -zk;8;"H8 +)L64 +i8"nbhL  84(H6*h "H  ;4 wH6"wh +i8"nbhzzz +zk;8;"8 ) @@ -861,97 +807,96 @@ z ʪʠ Ȉ & ʠȈ -& ʆFj;ik;8 c  g       )   ;ik ҋ [𫫘8PI0L|Ϙ""Lb;e +& ʆFj;ik;8 c  g       )   ;ik ҋ [𫫘8PI0LL̘""`;e -  +kZ J LiЯ*ʆ&ʆ"",ʆ(ʆ"$  s  i) -ʆ&ʆ") -ʆ(ʆ""8$8 "$ zk +  +kZ J L9ͯ*ʆ&ʆ"",ʆ(ʆ"$  s  i) +ʆ&ʆ") +ʆ(ʆ""8$8 "$ zk ZZZ  ; -"ʷL>ѥ  -"Ot -" i A  -" -"JY zzzzz z -zkIIڅd*8&zzkHCh"TH"TIk$8$8 +"eLΥ  +"Ht +"Eb A  +"H +"R zzzzz z +zkIIڅd*8&zzkHCh"$H"$Ik$8$8  ddd d & &&8& & zz -z zkEH"z8kk;8  LӯH h 8PI0j ) +z zkEH"vz8kk;8  Lϯ PH P h 8PI0j )     '  ) e  %  ) -e  4e  e  Ls;izkZZZZX +e  4e  e  LC;izkZZZZX -c  :Lӣ -H`HH? "ChhnHH; "ChhRHH+ "Chh6HH7 "ChhHH3 "ChhH "rh)"("؅zzzzk +c  :LУ +H`HH{> "hhnHH{: "hhRHH{* "hh6HH{6 "hhHH{2 "hhH "Iqh)""kzzzzk ;8      - "LԠ + "LѠ ic  8<PI0S;iH -i "hh  ;i +i "@hh  ;i z -zk;8V/ V sσ߿U\!#%_79];=^')|+-B^/1r\35ү?AXCE }GInKMOQ_SU;";iVk;8 -;H"xd"8"7HHH"%;i dd",d""" 8PI0"""2qhh;i -kHH "Chhdd "(d "؅  ZZH"^h0V8PII$"Lb77$"Lbe$"Lb7ew8PI0Y$"Lb7J$"Lb77$"Lbe$"Lb7ezzk +zk;8Vq& lU R̃1Z!#%@^79H\;=\')\z+-\/1Z35Ŭ?A#WCEzGIgKM~OQ^SU;"6;iVk;8 +;H"wd""EHHH"O;i dd"d"." 8PI0"""ohh;i +kHH "hhdd "d "k  ZZH}"h0V8PII$"`77$"`e$"`7ew8PI0Y$"`7J$"`77$"`e$"`7ezzk ZZZ  -   , .7  . , "O t -  "0I      "JYzzzzz z -zk;8 / ;i";i"H;i"d[h?;i"y:"thhhh;ik;ic   A +Z  )"2[H;ich L0 +   , .7  . , "H t +  "#I      "Rzzzzz z +zk ;8    -":Lڥ - " 46 -i8"Al +":L֥ + " 46 +i8"j i8 -6H c "ch c  +6H c "nbh c   ;i zz z -zk;8JLۯ L    JJJJ ) )))) ) +zk;8JLׯ L    JJJJ ) )))) ) _vH) -h T#:.# :   )" - JJ   L;ik +h T#:.# :   )"x JJ   L;ik ZZZ  -  "OLܩ -  "0j    ) " "JYL"ܣ zzzzz z +  "HLة +  "#j    ) " "RLף zzzzz z zkZZZ: -8PI0.80PI0/"EWPI0 -80Lݩ$8PIL݊80PI09"HWPI080^8aPI0V"EWPI0i28API06"EWPI0izzzk +8PI0.80PI0/"UPI0 +80L٩$8PILي80PI09"UPI080^8aPI0V"UPI0i28API06"UPI0izzzk  [𫫘;8  H -HHH"^hhhh;i;i"q HH6"0hh . +HHHr"hhhh;i;i"q HH">hh . H   - h"WH "0h;i + h"VH1 ">h;i +zz z zk -;8   - 8PILߣ"Lb 8PI0Lߣ8 :8PI0m - ":8 PI02 c +;8  y + 8PILۣ"` 8PI0Lۣ8 :8PI0m + "̀8 PI02 c -dCbC ": -H "4h  H "4h H "4h:L[;i z +kPiP "̀ +H "4h  H "4h H "4h:L+;i z zk -  [𫫘ZZZN"^"}8PI0L6"Lb!:eL" n ` +  [𫫘ZZZ""b{8PI0Lܣ6"`%:eLܣ" n ` E H  -h"d"W  zzz+zz z +h"oc"V  zzz+zz z zk [𫫘Z8PI0 -z+zke  ie  ie  ie  ie  ie  ie  L!;8@;i ;i":L& ;i "2_7  ;/+)  "ѧH h 7  +z+zke  ie  ie  ie  ie  ie  ie  L;8@;i ;i":Lޣ ;i "+_7  ;/+)  "bH h 7    :  ;i@k ;8   -  "FX"Al ) - ";i +  "V"j ) + "f;i zz z zk: @@ -960,23 +905,23 @@ z  c i -cH">Xchȗ +cH"Vchȗ  c :  c i -cH">Xchȗ Ls - ZZZZ    LQ) +cH"Vchȗ LC + ZZZZ    L!) -)oHoh8PIL1 ) +)o1 Ho3 h8PIL5 ) e  ) -?1   # +?5   # @@ -987,45 +932,43 @@ z  ) - 1  "fh4e - e   Lzzzzz z -zkZZ7 -"iZ"8PI0Le3"0@"hhLL @ LL @ LL毞@e@@"|@H@H"ihh@@H"ihh@"ihh@"hhL"o"0H7"0hzzk + 5  "9g4e + e   L^zzzzz z +zk ZZZZ)* -  ϧ) L)*  ϧ) +  ϧ) L<)*  ϧ) !   zzzzzz z zk - ;8$8PI0L8PI0L$"Lb7e -$"Lb7e    -i;i "m i -i "m;i i "m;i$zz z + ;8$8PI0LW8PI0LW$"`7e +$"`7e    +i;i "3l i +i "3l;i i "3l;i$zz z zk [𫫘;8;i# - & L;i4"Lby$e"k ":YL   8PIL;ic + & L~;i4"`}$e"; "WL   8PIL;ic i c   i c);i+z zk [𫫘;8;i# - & L;i4"Lby$e" ":YL   8PIL;ic + & L;i4"`}$e"C "WL   8PIL;ic i c   i c);i+z zk [𫫘;8  -"8PI & L% & L)B;i"^h;i4"Lby$e"* -4"Lby$e"HB"0h":Y & ;i+z -zkL9 +"8PI & L & L)B;i"L]h;i4"`}$e"I* +4"`}$e"IH">h"W & ;i+z +zkL  [𫫘;8! - -C C -  "uLG -LG#eHe +PP +  "hL +L#eHe h - LG8#PIcHcheHe + L8#PIcHcheHe h - "o  -  "ii "i PI0L;i+zz z + "n  +  "i " PI0Ln;i+zz z zkH )&" ) @@ -1038,150 +981,153 @@ z ж0 8 𚰥hkH88HdR8W)) *)(j)J(j zzkJjfȀ( -  [𫫘ZZZ"t LF H Lh )"ȡL;iH"qhhH"2qhhL;iH"qhhHJJJI)8 +  [𫫘ZZZ"r LUF H LU)"YLU;iH"phhH"ohhLU;iH"phhHJJJI)8 -H"2qhht;iH"qhh8PI=H:H"2qhh HH F  -h"WH:H"2qhhHH -F h"Wzzz+zz z -zkZZZZP8<8;H"xM -"iAHAH"iAHAH"iAA"Hs"iAHAhZJJJJH"i;iAHAHAH "iAHAHAH, "i ;i H"x"2q;izzzzk@"wg"xeH̢:dFfc c  e +H"ohht;iH"phh8PI=H:H"ohh HH F  +h"VH:H"ohhHH +F h"Vzzz+zz z +zkZZZZP8<8;H"w "wh>H>H"wh>H>H"wh>>"H"wh>H>hZJJJJH_"wh;i>H>H>H +"wh>H>H>H +"wh ;i H"w"o;izzzzk@"If"dH̢:dFfc c  e * &ؘ8ce~hhhhhh/FffF8&/y$0&&ddZddQH)hF8&H)h)H)h) J Jȥ -Z먊JjzkZZZZLK Y! -$LBLB)#cL/~ -H`8`f8P\cR8H80>8 48*8)88 +Z먊JjzkZZZZL  +"LL)#cL~ +eH`8`f8P\cR8H80>8 48*8)88 e  -eLVzzzzk +eLzzzzk ;8    -i"\:LZ'): "Lb  1@')" ɀLZ +i"Z:L 奔'): "`  1@')" ɀL  e j -)e"\; ɀ9    +E)e"Z; ɀ9    e';i zz z -zk  L -;8;i H"qhh;iH"wxhhLjQL c ;iH"x H"g;iH"x;i -L c  ;iH"x H"g;iH"x;i -L c c8  ;iH"x H"g;iH"x;i +zk  Lj +;8;i H"phh;iH"vhhLQLh c ;iH"w H"f;iH"w;i +Lh c  ;iH"w H"f;iH"w;i +L c c8  ;iH"w H"f;iH"w;i ;iz zk ;8  -:  8PI0L;iH;i "hh ] ) E      -E L  +:  8PI0Lh;iH;i "\hh ] ) E      +E L  ;izz z zk ;8  -"D-LL  : +"$LL  : ;i e /  -;i e"D-;iz +;i e"$;iz zk iH -he"H +he"NH -;i ehLJ +;i ehL [𫫘;8        JJ -              #   "ud"Lb "ue "u"u# "u0   "u"u +              #   "sd"` "se "s"s# "s0   "s"s ;i +z z zk ;8   - L;i;i"L  -"2L+ 0G7)+ "ѧ + L;i;i"Ls  +"+LS+ 0G7)+ "b  ,  -"O  ;i +"H  ;i z -zkZ"[:"9L6" dL3):L+))  )  <)H"  hL6 )H"  hL6@)H"  hL6)H"  hm?)H"  hC)H"  h')H"  h " dLzk"wg"bkI"wg"bk"xeHhڥ -E\s8~FfjJ8 +zkZ"tY:"̃L"bL):L))  )  <)H"  hL )H"  hL@)H"  hL)H"  hm?)H"  hC)H"  h')H"  h "bLzk"If"kI"If"k"dHhڥ +E\%8~FfjJ8 Fl$ zzzku **Ji Jȣ fjhhzkFeeJjj8j ЧгH JhȈkЗF@ - ZZ  L7 L  L    L  L  L"_Zȷ   + ZZ  L}7 L}  L    Lr  Lx  Lx"Xȷ    - "  L + "!  L e8  Ш    5  ȷ  -ȗ  :"_Zzzzz z -zkA(A +ȗ  :"Xzzzz z +zk ;8         -i"b ): "Lb)  +i"Da ): "`)  e -)e"b    L +E)e"Da    L  e :  @    ;i zz z zk ZZZZ - :8PI0L -"L8PI0L) c q -W = c  c ] c ] c J8PI": c L~zzzzzz z + :8PI0L+ +"L-8PI0L ) c q +W = c  c ] c ] c J8PI": c L zzzzzz z zk ZZZZ -  L;i"j"*W - "*W +  "*W  "*W   -"*W"[> - N"`>D -.8"`>    -%  "W  "Wzzzzz +  LU;i"i"U - "U +  "U  "U   +"U"7 - N"d>D +.8"d>    +%  "V  "Vzzzzz zk @ -ZhhJjhzkک"wg"xeHҘ8i0 +ZhhJjhzkک"If"dHҘ8i0 *$ &$8 &ccd&8&&&8j$Ff19Ffj  ,&JȀJ dd -ZhhhhJjzzk +ZhhhhJjzzkN6 > ;8   -i"\:L?'): "Lb  4@')$  -e:LL -)e"\ ] ɀQ   "  -e"  , +i"Z:L+?'): "`  4@')$  +e:L+L+ +E)e"Z ] ɀQ   "  +e"  , ;izz z -zk  L;8:\ V ‰W٢W!?#%j')/1V35[+--79;i":L V ‰W٢W!?#%j')/1V35[+--79;i""hhh;i:k -;8;i H"qhh;iH"wxhhLLn H"ghLn  ;iH"x H"g c  ;i H"x H"g;iH"x;iLn c c8  ;iH"x H"g c  8:;i H"x H"g;iH"x;i;iz +zk  Ld;8:- (U UUj!M#%|i')/1,U35 +Z+-79;i":L (U UUj!M#%|i')/1,U35 +Z+-79;i""hhh;i:k +;8;i H"phh;iH"vhhLL  H"fhL  ;iH"w H"f c  ;i H"w H"f;iH"w;iL  c c8  ;iH"w H"f c  8:;i H"w H"f;iH"w;i;iz zk - ZZZZ<L -87g0f + ZZZZ<Lg87g0f g   ȷ   ȷ g7 80] -"Wȷ"Wȷg7H h"vzzzzzz z -zkZZZ "Lbec  )"ȡ "4a\@"4aO1 Oyy y  "`"4a "4a  L8 + ~ - ~     ~   a  . ywz"8\:"zy)))"ȇzzzk +" Vȷ" Vȷg7H h"Fzzzzzz z +zkZZZy "`ec  v)"Y "_\@"_O1 Oyy y  "p_"_ "_  L+ ~ + ~     ~   a  . ywz"Z:"zy)))"[zzzk ;8  - " 7)L 7)$ + "i 7)L'7)$  Ȉ & -8 PI0     "!)_ +8 PI0     "I)_   - "}:i:У    "! "#i;i zz z + ":i:У    "I "g;i zz z zk ZZ  -"L  L  L -i8"Al -i6U"b -i8RRaA" -irrAa" -i " -i$"&$4664 -i8"ch  H"(`hzzz +"L   Ls   Ls  +i8"j +i6U"Da +i8RRaA" +irrAa" +i " +i$"&$4664 +i8"nbh  H"^hzzz zk - ;8 <LZc)   "Ac + ;8 <L +c)   "a  ci @@ -1189,196 +1135,185 @@ z   ȷ  -LZ +L + ȷȷ8 Y g  -c    7 H  h"v +c    7 H  h"F i;i zz z zk [𫫘ZZZ 8 -PI0L "Lb  L "Lb  8PI0L8PI` -c   A)"K[H "Lbech  "Lbezzz+z -zk "Lbec LL +PI0L+  "`  Lp  "`  8PI0L7 8PI` +c   A)"YH "`ech  "`ezzz+z +zk "`ec Lx L1  ZZZZ  - L7 L7& -"}L: "Ef L2E L: %L: -"}p8ʆ'   Lkzzzzzz z + L L & +"!wL "_ L E L %L  +"!wp8ʆ'   L zzzzzz z zk  [𫫘ZZZ  -"8PI% q$ L q$ ) "0L" L~ H"0h  -&"LbAe"6  WHT "0h q$ " e":Y!*"0 q$ zzz+zz z -zkL -;8 -"i - -8PI0';i H"ihh;iz -zk8 -PI= -":0  ;i H"ihhL 8 -PI0L -c -  )HN"ih)"xY:3)"Y:&;i c . $;i c   - -L +"8PI% u$ LN u$ c ">L<" L H">h  +&"`Ee"  WH">h u$ "c"W!0 "> u$ zzz+zz z +zkL( ZZZ  ) zzzz -zk)"ȡ   L   L ڃ  L ك  L   L   L Ã  L   L ă  y ۃ  g Ń  U ƒ  CH"4h [ [H"4h     H"4h  LI +zkn)"Y   L   L ڃ  L ك  L   L   L Ã  L   L ă  y ۃ  g Ń  U ƒ  CH"4h [ [H"4h     H"4h  Ls ZZZ    ;iH;i -H "hhhh8PI0!HH "zhhzzzzz z +H "hhhh8PI0!HH "xhhzzzzz z zk  -e8PI0%8PI08  L8ZPI0a8PI08R  L8(PI0/8PI0 8(  [8dPI0k8PI0 8\  3 -   # # L - ZZ    LH))"Lb8PIL[) "Lbe  ) "Lbe  ) "Lbe   ') "Lbe ' %) "Lbe  : +e8PI0%8PI08  LC8ZPI0a8PI08R  LC8(PI0/8PI0 8(  [8dPI0k8PI0 8\  3 +   # # L* + ZZ    L PHP))"`8PIL) "`e  ) "`e  ) "`e   ') "`e ' %) "`e  :  e H  - e hLXzzz z + e hLzzz z zk - ZZZ   ɀ L  L)8 + ZZZ   ɀ L0  L0)8 -BB  )"Y: ["ȇ6)8 +OO  )"X: ["[6)8 -B -B))"ȇx;"ȇ JJJ ))"   == - >> ->> -  L)=eLm) -Lm) ȷ   ȷ ȗ"[ `>  7)"{  -"{ (  L( `>;izz z +L"7 +"}dd>   >> + >> + > > +  L">eL" +L" ȷ   ȷ ȗ"#Z d>  7)" +"(  L! d>;izz z zk ;8   - `>Lh+7 `>LR+& " `>LR+ -"\LN+   LG+ 8 8 ȷ  ?ȗ + d>L$7 d>L|$& "! d>L|$ +"Lx$   Lq$ 8 8 ȷ  ?ȗ  -" b Li*       :   L*8    ;izz z -zk"a"V!"0hhhA"="{W"0"Z    ""qyz "0"_ -"0"e "0",wl"0"h^"f"0"Ӽ"0"D"0""}"0"-"0"Z"0"*:H"0hc -"0"Q:"}a "0k +"< b L#       :   L#8    ;izz z +zk ZZZ  46 -"0:L/ -i6"\8  L.U+ -i"6v:L/ -iC"\ E :#:L.L.L.  L.)):%:L. -iF"\:L.H):r -iI"\:Z -iK"\ɀ$ -iX"iN -"\:Uzzzz +"#:Lg& +i6"Z8  LX&U+ +i"tt:Lg& +iC"Z E :#:LX&LX&LX&  LX&)):%:LX& +iF"Z:LX&H):r +iI"Z:Z +iK"Zɀ$ +iX"NiN +"Z:Uzzzz zk;8 -*, &( J :<DBFH>B@BL@0" s"߿H"r\hC"Hd"_hd"HH"U\hh J " ;i"| "d"ү;i -k +*, &( J :<DOFH>O@BL'""H"Zh{B"Hd"@^hd"1HH"Zhh J "R ;i"\z "~d"Ŭ;i +k9 eH eh - +9 - +9 eH@ eh - +9 -@L/ +@L& ;8 - # :';i"BL2 : Ч) - L2 -   ? _ * M;i"B ;i "B  L2 L2L2   ?   ?  * :H  "0h4  ) ;i"B LI1;izz z -zk + # :';i"KL* : Ч) + L* +   ? _ * M;i"K ;i "K  L* L)L*   ?   ?  * :H  "G(h4  ) ;i"K L(;izz z +zk"_">""V}">"Y    ""[w ">"XH">;i +"j^Q +">"Xh +">"ju=">"\"%ew">"">"~J ">"\"b{">"">",Y">":H">h ">"7K:"b{ ">k ZZZ   / : \ (   - : / L}4 \ L}4 -  & + "OL44;i "n "l+ 8* Lz4 +  7 )zzzzz z + : / L- \ L- +  & + "HLn-;i "n "}+ 8* L- +  7 )zzzzz z zk i8H7 he -"ѧ - L3L,3 +"b + L,Lf, [𫫘;8  -d" H d"Lbh8 "L$>L7>  L7> - "!)L">; -"}:L"> ***)  v ) +7)L7L^7Lq7  Lq7 + "I)L\7; +":L\7 ***)  v ) )Ȉ &e?# )ʪeHeh Ȉ -&  L>## **) e# +&  LY7## **) e# e  ***) ) ) @@ -1386,120 +1321,121 @@ z )eH)8 hȈ &   -": -"#i;izz z +": +"g;izz z zk - ;8"L?"Xʆ" "Xʆ" -;i )":y  + ;8"U  +  LB9;"EV"i"U - "U +  "U  "U"U  ;"EV"d>L49"DWʆ" "DWʆ" +;i )":y  ]  8PI0E -"Xʆ"]eHeh"3W" - II -    5  "3W  -"3W" - II +    5  "U  +"U"U  ;izz z zk ZZZZ ;i -"ʷLjB)LjB7)LlB LfB: +"eL;)L;7)L; L;:  -" -LA -"Ef  % E  > & - "  @ j [ -i&   "ch  7    +"|  +L: +"_  % E  > & + "|   @ j [ +i&   "nbh  7    zzzzzz z zk ;8F -TR ;i;"LC -LC;i"OLC;i" i LC C1/c)   +TR ;i;"L= +L=;i"HL<;i"Eb L< C1/c)   c    e : -e ţ   L|D L|D&$"0_      'd Ci8c"  ;iFzz z +e ţ   L= L=&$"#_      'd Ci8c"N  ;iFzz z zk ;8  8 -PILF  LF [ LF):8PILE -):e  "Lb q  "LF"Lb q Mq"Lbe +PIL?  L? [ L?):8PIL? +):e  "`   "L?"`  M"`e  -;i "WLFLQE -c  )"Y:I +;i "VL?L> +c  )"X:I ;ie -"Lb)80eH -;i eh ; LE ";izz z +"`)80eH +;i eh ; L=> ";izz z zk -;ieLD +;ieL= ;8  -:LH -&H`;iH"-Khh0?"i"h>"hhhک~"ihZ;iH"-Khh0="i"h>"hhhکY"ihLH;iH"-Khh0?"i"h>"hhhک4"ihZ;iH"-Khh0="i"h>"hhhک"ihLH"ciH"ihh -J >  1)'"h>d"hh"i"i;i z +:LB +H`;iH]"gDhh0? "wh"p>]"hhhکI"whhZ;iHL"gDhh0= "wh"p>L"hhhک$"whhL&B;iH;"gDhh0? "wh"p>;"hhhک"whhZ;iH*"gDhh0= "wh"p>*"hhhک"whhL&B"6hHn"whhh +J >  1)'"p>d"hhL"wh"wh;i z zk ;8  - "mLI:d&#eHehJ)  II! #i0  JJJJ9  c      :;ic    А;ic ~ S + "3lLB:d&#eHehJ)  II! #i0  JJJJ9  c      :;ic    А;ic ~ S c : -c""X::    '   ;ic)  +c"V::    '   ;ic)  c  ;iz z zk  [𫫘;8, ;i;  -"8PILNL;i -"hLEL     8PIL;i-c i c  i c)LSM":YLSM;i "g +"8PILE;i +"[LE     8PIL;i-c i c  i c)LF"WLF;i "f -bj`j;i "ؖ;i ;i"g;i"ؖ;i  -"[s:(;i -"[s: L}K      +}Z{Z;i "k;i ;i"f;i"k;i  +"q:(;i +"q: LD      -bj`j i "g;i,+zz z +}Z{Z i "f;i,+zz z zk -;8    @ "M  ) LN  +;8    "}  ) ɗLG   8 -PILN -A% "0 -"0u -"Kh0;"W"Ր -"} -"};iz -zk "Lb  LO   "Lbe"f:f "Lbe "Lbe"M +PILH +A%k ">ɗ + ">uɗ +" h0;"V"h +"b{% +"b{;iz +zk "`  LH   "`e"^e:f "`e "`e"}     -LM +L3G ;8   -  LQ )LQ   -  "  .,Z ȈFjdLQ, .  LjQ +  LK )LK   +  "  .,Z ȈFjdL"K, .  LJ  Ȉ -&   g "Ef%LQ3#8 H h  LQ -"       _ ȈFj eH eh  +&   g "_%L"K3#8 H h  L"K +"       _ ȈFj eH eh  i8H%he  ;i zz z -zkZZ"g8PILGT8PIL7T8PILS8 -PILTS%ϩ"sw"sV"s;i   VV=?-e%'!#)+w-/x9;r|13[57 "zzk "Lb   "Lbe8PIL]R "Lbec "l09Hf"0h"ڣHU"0hhLDR q$ L,R & LR -;8 ;i"[;i ;i":LV / 1;i/"2 -ZLVMK;i "m;i/;ic4"m ;ic"2: 7k9m?s AuLV;ic"tLV +zkZZ"f8PILM8PILqM8PIL$M8 +PILLȩ" p" +P" ;i 0U4UAC;!#)+%'@-/v13 =?z57XZ9;"zzk "`   "`e8PILK "`ec "l09H">h"?ڣHA">hhL~K u$ LfK & LTK +;8 ;i"U;i ;i":LO / 1;i/"+ +ZLOMK;i "3l;i/;ic4"3l ;ic"+: 7k9m?s AuLO;ic"mLO ;i -i "m    7)     7)LVk7 m9LV -  "ѧ  " X  "0 iX1 . $  mk"   : ;i/":  " ;iz +i "3l    7)     7)LOk7 m9LO +  "b  " X  "# iX1 . $  mk"}   : ;i/":  "<;iz zk ;8  -"4;i{H" ;i s  L8Yt E L8Yu L L8Yv F L8Y= +";4;i{H" ;i s  LrRt E LrRu L LrRv F LrR= - H H H H;i"9hhhhL;YL;YL;Y   ßL(Y "LbcHHc" ;iH" ;i  LY  -RH`L;YL;YHH"HHHH" ;i û㽰8㷅Hc"Al dcHch c d c    LW;iz +CHAHCHAH8;i"|hhhhLuRLuRLuR   ßLbR "`cHHc"; ;iH" ;i  LNR  +H`LuRLuRHH";HHHH" ;i û㽰8㷅Hc"j dcHch c d c    LQ;iz zk ;8 - i  L[ )L[N ȈFj dL[L[ ȈFj  -:d%%L[ -"EfL[%L[ LU[L[ -"L[CL[#L[ ":o "   i8H#he;iz + i  LT )LTN ȈFj dLTLT ȈFj  +:d%%LT +"_LT%LT LTLT +"FLTCLT#LT ":o "   i8H#he;iz zk - ;8   L;^   + ;8   LuW       : ʣ : p 0 7 9 (    )808PI - L;^ / L4^ / ߩ + LuW / LnW / ߩ  -bj`j  +}Z{Z    @@ -1511,610 +1447,612 @@ z    a !z  8      a !z  8        -  L -]   / + 8PIL\8PI +  LDV   / + 8PILV8PI  );izz z zk  [𫫘;8T -;ic 8PI0L`;i -"Lm` Lm` -;i?"g:;i?"ؖ;i?H;iG;i"FhhhhL_;iU)|;i;iU";i"H:';iU;i?"g%;i?;i "LF_;i "h" "}L`9;igHH;i ;iC "jMhhIS"06;igHH;i  - "jMhh;iT+zz z -zk;ic L^ -;8V ;i;i":Lpc#% ;i#"2: -N Loc;i" +;ic 8PI0LY;i +"LY LY +;i?"f4;i?"k;i?H;iG;i"َhhhhLY;iU)|;i;iU";i"V:';iU;i?"f%;i?;i "CLX;i "wg""b{LY9;igHH;i ;iC "FhhI">6;igHH;i  + "Fhh;iT+zz z +zk;ic LW +;8V ;i;i":L\#% ;i#"+: +N L\;i"F  E % - " Lb -"Lb i8 "Al .8  C iN "i8 -"i8iX "m .Y +-iX"  ;i#"trA?i "A? -"A?    " ";i -";iVz + " L \ +"L[ i8 "j .8  C iN "i8 +"}i8iX "3l .Y +-iX"}  ;i#"mrA?i "A? +"}A?    "<";i +"| ;iVz zk -Z `   LdJsuu -s"WJJoqq -o"Wkmm -k"Wgii -g"Wcee -c"W _aa -_"W@[]] -["WWYY -W"W ` a   Leg J0SU&g U -S"WCEE -C"W ?AA -?"W@;== -;"W799 -7"W a b   L=fJ355 -3"WJJ/11 -/"WJJ+-- -+"WJJ+-) -'"W b zz +Z `   L]Jsuu +s"VJJoqq +o"Vkmm +k"Vgii +g"Vcee +c"V _aa +_"V@[]] +["VWYY +W"V ` a   L^g J0SU&g U +S"VCEE +C"V ?AA +?"V@;== +;"V799 +7"V a b   Lw_J355 +3"VJJ/11 +/"VJJ+-- ++"VJJ+-) +'"V b zz zk ;8  -  Lh  Lh    Lg  Lgg  Lh ȈFj -(cH*ch"0:  Lh +  Lb  Lb    La  L`  Lb ȈFj +(cH*ch"#:  Lb i8H -)he"%H%hLh -*(  ȈF j eHeh"0:  Lh +)he"N%H%hLb +*(  ȈF j eHeh"#:  Lb i8H -)he"\Lh Jc -*(H J)he"0:  Lh +)he"ZLb Jc +*(H J)he"#:  Lb i8#e) -*(H J)he"0: +*(H J)he"#:  Mi8#e)) ))JJJJ;iz z zk ;8   -         Lk -  "0Lk  +         Ld +  "#Ld  - Lk  ? 7   - L]k - . L]k#   L]k  L%k + Ld  ? 7   + Ld + . Ld#   Ld  L_d @Z   #    ,  .     -     M   2   "T:):     P    "Au  , . J    "JY   LYi  ;i +     M   2   ":):     P    "s  , . J    "R   Lb  ;i zz z zk ZZZZ  - '"X  -   Lrn   -"!  Ln -"!  LQm;i -"}  LNm ɪ LNm@ -"!)e_ -:"!)A;i -"}@    "X:LlLn -"!          -"!)/ -"!)  "X: '  )     -"#i )zzzzzz z + '"V  +   Lg   +"I  LTg +"I  Lf;i +"  Lf ɪ Lf@ +"I)e_ +:"I)A;i +"@    "V:LeL@g +"I          +"I)/ +"I)  "V: '  )     +"g )zzzzzz z zk;i -"}:   Ll;8&!!064!c8o48!68o4:!c4:8!062c6o2 8 #66o2:c2: 8 #""Lb%""Lb8%""Lb!""Lbe8%  Lpw""Lb8%U%c  cԣc @ c ` #c!w""Lb8%U%c cԣc @ c ` #c;i&k%c%cc8#cc8# c  Lo#c#c @  @  `  ` #c;8X;i ;i":Lzt ;i "Al Lr;i"2 "" Lr ")]y   -X &;ic  ;ic LqLzt Lzt%:;ie :ף % '-/;i%"OLtt;i%" iY;iCA "mCA    " LntLftL\t;i%"i CA"AlCA  ;iCA "m    " ;iXk +":   LRe;8&!!064!c8o48!68o4:!c4:8!062c6o2 8 #66o2:c2: 8 #""`%""`8%""`!""`e8%  Ljw""`8%U%c  cԣc @ c ` #c!w""`8%U%c cԣc @ c ` #c;i&k%c%cc8#cc8# c  Li#c#c @  @  `  ` #c;8X;i ;i":Lm ;i "j Ll;i"Ͷ ""; LlS "[y   +X &;ic  ;ic LkLm Lm%:;ie :ף % '-/;i%"HLm;i%"EbY;iCA "3lCA    "<LmLmLm;i%"i CA"jCA  ;iCA "3l    "<;iXk ;8  - +7 )Lxw  -e:Lw i ;i  "mJLu @+ dFH H;i i "Hhh "l*dLxwLxw + L&uJJ  c "f "Lv:Lv   H + +7 )Lp  +e:Lp i ;i  "3lJLn @+ dFH H;i i "3Bhh "}*dLpLp + L`nJJ  c "6 "Lp:Lp   H -h8"OLv i "Au   -  "0[H   "h  "JY  : ЂLrw -  "0k   "Al i   "m+7 H  h  ;izz z -zkLt -;8*    " +h8"HL p i "s   +  "#[H   "h  "R  : ЂLp +  "#k   "j i   "3l+7 H  h  ;izz z +zkLm +;8*    "  -LzLuz -HH "hhh 8 PI0L"z&("$8 PIF&(PIg -c;i c (&("$LVz"$Ly&(PIM$"Ȉ +LsLs +HH "hhh 8 PI0L\s&("$8 PIF&(PIg +c;i c (&("$Ls"$L*s&(PIM$"Ȉ &H c)henC&($H$h -c  "$(&&("$Lx  - E ;L8x +c  "$(&&("$Lq  + E ;Lrq  -"{ ;i*z -zk;8b "qy"p ;iH"x HH"z H"v;i"   HH"2q"k  HH"2q"kH#H"2q;ie"kHH"2q"k  HH"2q;i]>"ȡ"khhL|"khhL|"khhL|"khhq "khh\8"khhG"khh-"khhF"khh  HH"2qhh"khhY   HH"2q>H>H;i"9 ;iH"k;i  R   HH"2q>H\;i"9;iH"k;i -   HH"2q"k HH"2qs"k;i +";i*z +zk;8b "[w"ro ;iH"w HH"x H"u;i"   HH"o"j  HH"ox"jH#H"o;iY"jHH"ox"j  HH"o;i(>"Y "jhhLu"jhhLu"jhhLu"jhhq"jhh\,"jhhG"jhh-"jhh:"jhh  HH"ohhx"jhhY   HH"o>H>H;i"| ;iH"j;i  R   HH"o>H';i"|;iH"j;i +   HH"ox"j HH"og"j;i ;8 -  L -L -  L  L  LȈFj -(cH*ch"0L )  +  LDzLDz  Lx  LYx  L>zȈFj +(cH*ch"#L>z )  i8H -)he")  +)he"N)  i8H -)he"  L -*( ȈF j eHeh"0L +)he"  L>z +*( ȈF j eHeh"#L>z i8H -)he "b  LJc -*(HJ)he"0L +)he "Da  L>zJc +*(HJ)he"#L>z i8H#he )  ')      -*(HJ)he"0y +*(HJ)he"#y i8H#he)')# ) FjFjFjFj   ;izz z -zkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkH)hkH @hkڢkڢ"k"""k"""\" "m"Á"B"" " " "$ "O" k8k"Á""|k"|"m"""""Ák"`""Á" "\\m"\k, H"hk"""","N""ڢ""J""Á"""""Á""k"z"Á" -"z i0""""8kڢ"z"z"j"""""", kx0"(k(kx0 @""R(kx0"|""m""z(kx0 ""R(kx0"|"m(kx0_""_(kx0?""_(kx0"(()k0(k(kx0, H"h(kx0"Ё" "݁(k +zkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkH)hkH @hkڢkڢ"${k",{",{",{k"8{"8{"8{\,{"E{"z"z"|z"z"E{"E{"E{"^z "z"E{k8k"z"z"{k"{"z"${"${"${"z"zk"z"z"z"E{"z\{\z"{\{k, H"{hk"8{"z"${"z,"zN"${"${ڢ"z"${J"z"z"${"${"z"${"z"z"zk"z"z"z +"z i0"z"${"${"${8kڢ"z"z"zj"${"z"${"${"${"${, kx0"U{(k(kx0 @"{"{(kx0"{"z"z"z"z(kx0 "{"{(kx0"{"z(kx0_"z"{(kx0?"{"{(kx0"b|()k0(k(kx0, H"{h(kx0" +{"E{"{(k ;8   -"OL   ,.   "0L L? 7   LS   LS  L@+7)L @Z  #   ,.         U  :   "c: ):          LA  !"Au L+7)0 -i  "6v:L  ,.     (  ,.    -"JY    L℣;i zz z +"HL   ,.   "#L† L†? 7   L   L  L@+7)L @Z  #   ,.         U  :   ": ):          L|  !"s L
+7)0 +i  "tt:L  ,.     (  ,.    +"R    L~;i zz z zk -ZZZZ -!&"@$  ))*(,. " $L@ -H`8LPLPPà|@j耠XaF N47"pC"ȡLPLLPLPLPLP<|jXF4"DDL9 + [𫫘ZZZZ +&"@$  ))*(,. " $L +AH`8LLPà|@j耠XaF N47"p"YLL^LSLL |jtXF}4~"LC9 -C -C D - LUD+ - 4 - " -  - V:@) - 4( - " -  - zzzzz +P +P  + LD+ + 4 + " +  + V:@)w + 4 + " +  + zzzz+z zk -;84;i!;"L ><!##!8ʆ#!&#!L #!  L!%#' -;i%"Ef%  -LE  +;84;i!;"LQ><!##!8ʆ#!&#!LO#!  L\!%#' +;i%"_%  +LNE  i   - #!LO LƎ#!#!*(   -  I  #! "0   - L     #!  8#!i8c"\: + #!L L #!#!*(   +  I  #! "#   + L     #!  8#!i8c"Z:    - W#!i8c") + W#!i8c"N)  c # : -     Lw  >#!#!  ;i4z +     L  >#!#!  ;i4z zk ;8X  - "uV"h -;i P";i ;iH;i "}hhLג"\X7"U J?(4Q)G | "uV"lr;iH;i "}hhL"MXʆ"U ;iH;i "}hhL"MXʆE -ELz;iH;i "} + "U"g +;i P";i ;iH;i "/hhL"V"% J?(4Q)G | "U"p;iH;i "/hhL"VʆZ"% ;iH;i "/hhL֋"VʆE +EL;iH;i "/ hh -Ld -"f: L4 -"f: {> -"f: PC -"f: (% -"f:08 "uVH"ehL뒩 -"0L뒩"0q[ "0["0Eq"0/"00 "0;iXzz z +L +"^e: Lz +"^e: {( +"^e: P- +"^e: (%V +"^e:08 "UH"FdhL1; +">L1">q ">[">E]">/}"> ">;iXzz z zk ;8   R     -_ "Ef Lۖ%Lۖ  Lۖ -  LۖL -L -   "EfEL %L h  "   +_ "_ L!%L!  L! +  L!LY +LY +   "_ELR%LRh  "    -  Lۖ - Lݕ  ii  '   Lۖ +  L! + L#  ii  '   L!   -"Ef?E'%  - Lۖ -L<Lۖ +"_?E'%  + L! +LL!   -"}'! - "}e +"!w'! + "!we    8ʆ    :     =;izz z -zkZ8PI0LHV"LbhOOV"LbeOV"LbeOV"Lbe +zkZ8PI0LTHV"`hOOV"`eOV"`eOV"`e - OV"LbeOV"LbeOV"LbeOV"LbeOV"Lbe OV"Lbe""$$OV"Lbe6688OV"Lbe::<<OV"Lbe&&((OV"Lbe**,,OV"Lbe..00OV"Lbe2244OV"Lbe>>@@OV"LbeBBDDOV"LbeFFHHOV"LbeJJLLOV"LbeNNPPOV"LbeRRTTzzk + OV"`eOV"`eOV"`eOV"`eOV"`e OV"`e""$$OV"`e6688OV"`e::<<OV"`e&&((OV"`e**,,OV"`e..00OV"`e2244OV"`e>>@@OV"`eBBDDOV"`eFFHHOV"`eJJLLOV"`eNNPPOV"`eRRTTzzk ;8  &$;i -"ʷ  Lh)  Lh7)Lj8 Hhd -  Lj77LŞ ȈFj +"e  L)  L7)L8 Hhd +  L77L  ȈFj :d%%z  -"Ef  Lj%  Lj"  LjcJ)L +"_  L%  L"  LcJ)L> c -8H   "ch  Lj X8Hhd2 +8H   " p J|>p>p>     -|>    -|>   -|>  -|>p>p>"Y hhhh7    8PILӣ"`"lRD"8"7H H*HK"%dd","""D4;iH"x ;i "i 8p>PIL袩8 PI0L "i8p>PIm -r>X -|>"ciHH;i3"9;i3"d[H;i5H" ;i ;i-"9;i-"d[H;i/H"hhh"ii -"i -PIO" dC"g -,8PI: -r>: -|> - -;ie"F;i|z -zk -r> -|>"& - -;ie -|>"$:L"W -r> 8 -|>"ciH "ihh -|> - -;ie   LD& 0 & JJ 4 L{ - ;8"  H;i"(`hL ?"    O )"")" -         "Ali") + ;8"  H;i"^hLh ?"    O )"")" +         "ji")  - La -La - La + L+ +L+ + L+ -ed`dC5 d""]  +ed`dC5 d""\  cHc h % cHc h 8H" -hLa i -" i " .  -")")" +hL+ i +" i " .  +")")"  -")")"   -")"   +")")"   +")"   JJ))   -cHch:")")" +cHch:")")" -cHch:")")"  -cHch:")"   +cHch:")")"  +cHch:")"   JJ))    i  cHch  - L iU"b"ch;i"zz z + LꙣiU"Da"nbh;i"zz z zk ;8b  - ;i;i"LT;i/ ;i7 ;i7L;i/ "OL;iG"0L;iK"ѧH;i;h;i/"OL;i/" iV;iK"ѧ ;i/"JY L;i;i/";i/c)L  y :::;i/cc  £:c /  LULꪣL: " :c /  ) + ;i;i"L;i/ ;i7 ;i7L];i/ "HL];iG"#L];iK"bH;i;h;i/"HL];i/"EbV;iK"b ;i/"R L];i;i/"H;i/c)LQ  y :::;i/cc  £:c /  LLL " :c /  ) -bj`j  c )L. L +}Z{Z  c )L Le   /    H c    Z    -c       L +c       L    ;ibzz z zk +;8|"X8ʆ P P8 +ʆP P8ʆ1 3 x> p J>x>x>     +>    +>   +>  +>x>x>" "p "bv;i    8PIL"C_"kYQ""EH H*H{J"Odd""."D"g4;iH"w ;i "wh 8x>PIL-8 PI0L< "wh8x>PIm +z>X +>"6hHH ;i3"|;i3"YH;i5H" ;i ;i-"|;i-"YH;i/H"hhh"i +" +PIO"bC"e +,8PI: +z>: +> + +;ie"?;i|z +zk +z> +>" + +;ie +>":L"9V +z> 8 +>"6hH "whhh +> + +;ie   L$ 0 $ JJ 4 L ;8  &$;i -"ʷ  Lx)  Lx7)Lzc8  L77L ȈFj -:%Lo, +"e  L1)  L17)L3c8  L77L? ȈFj +:%L(,  -" -" @ LzE  Lz%  Lz +"F +"F @ L3E  L3%  L3   W -i&  "ch  Lz 7 "  LzcJ)L  +i&  "nbh  L3 7 "  L3cJ)LŪ c -8H   "ch  Lz8Hhd?8 +8H   "nbh  L38Hhd?8 ) e -i&"m 7  -) L豠 Z D -i&  "ch  Lz78 +i&"3l 7  +) L Z D +i&  " -i " -i$"    ;izz z +7:Lȥ +iI"Z7: Lȥ +iK"Z# +iX"N +iF"Z  Lȣ +c JJJJeHeh   L8 Hh +" Lȩ    LȦi$&c (* cHch02e +ib"Z: LȠ: Lȥ +id"N,.&&L/Ǡ: L(cH*c h,.G"\Fj77eHeh&i ȈFj " Lȩ  Lȥ +ih"ZLȥ +"#:L   +i6"ZULȥ +i8"NRRkaAd +i"NrrEAa> +i "N +i$"N    ;izz z zk -;8B57 1" +;8B57 1"  -L֣-/) + % '!#  1L -HH"hhh383PI0L֩-/))++%'!!## 9? A;=%%83PI0?-/))++%'!!##9 ?A ;=Lϣ)+L{ѥ +LУ-/) + % '!#  1L +HH"hhh383PI0LЩ-/))++%'!!## 9? A;=%%83PI0?-/))++%'!!##9 ?A ;=Lɣ)+L4˥ c% Z /    F -c% z d    !#  L֩L֣L ӣ?AL ӣ! # S"U -c%))#H#hHH"0hh  Lҥ -c%)#H#hHH "0hh  Lҥ +c% z d    !#  L8ЩLУḶ?AḶ! # ""% +c%))#H#hHH ">hh  L̥ +c%)#H#hHH ">hh  L̥ c%)Ȉ &#H#h  5 -c%)     Lգ?ALգ;=Lգ o8?HCh"U -c%))Hh92,75!#7H7HQ"0hhHH "0hh Lԥ -c%)Hh92,75!#7H7H1"0hhHH "0hh Lԥ +c%)     LKϣ?ALΣ;=LΣ >8?HCh"% +c%))Hh92,75!#7H7H=">hhHHS ">hh LΥ +c%)Hh92,75!#7H7H">hhHH; ">hh LΥ c%)Ȉ &Hh 5#H#h c%)    u8;H?hC  -c%     ! # L3;cH?ch8        9 ?A ;=%+)!#!)#+!# 9? A;=%L\Щ "01;iBz +c%     ! # L;cH?ch8        9 ?A ;=%+)!#!)#+!# 9? A;=%LʩJ ">1;iBz zk ;8   - ;i"2%L~ޥ)H + ;i"Ͷ%L7إ)H  - e h   f/_\Xɀ")]L~ޣ L~ޣ   + e h   f/_\Xɀ"[L7أ L7أ    -eLXף    f / Lߣ \ L            +eLѣ    f / Lأ \ L             : -e.I L٥ +e.I Lbӥ  : -e.L٥ +e.Lbӥ  :: -e.L٣ -e , Hi eh L~ފ  .i e   2 +e.Lbӣ +e , Hi eh L7؊  .i e   2 : e . :ʦ  -eL~ީ  +eL7ة   -e L ߣ % +e Lأ %  e.     ' : -e. :բ i  "Al  )       +e. :բ i  "j  )        -e  Lݣ Lޣ.  Lޣ L:ݣ L:ݣɀK  "#:#5 )    } :.      Lޣ   i c     LܣLܩ")]{AZ     a'z  8        $_         i c     Lޣ    4       L      +e  LCף Lأ.  Lأ L֣ L֣ɀK  ";#:#)    } :.      Lأ   i c     L֣Lp֩"[{AZ     a'z  8        $_         i c     Lأ    4       LI          # #      JJNJ              + ;iz z zk  -     '         Lڣ  LڣL< - ;8   ;iO"sk;i -    L~ % ;iO" L +     '         Lԣ  LӣL + ;8   ;iO"Fj;i +    L7ܣ % ;iO" L9       0 0 0     " O - %         "  * .    %  n    0 D9  9 -"Lb)e80      -%   . L    * 4 +"`)e80      +%   . L    * 4      s   0 D9  9 -"Lb)e80      +"`)e80           -   l d    l '            %;iO";izz z -zk)"ȡL4i +   l d    l '            %;iO";izz z +zk)"YLݠi - ;c)L0 -# :#%;iO""ԣ -)/:"  ;iO"ʣ%;iO "إ  + ;c)Lݣ0 +# :#%;iO""ԣ +)/:"  ;iO"ʣ%;iO "إ  -LLELg -7;iO" L # :Gi +L9LܩEL +7;iO" L9 # :Gi - -+)'L# :LR d EiGiʃL d 7;ʃ + -+)'Lߩ# :L ߣ d EiGiʃLߣ d 7;ʃ -+)' d L-H;i;i'8  -+)' ;i;i;i -"h  ;i;i;i -"e  3 x  'c      #0cH;i1ch # # L#:&##;i/c - ##:#%;iO""ԣ:;iO;i/c"ң%;iO "إ  +"  ;i;i;i +"  3 x  'c      #0cH;i1ch # # LB#:&##;i/c - ##:#%;iO""ԣ:;iO;i/c"ң%;iO "إ  -LiH -;i1"h;i/"d[ +L9iH +;i1"h;i/"Y # :# -%;iO"" +%;iO""  ԩ;i/c)6 -%;iO "إ J;iO;i/c";iO"  Lo - ;88"`WDF HJ "V "V  L % L\ "V "V    % LL  -  +) '+@a  )"ȡ+"WW6+"WW'++"WW "WW )L+L 0 {9 p 80  #+-' +%;iO "إ J;iO;i/c";iO"  L( + ;88"UDF HJ "eU "^U  L % L "eU "^U    % L  +  +) '+@a  )"Y+"U6+"U'++"U "U )L+L 0 {9 p 80  #+-'  -c)c"WW+ )L) +c)c"U+ )L)  -c)c+"WW L * L#+3 +c)c+"U L * L#+3   +)L - + 8  ' L . .#+;i8zz z -zk+"WWL z  t  . "WW+L l h   j +#"WWe l *#+ ++#"WW3 h L~#+ ++#"WW )'"V "V   -   +)'"$ &   LN& p :#&"$ - & +)'ǩ & E G & & e 7g & ,"W"rWT LV &  S L c L: s L& d L: i L# &"W"rW L # # )   # "$  &)"ȡ#  -"iW L$""V $""V  V ;  # @ LHh HH"NW"\hhLG"iW%# `  "iW #   $;"W "OH;i/h8  #    L"NW%H"Wh"W"NW&)H"Wh"W"$ LG# "WiNʆ# (# + + 8  ' L . .#+;i8zz z +zk+"UL z  t  . "U+L l h   j +#"Ue l *#+ ++#"U3 h L7#+ ++#"U )'"eU "^U   +   +)'"$ &   L& p :#&"$ + & +)'ǩ & E G & & e 7g & ,"]V"U% L &  S L c L}: s L& d LX: i LX# &"]V"U L # # )   # "$ # &)"Y#  +"U L$""eU $""^U  V ;  # @ LHh HH"U" [hhL"U%# `  "U #   $;"iV ",H;i/h8  #    LK"U%H"QVh"V"U&)H"QVh"V"$ L# "]ViNʆ# (# I)8ʆ# "8    #   % -;"W "OH;i/h8  "$    #NJ - )8PI)  # @# #      # c):;i-e 0 #  %   @#     "#     # L?# E) )8PI "Wc      -    )8PI' "NW H"Wh"W  ȣ     )8PI0  "W # Q "NW0H"Wh"W@# .  # xX"NWH"Wh"W  [# N #  +  #  -  "NW )H"Wh"W  )8PI#"NW0H"Wh"W:    = : "NW );i-e)H"Wh"W    L - ;"W ]"W"rW   #  "U_  # 1  "NW H"Wh"W : ۣ    L  "NW)H"Wh"W: :  "$ "NW H"Wh"W:ݣ L    "NW)H"Wh"W L +;"iV ",H;i/h8  "$    #NJ + )8PI)  # @# #      # c):;i-e 0 #  %   @#     "#     # L# E) )8PI "#Vc      +    )8PI' "U H"QVh"V  ȣ     )8PI0  "#V # Q "U0H"QVh"V@# .  # xX"UH"QVh"V  [# N #  +  #  -  "U )H"QVh"V  )8PI#"U0H"QVh"V:    = : "U );i-e)H"QVh"V    L - ;"iV ]"]V"U   #  "]  # 1  "U H"QVh"V : ۣ    L  "U)H"QVh"V: :  "$ "U H"QVh"V:ݣ Lm    "U)H"QVh"V Lo @!#%')+-/7:=@CFILORUX[^a@@0 PiYG pbk@qnQFOp LE'''''''''######''# ##'# '# '# ##'## ##'''# #''''''''''######## ########'''''''''''##'# ''''''''######## ''''''''######## gcJ''##'; #''# '''# ### ### '''# '#                                                                      gcJ gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; ; #' #''' ### ### #''' #''''''''''######'## #' #' #'## #''## ##'''# #'''# '##'' ########''''''''gcJ; ########'''''''' #'##''''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #'''# #'''## ##''# ##'# '# '# ##'## ##'''# #''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''## ##'''# #''''# #'''## ##''# ##'# '# '# ##'######'''''''''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''######'''''''''1`Je > PH +: 2"RA n +O 6t^#|gk ;8N -;i"[ L: +;i"U L:  - G  G"W  JL: + G  G"U  JL: L: -b -CECEH;iEI"(`hCE(CEEC:E%C% -CEH' 4   " ) 52$HJJJJJJh"f:  "8:77 -H"H"f7979L:\ +3 +CECEH;iEI"^hCE(CEEC:E%C% +CEH' 4   " ) 52$HJJJJJJh"6:  "8:77 +H"H"67979L:\ Z L:JLJ -L H;iLI"(`hL:4??JL!?8JJLL +L H;iLI"^hL:4??JL!?8JJLL   ? A ? AJɀLL:   - 4JJ4J   4JL:   "cJHcNh$&  + 4JJ4J   4JL:   "cJHcNh$&  ; ==;  L|LHLhZJ h  -n= -nd - '&LJ"(**(&& +$= +$d + '&LJ"(**(&&   i i Hd e e -:H" +:H" (*7(*+    , .(*LpL:LNLJ ȈFj  -`= -`d - '&LJ" += +d + '&LJ"  .  &  i  <   -"]Fji  cH:H" +"\Fji  cH:H" "Ȉ -&H"    -, .(*?cHCch.,5"]cHchc(Hc,h020cCH4cGh +&H"    +, .(*?cHCch.,5"\cHchc(Hc,h020cCH4cGh :EC:II%%80H4h  9cHch cc - ,,..L5"F: + ,,..L5"F: iiii     - 5"c,Hc0h + 5"c,Hc0h  ,. &&&&  0c H4ch 8 -?HChJLL:8JHNhH209"]h8Hh8(H,h " +?HChJLL:8JHNhH209"\h8Hh8(H,h "   - !;=Ff   L} L:  L r;=& &@ &  p4JJ   =; P;= &   0L: 7;=+ &    ;=LPL:   L:H -"Al' - "m -i H"b   -i"b 5   +"j + "3l +i H"Da   +i"Da 5   "  -i"bJL -iJ"b -i LJ"   -i?"b -i"b -iA?"  L  -iC&$" -i$.," -i," -i0"b -i2"b @ )B  -iG"mf -i'&$" -i,"b $ )& |  -i+"m -iU"bCA -I"chL:  LH CAi -I"chH -"Al -RRaA" -irrAa" +i"DaJL +iJ"Da +i LJ"   +i?"Da +i"Da +iA?"  L  +iC&$" +i$.," +i," +i0"Da +i2"Da @ )B &  +iG"3lf +i'&$" +i,"Da $ )&   +i+"3l +iU"DaCA +I"nbhL:  LH CAi +I"nbhH +"j +RRaA" +irrAa" i -:" -i" -iU"bCAi -I"chCA -I"ch7H"Lb -"Al +:" +i" +iU"DaCAi +I"nbhCA +I"nbh7H"` +"j    5L8  ( * @@ -2133,13 +2071,13 @@ H  H -I"chL:cHch +I"nbhL:cHch 8Hh  L      ZJL   4          49JL H -;iI"hL:HI"(`hL:L:  H -" -i" -i"A   +;iI"ŘhL:HI"^hL:L:  H +" +i" +i"A    @@ -2147,7 +2085,7 @@ H   -", +", .  79  @@ -2157,33 +2095,17 @@ H  H -I"ch;iNzz z +I"nbh;iNzz z zkH -"AlcHch +"jcHch 8Hh  L - L{  @!#%')+-/=@CFILORUX[^adg@@$v 0:,4L}7S)R+[5,X&Q'''''''''######''# ##'# '# '# ##'## ##'''# #''''''''''######## ########'''''''''''##'# ''''''''######## ''''''''######## gcJ''##'; #''# '''# ### ### '''# '#                                                                      gcJ gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; ; #' #''' ### ### #''' #''''''''''######'## #' #' #'## #''## ##'''# #'''# '##'' ########''''''''gcJ; ########'''''''' #'##''''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #'''# #'''## ##''# ##'# '# '# ##'## ##'''# #''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''## ##'''# #''''# #'''## ##''# ##'# '# '# ##'######'''''''''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''######'''''''''7@z m @wvC  Rd  "7@R+R(R$R -R S UWYZ ] acgkmmmmmmigc_ -] [YX V T -S"R%R)R+R 0R0R0R0R0R0R0R0R0R0a0R0R0R0v trponnnmnnnnnmnnnnnnprt v0R0R0R0~R(R(R(RRRRRRRRRRRRRRRR0R0R0R0R0R0R0R0R0R0mphc!_$]&[(Y*W,U-U.S  S R%Q(Q*P*P,P,P,P,P,P*P*P(Q&R R  S.T.U,W*Y([&]$` cho~~~iiiiiiiiiiiiiii0R0R0R0R0R0R0R0R0R0^O:3P:2Q:1R:~:~:~:~:q  BK:o BL:mBM:lBN:k:j:i:h:gBG:fBH:eBI:dBJ:c:b:a:`:_BC:^BD:] BE:\ BF:[:Z:Y:X:WB?:VB@:U BA:T  BB:S -:R -:Q :P :O:N:Md1ru6:Lb]f:Ka?|Q:J_f u6:J_J f:J  -  ^$liPzQ:TnYX0Pzu6:6xp[X0Pzf: `t\X0PzQ:Cy_X0Pzu6:g}b X -0Pzf:Qe X 0PzQ: X0: X0:  X0::M X0::M X0::M X0::M X0 X0 X0  X0! X0"ǝM X0#ƝM XU7, 0$ŝM -XK  0%ĝMXV> * 0&XN&/0'XWD'0(eXR/-0Pz)}M Gz*ˠMV*! -!+^+ʠMs8*) -!*=s,ɠMwA*' -!*Ew-ȠMh2*' -!*7k. R*% "*/a /L q< *S O0 `d, *Ew ]2(j}H*7kf5ϞRB{m4*/al.8ΞTQXV u9;͞Uc~I>̞W3o T@,F| -cC,Zg#F-fr5I.;vx@LӟҟџПi  - -      !#%&' ())*+%'./0 *12 3 4!5$/"6#6&1$8(3)>,8-9+@,A/<0>.C/E1G4B6D4J7E7F5K7N:I8O;R>N>N>VAQ@XAYDVB[EVD\E]H[F_G`HaIaIbL_KdLfOcNgOhSgQkRlUjTnUoXn[qZt[u^u]w`x_z`{c{c~de~fghhhijklmmnnopqqqrrssstttuuvvvvwwwwxxyyz{mq\Z\Z\Z\uZ\o{\d\n6\m\\{\Ø\\?\\\J\\\Y\\\\q\\\/\\\\\\K\Ր\\o\\7\\oz\ʪ\\\n\Nt\^\P^\s\-K\Z\c\i\4\H\ d\S`\ -\\Hp\r\$x\p\2q\q\wx\x\z\\v\m\-\X\p\v\\k\\0HZ + L{ \ў\,Y\DY\X\Yy\~\/\k\y\\і\\Ф\\\=\ߪ\;\\\ \M\\p\\i\\>\(\\\ \h\\;n\o\a\\Yx\ە\T\\m\W\ \gD\X\a\\-\\b\^\\\n\p\bv\$o\o\p\v\w\x\\u\|l\\\ro\t\8\j\>[\f\e\\\|\X}\e}\w}\|\|\8}\}\*}\H}\}0HZ  - [dH"c+z + [dH"\+z zzz z zzzzzzh@0HZ  - [dH"rV+z + [dH"T+z zzz z -zzzzzzh@8[dH\doP \ No newline at end of file +zzzzzzh@8[dH\mP \ No newline at end of file diff --git a/roms/f256k/toolbox.csv b/roms/f256k/toolbox.csv index f654ac5..9f2c660 100644 --- a/roms/f256k/toolbox.csv +++ b/roms/f256k/toolbox.csv @@ -15,5 +15,4 @@ "2E","toolbox-2E.bin" "2F","toolbox-2F.bin" "30","toolbox-30.bin" -"31","toolbox-31.bin" "3F","toolbox-3F.bin" diff --git a/roms/f256k2/README.md b/roms/f256k2/README.md new file mode 100644 index 0000000..fde9399 --- /dev/null +++ b/roms/f256k2/README.md @@ -0,0 +1,12 @@ +# ROM Files for the F256K2e + +This directory contains BIN files for programming the F256K2e flash memory with the Foenix Toolbox. + +## How to Install + +Currently, the toolbox must be installed by bulk programming the flash memory. +Using the FoenixMgr Python script, this can be done with the following command (substitute the device path or name for your F256K's USB debug port): + +``` +python FoenixMgr.zip --port {debug device name} --flash-bulk toolbox.csv +``` diff --git a/roms/f256k2/toolbox-20.bin b/roms/f256k2/toolbox-20.bin new file mode 100644 index 0000000..aedf1b3 Binary files /dev/null and b/roms/f256k2/toolbox-20.bin differ diff --git a/roms/f256k2/toolbox-21.bin b/roms/f256k2/toolbox-21.bin new file mode 100644 index 0000000..2390c4f Binary files /dev/null and b/roms/f256k2/toolbox-21.bin differ diff --git a/roms/f256k2/toolbox-22.bin b/roms/f256k2/toolbox-22.bin new file mode 100644 index 0000000..0d99eb3 Binary files /dev/null and b/roms/f256k2/toolbox-22.bin differ diff --git a/roms/f256k2/toolbox-23.bin b/roms/f256k2/toolbox-23.bin new file mode 100644 index 0000000..3122296 Binary files /dev/null and b/roms/f256k2/toolbox-23.bin differ diff --git a/roms/f256k2/toolbox-24.bin b/roms/f256k2/toolbox-24.bin new file mode 100644 index 0000000..557b09a Binary files /dev/null and b/roms/f256k2/toolbox-24.bin differ diff --git a/roms/f256k2/toolbox-25.bin b/roms/f256k2/toolbox-25.bin new file mode 100644 index 0000000..0c697b7 Binary files /dev/null and b/roms/f256k2/toolbox-25.bin differ diff --git a/roms/f256k2/toolbox-26.bin b/roms/f256k2/toolbox-26.bin new file mode 100644 index 0000000..a6b4e35 Binary files /dev/null and b/roms/f256k2/toolbox-26.bin differ diff --git a/roms/f256k2/toolbox-27.bin b/roms/f256k2/toolbox-27.bin new file mode 100644 index 0000000..0577750 Binary files /dev/null and b/roms/f256k2/toolbox-27.bin differ diff --git a/roms/f256k2/toolbox-28.bin b/roms/f256k2/toolbox-28.bin new file mode 100644 index 0000000..6693640 Binary files /dev/null and b/roms/f256k2/toolbox-28.bin differ diff --git a/roms/f256k2/toolbox-29.bin b/roms/f256k2/toolbox-29.bin new file mode 100644 index 0000000..ec4ce67 Binary files /dev/null and b/roms/f256k2/toolbox-29.bin differ diff --git a/roms/f256k2/toolbox-2A.bin b/roms/f256k2/toolbox-2A.bin new file mode 100644 index 0000000..4f1d7c8 Binary files /dev/null and b/roms/f256k2/toolbox-2A.bin differ diff --git a/roms/f256k2/toolbox-2B.bin b/roms/f256k2/toolbox-2B.bin new file mode 100644 index 0000000..295b186 Binary files /dev/null and b/roms/f256k2/toolbox-2B.bin differ diff --git a/roms/f256k2/toolbox-2C.bin b/roms/f256k2/toolbox-2C.bin new file mode 100644 index 0000000..b5bb879 Binary files /dev/null and b/roms/f256k2/toolbox-2C.bin differ diff --git a/roms/f256k2/toolbox-2D.bin b/roms/f256k2/toolbox-2D.bin new file mode 100644 index 0000000..790fa1e Binary files /dev/null and b/roms/f256k2/toolbox-2D.bin differ diff --git a/roms/f256k2/toolbox-2E.bin b/roms/f256k2/toolbox-2E.bin new file mode 100644 index 0000000..37f9a06 Binary files /dev/null and b/roms/f256k2/toolbox-2E.bin differ diff --git a/roms/f256k2/toolbox-2F.bin b/roms/f256k2/toolbox-2F.bin new file mode 100644 index 0000000..0bcbd29 Binary files /dev/null and b/roms/f256k2/toolbox-2F.bin differ diff --git a/roms/f256k2/toolbox-30.bin b/roms/f256k2/toolbox-30.bin new file mode 100644 index 0000000..1c7106d Binary files /dev/null and b/roms/f256k2/toolbox-30.bin differ diff --git a/roms/f256k2/toolbox-3F.bin b/roms/f256k2/toolbox-3F.bin new file mode 100644 index 0000000..2471f40 Binary files /dev/null and b/roms/f256k2/toolbox-3F.bin differ diff --git a/roms/f256k2/toolbox.bin b/roms/f256k2/toolbox.bin new file mode 100644 index 0000000..9927fa0 --- /dev/null +++ b/roms/f256k2/toolbox.bin @@ -0,0 +1,2111 @@ + +9;<=>?@AB /,123456ABCDOK.*111213141517181920212324303132OVsd0sd1 RAMROM%d:38668K86088K960ARMELFM32PGXPGZPPCRCESPUODDSD0SD1INFNaNNone %s +%02XGenXEVID/sd0FILEFR20MIPSNONEPGXRH32S370S390V800COM1COM2EVENMARK%s%s +%04X:%d:%sIAMCUPPC64SPARCSPACE%02X %s%08XC256 UF256 PGenX32M68020M68030M68040(null)dev = PARISCVPP500SCREEN+,;=[]%s%s%s +%s: %s +%024lX:A2560 KA2560 MA2560 XC256 U+F256 JRF256 K2F256 KeM68040VUNKNOWNi486DX4*float*CONSOLE%s: #%d +no mediaA2560 U+C256 FMXF256 JReF256 K2cF256 K2eM680EC30M68EC020M68EC040ReservedWDC65816rtc_init*:<>|"?FAT32 Sector: +not foundCartridgeFЂfJ.gh_hWhOhGhAAA@,@A2560 K40A2560 K60M68SEC000chan_openChannel: PSG Muted.bad handlei486DX2 50i486DX2 60fchan_readfile lockedCPU %s +Model %s +A2560X - LBA2560X - PBGenX32 - LBGenX32 - PBchan_free: MIPS_RS3_LESPARC32PLUSfsys_mkfs: MSDOS5.0bad argumentExternal SDCInternal SDCprint(%d,..)fchan_read_b access deniedgeneral errorinvalid drivemedia changednot supportedout of boundsout of memoryunknown errorproc_exit: %dA2560X - CUBEGenX32 - CUBEchan_read: %s&ERQQ~QERQER@ file not foundinvalid objectout of handlesMemory %d KB +proc_set_shellchan_alloc(%d)chan_close(%d)chan_alloc: %dloader found: bad binary filenot enough coreproc_get_resultflush error: %dFATFS Error: %dfsys_setlabel: device not ready/sd0/fnxboot.pgx/sd0/fnxboot.pgz/sd1/fnxboot.pgx/sd1/fnxboot.pgzBooting from %s +Clock %lu MHz +0123456789ABCDEFcdev_init_systemcdev_register %sbad device numberinvalid path nameprohibited accessunknown file typeF%d-%s +proc_exec stack: proc_exec start: q_M;)߁+.,;=[]/*:<>|\"?vlCODEC initialized.Console installed.Interrupts enabledTimers initializedTop of memory: %lxbad channel numberCommand not found.Mounting drive #%dfsys_mkdir error: directory not foundfile system timeoutoperation timed outtoo many open fileschan_read(%d,%p,%d)chan_seek error: %dFile system error: fchan_write error: fsys_delete error: fsys_load_ext ext: fsys_open error: %d> + NO NAME FAT NO NAME FAT32 low level disk errorno file system foundchan_get_records 1: chan_get_records 2: chan_write error: %dchan_write(%d,%p,%x)fsys_set_cwd error: SDC driver installed.Foenix Retro Systems +chan_status error: %dCould not load file: Could not open file: uart_open: Bad parityIndicators initializedInterrupts initializedfile is not executableToolbox v%d.%02d.%04d +Couldn't load file: %dchan_write_b error: %dvolume has no work areaFPGA %04X %04X.%04X +n Z#K+@-10"XopuxPGZ 24-bit count: %06lxPGZ 32-bit count: %08lxSetting default loader.uart_open: no BPS tokenFile system initialized.Text system initialized.drive is write protected +Select a boot source: + +Default boot source: %s +Error while printing: %dCouldn't get channel: %dReached end of PGZ file.fsys_open out of handlesCould not find screen %duart_open: Bad stop bitscould not write to devicedevice is write protectedCouldn't execute file: %dPGZ 24-bit address: %06lxPGZ 32-bit address: %08lxfsys_open out of channelsBlock device system ready.could not read from deviceBooting: /sd0/fnxboot.pgx +Booting: /sd0/fnxboot.pgz +Booting: /sd1/fnxboot.pgx +Booting: /sd1/fnxboot.pgz +Returning a bad extension.uart_open: no parity tokent(rv*'*6:[\Channel device system ready.FAILED: Console installationfile system assertion failedproc_exit: Attempting rebootuart_open: no stop bit tokenfile system invalid parameterCould not mount device %d: %dfsys_mount called f_mount: %dInitializing the text system...FOENIX DEBUG OUTPUT------------creation of file system aborteddevice could not be initializedNo bootable device is present. +PGZ 24-bit start address: %06lxPGZ 32-bit start address: %08lxuart_open: Bad data word lengthuart_open: no data length tokenScanning for bootable devices... +FAILED: SDC driver installation %dFAILED: file system initializationtxt_get_device: number mismatch %duuuuuvu`uJu4uA valid boot record was not found. + AAA 22222 55555 6 00000 X XA A 2 5 6 0 0 X X A A 2 5 6 6 0 0 X X A A 22222 55555 66666 00000 X XAAAAA 22222 55555 66666 0 0 X l0_0S0G0;0/0 #0@0 0000000 0@00x1R1F1:1.1"1 1@ +10 PC: %08X Address: %08X +Press SPACE for default. +Could not load /sd0/fnxboot.pgx: %d +Could not load /sd0/fnxboot.pgz: %d +Could not load /sd1/fnxboot.pgx: %d +Could not load /sd1/fnxboot.pgz: %d + _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / / / __/ //___ \/ __ \ / / / / / /___ / __/____/ / /_/ / / /_/ / \____//____/_____/\____/ \____/ PC: %08X proc_exit: Attempting to call into shell      _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / __ / / __/ //___ \/ __ \ / / / /_/ /_/ /___ / __/____/ / /_/ / / /_/ /_ __/\____//____/_____/\____/ \____/ /_/ Unable to mount drive %s, FatFS Error: %d ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / //_/ / /| | __/ //___ \/ __ \/ / / / / ,< / ___ |/ __/____/ / /_/ / /_/ / / /| | /_/ |_/____/_____/\____/\____/ /_/ |_| e9e;e<e=e>e?e@e;e=e?e ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / / /| | __/ //___ \/ __ \/ / / / / / / / / ___ |/ __/____/ / /_/ / /_/ / / /_/ / /_/ |_/____/_____/\____/\____/ \____/ Address Error Bus Error Division by Zero Error Illegal Instruction Error Oh dear, something has gone wrong... Overflow Exception Privilege Exception Range Check Exception Spurious Interrupt Unknown Exception Ŀ + Foenix Toolbox v%d.%02d.%04d starting up... ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / __ / /| | __/ //___ \/ __ \/ / / / / / / /_/ /_ / ___ |/ __/____/ / /_/ / /_/ / / /_/ /_ __//_/ |_/____/_____/\____/\____/ \____/ /_/ +EXbcdefosquxn _________ ___________ ________ ____ __ / ____/__ \ / ____/ ___/ / ____/ |/ / |/ / / / __/ //___ \/ __ \ / /_ / /|_/ /| / / /___ / __/____/ / /_/ / / __/ / / / // | \____//____/_____/\____/ /_/ /_/ /_//_/|_| q_M;)߂ ̂ +[!] Incompatible CPU arch: expected %s, but found %s + v!d#R*@-.<>@[]{|} GGGGGG EEEEEEE NN NN XX XXX 3333333 2222222 GG EE NNN NN XX XXX 33 22 GG GGGG EEEEE NN NN NN XXX 33333 22222 GG GG EE NN NNN XXX XX 33 22 GGGGGG EEEEEEE NN NN XXX XX 3333333 2222222 ,sl` e^%SKH=2'@;cABC DGJJbKcPdH`meiA;=?hj,* .!-" 0#/ +$ 2%1 &:4'3 (c6\5k9[aEAAEEEIIIOOUUYAIOUPDJ +}c,Z 0@QYR[T]V_`pN!2!p!!!$0,/`,g,u,,d-&A (((( AAAAAABBBBBB #%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%")"a"e"d" #!#H""" %ax029J.yMC= (": e,;;=f,?@AAF +S@UXZ\]^_abdefgjb,lmnpqstvwxyz{|d,~DE{ +0 P`"6Da&`l@N# +bz@c`[WOؓhG'${jJ۝uW~:g5^-Q'E1ڨˆyk\Q?I9?05(~#swVlN^EP;6*ԁO)шwWހM&Լd`ˀM&{ky\i@MrrAB++$% +~ +oS ծe̜JËB|8h/Ui3uW93+$wvX;5-%O(oM&|lQeCp"WQJC 6cnHUyALm7@].4N#'>uuuaaaBBB!!!žx}`znTdZEOG782&1234567890-= qwertyuiop[] asdfghjkl;'`\zxcvbnm,./* -5+/ !@#$%^&*()_+ QWERTYUIOP{} +ASDFGHJKL:"~|ZXCVBNM<>? -5+/ 123457890=   + + ;"`\ ,. -5+/ !@#$%^&*()_+   + + ;"`\ ,. -5+/ 1234567890-= QWERTYUIOP[] ASDFGHJKL;'`\ZXCVBNM,./ 789-456+1230./ !@#$%^&*()_+ qwertyuiop{} +asdfghjkl:"zxcvbnm<>? 789-456+1230./ 12356~`|\-= qwertyuiop[] asdfghjkl;'zxcvbnm,./* -5+/ ;Kc{;Kc{;Kc{;Kc{;Kc{dIdIdIdIdIdIdIdIddIdIdIdIdIdIdIdIddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd~~~~l|88||888T|8|8|<<$BB$۽?0($$( <$<$$T((T 08<80  < 8||8HHHHHH>JJ: + + + $$8~~8||88TT8 @@ @@|$BB$8||8(((((|(|((P(8DDD8(8DDD8 8DDD8(HHH4 HHH4(DDL48(8DDDD8(DDDD88TPT8$ x "|DD(||8D@D8$ p 8DDD8HHHHp4X|(D(|8DD|DD88DDD((l< DDD8ll$JR"\@<@8@<8DDDDDD|||||  8 8 `| T T(P 8$$$8 <<<<< +  !kkkk::kkkkkkkkkkkkkkk>k"Tk"kNkkkk k:k +/Ok +Nk"nk"nk? )k"k)"q|k)"(k kkkc8k k +k k%'kikH"8hk +kk)!8kH"8hkH"Iqhkik + kki-k"*"["Q +H :Hkwwk:k)k)kl>n>k i +k +">k +">k +kH"|lhk.0kkk  k"U"])k +wk:00k'' ɀ k:k 8k )"Ukk )"Ukk ) "Ukk )"Ukk )"Ukk )"Ukk )"Ukk )"Ukk )"Ukk )"Ukk )D"Ukk )"Ukk  8 k [𫫘 H (+k [𫫯n>l>+kO"jk [ h )X+k [ h )x+k)kk8[dH"f>Z"X: czkZ"?X:czk)8kZ$"`7ezkZ"j:zk8PI"Ukk"zk"x0Hzzkk [𫫩">j>+kZZ  "UH"]hzzk:   / k +   "~kHHFf ee&hk2468k/ JJJJ /  kZ8PIzk"[k + + +H +H"Vhhj>"Yz +zk [𫫘"+k)  +  k"W   k"W  J kZ) :8zk"W  k:% +   k   "Wd"Wk *,kZ  HH )H )"hhhh"_zk88(PI + +YHYk= = + +====kk "j"jk:     )  k">">kZ   yy I /yy zk# k +  +"ԋ + + + + "ԋ z z +zk">"Yy  )   k"W  J:kkdHHJee&hzk)8PI&"`EekZ  )  zk!ɀ8 +ek [𫫘8l>l>n>n>n>l>+kZZ JJJJ JzzkZZ;"U  zzkZ   +)HHHHH )";i +"_zkZ   +)HHHHH )">;i +"_zk [𫫩z"tY:z"̃+k + +8PI"z +zk + +8PI"=z +zk + +8PI"$z +zkHZ H $  + +()h  zhhhk + +"b{z +zk   ):kH +&H) +H)*EJ&h)jh)jhkZ"W"    zk>""<8d>kk + +8PI "Oz +zkZ  N )8 +"tZ J ) "tZzk"tZ*"tZ#"tZ,"tZ"tZ"tZE"tZ"dkZ  8     գI)8zkp"Y !  k + [𫫘 +n">f> +h>+z +zkZZc( +"6 +"`8 + + + +zzkH)ɀ))ɀ)zh @zzkhk +"r"NPHP +Nh"Vz +zk +   +  ) zz z +zk [𫫩 އ    +kZ  ) + + +5 e) + + +e"3lzk +ZZ +; +"e zzz +zk +Z"W + +!"pH"Fdh  zz +zk +Z +d"W ' ; +"zz +zk:0 +H`&{k + +;iHH +>>" +{hhz +zk + +) +H"]h H"]hz +zkH"]hZ  )Ȉ +I  )/) +IzkH + )+' + ) + + h((kZ  i  " H"8hzzk +  + )"~X: zz z +zk +i +)")  z +zk +  + H +"j zz z +zk + [𫫘ZZ +)  H"8hzz+z +zk +ZZZ +: +  ݦzzzz +zkZ8PI0zk + + +5 e"j"9gZ"W18 PI"e  zzk [𫫘ZZ"sU"zU ` )%zz+k +) +H"]h +ک H"]h +H"]hz +zk + Z +:Ȉ + ަzzz z +zk + [𫫘"r":< H< +:h"V+z +zkq$Uȗȗȗȗ:ȗ  k + [𫫘 + +"   +"M:"W+z +zk +  "` % + + + + + % zz z +zk;8J  ;"Fj;";";iJk"T"";r><""uV\y [𫫘Z & )4"`}$e"wg & z+kZ  PP UU PP U* PP UU zk + [𫫘"r +  + +"V+z +zk + [𫫘"r# +"V+z +zk + [𫫘"r& H +h"V+z +zk + [𫫘"r&>@ H@ +>h"V+z +zk + [𫫘"r&BD  D +B"V+z +zkZ8PI08$"`7!7$"`ezk + [𫫘"r$ H +h"V+z +zkZZ"W4   ))   7 zzkZ    =) + + +?5   # +  ) + + + 5  "9gzk +   + )"YH)"Yh8 ) Պzz z +zk +Z )"wW  w"wW  zz +zk]>2>D>>+>G>>>.>>>> > >(}`>b>k [𫫘Z""} "b{"Wz+kZ8PI9V"`OeH">hzk +  "r&JL HL +Jh"Vzz z +zkZ     J  jj) ec  :  ȈǣzkZZ   JJJJ ))#) 8PI0 8PI0 +"`czzk=~7 =Z $UȗȗȗȗkZZ:2      zzzk + [𫫘"r* HHH +h"Vhh+z +zk + [𫫘"r*68H H8 +6h"Vh+z +zkZZ8PI0zzk8PI0Ӣ"\mZ  PP  PP    :zkZZ  "a7  ;iH;i"@hh +"Wzzk + [𫫘"r( H +h"V+z +zk + [𫫘"r(&(  ( +&"V+z +zk + [𫫘"r(*,  , +*"V+z +zk +Z"r  +"VH| ">hzz +zk + ["h4"n"n"i +" +PI0+z +zkH) H +)87IJj(hk( +*(zzk + [𫫘 + +" +";hh"W+z +zk + [𫫘"r*24 H H4 +2h"Vh+z +zk +ZZ`>b>b> +`>"V=:"AUzzz +zk + += +="V:Ӌ [𫫘ZZZ"sU"zU'  l    l zzz+k [𫫘ZZZ"sU"zU'  `    ` zzz+kZ"aC  )zk:,:#2468246 8kZZZ  .o20o4""`c @ ` 0."Ŭzzzk +;8 +;""tHH +;i" [hh;iz +zk;8T>8PI0:HHHb;i "|hhh;i">;iTk;8 +#JJJJ  #   ;i"̀;i +k +;8 +;"lHH +;i" [hh;iz +zk +ZZ8PI6""`;e + +"Vzzz +zk +;8 +;"l;iH +;i" [hh;iz +zk +"}d> + > +K>"#Z2>"#Z>"#Zz +zk"U +;8  i "Da  i "Da;i k;8T>8PI0>HHHH2;i "| hhhh;i">;iTk + ZZ + +  "  w d>zzzz z +zkZ8PI0zk""`;;""`e [𫫘ZZZ"sU"zU.' l I%   l zzz+k + [𫫘Z + +" +"Z"b{"Wz+z +zk + [𫫘Z + +" +"1"b{"Wz+z +zk + Z  +  "W +  ::zzz z +zk + + ?  2)(d"hhz +zk +Z +H+"h +"YH +HH"8hhhک ">hzz +zk + Z + + +"Y e  + ) zzz z +zk  +  [𫫘"r .. 0 "0 +. "V+zz z +zk +  [𫫘"r .R T "T +R "V+zz z +zk +ZZ +"U"`: "U"^:zzz +zk +ZZZ + +"n/;i +"e zzzz +zk +;8J +;"Fj)  ;";";iJz +zkZ    N#) + + +5 e  !) + + +5 e ' "9gzk + + +"tY:<w + +eɀz +zkZ    P') "`e  %) "`e ' zkZRM&(H)h8PI0 "R'e zzk;8T>8PI0FZHZHHHHH;i"| ;i ;i">;iTk +ZZ + +"Z:<w + +eɀzzz +zk +  [𫫘"r 0" $ $H$ +" h"V+zz z +zk + ZZ    +   "W: +:оzzzz z +zk +Z +0B;H +i"@hhzz +zk + [𫫘ZZ8PI2""`;e +"Vzz+z +zkZi  8PI0  zzke  Z    NH5 ) + + +ehH5 ) + + +eh"9gzzk +ZZ +%;i +" zzz +zkd"V: +Z +"W  ; +" +"!: +"gzz +zkZ&"Yy   )  6HH"/hh    "~zkZV            I%  zkZ    PH) "`ehH) "`eh +zzk + [𫫘ZZ8PI6""`;e +"Vzz+z +zk +8ʆ8ʆ + +$2 +0 +d"\eHe +hz +zk [ Y )d Z )Ȉ +& [ )+k +ZZ8PIG6"`%:e% +"Vzzz +zkZ   0 P9  E a 0f  % A F  )i)i )80zk +ZZ +"aC;iH +"@hh "b{"Wzzz +zk;8 + /"b{"b{j>HH  "%]hh;i +k + Z "a + +< + "u "Y)"Wzzz z +zk P X Y Z [ ] ^ _ X \ X k +ZZ +8"> +"a/;H;i"\hh) +"Wzzz +zk + [𫫘Z"Y +)&"`Ee" +"c u$ z+z +zk + Z  +0 2  "I + "Czzz z +zk +ZZZ +8PI + ;iH"phhH:H"ohhzzzz +zk + ZZZ  +8PI0zzzzz z +zk "U +cH"]h8PI0/8PI0    .      "Rk + [𫫘 +HH"hh8PI+ +6"`%:e6"3l+z +zk +ZZ\ + +C7 +"}d0 +zzz +zk +ZZZ +8PI + ;iH"phh8HH"ohhzzzz +zk +ZZZ +8PI + ;iH"phhcHH"ohhzzzz +zk +ZZZ +8PI + ;iH"phh8HH"ohhzzzz +zk +ZZZ +8PI + ;iH"phhcHH"ohhzzzz +zk +ZZ"`P8,"[% + + + + + ) )JJJJI)8 zzz +zk + ;8R >8PI0B;i^H ;i"|hh;i> +>"V;iRzz z +zk +ZZZZ + + +"Ye) +     zzzzz +zk + ZZ  "0< "|[0* "PU%zzzz z +zkZZ8PI*8PI Ȉ :H:H"ohhzzk [𫫘;8R[Hک>;i "|hhh;i"j "b{"W;iR+k +Z +8 +PI0@ "`  4 + "`e"^e: zz +zk + [𫫘ZZZZ;i;":;$ +"Vzzzz+z +zk + ZZZ + 8PI c   zzzzz z +zk +"|i + Z + )"b{H H",hhh8PI  e ӊzzz z +zkZ  ) + +  ) + +   ) + +e) + +e  zzk + [𫫘ZZ8PII""`;e%HH +h"Vhzz+z +zk + ;8R >8PI0B;i^H ;i"|hh;i> +>"V;iRzz z +zk +ZZZ +   +;""8PI2 +'7) +"<zzzz +zk + ZZ  +i"> "a*;iH +"\hh +"Wzzzz z +zkZi:] +H`"WM"WD? ' 0 @ ! '   zk + Z!ɀJ=ɵ6% + + e 8 ֊i)zz z +zk + [𫫘ZZ8PIN""`;e*HH +h"Vhzz+z +zk + [𫫘ZZ8PIN""`;e*HH +h"Vhzz+z +zk +  +   +L       "3lȷ   "j i + zz z +zk + Z  + + ";@ +:)0 +i2 0 "G(hzzz z +zk;88PI0! ;i"̀;ik%ک8;ie  FfFfFfFfZ  )az8 ʆɀ8)zk [𫫘ZH">hj>f>h>:P">dh>f>"%]hh"f">"fz+k;8 +cJ iH + +he +  ;i +k:  ;8 +JJJJ))  ))  JJJJ)  )  ;i"̀;i +k + ZZ + 8PI0 +"zzzz z +zk8PIH ch  [𫫘;8RZ;i"|h ;i"hh"b{"W;iR+kZZZZ  88PI0zzzzko4""`86PI0 2ce @  `  +Z +"af +"j"WW% +eHeh"j"W+ eHe +h"j"Wzz +zk + ZZZZ  +8PI0zzzzzz z +zk "U"]H +c h  +ZZZ ++   zzzz +zk +cH"h + Z + + i  )     "    @' ) +"|i)zzz z +zkZZZi0  :  ;8"`%&e"'H_">h)H;iHo">hhh"Wzzzk +  [𫫘ZZZZ;i;":G0H   + h"Vzzzz+zz z +zk +ZZZZ + +i"Z  7i +"ZHhzzzzz +zk + Z  + ";7O +)  + $ + zzz z +zk + [𫫘ZZZZ +PP"hQ +G +="n +  "i +" +PI0zzzz+z +zk;8 8 PIx;i H"p;iH"v c c 8;i H"w d8".s;iH!"w;i;ik + Z  +H "Yh+ "Ye  zzz z +zk c)"YH +ch  +;8: +;i;i":O;i"++1  + +;i"H;i:z +zk +;8T +>8PI/"^H +HH;i "| hhhh&ڥ +HH5;i "|hhh;iH"hh;iTz +zk [𫫘ZZZ;H"WhhhhF&HH"hh1H ">hH +">hzzz+k + [𫫘;8 +;i;" >&("( +&"V H ">h ;i ++z +zk + [𫫘;8 +;i;" >*,", +*"V H">h ;i ++z +zk + +  +ȈFj +  +ȈFj +  +ȈFj +  z +zk + Z + 4  6 +g "O + i8 "h ;i ++z +zkZs8 PI0_ h i j l m n ` a b zzk + +eLh + ZZZZ  +8PIV "U"]   + 5 + +c  zzzzzz z +zk/):{):n): ): ): $): / k +)Ȉ +&)d + +Ȉ +&)d + +Ȉ +&)dz +zk + d>L~ f8ʆ +8ʊ +"z +zk + Z + + i e )8PIF cH"8h c   zzz z +zk;8 8PI0L;iH"phh;iH"vhh8PI +cc8  ;iH"whhd ".s;iH"whh;ik8HHH +**** * * * 8Hh hhhzzz****Jh;i(khhhhhzzzz(k + ZZ +.",  v 8PI0\    +)"YH +ch c  zzzz z +zk + Z  +  W  N  )<   !  "UJ    zzz z +zk + ZZZ + %;i +" S 4  +";i +"zzzzz z +zkd"V:L> + ZZ + )"V::   "V:S))e:"ua  zzzz z +zkZ?8PI@8PI0PG"8 A":P8PI0"PG"c A"zk +  [𫫘;8 +;i;" K.0/H  0 +. h"V H">h ;i ++zz z +zk +  [𫫘;8 +;i;" N243HH  4 +2 h"Vh H">h ;i ++zz z +zkZ"8PI0T8PI0zk$"`77$"`e6"`%:%:6"`eLȹ;86 b fW!%\#%+-/1K')35;":#;";i6k + ZZZ +##"U"Wʆ""Wʆ" 8PI00c +7cWc  +    +"UЁzzz\;8 / ;i";i"H;i"Yh;ik;ic   A +Z  )"YH;ich  + ZZ   +  +"!:Lt  ; +"% [  +"%; +"; +"#  zzzz z +zk/)$*,"RLR+&*,"Rc@+&*,"R3@+&*,"Rk;8 +      ;i +k"h) +_vH) +hT#:.#:  )"xJJ   Lq +;8 cJ + +cic + +   Ȁ ;iz +zk:LP;8"         e 8U\Y5!;"i:"  ;"i;i"k + Z + V + 0 E X + x $ȷ )":  E% 0 6 X + x ! 8PI08PI0 zzz z +zk +Z8PI0L|£$"`7e +r +8PI/ +6"`%:eEd "b{y "b{zz +zk + Z   +     L[à)LN  w   +) e    @ Z   a "z   +"=  H"8hzz z +zk + Zi + +) +eHeh) 8g +ȗ +i8 8ʠȗ +Hȷ +h"Fz\h + Z  +"a + + +c i +c + + +c i +  c   +' ȷ ϥ +ȗȗȗȗ ȗ +ȗzzz z +zk;8  + ;"U Lţ + + + + + 4  +   +  + + +   ;i +;i";ik         +      y "p_8 PI0(z"3W>["/hh"~k +Z A"SPG""PG"c A"?"jSń'7"j"PG"8 A":zk +  [𫫘;8 + +H +HHH ">hhhh;i;i"J  . +H  + h"VH ">h;i ++zz z +zk +ZZ +)L64 +i8"nbhL  84(H6*h "H  ;4 wH6"wh +i8"nbhzzz +zk;8;"8 +) + + + + +ʪʠ Ȉ +& ʠȈ +& ʆFj;ik;8 c  g       )   ;ik ҋ [𫫘8PI0LL̘""`;e + +  +kZ J L9ͯ*ʆ&ʆ"",ʆ(ʆ"$  s  i) +ʆ&ʆ") +ʆ(ʆ""8$8 "$ zk + ZZZ + ; +"eLΥ  +"Ht +"Eb A  +"H +"R zzzzz z +zkIIڅd*8&zzkHCh"$H"$Ik$8$8 + +ddd d & +&&8& & zz +z zkEH"vz8kk;8  Lϯ PH P h 8PI0j ) + +     '  ) + +e  %  ) + +e  4e  e  LC;izkZZZZX + + + + +c  :LУ +H`HH{> "hhnHH{: "hhRHH{* "hh6HH{6 "hhHH{2 "hhH "Iqh)""kzzzzk +;8 +   + +  + "LѠ +ic  8<PI0S;iH +i "@hh  ;i +z +zk;8Vq& lU R̃1Z!#%@^79H\;=\')\z+-\/1Z35Ŭ?A#WCEzGIgKM~OQ^SU;"6;iVk;8 +;H"wd""EHHH"O;i dd"d"." 8PI0"""ohh;i +kHH "hhdd "d "k  ZZH}"h0V8PII$"`77$"`e$"`7ew8PI0Y$"`7J$"`77$"`e$"`7ezzk + ZZZ  +   , .7  . , "H t +  "#I      "Rzzzzz z +zk + ;8 +  + +":L֥ + " 46 +i8"j +i8 +6H c "nbh c  + ;i +zz z +zk;8JLׯ L    JJJJ ) )))) ) +_vH) +h T#:.# :   )"x JJ   L;ik + ZZZ  +  "HLة +  "#j    ) " "RLף zzzzz z +zkZZZ: +8PI0.80PI0/"UPI0 +80L٩$8PILي80PI09"UPI080^8aPI0V"UPI0i28API06"UPI0izzzk +  [𫫘;8 + +H +HHHr"hhhh;i;i"q HH">hh . +H   + h"VH1 ">h;i ++zz z +zk +;8  y + 8PILۣ"` 8PI0Lۣ8 :8PI0m + "̀8 PI02 c + +kPiP "̀ +H "4h  H "4h H "4h:L+;i z +zk +  [𫫘ZZZ""b{8PI0Lܣ6"`%:eLܣ" n ` + E H  + +h"oc"V  zzz+zz z +zk [𫫘Z8PI0 +z+zke  ie  ie  ie  ie  ie  ie  L;8@;i ;i":Lޣ ;i "+_7  ;/+)  "bH h 7  + +  :  ;i@k + ;8 +  +  "V"j ) + "f;i +zz z +zk: + + +c + + +c i +cH"Vchȗ + + +c : + + +c i +cH"Vchȗ LC + ZZZZ    L!) + +)o1 Ho3 h8PIL5 ) + + +e  ) + + +?5   # + + + + +  # + + +  ) + + + 5  "9g4e + e   L^zzzzz z +zk + ZZZZ)* +  ϧ) L<)*  ϧ) +!   +zzzzzz z +zk + ;8$8PI0LW8PI0LW$"`7e +$"`7e    +i;i "3l i +i "3l;i i "3l;i$zz z +zk + [𫫘;8;i# + & L~;i4"`}$e"; "WL   8PIL;ic +i c   +i c);i+z +zk + [𫫘;8;i# + & L;i4"`}$e"C "WL   8PIL;ic +i c   +i c);i+z +zk + [𫫘;8 + +"8PI & L & L)B;i"L]h;i4"`}$e"I* +4"`}$e"IH">h"W & ;i+z +zkL +  [𫫘;8! +PP +  "hL +L#eHe +h + L8#PIcHcheHe +h + "n  +  "i " PI0Ln;i+zz z +zkH + )&" + ) + )0 8 + +hk ڥH + )2. + )! +8  +ж0 8 +𚰥hkH88HdR8W)) +*)(j)J(j zzkJjfȀ( +  [𫫘ZZZ"r LUF H LU)"YLU;iH"phhH"ohhLU;iH"phhHJJJI)8 + + +H"ohht;iH"phh8PI=H:H"ohh HH F  +h"VH:H"ohhHH +F h"Vzzz+zz z +zkZZZZP8<8;H"w "wh>H>H"wh>H>H"wh>>"H"wh>H>hZJJJJH_"wh;i>H>H>H +"wh>H>H>H +"wh ;i H"w"o;izzzzk@"If"dH̢:dFfc c  e + * &ؘ8ce~hhhhhh/FffF8&/y$0&&ddZddQH)hF8&H)h)H)h) +J Jȥ +Z먊JjzkZZZZL  +"LL)#cL~ +eH`8`f8P\cR8H80>8 48*8)88 +e  +eLzzzzk + ;8 +  + +i"Z:L 奔'): "`  1@')" ɀL + e j +E)e"Z; ɀ9    +e';i +zz z +zk  Lj +;8;i H"phh;iH"vhhLQLh c ;iH"w H"f;iH"w;i +Lh c  ;iH"w H"f;iH"w;i +L c c8  ;iH"w H"f;iH"w;i +;iz +zk + ;8 + +:  8PI0Lh;iH;i "\hh ] ) E      +E L  +;izz z +zk +;8 + +"$LL  : + +;i e / + + +;i e"$;iz +zk +iH + + + +he"NH + +;i ehL + [𫫘;8 + +      JJ +              #   "sd"` "se "s"s# "s0   "s"s +;i ++z z +zk +;8 + + + L;i;i"Ls  +"+LS+ 0G7)+ "b + ,  +"H  ;i +z +zkZ"tY:"̃L"bL):L))  )  <)H"  hL )H"  hL@)H"  hL)H"  hm?)H"  hC)H"  h')H"  h "bLzk"If"kI"If"k"dHhڥ +E\%8~FfjJ8 +Fl$ zzzku +**Ji +Jȣ +fjhhzkFeeJjj8j +ЧгH +JhȈkЗF@ + ZZ  L}7 L}  L    Lr  Lx  Lx"Xȷ   + + "!  L +e8  +Ш    5  ȷ +  +ȗ  :"Xzzzz z +zk + ;8   +       +i"Da ): "`)  +e +E)e"Da    L + e : +  @    ;i zz z +zk + ZZZZ + :8PI0L+ +"L-8PI0L ) c q +W = c  c ] c ] c J8PI": c L zzzzzz z +zk +ZZZZ +  LU;i"i"U - "U +  "U  "U   +"U"7 - N"d>D +.8"d>    +%  "V  "Vzzzzz +zk +@ +ZhhJjhzkک"If"dHҘ8i0 +*$ &$8 &ccd&8&&&8j$Ff19Ffj  +,&JȀJ dd +ZhhhhJjzzkN6 > + ;8  + +i"Z:L+?'): "`  4@')$  +e:L+L+ +E)e"Z ] ɀQ   "  +e"  , + ;izz z +zk  Ld;8:- (U UUj!M#%|i')/1,U35 +Z+-79;i":L (U UUj!M#%|i')/1,U35 +Z+-79;i""hhh;i:k +;8;i H"phh;iH"vhhLL  H"fhL  ;iH"w H"f c  ;i H"w H"f;iH"w;iL  c c8  ;iH"w H"f c  8:;i H"w H"f;iH"w;i;iz +zk + ZZZZ<Lg87g0f +g +  ȷ   ȷ g7 +80] +" Vȷ" Vȷg7H h"Fzzzzzz z +zkZZZy "`ec  v)"Y "_\@"_O1 Oyy y  "p_"_ "_  L+ ~ + ~     ~   a  . ywz"Z:"zy)))"[zzzk + ;8  + "i 7)L'7)$ + Ȉ +& +8 PI0     "I)_ +  + ":i:У    "I "g;i zz z +zk +ZZ + +"L   Ls   Ls  +i8"j +i6U"Da +i8RRaA" +irrAa" +i " +i$"&$4664 +i8"nbh  H"^hzzz +zk + ;8 <L +c)   "a + + +ci +e + + ȷ + +L + +ȷȷ8 Y +g  +c    7 H  h"F +i;i zz z +zk + [𫫘ZZZ +8 +PI0L+  "`  Lp  "`  8PI0L7 8PI` +c   A)"YH "`ech  "`ezzz+z +zk "`ec Lx L1  + ZZZZ  + L L & +"!wL "_ L E L %L  +"!wp8ʆ'   L zzzzzz z +zk +  [𫫘ZZZ + +"8PI% u$ LN u$ c ">L<" L H">h  +&"`Ee"  WH">h u$ "c"W!0 "> u$ zzz+zz z +zkL( +ZZZ +  ) +zzzz +zkn)"Y   L   L ڃ  L ك  L   L   L Ã  L   L ă  y ۃ  g Ń  U ƒ  CH"4h [ [H"4h     H"4h  Ls + ZZZ  +   ;iH;i +H "hhhh8PI0!HH "xhhzzzzz z +zk + +e8PI0%8PI08  LC8ZPI0a8PI08R  LC8(PI0/8PI0 8(  [8dPI0k8PI0 8\  3 +   # # L* + ZZ    L PHP))"`8PIL) "`e  ) "`e  ) "`e   ') "`e ' %) "`e  : + + e H + + e hLzzz z +zk + ZZZ   ɀ L0  L0)8 + +OO  )"X: ["[6)8 + +O +O))"[x;"[ JJJ ))"f  (#)JJJJI)8i0"[#)i0"[ )"[~"[!  "[zzzzz z +zk +  [𫫘;8 +;i-  +"8PI & L & L;i)HH +HH;i  4"`}$e"َhhhh"WL     8PIL;ic i c  i c);i+zz z +zkL + "W + +L ) )  )       `  "FUi "FU PI01   "FUi "FU PI0驇!  "FUi "FU PI0  "FUi "FU PI0   "FUi "FU PI0   zz z +zk + ;8    "i7)L47)%  Ȉ +& ? "I)   ":L& 7)ʆ "I "I)^ +  + ":i:Щ ": "g;izz z +zk + ;8 +   +C #  7"I    L     " "g ":L@   +                  ; "% ;i  " +  ;i  ":  )ӣ ;i +zz z +zkZ  ) "`e) "`e  ) "`e) "`e  ) "`e) "`e  ) "`eH) "`eh) "`e +H) "`eh +) "`H) "`h  zzk + ;8   :LV +H`;i HL"gDhh ;i H]"gDhhLVLY;i H*"gDhh ;i H;"gDhhLVLYyHw + +"c: + LYLVuHs + +"c: + oj"XEH + +"c: + oooq;izz z +zk + ;8 +;i +"eL!@7)L! K +i&   "nbhL! 7 "  "#L $"      +"} i " i" i"Da   "< 7 ;izz z +zk + ;8 + +L"7 +"}dd>   >> + >> + > > +  L">eL" +L" ȷ   ȷ ȗ"#Z d>  7)" +"(  L! d>;izz z +zk + ;8  + + d>L$7 d>L|$& "! d>L|$ +"Lx$   Lq$ 8 8 ȷ  ?ȗ + +"< b L#       :   L#8    ;izz z +zk +ZZZ +  46 +"#:Lg& +i6"Z8  LX&U+ +i"tt:Lg& +iC"Z E :#:LX&LX&LX&  LX&)):%:LX& +iF"Z:LX&H):r +iI"Z:Z +iK"Zɀ$ +iX"NiN +"Z:Uzzzz +zk;8 +*, &( J :<DOFH>O@BL'""H"Zh{B"Hd"@^hd"1HH"Zhh J "R ;i"\z "~d"Ŭ;i +k9 + +eH + +eh + +9 + +9 + +eH@ + +eh + +9 + +@L& + ;8 + # :';i"KL* : Ч) + L* +   ? _ * M;i"K ;i "K  L* L)L*   ?   ?  * :H  "G(h4  ) ;i"K L(;izz z +zk"_">""V}">"Y    ""[w ">"XH">;i +"j^Q +">"Xh +">"ju=">"\"%ew">"">"~J ">"\"b{">"">",Y">":H">h ">"7K:"b{ ">k + ZZZ  +  / : \ (   + : / L- \ L- +  & + "HLn-;i "n "}+ 8* L- +  7 )zzzzz z +zk +i8H7 he +"b + L,Lf, + [𫫘;8 + +d"[ H d"`h8 "f  "f  "f  "f  "f  "f  +"f  :0 :        "f  +"f                   :     #   ;i ++z +zk [𫫘ZZ"sU"zU:L0Lv0 L1$"YRF:#.'"+/ +3L]1L1H"Y7R;F?:C.G"KO +SwL1l"YWR[F_:c.g"ko +s  zz+k +;8r +;i;i"Ls3? A;i?"+ +j Lj3i  EJL2][ "b +EL2  + x  +;i "HD;i "Eb  h;i?", +&;i? +"|  "<;irz +zk + ;8 8PILk58PI0-;iH"whhh;izz z +zk c  "i:L4;iH"whhh8PI0L$H8"whh$$ H"whhh&;ic )"*X:&;ic  $;ic . "i:"wh)H"whhL3;ic L3 + ;8  +7)L7L^7Lq7  Lq7 + "I)L\7; +":L\7 ***)  v ) +)Ȉ +&e?# )ʪeHeh +Ȉ +&  LY7## **) e# +e  + ***) ) ) + +e#) + +)eH)8 hȈ +&   +": +"g;izz z +zk + ;8"U  +  LB9;"EV"i"U - "U +  "U  "U"U  ;"EV"d>L49"DWʆ" "DWʆ" +;i )":y  +]  + 8PI0E +"LWʆ"\eHeh"U"U +Lc8"d> - II +    5  "U  +"U"U  +;izz z +zk + ZZZZ +;i +"eL;)L;7)L; L;: + +"|  +L: +"_  % E  > & + "|   @ j [ +i&   "nbh  7    +zzzzzz z +zk + ;8F +TR ;i;"L= +L=;i"HL<;i"Eb L< C1/c)   +c    +e : +e ţ   L= L=&$"#_      'd Ci8c"N  ;iFzz z +zk + ;8  +8 +PIL?  L? [ L?):8PIL? +):e  "`   "L?"`  M"`e + +;i "VL?L> +c  )"X:I +;ie +"`)80eH +;i eh ; L=> ";izz z +zk +;ieL= +;8  +:LB +H`;iH]"gDhh0? "wh"p>]"hhhکI"whhZ;iHL"gDhh0= "wh"p>L"hhhک$"whhL&B;iH;"gDhh0? "wh"p>;"hhhک"whhZ;iH*"gDhh0= "wh"p>*"hhhک"whhL&B"6hHn"whhh +J >  1)'"p>d"hhL"wh"wh;i z +zk + ;8 + + "3lLB:d&#eHehJ)  II! #i0  JJJJ9  c      :;ic    А;ic ~ S +c : +c"V::    '   ;ic)  +c  ;iz z +zk +  [𫫘;8, +;i;  +"8PILE;i +"[LE     8PIL;i-c i c  i c)LF"WLF;i "f + +}Z{Z;i "k;i ;i"f;i"k;i  +"q:(;i +"q: LD      + +}Z{Z i "f;i,+zz z +zk +;8    "}  ) ɗLG  + 8 +PILH +A%k ">ɗ + ">uɗ +" h0;"V"h +"b{% +"b{;iz +zk "`  LH   "`e"^e:f "`e "`e"} + +   +L3G + ;8   +  LK )LK   +  "  .,Z ȈFjdL"K, .  LJ + Ȉ +&   g "_%L"K3#8 H h  L"K +"       _ ȈFj eH eh  +i8H%he  ;i zz z +zkZZ"f8PILM8PILqM8PIL$M8 +PILLȩ" p" +P" ;i 0U4UAC;!#)+%'@-/v13 =?z57XZ9;"zzk "`   "`e8PILK "`ec "l09H">h"?ڣHA">hhL~K u$ LfK & LTK +;8 ;i"U;i ;i":LO / 1;i/"+ +ZLOMK;i "3l;i/;ic4"3l ;ic"+: 7k9m?s AuLO;ic"mLO +;i +i "3l    7)     7)LOk7 m9LO +  "b  " X  "# iX1 . $  mk"}   : ;i/":  "<;iz +zk +;8  +";4;i{H" ;i s  LrRt E LrRu L LrRv F LrR= + +CHAHCHAH8;i"|hhhhLuRLuRLuR   ßLbR "`cHHc"; ;iH" ;i  LNR  +H`LuRLuRHH";HHHH" ;i û㽰8㷅Hc"j dcHch c d c    LQ;iz +zk +;8 + i  LT )LTN ȈFj dLTLT ȈFj  +:d%%LT +"_LT%LT LTLT +"FLTCLT#LT ":o "   i8H#he;iz +zk + ;8   LuW   +    + : ʣ : p 0 7 9 (    +)808PI + LuW / LnW / ߩ + + +}Z{Z  +  + + +  + + + +   +   a !z  8      a !z  8       + + +  LDV   / + 8PILV8PI + );izz z +zk +  [𫫘;8T +;ic 8PI0LY;i +"LY LY +;i?"f4;i?"k;i?H;iG;i"َhhhhLY;iU)|;i;iU";i"V:';iU;i?"f%;i?;i "CLX;i "wg""b{LY9;igHH;i ;iC "FhhI">6;igHH;i  + "Fhh;iT+zz z +zk;ic LW +;8V ;i;i":L\#% ;i#"+: +N L\;i"F + +E +% + " L \ +"L[ i8 "j .8  C iN "i8 +"}i8iX "3l .Y +-iX"}  ;i#"mrA?i "A? +"}A?    "<";i +"| ;iVz +zk +Z `   L]Jsuu +s"VJJoqq +o"Vkmm +k"Vgii +g"Vcee +c"V _aa +_"V@[]] +["VWYY +W"V ` a   L^g J0SU&g U +S"VCEE +C"V ?AA +?"V@;== +;"V799 +7"V a b   Lw_J355 +3"VJJ/11 +/"VJJ+-- ++"VJJ+-) +'"V b zz +zk + ;8  +  Lb  Lb    La  L`  Lb ȈFj +(cH*ch"#:  Lb +i8H + +)he"N%H%hLb +*(  ȈF j eHeh"#:  Lb +i8H +)he"ZLb Jc +*(H J)he"#:  Lb +i8#e) +*(H J)he"#: + Mi8#e)) ))JJJJ;iz z +zk + ;8 +  +         Ld +  "#Ld  + + Ld  ? 7   + Ld + . Ld#   Ld  L_d +@Z   # +    ,  .     +     M   2   ":):     P    "s  , . J    "R   Lb  ;i +zz z +zk + ZZZZ  + '"V  +   Lg   +"I  LTg +"I  Lf;i +"  Lf ɪ Lf@ +"I)e_ +:"I)A;i +"@    "V:LeL@g +"I          +"I)/ +"I)  "V: '  )     +"g )zzzzzz z +zk;i +":   LRe;8&!!064!c8o48!68o4:!c4:8!062c6o2 8 #66o2:c2: 8 #""`%""`8%""`!""`e8%  Ljw""`8%U%c  cԣc @ c ` #c!w""`8%U%c cԣc @ c ` #c;i&k%c%cc8#cc8# c  Li#c#c @  @  `  ` #c;8X;i ;i":Lm ;i "j Ll;i"Ͷ ""; LlS "[y   +X &;ic  ;ic LkLm Lm%:;ie :ף % '-/;i%"HLm;i%"EbY;iCA "3lCA    "<LmLmLm;i%"i CA"jCA  ;iCA "3l    "<;iXk + ;8  + +7 )Lp  +e:Lp i ;i  "3lJLn @+ dFH H;i i "3Bhh "}*dLpLp + L`nJJ  c "6 "Lp:Lp   H + + + + +h8"HL p i "s   +  "#[H   "h  "R  : ЂLp +  "#k   "j i   "3l+7 H  h  ;izz z +zkLm +;8*    " + +LsLs +HH "hhh 8 PI0L\s&("$8 PIF&(PIg +c;i c (&("$Ls"$L*s&(PIM$"Ȉ +&H +c)henC&($H$h +c  "$(&&("$Lq  + E ;Lrq +  +";i*z +zk;8b "[w"ro ;iH"w HH"x H"u;i"   HH"o"j  HH"ox"jH#H"o;iY"jHH"ox"j  HH"o;i(>"Y "jhhLu"jhhLu"jhhLu"jhhq"jhh\,"jhhG"jhh-"jhh:"jhh  HH"ohhx"jhhY   HH"o>H>H;i"| ;iH"j;i  R   HH"o>H';i"|;iH"j;i +   HH"ox"j HH"og"j;i + ;8 +  LDzLDz  Lx  LYx  L>zȈFj +(cH*ch"#L>z )  +i8H + +)he"N)  +i8H + +)he"  L>z +*( ȈF j eHeh"#L>z +i8H +)he "Da  L>zJc +*(HJ)he"#L>z +i8H#he ) +  ') + + + +     +*(HJ)he"#y +i8H#he)')# ) FjFjFjFj   ;izz z +zkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkH)hkH @hkڢkڢ"${k",{",{",{k"8{"8{"8{\,{"E{"z"z"|z"z"E{"E{"E{"^z "z"E{k8k"z"z"{k"{"z"${"${"${"z"zk"z"z"z"E{"z\{\z"{\{k, H"{hk"8{"z"${"z,"zN"${"${ڢ"z"${J"z"z"${"${"z"${"z"z"zk"z"z"z +"z i0"z"${"${"${8kڢ"z"z"zj"${"z"${"${"${"${, kx0"U{(k(kx0 @"{"{(kx0"{"z"z"z"z(kx0 "{"{(kx0"{"z(kx0_"z"{(kx0?"{"{(kx0"b|()k0(k(kx0, H"{h(kx0" +{"E{"{(k + ;8  + +"HL   ,.   "#L† L†? 7   L   L  L@+7)L @Z  #   ,.         U  :   ": ):          L|  !"s L
+7)0 +i  "tt:L  ,.     (  ,.    +"R    L~;i zz z +zk + [𫫘ZZZZ +&"@$  ))*(,. "@$L +AH`8LLPà|@j耠XaF N47"p"YLL^LSLL |jtXF}4~"LC9 + +P +P  + LD+ + 4 + " +  + V:@)w + 4 + " +  + zzzz+z +zk +;84;i!;"LQ><!##!8ʆ#!&#!LO#!  L\!%#' +;i%"_%  +LNE  +i + + + #!L L #!#!*(   +  I  #! "#   + L     #!  8#!i8c"Z: + +  + W#!i8c"N) + +c # : +     L  >#!#!  ;i4z +zk + ;8X  + "U"g +;i P";i ;iH;i "/hhL"V"% J?(4Q)G | "U"p;iH;i "/hhL"VʆZ"% ;iH;i "/hhL֋"VʆE +EL;iH;i "/ +hh +L +"^e: Lz +"^e: {( +"^e: P- +"^e: (%V +"^e:08 "UH"FdhL1; +">L1">q ">[">E]">/}"> ">;iXzz z +zk + ;8   R    + +_ "_ L!%L!  L! +  L!LY +LY +   "_ELR%LRh  "   + +  L! + L#  ii  '   L! + + +"_?E'%  + L! +LL! +  +"!w'! + "!we +   8ʆ    :     +=;izz z +zkZ8PI0LTHV"`hOOV"`eOV"`eOV"`e + + OV"`eOV"`eOV"`eOV"`eOV"`e OV"`e""$$OV"`e6688OV"`e::<<OV"`e&&((OV"`e**,,OV"`e..00OV"`e2244OV"`e>>@@OV"`eBBDDOV"`eFFHHOV"`eJJLLOV"`eNNPPOV"`eRRTTzzk + ;8 + &$;i +"e  L)  L7)L8 Hhd +  L77L  ȈFj +:d%%z + +"_  L%  L"  LcJ)L> +c +8H   " p J>x>x>     +>    +>   +>  +>x>x>" "p "bv;i    8PIL"C_"kYQ""EH H*H{J"Odd""."D"g4;iH"w ;i "wh 8x>PIL-8 PI0L< "wh8x>PIm +z>X +>"6hHH ;i3"|;i3"YH;i5H" ;i ;i-"|;i-"YH;i/H"hhh"i +" +PIO"bC"e +,8PI: +z>: +> + +;ie"?;i|z +zk +z> +>" + +;ie +>":L"9V +z> 8 +>"6hH "whhh +> + +;ie   L$ 0 $ JJ 4 L + ;8 + &$;i +"e  L1)  L17)L3c8  L77L? ȈFj +:%L(, + +"F +"F @ L3E  L3%  L3 + + W +i&  "nbh  L3 7 "  L3cJ)LŪ +c +8H   "nbh  L38Hhd?8 +) e +i&"3l 7  +) L Z D +i&  " +i "N +i$"N    ;izz z +zk +;8B57 1" + +LУ-/) + % '!#  1L +HH"hhh383PI0LЩ-/))++%'!!## 9? A;=%%83PI0?-/))++%'!!##9 ?A ;=Lɣ)+L4˥ +c% Z /    F +c% z d    !#  L8ЩLУḶ?AḶ! # ""% +c%))#H#hHH ">hh  L̥ +c%)#H#hHH ">hh  L̥ +c%)Ȉ +&#H#h  5 +c%)     LKϣ?ALΣ;=LΣ >8?HCh"% +c%))Hh92,75!#7H7H=">hhHHS ">hh LΥ +c%)Hh92,75!#7H7H">hhHH; ">hh LΥ +c%)Ȉ +&Hh 5#H#h +c%)    u8;H?hC  +c%     ! # L;cH?ch8        9 ?A ;=%+)!#!)#+!# 9? A;=%LʩJ ">1;iBz +zk + ;8   + ;i"Ͷ%L7إ)H + + e h   f/_\Xɀ"[L7أ L7أ   + +eLѣ    f / Lأ \ L            + : +e.I Lbӥ + : +e.Lbӥ + :: +e.Lbӣ +e , Hi eh L7؊  .i e   2 +: +e . :ʦ + +eL7ة  + +e Lأ % + +e. +     ' +: +e. :բ i  "j  )       + +e  LCף Lأ.  Lأ L֣ L֣ɀK  ";#:#)    } :.      Lأ   i c     L֣Lp֩"[{AZ     a'z  8        $_         i c     Lأ    4       LI      + +     # #  +     JJNJ              + ;iz z +zk  + +     '         Lԣ  LӣL + ;8   ;iO"Fj;i +    L7ܣ % ;iO" L9 + +      0 0 0     " O - %         "  * . +   %  n +   0 D9  9 +"`)e80      +%   . L    * 4 +     s   0 D9  9 +"`)e80      +     +   l d    l '            %;iO";izz z +zk)"YLݠi + + ;c)Lݣ0 +# :#%;iO""ԣ +)/:"  ;iO"ʣ%;iO "إ  + +L9LܩEL +7;iO" L9 # :Gi + + -+)'Lߩ# :L ߣ d EiGiʃLߣ d 7;ʃ + + -+)' d L-H;i;i'8  -+)' ;i;i;i +"  ;i;i;i +"  3 x  'c      #0cH;i1ch # # LB#:&##;i/c - ##:#%;iO""ԣ:;iO;i/c"ң%;iO "إ  + +L9iH +;i1"h;i/"Y +# :# +%;iO"" + +ԩ;i/c)6 +%;iO "إ J;iO;i/c";iO"  L( + ;88"UDF HJ "eU "^U  L % L "eU "^U    % L  +  +) '+@a  )"Y+"U6+"U'++"U "U )L+L 0 {9 p 80  #+-' + + +c)c"U+ )L) + + +c)c+"U L * L#+3 +  +)L + + 8  ' L . .#+;i8zz z +zk+"UL z  t  . "U+L l h   j +#"Ue l *#+ ++#"U3 h L7#+ ++#"U )'"eU "^U   +   +)'"$ &   L& p :#&"$ + & +)'ǩ & E G & & e 7g & ,"]V"U% L &  S L c L}: s L& d LX: i LX# &"]V"U L # # )   # "$ # &)"Y#  +"U L$""eU $""^U  V ;  # @ LHh HH"U" [hhL"U%# `  "U #   $;"iV ",H;i/h8  #    LK"U%H"QVh"V"U&)H"QVh"V"$ L# "]ViNʆ# (# +I)8ʆ# "8  +  #   % +;"iV ",H;i/h8  "$    #NJ + )8PI)  # @# #      # c):;i-e 0 #  %   @#     "#     # L# E) )8PI "#Vc      +    )8PI' "U H"QVh"V  ȣ     )8PI0  "#V # Q "U0H"QVh"V@# .  # xX"UH"QVh"V  [# N #  +  #  -  "U )H"QVh"V  )8PI#"U0H"QVh"V:    = : "U );i-e)H"QVh"V    L - ;"iV ]"]V"U   #  "]  # 1  "U H"QVh"V : ۣ    L  "U)H"QVh"V: :  "$ "U H"QVh"V:ݣ Lm    "U)H"QVh"V Lo @!#%')+-/7:=@CFILORUX[^a@@0 PiYG pbk@qnQFOp LE'''''''''######''# ##'# '# '# ##'## ##'''# #''''''''''######## ########'''''''''''##'# ''''''''######## ''''''''######## gcJ''##'; #''# '''# ### ### '''# '#                                                                      gcJ gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; ; #' #''' ### ### #''' #''''''''''######'## #' #' #'## #''## ##'''# #'''# '##'' ########''''''''gcJ; ########'''''''' #'##''''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #'''# #'''## ##''# ##'# '# '# ##'## ##'''# #''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''## ##'''# #''''# #'''## ##''# ##'# '# '# ##'######'''''''''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''######'''''''''1`Je > PH +: 2"RA n +O 6t^#|gk + ;8N +;i"U L: + + + + G  G"U  JL: +L: + +3 +CECEH;iEI"^hCE(CEEC:E%C% +CEH' 4   " ) 52$HJJJJJJh"6:  "8:77 +H"H"67979L:\ +Z +L:JLJ +L H;iLI"^hL:4??JL!?8JJLL +  + + +? A +? AJɀLL: +  + 4JJ4J   4JL:   "cJHcNh$&  +; ==;  L|LHLhZJ h  +$= +$d + '&LJ"(**(&& +  +i + i Hd +e + e +:H" + (*7(*+    +, .(*LpL:LNLJ ȈFj +  += +d + '&LJ" +  + .  +& + +i  <   +"\Fji  cH:H" + "Ȉ +&H"    +, .(*?cHCch.,5"\cHchc(Hc,h020cCH4cGh + +:EC:II%%80H4h  9cHch + cc + ,,..L5"F: + iiii +  +  + 5"c,Hc0h + ,. &&&& + 0c +H4ch + 8 +?HChJLL:8JHNhH209"\h8Hh8(H,h " +   - + !;=Ff   L} L:  L + r;=& &@ &  p4JJ   =; P;= &  +  0L: + 7;=+ &    ;=LPL:   + L:H +"j + "3l +i H"Da   +i"Da 5   +"  +i"DaJL +iJ"Da +i LJ"   +i?"Da +i"Da +iA?"  L  +iC&$" +i$.," +i," +i0"Da +i2"Da @ )B &  +iG"3lf +i'&$" +i,"Da $ )&   +i+"3l +iU"DaCA +I"nbhL:  LH CAi +I"nbhH +"j +RRaA" +irrAa" +i +:" +i" +iU"DaCAi +I"nbhCA +I"nbh7H"` +"j +  + 5L8  ( +* + +  + + + + + + 79 + + + 7 +9 + + + H +I"nbhL:cHch + 8Hh + L      ZJL   4          49JL H +;iI"ŘhL:HI"^hL:L:  H +" +i" +i"A   + + +  + + +  + +", +. + 79 + + + 7 +9 + + + H +I"nbh;iNzz z +zkH +"jcHch + 8Hh + L + L{ \ў\,Y\DY\X\Yy\~\/\k\y\\і\\Ф\\\=\ߪ\;\\\ \M\\p\\i\\>\(\\\ \h\\;n\o\a\\Yx\ە\T\\m\W\ \gD\X\a\\-\\b\^\\\n\p\bv\$o\o\p\v\w\x\\u\|l\\\ro\t\8\j\>[\f\e\\\|\X}\e}\w}\|\|\8}\}\*}\H}\}0HZ +  + [dH"\+z +zzz z +zzzzzzh@0HZ +  + [dH"T+z +zzz z +zzzzzzh@8[dH\mP \ No newline at end of file diff --git a/roms/f256k2/toolbox.csv b/roms/f256k2/toolbox.csv new file mode 100644 index 0000000..9f2c660 --- /dev/null +++ b/roms/f256k2/toolbox.csv @@ -0,0 +1,18 @@ +"20","toolbox-20.bin" +"21","toolbox-21.bin" +"22","toolbox-22.bin" +"23","toolbox-23.bin" +"24","toolbox-24.bin" +"25","toolbox-25.bin" +"26","toolbox-26.bin" +"27","toolbox-27.bin" +"28","toolbox-28.bin" +"29","toolbox-29.bin" +"2A","toolbox-2A.bin" +"2B","toolbox-2B.bin" +"2C","toolbox-2C.bin" +"2D","toolbox-2D.bin" +"2E","toolbox-2E.bin" +"2F","toolbox-2F.bin" +"30","toolbox-30.bin" +"3F","toolbox-3F.bin" diff --git a/src/C256/addresses.csv b/src/C256/addresses.csv index c58a38e..d2b60fb 100644 --- a/src/C256/addresses.csv +++ b/src/C256/addresses.csv @@ -6,8 +6,8 @@ "sys_int_enable","FFE014" "sys_int_register","FFE018" "sys_int_pending","FFE01C" -"sys_get_info","FFE020" -"sys_int_clear","FFE024" +"sys_int_clear","FFE020" +"sys_get_info","FFE024" "sys_chan_read_b","FFE028" "sys_chan_read","FFE02C" "sys_chan_readline","FFE030" @@ -40,35 +40,48 @@ "sys_fsys_mkdir","FFE09C" "sys_fsys_delete","FFE0A0" "sys_fsys_rename","FFE0A4" -"sys_fsys_set_cwd","FFE0A8" -"sys_fsys_get_cwd","FFE0AC" -"sys_fsys_load","FFE0B0" -"sys_fsys_register_loader","FFE0B4" -"sys_fsys_stat","FFE0B8" -"sys_mem_get_ramtop","FFE0BC" -"sys_mem_reserve","FFE0C0" -"sys_time_jiffies","FFE0C4" -"sys_rtc_set_time","FFE0C8" -"sys_rtc_get_time","FFE0CC" -"sys_kbd_scancode","FFE0D0" -"sys_err_message","FFE0D4" -"sys_kbd_layout","FFE0D8" -"sys_proc_run","FFE0DC" -"sys_txt_get_capabilities","FFE0E0" -"sys_txt_set_mode","FFE0E4" -"sys_txt_set_resolution","FFE0E8" -"sys_txt_setsizes","FFE0EC" -"sys_txt_set_xy","FFE0F0" -"sys_txt_get_xy","FFE0F4" -"sys_txt_get_region","FFE0F8" -"sys_txt_set_region","FFE0FC" -"sys_txt_set_color","FFE100" -"sys_txt_get_color","FFE104" -"sys_txt_set_cursor","FFE108" -"sys_txt_set_cursor_visible","FFE10C" -"sys_txt_set_font","FFE110" -"sys_txt_get_sizes","FFE114" -"sys_txt_set_border","FFE118" -"sys_txt_set_border_color","FFE11C" -"sys_txt_put","FFE120" -"sys_txt_print","FFE124" +"sys_fsys_load","FFE0A8" +"sys_fsys_register_loader","FFE0AC" +"sys_fsys_stat","FFE0B0" +"sys_mem_get_ramtop","FFE0B4" +"sys_mem_reserve","FFE0B8" +"sys_time_jiffies","FFE0BC" +"sys_rtc_set_time","FFE0C0" +"sys_rtc_get_time","FFE0C4" +"sys_kbd_scancode","FFE0C8" +"sys_err_message","FFE0CC" +"sys_kbd_layout","FFE0D0" +"sys_proc_run","FFE0D4" +"sys_txt_get_capabilities","FFE0D8" +"sys_txt_set_mode","FFE0DC" +"sys_txt_set_resolution","FFE0E0" +"sys_txt_setsizes","FFE0E4" +"sys_txt_set_xy","FFE0E8" +"sys_txt_get_xy","FFE0EC" +"sys_txt_get_region","FFE0F0" +"sys_txt_set_region","FFE0F4" +"sys_txt_set_color","FFE0F8" +"sys_txt_get_color","FFE0FC" +"sys_txt_set_cursor","FFE100" +"sys_txt_set_cursor_visible","FFE104" +"sys_txt_set_font","FFE108" +"sys_txt_get_sizes","FFE10C" +"sys_txt_set_border","FFE110" +"sys_txt_set_border_color","FFE114" +"sys_txt_put","FFE118" +"sys_txt_print","FFE11C" +"sys_kbd_handle_irq","FFE120" +"sys_reboot","FFE124" +"sys_proc_set_shell","FFE128" +"sys_proc_get_result","FFE12C" +"sys_iecll_ioinit","FFE130" +"sys_iecll_in","FFE134" +"sys_iecll_eoi","FFE138" +"sys_iecll_out","FFE13C" +"sys_iecll_talk","FFE140" +"sys_iecll_talk_sa","FFE144" +"sys_iecll_untalk","FFE148" +"sys_iecll_listen","FFE14C" +"sys_iecll_listen_sa","FFE150" +"sys_iecll_unlisten","FFE154" +"sys_iecll_reset","FFE158" diff --git a/src/C256/extras.s b/src/C256/extras.s index ff559a3..53b4811 100644 --- a/src/C256/extras.s +++ b/src/C256/extras.s @@ -1,6 +1,6 @@ .public restart_cli - .extern cli_rerepl + .extern proc_shell_address .extern _Vfp .extern _DirectPageStart @@ -14,7 +14,7 @@ ; ; Reset the stack to the initial value. ; Reset the direct page and data bank registers -; Restart the CLI +; Transfer control to the registered shell address (if present) ; restart_cli: rep #0x38 ; 16-bit registers, no decimal mode @@ -33,5 +33,5 @@ restart_cli: plb ; pop 8 dummy plb ; set data bank - ; jsl cli_rerepl + jsl proc_shell_address bra restart_cli diff --git a/src/C256/f256k2-flash.scm b/src/C256/f256k2-flash.scm new file mode 100644 index 0000000..175bea4 --- /dev/null +++ b/src/C256/f256k2-flash.scm @@ -0,0 +1,62 @@ +(define memories + '( + (memory flash + (address (#xfc0000 . #xffdfff)) + (type ROM) + (fill #xff) + (section + data_init_table + data + ifar)) + + (memory flash-high + (address (#xffe000 . #xfffeff)) + (type ROM) + (fill #xff) + (section jumptable)) + + (memory flash-shadow + (address (#xffff00 . #xffffff)) + (type ROM) + (fill 0) + (section + (LoCodeStorage #xffff00) + (VectorStorage #xffffe0))) + + (memory LoCode + (address (#x00ff00 . #x00ffdf)) + (type ROM) + (scatter-to LoCodeStorage) + (section code cdata)) + + (memory Vector + (address (#x00ffe0 . #x00ffff)) + (type ROM) + (scatter-to VectorStorage) + (section (reset #xfffc))) + + (memory hiram + (address (#x0f0000 . #x0fffff)) + (type RAM) + (section heap)) + + (memory loram + (address (#x00d000 . #x00dfff)) + (type RAM) + (placement-group nobits (section zdata znear)) + (placement-group bits (section data near))) + + (memory stackram + (address (#x00edeb . #xfdeb)) + (type RAM) + (section stack)) + + (memory DirectPage + (address (#x00fe00 . #x00feff)) + (section (registers ztiny))) + + (block stack (size #x1000)) + (block heap (size #x1000)) + (base-address _DirectPageStart DirectPage 0) + (base-address _NearBaseAddress hiram 0) +)) diff --git a/src/C256/iecll.s b/src/C256/iecll.s index 41ce3ca..4a8f7fe 100644 --- a/src/C256/iecll.s +++ b/src/C256/iecll.s @@ -102,7 +102,7 @@ release_RST: release_bit IEC_RST_o ;; sleep_20us: phx - ldx #20 + ldx #14 _loop$ dex bne _loop$ plx @@ -635,7 +635,7 @@ iecll_eoi php rtl not_eoi$ plp - lda #0 + lda ##0 rtl ; diff --git a/src/C256/jumptable.s b/src/C256/jumptable.s index 47dfd85..5b89d26 100644 --- a/src/C256/jumptable.s +++ b/src/C256/jumptable.s @@ -6,8 +6,8 @@ .public sys_int_enable .public sys_int_register .public sys_int_pending - .public sys_get_info .public sys_int_clear + .public sys_get_info .public sys_chan_read_b .public sys_chan_read .public sys_chan_readline @@ -40,8 +40,6 @@ .public sys_fsys_mkdir .public sys_fsys_delete .public sys_fsys_rename - .public sys_fsys_set_cwd - .public sys_fsys_get_cwd .public sys_fsys_load .public sys_fsys_register_loader .public sys_fsys_stat @@ -73,6 +71,20 @@ .public sys_txt_put .public sys_txt_print .public sys_kbd_handle_irq + .public sys_reboot + .public sys_proc_set_shell + .public sys_proc_get_result + .public sys_iecll_ioinit + .public sys_iecll_in + .public sys_iecll_eoi + .public sys_iecll_out + .public sys_iecll_talk + .public sys_iecll_talk_sa + .public sys_iecll_untalk + .public sys_iecll_listen + .public sys_iecll_listen_sa + .public sys_iecll_unlisten + .public sys_iecll_reset .extern proc_exit .extern int_enable_all @@ -82,8 +94,8 @@ .extern int_enable .extern int_register .extern int_pending - .extern sys_get_information .extern int_clear + .extern sys_get_information .extern chan_read_b .extern chan_read .extern chan_readline @@ -116,8 +128,6 @@ .extern fsys_mkdir .extern fsys_delete .extern fsys_rename - .extern fsys_set_cwd - .extern fsys_get_cwd .extern fsys_load .extern fsys_register_loader .extern fsys_stat @@ -149,6 +159,20 @@ .extern txt_put .extern txt_print .extern kbd_handle_irq + .extern reboot + .extern proc_set_shell + .extern proc_get_result + .extern iecll_ioinit + .extern iecll_in + .extern iecll_eoi + .extern iecll_out + .extern iecll_talk + .extern iecll_talk_sa + .extern iecll_untalk + .extern iecll_listen + .extern iecll_listen_sa + .extern iecll_unlisten + .extern iecll_reset .section jumptable @@ -160,8 +184,8 @@ sys_int_disable: jmp long:int_disable sys_int_enable: jmp long:int_enable sys_int_register: jmp long:int_register sys_int_pending: jmp long:int_pending -sys_get_info: jmp long:sys_get_information sys_int_clear: jmp long:int_clear +sys_get_info: jmp long:sys_get_information sys_chan_read_b: jmp long:chan_read_b sys_chan_read: jmp long:chan_read sys_chan_readline: jmp long:chan_readline @@ -194,8 +218,6 @@ sys_fsys_set_label: jmp long:fsys_set_label sys_fsys_mkdir: jmp long:fsys_mkdir sys_fsys_delete: jmp long:fsys_delete sys_fsys_rename: jmp long:fsys_rename -sys_fsys_set_cwd: jmp long:fsys_set_cwd -sys_fsys_get_cwd: jmp long:fsys_get_cwd sys_fsys_load: jmp long:fsys_load sys_fsys_register_loader: jmp long:fsys_register_loader sys_fsys_stat: jmp long:fsys_stat @@ -226,4 +248,18 @@ sys_txt_set_border: jmp long:txt_set_border sys_txt_set_border_color: jmp long:txt_set_border_color sys_txt_put: jmp long:txt_put sys_txt_print: jmp long:txt_print -sys_kbd_handle_irq: jmp long:kbd_handle_irq +sys_kbd_handle_irq: jmp long:kbd_handle_irq +sys_reboot: jmp long:reboot +sys_proc_set_shell: jmp long:proc_set_shell +sys_proc_get_result: jmp long:proc_get_result +sys_iecll_ioinit: jmp long:iecll_ioinit +sys_iecll_in: jmp long:iecll_in +sys_iecll_eoi: jmp long:iecll_eoi +sys_iecll_out: jmp long:iecll_out +sys_iecll_talk: jmp long:iecll_talk +sys_iecll_talk_sa: jmp long:iecll_talk_sa +sys_iecll_untalk: jmp long:iecll_untalk +sys_iecll_listen: jmp long:iecll_listen +sys_iecll_listen_sa: jmp long:iecll_listen_sa +sys_iecll_unlisten: jmp long:iecll_unlisten +sys_iecll_reset: jmp long:iecll_reset diff --git a/src/C256/syscalls.txt b/src/C256/syscalls.txt index 494412e..1349b87 100644 --- a/src/C256/syscalls.txt +++ b/src/C256/syscalls.txt @@ -79,3 +79,18 @@ txt_put txt_print kbd_handle_irq +reboot +proc_set_shell +proc_get_result + +iecll_ioinit +iecll_in +iecll_eoi +iecll_out +iecll_talk +iecll_talk_sa +iecll_untalk +iecll_listen +iecll_listen_sa +iecll_unlisten +iecll_reset diff --git a/src/Makefile b/src/Makefile index 6f120c0..2cc982c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,7 +1,7 @@ # VPATH=.:../../module/Calypsi-remote-debug/src DEBUGGER=../module/Calypsi-remote-debug/src -UNIT := F256K +UNIT := F256K2 MEMORY := ROM # Define OS-dependent variables @@ -52,13 +52,24 @@ else ifeq ($(UNIT),F256K) CPU=w65816 C_SRCS_DEBUGGER=$(DEBUGGER)/agent.c $(DEBUGGER)/c256-uart.c $(DEBUGGER)/low_level_WDC65816.s SRCS_FOR_UNIT=cartridge.c C256/jumptable.s C256/io_stubs.c C256/extras.s C256/iecll.s C256/interrupts.s C256/f256-cstartup.s - CFLAGS_FOR_UNIT=-DMODEL=17 -DCPU=255 --code-model large --data-model large --target f256 + CFLAGS_FOR_UNIT=-DMODEL=18 -DCPU=255 --code-model large --data-model large --target f256 ifeq ($(MEMORY),ROM) LDFLAGS_FOR_UNIT=C256/f256-flash.scm clib-lc-ld.a --rtattr printf=medium --cstartup=f256 else LDFLAGS_FOR_UNIT=C256/f256-ld_lc.scm clib-lc-ld.a --rtattr printf=medium --cstartup=f256 endif +else ifeq ($(UNIT),F256K2) + CPU=w65816 + C_SRCS_DEBUGGER=$(DEBUGGER)/agent.c $(DEBUGGER)/c256-uart.c $(DEBUGGER)/low_level_WDC65816.s + SRCS_FOR_UNIT=cartridge.c C256/jumptable.s C256/io_stubs.c C256/extras.s C256/iecll.s C256/interrupts.s C256/f256-cstartup.s + CFLAGS_FOR_UNIT=-DMODEL=17 -DCPU=255 --code-model large --data-model large --target f256 + + ifeq ($(MEMORY),ROM) + LDFLAGS_FOR_UNIT=C256/f256k2-flash.scm clib-lc-ld.a --rtattr printf=medium --cstartup=f256 + else + LDFLAGS_FOR_UNIT=C256/f256-ld_lc.scm clib-lc-ld.a --rtattr printf=medium --cstartup=f256 + endif endif ifeq ($(CPU),w65816) diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..8eb0bcd --- /dev/null +++ b/src/README.md @@ -0,0 +1,25 @@ +# Toolbox Source Directory + +This directory contains the main (mostly device-independent) source code for the Toolbox as well as the various sub-directories: + +* C256 -- Directory for C256 and F256 low-level assembly code. (TODO: split these out into separate folders!) +* dev -- Directory for machine-specific device drivers. +* include -- Header files included by various files in the Toolbox. All register address definitions should be confined to these header files, mostly in directories and files for each specific system. +* boot.* -- Files for the boot screen +* cartridge.* -- Code to support accessing the F256 cartridge. This might need to be pushed down to the dev folder. +* indicators.* -- Files for the LEDs... indicators.c needs to be pushed to dev. indicators.h to include +* interrupt.* -- Files to support interrupts... TODO: remove or redistribute to dev and include? +* log_level.h -- Definitions of the various logging levels used by the Toolbox's internal logging code +* log.* -- Toolbox's internal logging code for TRACE/ERROR/INFO/DEBUG logging +* memory.* -- Public calls for the rudimentary memory management support +* newbuild.py -- Utility script to incriment the build number +* proc.* -- Code to support launching and exiting a user program +* ring_buffer.* -- Data type code for a ring buffer, used by a couple of drivers +* simpleio.* -- Rudimentary I/O code for printing messages before drivers are fully active +* sys_general.* -- System information, CPU and model identification, and some GABE functionality +* syscalls.c -- System call support but only relevant for m68k and m68040 systems (TODO: move elsewhere) +* timers.c -- A2560K timer code (TODO: push down to dev) +* timers.h -- Stubs for timers device code +* toolbox.c -- The main startup code for the Toolbox +* utilities.* -- Some useful functions that are needed in multiple places +* version.h -- Definitions of the version number for the current build diff --git a/src/boot.c b/src/boot.c index 2398228..233d5cc 100644 --- a/src/boot.c +++ b/src/boot.c @@ -77,6 +77,8 @@ static enum boot_src_e boot_chain[MAX_BOOT_SRC]; static bool bootable[MAX_BOOT_SRC]; static short boot_src_cnt = 0; +extern t_sys_info info; + /** * @brief A holder for empty arguments list so we have something to point to when starting a binary file * @@ -86,6 +88,37 @@ static char * boot_args[] = { 0 }; +/** + * @brief Display the system information + * + */ +static void display_sysinfo() { + // 8 x 22 region + t_rect region; + region.size.height = 8; + region.size.width = 23; + region.origin.x = 80 - region.size.width; + region.origin.y = 60 - region.size.height; + + txt_set_region(0, ®ion); + + printf("Foenix Retro Systems\n"); + printf("Model %s\n", info.model_name); + printf("CPU %s\n", info.cpu_name); + printf("Clock %lu MHz\n", info.cpu_clock_khz / (long)1000); + printf("Memory %d KB\n", (int)(info.system_ram_size / ((long)1024 * (long)1024))); + printf("FPGA %04X %04X.%04X\n", info.fpga_model, info.fpga_version, info.fpga_subver); + printf("Toolbox v%d.%02d.%04d\n", info.mcp_version, info.mcp_rev, info.mcp_build); + + region.size.width = 0; + region.size.height = 0; + region.origin.x = 0; + region.origin.y = 0; + + txt_set_region(0, ®ion); + txt_set_xy(0, 0, 0); +} + /** * @brief Check the memory indicated to validate it is a boot record... if so, launch the code indicated * @@ -409,6 +442,17 @@ void boot_screen() { long jiffies_target = 0; char message[80]; + // Locate the tile maps based on the top of ram + uint32_t ram_index = mem_get_ramtop(); + ram_index -= 8 * 272; + tile_set_memory_base = ram_index; + ram_index -= 2 * 42 * 32; + tile_map_memory_base = ram_index; + + // Locate the sprites + ram_index -= 5 * (32 * 32); + sprite_ram_base = ram_index; + // Check the DIP switches to see if we should include RAM booting // Choose the correct boot chain accordingly @@ -428,10 +472,9 @@ void boot_screen() { // Make sure that ANSI escape codes will be honored chan_ioctrl(0, CON_IOCTRL_ANSI_ON, 0, 0); - // TODO: debug this - // txt_set_mode(0, TXT_MODE_TEXT | TXT_MODE_SPRITE | VKY_MCR_TILE); - *tvky_mstr_ctrl = (uint16_t)(VKY_MCR_TILE | VKY_MCR_SPRITE | VKY_MCR_GRAPHICS | VKY_MCR_TEXT_OVERLAY | VKY_MCR_TEXT); - + txt_set_mode(0, TXT_MODE_TEXT | TXT_MODE_SPRITE | TXT_MODE_TILE); + txt_set_resolution(0, 640, 480); + tvky_bg_color->blue = 0; tvky_bg_color->green = 0; tvky_bg_color->red = 0; @@ -459,6 +502,9 @@ void boot_screen() { *tvky_layers = 0x0444; + // Display the system information; + display_sysinfo(); + // Set up the text window for the boot messaging t_rect boot_text_window; boot_text_window.origin.x = 14; diff --git a/src/dev/Makefile b/src/dev/Makefile index 6a60e7d..b8af468 100644 --- a/src/dev/Makefile +++ b/src/dev/Makefile @@ -1,5 +1,5 @@ -UNIT := F256K +UNIT := F256K2 # Define OS-dependent variables @@ -44,6 +44,13 @@ else ifeq ($(UNIT),F256K) AS=as65816 AR=nlib + SRCS_FOR_UNIT=txt_f256.c kbd_f256.c kbd_f256k.c indicators_c256.c interrupts_f256.c sdc_f256.c iec.c # timers_c256.c + CFLAGS_FOR_UNIT=-DMODEL=18 -DCPU=255 --code-model large --data-model large --target f256 +else ifeq ($(UNIT),F256K2) + CC=cc65816 + AS=as65816 + AR=nlib + SRCS_FOR_UNIT=txt_f256.c kbd_f256.c kbd_f256k.c indicators_c256.c interrupts_f256.c sdc_f256.c iec.c # timers_c256.c CFLAGS_FOR_UNIT=-DMODEL=17 -DCPU=255 --code-model large --data-model large --target f256 endif diff --git a/src/dev/README.md b/src/dev/README.md new file mode 100644 index 0000000..83f57b8 --- /dev/null +++ b/src/dev/README.md @@ -0,0 +1,26 @@ +# Device Drivers +This folder contains the machine-specific device driver code for the various I/O the Toolbox has to support: + +* block.c -- Public functions to access block devices (currently just SDC, but could also include floppy drive and hard drive). Used by FatFS to access the drives. +* channel.c -- Public functions to access channel devices. Channel devices include the console, serial port, and open files. +* console.c -- Functions to provide a console like device for the keyboard and main screen. This is where the ANSI terminal code support is provided. +* fsys.c -- Provides the file system public functions as well as the channel device driver for open files. +* iec.c -- Provides some wrapper functions around the very lowest level Commodore serial port assembly code. Eventually, this will be used to provide Toolbox public functions for IEC (probably through the channel interface). +* indicators_*.c -- Low level access to the various indicators (LEDs) on the boards: power, media, caps-lock, etc. +* interrupts_*.c -- Machine-specific code for managing interrupts (currently, only the keyboard interrupt is used) +* kbd_f256.c -- Common code for all F256 keyboard (F256K2e mechanical and optical keyboard, F256jr PS/2) +* kbd_f256k.c -- Device specific code for F256K mechanical and optical keyboards +* kbd_f256jr.c -- Device specific code for the F256jr PS/2 keyboard +* ps2.c -- Low-level support for the PS/2 interface +* rtc.c -- Access to the realtime clock +* sdc_f256.c -- Device driver code for the F256's SD card via the SPI interface. This provides a block device driver that is used by FatFS. +* sprites.c -- Code to allow the boot screen to use sprites +* tiles.c -- Code to allow the boot screen to use tiles +* timers_c256.c -- Low-level code to set up the timers used by the C256 code +* txt_c256.c -- Channel device driver code for the C256's main screen +* txt_evid.c -- Channel device driver code for the C256's EVID expansion card +* txt_f256.c -- Channel device driver code for the F256's screen +* txt_screen.c -- Common code for all text screen drivers +* uart.c -- Channel device driver code for the serial port + +NOTE: the directory `unsupported_systems` contains the original device driver files from FoenixMCP that are relevant to systems not currently supported by the Toolbox. They are left here so they could be brought back, if desired. diff --git a/src/dev/bitmap.c b/src/dev/bitmap.c deleted file mode 100644 index 910ae87..0000000 --- a/src/dev/bitmap.c +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @file bitmap.c - * @author your name (you@domain.com) - * @brief Simple bitmap management code - * @version 0.1 - * @date 2023-10-02 - * - */ - -#include - -#include "bitmap.h" -#include "dma.h" -#include "vicky_general.h" - -#define NUM_BITMAP_PLANES 2 - -static uint8_t bm_visible = 0; // Track whether a given bitmap plane is visible - -/** - * @brief Set the visibility of a given bitmap plane, and the CLUT to use - * - * @param plane the number of the bitmap to update - * @param clut the number of the CLUT to use for the bitmap - * @param is_visible 0 to hide the bitmap, any other number to show it - */ -void bm_set_visibility(short plane, short clut, short is_visible) { - uint8_t new_control_value = (clut & 0x03) << 1 | (is_visible) ? 1 : 0; - - switch(plane) { - case 0: - *bm0_control = new_control_value; - if (is_visible) { - bm_visible |= 0x01; - } else { - bm_visible &= ~0x01; - } - break; - - case 1: - *bm1_control = new_control_value; - if (is_visible) { - bm_visible |= 0x02; - } else { - bm_visible &= ~0x02; - } - break; - - default: - break; - } - - if (bm_visible) { - tvky_mstr_ctrl->raw = tvky_mstr_ctrl->raw | VKY_MCR_TEXT_OVERLAY | VKY_MCR_GRAPHICS | VKY_MCR_BITMAP; - } else { - tvky_mstr_ctrl->raw = tvky_mstr_ctrl->raw & ~(VKY_MCR_TEXT_OVERLAY | VKY_MCR_GRAPHICS | VKY_MCR_BITMAP); - } -} - -/** - * @brief Set the - * - * @param plane the number of the bitmap to set - * @param src the address of the bitmap data to use (should be in video RAM) - */ -void bm_set_data(short plane, uint8_t * src) { - uint32_t src_raw = (uint32_t)src - (uint32_t)vram_base; - - switch (plane) { - case 0: - bm0_address[0] = (uint8_t)(src_raw & 0xff); - bm0_address[1] = (uint8_t)((src_raw >> 8) & 0xff); - bm0_address[2] = (uint8_t)((src_raw >> 16) & 0xff); - break; - - case 1: - bm1_address[0] = (uint8_t)(src_raw & 0xff); - bm1_address[1] = (uint8_t)((src_raw >> 8) & 0xff); - bm1_address[2] = (uint8_t)((src_raw >> 16) & 0xff); - break; - - default: - break; - } -} - -/** - * @brief Fill the bitmap data with a given color - * - * @param dest the area of video RAM to fill - * @param color the color index to fill it with - * @param width the width of the image in pixels - * @param height the height of the image in pixels - */ -void bm_fill(uint8_t * dest, uint8_t color, int width, int height) { - vdma_fill_linear(dest, color, (long)width * (long)height); -} - -/** - * @brief Load the color lookup table - * - * @param clut number of the CLUT to load - * @param src pointer to the source data for the CLUT (in B, G, R, A order) - */ -void bm_load_clut(short clut, uint8_t * src) { - uint8_t * base = (uint8_t *)((uint32_t)VKY_GR_CLUT_0 + 4l * 256l * (uint32_t)clut); - - tvky_bg_color->blue = src[0]; - tvky_bg_color->green = src[1]; - tvky_bg_color->red = src[2]; - - for (int i = 0; i < 4 * 256; i++) { - base[i] = src[i]; - } -} - -/** - * @brief Load RLE bitmap data into video RAM - * - * @param dest address to load with the expanded bitmap data (should be in video RAM) - * @param src address of the RLE data to expand - * @param width the width of the image in pixels - * @param height the height of the image in pixels - */ -void bm_load_rle(uint8_t * dest, uint8_t * src, int width, int height) { - uint32_t my_base = (uint32_t)dest; - - // Clear the image map - bm_fill(dest, 0, width, height); - - uint8_t count = *(src++); - while (count != 0) { - uint8_t value = *(src++); - if (value != 0) { - volatile uint8_t * my_pointer = (uint8_t *)my_base; - for (int i = 0; i < count; i++) { - my_pointer[i] = value; - } - } - my_base += count; - - count = *(src++); - } -} - -/** - * @brief Initialize the bitmap system - * - */ -void bm_init() { - bm_visible = 0; -} \ No newline at end of file diff --git a/src/dev/bitmap.h b/src/dev/bitmap.h deleted file mode 100644 index d768c65..0000000 --- a/src/dev/bitmap.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @brief Definitions for functions to manage bitmap displays - * - */ - -#ifndef __BITMAP_H__ -#define __BITMAP_H__ - -#include - -/** - * @brief Set the visibility of a given bitmap plane, and the CLUT to use - * - * @param plane the number of the bitmap to update - * @param clut the number of the CLUT to use for the bitmap - * @param is_visible 0 to hide the bitmap, any other number to show it - */ -extern void bm_set_visibility(short plane, short clut, short is_visible); - -/** - * @brief Set the - * - * @param plane the number of the bitmap to set - * @param src the address of the bitmap data to use (should be in video RAM) - */ -extern void bm_set_data(short plane, uint8_t * src); - -/** - * @brief Fill the bitmap data with a given color - * - * @param dest the area of video RAM to fill - * @param color the color index to fill it with - * @param width the width of the image in pixels - * @param height the height of the image in pixels - */ -extern void bm_fill(uint8_t * dest, uint8_t color, int width, int height); - -/** - * @brief Load the color lookup table - * - * @param clut number of the CLUT to load - * @param src pointer to the source data for the CLUT (in B, G, R, A order) - */ -extern void bm_load_clut(short clut, uint8_t * src); - -/** - * @brief Load RLE bitmap data into video RAM - * - * @param dest address to load with the expanded bitmap data (should be in video RAM) - * @param src address of the RLE data to expand - * @param width the width of the image in pixels - * @param height the height of the image in pixels - */ -extern void bm_load_rle(uint8_t * dest, uint8_t * src, int width, int height); - -/** - * @brief Initialize the bitmap system - * - */ -extern void bm_init(); - -#endif diff --git a/src/dev/bmp_expand.c b/src/dev/bmp_expand.c deleted file mode 100644 index 3e3a7e9..0000000 --- a/src/dev/bmp_expand.c +++ /dev/null @@ -1,215 +0,0 @@ -#include -#include -#include - -#include "vicky_general.h" - -/** - * @brief - * - */ - -struct bmp_color_s { - uint8_t red; - uint8_t green; - uint8_t blue; - uint8_t reserved; -}; - -struct bmp_infoheader_s { - uint32_t infoheader_size; - uint32_t width; - uint32_t height; - uint16_t planes; - uint16_t bit_count; - uint32_t compression; - uint32_t image_size; - uint32_t x_pixels_per_m; - uint32_t y_pixels_per_m; - uint32_t colors_used; - uint32_t colors_important; - struct bmp_color_s color_table[]; -}; - -struct bmp_header_s { - char signature[2]; - uint32_t file_size; - uint32_t reserved; - uint32_t offset; - struct bmp_infoheader_s info_header; -}; - -const uint16_t BMP_BC_MONO = 1; // Monochrome -const uint16_t BMP_BC_INDEX_16 = 4; // 4-bit indexed color (16 colors total) -const uint16_t BMP_BC_INDEX_256 = 8; // 8-bit indexed color (256 colors total) -const uint16_t BMP_BC_RGB_16 = 16; // 16-bit RGB -const uint16_t BMP_BC_RGB_24 = 24; // 24-bit RGB (True Color) - -const uint32_t BMP_RGB = 0; // No compression -const uint32_t BMP_RLE8 = 1; // 8-bit run-length-encoded -const uint32_t BMP_RLE4 = 2; // 4-bit run-length-encoded - -const short BMP_OK = 0; // BMP file was processed without error -const short BMP_BAD_FILETYPE = -1; // File does not have a BMP signature -const short BMP_BAD_FORMAT = -2; // BMP file is not in a supported format (color format or compression) - -/** - * @brief Set the components of a color in a graphics color lookup table - * - * NOTE: this routine might need to be swapped out for different hardware - * - * @param clut the number of the graphics CLUT to update - * @param color the number of the color to update - * @param red the red component - * @param green the green component - * @param blue the blue component - */ -static void bm_set_color(short clut, short color, uint8_t red, uint8_t green, uint8_t blue) { - volatile uint8_t * clut_p = VKY_GR_CLUT_0 + (clut * 256 * 4); - uint32_t offset = color * 4; - clut_p[offset] = blue; - clut_p[offset+1] = green; - clut_p[offset+2] = red; - clut_p[offset+3] = 0xff; -} - -/** - * @brief Load a color lookup table - * - * @param src_colors pointer to the BMP color table - * @param numcolors the number of colors in the BMP color table - * @param clut the number of the color palette to load - */ -static void load_palette(struct bmp_color_s * src_colors, int numcolors, int clut) { - for (int color = 0; color < numcolors; color++) { - bm_set_color(clut, color, src_colors[color].red, src_colors[color].green, src_colors[color].blue); - } -} - -/** - * @brief Decompress the BMP 256 color image data, given 8-bit RLE compression - * - * @param img_data pointer to the BMP compressed image data - * @param width the width of the image to build up - * @param height the height of the image to build up - * @param destination pointer to the destination to expand the image into - */ -static void expand_index8_rle8(char * img_data, uint32_t width, uint32_t height, char * destination) { - int i = 0; - uint32_t row = 0; - uint32_t column = 0; - uint32_t img_index = 0; - - // Calculate address of the first row - char * dest_row = (char *)((uint32_t)destination + (height - row - 1) * width); - - // Default the image to color 0 - memset(destination, 0, width * height); - - // Process the data blocks in the image data until we reach the end of the image - while (1) { - char count = img_data[img_index++]; - char value = img_data[img_index++]; - - if (count > 0) { - // We have a run of bytes - for (i = 0; i < count; i++) { - dest_row[column++] = value; - if (column >= width) { - column = 0; - row -= 1; - dest_row = (char *)((uint32_t)destination + (height - row - 1) * width); - } - } - - } else { - // Count == 0: we have to process the escape sequence - switch (value) { - case 0: - // End of line... handle padding - img_index += (3 - img_index % 4); - break; - - case 1: - // End of bitmap... we're done - return; - - case 2: - // Delta... adjust row and column - char dx = img_data[img_index++]; - char dy = img_data[img_index++]; - - row += dy; - column += dx; - dest_row = (char *)((uint32_t)destination + (height - row - 1) * width); - break; - - default: - // value indicates the number of bytes to copy raw - for (i = 0; i < value; i++) { - char b = img_data[img_index++]; - dest_row[column++] = b; - if (column >= width) { - column = 0; - row -= 1; - dest_row = (char *)((uint32_t)destination + (height - row - 1) * width); - } - - if (img_index % 2) { - // Skip over padding, if we're on an odd byte - img_index++; - } - } - break; - } - } - } - - return BMP_OK; -} - -/** - * @brief Render a BMP file into a destination bitmap image and a destination color palette - * - * @param bmp_data pointer to the raw BMP data - * @param dest_img pointer to the area in memory to load the expanded bitmap data - * @param clut the number of the graphics CLUT to use for the image - * @return 0 if image could be processed, any other number is an error - */ -short bm_bmp_render(char * bmp_data, char * dest_img, short clut) { - struct bmp_header_s * bmp_header = (struct bmp_header_s *)bmp_data; - if ((bmp_header->signature[0] == 'B') & (bmp_header->signature[0] == 'M')) { - // We have a BMP file... calculate the starting address of the image data - uint8_t * img_data = (uint8_t *)(bmp_data + bmp_header->offset); - - // Get the statistics on the BMP image - uint32_t width = bmp_header->info_header.width; - uint32_t height = bmp_header->info_header.height; - uint32_t bit_count = bmp_header->info_header.bit_count; - uint32_t compression = bmp_header->info_header.compression; - - // Dispatch to the correct expansion routine based on the color mode and the compression - switch (bit_count) { - case BMP_BC_INDEX_256: - switch (compression) { - case BMP_RLE8: - // 256 color indexed compressed using RLE8 - load_palette(bmp_header->info_header.color_table, (int)bmp_header->info_header.colors_used, clut); - expand_index8_rle8(img_data, width, height, dest_img); - break; - - default: - // Unsupported compression for 256 color mode - return BMP_BAD_FORMAT; - } - - default: - // Unsupported color mode - return BMP_BAD_FORMAT; - } - - return BMP_OK; - } else { - return BMP_BAD_FILETYPE; - } -} \ No newline at end of file diff --git a/src/dev/bmp_expand.h b/src/dev/bmp_expand.h deleted file mode 100644 index ba137d6..0000000 --- a/src/dev/bmp_expand.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @file bmp_expand.h - * @author your name (you@domain.com) - * @brief Provide a way to convert some BMP files to a bitmap image - * @version 0.1 - * @date 2024-06-07 - * - * @copyright Copyright (c) 2024 - * - */ - -#ifndef __bmp_expand_h__ -#define __bmp_expand_h__ - -extern const short BMP_OK; // BMP file was processed without error -extern const short BMP_BAD_FILETYPE; // File does not have a BMP signature -extern const short BMP_BAD_FORMAT; // BMP file is not in a supported format (color format or compression) - -/** - * @brief Render a BMP file into a destination bitmap image and a destination color palette - * - * @param bmp_data pointer to the raw BMP data - * @param dest_img pointer to the area in memory to load the expanded bitmap data - * @param clut the number of the graphics CLUT to use for the image - * @return 0 if image could be processed, any other number is an error - */ -extern short bm_bmp_render(char * bmp_data, char * dest_img, short clut); - -#endif \ No newline at end of file diff --git a/src/dev/fsys.c b/src/dev/fsys.c index e3ad48d..21a462c 100644 --- a/src/dev/fsys.c +++ b/src/dev/fsys.c @@ -15,9 +15,12 @@ #include #include +#include "features.h" #include "constants.h" #include "dev/channel.h" +#if HAS_FLOPPY #include "dev/fdc.h" +#endif #include "errors.h" #include "elf.h" #include "fsys.h" @@ -108,11 +111,13 @@ void fsys_update_stat(const char * path) { } } +#if HAS_FLOPPY if (strncmp(buffer, "/fd", 3) == 0) { // If the drive is the floppy drive, force the drive to spin up and check for a disk change // this will update the fdc_status, which will be seen by FatFS and treated appropriately sys_bdev_ioctrl(BDEV_FDC, FDC_CTRL_CHECK_CHANGE, 0, 0); } +#endif } /** @@ -877,9 +882,11 @@ SYSTEMCALL short fsys_set_label(short drive, const char * label) { // If the drive being labeled is on the floppy drive, make sure the FDC status // is updated correctly for disk change by spinning up the motor and checking the DIR register +#if HAS_FLOPPY if (drive == BDEV_FDC) { sys_bdev_ioctrl(BDEV_FDC, FDC_CTRL_CHECK_CHANGE, 0, 0); } +#endif sprintf(buffer, "%d:%s", drive, label); fres = f_setlabel(buffer); diff --git a/src/dev/kbd_f256.h b/src/dev/kbd_f256.h index 1f46ec4..94a2605 100644 --- a/src/dev/kbd_f256.h +++ b/src/dev/kbd_f256.h @@ -12,6 +12,8 @@ #ifndef __kbd_f256_h__ #define __kbd_f256_h__ +#include "sys_general.h" + #if MODEL == MODEL_FOENIX_F256 #include "kbd_f256jr.h" #elif MODEL == MODEL_FOENIX_F256K || MODEL == MODEL_FOENIX_F256K2 diff --git a/src/dev/sprites.c b/src/dev/sprites.c index fa9d416..ca3739f 100644 --- a/src/dev/sprites.c +++ b/src/dev/sprites.c @@ -19,7 +19,7 @@ static t_sprite sprite_shadow[SPRITE_MAX]; -const uint32_t sprite_ram_base = 0x000000; +uint32_t sprite_ram_base = 0x000000; /** * @brief Update a sprite's hardware registers from the shadow registers diff --git a/src/dev/sprites.h b/src/dev/sprites.h index 2a2d915..cb78150 100644 --- a/src/dev/sprites.h +++ b/src/dev/sprites.h @@ -15,6 +15,8 @@ #include #include +extern uint32_t sprite_ram_base; + /** * @brief Set the basic information about the sprite * diff --git a/src/dev/tiles.c b/src/dev/tiles.c index b11bb7c..d36df38 100644 --- a/src/dev/tiles.c +++ b/src/dev/tiles.c @@ -7,8 +7,8 @@ static t_tile_set tile_set_shadow[VKY_TILESET_MAX]; static t_tile_map tile_map_shadow[VKY_TILEMAP_MAX]; -const uint32_t tile_set_memory_base = 0x002000; -const uint32_t tile_map_memory_base = 0x003000; +uint32_t tile_set_memory_base = 0x002000; +uint32_t tile_map_memory_base = 0x003000; /** * @brief Setup a tile set diff --git a/src/dev/tiles.h b/src/dev/tiles.h index 03c50da..c5c612a 100644 --- a/src/dev/tiles.h +++ b/src/dev/tiles.h @@ -15,6 +15,9 @@ #include #include +extern uint32_t tile_set_memory_base; +extern uint32_t tile_map_memory_base; + /** * @brief Setup a tile set * diff --git a/src/dev/txt_f256.c b/src/dev/txt_f256.c index 353a44c..551c14a 100644 --- a/src/dev/txt_f256.c +++ b/src/dev/txt_f256.c @@ -63,10 +63,10 @@ t_extent f256_resolution; /* The current display resolution */ t_extent f256_font_size; /* The current font size */ t_extent f256_max_size; /* The size of the screen in characters (without border removed) */ t_extent f256_visible_size; /* The size of the visible screen in characters (with border removed) */ -uint8_t f256_border_width; /* Width of the border on one side */ -uint8_t f256_border_height; /* Height of the border on one side */ -uint8_t f256_color; /* The current color */ -uint16_t msr_shadow; /* A shadow register for the Master Control Register */ +uint8_t f256_border_width = 0; /* Width of the border on one side */ +uint8_t f256_border_height = 0; /* Height of the border on one side */ +uint8_t f256_color = 0; /* The current color */ +uint16_t mcr_shadow = 0; /* A shadow register for the Master Control Register */ /** * Gets the description of a screen's capabilities @@ -141,23 +141,45 @@ static void txt_f256_get_sizes(p_extent text_size, p_extent pixel_size) { */ static short txt_f256_set_mode(short mode) { /* Turn off anything not set */ - msr_shadow &= ~(TXT_MODE_SLEEP | TXT_MODE_TEXT); + mcr_shadow &= ~(VKY_MCR_SLEEP | VKY_MCR_TEXT | VKY_MCR_TEXT_OVERLAY | VKY_MCR_GRAPHICS + | VKY_MCR_BITMAP | VKY_MCR_TILE | VKY_MCR_SPRITE); if (mode & TXT_MODE_SLEEP) { - /* Put the monitor to sleep */ - msr_shadow |= VKY_MCR_SLEEP; - *tvky_mstr_ctrl = msr_shadow; - return 0; - - } else if (mode & TXT_MODE_TEXT) { - /* Put on text mode */ - msr_shadow |= VKY_MCR_TEXT; - *tvky_mstr_ctrl = msr_shadow; + /* Put the monitor to sleep: overrides all other option bits */ + mcr_shadow |= VKY_MCR_SLEEP; + *tvky_mstr_ctrl = mcr_shadow; return 0; } else { - /* Unsupported mode */ - return -1; + if (mode & ~(TXT_MODE_TEXT | TXT_MODE_BITMAP | TXT_MODE_SPRITE | TXT_MODE_TILE)) { + /* A mode bit was set beside one of the supported ones... */ + return -1; + + } else { + if (mode & TXT_MODE_TEXT) { + mcr_shadow |= VKY_MCR_TEXT; + } + + if (mode & TXT_MODE_BITMAP) { + mcr_shadow |= VKY_MCR_GRAPHICS | VKY_MCR_BITMAP; + } + + if (mode & TXT_MODE_SPRITE) { + mcr_shadow |= VKY_MCR_GRAPHICS | VKY_MCR_SPRITE; + } + + if (mode & TXT_MODE_TILE) { + mcr_shadow |= VKY_MCR_GRAPHICS | VKY_MCR_TILE; + } + + if ((mcr_shadow & (VKY_MCR_GRAPHICS | VKY_MCR_TEXT)) == (VKY_MCR_GRAPHICS | VKY_MCR_TEXT)) { + mcr_shadow |= VKY_MCR_TEXT_OVERLAY; + } + + *tvky_mstr_ctrl = mcr_shadow; + INFO1("Setting Vicky MCR: 0x%04x", mcr_shadow); + return 0; + } } } @@ -174,50 +196,50 @@ static short txt_f256_set_resolution(short width, short height) { /* Turn off resolution bits */ /* TODO: there gotta be a better way to do that */ - msr_shadow &= ~(VKY_MCR_RES_MASK); + mcr_shadow &= ~(VKY_MCR_RES_MASK); if ((width == 640) && (height == 480)) { - msr_shadow |= VKY_MCR_RES_640x480; + mcr_shadow |= VKY_MCR_RES_640x480; f256_resolution.width = width; f256_resolution.height = height; // Recalculate the size of the screen txt_f256_set_sizes(); - *tvky_mstr_ctrl = msr_shadow; + *tvky_mstr_ctrl = mcr_shadow; return 0; } else if ((width == 640) && (height == 400)) { - msr_shadow |= VKY_MCR_RES_640x400; + mcr_shadow |= VKY_MCR_RES_640x400; f256_resolution.width = width; f256_resolution.height = height; // Recalculate the size of the screen txt_f256_set_sizes(); - *tvky_mstr_ctrl = msr_shadow; + *tvky_mstr_ctrl = mcr_shadow; return 0; } else if ((width == 320) && (height == 240)) { - msr_shadow |= VKY_MCR_RES_320x240; + mcr_shadow |= VKY_MCR_RES_320x240; f256_resolution.width = width; f256_resolution.height = height; // Recalculate the size of the screen txt_f256_set_sizes(); - *tvky_mstr_ctrl = msr_shadow; + *tvky_mstr_ctrl = mcr_shadow; return 0; } else if ((width == 320) && (height == 200)) { - msr_shadow |= VKY_MCR_RES_320x200; + mcr_shadow |= VKY_MCR_RES_320x200; f256_resolution.width = width; f256_resolution.height = height; // Recalculate the size of the screen txt_f256_set_sizes(); - *tvky_mstr_ctrl = msr_shadow; + *tvky_mstr_ctrl = mcr_shadow; return 0; } @@ -583,7 +605,7 @@ static void txt_f256_init() { f256_enable_set_sizes = 0; /* Start with nothing on */ - msr_shadow = 0; + mcr_shadow = 0; /* Define the capabilities */ diff --git a/src/dev/unsupported_systems/README.md b/src/dev/unsupported_systems/README.md new file mode 100644 index 0000000..d8794ca --- /dev/null +++ b/src/dev/unsupported_systems/README.md @@ -0,0 +1,13 @@ +# Unsupported Systems +This directory contains device drivers for other Foenix systems that the Toolbox does not support (but might in the future): +* A2560K +* A2560X +* GenX + +Unsupported devices include: +* FDC - Floppy Drive +* KBD_MO - A2560K built-in keyboard +* MIDI - SuperIO based MIDI +* PATA - PATA/IDE interface to hard drives +* A2560K A & B Text Screens +* A2560U Text Main Screen diff --git a/src/dev/fdc.c b/src/dev/unsupported_systems/fdc.c similarity index 100% rename from src/dev/fdc.c rename to src/dev/unsupported_systems/fdc.c diff --git a/src/dev/fdc.h b/src/dev/unsupported_systems/fdc.h similarity index 100% rename from src/dev/fdc.h rename to src/dev/unsupported_systems/fdc.h diff --git a/src/dev/kbd_mo.c b/src/dev/unsupported_systems/kbd_mo.c similarity index 100% rename from src/dev/kbd_mo.c rename to src/dev/unsupported_systems/kbd_mo.c diff --git a/src/dev/kbd_mo.h b/src/dev/unsupported_systems/kbd_mo.h similarity index 100% rename from src/dev/kbd_mo.h rename to src/dev/unsupported_systems/kbd_mo.h diff --git a/src/dev/lpt.c b/src/dev/unsupported_systems/lpt.c similarity index 100% rename from src/dev/lpt.c rename to src/dev/unsupported_systems/lpt.c diff --git a/src/dev/lpt.h b/src/dev/unsupported_systems/lpt.h similarity index 100% rename from src/dev/lpt.h rename to src/dev/unsupported_systems/lpt.h diff --git a/src/dev/midi.c b/src/dev/unsupported_systems/midi.c similarity index 100% rename from src/dev/midi.c rename to src/dev/unsupported_systems/midi.c diff --git a/src/dev/midi.h b/src/dev/unsupported_systems/midi.h similarity index 100% rename from src/dev/midi.h rename to src/dev/unsupported_systems/midi.h diff --git a/src/dev/pata.c b/src/dev/unsupported_systems/pata.c similarity index 100% rename from src/dev/pata.c rename to src/dev/unsupported_systems/pata.c diff --git a/src/dev/pata.h b/src/dev/unsupported_systems/pata.h similarity index 100% rename from src/dev/pata.h rename to src/dev/unsupported_systems/pata.h diff --git a/src/dev/txt_a2560k_a.c b/src/dev/unsupported_systems/txt_a2560k_a.c similarity index 100% rename from src/dev/txt_a2560k_a.c rename to src/dev/unsupported_systems/txt_a2560k_a.c diff --git a/src/dev/txt_a2560k_a.h b/src/dev/unsupported_systems/txt_a2560k_a.h similarity index 100% rename from src/dev/txt_a2560k_a.h rename to src/dev/unsupported_systems/txt_a2560k_a.h diff --git a/src/dev/txt_a2560k_b.c b/src/dev/unsupported_systems/txt_a2560k_b.c similarity index 100% rename from src/dev/txt_a2560k_b.c rename to src/dev/unsupported_systems/txt_a2560k_b.c diff --git a/src/dev/txt_a2560k_b.h b/src/dev/unsupported_systems/txt_a2560k_b.h similarity index 100% rename from src/dev/txt_a2560k_b.h rename to src/dev/unsupported_systems/txt_a2560k_b.h diff --git a/src/dev/txt_a2560u.c b/src/dev/unsupported_systems/txt_a2560u.c similarity index 100% rename from src/dev/txt_a2560u.c rename to src/dev/unsupported_systems/txt_a2560u.c diff --git a/src/dev/txt_a2560u.h b/src/dev/unsupported_systems/txt_a2560u.h similarity index 100% rename from src/dev/txt_a2560u.h rename to src/dev/unsupported_systems/txt_a2560u.h diff --git a/src/fatfs/Makefile b/src/fatfs/Makefile index 3b4adf2..8bda430 100644 --- a/src/fatfs/Makefile +++ b/src/fatfs/Makefile @@ -37,6 +37,16 @@ else ifeq ($(UNIT),F256) LDFLAGS_FOR_UNIT=C256/ld_lc_f256.scm clib-lc-ld.a --rtattr printf=medium endif else ifeq ($(UNIT),F256K) + CPU=w65816 + SRCS_FOR_UNIT=toolbox_bdev.c + CFLAGS_FOR_UNIT=-DMODEL=18-DCPU=255 --code-model large --data-model large --target f256 + + ifeq ($(MEMORY),ROM) + LDFLAGS_FOR_UNIT=C256/flash-f256.scm clib-lc-ld.a --rtattr printf=medium + else + LDFLAGS_FOR_UNIT=C256/ld_lc_f256.scm clib-lc-ld.a --rtattr printf=medium + endif +else ifeq ($(UNIT),F256K2) CPU=w65816 SRCS_FOR_UNIT=toolbox_bdev.c CFLAGS_FOR_UNIT=-DMODEL=17 -DCPU=255 --code-model large --data-model large --target f256 diff --git a/src/include/features.h b/src/include/features.h index 9c2f72c..5f79236 100644 --- a/src/include/features.h +++ b/src/include/features.h @@ -41,11 +41,7 @@ #define HAS_EXTERNAL_SIDS 1 #define HAS_OPL3 1 #define HAS_PATA 1 -#elif MODEL == MODEL_FOENIX_F256KE || MODEL == MODEL_FOENIX_F256K - #define HAS_EXTERNAL_SIDS 1 - #define HAS_OPL3 1 - #define HAS_IEC 1 -#elif MODEL == MODEL_FOENIX_F256 +#elif MODEL == MODEL_FOENIX_F256 || MODEL == MODEL_FOENIX_F256KE || MODEL == MODEL_FOENIX_F256K #define HAS_OPL3 1 #define HAS_IEC 1 #endif diff --git a/src/include/syscalls.h b/src/include/syscalls.h index 239a017..778485d 100644 --- a/src/include/syscalls.h +++ b/src/include/syscalls.h @@ -202,6 +202,12 @@ extern SYSTEMCALL short sys_int_pending(unsigned short n); */ extern SYSTEMCALL void sys_get_info(p_sys_info info); +/** + * @brief Force the system to reboot + * + */ +extern SYSTEMCALL void sys_reboot(); + /* * Acknowledge an interrupt (clear out its pending flag) * @@ -774,21 +780,20 @@ extern SYSTEMCALL short sys_kbd_layout(const char * tables); extern SYSTEMCALL short sys_proc_run(const char * path, int argc, char * argv[]); /** - * Set the value of a variable - * - * @param name the name of the variable to set - * @param value the value the variable should have - * @return 0 on success, negative number on error + * @brief Set the address of the code that should handle a process exiting + * + * By default, the address is 0, which means that the system should reboot when the process exits + * If any other number is provided, the code at that location will be called as a far call using the + * simplecall convention. The first argument will be the return result passed to proc_exit + * + * @param address the address of the handler code for proc_exit */ -extern SYSTEMCALL short sys_var_set(const char *name, const char *value); +extern SYSTEMCALL void sys_proc_set_shell(uint32_t address); -/** - * Get the value of a variable - * - * @param name the name of the variable to set - * @return pointer to the string on success, 0 if not found +/* + * Return the result code of the previously running user process */ -extern SYSTEMCALL const char * sys_var_get(const char *name); +extern SYSTEMCALL int sys_proc_get_result(); // // Text screen calls diff --git a/src/memory.c b/src/memory.c index e7cc5db..e90dde9 100644 --- a/src/memory.c +++ b/src/memory.c @@ -13,6 +13,7 @@ */ #include "memory.h" +#include "sys_general.h" unsigned long mem_top_of_ram = 0; @@ -21,8 +22,16 @@ unsigned long mem_top_of_ram = 0; * * @param top_of_ram initial value for the top of system RAM */ -void mem_init(unsigned long top_of_ram) { - mem_top_of_ram = top_of_ram; +void mem_init() { +#if MODEL == MODEL_FOENIX_F256 || MODEL == MODEL_FOENIX_F256K + mem_top_of_ram = 0x06ffff; +#elif MODEL == MODEL_FOENIX_F256K2 + mem_top_of_ram = 0x0effff; +#elif MODEL == MODEL_FOENIX_C256U || MODEL == MODEL_FOENIX_C256U_PLUS || MODEL == MODEL_FOENIX_FMX + mem_top_of_ram = 0x37ffff; +#else + mem_top_of_ram = 0x37ffff; +#endif } /** diff --git a/src/memory.h b/src/memory.h index 74f2a01..5a42d31 100644 --- a/src/memory.h +++ b/src/memory.h @@ -17,12 +17,11 @@ #include "sys_macros.h" -/* +/** * Initialize the memory management system * - * @param top_of_ram initial value for the top of system RAM */ -extern void mem_init(unsigned long top_of_ram); +extern void mem_init(); /** * Return the top of system RAM... the user program must not use any diff --git a/src/proc.c b/src/proc.c index d6321a7..264d24a 100644 --- a/src/proc.c +++ b/src/proc.c @@ -8,15 +8,17 @@ #include "log_level.h" #ifndef DEFAULT_LOG_LEVEL - #define DEFAULT_LOG_LEVEL LOG_ERROR + #define DEFAULT_LOG_LEVEL LOG_INFO #endif #include "errors.h" #include "log.h" +#include "sys_general.h" #include "dev/fsys.h" static const long k_default_stack = 0x00010000; /* For now... we're just going to put the user stack under 0x00010000 */ -static int g_proc_result; +static int g_proc_result = 0; +uint32_t proc_shell_address = 0; /* * Assembly routine: reset the supervisor stack pointer and restart the CLI @@ -54,6 +56,8 @@ void proc_exec(long start, long stack, int argc, char * argv[]) { call_user(start, stack, argc, argv); } +typedef void (*thunk)(); + /* * Quit the current user process * @@ -64,14 +68,40 @@ void proc_exec(long start, long stack, int argc, char * argv[]) { * Inputs: */ SYSTEMCALL void proc_exit(int result) { + INFO1("proc_exit: %d", result); g_proc_result = result; - restart_cli(); + if (proc_shell_address != 0) { + INFO("proc_exit: Attempting to call into shell"); + call_user(proc_shell_address, k_default_stack, 0, 0); + reboot(); + + } else { + // Otherwise ask GABE to reset the system + INFO("proc_exit: Attempting reboot"); + reboot(); + } } -/* - * Return the result code of the previously running user process +/** + * @brief Set the address of the code that should handle a process exiting + * + * By default, the address is 0, which means that the system should reboot when the process exits + * If any other number is provided, the code at that location will be called as a far call. + * + * @param address the address of the handler code for proc_exit */ -int proc_get_result() { +SYSTEMCALL void proc_set_shell(uint32_t address) { + INFO("proc_set_shell") + proc_shell_address = address; +} + +/** + * Return the result code of the previously running user process + * + * @return the result code of the previously running user process + */ +SYSTEMCALL int proc_get_result() { + INFO("proc_get_result") return g_proc_result; } diff --git a/src/proc.h b/src/proc.h index b7ac07a..195b460 100644 --- a/src/proc.h +++ b/src/proc.h @@ -33,10 +33,21 @@ extern void proc_exec(long start, long stack, int argc, char * argv[]); */ extern SYSTEMCALL void proc_exit(int result); +/** + * @brief Set the address of the code that should handle a process exiting + * + * By default, the address is 0, which means that the system should reboot when the process exits + * If any other number is provided, the code at that location will be called as a far call using the + * simplecall convention. The first argument will be the return result passed to proc_exit + * + * @param address the address of the handler code for proc_exit + */ +extern SYSTEMCALL void proc_set_shell(uint32_t address); + /* * Return the result code of the previously running user process */ -extern int proc_get_result(); +extern SYSTEMCALL int proc_get_result(); /* * Find an executable binary matching the path, load it, and execute it diff --git a/src/snd/Makefile b/src/snd/Makefile index 4ff824d..b4c9c83 100644 --- a/src/snd/Makefile +++ b/src/snd/Makefile @@ -44,6 +44,13 @@ else ifeq ($(UNIT),F256K) AS=as65816 AR=nlib + SRCS_FOR_UNIT=psg.c codec_c256.c sid.c + CFLAGS_FOR_UNIT=-DMODEL=18 -DCPU=255 --code-model large --data-model large --target f256 +else ifeq ($(UNIT),F256K2) + CC=cc65816 + AS=as65816 + AR=nlib + SRCS_FOR_UNIT=psg.c codec_c256.c sid.c CFLAGS_FOR_UNIT=-DMODEL=17 -DCPU=255 --code-model large --data-model large --target f256 endif diff --git a/src/sys_general.c b/src/sys_general.c index 6079409..ef1204d 100644 --- a/src/sys_general.c +++ b/src/sys_general.c @@ -173,7 +173,12 @@ SYSTEMCALL void sys_get_information(p_sys_info info) { info->fpga_version = GABE_VERSION->version; info->fpga_subver = GABE_VERSION->subversion; +#if MODEL == MODEL_FOENIX_F256 || MODEL == MODEL_FOENIX_F256K info->system_ram_size = (uint32_t)512 * (uint32_t)1024 * (uint32_t)1024; +#else + // F256K2e has 1MB of system RAM + info->system_ram_size = (uint32_t)1024 * (uint32_t)1024 * (uint32_t)1024; +#endif #else machine_id = 0xFF; @@ -321,6 +326,18 @@ SYSTEMCALL void sys_get_information(p_sys_info info) { } } +/** + * @brief Force the system to reboot + * + */ +SYSTEMCALL void reboot() { + // Authorize GABE to force a CPU reboot and trigger the reboot + uint8_t * reboot_auth = (uint8_t *)GABE_RST_AUTH; + reboot_auth[0] = 0xde; + reboot_auth[1] = 0xad; + *GABE_MSTR_CTRL |= GABE_CTRL_WRM_RST; +} + #if MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X static short genx_leds = 0; diff --git a/src/sys_general.h b/src/sys_general.h index 1f2ae87..74f4534 100644 --- a/src/sys_general.h +++ b/src/sys_general.h @@ -68,6 +68,12 @@ */ extern SYSTEMCALL void sys_get_information(p_sys_info info); +/** + * @brief Force the system to reboot + * + */ +extern SYSTEMCALL void reboot(); + #if MODEL == MODEL_FOENIX_GENX || MODEL == MODEL_FOENIX_A2560X /* * Set the color of the LED for the floppy drive diff --git a/src/toolbox-20.bin b/src/toolbox-20.bin new file mode 100644 index 0000000..976056c Binary files /dev/null and b/src/toolbox-20.bin differ diff --git a/src/toolbox-21.bin b/src/toolbox-21.bin new file mode 100644 index 0000000..4a7e5fe Binary files /dev/null and b/src/toolbox-21.bin differ diff --git a/src/toolbox-22.bin b/src/toolbox-22.bin new file mode 100644 index 0000000..1d5a8c7 Binary files /dev/null and b/src/toolbox-22.bin differ diff --git a/src/toolbox-23.bin b/src/toolbox-23.bin new file mode 100644 index 0000000..5ad492b Binary files /dev/null and b/src/toolbox-23.bin differ diff --git a/src/toolbox-24.bin b/src/toolbox-24.bin new file mode 100644 index 0000000..516c4c8 Binary files /dev/null and b/src/toolbox-24.bin differ diff --git a/src/toolbox-25.bin b/src/toolbox-25.bin new file mode 100644 index 0000000..89881d6 Binary files /dev/null and b/src/toolbox-25.bin differ diff --git a/src/toolbox-26.bin b/src/toolbox-26.bin new file mode 100644 index 0000000..54992dc Binary files /dev/null and b/src/toolbox-26.bin differ diff --git a/src/toolbox-27.bin b/src/toolbox-27.bin new file mode 100644 index 0000000..5d4b28c Binary files /dev/null and b/src/toolbox-27.bin differ diff --git a/src/toolbox-28.bin b/src/toolbox-28.bin new file mode 100644 index 0000000..d718964 Binary files /dev/null and b/src/toolbox-28.bin differ diff --git a/src/toolbox-29.bin b/src/toolbox-29.bin new file mode 100644 index 0000000..20e3b3f Binary files /dev/null and b/src/toolbox-29.bin differ diff --git a/src/toolbox-2A.bin b/src/toolbox-2A.bin new file mode 100644 index 0000000..9486ee1 Binary files /dev/null and b/src/toolbox-2A.bin differ diff --git a/src/toolbox-2B.bin b/src/toolbox-2B.bin new file mode 100644 index 0000000..55fd692 Binary files /dev/null and b/src/toolbox-2B.bin differ diff --git a/src/toolbox-2C.bin b/src/toolbox-2C.bin new file mode 100644 index 0000000..b2f838f Binary files /dev/null and b/src/toolbox-2C.bin differ diff --git a/src/toolbox-2D.bin b/src/toolbox-2D.bin new file mode 100644 index 0000000..7c9653c Binary files /dev/null and b/src/toolbox-2D.bin differ diff --git a/src/toolbox-2E.bin b/src/toolbox-2E.bin new file mode 100644 index 0000000..42159c5 Binary files /dev/null and b/src/toolbox-2E.bin differ diff --git a/src/toolbox-2F.bin b/src/toolbox-2F.bin new file mode 100644 index 0000000..6c11dec Binary files /dev/null and b/src/toolbox-2F.bin differ diff --git a/src/toolbox-30.bin b/src/toolbox-30.bin new file mode 100644 index 0000000..5d043a5 Binary files /dev/null and b/src/toolbox-30.bin differ diff --git a/src/toolbox-3F.bin b/src/toolbox-3F.bin new file mode 100644 index 0000000..9ff3b29 Binary files /dev/null and b/src/toolbox-3F.bin differ diff --git a/src/toolbox.bin b/src/toolbox.bin new file mode 100644 index 0000000..23da074 --- /dev/null +++ b/src/toolbox.bin @@ -0,0 +1,2143 @@ + +9;<=>?@AB /,123456ABCDOK.*111213141517181920212324303132OVsd0sd1 RAMROM%d:38668K86088K960ARMELFM32PGXPGZPPCRCESPUODDSD0SD1INFNaNNone %s +%02XGenXEVID/sd0FILEFR20MIPSNONEPGXRH32S370S390V800COM1COM2EVENMARK%s%s +%04X:%d:%sIAMCUPPC64SPARCSPACE%02X %s%08XC256 UF256 PGenX32M68020M68030M68040(null)dev = PARISCVPP500SCREEN+,;=[]%s%s%s +%s: %s +%024lX:A2560 KA2560 MA2560 XC256 U+F256 JRF256 K2F256 KeM68040VUNKNOWNi486DX4*float*CONSOLE%s: #%d +no mediaA2560 U+C256 FMXF256 JReF256 K2cF256 K2eM680EC30M68EC020M68EC040ReservedWDC65816rtc_init*:<>|"?FAT32 Sector: +not foundCartridge!!n!+! ( Ӹ8l0l(l llDDDCCA2560 K40A2560 K60M68SEC000chan_openChannel: PSG Muted.bad handlei486DX2 50i486DX2 60fchan_readfile lockedCPU %s +Model %s +A2560X - LBA2560X - PBGenX32 - LBGenX32 - PBchan_free: MIPS_RS3_LESPARC32PLUSfsys_mkfs: MSDOS5.0bad argumentExternal SDCInternal SDCprint(%d,..)fchan_read_b access deniedgeneral errorinvalid drivemedia changednot supportedout of boundsout of memoryunknown errorproc_exit: %dA2560X - CUBEGenX32 - CUBEchan_read: %seVG83*!*UoTiTcT*UiT*U@ file not foundinvalid objectout of handlesMemory %d KB +proc_set_shellchan_alloc(%d)chan_close(%d)chan_alloc: %dloader found: bad binary filenot enough coreproc_get_resultflush error: %dFATFS Error: %dfsys_setlabel: device not ready/sd0/fnxboot.pgx/sd0/fnxboot.pgz/sd1/fnxboot.pgx/sd1/fnxboot.pgzBooting from %s +Clock %lu MHz +0123456789ABCDEFcdev_init_systemcdev_register %sbad device numberinvalid path nameprohibited accessunknown file typeF%d-%s +proc_exec stack: proc_exec start: VD2 ׄĄ+.,;=[]/*:<>|\"?R;1' CODEC initialized.Console installed.Interrupts enabledTimers initializedTop of memory: %lxbad channel numberCommand not found.Mounting drive #%dfsys_mkdir error: directory not foundfile system timeoutoperation timed outtoo many open fileschan_read(%d,%p,%d)chan_seek error: %dFile system error: fchan_write error: fsys_delete error: fsys_load_ext ext: fsys_open error: %di 6 + 'NO NAME FAT NO NAME FAT32 low level disk errorno file system foundchan_get_records 1: chan_get_records 2: chan_write error: %dchan_write(%d,%p,%x)fsys_set_cwd error: SDC driver installed.Foenix Retro Systems +chan_status error: %dCould not load file: Could not open file: uart_open: Bad parityW0 |_?Indicators initializedInterrupts initializedfile is not executableToolbox v%d.%02d.%04d +Couldn't load file: %dchan_write_b error: %dvolume has no work areaFPGA %04X %04X.%04X +S ?#0+%-0XqodpuxPGZ 24-bit count: %06lxPGZ 32-bit count: %08lxSetting default loader.uart_open: no BPS token{}{}{V{V{ V{File system initialized.Text system initialized.drive is write protected +Select a boot source: + +Default boot source: %s +Error while printing: %dCouldn't get channel: %dReached end of PGZ file.fsys_open out of handlesCould not find screen %duart_open: Bad stop bitscould not write to devicedevice is write protectedCouldn't execute file: %dPGZ 24-bit address: %06lxPGZ 32-bit address: %08lxfsys_open out of channelsBlock device system ready.could not read from deviceBooting: /sd0/fnxboot.pgx +Booting: /sd0/fnxboot.pgz +Booting: /sd1/fnxboot.pgx +Booting: /sd1/fnxboot.pgz +Returning a bad extension.uart_open: no parity tokenY W[ЎՌʌ۞ОÞXYÞwChannel device system ready.FAILED: Console installationfile system assertion failedproc_exit: Attempting rebootuart_open: no stop bit tokenfile system invalid parameterCould not mount device %d: %dfsys_mount called f_mount: %dInitializing the text system...FOENIX DEBUG OUTPUT------------creation of file system aborteddevice could not be initializedNo bootable device is present. +PGZ 24-bit start address: %06lxPGZ 32-bit start address: %08lxuart_open: Bad data word lengthuart_open: no data length tokenScanning for bootable devices... +FAILED: SDC driver installation %dFAILED: file system initializationtxt_get_device: number mismatch %dxxxxpx[xEx/xxA valid boot record was not found. + AAA 22222 55555 6 00000 X XA A 2 5 6 0 0 X X A A 2 5 6 6 0 0 X X A A 22222 55555 66666 00000 X XAAAAA 22222 55555 66666 0 0 X Q3D383,3 33 3@22333333 3@v3j3]474+4444 3@33 PC: %08X Address: %08X +Press SPACE for default. +Could not load /sd0/fnxboot.pgx: %d +Could not load /sd0/fnxboot.pgz: %d +Could not load /sd1/fnxboot.pgx: %d +Could not load /sd1/fnxboot.pgz: %d + _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / / / __/ //___ \/ __ \ / / / / / /___ / __/____/ / /_/ / / /_/ / \____//____/_____/\____/ \____/ PC: %08X proc_exit: Attempting to call into shell      _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / __ / / __/ //___ \/ __ \ / / / /_/ /_/ /___ / __/____/ / /_/ / / /_/ /_ __/\____//____/_____/\____/ \____/ /_/ Unable to mount drive %s, FatFS Error: %d ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / //_/ / /| | __/ //___ \/ __ \/ / / / / ,< / ___ |/ __/____/ / /_/ / /_/ / / /| | /_/ |_/____/_____/\____/\____/ /_/ |_| i9i;i<i=i>i?i@|i;zi=xi?vi ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / / /| | __/ //___ \/ __ \/ / / / / / / / / ___ |/ __/____/ / /_/ / /_/ / / /_/ / /_/ |_/____/_____/\____/\____/ \____/ Address Error Bus Error Division by Zero Error Illegal Instruction Error Oh dear, something has gone wrong... Overflow Exception Privilege Exception Range Check Exception Spurious Interrupt Unknown Exception Ŀ + Foenix Toolbox v%d.%02d.%04d starting up... ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / __ / /| | __/ //___ \/ __ \/ / / / / / / /_/ /_ / ___ |/ __/____/ / /_/ / /_/ / / /_/ /_ __//_/ |_/____/_____/\____/\____/ \____/ /_/ +EXbcdefosVuxS _________ ___________ ________ ____ __ / ____/__ \ / ____/ ___/ / ____/ |/ / |/ / / / __/ //___ \/ __ \ / /_ / /|_/ /| / / /___ / __/____/ / /_/ / / __/ / / / // | \____//____/_____/\____/ /_/ /_/ /_//_/|_| hVD2 ׅą +[!] Incompatible CPU arch: expected %s, but found %s + !#*-<n>[@H[5]"{|} GGGGGG EEEEEEE NN NN XX XXX 3333333 2222222 GG EE NNN NN XX XXX 33 22 GG GGGG EEEEE NN NN NN XXX 33333 22222 GG GG EE NN NNN XXX XX 33 22 GGGGGG EEEEEEE NN NN XXX XX 3333333 2222222 ,XQ` JC%8K-" @fAܕBGCUDΖGJlfKfPNhH!m&EAAEEEIIIOOUUYAIOUPDJ +}c,Z 0@QYR[T]V_`pN!2!p!!!$0,/`,g,u,,d-&A (((( AAAAAABBBBBB #%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%")"a"e"d" #!#H""" %ax029J.yMC= (": e,;;=f,?@AAF +S@UXZ\]^_abdefgjb,lmnpqstvwxyz{|d,~DE{ +0 P`"6Da&C?=;<XDB@>)8*,.- 9/!10#"2$ 3% +45&' ( :6+ORSPLMHEWNA\^[[]lmficbejkhgd`l@N# +bz@c`[WOؓhG'${jJ۝uW~:g5^-Q'E1ڨˆyk\Q?I9?05(~#swVlN^EP;6*ԁO)шwWހM&Լd`ˀM&{ky\i@MrrAB++$% +~ +oS ծe̜JËB|8h/Ui3uW93+$wvX;5-%O(oM&|lQeCp"WQJC 6cnHUyALm7@].4N#'>uuuaaaBBB!!!žx}`znTdZEOG782&1234567890-= qwertyuiop[] asdfghjkl;'`\zxcvbnm,./* -5+/ !@#$%^&*()_+ QWERTYUIOP{} +ASDFGHJKL:"~|ZXCVBNM<>? -5+/ 123457890=   + + ;"`\ ,. -5+/ !@#$%^&*()_+   + + ;"`\ ,. -5+/ 1234567890-= QWERTYUIOP[] ASDFGHJKL;'`\ZXCVBNM,./ 789-456+1230./ !@#$%^&*()_+ qwertyuiop{} +asdfghjkl:"zxcvbnm<>? 789-456+1230./ 12356~`|\-= qwertyuiop[] asdfghjkl;'zxcvbnm,./* -5+/ ;Kc{;Kc{;Kc{;Kc{;Kc{dIdIdIdIdIdIdIdIddIdIdIdIdIdIdIdIddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd~~~~l|88||888T|8|8|<<$BB$۽?0($$( <$<$$T((T 08<80  < 8||8HHHHHH>JJ: + + + $$8~~8||88TT8 @@ @@|$BB$8||8(((((|(|((P(8DDD8(8DDD8 8DDD8(HHH4 HHH4(DDL48(8DDDD8(DDDD88TPT8$ x "|DD(||8D@D8$ p 8DDD8HHHHp4X|(D(|8DD|DD88DDD((l< DDD8ll$JR"\@<@8@<8DDDDDD|||||  8 8 `| T T(P 8$$$8 <<<<< +  !kkkk::kkkkkkkkkkkkkkk?k"Xk"DkOkkkk k)k +Pk +Ok"rk"rk? )k"k)"Uk)"pk kkkc8k k +k k%'kikH"hk +kk)!8kH"hkH"thkik + kki-k"-"^"6 +H :Hkwwk:k)k)k[?]?k i +k +"k +"k +kH" phkkkk  k"X"a)k +wk:00k'' ɀ k:k 8k )"Ykk )"Ykk ) "Ykk )"Ykk )"Ykk )"Ykk )"Ykk )"Ykk )"Ykk )"Ykk )D"Ykk )"Ykk  8 k [𫫘 H (+k [𫫯]?[?+k>"_nk [ h )X+k [ h )x+k)kk8[dH"U?Z"\: czkZ"9\:czk)8kZ$"d8ezkZ"m:zk8PI"Ykk"k"d"S""[k  " " )kZ)))zkwk    k) + + + +#e + k"h"-[*"ckHHHH")hhhhk  :i:<i<k +7k"k)k)kZ   ;"zk"{0Hzzkk [𫫩"Y?+kZZ  "XH"ahzzk:   / k +   "ۂkHHFf ee&hk!#%'k [ D J B "+k/ + JJJJ / +  k~"n]:~"kZ8PIzk"n + + +H +H"}ZhhY?"]z +zk [𫫘" +k)  +  k"[   k"[  J kZ) :8zk"[  k:% +   k   "d"k kZ  HH )H )"hhhh"czk88(PI + +ZHZkn> n> + +p>r>n>n>kk +"_n "_nk"6Y"kzo??"k# k +  +" + + + + " z z +zk""=}  )   k"[  J:kkdHHJee&hzk)8PI&"d4ekZ  )  zk!ɀ8 +ek [𫫘8[?[?]?]?]?[?+kZZ JJJJ JzzkZZ;"W  zzkZ   +)HHHHH )";i +"czkZ   +)HHHHH )"};i +"czk + +8PI"mz +zk + +8PI"z +zk + +8PI"cz +zkHZ H $  + +()h  zhhhk + +"Fz +zk   ):kH +&H) +H)*EJ&h)jh)jhkZ"["    zk>"d"8S?kk + +8PI "z +zk~"-[z"-[ y wkZ  O )8 +"n^ J ) "n^zk"n^*"n^#"n^,"n^"n^"n^E"n^"hkZ  8     գI)8zk" !  k + [𫫘 +n"U? +W?+z +zkZZc( +" +"d8 + + + +zzkH)ɀ))ɀ)zh @zzkhk +"mv"NPHP +Nh"}Zz +zk +   +  ) zz z +zk [𫫩 އ    +kZ  ) + + +$ +e) + + +e"ozk +ZZ +; +" zzz +zk +Z"[ + +!"tH"gh  zz +zk +Z +d" ' ; +"zz +zk:0 +H`&{k + +;iHH +>>"~hhz +zk + +) +H"ah H"ahz +zkH"ahH + )+' + ) + + h((kZ  i  " H"hzzk +  + )"x\: zz z +zk +i +)"")  z +zk +  + H +"_n zz z +zk + [𫫘ZZ +)  H"hzz+z +zk +ZZZ +: +  ݦzzzz +zkZ8PI0zk + + +$ +e"_n" +kZ"[18 PI"e  zzk [𫫘ZZ"mY"tY ` )%zz+k +) +H"ah +ک H"ah +H"ahz +zk + Z +:Ȉ + ަzzz z +zk + [𫫘"mv":< H< +:h"}Z+z +zkzuYȗȗȗȗ:ȗ  k + [𫫘 + +"-   +"vP:"[+z +zk +  "d % + + + + + % zz z +zk;8J  ;"m;"o;"Ҋ;iJk"X""u?=""oZ\| [𫫘Z ' )4"dl%e"Hk ' z+kZ  QQ UU QQ U* QQ UU zk + [𫫘"mv +  + +"}Z+z +zk + [𫫘"mv# +"}Z+z +zk + [𫫘"mv& H +h"}Z+z +zk + [𫫘"mv&>@ H@ +>h"}Z+z +zk + [𫫘"mv&BD  D +B"}Z+z +zkZ8PI08$"d8!8$"dezk + [𫫘"mv$ H +h"}Z+z +zkZZ"[4   ))   7 zzkZ    =) + + +?$ +  # +  ) + + + $ + " +kzk +   + )"]H)"]h8 ) Պzz z +zk +Z )"q[  w"q[  zz +zkL?!?3???6?>>?>>?>> O?Q?k [𫫘Z"u"b "F"[z+kZ8PI9V"d>eHG"hzk +  "mv&JL HL +Jh"}Zzz z +zkZ     J  jj) ec  :  ȈǣzkZZ   JJJJ ))#) 8PI0 8PI0 +"dczzk!7 7^ YȗȗȗȗkZZ:2      zzzk + [𫫘"mv* HHH +h"}Zhh+z +zk + [𫫘"mv*68H H8 +6h"}Zh+z +zkZZ8PI0zzk8PI0Ӣ"pZ  QQ  QQ    :zkZZ  "d7  ;iH;i"%hh +"[zzk + [𫫘"mv( H +h"}Z+z +zk + [𫫘"mv(&(  ( +&"}Z+z +zk + [𫫘"mv(*,  , +*"}Z+z +zk +Z"mv  +"}ZH "hzz +zkZZ " yy I /yy  Oyy zzk + ["4"r"r"Di +"D +PI0+z +zkH) H +)87IJj(hk( +*(zzk + [𫫘 + +"- +">hh"[+z +zk + [𫫘"mv*24 H H4 +2h"}Zh+z +zk +ZZO?Q?Q? +O?"}Zn>:";Yzzz +zk + +r> +p>"}Z:Ӌ [𫫘ZZZ"mY"tY'  l    l zzz+k [𫫘ZZZ"mY"tY'  `    ` zzz+kZ"dC  )zk:,:#!#%'!# %'kZZZ  o!o#"dc @ +` "zzzk +;8 +;"wHH +;i"_hh;iz +zk;8T?8PI0:HHHb;i "hhh;i";iTk;8 +#JJJJ  #   ;i";i +k +;8 +;"VpHH +;i"_hh;iz +zk +ZZ8PI6""d<e + +"}Zzzz +zk +;8 +;"Vp;iH +;i"_hh;iz +zk +"h> +> +:?"^!?"^?"^z +zk"Y +;8  i "e  i "e;i k;8T?8PI0>HHHH2;i " hhhh;i";iTk + ZZ + +  "  w S?zzzz z +zkZ8PI0zk""d<<""de [𫫘ZZZ"mY"tY.' l I%   l zzz+k + [𫫘Z + +"- +"\"F"[z+z +zk + [𫫘Z + +"- +"i4"F"[z+z +zk + Z  +  "[ +  ::zzz z +zk + + ?  2)(d"hhz +zk +Z +H+"h +"]H +HH"8hhhکZ "hzz +zk + Z + + +"] e  + ) zzz z +zk  +  [𫫘"mv .. 0 "0 +. "}Z+zz z +zk +  [𫫘"mv .R T "T +R "}Z+zz z +zk +ZZ +"X"Qd: "X"=b:zzz +zk +ZZZ + +"S"/;i +" zzzz +zk +;8J +;"m)  ;"o;"Ҋ;iJz +zkZ    N#) + + +$ +e  !) + + +$ +e ' " +kzk + + +"n]:<w + +eɀz +zkZ    P') "d e  %) "d e ' zkZRMH)h8PI0 "'e zzkZZZ   )"@"?{"?{  "?{) +& +"zzzk;8T?8PI0FZHZHHHHH;i" ;i ;i";iTk +ZZ + +"^:<w + +eɀzzz +zk +  [𫫘"mv 0" $ $H$ +" h"}Z+zz z +zk + ZZ    +   "[: +:оzzzz z +zk +Z +0B;H +i"%hhzz +zk + [𫫘ZZ8PI2""d<e +"}Zzz+z +zkZi  8PI0  zzke  Z    NH$ +) + + +ehH$ +) + + +eh" +kzzk +ZZ +%;i +" zzz +zkd"Z: +Z +"  ; +" +"i: +"kzz +zkZ&"=}   )  6HH"2hh    "ۂzkZV            I%  zkZ    PH ) "dehH ) "deh +zzk + [𫫘ZZ8PI6""d<e +"}Zzz+z +zk +8ʆ8ʆ + +$2 +0 +d"k`eHe +hz +zk [ Y )d Z )Ȉ +& [ )+k +ZZ8PIG6"d;e% +"}Zzzz +zkZ   0 P9  E a 0f  % A F  )i)i )80zk +ZZ +"dC;iH +"%hh "F"[zzz +zk;8 + /"F"FY?HH  "Lahh;i +k + Z "d + +< + " "])"[zzz z +zk P X Y Z [ ] ^ _ X \ X k +ZZ +8" +"d/;H;i"Ahh) +"[zzz +zk + [𫫘Z"] +)&"d4e" +"=g d% z+z +zk + Z  +0 2  " + "zzz z +zk +ZZZ +8PI + ;iH"shhH:H"Pshhzzzz +zk + ZZZ  +8PI0zzzzz z +zk "X +cH"ah8PI0/8PI0    .      "k + [𫫘 +HH"hh8PI+ +6"d;e6"o+z +zk +ZZ\ + +C7 +"h0 +zzz +zk +ZZZ +8PI + ;iH"shh8HH"Pshhzzzz +zk +ZZZ +8PI + ;iH"shhcHH"Pshhzzzz +zk +ZZZ +8PI + ;iH"shh8HH"Pshhzzzz +zk +ZZZ +8PI + ;iH"shhcHH"Pshhzzzz +zkOy.wy aw~y)))"$~y))) "k +ZZ"dP8,"% + + + + + ) )JJJJI)8 zzz +zk + ;8R ?8PI0B;i^H ;i"hh;i? +?"}Z;iRzz z +zk +ZZZZ + + +"]e) +     zzzzz +zk + ZZ  "60< "X_0* "JY%zzzz z +zkZZ8PI*8PI Ȉ :H:H"Pshhzzk [𫫘;8R[Hک>;i "hhh;i"m "F"[;iR+k +Z +8 +PI0@ "d  4 + "de"/i: zz +zk + [𫫘ZZZZ;i;":;$ +"}Zzzzz+z +zk + ZZZ + 8PI c   zzzzz z +zk +" m + Z + )"FH H",hhh8PI  e ӊzzz z +zkZ  ) + + + +) + +   +) + +e) + +e  zzk + [𫫘ZZ8PII""d<e%HH +h"}Zhzz+z +zk + ;8R ?8PI0B;i^H ;i"hh;i? +?"}Z;iRzz z +zkZZZ  )""?{2"?{%"?{"?{  "?{) +$ +"zzzk +ZZZ +   +;"%8PI2 +'7) +"zzzz +zk + ZZ  +i" "d*;iH +"Ahh +"[zzzz z +zkZi:] +H`"[M"[D? ' 0 @ ! '   zk + Z!ɀJ=ɵ6% + + e 8 ֊i)zz z +zk + [𫫘ZZ8PIN""d<e*HH +h"}Zhzz+z +zk + [𫫘ZZ8PIN""d<e*HH +h"}Zhzz+z +zk +  +   +L       "oȷ   "_n i + zz z +zk + Z  + + "@ +:)0 +i2 0 ",+hzzz z +zk;88PI0! ;i";ik%ک8;ie  FfFfFfFfZ  )az8 ʆɀ8)zk [𫫘ZH"hY?U?W?:"dW?U?"Lahh"j+""jz+k;8 +cJ iH + +he +  ;i +k:  ;8 +JJJJ))  ))  JJJJ)  )  ;i";i +k + ZZ + 8PI0 +"zzzz z +zk8PIH ch  [𫫘;8RZ;i"h +;i"hh"F"[;iR+kZZZZ  8'PI0zzzzko#"d8%PI0 !ce @  +`  +Z +"df +"O"[W% +eHeh"O"[+ eHe +h"O"[zz +zk + ZZZZ  +8PI0zzzzzz z +zk "X"aH +c h  +ZZZ ++   zzzz +zk +cH"h + Z + + i  )     ""    @' ) +" m)zzz z +zkZZZi0  :  ;8"d'e"H"h)H;iH"hhh"[zzzk +  [𫫘ZZZZ;i;":G0H   + h"}Zzzzz+zz z +zk +ZZZZ + +i"^  7i +"^Hhzzzzz +zk + Z  + "z7O +)  + $ + zzz z +zk + [𫫘ZZZZ +QQ"Q +G +="r +  "Di +"D +PI0zzzz+z +zk;8 8 PIx;i H"s;iH"Ez c c 8;i H"z d8"v;iH!"z;i;ik + Z  +H "]h+ "]e  zzz z +zk c)"]H +ch  +;8: +;i;i"f:O;i".+1  + +;i"-;i:z +zk +;8T +>8PI/"cH +HH;i " hhhh&ڥ +HH5;i "hhh;iH"hh;iTz +zk [𫫘ZZZ;H"oZhhhhF&HH"hh1H$ "hH +"hzzz+k + [𫫘;8 +;i;" >&("( +&"}Z H +"h ;i ++z +zk + [𫫘;8 +;i;" >*,", +*"}Z H"h ;i ++z +zk + +  +ȈFj +  +ȈFj +  +ȈFj +  z +zk + Z + 4  6 +g "?O + i8 "fh +4 +6 zzz z +zkZZZ -8%PI008'PI08'"j':o!o#zzzk [𫫯PLEP"Ly:#"Ly:4"Ly: PV"{YQQ ɿ 4QQ    P"YP+k + [𫫘;8 +H"h;i;i":B "  +"}Z"=g;i ++z +zk + [𫫘;8 +;i;" B"$&H $ +"h"}Z H +"h ;i ++z +zkZs8 PI0_ h i j l m n ` a b zzk + +eL + ZZZZ  +8PIV "X"a   + 5 + +c  zzzzzz z +zk/):{):n): ): ): $): / k +)Ȉ +&)d + +Ȉ +&)d + +Ȉ +&)dz +zk + S?Lٷ~ f8ʆ +8ʊ +"z +zk + Z + + i e )8PIF cH"h c   zzz z +zk;8 8PI0L8;iH"shh;iH"Ezhh8PI +cc8  ;iH"zhhd "v;iH"zhh;ik8HHH +**** * * * 8Hh hhhzzz****Jh;i(khhhhhzzzz(k + ZZ +."  v 8PI0\    +)"]H +ch c  zzzz z +zk + Z  +  W  N  )<   !  "YJ    zzz z +zk + ZZZ + %;i +" S 4  +";i +"zzzzz z +zkd"Z:L} + ZZ + )"Z::   "Z:S))e:"Ae  zzzz z +zkZ?8PI@8PI0PG"A8 A"A:P8PI0"PG"c A"zk +  [𫫘;8 +;i;" K.0/H  0 +. h"}Z H"h ;i ++zz z +zk +  [𫫘;8 +;i;" N243HH  4 +2 h"}Zh H"h ;i ++zz z +zkZ"8PI0T8PI0zk$"d88$"de6"d;;6"deL;86 G ԧ=`[!`#%+-/1/')35;":#;";i6k + ZZZ +##"Y"Zʆ"&"Zʆ"& 8PI00c +7cWc  +    +"YЁzzz\;8 / ;i" ;i" H;i"]h;ik;ic   A +Z  )"]H;ich  + ZZ   +  +"i:L  ; +"m [  +"m; +"; +"#  zzzz z +zk/)$"L+&"c@+&"3@+&"k +;8 cJ + +cic + +   Ȁ ;iz +zk:L;8"         g ,2YV]s8!;":"  ;";i"k + Z + V + 0 E X + x $ȷ )"8:  E% 0 6 X + x ! 8PI08PI0 zzz z +zk +Z8PI0Lƣ$"d8e +r +8PI/ +6"d;eEx "F "Fzz +zk + Z   +     LǠ)L  w   +) e    @ Z   a "z   +"@  H"hzz z +zk + Zi + +) +eHeh) 8g +ȗ +i8 8ʠȗ +Hȷ +h"z\ + Z  +"e + + +c i +c + + +c i +  c   +' ȷ ϥ +ȗȗȗȗ ȗ +ȗzzz z +zk;8  + ;"W Llʣ + + + + + 4  +   +  + + +   ;i +;i"f;ikZ A"SPG""PG"c A"?"Sń'7""PG"A8 A"A:zk +  [𫫘;8 + +H +HHH "hhhh;i;i"J  . +H  + h"}ZH "h;i ++zz z +zk +ZZ +)L64 +i8":fhL  84(H6*h "H  ;4 wH6"wh +i8":fhzzz +zk;8;"8 +) + + + + +ʪʠ Ȉ +& ʠȈ +& ʆFj;ik;8 c  g       )   ;ik ҋ [𫫘8PI0LϘ""d<e + +  +kZ 9 LЯʆʆ"oʆʆ"o  s  i ) +ʆʆ"o ) +ʆʆ"o8 8 zk + ZZZ + ; +"Lѥ  +"Kt +"*e A  +"- +"iU zzzzz z +zkIIڅd*8&zzkHCh"H"Ik$8$8 + +ddd d & +&&8& & zz +z zkEH"z8kk;8  LvӯPHP h 8PI0j ) + +  +  + ' + ) + +e  % + ) + +e  4e  e  L;izkZZZZX + + + + +c  :LCԣ +H`HHuB "hhnHHu> "hhRHHu. "hh6HHu: "hhHHu6 "hhH "th)""Ozzzzk +;8 +   + +  + "oLRՠ +ic  8<PI0S;iH +i "%hh  ;i +z +zk;8VV) fY 嵃σƒy^!v#%gb79$`;=`')@~+-`/1^35?A[CE~GIjKMOQbSU;";iVk;8 +;H"zd""HHH";i dd"d"" 8PI0""m"Pshh;i +kHH "hhdd "d "O  ZZH}"h0V8PII$"d88$"de$"d8ew8PI0Y$"d8J$"d88$"de$"d8ezzk + ZZZ  +   , .7  . , "K t +  "bI      "iUzzzzz z +zk + ;8 +  + +"?:L"ڥ + "ڎ 46 +i8"_n +i8 +6H c ":fh c  + ;i +zz z +zk + ZZZ  +  "KL ۩ +  "bj    ) " "iUL{ڣ zzzzz z +zkZZZ: +8PI0.80PI0/"YPI0 +80L-ܩ$8PIL ܊80PI09"YPI080^8aPI0V"YPI0i28API06"YPI0izzzk +  [𫫘;8 + +H +HHHr"hhhh;i;i"q HH"hh . +H   + h"}ZHs "h;i ++zz z +zk +;8   + 8PILGޣ"d 8PI0LGޣ8 :8PI0m + "8 PI02 c + +ZQXQ " +H "4h  H "4h H "4h:L;i z +zk +  [𫫘ZZZ""F8PI0LNߣ6"d;eLQߣ"G n ` + E H  + +h"g"}Z  zzz+zz z +zk [𫫘Z8PI0 +z+zke  ie  ie  ie  ie  ie  ie  Lz;8@;i ;i"f:L ;i "._7  ;/+)  "H h 7  + +  :  ;i@k + ;8 +  +  "Z"_n ) + ";i +zz z +zk: + + +c + + +c i +cH"Zchȗ + + +c : + + +c i +cH"Zchȗ L + ZZZZ    L) + +)o +Ho" +h8PILv$ +) + + +e  ) + + +?$ +  # + + + + +  # + + +  ) + + + $ + " +k4e + e   Lzzzzz z +zk + ZZZZ)* +  ϧ) L)*  ϧ) +!   +zzzzzz z +zk + ;8$8PI0L8PI0L$"d8e +$"d8e    +i;i "o i +i "o;i i "o;i$zz z +zk + [𫫘;8;i# + ' L;i4"dl%e" "[L +   8PIL;ic +i c   +i c);i+z +zk + [𫫘;8;i# + ' L*;i4"dl%e" "[L-   8PIL;ic +i c   +i c);i+z +zk + [𫫘;8 + +"-8PI ' L`  ' LO)B;i"sah;i4"dl%e"* +4"dl%e"H"h"[  ' ;i+z +zkLt +  [𫫘;8! +QQ +  "L +L#eHe +h + L8#PIcHcheHe +h + "r  +  "Di "D PI0L;i+zz z +zkH + )&" + ) + )0 8 + +hk ڥH + )2. + )! +8  +ж0 8 +𚰥hkH88HdR8W)) +*)(j)J(j zzkJjfȀ( +  [𫫘ZZZ"mv LF H L)"L;iH"shhH"PshhL;iH"shhHJJJI)8 + + +H"Pshht;iH"shh8PI=H:H"Pshh HH F  +h"}ZH:H"PshhHH +F h"}Zzzz+zz z +zkZZZZP8<8;H"z "Hl?H?H"Hl?H?H"Hl??"&H"Hl?H?hZJJJJH_"Hl;i?H?H?H "Hl?H?H?H +"Hl ;i H"z"Ps;izzzzk@"j"gH̢:dFfc c  e + * &ؘ8ce~hhhhhh/FffF8&/y$0&&ddZddQH)hF8&H)h)H)h) +J Jȥ +Z먊JjzkZZZZL  +"L}L})#cLj~ +eH`8`f8P\cR8H80>8 48*8)88 +e  +eLzzzzk + ;8 +  + +i"^:L'): "d  1@')" ɀL + e j +E)e"^; ɀ9    +e';i +zz z +zk  L +;8;i H"shh;iH"EzhhLQL c ;iH"z H"Uj;iH"z;i +L c  ;iH"z H"Uj;iH"z;i +L c c8  ;iH"z H"Uj;iH"z;i +;iz +zk + ;8 + +:  8PI0L;iH;i "Ahh ] ) E      +E L;  +;izz z +zk +;8 + +"'L(L7  : + +;i e / + + +;i e"';iz +zk +iH + + + +he"H + +;i ehL + [𫫘;8 + +      JJ +              #   "`wd"d "`we "`w"`w# "`w0   "`w"`w +;i ++z z +zk +;8 + + + L;i;i"fL  +".L+ 0G7)+ " + ,  +"K  ;i +z +zkZ"n]:"Lq"aLn):Lf))  )  <)H"  hLq )H"  hLq@)H"  hLq)H"  hm?)H"  hC)H"  h')H"  h "aLKzk"j"kI"j"k"gHhڥ +E\8~FfjJ8 +Fl$ zzzku +**Ji +Jȣ +fjhhzkFeeJjj8j +ЧгH +JhȈkЗF@ + ZZ  L7 L  L     L  L  L"\ȷ   + + "`  L  +e8  +Ш    5  ȷ +  +ȗ  :"\zzzz z +zk + ;8   +       +i"e ): "d)  +e +E)e"e    L + e : +  @    ;i zz z +zk + ZZZZ + :8PI0L +"L8PI0L) c q +W = c  c ] c ] c J8PI": c Lzzzzzz z +zkO ? +ZZZZ +  L;i"Nm"Y - "Y +  "Y  "Y   +"Y"z: - N"S?D +.8"S?    +%  "Z  "Zzzzzz +zk +@ +ZhhJjhzkک"j"gHҘ8i0 +*$ &$8 &ccd&8&&&8j$Ff19Ffj  +,&JȀJ dd +ZhhhhJjzzk + ;8  + +i"^:L?'): "d  4@')$  +e:LL +E)e"^ ] ɀQ   "Y  +e"Y  , + ;izz z +zk  L;8:- "Y Yo!#% m')ස/1&Y35^+-79;i":Ld "Y Yo!#% m')ස/1&Y35^+-79;i""Thhh;i:k +;8;i H"shh;iH"EzhhL?L H"UjhL ;iH"z H"Uj c  ;i H"z H"Uj;iH"z;iL c c8  ;iH"z H"Uj c  8:;i H"z H"Uj;iH"z;i;iz +zk + ZZZZ=L87g0f +g +  ȷ   ȷ g7 +80] +"Zȷ"Zȷg7H h"zzzzzz z +zk + ;8  + " 7)Lz 7)$ + Ȉ +& +8 PI0     ".)_ +  + "W:i:У    ". "k;i zz z +zk +ZZ + +"?L +  L +  L + +i8"_n +i6U"e +i8RRaA" +irrAa" +i " +i$"&$4664 +i8":fh  H"bhzzz +zk + ;8 =LJ c)   "e + + +ci +e + + ȷ + +LJ +ȷȷ8 Y +g  +c    7 H  h" +i;i zz z +zk + [𫫘ZZZ +8 +PI0L~  "d  L  "d  8PI0L 8PI` +c   A)"]H "dech  "dezzz+z +zk "dec L L  + ZZZZ  + L' L'& +"zL* "db L"E L* %L* +"zp8ʆ'   L[zzzzzz z +zk +  [𫫘ZZZ + +"-8PI% d% L d%  "L"G Ln H"h  +&"d4e"Թ  WH"h d% "=g"[!r " d% zzz+zz z +zkL{ +ZZZ +  ) +zzzz +zk)"   L    L  ڃ  L  ك  L    L    L  Ã  L    L  ă  y ۃ  g Ń  U ƒ  CH"4h [ [H"4h     H"4h  L + ZZZ  +   ;iH;i +H "ohhhh8PI0!HH "|hhzzzzz z +zk + +e8PI0%8PI08  L8ZPI0a8PI08R  L8(PI0/8PI0 8(  [8dPI0k8PI0 8\  3 +   # # L} + ZZ    LPHP))"d8PIL ) "de  ) "de  ) "de   ') "d e ' %) "d e  : + + e H + + e hLzzz z +zkZZ   +L +e +H` w a"L +L  L L L w L  Ld"}Ld"ڈ| "ڈU   3  "}zzk + ZZZ   ɀ L  L)8 + +P~P  )"\: ["6)8 + +P +~P))"x;" JJJ ))"i  (#)JJJJI)8i0"#)i0" )"~"!  "zzzzz z +zk +  [𫫘;8 +;i-  +"-8PI ' L  ' L;i)HH +HH;i  4"dl%e"!hhhh"[L     8PIL;ic i c  i c);i+zz z +zkL + "[ + +Lv ) )  )       `  "@Yi "@Y PI01   "@Yi "@Y PI0驇!  "@Yi "@Y PI0  "@Yi "@Y PI0   "@Yi "@Y PI0   zz z +zk + ;8    "7)L7)%  Ȉ +& ? ".)   ":L  7)ʆ ". ".)^ +  + ":i:Щ ": "k;izz z +zk + ;8 +   +C #  7".    L     " "k "Ќ:L@   +                  ; "m ;i  " +  ;i  ":  )ӣ ;i +zz z +zkZ  ) "de) "de  ) "de) "de  ) "de) "de  ) "deH) "deh ) "de +H) "deh +) "d H) "dh  zzk + ;8   :L;" +H`;i HL"LGhh ;i H]"LGhhL;"L>";i H*"LGhh ;i H;"LGhhL;"L>"yHw + +"rg: + L>"L;"uHs + +"rg: + oj"\EH + +"rg: + oooq;izz z +zk + ;8 +;i +"L#@7)L# K +i&   ":fhL# 7 "%  "bL#$"      +"h i " i" i"e   "  7 ;izz z +zk + ;8 + +L%7 +"hS?   >> + >> +>> +  L%>eL|% +L|% ȷ   ȷ ȗ"^ S?  7)" +"(  L$ S?;izz z +zk + ;8  + + S?Lw'7 S?La'& "` S?La' +"6L]'   LV' 8 8 ȷ  ?ȗ + +" b Lx&       :   L&8    ;izz z +zk +ZZZ +  46 +"b:LL) +i6"^8  L=)U+ +i"x:LL) +iC"^ E :#:L=)L=)L=)  L=))):%:L=) +iF"^:L=)H):r +iI"^:Z +iK"^ɀ$ +iX"iN +"^:Uzzzz +zk;8 +  9 )+3P57-P/1L*""H"^huF"vHd"gbhd"yHH"^hh 9 " ;i"@~ "d";i +k{ + +eH + +eh + +{ + +{ + +eH@ + +eh + +{ + +@L) + ;8 + # :';i"L, : Ч) + L, +   ? _ * M;i" ;i "  L, L,L,   ?   ?  * :H  ",+h4  ) ;i" L+;izz z +zk"c"6Y"?"ރ"Z""]    "_"z ""\H";i +"b{ +"" +""x=""&a"hw""""~ """F""ё""&]""g:H"h ""N:$"F "k + ZZZ  +  / : \ (   + : / L0 \ L0 +  & + "KLS0;i "n "+ 8* L0 +  7 )zzzzz z +zk +i8H7 he +" + L/LK/ + [𫫘;8 + +d" H d"dh8 "i  "i  "i  "i  "i  "i  +"i  :0 :        "i  +"i                   :     #   ;i ++z +zk [𫫘ZZ"mY"tY:L3L[3 Ld4f"RF:#.'"+/ +3LB4Ld4"7R;F?:C.G"KO +SwLd4"WR[F_:c.g"ko +s  zz+k +;8r +;i;i"fLX6? A;i?". +j LO6i  EJL5][ " +EL5  + x  +;i "KD;i "*e  h;i?"<, +&;i? +"  " ;irz +zk + ;8 8PILP88PI0-;iH"Hlhh;izz z +zk c  ":L7;iH"Hlhh8PI0L$H8"Hlh$$ H"Hlhh&;ic )"$\:&;ic  $;ic . ":"Hl)H"HlhL6;ic L6 + ;8  +7)Le:LC:LV:  LV: + ".)LA:; +"W:LA: ***)  v ) +)Ȉ +&e?# )ʪeHeh +Ȉ +&  L>:## **) e# +e  + ***) ) ) + +e#) + +)eH)8 hȈ +&   +"Ќ: +"k;izz z +zk + ;8"Y  +  L'<;"?Z"Nm"Y - "Y +  "Y  "Y"Y  ;"?Z">S?L<">[ʆ"& ">[ʆ"& +;i )"8:y  +]  + 8PI0E +"F[ʆ"k`eHeh"Y"Y +LH;"S? - II +    5  "Y  +"Y"Y  +;izz z +zk + ZZZZ +;i +"L>)L>7)L> L>: + +"  +L= +"db  % E  > & + "   @ j [ +i&   ":fh  7    +zzzzzz z +zk + ;8F +TR ;i;"fL? +L?;i"KL?;i"*e L? C1/c)   +c    +e : +e ţ   L@ L@&$"b_      'd Ci8c"  ;iFzz z +zk + ;8  +8 +PILB  LB [ LB):8PILB +):e  "d ?  "LB"d ? M?"de + +;i "}ZLBLpA +c  )"\:I +;ie +"d)80eH +;i eh ; L"A ";izz z +zk +;ieL@ +;8  +:LD +H`;iH]"LGhh0?"Hl"R_?]"ڮhhhک"HlhZ;iHL"LGhh0= "Hl"R_?L"ڮhhhکf"HlhL E;iH;"LGhh0? "Hl"R_?;"ڮhhhکA"HlhZ;iH*"LGhh0= "Hl"R_?*"ڮhhhک"HlhL E"lHn"Hlhh +J >  1)'"R_?d"hh"Hl?"Hl;i z +zk + ;8 + + "oLE:d&#eHehJ)  II! #i0  JJJJ9  c      :;ic    А;ic ~ S +c : +c"Z::    '   ;ic)  +c  ;iz z +zk +  [𫫘;8, +;i;  +"-8PILmH;i +"LdH     8PIL;i-c i c  i c)LrI"[LrI;i "j + +l[j[;i ",;i ;i"j;i",;i  +")u:(;i +")u: LG      + +l[j[ i "j;i,+zz z +zk +;8    "ā  ) LJ  + 8 +PILJ +A% " +."u +";h0;"}Z"# +"F9 +"F;iz +zk "d  LK   "de"/i:f "de "de"ā + +   +LJ + ;8   +  LN )LN   +  "  .,Z ȈFjdLN, .  LM + Ȉ +&   g "db%LN3#8 H h  LN +"ڎ       _ ȈFj eH eh  +i8H%he  ;i zz z +zkZZ"j8PILfP8PILVP8PIL P8 +PILsO˩"c s"c R"c ;i *Y.Y02z@cy "H,.}$&R^(*"zzk "d   "de8PIL|N "dec "l09H"h"~ڣH"hhLcN d% LKN ' L9N +;8 ;i"W;i ;i"f:LR / 1;i/". +ZLRMK;i "o;i/;ic4"o ;ic".: 7k9m?s AuLR;ic"pLR +;i +i "o    7)     7)LRk7 m9LR +  "  "ڎ X  "b iX1 . $  mk"h   : ;i/"<:  " ;iz +zk +;8  +"z4;i{H"< ;i s  LWUt E LWUu L LWUv F LWU= + +=H;H=H;Hz;i"hhhhLZULZULZU   ßLGU "dcHHc"z ;iH"< ;i  L3U  +H`LZULZUHH"zHHHH"< ;i û㽰8㷅Hc"_n dcHch c d c    LS;iz +zk +;8 + i  LW )LWN ȈFj dLWLW ȈFj  +:d%%LW +"dbLW%LW LtWLW +"+LWCLW#LW "7:o "ڎ   i8H#he;iz +zk + ;8   LZZ   +    + : ʣ : p 0 7 9 (    +)808PI + LZZ / LSZ / ߩ + + +l[j[  +  + + +  + + + +   +   a !z  8      a !z  8       + + +  L)Y   / + 8PILY8PI + );izz z +zk +  [𫫘;8T +;ic 8PI0L\;i +"L\ L\ +;i?"j4;i?",;i?H;iG;i"!hhhhL\;iU)|;i;iU";i":';iU;i?"j%;i?;i "Le[;i "Hk""FL\9;igHH;i ;iC "IhhI"6;igHH;i  + "Ihh;iT+zz z +zk;ic LZ +;8V ;i;i"f:L_#% ;i#".: +N L_;i"+ + +E +% + "% L^ +"7L^ i8 "_n .8  C iN "i8 +"hi8iX "o .Y +-iX"h  ;i#"prA?i "A? +"hA?    " ";i +" ;iVz +zk +Z `   L`Jsuu +s"}ZJJoqq +o"}Zkmm +k"}Zgii +g"}Zcee +c"}Z _aa +_"}Z@[]] +["}ZWYY +W"}Z ` a   Lag J0SU&g U +S"}ZCEE +C"}Z ?AA +?"}Z@;== +;"}Z799 +7"}Z a b   L\bJ355 +3"}ZJJ/11 +/"}ZJJ+-- ++"}ZJJ+-) +'"}Z b zz +zk + ;8  +  Le  Le    Lc  Lc  Ld ȈFj +(cH*ch"b:  Ld +i8H + +)he"%H%hLd +*(  ȈF j eHeh"b:  Ld +i8H +)he"^Ld Jc +*(H J)he"b:  Ld +i8#e) +*(H J)he"b: + Mi8#e)) ))JJJJ;iz z +zk + ;8 +  +         Lg +  "bLg  + + Lg  ? 7   + L|g + . L|g#   L|g  LDg +@Z   # +    ,  .     +     M   2   ":):     P    "w  , . J    "iU   Lxe  ;i +zz z +zk + ZZZZ  + '"Z  +   Lj   +".  L9j +".  Lpi;i +"  Lmi ɪ Lmi@ +".)e_ +:".)A;i +"@    "Z:LhL%j +".          +".)/ +".)  "Z: '  )     +"k )zzzzzz z +zk;i +":   L7h;8&!!06#!c'o#8!6'o#:!c#:8!06!c%o! 8 #6%o!:c!: 8 #"d%"d8%"d!"de8%  Lmw"d8%U%c  cԣc @ c +` #c!w"d8%U%c cԣc @ c +` #c;i&k%c%cc8#cc8# c  Lk#c#c @  @  `  ` #c;8X;i ;i"f:Lp ;i "_n Ln;i"  "Y"z LnS "y_y   +X &;ic  ;ic LmLp Lp%:;ie :ף % '-/;i%"KLp;i%"*eY;iCA "oCA    " LpLpL{p;i%"7i CA"_nCA  ;iCA "o    " ;iXk + ;8  + +7 )Ls  +e:Ls i ;i  "oJLq @+ dFH H;i i "Ehh "*dLsLs + LEqJJ  c " "7Lr:Lr   H + + + + +h8"KLr i "w   +  "b[H   "h  "iU  : ЂLs +  "bk   "_n i   "o+7 H  h  ;izz z +zkLp +;8*    " + + +LvLv +HH "<hhh 8 PI0LAv&("$8 PIF&(PIg +c;i c (&("$Luv"$Lv&(PIM$"Ȉ +&H +c)henC&($H$h +c  "$(&&("$Lt  + E ;LWt +  +";i*z +zk;8b "z"s ;iH"z HH"| H"x;i"m   HH"Ps"n  HH"Ps"nH#H"Ps;i"nHH"Ps"n  HH"Ps;ij?"O"nhhLx"nhhLx"nhhLx""nhhqA"nhh\n"nhhG"nhh-"nhh|"nhh  HH"Pshh"nhhY   HH"Ps}?H?H;i" ;iH"n;i  R   HH"Ps?Hi;i";iH"n;i +   HH"Ps"n HH"Ps"n;i + ;8 +  L)}L)}  L{  L>{  L#}ȈFj +(cH*ch"bL#} )  +i8H + +)he")  +i8H + +)he"  L#} +*( ȈF j eHeh"bL#} +i8H +)he "e  L#}Jc +*(HJ)he"bL#} +i8H#he ) +  ') + + + +     +*(HJ)he"by +i8H#he)')# ) FjFjFjFj   ;izz z +zkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkH)hkH @hkڢkڢ" ~k"~"~"~k"~"~"~\~"*~"}"}"a}"}"*~"*~"*~"C} "n}"*~k8k"}"}"~k"~"}" ~" ~" ~"}"}k"}"}"}"*~"}\~\}"~\~k, H"~hk"~"}" ~"},"}N" ~" ~ڢ"}" ~J"}"}" ~" ~"}" ~"}"}"}k"}"}"} +"} i0"}" ~" ~" ~8kڢ"}"}"}j" ~"}" ~" ~" ~" ~, kx0":~(k(kx0 @"~"q~(kx0"~"}"}"}"}(kx0 "~"q~(kx0"~"}(kx0_"}"~~(kx0?"~"~~(kx0"G()k0(k(kx0, H"~h(kx0"}"*~"}(k + ;8  + +"KLɃ   ,.   "bLǃ Lǃ? 7   Ls   Ls  Lӂ@+7)L @Z  #   ,.         U  :   ": ):          La  !"w Lǃ+7)0 +i  "x:Lǃ  ,.     (  ,.    +"iU    L;i zz z +zk + [𫫘ZZZZ +&"@$  ))*(,. " $Li +AH`8LyLyPà|@j耠XaF N47"pF"LyLy^LySLyLy |jtXF}4~"L(9 + +Q +Q  + L~D+ + 4 + " +  + V:@)w + 4 + " +  + zzzz+z +zk +;84;i!;"fL6><!##!8ʆ#!&#!L4#!  LA!%#' +;i%"db%  +L3E  +i + + + #!Lz L#!#!*(   +  I  #! "b   + L抣     #!  8#!i8c"^: + +  + W#!i8c") + +c # : +     L  >#!#!  ;i4z +zk + ;8X  + "X"k +;i P" ;i ;iH;i "hhL"Z" J?(4Q)G | "X"t;iH;i "hhL"Zʆ" ;iH;i "hhL"ZʆE +EL;iH;i " +hh +L +"/i: L_ +"/i: {( +"/i: P- +"/i: (%V +"/i:08 "XH"ghLO +"LI"q "[H"E"/" ";iXzz z +zk + ;8   R    + +_ "db L%L  L +  LL> +L> +   "dbEL7%L7h  "   + +  L + L  ii  '   L + + +"db?E'%  + L +LgL +  +"z'! + "ze +   8ʆ    :     +=;izz z +zkZ8PI0L9HV"dh>>V"de>V"de>V"de + + >V"de>V"de>V"de>V"de>V"de >V"de""$$>V"de6688>V"de::<<>V"de&&((>V"de**,,>V"de..00>V"de2244>V"de>>@@>V"deBBDD>V"deFFHH>V"deJJLL>V"deNNPP>V"deRRTTzzk + ;8 + &$;i +"  L)  L7)L8 Hhd +  L77L ȈFj +:d%%z + +"db  L%  L"ڎ  LcJ)L# +c +8H   "fh  L X8Hhd2 +i&8 +) e"o +) LE L⚠ W +i&  ":fh  L 7  +i&  "fh  L78 + +i&H7he  "o 8 &$ g c c   L ;izz z +zk + ;8"  H;i"bhLM ?"    O )"&")"& +         "_ni") +  + + L +L + L + +ed`dC5 d"&"k`  +cHc +h % +cHc +h + +8H" +hL i +" i " .  +")"&)"& + +")"&)"&   +")"&   +JJ))  + +cHch:")"&)"& + +cHch:")"&)"&  +cHch:")"&   +JJ))  +  i  + +cHch + + LϜiU"e":fh;i"zz z +zk + ;8b  + ;i;i"fL;i/ ;i7 ;i7LB;i/ "KLB;iG"bLB;iK"H;i;h;i/"KLB;i/"*eV;iK" ;i/"iU LB;i;i/"-;i/c)L6  y :::;i/cc  £:c /  LLL餣 " :c /  ) + +l[j[  c )Lݤ LJ + + /    H c   +  Z    +c       L +  + ;ibzz z +zk +;8|"\8ʆPP8 +ʆPP8ʆ +" +g? p Js?g?g?     +s?    +s?   +s?  +s?g?g?"3 ";t "y;i    8PIL"jc"nHR""H H*HuN"dd"""D"4;iH"z ;i "Hl 8g?PIL8 PI0L!( "Hl8g?PIm +i?X +s?"lHH ;i3";i3"]H;i5H"Y ;i ;i-";i-"]H;i/H"Yhhh"Di +"D +PIO"aC"ii +,8PI: +i?: +s? + +;ie"B;i|z +zk +i? +s?" + +;ie +s?" :L٩"3Z +i? 8 +s?"lHA "Hlhh +s? + +;ie   Ln( 0 ( JJ 4 L + ;8 + &$;i +"  L)  L7)Lc8  L77L$ ȈFj +:%L , + +"+ +"+ @ LE  L%  L + + W +i&  ":fh  L 7 "ڎ  LcJ)L +c +8H   ":fh  L8Hhd?8 +) e +i&"o 7  +) L Z D +i&  "fh  L78 +   +i&H7he"o   8 &$ g c c      L画;izz z +zk + ;8 +  L<,.7Lְ  +  +e:L   +  +e!ؐ L¯8ic + d + "5 c L¯ie  Lc) +  5 .i c . i c  L簣i c )L|-ic ? B    i c)Zie  ) L|i c).     A@Z9 ))%: cic    L>? 7  i"Hhi"^i"^;izz z +zk + ;8  +;i +")   L  %7)       L + Ȉ +&L :"& :"& x::II%%8 HhL +` +"+E  L%  L +  L      L8 HhcHch7)C +"+L緣 +"db%  L9!  L  LcHch)b"ڎ  L ȈFjeHeh !  @ 77L L U +i&  ":fh  _ 7  +i&  "fh   ;izz z +zk + ;8N   +  + Lx ?# ;i;i "fLa ;i".DL&8;i"p   !  +  LL"% 86i "86i "86" 86 86"h86i"  L +64;i " 9"b :Hh  ) JJ J  W @    46 6"8$    LW86" +86i"     +i&"_n LM LM  + Ȉ +& +  + + x n +"db + + # +  8Hh + LC )LC"ڎ } ȈFjeHeh +i&  "fh  ;iNzz z +zk + ;8 +    .  + +"l%     Lqģ  +"1 +"s -    +  +  "lLh£"lLh£& f LA8"¼@""g""u c8 PI0 d LN£"lL*£"u8"¼@""g" + +"uc8PI0\c8 PIK8PI  +H"¼h"d +   "  LQģ - $           "¼ + +""_"5 +"A"s  0cH  h  :  88PI0L£& f L?ĥ & $8 -  +  +"i0   +"i0        L;  ,           )Е ;izz z +zk + ;8     "W Lˊ + + + + L˥ + # )/"Y  J   +L˩L  "Y  JL   +L˥ +";Lˣ Lˠ64 +iC"^ L˥ +iN"^# +i\" " H      Lˠ)"k` +E) + +:Lˠ +: +7:L˥ +iI"^7: L˥ +iK"^# +iX" +iF"^  Lˣ +c JJJJeHeh   L8 Hh +"& L˩    L˦i$&c (* cHch02e +ib"^: Lˠ: L˥ +id",.&&Lʠ: L(cH*c h,.G"k`Fj77eHeh&i ȈFj " L˩  Ll˥ +ih"^Ll˥ +"b:Ll   +i6"^ULl˥ +i8"RRkaAd +i"rrEAa> +i " +i$"    ;izz z +zk +;8B57 1" + + +Lӣ-/) + % '!#  1L +HH"<hhh383PI0Lsө-/))++%'!!## 9? A;=%%83PI0?-/))++%'!!##9 ?A ;=Ḷ)+LΥ +c% Z /    F +c% z d    !#  LөLӣLϣ?ALϣ! # d" +c%))#H#hHHX "hh  Lϥ +c%)#H#hHH> "hh  Lϥ +c%)Ȉ +&#H#h  5 +c%)     L0ң?ALѣ;=Lѣ 8?HCh" +c%))Hh92,75!#7H7H"hhHH} "hh Lѥ +c%)Hh92,75!#7H7H_"hhHHe "hh Lѥ +c%)Ȉ +&Hh 5#H#h +c%)    u8;H?hC  +c%     ! # L;cH?ch8        9 ?A ;=%+)!#!)#+!# 9? A;=%L̩ "1;iBz +zk + ;8   + ;i" %Lۥ)H + + e h   f/_\Xɀ"y_Lۣ Lۣ   + +eLӣ    f / Lۣ \ L            + : +e.I LG֥ + : +e.LG֥ + :: +e.LG֣ +e , Hi eh Lۊ  .i e   2 +: +e . :ʦ + +eL۩  + +e Lۣ % + +e. +     ' +: +e. :բ i  "_n  )       + +e  L(ڣ Ldۣ.  Ldۣ L٣ L٣ɀK  "z#:#)    } :.      Lۣ   i c     L٣LU٩"y_{AZ     a'z  8        $_         i c     Lۣ    4       L.      + +     # #  +     JJNJ              + ;iz z +zk  + +     '         Lף  L֣L + ;8   ;iO"m;i +    Lߣ % ;iO"o L + +      0 0 0     " O - %         "  * . +   %  n +   0 D9  9 +"d)e80      +%   . L    * 4 +     s   0 D9  9 +"d)e80      +     +   l d    l '            %;iO"Ҋ;izz z +zk!)"Li + + ;c)L0 +# :#%;iO""oԣ +)/:"  ;iO"oʣ%;iO "oإ  + +LLߩEL +7;iO"o L # :Gi + + -+)'L# :L d EiGiʃL d 7;ʃ + + -+)' d L-H;i;i'8  -+)' ;i;i;i +"B  ;i;i;i +"?  3 x  'c      #0cH;i1ch # # L'#:&##;i/c - ##:#%;iO""oԣ:;iO;i/c"oң%;iO "oإ  + +LiH +;i1"h;i/"] +# :# +%;iO""o + +ԩ;i/c)6 +%;iO "oإ J;iO;i/c"o;iO"o  L  + ;88"YDF HJ "_Y "XY  L % L "_Y "XY    % L  +  +) '+@a5  )"+"Y6+"Y'++"Y "Y )L+L 0 {9 p 80  #+-' + + +c)c"Y+ )L) + + +c)c+"Y L * L#+3 +  +)L + + 8  ' L . .#+;i8zz z +zk+"YL z  t  . "Y+L l h   j +#"Ye l *#+ ++#"Y3 h L#+ ++#"Y )'"_Y "XY   +   +)'"$ &   L& p :#&"$ + & +)'ǩ & E G & & e 7g & ,"WZ"Y% L &  S L c Lb: s L& d L=: i L=# &"WZ"Y L # # )   # "$ M &)"#  +"Y L$""_Y $""XY  V ;  # @ LHh HH"Y"_hhL"Y%# `  "Y #   $;"cZ "kH;i/h8  #    L0"Y%H"KZh"}Z"Y&)H"KZh"}Z"$ L# "WZiNʆ# (# +I)8ʆ# "8  +  #   % +;"cZ "kH;i/h8  "$    #NJ + )8PI)  # @# #      # c):;i-e 0 #  %   @#     "#     # L# E) )8PI "Zc      +    )8PI' "Y H"KZh"}Z  ȣ     )8PI0  "Z # Q "Y0H"KZh"}Z@# .  # xX"YH"KZh"}Z  [# N #  +  #  -  "Y )H"KZh"}Z  )8PI#"Y0H"KZh"}Z:    = : "Y );i-e)H"KZh"}Z    L - ;"cZ ]"WZ"Y   #  "b  # 1  "Y H"KZh"}Z : ۣ    L  "Y)H"KZh"}Z: :  "$ "Y H"KZh"}Z:ݣ LR    "Y)H"KZh"}Z LT @!#%')+-/7:=@CFILORUX[^a@@0 PiYG pbkQD!Z 6_1aB +6b1\'''''''''######''# ##'# '# '# ##'## ##'''# #''''''''''######## ########'''''''''''##'# ''''''''######## ''''''''######## gcJ''##'; #''# '''# ### ### '''# '#                                                                      gcJ gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; ; #' #''' ### ### #''' #''''''''''######'## #' #' #'## #''## ##'''# #'''# '##'' ########''''''''gcJ; ########'''''''' #'##''''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #'''# #'''## ##''# ##'# '# '# ##'## ##'''# #''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''## ##'''# #''''# #'''## ##''# ##'# '# '# ##'######'''''''''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''######'''''''''1`J > + PH +N 2"RA n c 6t^e|gk + ;8N +;i"W L: + + + + G  G"Y  JL: +L: + +3 +CECEH;iEI"bhCE(CEEC:E%C% +CEH' 4   " ) 52$HJJJJJJh":  "8:77 +H"&H"7979L:\ +Z +L:JLJ +L H;iLI"bhL:4??JL!?8JJLL +  + + +? A +? AJɀLL: +  + 4JJ4J   4JL:   "%cJHcNh$&  +; ==;  L|LHLhZJ h  +$= +$d + '&LJ"&(**(&& +  +i + i Hd +e + e +:H"& + (*7(*+    +, .(*LpL:LNLJ ȈFj +  += +d + '&LJ"& +  + .  +& + +i  <   +"k`Fji  cH:H"& + "Ȉ +&H"&    +, .(*?cHCch.,5"k`cHchc(Hc,h020cCH4cGh + +:EC:II%%80H4h  9cHch + cc + ,,..L5"&F: + iiii +  +  + 5"&c,Hc0h + ,. &&&& + 0c +H4ch + 8 +?HChJLL:8JHNhH209"k`h8Hh8(H,h "& +   - + !;=Ff   L} L:  L + r;=& &@ &  p4JJ   =; P;= &  +  0L: + 7;=+ &    ;=LPL:   + L:H +"_n + "o +i H"e   +i"e 5   +"  +i"eJL +iJ"e +i LJ"   +i?"e +i"e +iA?"  L  +iC&$" +i$.," +i," +i0"e +i2"e @ )B :  +iG"of +i'&$" +i,"e $ )& &  +i+"o +iU"eCA +I":fhL:  LH CAi +I":fhH +"_n +RRaA" +irrAa" +i +:" +i" +iU"eCAi +I":fhCA +I":fh7H"d +"_n +  + 5L8  ( +* + +  + + + + + + 79 + + + 7 +9 + + + H +I":fhL:cHch + 8Hh + L      ZJL   4          49JL H +;iI"hL:HI"bhL:L:  H +" +i" +i"A   + + +  + + +  + +", +. + 79 + + + 7 +9 + + + H +I":fh;iNzz z +zkH +"_ncHch + 8Hh + L + L{ \\&]\>]\\\=}\ۂ\2\2o\}\ރ\\<\\\Y\|\\z\3\T\L\\s\\\\}\p\7\\;\\>\q\\F\\=|\\8\\p\oZ\c \LG\\\re\D\0\\a\c\c\ڮ\fr\;t\y\r\Ps\s\Ez\z\|\o\x\ p\\υ\s\Vx\\n\`\j\i\_\\=\J\\\\\\\\-\z0HZ +  + [dH"_+z +zzz z +zzzzzzh@0HZ +  + [dH"X+z +zzz z +zzzzzzh@8[dH\qP \ No newline at end of file diff --git a/src/toolbox.c b/src/toolbox.c index b369fb5..2eb3de5 100644 --- a/src/toolbox.c +++ b/src/toolbox.c @@ -43,13 +43,14 @@ #include "syscalls.h" #include "timers.h" #include "boot.h" -#include "dev/bitmap.h" #include "memory.h" #include "dev/block.h" #include "dev/channel.h" #include "dev/console.h" #include "dev/dma.h" +#if HAS_FLOPPY #include "dev/fdc.h" +#endif #include "dev/fsys.h" #include "dev/iec.h" #include "iecll.h" @@ -65,7 +66,6 @@ #include "vicky_general.h" #include "fatfs/ff.h" #include "rsrc/font/MSX_CP437_8x8.h" -#include "rsrc/bitmaps/splash_c256_u.h" const char* VolumeStr[FF_VOLUMES] = { "sd0", "sd1" }; @@ -90,7 +90,7 @@ void initialize() { sys_get_information(&info); /* Initialize the memory system */ - mem_init(0x3d0000); + mem_init(); // /* Hide the mouse */ // mouse_set_visible(0); @@ -133,9 +133,7 @@ void initialize() { INFO("Text system initialized."); -// // Initialize the bitmap system -// bm_init(); -// INFO("Bitmap system initialized..."); + INFO1("Top of memory: %lx", mem_get_ramtop()); /* Initialize the indicators */ ind_init(); @@ -257,219 +255,6 @@ void initialize() { } } -t_file_info dir; -uint8_t buffer[512]; - -void dump(uint8_t * buffer, int count) { - char char_buffer[17]; - - printf("\n"); - - short index = 0; - for (int i = 0; i < count; i++) { - if ((i > 0) && (i % 16 == 0)) { - index = 0; - char_buffer[16] = 0; - printf(" %s\n", char_buffer); - } else if (i > 0) { - char c = buffer[i]; - printf("%02X ", c); - - if (isalpha(c) || isdigit(c)) { - char_buffer[index++] = c; - } else { - char_buffer[index++] = '.'; - } - } - } - - printf(" %s\n", char_buffer); -} - -union fatfs_date_u { - struct { - unsigned int day : 5; - unsigned int month : 4; - unsigned int year : 7; - } s; - short date; -}; - -union fatfs_time_u { - struct { - unsigned int second : 5; - unsigned int minute : 6; - unsigned int hour : 5; - } s; - short time; -}; - -void print_fatfs_datetime(short date, short time) { - union fatfs_date_u fat_date; - union fatfs_time_u fat_time; - - fat_date.date = date; - fat_time.time = time; - - printf("%04d-%02d-%02d %02d:%02d ", fat_date.s.year + 1980, fat_date.s.month, fat_date.s.day, fat_time.s.hour, fat_time.s.minute); -} - -void print_directory() { - printf("\nDirectory for /sd0/\n"); - short fd = fsys_opendir("/sd0/"); - if (fd > -1) { - INFO("fsys_opendir"); - - short result = fsys_readdir(fd, &dir); - while ((result == 0) && (dir.name[0] != 0)) { - if (dir.name[0] == 0) { - break; - } else { - if ((dir.attributes & FSYS_AM_SYS) == 0) { - print_fatfs_datetime(dir.date, dir.time); - printf(" %4ld ", dir.size); - - if (dir.attributes & FSYS_AM_DIR) { - printf(" %s/\n", dir.name); - } else { - printf(" %s\n", dir.name); - } - } - - result = fsys_readdir(fd, &dir); - } - } - - fsys_closedir(fd); - INFO("fsys_closedir"); - } else { - ERROR1("Could not open directory %d", fd); - } -} - -void create_sample_file(const char * path) { - printf("\nTrying to create: %s\n", path); - short fd = fsys_open(path, FSYS_CREATE_ALWAYS | FSYS_WRITE); - if (fd > 0) { - char message[80]; - printf("Got channel #%d\n", fd); - sprintf(message, "Hello, world!\n"); - short result = chan_write(fd, (uint8_t *)message, strlen(message)); - printf("Wrote %d characters.\n", result); - fsys_close(fd); - - } else { - printf("Could not create file: %d\n", fd); - } -} - -void read_sample_file(const char * path) { - printf("\nContents of %s:\n", path); - short fd = fsys_open(path, FSYS_READ); - if (fd >= 0) { - short c = 0; - short status; - do { - c = chan_read_b(fd); - chan_write_b(0, (uint8_t)c); - status = chan_status(fd); - } while ((status & CDEV_STAT_EOF) == 0); - chan_close(fd); - - } else { - printf("Could not open file: %d\n", fd); - } -} - -void test_sdc() { - print_directory(); - - printf("\nfsys_rename(\"/sd0/hello.txt\", \"/sd0/renamed.txt\")"); - fsys_rename("/sd0/hello.txt", "/sd0/renamed.txt"); - print_directory(); - - printf("\nfsys_delete(\"/sd0/renamed.txt\")"); - fsys_delete("/sd0/renamed.txt"); - print_directory(); - - printf("\nCreating /sd0/hello.txt\n"); - create_sample_file("/sd0/hello.txt"); - print_directory(); - - read_sample_file("/sd0/test.txt"); - read_sample_file("/sd0/hello.txt"); -} - -void test_kbd_sc() { - printf("> "); - do { - unsigned short scancode = kbd_get_scancode(); - if (scancode != 0) { - printf("%04X ", scancode); - } - } while (!kbd_break()); - printf("\n\n"); -} - -void test_kbd() { - printf("Keyboard test... press RUN/STOP or CTRL-C for boot:\n"); - printf("> "); - do { - char c = kbd_getc(); - if (c != 0) { - txt_put(0, c); - } - } while (!kbd_break()); - printf("\n\n"); -} - -void test_psg() { - long target_time = rtc_get_jiffies() + (long)(60 * 2); - - psg_tone(3, 0, 262); - psg_tone(3, 1, 262 * 2); - psg_tone(3, 2, 262 * 4); - - psg_attenuation(3, 0, 0); - psg_attenuation(3, 1, 15); - psg_attenuation(3, 2, 15); - - while (target_time > rtc_get_jiffies()) { - ; - } - - psg_attenuation(3, 0, 15); - psg_attenuation(3, 1, 15); - psg_attenuation(3, 2, 15); -} - -void test_sysinfo() { - // 8 x 22 region - t_rect region; - region.size.height = 8; - region.size.width = 23; - region.origin.x = 80 - region.size.width; - region.origin.y = 60 - region.size.height; - - txt_set_region(0, ®ion); - - printf("Foenix Retro Systems\n"); - printf("Model %s\n", info.model_name); - printf("CPU %s\n", info.cpu_name); - printf("Clock %lu MHz\n", info.cpu_clock_khz / (long)1000); - printf("Memory %d KB\n", (int)(info.system_ram_size / ((long)1024 * (long)1024))); - printf("FPGA %04X %04X.%04X\n", info.fpga_model, info.fpga_version, info.fpga_subver); - printf("Toolbox v%d.%02d.%04d\n", info.mcp_version, info.sub_model, info.mcp_build); - - region.size.width = 0; - region.size.height = 0; - region.origin.x = 0; - region.origin.y = 0; - - txt_set_region(0, ®ion); - txt_set_xy(0, 0, 0); -} - int main(int argc, char * argv[]) { short result; short i; @@ -479,8 +264,6 @@ int main(int argc, char * argv[]) { kbd_init(); - test_sysinfo(); - // test_kbd(); boot_screen(); #ifdef _CALYPSI_MCP_DEBUGGER diff --git a/src/toolbox.csv b/src/toolbox.csv index f654ac5..9f2c660 100644 --- a/src/toolbox.csv +++ b/src/toolbox.csv @@ -15,5 +15,4 @@ "2E","toolbox-2E.bin" "2F","toolbox-2F.bin" "30","toolbox-30.bin" -"31","toolbox-31.bin" "3F","toolbox-3F.bin" diff --git a/src/version.h b/src/version.h index 3e24124..1427225 100644 --- a/src/version.h +++ b/src/version.h @@ -6,7 +6,7 @@ #define __VERSION_H #define VER_MAJOR 1 -#define VER_MINOR 0 -#define VER_BUILD 33 +#define VER_MINOR 1 +#define VER_BUILD 3 #endif diff --git a/toolbox-roms-v1-00-0032.zip b/toolbox-roms-v1-00-0032.zip deleted file mode 100644 index df42a5b..0000000 Binary files a/toolbox-roms-v1-00-0032.zip and /dev/null differ diff --git a/toolbox-roms-v1-00-0033.zip b/toolbox-roms-v1-00-0033.zip deleted file mode 100644 index b4149b5..0000000 Binary files a/toolbox-roms-v1-00-0033.zip and /dev/null differ