From cc29260a2881b8aa8e155089ba384aa453c75903 Mon Sep 17 00:00:00 2001 From: Peter Weingartner Date: Sun, 13 Oct 2024 16:14:05 -0400 Subject: [PATCH] Corrected a few public functions --- client-64tass/bindings.s | 100 +- client-64tass/genbindings.py | 4 +- client/src/include/toolbox.h | 20 +- client/src/stubs.lst | 603 +++++++++++ roms/f256k/toolbox-20.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-22.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-23.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-24.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-25.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-26.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-27.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-28.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-29.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-2A.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-2B.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-2C.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-2D.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-2E.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-2F.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-30.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox-3F.bin | Bin 8192 -> 8192 bytes roms/f256k/toolbox.bin | 1985 +++++++++++++++++----------------- samples/hello/Makefile | 68 -- samples/hello/f256-plain.scm | 19 - samples/hello/header.s | 10 - samples/hello/hello.c | 10 - samples/hello/macros.h | 86 -- samples/hello/ram-startup.s | 134 --- src/C256/addresses.csv | 127 ++- src/C256/genaddresses.py | 3 + src/C256/gentables.py | 19 +- src/C256/jumptable.s | 13 +- src/C256/syscalls.txt | 15 +- src/dev/channel.h | 38 - src/dev/interrupts_c256.c | 15 + src/dev/interrupts_f256.c | 15 + src/dev/kbd_f256k.c | 2 +- src/dev/kbd_f256k.h | 2 +- src/include/sys_types.h | 41 +- src/interrupt.h | 4 +- src/version.h | 2 +- 41 files changed, 1818 insertions(+), 1517 deletions(-) create mode 100644 client/src/stubs.lst delete mode 100644 samples/hello/Makefile delete mode 100644 samples/hello/f256-plain.scm delete mode 100644 samples/hello/header.s delete mode 100644 samples/hello/hello.c delete mode 100644 samples/hello/macros.h delete mode 100644 samples/hello/ram-startup.s diff --git a/client-64tass/bindings.s b/client-64tass/bindings.s index 14b2789..543ead5 100644 --- a/client-64tass/bindings.s +++ b/client-64tass/bindings.s @@ -1,12 +1,12 @@ ; -; extern SYSTEMCALL void sys_exit(short result); +; extern SYSTEMCALL void sys_proc_exit(short result); ; ; result goes in A[15..0] ; ; 0 bytes needed for the stack parameters ; -sys_exit = $000000 +sys_proc_exit = $ffe000 ; @@ -54,7 +54,7 @@ sys_int_enable = $ffe010 ; sys_int_register = $ffe014 -int_register .namespace +int_register .namespace .virtual 1,s handler .dword ? ; pointer to the interrupt handler to register .endv @@ -109,7 +109,7 @@ sys_chan_read_b = $ffe024 ; sys_chan_read = $ffe028 -chan_read .namespace +chan_read .namespace .virtual 1,s buffer .dword ? ; the buffer into which to copy the channel data size .word ? ; the size of the buffer. @@ -125,7 +125,7 @@ size .word ? ; the size of the buffer. ; sys_chan_readline = $ffe02c -chan_readline .namespace +chan_readline .namespace .virtual 1,s buffer .dword ? ; the buffer into which to copy the channel data size .word ? ; the size of the buffer @@ -141,7 +141,7 @@ size .word ? ; the size of the buffer ; sys_chan_write_b = $ffe030 -chan_write_b .namespace +chan_write_b .namespace .virtual 1,s b .byte ? ; the byte to write .endv @@ -156,7 +156,7 @@ b .byte ? ; the byte to write ; sys_chan_write = $ffe034 -chan_write .namespace +chan_write .namespace .virtual 1,s buffer .dword ? ; size .word ? ; @@ -192,7 +192,7 @@ sys_chan_flush = $ffe03c ; sys_chan_seek = $ffe040 -chan_seek .namespace +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 @@ -208,7 +208,7 @@ base .word ? ; whether the position is absolute or relative to ; sys_chan_ioctrl = $ffe044 -chan_ioctrl .namespace +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 @@ -225,7 +225,7 @@ size .word ? ; the size of the buffer ; sys_chan_open = $ffe048 -chan_open .namespace +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) @@ -251,7 +251,7 @@ sys_chan_close = $ffe04c ; sys_chan_swap = $ffe050 -chan_swap .namespace +chan_swap .namespace .virtual 1,s channel2 .word ? ; the ID of the other channel .endv @@ -296,7 +296,7 @@ sys_bdev_register = $ffe05c ; sys_bdev_read = $ffe060 -bdev_read .namespace +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 @@ -313,7 +313,7 @@ size .word ? ; the size of the buffer. ; sys_bdev_write = $ffe064 -bdev_write .namespace +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 @@ -350,7 +350,7 @@ sys_bdev_flush = $ffe06c ; sys_bdev_ioctrl = $ffe070 -bdev_ioctrl .namespace +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 @@ -367,7 +367,7 @@ size .word ? ; the size of the buffer ; sys_fsys_open = $ffe074 -fsys_open .namespace +fsys_open .namespace .virtual 1,s mode .word ? ; the mode (e.g. r/w/create) .endv @@ -393,26 +393,6 @@ sys_fsys_close = $ffe078 sys_fsys_opendir = $ffe07c -; -; extern SYSTEMCALL short sys_fsys_close(short fd); -; -; fd goes in A[15..0] -; -; 0 bytes needed for the stack parameters -; -sys_fsys_close = $000000 - - -; -; 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 = $000000 - - ; ; extern SYSTEMCALL short sys_fsys_closedir(short dir); ; @@ -432,7 +412,7 @@ sys_fsys_closedir = $ffe080 ; sys_fsys_readdir = $ffe084 -fsys_readdir .namespace +fsys_readdir .namespace .virtual 1,s file .dword ? ; pointer to the t_file_info structure to fill out. .endv @@ -447,7 +427,7 @@ file .dword ? ; pointer to the t_file_info structure to fill out ; sys_fsys_findfirst = $ffe088 -fsys_findfirst .namespace +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 @@ -463,7 +443,7 @@ file .dword ? ; pointer to the t_file_info structure to fill out ; sys_fsys_findnext = $ffe08c -fsys_findnext .namespace +fsys_findnext .namespace .virtual 1,s file .dword ? ; pointer to the t_file_info structure to fill out .endv @@ -478,7 +458,7 @@ file .dword ? ; pointer to the t_file_info structure to fill out ; sys_fsys_get_label = $ffe090 -fsys_get_label .namespace +fsys_get_label .namespace .virtual 1,s label .dword ? ; buffer that will hold the label... should be at least 35 bytes .endv @@ -493,7 +473,7 @@ label .dword ? ; buffer that will hold the label... should be at ; sys_fsys_set_label = $ffe094 -fsys_set_label .namespace +fsys_set_label .namespace .virtual 1,s label .dword ? ; buffer that holds the label .endv @@ -528,7 +508,7 @@ sys_fsys_delete = $ffe09c ; sys_fsys_rename = $ffe0a0 -fsys_rename .namespace +fsys_rename .namespace .virtual 1,s new_path .dword ? ; the new path for the file .endv @@ -553,7 +533,7 @@ sys_fsys_set_cwd = $ffe0a4 ; sys_fsys_get_cwd = $ffe0a8 -fsys_get_cwd .namespace +fsys_get_cwd .namespace .virtual 1,s size .word ? ; the size of the buffer in bytes .endv @@ -568,7 +548,7 @@ size .word ? ; the size of the buffer in bytes ; sys_fsys_load = $ffe0ac -fsys_load .namespace +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 @@ -584,7 +564,7 @@ start .dword ? ; pointer to the long variable to fill with the st ; sys_fsys_register_loader = $ffe0b0 -fsys_register_loader.namespace +fsys_register_loader .namespace .virtual 1,s loader .dword ? ; pointer to the file load routine to add .endv @@ -599,7 +579,7 @@ loader .dword ? ; pointer to the file load routine to add ; sys_fsys_stat = $ffe0b4 -fsys_stat .namespace +fsys_stat .namespace .virtual 1,s file .dword ? ; pointer to a file info record to fill in, if the file is found. .endv @@ -678,7 +658,7 @@ sys_kbd_layout = $ffe0d4 ; sys_proc_run = $ffe0d8 -proc_run .namespace +proc_run .namespace .virtual 1,s argc .dword ? ; the number of arguments passed argv .dword ? ; the array of string arguments @@ -694,7 +674,7 @@ argv .dword ? ; the array of string arguments ; sys_txt_set_mode = $ffe0e0 -txt_set_mode .namespace +txt_set_mode .namespace .virtual 1,s mode .word ? ; a bitfield of desired display mode options .endv @@ -709,7 +689,7 @@ mode .word ? ; a bitfield of desired display mode options ; sys_txt_set_xy = $ffe0e8 -txt_set_xy .namespace +txt_set_xy .namespace .virtual 1,s x .word ? ; the column for the cursor y .word ? ; the row for the cursor @@ -725,7 +705,7 @@ y .word ? ; the row for the cursor ; sys_txt_get_xy = $ffe0ec -txt_get_xy .namespace +txt_get_xy .namespace .virtual 1,s position .dword ? ; pointer to a t_point record to fill out .endv @@ -740,7 +720,7 @@ position .dword ? ; pointer to a t_point record to fill out ; sys_txt_get_region = $ffe0f0 -txt_get_region .namespace +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 @@ -755,7 +735,7 @@ region .dword ? ; pointer to a t_rect describing the rectangular r ; sys_txt_set_region = $ffe0f4 -txt_set_region .namespace +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 @@ -770,7 +750,7 @@ region .dword ? ; pointer to a t_rect describing the rectangular r ; sys_txt_set_color = $ffe0f8 -txt_set_color .namespace +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) @@ -786,7 +766,7 @@ background .byte ? ; the Text LUT index of the new current background ; sys_txt_get_color = $ffe0fc -txt_get_color .namespace +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) @@ -802,7 +782,7 @@ background .dword ? ; the Text LUT index of the new current background ; sys_txt_set_cursor_visible = $ffe100 -txt_set_cursor_visible.namespace +txt_set_cursor_visible .namespace .virtual 1,s is_visible .word ? ; TRUE if the cursor should be visible, FALSE (0) otherwise .endv @@ -817,7 +797,7 @@ is_visible .word ? ; TRUE if the cursor should be visible, FALSE (0) ; sys_txt_set_font = $ffe104 -txt_set_font .namespace +txt_set_font .namespace .virtual 1,s width .word ? ; width of a character in pixels height .word ? ; of a character in pixels @@ -834,7 +814,7 @@ data .dword ? ; pointer to the raw font data to be loaded ; sys_txt_get_sizes = $ffe108 -txt_get_sizes .namespace +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) @@ -850,7 +830,7 @@ pixel_size .dword ? ; the size of the screen in pixels (may be null) ; sys_txt_set_border = $ffe10c -txt_set_border .namespace +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) @@ -866,7 +846,7 @@ height .word ? ; the vertical size of one side of the border (0 - ; sys_txt_set_border_color = $ffe110 -txt_set_border_color.namespace +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) @@ -883,7 +863,7 @@ blue .byte ? ; the blue component of the color (0 - 255) ; sys_txt_put = $ffe114 -txt_put .namespace +txt_put .namespace .virtual 1,s c .byte ? ; the character to print .endv @@ -898,7 +878,7 @@ c .byte ? ; the character to print ; sys_txt_print = $ffe118 -txt_print .namespace +txt_print .namespace .virtual 1,s message .dword ? ; the ASCII Z string to print .endv diff --git a/client-64tass/genbindings.py b/client-64tass/genbindings.py index c31f9b7..4fefc50 100644 --- a/client-64tass/genbindings.py +++ b/client-64tass/genbindings.py @@ -181,7 +181,7 @@ class Function: short_name = self.name() stack_parameters = self.parameters()[1:] - output.write("{0:<16}.namespace\n".format(short_name)) + output.write("{0:<16} .namespace\n".format(short_name)) output.write(" .virtual 1,s\n") for parameter in stack_parameters: @@ -270,6 +270,8 @@ with open(sys.argv[2], "r") as addresses: 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) diff --git a/client/src/include/toolbox.h b/client/src/include/toolbox.h index 9866b4b..b8c422b 100644 --- a/client/src/include/toolbox.h +++ b/client/src/include/toolbox.h @@ -26,7 +26,7 @@ * * @param result the code to return to the kernel */ -extern SYSTEMCALL void sys_exit(short result); +extern SYSTEMCALL void sys_proc_exit(short result); /** * Enable all interrupts @@ -322,24 +322,6 @@ extern SYSTEMCALL short sys_fsys_close(short fd); */ extern SYSTEMCALL short sys_fsys_opendir(const char * path); -/** - * 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 * diff --git a/client/src/stubs.lst b/client/src/stubs.lst new file mode 100644 index 0000000..23cb937 --- /dev/null +++ b/client/src/stubs.lst @@ -0,0 +1,603 @@ +############################################################################### +# # +# 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/roms/f256k/toolbox-20.bin b/roms/f256k/toolbox-20.bin index 04572bd1ab495b75dc8a415c88385f58567bc773..3a15009dc21dce145df4e9152482e8a012ffcbc5 100644 GIT binary patch delta 860 zcmX|x_GT7oe_Loh5DnhGjEwU?-Q_X7-sfDUN^J>~`?5UyO&HPR_gzZot5WvKNh zVXHp{h5l9G{A$Dpwqba(4TF=r@$!2oZhY^CNht}RqWj*Ag4CH&im+~!CX5(W5so}p z;gOdNaC>L7a_?;RVQe;QB%Bz~kZDE^Bb=7CgkNQb@V%@-ntl-y^ofYo^Q1E|p{v3x zT{Rx-3hZ^Qt+r-!gRQHv-e&IDt6ZO3LdOL}8ZSf@u8C@#6*U+T!_XsYVG|jYiP6Y# z$49}LxIT{BzHM%$kO`HL>oEcjyw3w6_yp?o# zDCsdG&ET}Ve_<<^V2Z^rHV&WIWf)@^)fKA@118U{lkwB&FSPpEGQ39-$F$C~3d_awz;!erskRXm9q@XsTFZflyfdM6c>HmY~d<1-D!nsWm=w6CzNMd z9F3V>xF}HS);M()Q5ghMlDQ)KAasGQXp7cGMKgQ7>HqTo@$f#syZ7~2J=Rf1wRT5p zX6hHiZNrG+b6_HHCvY{;9;kGex;MMmyYt)?mc?_kBxY7Ns8Z;RVgG>tg1^mw!teIi z`W+6xebC--cQ^*^4y9I8OLLu4qf{eRNxYORB})rEUwceN1;r)K{p<6$nl0z{tt#z8 zb#zm7T{Jt&M&qMY^yl}m@P11ywlPbc<3l-=9 z37D8#?0TmbyR@mrZuq4Nzxy>LrS!!S>iV>Ve`SX7hpYjw&w@#xkCl3!>{iU_oOq|( zhY4M|yRNCp)o5&RwH>K<8C%+w`^#)}&b&zDlc>VDsK#AUgBxNTdPOZxi3|>iD^TUj zOMZWJgrjhcqj8B-ql;tE!X@G`XM~fpVi)H@Ij2PyPa%n?q2bl|O`I@sW{C5eIOD{5 zK%7zH^b)6&I45}q0-uN)-iV#N6=l2!Jnw5xVU_OXiK_fuVGFW_Vx$XZutEtE1qXP(m@Y;3{F}U8T$)moFjRq|6%9)kW=d+ab>GMP=|1%)xr31sjkMbRj+{kZlHn zEqFfNO76~JeA@Ro#i;De&{G@xy+EgzLZg>PjaP*#uNu5pgIsSMlD%3iNDRJ8I=q$i zcq%PG@m>>Pp_mGj diff --git a/roms/f256k/toolbox-22.bin b/roms/f256k/toolbox-22.bin index 974b75f8bd4d923e50b915d1c7076891d8452834..08b0247aa543d736414335648624b2fddcc4e347 100644 GIT binary patch delta 495 zcmXX?O=uHQ5T3W$WJ`pm+9pk#jajFt4Y>*aP|%hhG>9mQ(9(iXY$fy^TJdC236aeq z2ssQw{efzV;A<-WtCH_e7U~Qan>nCHq z7Kz^xolh0~8Q=E2YIVNpWE)O@rb_cY8RL|scRiou7be&R_3dcIg7_57$uZRiw*?-i z<=)}02J4-L2`)kqy!N8u0zM-naqC<<0%09m8G$}i3!6?kVOb5wKN4p@u!@Fs(*oDP zpMOl-2n}r8XKSJS90xq@4!m10+0_>1gHS)2W_ep^!;>ncnzoNESlv#K9fyt zuKXz0Dyl&FvCp)q2-*gIEb$~Lp$Tp7J-zGoJzmP`C}EBUQ?veOy-aoa@IKY|4^bJu A1ONa4 delta 470 zcmYjOO=uHg5S?#Lvmru)U^d%ix7kk6b`iXZ5)g|>5fKq;5h@CW7DB&T1qn+0VNo`R zCsl7etwc5dtod zUA$Ak`de1Hq*j^`8u;uytGj(I20TRXi+M3eo5jIhT1^KX?Dey-;iYx8JuS#WIiZs_ zyoW{8Y>C4 diff --git a/roms/f256k/toolbox-23.bin b/roms/f256k/toolbox-23.bin index 8b4465e817248c42034535341af800482b47158a..eb1fa31a94bb0c3c4a0b866e5e000a13a5e0f4ae 100644 GIT binary patch delta 1862 zcmZWp4Qx|Y6u$Sp{=B_)T_;=D($T)%4HyH5DC2K#K*X#uEQSe)Wg#Hy3T2`YB|MQ- zOAFbMv7IPCDp~f@jkifa89_ye3^9TUE-)f7DpJD&MzsFKL~>!C_cmaWra9-n^X|L% zeBXD@iOz}6nK|JyNh!^3?sTsb(J5i47IB>rcDLWg+Z89cjtja# z*tEU8WxbJOzzqq4~lA{uue0NItTMz$&q`Y{tEh8Ccy^pm?1mlU zMDeuk7Hkuz&{L2QAEA5TQ?ZU-gnY}_j^t5!%NP?QkjY7loaCfbHrfwY$H!8`t9-3R;gF17~M`t!WOqAr8r5-SSz?A_67&1w28hB zO;SlfUdF?E76}?fW~_(v?v#cia9#?+(u~#Fzkk7_SsD!*IuUjP`ZLzk00iZrP#u9* zxp+F__#fE7O^&3bGt84t+_(#KU?fbqAy1c$m(ib96$@y-V{D-&rrnsa1v9n{NGV05 zTP?kcW{v*PAtaG|70NOz?bQ*i4z>o?W%i6SGQWc{`rSx8x_l2Cl)4H_zS@@d;#LP9 z?i`RhEd!R6venV6pyJUVht4+zgu;9;3VhHplYRu(9WN}(yTrAuxJ}EvM<;uy_7>`9 zW6PHCsE8C!>>lRNP^RC}@9ZE6M~5XLv7!|`A)pAvDx?+EaIC{9CK>kR6v3vfLS^G> zUNPE~3wI%|nhPVI*{!W`JgaE(%zd1R>$%Z~HvOg5af{iJ`jtoH1cla#i`A#haY2{x zx_}DV&f;9Nfc1^V?RMgM9xFdiSQk_~Uqx&uoHb}2*@g|7cE4%=$*zE?%ZKCQJ(q&^ zxT_d<*dvEWE;vcI$KNALa~C8J$q}XU8pL$oMphKojzC!x$xe z5$26zm{|R&GC$6@Fm6NqYUDoFlW=%czY8hwtQ1UvRGc4&U{`J-y#b%(&J{J9Zq3Up zQaUYNo!Cc>DdjZw4Ne0}qL~9^z@mxKlXyJVTuZhaS(u-<0PViKn9$zK*}}#XOTvSm zN;(Z99^d%a4)QaU^i9>HgpsvecbSf@-OfF${A4G+hIB}5EgbN)&^(y!_0lvv<1M4f z!`r;gG#h(yXtX2T5PK8G`OYI-|N2VkC13@m^cScp7(@FYQc$DJ-pph6a5#(~SPd2p zMR2|#tr%HIeDLs?S~>^fV;%}rHE_)z#Q&Y<9Qh6FgC@ThZj33wt7QKQp{fBI{KhR! z{zCdI9PoQ{E`<2OvMM_>e4gRqTYoJ*45fi$v`+@+d5vr`Fq`|*fe!-Z#XWm@Ow`0P egM;ZTRH)5CJR784QZ(b>@+$io3rU|-)&Bt3p`?5O delta 1800 zcmZ`(e{54#6u$TM*X!$R*Ric@yS07XZ2@6UheKd<*ck{7I)g}psl%`^WiTM3qEaFLQC8_cpS{#OCIl+jC#; zIp24_bJeICwX?4`b6x5x4OZ87^R{5^sI89>)zU|aZXp#Ut4PC2l62T`*Xi|63@ceh zvv$rgc3sPM)HLqr68@5MFC`y}4FB5X#9mxdVz1byj|xembCMKvD`A*Gj}WGGeRqa# zg&sOVi{N!(xqDd;AE@(hkw{4gQ{j?O;r(QGWFt>NgJmK847OYDpr_z4+8+4I(nM8Q zWIZp-z*UD%2|Fg-0H>`4nr!So&%<1!S!MOGa?2!f5-Y<%qD?13W1~kFn2wg2&QWPP zp>WFiOt;c+x=F&EaL!f_*X`vDuNwWi-;+joo*9sRoxT+5<0K`pF(|O#1~1s7bPb%c zFTP8!A=CKT`c}@GHt=BWgg2(IqqD-TEU?~)|EO2b{u;_`WhE^nO;Tip47pOIS1=g% zALCQxLYt%Zp6bUDRXpBq(KnG#EkiaPdsnGh`Xs{kkMfRos!?OVwV5Z0W?A|Z88BEe zIyT+a1ia&5vI31O9D5$qEUdeQw`LXn45mCN4lB?sK2PVv590ht_z~W!yGaZa zF=Id7=!`fOfeL3VIxdb&@ia+_X(1`K5TiA%9bEs1%oDT9KD@6kh#E`Tlh(ADBxwoN zfuFqmB2P>s+vaS`yYx9%-5QMo!2yrQ9d2kztkmQGxl4}XF`X7#ie{*cp zgww3&`0xBCySdry!lblBG7iK@LG+sAe?g@qhZ)17kN#r(hOFJx+=;M zI1=r{%B@(rJ%^Aqy3abSXg2lRej!Z~i3C)81E>Ipdl}sT4erN^#EV>WC+(VR1~Sv& zgxe1h&s=5mR$do0DZy#M8XCuD{b$0F%_%MJSJL%iwSZg|gA zUTF4L-(BA4ApS>Dh)Kc@!Y`huv54lpMzn*bymU zk`a<8CuXcUD|SjAR!~9e#VJ&#LzOq3fBi9Dq`lpSz)8RXB|;flt2EF)sGSQI+uoS?n1sz3>>y21_Bj{5X> z^KnQV#@j(CE6jje;KzwSRA3ZvqM(Y_!mkCTSb$hK?nMIpn*`N@yd-eUKY-r~=hAP$ zQ`AsrG>i@{%8-GKH7Ryvl@U}RPRit@8p>D)GN{v;ASJ4pBRQ*PQBPqXCuAQcI9&7q z+UrH_!uFl;tgn@J!xdi@y$0UmN<649UW@jCX|EPXtK(UvT|hkuS>>!3Q#EJ;g2a&< z(ElWNS34bePKOm_rOa+Vukc5H*c;r8lWb0o0iUgbm;Chz@wC5W-kw2zmXgsLT_tS8 z4z7Dm$9BEO{aeE10KJxyk|Ns$LZGVzmG&1QxU_uKTiz_a-GHNkD!S(V%YjashjTOa z;v!pd)(y{xp@ZN!*bLt8y?y0nq508hv_7aw&z zTSrQ;_;@?*#mscz&34)%rp1&vA`U@~f2s5_Ml_1^EyAs#wR9z@q1z)loVaid*Z(BB z5L%2y*}~02ZX2|QL-^`n2nFEnu(e*w8qbr1jm diff --git a/roms/f256k/toolbox-24.bin b/roms/f256k/toolbox-24.bin index bd19c9b542fd2732366c26358b193c90710912b8..3f6143834a24b556b44ed1db8a9d212e9da2e420 100644 GIT binary patch delta 1335 zcmZWoe@t6d6u#%ZzV=aQp{1140&O1-h9iN@1uKONT!NjB$S~?8%aDPw4m4<{i4AI@ zlwXS|I~XD{o1=NgS46=jY8-LNjEkFD#f0Stk78PPJt1zW)vgL%S;2KxuC{vA5K`Ea6 z+nu%2&tsq*I>2$Uq@srC2%jc>zd(JJf-tmuJZ7Y zey4Mmv0)*~l-nbCRo4r>*eDf21GY;&(1z!wa*C@`3w()w{ZZJB3;H5zcu}vwL0r{$ zQmaP|f5Ca&Bk!lm%h?W`mv0ct@vJ(C;H9klaM@_jx;W0Sdo(b}xMnQ!M+P#2OpS48 z-I}BU3+HZLvNFg?&`@Z|7#fm$+9MEy<#Nr`gUbk zP&}5sC&dBb4tC|7pl`wSEezs!CND8uH7O)(p1H}M)ZY-*X)^{I7N=op0#jD-S+f_W zaLnwcUo^A3@K%B+l~I`_teMpu`ZCi5NAYL#$EMnu%oPT4CbtY8$FFjm;MDOvyO#_> zz)ktH2IhDst#0X1rar$L@6US-F5|JhB3ME-ug^Bz$AiI`6o`p+f%gUWxvcp5u+s7p z81X&J>mJVd){DhtvH1UDPZ|pxUDAKChlC}@E(oG&;; z{?4%Yv z1ix@Jl#mUG;D}6tG@q6e3{-PK%}KtjDzp||OPR@z;2cPCsK>L;a;U(Y&Yj{p&e7#+ zPWfQN8H4zO%S%3Z+g0(#^bM|+6|dV%i3fRtv&3P&)-TO+ri?vLiYdvO1C}i{+F^b2 zblU(=oxNq+de$#(WWSzGpHJvEc6OiSguEp?U0YlO>-6uI*l@Ds$<6FdVXhY^N*%&O zJ@{eigAl_%N*kaBE8Pz~MMNV~Fqi=Lfl-x}gynWTI8J5|YpO}5n5bNsPE9aCnexp7 tkBC9qZ2gGG$18!+L;itM&jJryV`4z-CuLIaONrwd_a1%YAon|-`v-f1-eCX$ delta 1572 zcmZ`(T}%{L6ux(UmSNakVP#?29`5Ac zbMCp{&$%~TAFdZk;$|o`x|VjFsPN(tJYON*X1b&iUDi0IymhXh#^^24ASCRIQB5$$ zFlI2KaRwzy7!K1MxKiLeamV3Uy74MB(jsbxuh3Gc;HoyNr=6&p4){(iwZ?2<;wEaq z2HO$34L-Bw(E!}ADRc)sw6)=JJJbH64`GYch}okO!zv@`0XhVe>CfAnEpM;(xhqsF=@hIYaz60LP{7jWvFja z|FcjpXFI(68R{Pj4alJZ392*JAd;4hG90yxtrjW|+|PKMK7tned7Lx*B#pogM=|1l z;84&8+1Zd2?qRVsG%%8u(w8$0Y;zVjecHlQwbrv=CcXnx(v&=9pK>BKUC`{hO>-)d zHZ~|D6G@a4b%<5K=CJ8@Y!au&#i;W4EHic1iO40Ksdc3r?l`}61R{%cB5-P12?G3f zSwqcx%~s6|0=X=eKP9G+(Na$7Xk!SkVRk(&wmz- zat+2ZySy`u-)bNB#$l* zEFNuaAWC%?9CdkmQ4P~ep`S;-wWvpm?@MS6V&M~6F+Oh8tW_@FvarR&m>D;CvJ%af z&2Pe=9wwSFT)vEm0yY4d@DGru-E+}Jr2FzI{4GA;I)); zj$~iEh>q!`s&2vf-}l03&NtlYP6+0%N4t;a`rJuzzj7tT^;*|51YhL7K<~oi+^h5) zT=Hx#z#c`$$0QukwlmT!p}I4u+s$WU6*%*5Tiu=mb9sFhj&`~lroHRc*g1?uT*K&#Soj^5-l*TuzBMkoW_qE5=#a72|_Ok9n^7 Pwku6=xo9i5{oQ{7Ht{O& diff --git a/roms/f256k/toolbox-25.bin b/roms/f256k/toolbox-25.bin index dbf5d09e6cdfb8ec188e414d5de9f2177ea5f5ec..ee91de1273695e8790152324932d9e68e02528c9 100644 GIT binary patch delta 1480 zcmYjRTWl0%6#mc5?9Oy{x82gMo!xEsGOf_s779uOtx_%mr6m|Hv06-!xYcb)T@4C> z3bg*+6%w_;q0&T?YKJvUeEF&p@qEFbh zn3?+2F*;>-5*}srv}UHTTWcxIyyr9;oh59TvAfMy&^&^7wCW|}2OaK9C{{_Dt)g-s zvNW^G%zyU_-{`Dw+#JWsyq5yU+vx$xF?O;#>rJz4ep)h*!2Th_tcffKBw$dXU}rW)oefU&9w|f%a(bA)Uqw!7pY|#ZyWJFzEb?vUrTbO zZ$_SkGJHS33ckZH^GDz}+*GiwB6!iBp6>T=Q0+y`>^tCu8YZK5`5YUtUmzBLC>VeQ zZu3VdS(ksKRFuFg{!JwO=ifd1rTv9lV8!Jh3k`rhcxTZ^@EYzcItHV7t7xw|dSyZP z3r(6vu1f{8Juakqyc*aX7xQo>lQa>TCgGc%#Jtxyjs|YQ5S}jH4ynrzikkp9R+KC) z<-KBLGfj7=m8?b+(r1>5Zkg-tWOp5j?Upe{cxYQuif^lvm-YX_;R?OuCY5DBK#s8TSEsnLc1{( zZ&2-c1No_RO%@E-GgI82Vq{r|LTbjome|=GRft*;;;^+9{|Q$d+x;2$*i(%A$cYyS zD75u+yoe5y7u)+T@e;uW?R#xJEVwee?i7y-E^eQBgO>~LSrJw(pjN;#0n6=C&X)*l zl@Om7u(B~k7h)QxY2n5Vdo^$w&zAbZ!1JZA6e~BKEaS3yw9WCu^$d;FRBocT>}~n_ z<0)*2RC&*w5P@z=wY3gYkthseet zWpalol{A~y&D}jzNa%iy!?hUw;y}=?wLeX06MEyS$GccK%hFm_O6ys@Ijc3>tsb!= F{{ssH>em1O delta 1518 zcmYjRYiv|i5I%Dsd-wflx9r_*ce{ION})W|XrbFQ@+fc9rkIFSjS>njkXnkthC*P& ziI#_fpb`IBQWRrwgRewm5D+5#kToPel1u8`wJrRaGiTs=w(Y4bYY3v5hR1fG|uFhl19HnfiynpSO~vhuVWufLy)GEoGHBqpW*>&ux002 z>k6TB@&8&?6d~Ll?cxG^WRu_ujOz)nnL{ zvJGoo&Ed@*^t8+f>#sMwM3P_Ql+C!s)c~vTL)Qw}grlyyaLW!WlgUuDXh+-EQoh3` zcZ_&`!QC34_r=3ly3nSJnnUL`fpF3UZaRMMo(_NEAMRFIfX$v1Rp?bu-6Tq>N{=O_ z>r0A^Cp`1uI9~TW0ks(P#)!vyZ`6}MW@U7-udlEE1N_tb6!E&tyOMm{eN}iRID_^z zzW?_{@L`vKDqO9l@pI#*a9#_NW)1=~sz#+)s zvS5Oetq(5b{#k?Pf{SSLckrdLle$AoVbS@EAsJu|UMt%UFJoKzPPmBQl&@BXFFaO= zkV1ti5f&JuJ4B^f5ni0KOCx47R2-g);u|Zf7z^+wI)gVS1&pNm4R6x3b|y8oVJY-pL!YrTmTA zIYtAR<8;W^FvXrpK{nW0fkH+{PjT!p(;=op_G1DxlmJ6S#mQ7!GE->+Ni?BjF1%Wq zf;KEx)--S0uX@afO!W~~4cH=N`Ull=8fdk`?EXlN*jm)QzEZ8UwYb?ZpjO*j%G`zR zRdMRI?kYK+I7p3Ekj+L=dD|-zg(@_~Xke5C4py~QJSbQOQ+Z{_N-GFok;$MW^ng#GdTw zaUdlY3Smm@DEM{PkS?8}KDRHr(IDathsNCzZYE7;|54d%*b|@XJ-W|k!a-C%_b;A~ zSJNkYIiBQB>_JF`1^OcQ9!$v8%F#r7(7bA$jY`r17A)HMAF(fy0uzrXW|925B&|f# Ef0eHWY5)KL diff --git a/roms/f256k/toolbox-26.bin b/roms/f256k/toolbox-26.bin index 6f29c4430ca29b5ac346a4197e022875b8db9371..16a38219a3c0539bb8af9433174686eb1743267c 100644 GIT binary patch delta 2037 zcmZ8idvH|M89(Pf_Wj5v*>^UZ+>lVBkQ6Y%q)60imUO8=Kso`0nmDXtD|I?mf-O5e zSp;QN_^LRLGsYY)c;W;8=!iPwqoiS4%HX1?zzAF zeZO<=Ip5=VvmM!vN|IBI;f%%fOy-)49B`QqK;$*5lUjSuy6y5n+{9awEe<;#@V(J!xgjxtbEU`@SW>&*>HA;(O4o z^xYD;kGVyGFt7N;#rzTl#J(h}kSHkLUCrXSDocp^9u}4;D&B5mN$IU^kKq=KQ}DG? zPftNoy`=D?plIu97&dBqoqzu$r$e)du@e5Ht)?qsh2BO_!)`rVe)JtA;vrZ zv@$r^Gc&)#nShP>&pMxXzjn+Ll=QF5U$)>4y^40iY5hyTqo=@p+*f83Zj#>gC-~U* zG_}J6c9UL!pkt2f%)&w@Bk(}?LCP_|@pqqFPjw%#nc5&(K0pRXItLU(+KlhmK2c!5 zqej8oF-LOFpVZO^s30##ECqyQwgzNphO0(z4_^P@AsDRXm`d67hsq;mf#$=i5f zRGHj_whFWbKP8C5h@#w^Q@A@vF4r7H{?VG!bCKajhWB0`L`sFEaQY}gN|;d|#f4|= z2MK0#(!--j3+D*;W^-K4**MK<_--vj8Dko3ptGC1R_$FbmBjAOfhHjcgibw=as*i&4`!2K$3 zdURhtW;!qpE|~_|KE^m)@`seJP4KmUUf|^6!vDFAU2D)9hwidX&fR(Iv87 zc6uIe4g8RH|FiKhA7z~;rRipA1_Fk&oBGX8q~1cn1egY)O7P-;feA-dJL|X zcR_PyX!}ER@hsToPVv=hR0!;RuLwMd3V|pf-a3g2fhZ`Jyi?MJ{d-DUv2`sf1bSejQ_63r3sZ)4X@~74?S6{f)Y9G4Px`PbaQNy`9t%@5%5md#k zp#>F17QKM1$*z)Sz8i|h(4NyGCb-U(&TKZ9}f6TkD)^B>F{XcZ zJg=sE;7t720neD2MHXFAm#a%j7K?TY?x`BbNH0s&qHI2pXvAPVm)KAgPXnr|o16_7 zxQfz(lCi3K7Hxp7)%COkUZ|c|*YR6RxUgf~#=?tJOwDk245bV8G0Q~Fv>hg^!+{yE z-d6PLX@E#_K~vw;meeruXFAh`LL~-%);L`>;ULBRHLK~l7cpHeQn31yvuw@yWYoj{ Hh89fuTBXFdg$*BZ z*X$JS=#r$*|3*!!1gcr24Qh|be^fp#5ycJ7A zxFhpDsFSMcd$3-*BJCW8#qwsV!!h}3&&y|Q+FwP?PFSe4(N1_=X$~j%IsAXq$%swy z`cF!pG{hg5vfJ^V(jY$_*0V^8tM7K0=qnb}dam0>e|QUtW~4 zEG(+I3vTl)qz7S-r>NxMcg`VmKus%sWNi=W8(!HXnNLzU;fYE(z2hmb{q{TORh)Q>I%YiDNJ~) zar744ietQ>2FC{rHZ{+G6Wi2w;l{R)r1M$HYce8$xsnfF=P?g= zfbN^`|LJ7rdh5{*XbnS$?*UKOh;tz6ikV$-(brASL972xdIvn?f7>{50lU&Gx>AF9 z(L&!pojwK6j-1nca=h*{c&exa)AnOgOMN>&%+2p5jPg^2$+mkes*7hR8rVj2v`mv` z=Hdz&cAb>t%0+mxuv{vfgjWhfVmezG>MopgEGyZ72a09CQsWFokX1Qf=vQC;?|fL} znC&soKjc`p{Ht)d&H8^h{gm_)+ii~bI0<}qpd_p(VO$Hh`xQm1BXeB5J2?-}fYkBu zU)qp%Xw2vD>_OTg@^gM3X@{toYo}+)Hh6fJfZH}A?a*7n^@Hn^ z?CvXVp-17{(pKrO@51sxSWH_2A-Wg-9;ghA?sM=0D$Sioj56U8F?Yl3f!iyV<-|R! z{()^SkyC3dx}OY1Z8^l`_(r%Pcw;#KV_afN#T>_f9G#`vfH$3I8qgM;C#~BFJ;7Gg zlF?vGQ2OH4p~w_A9(JE>%gkeYhAE1O1WQ8$bU%!T=F%GQh8qpRXpBJ0e+6s9Wq6WZ z;ST@N4H--slMgW0#Mu!!z6Smke%L?#C9fh)<8m&$a{NEAch0}51?`avRJnbTx%l=A zk*!&+GoiL@fhYL2Ee|3mI^n*uDjI~|vTC{lUMibkx#BU0>qsWUth+qTWXm=}jN+AQ zBpHw9?2sud_0M=+sJ`fR#e1Q;ynX>zJ9~Y6L}v)fWxPK2p|NRF%T>Qljz=$Jr5c3( d?JuuVEAf{ZfY-|J&iAB9Uml8PO7GLj{{eby4}kyx diff --git a/roms/f256k/toolbox-27.bin b/roms/f256k/toolbox-27.bin index 6f402710c22dce7ad2c4090d096630e36dea5207..021809a9ade4ff69c5c8b2dc068e3313a4041a49 100644 GIT binary patch delta 2136 zcma)7Yituo5Z=8zpU?JTI}gWpg27yXD5QjDX zSTzohz7RtR4HT>#E*R9Y$;2+s=AHV9fSac2+AQ+=FHyE{9x zGvCb4%tiyzK%pg05;8eR;?{(fO;T9-`G9#WrPE;ot+1Gn_Y~K3@u8Uzq5Wtnd`1KG zES#g?a4*+EGw0_{eFulR{oI}o$hVYo>o375OBFZm5-hL;T~_vW_<0(mZGMd>rG-et z8B0I90JzjlNNOBWMmFo+X41VSpqiE2SM*dkeDx%vUenp(Pwxzv+x(eli1d!a zfO)+@GIP`01LinMHwVnhfEDl?Uqn+N3H~4=h?&CSsE4WE8PKkg$FMQZQzkMtk1jNedy3Vq8#Z%Lt-OnWZDFfK*CZ(fd(t1(aj|8;Y6xsltwjf6q z!7#blx#&Zk#d9OQ+Gvl<$|9I9_ov;h%jFp~oLr)_&7^FyWAglXGckc2loLVXmJL#C z!OAf*Rdu1O%Bh5oLb=GE3#uliv0e{{Ra0@Wn-C#a|I(7;XPlq=Bp&cP*ECXs<`e25_nfw~M3FLw*8h}8-O4&w>bF%$FA}w*b0?01Q|1FeiBq&%2)Gr zJnVjO*sCB9X)7r~*{Ow!?_XsB3WxuP#4m+)^d`LKDy7q4vFklr4Od6t69m9Tr@GQp81NfnHxfJ?1`lvB5@ z>+WqRj}oKp&xWbRmG)!BJstiS-{udan+suManZylx9+LjdMD`$;3SbQpGxuSQ%78a zIf#BdEqb5%=>sO*DlVtTz*|x>=5fJjSx$-R86{Dhfi)ET3j-dhQ&^TZ!{QQ8p0U#P zjJS)-&_i{~YG^JQM)$zUl6wucwK19`SkPSDo)EB>f%GaJ&D2`*C3VHbUoGHj%K)Z>u_wq zrxi_GH?S^=Elr9OY-^l>MA@=SPhH4nGX)6`!KTW&iN3GfTW9I2?NMb9_PtA6VY6>2x1|@3 L`Xr>hn< delta 2327 zcma)74NOy46u$Spwy%AyP!wos1)fh0BB(=*LmZ}{+Y0M8nafZdEKX%roVq9)*=D1TdlPu^GO%^SRRNY3j$rgFa&MiNJx}TT!-h0md z&bjCBp6hjZ9oz{d>D}V#Bk>C`c9A7G!;s&8&z9TAx{66HPQjVvAa>wOpfC+7&8DTzS&ZA?s>X z!%KRZ^-n?KT2jCjGFcl*JvWt3$GAy!`h_c>cj@|k>lzmM5vtKi8X5cN06eN@+msIJIxA1{?+rUlI?S%1paKn%Qh7 z5+>(a=Tjkpr(c^85?JiRZGyt0$?;L{1D?#K4rakXjol*331Og{$fJ zzKO&cCX&T`BG!{P_^Eg)spoBp&)#g&gKTF(#EZaij=C`yTN>jEI_twNnCb5c?n^N%~N4J~G zuxIfml`;b+Z48w3h2NW>K_^VjPGm7fNyTp%GD%K=Ac#LVs{k6#-$kda6}va6Znvzp zIU@)G*+9vEzyQ3csHjkb(m9k9)*u_7!}C-}RLHyeQN0R6!?)C&Cu;$lJBTN{VltVA z4dhhJD`{_URh1*7?|JZxe7JH73`&q4vR^DAd9juZxN^a-@;QkK9)%Gpy{x2xLnNJe zr&GP?R5lH#0PvpJNw|dUj}=p>luUKD(4mPc-f4WG_)6@QSTF(t06)+M{*ZWchBm!I z6;~czWKP3)J6RW(%~#!)xzk!mT@_K{GVtrc39&QM(uAB$7|aQ9 z;zl^rwnkgcL4EHTNbKj4%TP|mml;}9VPcLKX%Kx{MLb6O-bFKOqFPb0T6l!OF=p z+sxVRwtFGL$F>P>83R&gb_j^}1IT~t$p(gVf)`^kr zJB+z@d(mjP*BCX&weT*uS6wO6I&DzZPW=JK%t8%S9ttpp$SX08Uh~MN?f}z?zpWHk zk|z5se2|>8_mkw5B{64LsIu`vt!__w6Q3owQf4p=je)VY=qfJ_Y<1$<$k z4$k*!115mSNQ^arR>Iv52@0x39%%GhdPIjF^}PiXkNQer8i)GwWDYhsn~xhU2@M0@ z2yHED6GpQ~6w-&o$9l`G0TY~Jik@Pk%*U~cl;>#&1A<9Gj`}yU9p$HhexH#=~j(Tf@49 zt4P)=5(EDYYBxFvX_*kLJ$YqKXjQq{QLV*Tnizn?sCFwQ)aF=%lE%_>vtO^LyI1P& zb$0iP_YPd@-ELbN-fAa9SP@%+$Ui;3>N?xI%bwo%JHNBjly?mS%}@y0)3LUj&1h@M zfu&QLd1D1hi&(POAvcjXz)kk61OzD#!2x@Mw!w$?DtZHaZ%?9h@wd_YVH;o5^T88p zxnUC3XVl)H2ACE!zIa&;F)hLlGGp8fXZt@WWHN1!#LdeIHN3%FlPrz%genJq_c|Yr|(o%_we#l0lv{6XYOr z@{=j05w3JSL|4IxD^1VA_pYU$RW*|{7e&tGpix>>pZL(UPJvT&_kM9ad6FARVr_fe z80$@D(`g&}rD%BVz2;2&z<#i`39pB-u_zD2F)0$;dtlCBoDFt$4XwOG-U}tEitdGS zHq$^ zo0H96jUOt*3wDQD98VrU@cuq3dMUIw{#~%W?u5Dl+K3 zv7$g7?0Y&_ZC-aeAVZj-4d)(w(Zb;5yI zBRYK?i)sun8T<=(WJg>8 delta 2466 zcmcgueQX?85r1z#?$&pE-*>)GJLj$K^Epl9Q2B$4p@~Z1(r!QEHfd_0jY-m6BGiZ= zijqQou)0eWso-`HF&3rAZLekzRiSbvmm=YiQn(~kGBlzke>ADxx)xtOp+>3Dy2reA z+@v+)Pb7OZ^P8EsGxKKVU4B!36YQj)@`mZg$bNy82`O>~qFjUtdJp%z47^9Li0Ow+ zW%tzIxHKId9@c1u6yyq5aF+x!Ef_u)dd$!(-Vc4u-1S>Fy#Y+oPMLHo@9JSgBd6Fz( z07r$>$>SM~>a?2wJxe4nVKwr+aiwwO2+V{-5EN4J?k}3LOx>zeMl^0ADJk6`nX-#0 z2VjSAhaEvm)C^RG7TOIpp_OifcZDQUNqm5Q9rlTBqpu#*Jcda$pV6^H3otHZ%>Psi zGcIZbKh)xkYcaYi+8V~S8C%D-8yMGNJhfj-F)nQ!n9|lWZi6wkUAviay~Z=c+FHh~ zGx~q5^)v3%*d`)t6Q%V@7CEoZjM|JPqS=|Y34_%{9 z8A+1WeafDP%$yp7q`lSkC^NUGTTOkb zGY^{ihy_W@dZ#6LEnzOHi>H&A>f7*H#}WE@_@$$Rz6KW^+vq9S;B2OSkaa#nx4?`u zMc;yVog3X-+LkIf?-h4}Q)2s}M_xbbI%isS=GC9MCZ)OL8UAzp(m9+EBLs6uW=9ItZQbXf&3pf%wZv}c8wl#ktHyw6VXC&Ut?oy}2 zxFVXCSBCMdt!xtI@YbbjE>|QK;!R$soc^SeM`w1`FNIHz5;J@9+r<2L(SdK;)#p)J z_hdNK|56yuPCm*E4zDuU!*;p1A|1siti<6{hv(%F<_{=80yW%6*MSxu<9H21kxu#z z7>o?jTj2YVE~GC;zSq(jIWL`eoR^1(=aMWt?3KCX%gFqKSAPY&qwN9KGm=gR-jS^P z^z!O=U?Q5p;h2v0AYF{6k@{mPq$9B)+!^y*+;;jHOvlom8xzJjJJWBSc_X|R%i^{g zi1#9WIIbXlA|B>;?t^OlW)$9xM|ZqdG<9J%WQ1(kt#<6-Ng1D31>wB!8fZLbK}MY9 z+jKu}tT=AP>zq)*Ty%e))BQ)TKHR3y1qT!TI7yR<4*FMkH4&pVSWMj1xjY+(+po=r zGBjr5E#`8IXY0~&<$;~1T7$usDf$A`TiWR3Q~uUJ(%7k46So5v9T#Um!8q|J!5a;= Hr_J~efr@g3 diff --git a/roms/f256k/toolbox-29.bin b/roms/f256k/toolbox-29.bin index 977b8be16af85ead7c61a0a187233642faa95523..ecfdb163db58a92481a666b90c0d066d10840e63 100644 GIT binary patch delta 2917 zcmZuzeQ;Yx5x;xy>06d1yS6^;*y>rxk%L>)G>+@ou5lAk61fBI5NOkwBsB0sLzyrG zq);l&ypih|s4eqVlr(gZ;2h&de52Y?i)>C-BqsJ5mU1G%dBk_czif@jdh*xe30v%bn%%sQl6L z__8sUl@Lf)8s9-Bbjv+EcvA6Y&@Ls3)RY}fARR-rX(u9}%AP4$Em2)AN$7J*PoV83 zo_*_lUXI-zX8kDTMr*AiKXPmXeNVY_{Tn-ZRt3Eo0*u`o2K`)+#n)OVtW!ZE|C(#^ zsAke_NlCXPQ7VW|ShJ}n_>#^^u3;U6<8^eOY4eJIKgRW{tnTpbZbZWpU|j~*DX<6V ztf{WAu*B zh;GwrbdzS&Et*5Gfs`JNq(r<)X=LOCeaG4@>-9Oh$`ThV=qonTUvacZ`V zEA~73W!oTLL4RiJiaWP+*f5#?44?O-d4%RMVzd4vVjKZ`LDPAVtE$SL`#8ufAR~oj z0dkn`MdXPsob7X0V#zP><8YRVF^fAt6@(EQGZ#mRF_RdP-q*M|gm3QSY%&h_Wa(1m z$`EHe9m|9}rZ{_Kx$w4caJENYhJ1J%CkJ+MHV?e1@VojXXW8my!m31^vsJETQq@!t z+^ri{*x9lLM�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 diff --git a/roms/f256k/toolbox-2A.bin b/roms/f256k/toolbox-2A.bin index 3bd34c7a839276d3fff6df98df89c7f00e9544d6..9118f0352a9604bae5fbbd83082143cf7f8c7692 100644 GIT binary patch delta 2672 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 delta 2230 zcmZuzYitx%6ux(+`+iKf-R-_#Q)*jEEv3k#M5I;1Lf02qBS8qoTDFCR7OWIVA3E7W zAO`9Q4a%peVinWajx4# zJ~Q`ryYMMuM3SEAQ#z(cYsG8fqOO3$;a}Yh;YJ-Z;-(%|_i>{R%Jl_`Op7w1KZJZ7 zt%D~0=X5(18=m3*+61kJC+R-;(vZttuZ3R?CD2d3Ts+oyo#xWHuh%C@H}Z9i#5qhF z=?{4ZL)&p+bjhC5W6P*csHVD9ev(c=!Cd|X=W2kz`TgKDE~aOo#wc1AhKENJj&a0b zkI^|!atMx_bAlN}-0_C228_%g@ZdV8L#^J?3EVVJp$oxk3gdISDM)v~bEbJ2+`8xs zu-oKB;Sp0kK5b?NP-b4kdFo-mc}9+6l$H;M6y66her1f-!FBVUqJ|n-%47cCW1>zc z;$+T^JmmVpJWg16Y!Rq6EKJ|Pf~n2-0Z?k)N*mw<>sdM#nuNA+#n;1FF?{s=Mz!>@ zFa^>>9;$rE%=Bj#G~t3Ky&&#`$1}y5&)=3iwegIePiZGPtW9KyCl0EOq!hViVU__t zDmEntbjXQ}oG^twa~3uxwFEsf0dw^WvaeO=P+(gY7;2$r+tI3K+S(d=i-7A_i&#S&&Laci6t zPro^gUBaiPG9LZuF4Pj-g^oneHIK%kVKjOUzRUK}*WgyRuk@_}d8bFsjFKIiw!^4s zxF)NX_-H=rmP;C@!RYg0j=doGARGSXw2CW1>O&+>L~Mw5dk}l@kbOFL8h2xNV|U!L z&vKq=p0pKVjw7gSf4M_VVw>Y7&bkSHaIB<#Fe@iOFG6)rk?>W^5TOZUB%zNmgJ^}_ zId0kr$(+6R_ga`w%3=Y@&P2(|rbwC5`F%^B7D}(eYS&WQ34N{-nh!Tz)2w2PJVXfo zkPvYZ_}x?5w{4as1M(P23iwBH^A=gM;7jBIa#ypAtY;B#4@Wvx-SgUEX2QgoJd%mg z2+LMg_im7fWHQv}R_vr2WR@)%Shh#XW`+p!J`CCK9D~#_uViChkK|>x2+K`l(4C!l z6=N-~v@rom5ImB=G!f=Z0~N@9W6X&a?(|4*W{I%i7zDzeoc7DzYGl*Wk;P(6z#6q} zQ}i#VU5t|^CY6qimv%HM1_Bd=FDt^ThlEAwtYeWPJ)7QmEQU!RExnFnW##tR3jE}8 zaj6El=kXL{LSr#y@%|PuM4DR8EU0Ojkb9`~ijJq+kWS2=S836!Y6{TS7H^2#y8+(y z`c;4q0q${tZ@qyTW9;2`#T-bS!=q3*fxXVLG=kqZzkEeI6Gm@JTl%J4(SAffdQ4-_ z+-$|y(Oa=mdFAmK*6zgQSHoW4Y_D<^DMyP=X~1Z8JF^sy2))cyI5Gl1`@)&dk7eb; zPjH1K)texN;PB717QLW(VFrpp?ou3#S%3Zj?g%X-F3aH o9;D19ep54vneY8Gg$ZWB9mvP~v?8z-`}$O1DlP2$Euf?S0U~ZD_y7O^ diff --git a/roms/f256k/toolbox-2C.bin b/roms/f256k/toolbox-2C.bin index b5375891a81ac47a96410a150cf69d4f1afb198d..e7658f8cbacb5921ababa7b8ed4cbe4323a2c64d 100644 GIT binary patch delta 2286 zcmZWpdu$X%7@yhgcJHp&UVFW^*X!f1%d=2yE$Ji3qcK!!Sso=36cI2KX*~jhLP*r! z>h)Sc!QzNUQ{d?4z%4>52^c~Gf)Zkpa>hhrRm2L&Q>wgT-M#wF+_ggc$NXmJ_dVzP zzFDP0sn}*O@#QNeMUkig~3GsMkwAqeE
    3u}v51Dg z1Uq~K)#ZqI3(_OW)~fv(k=FEx^s{2rMRTUXsBdb`DR&DTkz^Y?^v!les6@F)vAfO0 zu8^7LI};%T-DdMGvKsx$mUAG-&=GIiVM^tPr&q$6c@kaw)s-_K}sg>(aMy-hL3vNNkS^+XFtYr^71WoFOAy2U+31C5D_wI!@F zI|p28)0q0;Sz1BXabt3z6LpZxmW)VOdL$Oq7HeHLIl@g&{9~5k=Txp&P&xT3;rL2h z=>eTFqRRO>`3jlO=i@6x;U^ZqA5ifo6Y5P=agXO4+euF^FH>&t@OPtDfr8^vnJK>? zf$$u;%zuroq&@E0aY~@aqsE=|g!6*A=nGST3ue;|Ni$y4dputyfMg(Ifly?hyiRvb z8eqUw>nAoolQau8coX?i$iaE!fiN3qlBeQ#6#AMi?Z=Oadeu@*DGxf(Me^{8m`s&*6tpwtjhZ~1+QJXhdV4r^Xt?3zM=9kE?I<2_MT$%c zo=QG9O~W6Mzf5-$#M6e~rrMxt)#SE$6|N$SExGs^@}{LEud&u>;sPjyMscpN1McP* zRKaf!nfyY?;uqx^9r}`#B-P=yWM|Td;-Oamwn$4C=xqpn znv6S{@mkvu<2y-m%22a&WUg%jK0+F76H2Mf5->p`Ccy%Us4ZGLhAbd~_z;X#$P(bB zv&-oKC8*es>5^Y1zu6r4EV*wR4VaTmaXLe9a)IwqtzHLjRUWrZD@ll@19g^4Khd@B zeoFHLS^iHeYqa%=!<3chHJm)0t<;<;!`VWuoU&$GJLZ_UQ(VxsNhuv%V=cLv;vDVT z9__ohhYKN@p5W!2w}v=)M-QwWF`A6CkIZpxhdcN&1zt@#WrAUvN7U3)7WUz_S7pa0 z2|`syn>dq1z4P)+a?bvt%e5VUTT9gX8 znEV)Yc=>e_&5jf~Ja{yzaf}39@Ax%;*2jAxqrIp~<=f^XY2J%^d)=-%qNvRgp<^O+ zOvOw<8qx~!JaT~H1%^rKl$pwK6~mnjyBJ0oK9)gs7Bk$+@EF5C8Rj~vbT-2Vh6fm4 zV3?H2{AX?`8+Taun^iN6iW#oDcSkS<{!Q=?dxV6d!RuxJws1V8E^Fjg<_xoHgAuZo4u7#jFunAmg*LJlYOgC+9Mu1z+{2Z1$(Bw(1)+5DaOU zm&-_f)&jhboXB#5S$EcQ`@WUBDp+phqkcBWX8Ac%lkMQ{w~`gvQ}Hh`&Ewf+gI38o zFL3)-lGQmi*iBC4T!2Rt%zbjKy-hl}M3=UB^}7hQDW;}4ZQ*nnJ!k<3=}WJCr_*f; zvADC{RhdR@TrHwR@jH4OMosK{cYx{KBbDy)I84^K({MX!c8|^-vm1(2{=0cD|1?sH wc)2vFU9`rgU1}$1+yx`+>-6p_RdiKp8)@h1TYbV=KM}#7fc=D~HR%5T09p@z^Z)<= delta 2246 zcmZWpe{54l9KU;A+xOaSuid(?>wcBT4_7wm__1tmC(O~fAw5Vj!>!mJtz66D9kn4ys=Kf;#2*1K!BknNBAyt~i$ zd!NtU_wJokDOILDaKb)V@2)=nu64*6{RpGK#8V-u=flGzZs93O9c^ymc|1t88WO0% z?UY9qEclD?_bP6LOSId!ZwuQzsy|r>VAK)X<}P#7^g*0@QBvIms0MZvM%$n#F6tIO zPpA?HqWZw2hV*TgXbu0aT0^WKNGj=Ls^1cI7g?jGiAXmHUg==z7AhoQ4q@zLazk4hrTAV>-$KdJ9$XGhjbz;Abo$F@ulAeyrAj{l4}qR*228k1ojK3K@Ki zuww(c9!42@A!*_+zw!&1kc4jX)8G!onh3fmt~3>S4z7>XQ@t6Fa~K7s?Mt zlq)epYxoJY^qTT!%0%{M1)3(ZRf^3#k##9$gyl%Zs2?(z?XVn8HHVyI$KS_*ATtO+ zh{Guzc$Kbw@jIdKWP*5vqGl^}p^UUCxvqV97hXs}Bb(2%_+D*9a{5^V?W|0z&Pk|Z zrKS*S663GSarcQ6;~(B<^vbnMD{A-+i((T@_&*%k*Z zLGvtAFxFYFn_f9^6x$yK)v~5zB@i0XvJ4w+L=71(j0Y(8Q5>e|v=V+b#TJU+P#mO~ zl}VzDC^k`4DE>;3vytfI6dNcWpx8%on4&XlJ3sRT{TJ}9;BXPTQ7Fq|>2AmS$Nw*V zg2FmQ55!({IqTVJxNtqZUxz_B)p%PcqFHEOyqvf z8fMlOv?6yooQpbhufdbZm$#5D?hx8)BSH!KAj5Fk zK8$og&`kTCKAQ6oP0ugPeEY44H>JYXkPNbwrqLTMtU{aer{z^0#yce|n`&16klCOn zn-htIwC#W+vw7btEbq2cjcUX4K!wGz9tiTwNZ8oP}-1 znD@yV;0I%Q_{qPt2|{?^IEOP_fu*Lm%Qr9<%rL*$a*yi0kzSRNPHfcfP(8bfL4TN7 z7^4Yd_yy81{At>iXTCTt8<}y8j{|Hq@1jF+!(34F+p-DNj8$;NhtkZ0ZZ3sj)7DYF zw=u&iNBRtzqXwzsxR%@EKVz6DOruv}rBEhK-3HyubMCr2oQ2qCI3kpxaaNc~_rqOb zc4#P#M*hjZdDua^47C=CUVvtcTyXFxqXE6sWg0I@GY9J54gXlSyS8>SbB0+00fqcZ zdieOY6Yp9hl+J_0d50@!eWS@1WFq19Gr zW{xZ$UwjO{2oxI7`8@n+tDwihmOqy+f`$1Ze6Gt6bNxMF6Gi>i;P=vg$mDMh48N|) zd;+J^H4;rzBt0Yy;6mSdwq2q|Xs`#P{XJb=iipidoOIdMA$yo3c3anmK_c@~IACA% ze>;uaR~L0}(NH>)?5z}Z4jiZ3CFFiCPnP%$*y&gi=zhAG>yFpB?k%v;snSlk?%eGk z?qzN)yi*}+Dd{8X98yUFDCQm5?y9FT=y$E8&5-Y|psldPU5e`+?mD^_`rQ|3J0v~x zX&AotT;jsL@Sev99~T_semMaz6)vM5fWl{KEnFxp!{?pCRdg1_yv4K$-tum7usl8= zX=+X~KhpbPM^VTY?2yBZ@;u^Q5cc_s^s%rjHpXW#L3FTMZ+UEQ6SlX0-oQ$qLhIot zUny3`Bu2QVQ@N5f!9ww6WNQ;kQRA0l41a6l%ustjGb5Q%A<4*t8OByJN^P5<*8dDj zd&9rPz42R2FE?33j>Mbbls`(-@UuTOQAso`41DEXe@YEtcb%hIn;Oy=y7Kif99Tq$ zAslR=-T3r@99&KPa4k4JH;EkM#`rh~d7+3{Ja0U6YcOkOOPu@>6Jd0Jh~O3%VR6Vu z2ViYzX=CphLGtA?WSPQq*EtZKu|sCMELa-XoK=%a?VP2;lAAzN`k&Iw39YVFL!nbZko lE@@x|xDtx3fovXHJV5cE9&FX9v%X`rAd`>{9kK~M{sqT$oPPiS delta 1813 zcmZ`)Yitx%6ux(6AG7ance^|L>~_kd#gZ<%v7sSKqEIpp zB9hSMfDlP=!_5|E6|zAnMkRqZzFLiI2*JRQ+E!wTVjvU^aVnl!wgja9xqJ59?>xVA z?zGQqpEpO{ZdMGcMikQ{V)G1gh>&fZLZrIQnryyLv*Bs29u*Jkkc;&yA=2bTNyP#L zqPFs`VIEd>53CnmH8nL!8+U4A^V@s}9o}YD1Xd*T%p+52W1_?BSs^{MMw2PJ?V*_k zj7opJm^d+)?n;c5azD(00G-4=dJg8(V(Tj3Xs|ZR$L)vU63NvV)jGxJv~<&O?=_Q3N&Gf!<;qqzvY5iLs6v>r{B|yNlVXr=WHr5Z zCOxQAiQ!9v$zA3$er6nuS-WF{G1;h}%&7mir{EShgKKPosr+nzcV|j4S}{po=!vGR zL$MD01DpBf?y)F>Vq$vK-{EKeKs5rfgp^a^#1v^3h(bE8DM8wQRJ&JiM?EV@GpDp4 zJ~l{O#(YKY&sauNbY{gG$Ek(=2R#@|5xs=}vq_O4)@r&_Ym$Jt`ZS@fsgL2}{jw%STk4#44H}VKt@`D~&9>12Q8|uK0+`Jm|%( z5QHwyL6L(bM@|{ihYeEgF)imY4+fV|LN7tJQ2BtH`yyeO#5!mfDiM54D5LMg1>vD^ zE}g*Gblqzp{RvTvM2BI%MfP?bW;7^MMr9gbsxlXra{zv_w7PeF#LQ`C2?iDN3(4?t z?USdhQA!)(4ciB=U|U=p#Om!DU(q)0|#90P7uoJQc^w^d?+&h$x$!6173OGgLZ|>Eu#Ge8GrYFS~ch z9_DKJ4b#i7IwsWy>zu3aTAp`4$yK*Pr7KJyhX&UQ+LL$LUXch+Y$*S#I2AkN(~ORD3B`Vez6mLRg)QImyPe$w z*ZqEsZV?yJXWkn6NW_)kW7zdsq4hXwouNs& zHRBj}jgQZP3!$i3Q9YU-?#-H6T>*c{L>PTHOwjyqaD@HzN0=C1>bi0owSum_a$364 z2V27aDfpDJS!q@yHv4j)m`-QPuD@?=7B;FzF)$Gq(}$m)OK>JUjcRZ`?4$cZh=gfB zOpMebqt8ctv=&~E40xxX9mlLC8bS`YM>k20EgB{e(-SB=iv%U@}!`hpvQ3 X@m_D=+EH29AzQKIJ^J;KwZrx=Thx56 diff --git a/roms/f256k/toolbox-2E.bin b/roms/f256k/toolbox-2E.bin index e6608e9344cc768a72fb28a6d99f0a88600c5612..21fb46a8eb7adb967e7c0777f8be1e4b4297c213 100644 GIT binary patch delta 1756 zcmZ`(Yitx%6ux(6XLfe>-KG1q?J$-uMR_TK+6XD8;DQrYAs8Y}&_G}tz@UZ@6==z45ZtHH_+uGE4^NiujAe1#6&0{!)1XSR)n`dY+$x(k29Tp9XD(vmqhCkYCeu+1e z&v6vjkP?2hcJwFn_-wd&2%%o72ldK5oVtaCx!B{IJ52zwouyU)5t4{Gb&shN>ZX#C zTi>sY@>;2%e82^wu}{r3LOm#r+5lvPyRUw?)WlWnvNIT=9J0N->Dt(o6TVDP$mzn6V=* zPPSVkI8F{&+pY0Dlo>R`*2xRw`I160RM<(m_bq5t%*bHM8&VP(a*_i_wdHqH=O~x6 zpn{me%nAn%?GZChhO$VSs(bBKe>OfzvgXrRtzD2dcIvRhKHj~tU$bj9;&9-Wq& z$JjKa#H2-i09BE8>2i9}xIQhT{St`NQn(c|*Yf56R*>^R1EZil6k$m@!fG=u!L^JV z!ME)9A7q|GNq(G7L|nzL`ADyAnhV(L4(fpH$_W*1^Jd5MEz~mNh*4?8l})fNmq}D9 zTP~NoWgvm8-fEZEKzV!RjWYlaXjZ}l8fB?D1GANs3`z@78km<#Q(5r2kdn&U zwlez=1hci2iJd5?m|4F394e3@M+o|N&oKpL#90rr)p@Drxbr?6bVCwkAbxjDJ4wQ> z*5(s~zaebMF++;Mdy0H(>Y+p;L4A4%#;IjE^gO==b$DXe3LPLhx|CH+qds@We}!tVJLx!w54Qc?S{zA z4wEfNXggCCsV&#V9t=C|^G9(bnd+Y&xLKq=SbN?iIsz{`*U_&OV4)VtCjVP_EBV1+ z4^j*?fNTo1T}A3m5!;$Vhbj(@pCGZNyV H)6C^B$(wKG delta 1788 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 delta 722 zcmZXR!D|yi6o+TV>2}%OWP`PF6Dv*EN^XjB_Wht5tyN>ZAh>GRnMv+oi#;Gd>33QB)Dh|XjL>_qbvCGhWw|}J zfxod&W4B~sC|6b4<8-ZhhSljMR#q+meXV?ubanix+z!SY@NQF`gQD|7UBYX{QsB)| zmwEwmmA2}lw&oH~M|Qd#3`?txwsqtpUa-4P@FmqY-bT9ck**?9L4o|Sk(@Oi+~dcq3f zMZg|LkYiPk!+=M6hNR1^sVB~c%(!ec58{!Yu|l`~jiJk30r0$G;bWFDvamieCYRxR z4a0it>n$g5huVIXM|XBwc_&PIK)4~e=HtUGr1y>g(x1%5kyP$@GpN$7pBV9*g6ESy z?(Hfr9ggR>?Y{zF67XjpJHZL_5VDIU=0x@(_C)l@^!?T^vDG{LPHQXK7|;SdkP{XH seJnO>UOpGP2$jNM&>9RNYspOD2HQ1nzZbp>LQaiZF!R1>IGPjwHv_xs2iP2=W@1TXN5}|g` zQY#0^q&`uUmYv8~E+PldD}RSy@B4q=r~bd!@EN{1N;>f+)C7pEoUsKWWDpNs3JqaG zttebecC|$`mI(hIadATQ6p5ij;zOv&6M4b=Of<{e-3xI)O}H||?G4erOPmVZDI&Ng z-7N80tMHVL6MZ(3i-^Q45pXNG-b7-au=a^d5ouc@)~AT!S>kMjNJGKxR0t0!9P30~ zkce&&Kb;E3H{qNh^f98pOdK5$gHfV&hG?H7cI4hGVynWU%+`Nclx4pOq8t+|`LQ=i rj4l(lls6?Syc3Q|=2|Krn=+cmQ5ZKnv{Y3nLi1enn3h&;+FJb|DWkts delta 326 zcmWNLPbkB27{;49I2i{{?CT(m9F{-X?N<)k-NEWvio*&ssUOV_`$?IaQu`*YIJhY0 zAWlmPmqpgk!Bv}tT8WdTo^QN|Pw(6FKE2Q5SdNuODMD0)y3n;oBpjkTY;ZeI_%;nz zL@VzR&Cf*mh`2i=dhdzJQ{qQxED~2jPlf1~+sPZ@ED`=3aa|@t2gIdtm?dIc;>}A| ztHH|-F|"?FAT32 Sector: -not foundCartridgeLӱӕyGh?h7h/h'hD>D>D>=A2560 K40A2560 K60M68SEC000chan_openChannel: PSG Muted.bad handlei486DX2 50i486DX2 60fchan_readCPU %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: %svqh_WWVVVWWVWW@ /sd0/hello.txtHello, world! +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: %srmd[JWVVVJWVJW@ /sd0/hello.txtHello, world! Memory %d MB 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 @@ -18,10 +18,9 @@ 0123456789ABCDEFcdev_init_systemcdev_register %s Contents of %s: bad device numberinvalid path nameprohibited accessunknown file typeF%d-%s -proc_exec stack: proc_exec start: ~lZH6$+.,;=[]/*:<>|\"?J3) CODEC initialized.Console installed.Interrupts enabledTimers initializedbad channel numberCommand not found.Mounting drive #%dPGZ 24-bit count: PGZ 32-bit count: fsys_mkdir error: directory not foundfile system timeoutoperation timed outtoo many open filesproc_run error: %d -chan_read(%d,%p,%d)chan_seek error: %dFile system error: fchan_write error: fsys_delete error: fsys_load_ext ext: fsys_open error: %da . - - 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)PGZ 24-bit address: PGZ 32-bit address: fsys_set_cwd error: +proc_exec stack: proc_exec start: lZH6$چ+.,;=[]/*:<>|\"?O8.$CODEC initialized.Console installed.Interrupts enabledTimers initializedbad channel numberCommand not found.Mounting drive #%dPGZ 24-bit count: PGZ 32-bit count: fsys_mkdir error: directory not foundfile system timeoutoperation timed outtoo many open filesproc_run error: %d +chan_read(%d,%p,%d)chan_seek error: %dFile system error: fchan_write error: fsys_delete error: fsys_load_ext ext: fsys_open error: %df 3 + 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)PGZ 24-bit address: PGZ 32-bit address: fsys_set_cwd error: Directory for /sd0/ Foenix Retro Systems SDC driver installed.Wrote %d characters. @@ -29,7 +28,7 @@ Directory for /sd0/ 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 #+-0}oXopux^Setting default loader.uart_open: no BPS tokenCould not open file: %d +volume has no work area m#^+S-D05'XopuxSetting default loader.uart_open: no BPS tokenCould not open file: %d File system initialized.Text system initialized.drive is write protected Select a boot source: @@ -41,23 +40,23 @@ Creating /sd0/hello.txt Booting: /sd0/fnxboot.pgz Booting: /sd1/fnxboot.pgx Booting: /sd1/fnxboot.pgz -Returning a bad extension.uart_open: no parity tokenCould not open directory %dG 6 -+ -* -6 -: [ \ 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. +Returning a bad extension.uart_open: no parity tokenCould not open directory %da Piގ3 +( +* +6 +: [ \ 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. uart_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 %dzzzzzztz^zHzA 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 5555s5g5 [5@O5C5666555 5@5566~6r6f6Z6 N6@B666 PC: %08X Address: %08X +FAILED: SDC driver installation %dFAILED: file system initializationtxt_get_device: number mismatch %dzzzzz{zezOz9zA 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 555v5j5^5 R5@F5:5665555 5@5566u6i6]6Q6 E6@96-6 PC: %08X Address: %08X Press SPACE for default. - _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / / / __/ //___ \/ __ \ / / / / / /___ / __/____/ / /_/ / / /_/ / \____//____/_____/\____/ \____/ PC: %08X       _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / __ / / __/ //___ \/ __ \ / / / /_/ /_/ /___ / __/____/ / /_/ / / /_/ /_ __/\____//____/_____/\____/ \____/ /_/ Unable to mount drive %s, FatFS Error: %d ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / //_/ / /| | __/ //___ \/ __ \/ / / / / ,< / ___ |/ __/____/ / /_/ / /_/ / / /| | /_/ |_/____/_____/\____/\____/ /_/ |_| $f9f;f<f=f> f?f@f;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 Ŀ + _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / / / __/ //___ \/ __ \ / / / / / /___ / __/____/ / /_/ / / /_/ / \____//____/_____/\____/ \____/ PC: %08X       _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / __ / / __/ //___ \/ __ \ / / / /_/ /_/ /___ / __/____/ / /_/ / / /_/ /_ __/\____//____/_____/\____/ \____/ /_/ Unable to mount drive %s, FatFS Error: %d ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / //_/ / /| | __/ //___ \/ __ \/ / / / / ,< / ___ |/ __/____/ / /_/ / /_/ / / /| | /_/ |_/____/_____/\____/\____/ /_/ |_| =f98f;3f<.f=)f>$f?f@f;f=f?f ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / / /| | __/ //___ \/ __ \/ / / / / / / / / ___ |/ __/____/ / /_/ / /_/ / / /_/ / /_/ |_/____/_____/\____/\____/ \____/ 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... ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / __ / /| | __/ //___ \/ __ \/ / / / / / / /_/ /_ / ___ |/ __/____/ / /_/ / /_/ / / /_/ /_ __//_/ |_/____/_____/\____/\____/ \____/ /_/ -yEzXGb@w[d]Q{>|+} 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 %,z` sl%aKVK@5@cABCDvGÐJ'cK[cPfHזmeiA;=?hj,* .!-" 0#/ + (!#*-<>@t[a]N{;|(} 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 ,le` ^W%LKA6+ @cABrCDGJBcKvcP$eHӖmeiA;=?hj,* .!-" 0#/ $ 2%1 &:4'3 (c6\5k9[aEAAEEEIIIOOUUYAIOU~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 S@UXZ\]^_abdefgjb,lmnpqstvwxyz{|d,~DE{ 0 P`"6Da&`l@N# @@ -73,225 +72,231 @@ 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"Uk"ukAkkkk k:k +  !kkkk::kkkkkkkkkkkkkkk>kb>k"Uk"okAkkkk k:k 0Bk -Ak"]nk"]nk?(!)k"jk)"}k)"k kkkc8k k -k k%'kikd>f>kH"hk -kk)!8kH"hkH"whkik +Ak"ok"ok?(!)k"fk)"}k)"k kkkc8k k +k k%'kikd>f>kH"hk +kk)!8kH"hkH"qhkik kki-k H :Hkwwk:k)k)k i k -"k -"k -kH"lhk.0kkk  k"U"F^)k""ؿk")"[""ٝ -wk:00k'' ɀ k:k 8k8[dH )"Vkk )"Vkk ) "Vkk )"Vkk )"Vkk )"Vkk )"Vkk )"Vkk )"Vkk )"Vkk )D"Vkk )"Vkk  8 k [𫫯f>d>+kO"Slk [𫫘b>"rX+k [ h )X+k [ h )x+k)kkZ"DY: czkZ"X:czk)8kZ$"ja7ezkZ"#j:zk8PI"Ukk"k"a"$"^Xk  " " )kZ)))zkwk    k"z"W'"5kHHHH"hhhhk  KiKMiMk -7k"k)k)k) +"Xk +"Xk +kH"lhk.0kkk  k"U"2^)k""k")"["" +wk:00k'' ɀ k:k 8k8[dH )"Vkk )"Vkk ) "Vkk )"Vkk )"Vkk )"Vkk )"Vkk )"Vkk )"Vkk )"Vkk )D"Vkk )"Vkk  8 k [𫫘 H (+k [𫫯f>d>+kO"Gkk [𫫘b>"rX+k [ h )X+k [ h )x+k)kkZ"DY: czkZ"X:czk)8kZ$"Ra7ezkZ"5j:zk8PI"Ukk"k"a"$"^Xk  " " )kZ)))zkwk    k) - #e  kZ   ;":zk"x0HzzkkZZ  "UH"^hzzk:   / k -   "okHHFf ee&hk2468k/ JJJJ /  kz"'Z:z"DkZ8PIzk"{k +#e  k"p"W'"BkHHHH"Whhhhk  KiKMiMk +7k"k)k)kZ   ;"6zk" y0HzzkkZZ  "UH" +^hzzk:   / k +   "jkHHFf ee&hk2468k/ JJJJ /  kZ8PIzk"k  H H" Whhb>"rXz -zk [𫫘"u+k)  -  k"%X   k"%X  J kZ) :8zk"%X  k   "hd"hk *,kZ  HH )H )"hhhh"`zk88(PI +zk [𫫘"+k)  +  k"%X   k"%X  J kZ) :8zk"%X  k:% +   k   "ʊd"ʊk *,kZ  HH )H )"hhhh"h`zk88(PI LHL k{= {= -}=={={=kk "Sl"Slk:     )  k"U"g -l>>":k:% -    kZ   yy I /yy zk# k +}=={={=kk "Gk"Gkk:     )  k"U"gbl>>"6kZ   yy I /yy zk# k  -"M +"G - "M z z -zk":" z  )   k"%X  J:kkdHHJee&hzk)8PI&"jaAekZ  )  zk("ɀ8 -ek [𫫘8d>d>f>f>f>d>+kZZ JJJJ JzzkZZ;"Z  zzkZ   -)HHHHH )"9;i -"`zkZ   -)HHHHH )";i -"`zk + "G z z +zk"6"uz  )   k"%X  J:kkdHHJee&hzk)8PI&"RaAekZ  )  zk("ɀ8 +ek [𫫘8d>d>f>f>f>d>+kZZ JJJJ JzzkZZ;"Z  zzkZ   +)HHHHH )"5;i +"h`zkZ   +)HHHHH )";i +"h`zk [𫫩z"=Z:z"?+k  -8PI"z +8PI"z zk  -8PI"z +8PI"z zk  -8PI"z +8PI"z zkHZ H $   ()h  zhhhk  -"|z +"|z zk   ):kH &H) -H)*EJ&h)jh)jhkZ"%X"    zk=" "8`>kkZ  A )8 -"[ J ) "[zk"[*"[#"[,"["["[E"[" ekZ  8     գI)8zk -   -  ) zz z -zk"Ҡ !  kH)ɀ))ɀ)zh @zzkhk -"Ps"NPHP -Nh" Wz -zk4"Wh"\]:HT"Whh"W:1"Whk +H)*EJ&h)jh)jhkZ"%X"    zk=""8`>kk  -8PId "z -zkZ  ) +8PI "z +zkZ  A )8 +"$[ J ) "$[zk"$[*"$[#"$[,"$["$["$[E"$["\ekZ  8     գI)8zk"Π !  kZZc( +" +"Ra8 + + + +zzkH)ɀ))ɀ)zh @zzkhk +"s"NPHP +Nh" Wz +zk +   +  ) zz z +zk4"h"c:HT"hh"W:1"hkZ  ) 1 e) -e"1pzkZZc, -" -"ja8 - - - - zzk +e"lzk ZZ ; -". zzz +"* zzz zk Z"%X  -!"qH"dh  zz +!"rqH"dh  zz +zk +Z +d"ʊ ' ; +"zz zk:0 H`Z&Mk  ;iHH ->>"(|hhz +>>"}|hhz zk  ) -H"^h H"^hz -zkH"^hZ  )Ȉ +H" +^h H" +^hz +zkH" +^hZ  )Ȉ I  )/) -Izk -Z -d"h'  ; -"zz -zkH +IzkH )+' )  - h((kZ  i  " H"hzzk + h((kZ  i  " H"hzzk   )"/Y: zz z zk i -)")  z +)")  z zk   H -"Sl zz z -zk"Wh4"Wh") H"h"W:1"Whk +"Gk zz z +zk"h4"h") H"h"W:1"hk [𫫘ZZ -)  H"hzz+z +)  H"hzz+z +zk +ZZZ +: +  ݦzzzz zkZ8PI0zk -1 e"Sl"gZ"KX18 PI"e  zzk [𫫘ZZ"U"V ` )%zz+k +1 e"Gk"lgZ"KX18 PI"e  zzk [𫫘ZZ"U"V ` )%zz+k ) -H"^h -ک H"^h -H"^hz +H" +^h +ک H" +^h +H" +^hz zk -ZZZ -: -  ڦzzzz + Z +:Ȉ + ަzzz z zk - [𫫘"Ps":< H< + [𫫘"s":< H< :h" W+z -zk]rUȗȗȗȗ:ȗ  k +zkrUȗȗȗȗ:ȗ  k [𫫘  -"   -"R:"^X+z -zk;8J  ;"gj;"M;";iJk"Ul"="rpj<"Z"X\y [𫫘Z & )4"jay$e"g & z+kZ  CC UU CC U* CC UU zk - [𫫘"Ps +"   +"R:"^X+z +zk +  "#a % + + + + + % zz z +zk;8J  ;"yj;"M;";iJk"Ul"9"spj<"g"X\z [𫫘Z & )4"Ray$e"g & z+kZ  CC UU CC U* CC UU zk + [𫫘"s  " W+z zk - [𫫘"Ps# + [𫫘"s# " W+z zk - [𫫘"Ps& H + [𫫘"s& H h" W+z zk - [𫫘"Ps&>@ H@ + [𫫘"s&>@ H@ >h" W+z zk - [𫫘"Ps&BD  D + [𫫘"s&BD  D B" W+z -zk - Z -:d  - ئzzz z -zkZ8PI08$"ja7!7$"jaezk - [𫫘"Ps$ H +zkZ8PI08$"Ra7!7$"Raezk + [𫫘"s$ H h" W+z -zkZZ"%X4   ))   7 zzk -  ";a$% +zkZZ"%X4   ))   7 zzkZ    =) +?1   # +  ) - % zz z -zk/):#):k + 1  "lgzk/):#):k   - )"@ZH)"@Zh8 ) Պzz z + )"VZH)"VZh8 ) Պzz z zk Z )"X  w"X  zz -zkY>.>@>>'>C>==*>>>>>>~\>^>k [𫫘Z"G" -"|"^Xz+kZ8PI9V"jaOeH":hzk -  "Ps&JL HL +zkY>.>@>>'>C>==*>>>>>>~\>^>k [𫫘Z"T" +"|"^Xz+kZ8PI9V"RaOeH"6hzk +  "s&JL HL Jh" Wzz z zkZ     J  jj) ec  :  ȈǣzkZZ   JJJJ ))#) 8PI0 8PI0 -"jaczzk7 Z UȗȗȗȗkZZ:2    zzzk - [𫫘"Ps* HHH +"Raczzk7 Z UȗȗȗȗkZZ:2      zzzk + [𫫘"s* HHH h" Whh+z zk - [𫫘"Ps*68H H8 + [𫫘"s*68H H8 6h" Wh+z -zkZZ8PI0zzk8PI0Ӣ"mqZ  CC  CC    :zkZZ  "a7  ;iH;i"hh +zkZZ8PI0zzk8PI0Ӣ"mZ  CC  CC    :zkZZ  "a7  ;iH;i"ƫhh "^Xzzk - [𫫘"Ps( H + [𫫘"s( H h" W+z zk - [𫫘"Ps(&(  ( + [𫫘"s(&(  ( &" W+z zk - [𫫘"Ps(*,  , + [𫫘"s(*,  , *" W+z -zkZ    A) - - -?1   # -  ) - - - 1  "gzk -Z"Ps  -" WH] ":hzz +zkZ;  )H)h8   :zzk +Z"s  +" WH] "6hzz zk - ["4"]n"]n"ui -"u + ["{4"o"o"oi +"o PI0+z zkH) H )87IJj(hk( *(zzk [𫫘  -" -"Bhh"^X+z +" +"Bhh"^X+z zk - [𫫘"Ps*24 H H4 + [𫫘"s*24 H H4 2h" Wh+z zk ZZ\>^>^> @@ -299,99 +304,99 @@ ZZ zk = -}=" W:Ӌ [𫫘ZZZ"U"V'  l    l zzz+k [𫫘ZZZ"U"V'  `    ` zzz+kZZJJJJJ)?HJJJ))H#H JJJJJ)H J))iH "Wh;i -zzkZ"aC  )zk:,:#2468246 8kZZZ  .o20o4""jac @ ` 0."ܮzzzk +}=" W:Ӌ [𫫘ZZZ"U"V'  l    l zzz+k [𫫘ZZZ"U"V'  `    ` zzz+kZZJJJJJ)?HJJJ))H#H JJJJJ)H J))iH "h;i +zzkZ"aC  )zk:,:#2468246 8kZZZ  .o20o4""Rac @ ` 0."خzzzk ;8 -;"tHH -;i"[hh;iz -zk;8T>8PI0:HHH;i "D~hhh;i":;iTkZd;  )H)h8   :zzk;8 -#JJJJ  #   ;i"E;i +;"tHH +;i"[hh;iz +zk;8T>8PI0:HHH;i "?~hhh;i"6;iTk;8 +#JJJJ  #   ;i"@;i k ;8 -;"lHH -;i"[hh;iz +;">mHH +;i"[hh;iz zk -ZZ8PI6""ja;e +ZZ8PI6""Ra;e " Wzzz zk ;8 -;"l;iH -;i"[hh;iz +;">m;iH +;i"[hh;iz zk -"d > +"d > > -G>"Z.>"Z>"Zz +G>"Z.>"Z>"Zz zk"U -;8  i "a  i "a;i k;8T>8PI0>HHHH`;i "D~ hhhh;i":;iTk +;8  i "a  i "a;i k;8T>8PI0>HHHH`;i "?~ hhhh;i"6;iTk ZZ  -  "  w `>zzzz z -zkZ8PI0zk""ja;;""jae [𫫘ZZZ"U"V.' l I%   l zzz+k +  "  w `>zzzz z +zkZ8PI0zk""Ra;;""Rae [𫫘ZZZ"U"V.' l I%   l zzz+k [𫫘Z  -" -")_"|"^Xz+z +" +"_"|"^Xz+z zk [𫫘Z  -" -"6f "|"^Xz+z +" +"6f "|"^Xz+z zk Z    "8X   ::zzz z zk  - ?  2)(d"&hhz + ?  2)(d" hhz zk Z -Hg"hh -"rZH -HH"4hhhک ":hzz +Hg"dh +"ZH +HH"8hhhک "6hzz zk Z   -"rZ e  +"Z e   ) zzz z zk  -  [𫫘"Ps .. 0 "0 +  [𫫘"s .. 0 "0 . " W+zz z zk -  [𫫘"Ps .R T "T +  [𫫘"s .R T "T R " W+zz z zk ZZ -"U" a: "U"^:zzz +"U"`: "U"^:zzz zk ZZZ  -"$/;i -". zzzz +"$/;i +"* zzzz zk ;8J -;"gj)  ;"M;";iJz +;"yj)  ;"M;";iJz zkZ    N#) 1 e  !) -1 e ' "gzk +1 e ' "lgzk   -"'Z:<w +"=Z:<w  eɀz -zkZ    P') "jae  %) "jae ' zkZRM&(H)h8PI0 "'e zzk;8T>8PI0FZHZHHHHH;i"D~ ;i ;i":;iTk +zkZ    P') "Rae  %) "Rae ' zkZRM&(H)h8PI0 "'e zzk;8T>8PI0FZHZHHHHH;i"?~ ;i ;i"6;iTk ZZ  -"F[:<w +"\[:<w  eɀzzz zk -  [𫫘"Ps 0" $ $H$ +  [𫫘"s 0" $ $H$ " h" W+zz z zk ZZ    @@ -400,9 +405,9 @@ z zk Z 0B;H -i"hhzz +i"ƫhhzz zk - [𫫘ZZ8PI2""ja;e + [𫫘ZZ8PI2""Ra;e " Wzz+z zkZi  8PI0  zzke  Z    NH1 ) @@ -410,122 +415,123 @@ z ehH1 ) -eh"gzzk +eh"lgzzk ZZ %;i -" zzz -zkd"'W:Z&" z   )  6HH"4hh    "ozkZV            I%  zk +" zzz +zkd"'W: Z -"h  ; -" -": -"izz -zkZ    PH) "jaehH) "jaeh +"ʊ  ; +" +": +")hzz +zkZ&"uz   )  6HH"4hh    "jzkZV            I%  zkZ    PH) "RaehH) "Raeh zzk - [𫫘ZZ8PI6""ja;e + [𫫘ZZ8PI6""Ra;e " Wzz+z zk 8ʆ8ʆ  $2 0 -d"\eHe +d"\eHe hz zk [ Y )d Z )Ȉ & [ )+k -ZZ8PIG6"ja!:e% +ZZ8PIG6"Ra!:e% " Wzzz zkZ   0 P9  E a 0f  % A F  )i)i )80zk ZZ -"aC;iH -"hh R "|"^Xzzz +"aC;iH +"ƫhh R "|"^Xzzz zk;8 - "|"|b>HH  "]hh;i + "|"|b>HH  "]hh;i k - Z "a + Z "a  < - " "rZ)"^Xzzz z + " "Z)"^Xzzz z zk P X Y Z [ ] ^ _ X \ X k ZZ -t": -"a/;H;i"jhh) +t"6 +"a/;H;i"Uhh) "^Xzzz zk - [𫫘Z"Z -)&"jaAe"# -"c q$ z+z + [𫫘Z"Z +)&"RaAe" +"d q$ z+z zk Z  -0 2  " - "zzz z +0 2  " + "zzz z zk ZZZ 8PI - ;iH"ohhH:H"ohhzzzz + ;iH"phhH:H"8phhzzzz zk ZZZ  8PI0zzzzz z zk "U -cH"^h8PI0/8PI0    .      "k +cH" +^h8PI0/8PI0    .      "k [𫫘 -HH"hhh8PI+ -6"ja!:e6"1p+z -zk -ZZ";aN8,"% - - - - - ) ) JJJJ zzz +HH"dhh8PI+ +6"Ra!:e6"l+z zk ZZ\  C7 -"d0 +"d0 zzz zk ZZZ 8PI - ;iH"ohh8HH"ohhzzzz + ;iH"phh8HH"8phhzzzz zk ZZZ 8PI - ;iH"ohhcHH"ohhzzzz + ;iH"phhcHH"8phhzzzz zk ZZZ 8PI - ;iH"ohh8HH"ohhzzzz + ;iH"phh8HH"8phhzzzz zk ZZZ 8PI - ;iH"ohhcHH"ohhzzzz + ;iH"phhcHH"8phhzzzz zk - ;8R >8PI0B;i^H ;i"}hh;i> +ZZ"#aP8,"% + + + + + ) )JJJJI)8 zzz +zk + ;8R >8PI0B;i^H ;i"}hh;i> >" W;iRzz z zk ZZZZ   -"rZe) +"Ze)      zzzzz zk - ZZ  "0< "[0* "U%zzzz z -zkZZ8PI*8PI Ȉ :H:H"ohhzzk + ZZ  "0< "\0* "U%zzzz z +zkZZ8PI*8PI Ȉ :H:H"8phhzzk Z 8 -PI0@ "ja  4 - "jae"ze: zz +PI0@ "Ra  4 + "Rae"e: zz zk - [𫫘ZZZZ;i;":;$ + [𫫘ZZZZ;i;":;$ " Wzzzz+z zk ZZZ  8PI c   zzzzz z zk -"i +"i Z - X"|H H"(hhh8PI  e ӊzzz z + X"|H H",hhh8PI  e ӊzzz z zkZ  )   ) @@ -535,125 +541,125 @@ z e) e  zzk - [𫫘ZZ8PII""ja;e%HH + [𫫘ZZ8PII""Ra;e%HH h" Whzz+z zk - ;8R >8PI0B;i^H ;i"}hh;i> + ;8R >8PI0B;i^H ;i"}hh;i> >" W;iRzz z zk ZZZ   -;"*(8PI2 +;"'(8PI2 '7) -"zzzz +"zzzz zk ZZ  -": "a*;iH -"jhh +"6 "a*;iH +"Uhh "^Xzzzz z -zk"n#"Whb|"1mhh"nX"Whb"*"n "Wh|""n"C|"CkZi:] +zk"#"hb|"mhh"X"hb"%" "h|"""?|"?kZi:] DH`"WM"WD? ' 0 @ ! '   zk Z("ɀJ=ɵ6% e 8 ֊i)zz z zk - [𫫘ZZ8PIN""ja;e*HH + [𫫘ZZ8PIN""Ra;e*HH h" Whzz+z zk - [𫫘ZZ8PIN""ja;e*HH + [𫫘ZZ8PIN""Ra;e*HH h" Whzz+z zk    -L       "1pȷ   "Sl i +L       "lȷ   "Gk i zz z zk Z   - "@ + "@ :)0 -i2 0 "V/hzzz z +i2 0 "M/hzzz z zk ZZ -HH."Whhh -"h0/"͗H"ɰh"T):ܣ"$H| "Whhzzz -zk;88PI0! ;i"E;ik%ک8;ie  FfFfFfFfZ  )az8 ʆɀ8H)zk;8 +HH."hhh +"h0/"ɗH"Űh"P):ܣ" H| "hhzzz +zk;88PI0! ;i"@;ik%ک8;ie  FfFfFfFfZ  )az8 ʆɀ8H)zk;8 cJ iH he   ;i k:  ;8 -JJJJ))  ))  JJJJ)  )  ;i"E;i +JJJJ))  ))  JJJJ)  )  ;i"@;i k ZZ  8PI0 -"(zzzz z -zk8PIH ch  [𫫘;8RZ;i"D~h ;i"hh"|"^X;iR+kZZZZ  88PI0zzzzko4""ja86PI0 2ce @  `  +"$zzzz z +zk8PIH ch  [𫫘;8RZ;i"?~h ;i"hh"|"^X;iR+kZZZZ  88PI0zzzzko4""Ra86PI0 2ce @  `  Z -"af -""^XW% -eHeh""^X+ eHe -h""^Xzz +"af +""^XW% +eHeh""^X+ eHe +h""^Xzz zk ZZZZ  8PI0zzzzzz z -zk "U"F^H +zk "U"2^H c h  ZZZ +   zzzz zk -cH"h +cH" h Z  - i  )     "    @' ) -"i)zzz z -zkZZZi0  :  ;8"ja!&e"HZ":h)H;iH":hhh"^Xzzzk -  [𫫘ZZZZ;i;":G0H   + i  )     "    @' ) +"i)zzz z +zkZZZi0  :  ;8"Ra!&e"HZ"6h)H;iH"6hhh"^Xzzzk +  [𫫘ZZZZ;i;":G0H    h" Wzzzz+zz z zk ZZZZ  -i"*[  7i -"*[Hhzzzzz +i"@[  7i +"@[Hhzzzzz zk Z  - "7O + "7O )   $  zzz z zk [𫫘ZZZZ -CC"Q +CC"{Q G -="]n -  "ui -"u +="o +  "oi +"o PI0zzzz+z -zk;8 8 PIx;i H"o;iH"(w c c 8;i H"{w d8"s;iH!"{w;i;ik +zk;8 8 PIx;i H"p;iH"}w c c 8;i H"w d8"s;iH!"w;i;ik Z  -H "rZh+ "rZe  zzz z -zk c)"YZH -ch  [𫫘;8T"p hhhh]H]HHl;i "D~hhh;i"oR"|"^X;iT+k +H "Zh+ "Ze  zzz z +zk c)"oZH +ch  [𫫘;8T"t hhhh]H]HHl;i "?~hhh;i"oR"|"^X;iT+k ;8: -;i;i"A:O;i",1+1  +;i;i":O;i"#1+1   -;i";i:z +;i"ΰ;i:z zk ;8T ->8PI/"C_H -HH;i "D~ hhhh&ڥ -HHd;i "D~hhh;iH"hh;iTz -zk [𫫘ZZZ;H"\hhhhF&HH"&hh1H ":hH ":hzzz+k +>8PI/"Y_H +HH;i "?~ hhhh&ڥ +HHd;i "?~hhh;iH"$hh;iTz +zk [𫫘ZZZ;H"\hhhhF&HH" hh1H "6hH "6hzzz+k [𫫘;8 -;i;" >&("( +;i;" >&("( &" W H -":h ;i +"6h ;i +z zk [𫫘;8 -;i;" >*,", -*" W H2":h ;i +;i;" >*,", +*" W H2"6h ;i +z zk @@ -667,23 +673,23 @@ z zk Z  4  6 -g " O - i8 "bh +g "O + i8 "bh 4 6 zzz z -zkZZZ -86PI0088PI088"l8:.0o2o4zzzk [𫫯CLC"/v:#"/v:4"/v: CV" VCC ɿ 4CC    C"VC+k +zkZZZ -86PI0088PI088"l8:.0o2o4zzzk [𫫯CLC"v:#"v:4"v: CV" VCC ɿ 4CC    C"VC+k [𫫘;8 -H"hh;i;i":B "  -" W"c;i +H"dh;i;i":B "  +" W"d;i +z zk [𫫘;8 -;i;" B"$&H $ -"h" W H ":h ;i +;i;" B"$&H $ +"h" W H "6h ;i +z zk ZZZZ  -8PIV "U"F^   +8PIV "U"2^   5 + c  zzzzzz z zk @@ -696,18 +702,18 @@ z Ȉ &)dz zk - `>Lc~ f8ʆ + `>L_~ f8ʆ 8ʊ -"\z +"Xz zk Z  - i e )8PIF cH"h c   zzz z -zk;8 8PI0L´;iH"ohh;iH"(whh8PI -cc8  ;iH"{whhd "s;iH"{whh;ik8HHH + i e )8PIF cH"h c   zzz z +zk;8 8PI0L;iH"phh;iH"}whh8PI +cc8  ;iH"whhd "s;iH"whh;ik8HHH **** * * * 8Hh hhhzzz****Jh;i(khhhhhzzzz(k ZZ -."  v 8PI0\    +)"YZH +."  v 8PI0\    +)"oZH ch c  zzzz z zk Z  @@ -715,77 +721,91 @@ z zk ZZZ  %;i -" S 4  -";i -"zzzzz z -zkd"'W:L +" S 4  +";i +"zzzzz z +zkd"'W:L ZZ - )"5W::   "CW:S))e:"a  zzzz z -zkZ?8PI@8PI0PG"98 A"9:P8PI0"PG"c A"zk + )"5W::   "CW:S))e:"a  zzzz z +zkZ?8PI@8PI0PG">8 A">:P8PI0"PG"c A"zk  [𫫘;8 -;i;" K.0/H  0 -. h" W H* ":h ;i +;i;" K.0/H  0 +. h" W H* "6h ;i +zz z zk  [𫫘;8 -;i;" N243HH  4 -2 h" Wh H* ":h ;i +;i;" N243HH  4 +2 h" Wh H* "6h ;i +zz z zk "Uix -d" ""dd"mq"mq"mq"U -PI0d"mq"mq"mqz -zkZ "h8PI0T8PI0zk$"ja77$"jae6"ja!:!:6"jaeLO;864 p oW6!\#%+-/1Ã')35;":9;";i6k +d" ""dd"m"m"m"U +PI0d"m"m"mz +zkZ "d8PI0T8PI0zk$"Ra77$"Rae6"Ra!:!:6"RaeLK;864 [  +kW0!\#%+-/1')35;":9;";i6k ZZZ -##"sV"~Wʆ""~Wʆ" 8PI00c +##"sV"~Wʆ""~Wʆ" 8PI00c 7cWc     -"sVЁzzz\;8 cD           ;ik  +"sVЁzzz\ ZZ     -":L  ; -" [  -"; -"; -"#  zzzz z -zk/)$*,"L׿+&*,"c@+&*,"3@+&*,"k;8 +":L0  ; +" [  +"; +"; +"#  zzzz z +zk/)$*,"L+&*,"c@+&*,"3@+&*,"k;8       ;i -k"h) +k",i) _vH) -hT#:.#:  )" JJ   L +hT#:.#:  )" JJ   L- ;8T -HHK "Whhh +HHK "hhh -"h8PInH"Wh;i"D~;i"rZH;i H "'ک -"Wh ;i -"HF"Whh;iTz +"h8PInH"h;i"?~;i"ZH;i H "7ک +"h ;i +"ۏHF"hh;iTz zk ;8 cJ  cic    Ȁ ;iz -zk:L;8"         j -UZ>!;":"  ;";i"kZsBBBB8 PI0_ h i j l m n ` a b zzk +zk:L;8"         j +U%Z:!;":"  ;";i"kZsBBBB8 PI0_ h i j l m n ` a b zzk -eLl +eL Z  V 0 E X - x $ȷ )" -:  E% 0 6 X + x $ȷ )":  E% 0 6 X x ! 8PI08PI0 zzz z zk -Z8PI0Lţ$"ja7e +Z8PI0Lģ$"Ra7e r 8PI/ -6"ja!:eE -"| -"|zz +6"Ra!:eE +"| +"|zz zk + Z   +     LŠ)L  w   +) e    @ Z   a "z   +" +E  H"hzz z +zk + Zi + +) +eHeh) 8g +ȗ +i8 8ʠȗ +Hȷ +h"z\ Z  -"_b +"Gb  c i @@ -797,7 +817,7 @@ z ȗȗȗȗ ȗ ȗzzz z zk;8  - ;"Z Lqǣ + ;"Z Lgȣ  @@ -808,32 +828,24 @@ z    ;i -;i"A;ik         -      y "_8 PI0(z"WW"4hh"ok -Z A"SPG""PG"c A"?"Sń'7""PG"98 A"9:zk - Zi - -)) -eHeh)) 8g -ȗ -i8 8ʠȗ -Hȷ -h"z\ +;i";ik         +      y "_8 PI0(z"WW"4hh"jk +Z A"SPG""PG"c A"?"Sń'7""PG">8 A">:zk  [𫫘;8  H HHHG -":hhhh;i;i"J  . +"6hhhh;i;i"J  . H   h" WH2 -":h;i +"6h;i +zz z zk ZZ -)L64 -i8"bhL  84(H6*h "H  ;4 wH6"wh -i8"bhzzz -zk;8;"{8 +)L64 +i8"bhL  84(H6*h "H  ;4 wH6"wh +i8"bhzzz +zk;8;"8 ) @@ -841,102 +853,96 @@ z ʪʠ Ȉ & ʠȈ -& ʆFj;ik - Z   -     L͠  L  w   -) e    @ Z   a "z   -"E  H"hzz z -zk [𫫘8PI0LΘ""ja;e +& ʆFj;ik;8 c  g       )   ;ik ҋ [𫫘8PI0LΘ""Ra;e -  +kZ J Lϯ*ʆ&ʆ"<",ʆ(ʆ"<$  s  i) -ʆ&ʆ"<) -ʆ(ʆ"<"8$8 "$ zk +  +kZ J Lϯ*ʆ&ʆ"M",ʆ(ʆ"M$  s  i) +ʆ&ʆ"M) +ʆ(ʆ"M"8$8 "$ zk ZZZ  ; -".LeХ  -"Mt -"d A  -" -"W zzzzz z -zkIIڅd*8&zzkHCh"{H"{Ik$8$8 +"*LvХ  +"Mt +"Jg A  +"ΰ +"W zzzzz z +zkIIڅd*8&zzkHCh"H"Ik$8$8  ddd d & &&8& & zz -z zkEH"z8kk;8  LCүH h 8PI0j ) +z zkEH"z8kk;8  LTүH h 8PI0j )     '  ) e  %  ) -e  4e  e  L;izk +e  4e  e  L;izkZZZZX + + + + +c  :L!ӣ +H`HH? "{hhnHH; "{hhRHH+ "{hh6HH7 "{hhHH3 "{hhH "qh)"."ބzzzzk ;8      - "ML0Ӡ + "ML0Ԡ ic  8<PI0S;iH -i "hh  ;i +i "ƫhh  ;i z -zkZZZZX - - - - - c  :Lԣ -H`HH? "hhnHH; "hhRHH+ "hh6HH7 "hhHH3 "hhH "wh)"3"zzzzk;8V- U q΃c[! -#%$`79\;=]')z{+-6]/1\35ܮ?AWCE{GIlKMOQ^SU;"D;iVk;8 -;H"{wd"_"AHHH"K;i dd"8d""" 8PI0"""ohh;i -kHH "hhdd "3d "  ZZH"hh0V8PII$"ja77$"jae$"ja7ew8PI0Y$"ja7J$"ja77$"jae$"ja7ezzk +zk;8Vw- U r΃?y[!#%^79\;=#]'){+-H]/1[35خ?AWCE&|GIlKMOQ_SU;"/;iVk;8 +;H"wd"p"=HHH"H;i dd"2d""" 8PI0"""8phh;i +kHH "{hhdd ".d "ބ  ZZH"dh0V8PII$"Ra77$"Rae$"Ra7ew8PI0Y$"Ra7J$"Ra77$"Rae$"Ra7ezzk ZZZ  -   , .7  . , "M t -  ":I      "Wzzzzz z -zk;8 / ;i"u;i"uH;i"rZh?;i"|:"phhhh;ik;ic   A +Z  )"@ZH;ich L[ +   , .7  . , "M t +  "6I      "Wzzzzz z +zk;8 / ;i";i"H;i"Zh?;i"#x:"thhhh;ik;ic   A +Z  )"VZH;ich Lh ;8    -" :L٥ - "  46 -i8"Sl +":Lڥ + " 46 +i8"Gk i8 -6H c "bh c  +6H c "bh c   ;i zz z -zk;8JLۯ L    JJJJ ) )))) ) +zk;8JLۯ L    JJJJ ) )))) ) _vH) -h T#:.# :   )" JJ   L';ik +h T#:.# :   )" JJ   L4;ik ZZZ  -  "ML۩ -  ":j    ) " "WLMۣ zzzzz z +  "ML۩ +  "6j    ) " "WLZۣ zzzzz z zkZZZ: 8PI0.80PI0/"XVPI0 -80Lܩ$8PIL܊80PI09"[VPI080^8aPI0V"XVPI0i28API06"XVPI0izzzk +80L ݩ$8PIL܊80PI09"[VPI080^8aPI0V"XVPI0i28API06"XVPI0izzzk  [𫫘;8  H -HHH "hhhhh;i;i"q HH6":hh . +HHH "dhhhh;i;i"q HH6"6hh . H   - h" WH+ ":h;i + h" WH+ "6h;i +zz z zk ;8   - 8PILߣ"ja 8PI0Lߣ8 :8PI0m - "E8 PI02 c + 8PIL&ߣ"Ra 8PI0L&ߣ8 :8PI0m + "@8 PI02 c -lCjC "E -H "0h  H "0h H "0h:L;i z +lCjC "@ +H "4h  H "4h H "4h:L;i z zk -  [𫫘ZZZN"h"|8PI0L 6"ja!:eL#" n ` +  [𫫘ZZZN"d"|8PI0L-6"Ra!:eL0"% n ` E H  -h"c" W  zzz+zz z +h"c" W  zzz+zz z zk [𫫘Z8PI0 -z+zke  ie  ie  ie  ie  ie  ie  LL;8@;i ;i"A:LQ ;i ",1_7  ;/+)  "ۦH h 7  +z+zke  ie  ie  ie  ie  ie  ie  LY;8@;i ;i":L^ ;i "#1_7  ;/+)  "צH h 7    :  ;i@k ;8   -  "YW"Sl ) - "A;i +  "YW"Gk ) + ";i zz z zk: @@ -952,64 +958,64 @@ z  c i -cH"QWchȗ LZZ -"WhZ"68PI0Lt3":@"hhL[ @ L[ @ L[䯞@e@@"z@H@H"Whhh@@H"Whhh@"Whhh@"hhL"n":H":hzzk - ZZZZ)* -  ϧ) L)*  ϧ) -!   -zzzzzz z -zk - ;8$8PI0L8PI0L$"ja7e -$"ja7e    -i;i "1p i -i "1p;i i "1p;i$zz z -zk - [𫫘;8;i# - & L;i4"jay$e" "^XL   8PIL;ic -i c   -i c);i+z -zk - [𫫘;8;i# - & L;i4"jay$e" "^XL   8PIL;ic -i c   -i c);i+z -zk - ZZZZ    L() +cH"QWchȗ L + ZZZZ    L) -)oHoh8PIL1 ) +)oHoh8PILU1 ) e  ) -?1   # +?1   # -  # +  # -  ) +  ) - 1  "g4e - e   L]zzzzz z + 1  "lg4e + e   Lzzzzz z +zkZZ +"hZ";8PI0L3"6@"hhL @ L @ L寞@e@@"!{@H@H"hhh@@H"hhh@"hhh@"hhL"n"6H"6hzzk + ZZZZ)* +  ϧ) L)*  ϧ) +!   +zzzzzz z +zk + ;8$8PI0L8PI0L$"Ra7e +$"Ra7e    +i;i "l i +i "l;i i "l;i$zz z +zk + [𫫘;8;i# + & L;i4"Ray$e" "^XL   8PIL;ic +i c   +i c);i+z +zk + [𫫘;8;i# + & L';i4"Ray$e" "^XL*   8PIL;ic +i c   +i c);i+z zk [𫫘;8  -"8PI & LX & LG)B;i"]h;i4"jay$e"* -4"jay$e"HB":h"^X & ;i+z -zkLl +"8PI & L] & LL)B;i"]h;i4"Ray$e"* +4"Ray$e"HB"6h"^X & ;i+z +zkLq  [𫫘;8! CC -  "Lz -Lz#eHe +  "{L +L#eHe h - Lz8#PIcHcheHe + L8#PIcHcheHe h - "]n  -  "ui "u PI0L;i+zz z + "o  +  "oi "o PI0L;i+zz z zkH )&" ) @@ -1022,150 +1028,150 @@ z ж0 8 𚰥hkH88HdR8W)) *)(j)J(j zzkJjfȀ( -  [𫫘ZZZ"Ps LF H L )"ҠL;iH"ohhH"ohhL;iH"ohhHJJJI)8 +  [𫫘ZZZ"s LF H L )"ΠL;iH"phhH"8phhL;iH"phhHJJJI)8 -H"ohht;iH"ohh8PI=H:H"ohh HH F  -h" WH:H"ohhHH +H"8phht;iH"phh8PI=H:H"8phh HH F  +h" WH:H"8phhHH F h" Wzzz+zz z -zkZZZZP8<8;H"{w -"WhAHAH"WhAHAH"WhAA"Hs"WhAHAhZJJJJH"Wh;iAHAHAH "WhAHAHAH "Wh ;i H"{w"o;izzzzk@")f"cdH̢:dFfc c  e +zkZZZZP8<8;H"w +"hAHAH"hAHAH"hAA"Hs"hAHAhZJJJJH"h;iAHAHAH "hAHAHAH "h ;i H"w"8p;izzzzk@"}f"~dH̢:dFfc c  e * &ؘ8ce~hhhhhh/FffF8&/y$0&&ddZddQH)hF8&H)h)H)h) J Jȥ -Z먊JjzkZZZZL~ l  -(#LuLu)#cLb~ +Z먊JjzkZZZZL l  +(#LzLz)#cLg~ H`8`f8P\cR8H80>8 48*8)88 e  -eLzzzzk +eLzzzzk ;8    -i"*[:L'): "ja  1@')" ɀL +i"@[:L'): "Ra  1@')" ɀL  e j -)e"*[; ɀ9    +)e"@[; ɀ9    e';i zz z -zk  L -;8;i H"ohh;iH"(whhLQL c ;iH"{w H"df;iH"{w;i -L c  ;iH"{w H"df;iH"{w;i -L c c8  ;iH"{w H"df;iH"{w;i +zk  L +;8;i H"phh;iH"}whhLQL c ;iH"w H"f;iH"w;i +L c  ;iH"w H"f;iH"w;i +L c c8  ;iH"w H"f;iH"w;i ;iz zk ;8  -:  8PI0L;iH;i "jhh ] ) E      -E L3  +:  8PI0L;iH;i "Uhh ] ) E      +E L8  ;izz z zk ;8  -"+L L/  : +"+L%L4  : ;i e /  -;i e"+;iz +;i e"+;iz zk iH -he"H +he"H -;i ehL} +;i ehL [𫫘;8        JJ -              #   "Ctd"ja "Cte "Ct"Ct# "Ct0   "Ct"Ct +              #   "td"Ra "te "t"t# "t0   "t"t ;i +z z zk ;8   - L ;i;i"AL  -",1L+ 0G7)+ "ۦ + L;i;i"L  +"#1L+ 0G7)+ "צ  ,  -"M  ;i +"M  ;i z -zkZ"'Z:"DLi"\]Lf):L^))  )  <)H"  hLi )H"  hLi@)H"  hLi)H"  hm?)H"  hC)H"  h')H"  h "\]LCzk")f"kI")f"k"cdHhڥ -E\8~FfjJ8 +zkZ"=Z:"?Ln"cLk):Lc))  )  <)H"  hLn )H"  hLn@)H"  hLn)H"  hm?)H"  hC)H"  h')H"  h "cLHzk"}f"kI"}f"k"~dHhڥ +E\8~FfjJ8 Fl$ zzzku **Ji Jȣ fjhhzkFeeJjj8j ЧгH JhȈkЗF@ + ZZ  L7 L  L    L  L  L"Yȷ   + + "  L +e8  +Ш    5  ȷ +  +ȗ  :"Yzzzz z +zk ;8         -i"a ): "ja)  +i"a ): "Ra)  e -)e"a    L> +)e"a    L  e :  @    ;i zz z -zk - ZZZZ - :8PI0LY -"(L[8PI0LN) c q -W = c  c ] c ] c J8PI": c L;zzzzzz z zkA(A + ZZZZ + :8PI0LE +"$LG8PI0L:) c q +W = c  c ] c ] c J8PI": c L'zzzzzz z +zk ZZZZ -  L;i"i"=V - "=V +  "=V  "=V   -"=V": - N"`>D +  Lo;i"i"=V - "=V +  "=V  "=V   +"=V"< - N"`>D .8"`>    %  "V  "Vzzzzz zk @ -ZhhJjhzkک")f"cdHҘ8i0 +ZhhJjhzkک"}f"~dHҘ8i0 *$ &$8 &ccd&8&&&8j$Ff19Ffj  ,&JȀJ dd ZhhhhJjzzk - ZZ  L7 L  L    L  L  L"Yȷ   - - "  L -e8 -d    5  ȷ -  -ȗ  :"Yzzzz z -zk ;8   -i"*[:L:?'): "ja  4@')$  -e:L:L: -)e"*[ ] ɀQ   "Q  -e"Q  , +i"@[:L7?'): "Ra  4@')$  +e:L7L7 +)e"@[ ] ɀQ   "V  +e"V  , ;izz z -zk  Ls;8:\ U ͈%V㡃(!I#%i')j/1U35Z+-779;i":L U ͈%V㡃(!I#%i')j/1U35Z+-779;i""&hhh;i:k -;8;i H"ohh;iH"(whhLL H"dfhL ;iH"{w H"df c  ;i H"{w H"df;iH"{w;iL c c8  ;iH"{w H"df c  8:;i H"{w H"df;iH"{w;i;iz +zk  Lp;8:\ U Ȉ%Vߡ$!E#%i')f/1U35Z+-379;i":L U Ȉ%Vߡ$!E#%i')f/1U35Z+-379;i""3hhh;i:k +;8;i H"phh;iH"}whhLL 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<Lv 87g0f + ZZZZ<Ls 87g0f g   ȷ   ȷ g7 80] -"Vȷ"Vȷg7H h"zzzzzz z -zkZZZ "jaec  )"Ҡ "R`\@"R`O1 Oyy y  "_"R` "R`  L +"Vȷ"Vȷg7H h"zzzzzz z +zkZZZ "Raec  )"Π ":`\@":`O1 Oyy y  "_":` ":`  L + ~ - ~     ~   a  . ywz"F[:"zy)))"ӆzzzk + ~     ~   a  . ywz"\[:"zy)))"Άzzzk ;8  - " 7)L6 7)$ + " 7)L3 7)$  Ȉ & -8 PI0     "E!)_ +8 PI0     "B!)_   - ":i:У    "E! "i;i zz z + "ݶ:i:У    "B! ")h;i zz z zk ZZ  -" L   L   L  -i8"Sl -i6U"a -i8RRaA" -irrAa" -i " -i$"&$4664 -i8"bh  H"_hzzz +"L   L   L  +i8"Gk +i6U"a +i8RRaA" +irrAa" +i " +i$"&$4664 +i8"bh  H"._hzzz zk - ;8 <Lc)   "_b + ;8 <Lc)   "Gb  ci @@ -1173,136 +1179,135 @@ z   ȷ  -L +L ȷȷ8 Y g  -c    7 H  h" +c    7 H  h" i;i zz z zk [𫫘ZZZ 8 -PI0L: "ja  L "ja  8PI0LF8PI` -c   A)"YZH "jaech  "jaezzz+z -zk "jaec LL@ +PI0L7 "Ra  L| "Ra  8PI0LC8PI` +c   A)"oZH "Raech  "Raezzz+z +zk "Raec LL= ZZZZ  - L L& -"5|L "a LE L %L -"5|p8ʆ'   Lzzzzzz z + L L& +"&|L "d LE L %L +"&|p8ʆ'   Lzzzzzz z zk  [𫫘ZZZ  -"8PI% q$ L] q$ D ":LK" L* H":h  -&"jaAe"  WH ":h q$ "c"^X!": q$ zzz+zz z -zkL7 +"8PI% q$ LZ q$ D "6LH"% L' H"6h  +&"RaAe"u  WH "6h q$ "d"^X!"6 q$ zzz+zz z +zkL4 ;8 -"Wh +"h -8PI0';i H"Whhh;iz +8PI0';i H"hhh;iz zk8 PI= -":0  ;i H"WhhhL8 -PI0L +":0  ;i H"hhhL8 +PI0L c -  )HN"Whh)"X:3)"X:&;i c . $;i c   +  )HN"hh)"X:3)"X:&;i c . $;i c    -L +L ZZZ  ) zzzz -zk)"Ҡ   L<   L< ڃ  L< ك  L<   L<   L< à  L<   L< ă  y ۃ  g Ń  U ƒ  CH"0h [ [H"0h     H"0h  L - ;8   :L -H`L;i H"yIhh ;i H"yIhhLLH} +zk)"Π   L9   L9 ڃ  L9 ك  L9   L9   L9 à  L9   L9 ă  y ۃ  g Ń  U ƒ  CH"4h [ [H"4h     H"4h  L + ;8   :L +H`L;i H"lIhh ;i H"lIhhLLH}  -"-d: - LL{Hy +"Hd: + LL{Hy  -"-d: - oj"YEH +"Hd: + oj"YEH  -"-d: +"Hd:  ouow;izz z zk ZZZ    ;iH;i -H "hhhh8PI0!HH "uyhhzzzzz z +H "hhhh8PI0!HH "yhhzzzzz z zk  -e8PI0%8PI08  L?8ZPI0a8PI08R  L?8(PI0/8PI0 8(  [8dPI0k8PI0 8\  3 -   # # L& - ZZ    LH))"ja8PIL) "jae  ) "jae  ) "jae   ') "jae ' %) "jae  : +e8PI0%8PI08  L<8ZPI0a8PI08R  L<8(PI0/8PI0 8(  [8dPI0k8PI0 8\  3 +   # # L# + ZZ    LH))"Ra8PIL~) "Rae  ) "Rae  ) "Rae   ') "Rae ' %) "Rae  :  e H  - e hL~zzz z + e hL{zzz z zk - ZZZ   ɀ L,  L,)8 + ZZZ   ɀ L)  L))8 -BB  )"X: ["ӆ6)8 +BB  )"X: ["Ά6)8 B -B))"ӆx;"ӆ JJJ ))"Xg  (#)JJJJI)8i0"ӆ#)i0"ӆ )"ӆ~"ӆ!  "ӆzzzzz z +B))"Άx;"Ά JJJ ))"Bf  (#)JJJJI)8i0"Ά#)i0"Ά )"Ά~"Ά!  "Άzzzzz z zk  [𫫘;8 ;i-  -"8PI & L & L;i)HH -HH;i  4"jay$e"Rhhhh"^XL     8PIL;ic i c  i c);i+zz z -zkL +"8PI & L & L;i)HH +HH;i  4"Ray$e"Lhhhh"^XL     8PIL;ic i c  i c);i+zz z +zkL "KX  -L ) )  )       `  "Ui "U PI01   "Ui "U PI0驇!  "Ui "U PI0  "Ui "U PI0   "Ui "U PI0   zz z +L ) )  )       `  "Ui "U PI01   "Ui "U PI0驇!  "Ui "U PI0  "Ui "U PI0   "Ui "U PI0   zz z zk - ;8    "7)L0!7)%  Ȉ -& ? "E!)   "::L"! 7)ʆ "E! "E!)^ + ;8    "7)L-!7)%  Ȉ +& ? "B!)   "q:L! 7)ʆ "B! "B!)^  - "::i:Щ ":: "i;izz z + "q:i:Щ "q: ")h;izz z zk ;8    -C #  7"E!    L"     " "i "Њ:L"@   -                  ; " ;i  " -  ;i  ":  )ӣ ;i +C #  7"B!    L"     " ")h ":L"@   +                  ; " ;i  " +  ;i  ":  )ӣ ;i zz z -zkZ  ) "jae) "jae  ) "jae) "jae  ) "jae) "jae  ) "jaeH) "jaeh) "jae -H) "jaeh -) "jaH) "jah  zzk +zkZ  ) "Rae) "Rae  ) "Rae) "Rae  ) "Rae) "Rae  ) "RaeH) "Raeh) "Rae +H) "Raeh +) "RaH) "Rah  zzk ;8 ;i -".LQ&@7)LH& K -i&   "bhLV& 7 "  ":L>&$"      -"~ i " i" i"a   "K  7 ;izz z +"*LN&@7)LE& K +i&   "bhLS& 7 "  "6L;&$"      +"~ i " i" i"a   "H  7 ;izz z zk ;8  -L'7 -"d`>   == +L'7 +"d`>   == >> >> -  L(=eL' -L' ȷ   ȷ ȗ"Z `>  7)"' -"'(  L' `>;izz z +  L(=eL' +L' ȷ   ȷ ȗ"Z `>  7)"$ +"$(  L' `>;izz z zk ;8   - `>L)7 `>L)& " `>L) -"L)   L) 8 8 ȷ  ?ȗ + `>L)7 `>L)& " `>L) +"L)   L) 8 8 ȷ  ?ȗ  -" b L(       :   L#)8    ;izz z -zk"_"U":hhhA"="Vx":"Y    "0""x ":"^b ":"*y ":"ul":"]"Ae":"7":"+":"k"|":"-":"Y":"S:H":h -":"IP:"| ":k +" b L(       :   L)8    ;izz z +zk" `"U"6hhhA"="Vx"6"Y    "="wx "6"^b "6"ay "6"2vl"6"n]"e"6"3"6" +"6"h"|"6"-"6"Y"6":H"6h +"6"B@BL."q"H"\hC" -Hd"$`hd"HH"c[hh J " ;i"z{ "d"ܮ;i +*, &( J :<DCFH>B@BL."r"?H"[hC"Hd"^hd"HH"y[hh J " ;i"{ "d"خ;i k eH @@ -1319,166 +1324,166 @@ z  -@L. +@L- ;8 - # :';i"LL1 : Ч) - L1 -   ? _ * M;i"L ;i "L  L1 L0L1   ?   ?  * :H  "V/h4  ) ;i"L L/;izz z + # :';i"HL1 : Ч) + L1 +   ? _ * M;i"H ;i "H  L1 L0L1   ?   ?  * :H  "M/h4  ) ;i"H L/;izz z zk ZZZ   / : \ (   - : / L2 \ L2 -  & + "ML2;i "n "+ 8* L2 +  7 )zzzzz z + : / L2 \ L2 +  & + "ML2;i "n "+ 8* L2 +  7 )zzzzz z zk i8H7 he -"ۦ - L2L1 +"צ + L2L1 [𫫘;8  -d" H d"jah8 "Xg  "Xg  "Xg  "Xg  "Xg  "Xg  -"Xg  :0 :        "Xg  -"Xg                   :     #   ;i +d" H d"Rah8 "Bf  "Bf  "Bf  "Bf  "Bf  "Bf  +"Bf  :0 :        "Bf  +"Bf                   :     #   ;i +z -zk [𫫘ZZ"U"V:L'6L5 L6"ҠRF:#.'"+/ -3L6L6$"Ҡ7R;F?:C.G"KO -SwL6H"ҠWR[F_:c.g"ko +zk [𫫘ZZ"U"V:L6L5 L6"ΠRF:#.'"+/ +3L6L6$"Π7R;F?:C.G"KO +SwL6H"ΠWR[F_:c.g"ko s  zz+k ;8r -;i;i"AL8? A;i?",1 -j L8i  EJL(8][ "ۦ -EL8  +;i;i"L8? A;i?"#1 +j L8i  EJL8][ "צ +EL8  x  -;i "MD;i "d  h;i?" , +;i "MD;i "Jg  h;i?", &;i? -" "K ;irz -zk - ;8 8PIL:8PI0-;iH"Whhh;izz z -zk c  ":L:;iH"Whhh8PI0L$Hf"Whh$$ H"Whhh&;ic )"X:&;ic  $;ic . ":"Wh)H"WhhL9;ic L8 - ;8"OV  -  Ls<;"V"i"FV - "FV +  "FV  "FV"OV  ;"V"`>Le<"Wʆ" "Wʆ" -;i )" -:y  -]  - 8PI0E -"Wʆ"\eHeh"FV"OV -L;"`> - II -    5  "FV  -"FV"OV  -;izz z -zk -;8  -:L> -&H`;iH"yIhh0*"Wh"#h>"hhhZ;iH"yIhh0="Wh"#h>"hhhک "WhhL>;iH"yIhh0*"Wh"#h>"hhhZ;iH"yIhh0=|"Wh"#h>"hhhک "WhhL>"hH"Whhh -J >  1)'"#h>d"&hh("Wh"Wh;i z +" "H ;irz zk + ;8 8PIL:8PI0-;iH"hhh;izz z +zk c  ":L9;iH"hhh8PI0L$Hf"hh$$ H"hhh&;ic )"X:&;ic  $;ic . ":"h)H"hhL8;ic L8 ;8  -7)L@L@L@  L@ - "E!)L@; -":L@ ***)  v ) +7)L<L<L<  L< + "B!)L<; +"ݶ:L< ***)  v ) )Ȉ &e?# )ʪeHeh Ȉ -&  L@## **) e# - e  +&  L<## **) e# +e  ***) ) ) e#) )eH)8 hȈ &   -"Њ: -"i;izz z +": +")h;izz z +zk + ;8"OV  +  Lq>;"V"i"FV - "FV +  "FV  "FV"OV  ;"V"9`>Lc>"Wʆ" "Wʆ" +;i )":y  +]  + 8PI0E +"Wʆ"\eHeh"FV"OV +L="`> - II +    5  "FV  +"FV"OV  +;izz z +zk +;8  +:L@ +&H`;iH"lIhh0*"h"0h>"hhhZ;iH"lIhh0="h"0h>"hhhک "hhL@;iH"lIhh0*"h"0h>"hhhZ;iH"lIhh0=|"h"0h>"hhhک "hhL@"ihH"hhh +J >  1)'"0h>d" hh("h"h;i z zk ZZZZ ;i -".LB)LB7)LB LB: +"*LB)LB7)LB LB:  -" -L & - "  @ j [ -i&   "bh  7    +" +L/B +"d  % E  > & + "  @ j [ +i&   "bh  7    zzzzzz z zk ;8F -TR ;i;"AL^D -L^D;i"ML6D;i"d L0D C1/c)   +TR ;i;"LQD +LQD;i"ML)D;i"Jg L#D C1/c)   c    e : -e ţ   LD LD&$":_      'd Ci8c"  ;iFzz z +e ţ   LD LD&$"6_      'd Ci8c"  ;iFzz z zk ;8  8 -PIL G  LG [ LG):8PILcF -):e  "ja   "jL G"ja ߄ M"jae +PILG  LF [ LF):8PILVF +):e  "Ra   "fLG"Ra ߄ M"Rae  -;i " WL GLE +;i " WLGLE c  )"X:I ;ie -"ja)80eH -;i eh ; LE "j;izz z +"Ra)80eH +;i eh ; LvE "f;izz z zk -;ieLAE +;ieL4E ;8  - "1pLG:d&#eHehJ))  II! #i0  JJJJ9  c      :;ic    А;ic ~ S + "lLG:d&#eHehJ)  II! #i0  JJJJ9  c      :;ic    А;ic ~ S c : c"5W::    '   ;ic)  c  ;iz z zk  [𫫘;8, ;i;  -"8PILJ;i -"rLJ     8PIL;i-c i c  i c)LK"^XLK;i "e +"8PILJ;i +"nLJ     8PIL;i-c i c  i c)LK"^XLK;i "f -jjhj;i ";i ;i"e;i";i  -" r:(;i -" r: LI      +jjhj;i "ޕ;i ;i"f;i"ޕ;i  +"ar:(;i +"ar: LI      -jjhj i "e;i,+zz z +jjhj i "f;i,+zz z zk -;8    z "X  ) ŘLM  +;8    z "S  ) LM   8 -PIL M -A%L ":Ř -":uŘ -"h0;" W" "| "|;iz -zk "ja  LM   "jae"ze:f "jae "jae"X +PILM +A%L "6 +"6u +"h0;" W"ۏ "| "|;iz +zk "Ra  LM   "Rae"e:f "Rae "Rae"S     -LEL +L8L ;8   -  L1P ) )L1P   -  "  .,Z ȈFjdL4P, .  LO +  L$P )L$P   +  "  .,Z ȈFjdL'P, .  LO  Ȉ -&   g "a%L4P3#8 H h  L4P -"        _ ȈFj eH eh  +&   g "d%L'P3#8 H h  L'P +"       _ ȈFj eH eh  i8H%he  ;i zz z -zkZZ"e8PILR8PILR8PIL6R8 -PILQͩ"u"U";i   UU=?7q%'!#)+v-/9;#{13Z57 "zzk "ja   "jae8PILP "jaec "h09Hf":h"ڣH<":hhLP q$ LxP & LfP -;8 ;i"Z;i ;i"A:L U / 1;i/",1 -ZL UMK;i "1p;i/;ic4"1p ;ic",1: 7k9m?s AuLT;ic"rLT +zkZZ"f8PILR8PILvR8PIL)R8 +PILQdͩ"u"U";i   UU=?3k%'!#)+v-/~9;x{13[57 "zzk "Ra   "Rae8PILP "Raec "l09Hf"6h"ڣH<"6hhLP q$ LkP & LYP +;8 ;i"Z;i ;i":LU / 1;i/"#1 +ZLTMK;i "l;i/;ic4"l ;ic"#1: 7k9m?s AuLT;ic"rLT ;i -i "1p    7)     7)LTk7 m9LT -  "ۦ  "  X  ": iX1 . $  mk"~   : ;i/" :  "K ;iz +i "l    7)     7)LTk7 m9LT +  "צ  " X  "6 iX1 . $  mk"~   : ;i/":  "H ;iz zk ;8  -"4;i{H" ;i s  LWt E LWu L LWv F LW= +"4;i{H" ;i s  LwWt E LwWu L LwWv F LwW= -HHHH;i"D~hhhhLWLWLW   ßLtW "jacHHc" ;iH" ;i  L`W  -RH`LWLWHH"HHHH" ;i û㽰8㷅Hc"Sl dcHch c d c    LV;iz +HHHH;i"?~hhhhLzWLzWLzW   ßLgW "RacHHc" ;iH" ;i  LSW  +RH`LzWLzWHH"HHHH" ;i û㽰8㷅Hc"Gk dcHch c d c    L +V;iz zk ;8 - i  LZ ) )LYN ȈFj dLZLY ȈFj  -:d%%LY -"aLZ%LZ LYLZ -"TLZCLZ#LZ ":o "    i8H#he;iz + i  LY )LYN ȈFj dLYLY ȈFj  +:d%%LY +"dLY%LY LYLY +"?LYCLY#LY ":o "   i8H#he;iz zk - ;8   L\   + ;8   Lz\       : ʣ : p 0 7 9 (    )808PI - L\ / L\ / ߩ + Lz\ / Ls\ / ߩ  jjhj  @@ -1493,54 +1498,27 @@ z    a !z  8      a !z  8        -  LV[   / + 8PIL-[8PI +  LI[   / + 8PIL [8PI  );izz z zk  [𫫘;8T -;ic 8PI0L_;i -"{L^ L^ -;i?"e:;i?";i?H;iG;i"RhhhhL0^;iU)|;i;iU"{;i"R:';iU;i?"e%;i?;i "L];i "g"> "|L^9;igHH;i ;iC "KhhIS":6;igHH;i  - "Khh;iT+zz z -zk;ic L\ -;8V ;i;i"A:La#% ;i#",1: -N La;i"T +;ic 8PI0L^;i +"wL^ L^ +;i?"f:;i?"ޕ;i?H;iG;i"LhhhhL#^;iU)|;i;iU"w;i"N:';iU;i?"f%;i?;i "L];i "g"> "|L^9;igHH;i ;iC "KhhIS"66;igHH;i  + "Khh;iT+zz z +zk;ic L\ +;8V ;i;i":La#% ;i#"#1: +N La;i"?  E % - " La -"La i8 "Sl .8  C iN "i8 -"~i8iX "1p .Y +-iX"~  ;i#"rrA?i "A? -"~A?    "K ";i -";iVz + " La +"La i8 "Gk .8  C iN "i8 +"~i8iX "l .Y +-iX"~  ;i#"rrA?i "A? +"~A?    "H ";i +";iVz zk - ;8  -  Lhd  Lhd    Lfc  Lb  L^d ȈFj -(cH*ch"::  L^d -i8H - -)he"%H%hL^d -*(  ȈF j eHeh"::  L^d -i8H -)he"*[L^d Jc -*(H J)he"::  L^d -i8#e) -*(H J)he":: - Mi8#e)) ) ))JJJJ;iz z -zk - ;8 -  -         L-g -  ":L-g  - - L-g  ? 7   - Lf - . Lf#   Lf  Lf -@Z   # -    ,  .     -     M   2   ":):     P    "s  , . J    "W   Ld  ;i -zz z -zk -Z `   LhJsuu +Z `   LbJsuu s" WJJoqq o" Wkmm k" Wgii @@ -1548,93 +1526,120 @@ Z c" W _aa _" W@[]] [" WWYY -W" W ` a   Lvi  J1SU'  U +W" W ` a   Lcg J0SU&g U S" WCEE C" W ?AA ?" W@;== ;" W799 -7" W a b   LjJ355 +7" W a b   L|dJ355 3" WJJ/11 /" WJJ+-- +" WJJ+-) '" W b zz zk + ;8  +  L!g  L!g    Lf  Le  Lg ȈFj +(cH*ch"6:  Lg +i8H + +)he"%H%hLg +*(  ȈF j eHeh"6:  Lg +i8H +)he"@[Lg Jc +*(H J)he"6:  Lg +i8#e) +*(H J)he"6: + Mi8#e)) ))JJJJ;iz z +zk + ;8 +  +         Li +  "6Li  + + Li  ? 7   + Li + . Li#   Li  Ldi +@Z   # +    ,  .     +     M   2   ":):     P    "Gt  , . J    "W   Lg  ;i +zz z +zk ZZZZ  '"'W  -   Ll   -"E!  Lhl -"E!  Lk;i -"  Lk ɪ Lk@ -"E!)e_ -:"E!)A;i -"@    "'W:LkLTl -"E!          -"E!)/ -"E!)  "'W: '  )     -"i )zzzzzz z +   Ll   +"B!  LYl +"B!  Lk;i +"  Lk ɪ Lk@ +"B!)e_ +:"B!)A;i +"@    "'W:LjLEl +"B!          +"B!)/ +"B!)  "'W: '  )     +")h )zzzzzz z zk;i -":   Lfj;8&!!064!c8o48!68o4:!c4:8!062c6o2 8 #66o2:c2: 8 #""ja%""ja8%""ja!""jae8%  L0ow""ja8%U%c  cԣc @ c ` #c!w""ja8%U%c cԣc @ c ` #c;i&k%c%cc8#cc8# c  L*n#c#c @  @  `  ` #c;8X;i ;i"A:Lr ;i "Sl L(q;i" "Q" L"q "[y   -X &;ic  ;ic L)pLr Lr%:;ie :ף % '-/;i%"MLr;i%"dY;iCA "1pCA    "K LrLrLr;i%" i CA"SlCA  ;iCA "1p    "K ;iXk +":   LWj;8&!!064!c8o48!68o4:!c4:8!062c6o2 8 #66o2:c2: 8 #""Ra%""Ra8%""Ra!""Rae8%  L!ow""Ra8%U%c  cԣc @ c ` #c!w""Ra8%U%c cԣc @ c ` #c;i&k%c%cc8#cc8# c  Ln#c#c @  @  `  ` #c;8X;i ;i":Lr ;i "Gk Lq;i" "V" Lq "/\y   +X &;ic  ;ic LpLr Lr%:;ie :ף % '-/;i%"MLr;i%"JgY;iCA "lCA    "H LrLrLr;i%"i CA"GkCA  ;iCA "l    "H ;iXk ;8  - +7 )Lu  -e:Lu i ;i  "1pJLs @+ dFH H;i i "EGhh "*dLuLu + LtsJJ  c " " L'u:L'u   H + +7 )Lu  +e:Lu i ;i  "lJLs @+ dFH H;i i "8Ghh "*dLuLu + LesJJ  c " "Lu:Lu   H -h8"MLu i "s   -  ":[H   "h  "W  : ЂLu -  ":k   "Sl i   "1p+7 H  h  ;izz z -zkLs -;8*    " +h8"MLu i "Gt   +  "6[H   "h  "W  : ЂLu +  "6k   "Gk i   "l+7 H  h  ;izz z +zkLr +;8*    "  -LxLx -HH "hhh 8 PI0Lpx&("$8 PIF&(PIg -c;i c (&("$Lx"$L>x&(PIM$"Ȉ +LxLx +HH "hhh 8 PI0Lax&("$8 PIF&(PIg +c;i c (&("$Lx"$L/x&(PIM$"Ȉ &H c)henC&($H$h -c  "$(&&("$Lv  - E ;Lv +c  "$(&&("$Lv  + E ;Lwv  -"';i*z -zk;8b ""x"Go ;iH"{w HH"uy H"u;i"   HH"o"j  HH"o"jH#H"o;ix"jHH"o"j  HH"o;i>"Ҡ,"jhhL{"jhhL{"jhhL{"jhhq"jhh\K"jhhG"jhh-"jhhY"jhh  HH"ohh"jhhY   HH"o>H>Hl;i"D~ ;iH"j;i  R   HH"o>Ho;i"D~;iH"j;i -   HH"o"j HH"o"j;i +"$;i*z +zk;8b "wx"o ;iH"w HH"y H"u;i"   HH"8p"k  HH"8p"kH#H"8p;ix"kHH"8p"k  HH"8p;i>"Π,"khhL{"khhL{"khhL{"khhq"khh\K"khhG"khh-"khhY"khh  HH"8phh"khhY   HH"8p>H>Hl;i"?~ ;iH"k;i  R   HH"8p>Ho;i"?~;iH"k;i +   HH"8p"k HH"8p"k;i ;8 -  L[L[  L}  Lp}  LUȈFj -(cH*ch":LU ) ) +  LILI  L}  L^}  LCȈFj +(cH*ch"6LC )  i8H -)he"))  +)he")  i8H -)he"  LU -*( ȈF j eHeh":LU +)he"  LC +*( ȈF j eHeh"6LC i8H -)he "a  LUJc -*(HJ)he":LU -i8H#he )) +)he "a  LCJc +*(HJ)he"6LC +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"C"C"Ck"O"O"O\C"\"""""\"\"\"u ""\k8k"""̀k"̀"";";";""k""""\"\\"\k, H"hk"O"";","N";";ڢ"";J""";";"";"""k""" -" i0"";";";8kڢ"""j";"";";";";, kx0"l(k(kx0 @""(kx0"̀""""(kx0 ""(kx0"̀"(kx0_""(kx0?""(kx0"y()k0(k(kx0, H"h(kx0"!"\".(k +*(HJ)he"6y +i8H#he)')# ) FjFjFjFj   ;izz z +zkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkH)hkH @hkڢkڢ")k"1"1"1k"="="=\1"J"""""J"J"J"c ""Jk8k"""k""")")")""k""""J"\\"\k, H"܀hk"="")","N")")ڢ"")J""")")"")"""k""" +" i0"")")")8kڢ"""j")"")")")"), kx0"Z(k(kx0 @""(kx0"""""(kx0 ""(kx0""(kx0_""(kx0?""(kx0"g()k0(k(kx0, H"h(kx0""J"(k ;8   -"ML   ,.   ":L L? 7   L   L  L@+7)Lᄣ @Z  #   ,.         U  :   ": ):          L  !"s L+7)0 -i  "t:L  ,.     (  ,.    -"W    L3;i zz z +"ML   ,.   "6L慠 L慠? 7   L   L  L@+7)Lτ @Z  #   ,.         U  :   " : ):          L  !"Gt L慩+7)0 +i  "9 C C D - LD+ + LD+  4  "   @@ -1644,358 +1649,358 @@ ZZZZ    zzzzz zk -;84;i!;"AL_><!##!8ʆ#!&#!L]#!  Lg!%#' -;i%"a%  -LYE  +;84;i!;"LJ><!##!8ʆ#!&#!LH#!  LU!%#' +;i%"d%  +LGE  i   - #!L L#!#!*(   -  I  #! ":   - L     #!  8#!i8c"*[: + #!L L#!#!*(   +  I  #! "6   + L     #!  8#!i8c"@[:    - Z#!i8c")) + W#!i8c")  c # : -     Lȋ  >#!#!  ;i4z +     L  >#!#!  ;i4z zk ;8X  - "U"g -;i P"u;i ;iH;i "hhL+"oWJ"~ J?(4Q)G | "U"q;iH;i "hhL"`Wʆr"~ ;iH;i "hhL"`WʆE -ELΐ;iH;i " + "U"g +;i P";i ;iH;i "hhL"oWJ" J?(4Q)G | "U"rq;iH;i "hhL"`Wʆr" ;iH;i "hhLϐ"`WʆE +EL;iH;i " hh -L -"ze: L -"ze: {> -"ze: PC -"ze: (% -"ze:08 "UH"dhL?5 ":L?":qv ":[":E":/8":d ":;iXzz z +L +"e: Ls +"e: {> +"e: PC +"e: (% +"e:08 "UH"dhL*5 "6L*"6qv "6["6E"6/8"6d "6;iXzz z zk ;8   R     -_ "a L/%L/  L/ -  L/Lg -Lg -   "aEL`%L`h  "   +_ "d L%L  L +  LLR +LR +   "dELK%LKh  "    -  L/ - L1  ii  '   L/ +  L + L  ii  '   L   -"a?E'%  - L/ -LL/ +"d?E'%  + L +L{L   -"5|'! - "5|e +"&|'! + "&|e    8ʆ    :     =;izz z -zkZ8PI0LbHV"jahOOV"jaeOV"jaeOV"jae +zkZ8PI0LMHV"RahOOV"RaeOV"RaeOV"Rae - OV"jaeOV"jaeOV"jaeOV"jaeOV"jae OV"jae""$$OV"jae6688OV"jae::<<OV"jae&&((OV"jae**,,OV"jae..00OV"jae2244OV"jae>>@@OV"jaeBBDDOV"jaeFFHHOV"jaeJJLLOV"jaeNNPPOV"jaeRRTTzzk + OV"RaeOV"RaeOV"RaeOV"RaeOV"Rae OV"Rae""$$OV"Rae6688OV"Rae::<<OV"Rae&&((OV"Rae**,,OV"Rae..00OV"Rae2244OV"Rae>>@@OV"RaeBBDDOV"RaeFFHHOV"RaeJJLLOV"RaeNNPPOV"RaeRRTTzzk ;8  &$;i -".  L)  L7)Lĝ8 Hhd -  Lĝ77L ȈFj +"*  L)  L7)L8 Hhd +  L77L ȈFj :d%%z  -"a  Lĝ%  Lĝ"   LĝcJ)LR +"d  L%  L"  LcJ)L7 c -8H   "bh  Lĝ X8Hhd2 +8H   "bh  L X8Hhd2 i&8 -) e"1p -) Lt L W -i&  "bh  Lĝ 7  -i&  "bh  Lĝ78 +) e"l +) LY L W +i&  "bh  L 7  +i&  "bh  L78  -i&H7he  "1p 8 &$ g c c   L4;izz z +i&H7he  "l 8 &$ g c c   L;izz z zk ;8|p> p J|>p>p>     |>    |>   |>  -|>p>p>" hhhh7    8PIL0"_"5kZD"_"AH H*HK"Kdd"8"""D4;iH"{w ;i y"Wh 8p>PILE8 PI0LQ "Wh8p>PIm +|>p>p>" hhhh7    8PIL"_"kZD"p"=H H*HK"Hdd"2"""D4;iH"w ;i y"h 8p>PIL'8 PI0L6 "h8p>PIm r>X -|>"hHH;i3"D~;i3"rZH;i5H"' ;i ;i-"D~;i-"rZH;i/H"'hhh"ui -"u -PIR"\]C"e +|>"ihHH;i3"?~;i3"ZH;i5H"7 ;i ;i-"?~;i-"ZH;i/H"7hhh"oi +"o +PIO"cC"f ,8PI: r>: -|> +|> -;ie"<;i|z +;ie">;i|z zk r> -|>"= +|>"^ ;ie -|>"U:L "V +|>"R:L"V r> 8 -|>"hH "Whhh +|>"ihH "hhh |> -;ie   L% 0 % JJ 4 L՞ - ;8"  H;i"_hL ?"    S )"")" -         "Sli") +;ie   L% 0 % JJ 4 L + ;8"  H;i"._hLݦ ?"    O )"")" +         "Gki")  - L¦ -L¦ - L¦ + L +L + L -ed`dC5 d""\  +ed`dC5 d""\  cHc h % cHc h 8H" -hL¦ i -" i " .  -")")" +hL i +" i " .  +")")"  -")")"   -")"   +")")"   +")"   JJ))   -cHch:")")" +cHch:")")" -cHch:")")"  -cHch:")"   +cHch:")")"  +cHch:")"   JJ))    i  cHch  - LiU"a"bh;i"zz z + L_iU"a"bh;i"zz z zk ;8b  - ;i;i"AL;i/ ;i7 ;i7L;i/ "ML;iG":L;iK"ۦH;i;h;i/"ML;i/"dV;iK"ۦ ;i/"W L;i;i/";i/c)L詣  y :::;i/cc  £:c /  LLKL " :c /  ) + ;i;i"L;i/ ;i7 ;i7Lҩ;i/ "MLҩ;iG"6Lҩ;iK"צH;i;h;i/"MLҩ;i/"JgV;iK"צ ;i/"W Lҩ;i;i/"ΰ;i/c)LƩ  y :::;i/cc  £:c /  LL)Ly " :c /  ) -jjhj  c )L L +jjhj  c )Lm Lڪ   /    H c    Z    -c       LS +c       L1    ;ibzz z zk ;8  &$;i -".  L߰)  L߰7)Lᰠc8  Lf77L ȈFj -:%Lӭ, +"*  L)  L7)Lc8  LA77Lů ȈFj +:%L,  -"T -"T @ LᰩE  Lᰥ%  Lᰥ +"? +"? @ LE  L%  L   W -i&  "bh  Lᰠ 7 "   LᰦcJ)Ls +i&  "bh  L 7 "  LcJ)LK c -8H   "bh  L8Hhd?8 +8H   "bh  L8Hhd?8 ) e -i&"1p 7  -) LO Z D -i&  "bh  Lᰣ78 +i&"l 7  +) L' Z D +i&  "bh  L78    -i&H7he"1p   8 &$ g c c      L;izz z +i&H7he"l   8 &$ g c c      L;izz z zk ;8 -  L,.7L  +  Lݵ,.7Lw    -e:Lr   +e:LJ     -e!ؐ L8ic +e!ؐ Lc8ic  d - "o c Lie  Lc) -  5 .i c . i c  Li c )LE-ic ? B    i c)Zie  ) LEi c).     A@Z9 ))%: cic    L? 7  i"Hhi"*[i"*[;izz z + "k c Lcie  LYc) +  5 .i c . i c  Li c )L-ic ? B    i c)Zie  ) Li c).     A@Z9 ))%: cic    L߳? 7  i"Hhi"@[i"@[;izz z zk ;8  ;i -".)   L  %7)      Lp +"*)   L`  %7)       L< Ȉ -&Lڷ :" :" x::II%%8 HhL| +&L :" :" x::II%%8 HhLH ` -"TE  L%  L -  L^      L8 HhcHch7)C -"TL -"a%  L9!  L  LcHch))b"   L ȈFjeHeh !  @ 77L L U -i&  "bh  _ 7  -i&  "bh   ;izz z +"?E  L`%  L` +  L*      L8 HhcHch7)C +"?L +"d%  L`9!  La  L`cHch)b"  L` ȈFjeHeh !  @ 77L^ L^ U +i&  "bh  _ 7  +i&  "bh   ;izz z zk ;8N     - LS ?# ;i;i "AL< ;i",1DL8;i"r   !  -  L齣L" 86i "86i "86"ۦ 86 86"~86i"  L߽64;i "9": :Hh  ) JJ J  W @    46 6"8$    L286"ۦ -86i"     -i&"Sl L( L(  + L ?# ;i;i "L ;i"#1DLǽ8;i"r   !  +  LL" 86i "86i "86"צ 86 86"~86i"  L64;i "9"6 :Hh  ) JJ J  W @    46 6"8$    L86"צ +86i"     +i&"Gk L L  Ȉ &     x n -"a +"d  #   8Hh - L) )L"  } ȈFjeHeh -i&  "bh  ;iNzz z + L )L" } ȈFjeHeh +i&  "bh  ;iNzz z zk ;8     .   -"[i%     LLƣ  -"1 -"k -    +  -  "[iLCģ"[iLCģ& f Lã8"L@""c""] c8 PI0 j L)ģ"[iLģ"]8"L@""c" +"mi%     Lƣ  +"1 +"p -    +  +  "miL ģ"miL ģ& f L£8"H@""c""S c8 PI0 j Lã"miLã"S8"H@""c"  -"]c8PI0\c8 PIK8PI  -H"Lh"j -   "  L,ƣ - $           "L +"Sc8PI0\c8 PIK8PI  +H"Hh"j +   "  Lţ - $           "H  -""`\"- -"9"k  0cH  h  :  88PI0Lģ& f Lƥ & $8 -  +  -"i0   -"i0        L  ,           )Е ;izz z +""r\"2 +">"p  0cH  h  :  88PI0L~ģ& f Lť & $8 -  +  +"i0   +"i0        L  ,           )Е ;izz z zk - ;8     "Z L͊ + ;8     "Z LO͊   - Lͥ + LOͥ  # )/"5V  J   -LͩL  "-V  JL   -Lͥ -"3Lͣ L͠64 -iC"*[ Lͥ -iN"*[# -i\" " H      L͠)"\ +LOͩLO  "-V  JLO   +LOͥ +"8LOͣ LO͠64 +iC"@[ LOͥ +iN"@[# +i\" " H      LO͠)"\ E)  -:L͠ +:LL͠ : -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"\Fj77eHeh&i ȈFj " Lͩ  LGͥ -ih"*[LGͥ -"::LG   -i6"*[ULGͥ -i8"RRkaAd -i"rrEAa> -i " -i$"    ;izz z +7:LLͥ +iI"@[7: LOͥ +iK"@[# +iX" +iF"@[  LOͣ +c JJJJeHeh   LO8 Hh +" LOͩ    LOͦi$&c (* cHch02e +ib"@[: LO͠: LOͥ +id",.&&Lˠ: LO(cH*c h,.G"\Fj77eHeh&i ȈFj " LOͩ  L ͥ +ih"@[L ͥ +"6:L   +i6"@[UL ͥ +i8"RRkaAd +i"rrEAa> +i " +i$"    ;izz z zk -;8@-/ 1" +;8@-/ 1"  -Lԣ)+% ' ! # 1L -HH"hhh8PI0Lԩ))++%%''!;#=79 53??8PI07))++%%'';!=#79 53LOΣ%'Lϥ +Lԣ)+% ' ! # 1L +HH"hhh8PI0Lԩ))++%%''!;#=79 53??8PI07))++%%'';!=#79 53LΣ%'Llϥ c? Z   4 -c? z J  )!+#;=79 LԩLԣ=L/ѣ5ʆ;=PI0L/ѣ7 9 :=;"~ +c? z J  )!+#;=79 LcԩLԣ=LУ5ʆ;=PI0LУ7 9 :=;" c?))9H9hq -"|  Lѥ +"|  LХ c?)9H9h\ -"|  x +"|  x c?))ʆ9H9h  5 -c?)    )+ Lӣ5ʆ;=PILӣ3ʆ;=PI0Lӣ)+ V5ʆ8;H?h"~ -c?))Hh/-79"|)+ Lӥ -c?)Hh/-79y"|)+ x +c?)    )+ L{ӣ5ʆ;=PILң3ʆ;=PI0Lң)+ V5ʆ8;H?h" +c?))Hh/-79"|)+ Lҥ +c?)Hh/-79y"|)+ x c?))ʆHh)+ 59H9h -c?)    Lӣ3ʆ8;H?hPIC)++)  -c?   )+  7 9 =;LYԣ3eHehPI08     ! #   53?%i%'i'!)#+%%'';=79 53?LΣ1;i@z +c?)    Lcӣ3ʆ8;H?hPIC)++)  +c?   )+  7 9 =;Lԣ3eHehPI08     ! #   53?%i%'i'!)#+%%'';=79 53?LΣ1;i@z zk ;8   - ;i"%Lܥ)H + ;i"%LJܥ)H  - e h   f/_\Xɀ"[Lܣ Lܣ   + e h   f/_\Xɀ"/\LJܣ LJܣ    -eL^գ    f / L,ݣ \ L,            +eL$գ    f / Lܣ \ L             : -e.I Lץ +e.I Luץ  : -e.Lץ +e.Luץ  :: -e.Lף -e , Hi eh L܊  .i e   2 +e.Luף +e , Hi eh LJ܊  .i e   2 : e . :ʦ  -eLܩ  +eLJܩ   -e L ݩ % +e Lܣ %  e. -     ' +     ' : -e. :Ң i  "Sl  )       +e. :բ i  "Gk  )        -e  Lۣ Lܣ.  Lܣ LFۣ LFۣɀK  "#:#H)    } :.      Lݣ   i c     LڣLک"[{AZ     a'z  8        $_         i c     Lݣ    4       L      +e  LVۣ Lܣ.  Lܣ Lۣ LۣɀK  "#:#H)    } :.      Lܣ   i c     LڣLک"/\{AZ     a'z  8        $_         i c     Lܣ    4       L\      -     # #  +     # #      JJNJ              + ;iz z -zk  +zk  -     '         Lأ  LأLB - ;8   ;iO"gj;i -    L % ;iO"M L +     '         Lأ  LףL + ;8   ;iO"yj;i +    LJ % ;iO"M LL       0 0 0     " O - %         "  * .    %  n    0 D9  9 -"ja)e80      -%   . L    * 4 +"Ra)e80      +%   . L    * 4      s   0 D9  9 -"ja)e80      +"Ra)e80           -   l d    l '            %;iO";izz z -zk)"ҠLHi +   l d    l '            %;iO";izz z +zk)"ΠLi - ;c)L0 -# :#%;iO""Mԣ -)/:"  ;iO"Mʣ%;iO "Mإ  + ;c)L0 +# :#%;iO""Mԣ +)/:"  ;iO"Mʣ%;iO "Mإ  -LLEL{ -7;iO"M L # :Gi +LLLEL3 +7;iO"M LL # :Gi - -+)'L# :Lf 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""Mԣ:;iO;i/c"Mң%;iO "Mإ  +"ȴ  ;i;i;i +"Ŵ  3 x  'c      #0cH;i1ch # # LU#:&##;i/c - ##:#%;iO""Mԣ:;iO;i/c"Mң%;iO "Mإ  -LiH -;i1"hh;i/"rZ +LLiH +;i1".h;i/"Z # :# -%;iO""M +%;iO""M  ԩ;i/c)6 -%;iO "Mإ J;iO;i/c"M;iO"M  L - ;88"sVDF HJ "U "U  L % Lp "U "U    % L`  -  +) '+@a  )"Ҡ+"jV6+"jV'++"jV "jV )L+L/ 0 {9 p 80  #+-' +%;iO "Mإ J;iO;i/c"M;iO"M  L; + ;88"sVDF HJ "U "U  L % L( "U "U    % L  +  +) '+@a  )"Π+"jV6+"jV'++"jV "jV )L+L 0 {9 p 80  #+-'  -c)c"jV+ )L) +c)c"jV+ )L)  -c)c+"jV L * L#+3 +c)c+"jV L * L#+3   +)L - + 8  ' L . .#+;i8zz z -zk+"jVL z  t  . "jV+L l h   j +#"jVe l *#+ ++#"jV3 h L#+ ++#"jV )'"U "U   -   +)'"$ &   Lb& p :#&"$ - & +)'ǩ & E G & & e 7g & ,"V"VT Lj &  S L c L: s L & d L: i L# &"V"V L # # )   # "$ 4 &)"Ҡ#  -"|V L $""U $""U  V ;  # @ L Hh HH"aV"[hhL["|V%# `  "|V #   $;"V "H;i/h8  #    L"aV%H"Vh" W"aV&)H"Vh" W"$ L[# "ViNʆ# (# + + 8  ' L . .#+;i8zz z +zk+"jVL z  t  . "jV+L l h   j +#"jVe l *#+ ++#"jV3 h LJ#+ ++#"jV )'"U "U   +   +)'"$ &   L& p :#&"$ + & +)'ǩ & E G & & e 7g & ,"V"VT L" &  S L c L: s L& d Lk: i Lk# &"V"V L # # )   # "$ 4 &)"Π#  +"|V L$""U $""U  V ;  # @ LHh HH"aV"[hhL"|V%# `  "|V #   $;"V "H;i/h8  #    L^"aV%H"Vh" W"aV&)H"Vh" W"$ L# "ViNʆ# (# I)8ʆ# "8    #   % -;"V "H;i/h8  "$    #NJ - )8PI)  # @# #      # c):;i-e 0 #  %   @#     "#     # LS# E) )8PI "Vc      -    )8PI' "aV H"Vh" W  ȣ     )8PI0  "V # Q "aV0H"Vh" W@# .  # xX"aVH"Vh" W  [# N #  +  #  -  "aV )H"Vh" W  )8PI#"aV0H"Vh" W:    = : "aV );i-e)H"Vh" W    L$ - ;"V ]"V"V   #  "o^  # 1  "aV H"Vh" W : ۣ    L  "aV)H"Vh" W: :  "$ "aV H"Vh" W:ݣ L    "aV)H"Vh" W L +;"V "H;i/h8  "$    #NJ + )8PI)  # @# #      # c):;i-e 0 #  %   @#     "#     # L # E) )8PI "Vc      +    )8PI' "aV H"Vh" W  ȣ     )8PI0  "V # Q "aV0H"Vh" W@# .  # xX"aVH"Vh" W  [# N #  +  #  -  "aV )H"Vh" W  )8PI#"aV0H"Vh" W:    = : "aV );i-e)H"Vh" W    L - ;"V ]"V"V   #  "[^  # 1  "aV H"Vh" W : ۣ    L  "aV)H"Vh" W: :  "$ "aV H"Vh" W:ݣ L    "aV)H"Vh" W L ;8N -;i"Z L: +;i"Z L:  @@ -2003,96 +2008,96 @@ z L: b -CECEH;iEI"_hCE(CEEC:E%C% -CEH' 4   " ) 52$HJJJJJJh":  "8:77 -H"H"7979L:\ +CECEH;iEI"._hCE(CEEC:E%C% +CEH' 4   " ) 52$HJJJJJJh":  "8:77 +H"H"7979L:\ 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"(**(&& + '&LJ"(**(&&   i i Hd e e -:H" +:H" (*7(*+    , .(*LpL:LNLJ ȈFj  `= `d - '&LJ" + '&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 -"Sl' - "1p -i H"a   -i"a 5   +"Gk' + "l +i H"a   +i"a 5   "  -i"aJL -iJ"a -i LJ"   -i?"a -i"a -iA?"  L  -iC&$" -i$.," -i," -i0"a -i2"a @ )B  -iG"1pf -i'&$" -i,"a $ )&  -i+"1p -iU"aCA -I"bhL:  LH CAi -I"bhH -"Sl -RRaA" -irrAa" +i"aJL +iJ"a +i LJ"   +i?"a +i"a +iA?"  L  +iC&$" +i$.," +i," +i0"a +i2"a @ )B  +iG"lf +i'&$" +i,"a $ )&  +i+"l +iU"aCA +I"bhL:  LH CAi +I"bhH +"Gk +RRaA" +irrAa" i -:" -i" -iU"aCAi -I"bhCA -I"bh7H"ja -"Sl +:" +i" +iU"aCAi +I"bhCA +I"bh7H"Ra +"Gk    5L8  ( * @@ -2111,13 +2116,13 @@ H  H -I"bhL:cHch +I"bhL:cHch 8Hh  L      ZJL   4          49JL H -;iI"XhL:HI"_hL:L:  H -" -i" -i"A   +;iI":hL:HI"._hL:L:  H +" +i" +i"A    @@ -2125,7 +2130,7 @@ H   -", +", .  79  @@ -2135,9 +2140,9 @@ H  H -I"bh;iNzz z +I"bh;iNzz z zkH -"SlcHch +"GkcHch 8Hh  L  L{  @!#%')+-/=@CFILORUX[^adg@@$v 0:,4._%J-f<e>nLp?k9d'''''''''######''# ##'# '# '# ##'## ##'''# #''''''''''######## ########'''''''''''##'# ''''''''######## ''''''''######## gcJ''##'; #''# '''# ### ### '''# '#                                                                      gcJ gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; ; #' #''' ### ### #''' #''''''''''######'## #' #' #'## #''## ##'''# #'''# '##'' ########''''''''gcJ; ########'''''''' #'##''''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #'''# #'''## ##''# ##'# '# '# ##'## ##'''# #''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''## ##'''# #''''# #'''## ##''# ##'# '# '# ##'######'''''''''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''######'''''''''7@a m @wv  Rd  "@R+R(R$R @@ -2155,12 +2160,12 @@ XK  0 !*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\Y\Y\Y\ z\o\4\k\\vz\͗\\I\ɰ\'\T\\\\&\$\\p\\\9\\\g\\\\6\n\\]\\ y\ԩ\̀\*\1m\r\]\\\\yI\Y\-b\u\3\{\\]\C_\5\\n\p\n\o\o\(w\{w\uy\\l\8\c\Go\9u\\j0HZ +      !#%&' ())*+%'./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\Y\Y\ Z\Y\uz\j\4\l\\z\ɗ\\E\Ű\7\P\\\\3\ \\p\\\5\\\b\\\ۏ\;\n\\Z\\uy\Щ\ǀ\%\m\Ts\]\\\\lI\Y\b\o\2\\c\Y_\B\\No\#q\*w\o\8p\p\}w\w\y\\u\l\3\^\o\u\\k0HZ  - [dH"Xg+z + [dH"a+z zzz z zzzzzzh@0HZ  [dH"U+z zzz z -zzzzzzh@8[dH\mP \ No newline at end of file +zzzzzzh@8[dH\jnP \ No newline at end of file diff --git a/samples/hello/Makefile b/samples/hello/Makefile deleted file mode 100644 index 197dc6e..0000000 --- a/samples/hello/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=clib-lc-ld.a --rtattr printf=medium --target=f256 # C256/f256-flash.scm - else - LDFLAGS_FOR_UNIT=f256-plain.scm clib-lc-ld.a --rtattr printf=medium --target=f256 - 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 = hello.c header.s $(SRCS_FOR_UNIT) # $(C_SRCS_DEBUGGER) ram-startup.s -OBJS = $(patsubst %.s,%.o,$(patsubst %.c,%.o,$(SRCS))) -OBJS4RM = $(subst /,\\,$(OBJS)) -LIBS = ../../client/src/toolbox.a - -.PHONY: clean - -hello.s37: $(OBJS) $(LIBS) - $(LD) $(LDFLAGS) --output-format s37 -o $@ $^ - -# 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) *.s37 *.o *.a *.lst - diff --git a/samples/hello/f256-plain.scm b/samples/hello/f256-plain.scm deleted file mode 100644 index 18da992..0000000 --- a/samples/hello/f256-plain.scm +++ /dev/null @@ -1,19 +0,0 @@ -(define memories - '( - (memory LoMem - (address (#xa000 . #xcfff)) - (type ANY)) - (memory Vector (address (#xffe4 . #xffff))) - (memory Banks - (address (#x10000 . #x7ffff)) - (type ANY) - (section (header #x10000))) - (memory DirectPage - (address (#x000100 . #x0001ff)) - (section (registers ztiny))) - - (block stack (size #x1000)) - (block heap (size #x1000)) - (base-address _DirectPageStart DirectPage 0) - (base-address _NearBaseAddress LoMem 0) - )) diff --git a/samples/hello/header.s b/samples/hello/header.s deleted file mode 100644 index 21b9827..0000000 --- a/samples/hello/header.s +++ /dev/null @@ -1,10 +0,0 @@ - .extern __program_start - - .section header - -signature: .byte 0xf8, 0x16 -version: .byte 0 -start: .long __program_start -icon: .long 0 -clut: .long 0 -name: .asciz "hello" diff --git a/samples/hello/hello.c b/samples/hello/hello.c deleted file mode 100644 index 0b0b18e..0000000 --- a/samples/hello/hello.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "../../client/src/include/toolbox.h" - -#include - -int main(int c, char * argv[]) { - char * message = "Hello, Foenix Toolbox!\n"; - sys_chan_write(0, (uint8_t *)message, strlen(message)); - - while (1) ; -} \ No newline at end of file diff --git a/samples/hello/macros.h b/samples/hello/macros.h deleted file mode 100644 index 5f1cd4f..0000000 --- a/samples/hello/macros.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef __MACROS_H -#define __MACROS_H - -#ifdef __CALYPSI_ASSEMBLER__ - -#ifdef __CALYPSI_CODE_MODEL_SMALL__ - -#define libcode code - -call .macro dest - jsr \dest - .endm - -return .macro - rts - .endm - -jump .macro dest - jmp \dest - .endm - -#elif defined(__CALYPSI_CODE_MODEL_COMPACT__) - -#define libcode compactcode - -call .macro dest - jsr .kbank \dest - .endm - -return .macro - rts - .endm - -jump .macro dest - jmp .kbank \dest - .endm - -#else - -#define libcode farcode - -call .macro dest - jsl \dest - .endm - -return .macro - rtl - .endm - -jump .macro dest - jmp long:\dest - .endm - -#endif // __CALYPSI_CODE_MODEL_SMALL__ - -// ---------------------------------------------------------------------- -// -// Define code and data model used. This is to add a bit of safety in -// case the way a file is assembled is combined with the wrong run-time. -// -// ---------------------------------------------------------------------- - -#if defined(__CALYPSI_DATA_MODEL_SMALL__) - .rtmodel dataModel,"small" -#elif defined (__CALYPSI_DATA_MODEL_MEDIUM__) - .rtmodel dataModel,"medium" -#elif defined(__CALYPSI_DATA_MODEL_LARGE__) - .rtmodel dataModel,"large" -#elif defined(__CALYPSI_DATA_MODEL_HUGE__) - .rtmodel dataModel,"huge" -#else -#pragma GCC error "unexpected data model" -#endif - -#if defined(__CALYPSI_CODE_MODEL_SMALL__) - .rtmodel codeModel,"small" -#elif defined(__CALYPSI_CODE_MODEL_COMPACT__) - .rtmodel codeModel,"compact" -#elif defined(__CALYPSI_CODE_MODEL_LARGE__) - .rtmodel codeModel,"large" -#else -#pragma GCC error "unexpected code model" -#endif - -#endif // __CALYPSI_ASSEMBLER__ -#endif // __MACROS_H diff --git a/samples/hello/ram-startup.s b/samples/hello/ram-startup.s deleted file mode 100644 index 772181d..0000000 --- a/samples/hello/ram-startup.s +++ /dev/null @@ -1,134 +0,0 @@ -;;; Startup variant, change attribute value if you make your own - .rtmodel cstartup,"sample" - - .rtmodel version, "1" - .rtmodel core, "*" - - .section stack - .section cstack - .section heap - .section data_init_table - - .extern main, exit - .extern _Dp, _Vfp - .extern _DirectPageStart - -#ifndef __CALYPSI_DATA_MODEL_SMALL__ - .extern _NearBaseAddress -#endif - -#include "macros.h" - -;;; *************************************************************************** -;;; -;;; __program_start - actual start point of the program -;;; -;;; Set up CPU stack, initialize sections and call main(). -;;; You can override this with your own routine, or tailor it as needed. -;;; The easiest way to make custom initialization is to provide your own -;;; __low_level_init which gets called after stacks have been initialized. -;;; -;;; *************************************************************************** - -#ifdef __CALYPSI_CODE_MODEL_COMPACT__ - .section code -#elif __CALYPSI_CODE_MODEL_LARGE__ - .section farcode, noreorder -#else - .section code, noreorder -#endif - .pubweak __program_start -__program_start: - clc - xce ; native 16-bit mode - rep #0x38 ; 16-bit registers, no decimal mode - ldx ##.sectionEnd stack - txs ; set stack - lda ##_DirectPageStart - tcd ; set direct page -#ifdef __CALYPSI_DATA_MODEL_SMALL__ - lda ##0 -#else - lda ##.word2 _NearBaseAddress -#endif - stz dp:.tiny(_Vfp+2) - xba ; A upper half = data bank - pha - plb ; pop 8 dummy - plb ; set data bank - -#ifdef __CALYPSI_CODE_MODEL_COMPACT__ - jmp long:_Trampoline_program_start - .section compactcode, noreorder -_Trampoline_program_start: -#define CODE compactcode -#else -#define CODE code -#endif - call __low_level_init - -;;; **** Initialize data sections if needed. - .section CODE, noroot, noreorder - .pubweak __data_initialization_needed - .extern __initialize_sections -__data_initialization_needed: - lda ##.word2 (.sectionEnd data_init_table) - sta dp:.tiny(_Dp+6) - lda ##.word0 (.sectionEnd data_init_table) - sta dp:.tiny(_Dp+4) - lda ##.word2 (.sectionStart data_init_table) - sta dp:.tiny(_Dp+2) - lda ##.word0 (.sectionStart data_init_table) - sta dp:.tiny(_Dp+0) - call __initialize_sections - -;;; **** Initialize streams if needed. - .section CODE, noroot, noreorder - .pubweak __call_initialize_global_streams - .extern __initialize_global_streams -__call_initialize_global_streams: - call __initialize_global_streams - -;;; **** Initialize heap if needed. - .section CODE, noroot, noreorder - .pubweak __call_heap_initialize - .extern __heap_initialize, __default_heap -__call_heap_initialize: -#ifdef __CALYPSI_DATA_MODEL_SMALL__ - lda ##.sectionSize heap - sta dp:.tiny(_Dp+2) - lda ##.sectionStart heap - sta dp:.tiny(_Dp+0) - lda ##__default_heap -#else - lda ##.word2 (.sectionStart heap) - sta dp:.tiny(_Dp+6) - lda ##.word0 (.sectionStart heap) - sta dp:.tiny(_Dp+4) - lda ##.word2 __default_heap - sta dp:.tiny(_Dp+2) - lda ##.word0 __default_heap - sta dp:.tiny(_Dp+0) - ldx ##.word2 (.sectionSize heap) - lda ##.word0 (.sectionSize heap) -#endif - call __heap_initialize - - .section CODE, root, noreorder - lda ##0 ; argc = 0 - call main - jump exit - -;;; *************************************************************************** -;;; -;;; __low_level_init - custom low level initialization -;;; -;;; This default routine just returns doing nothing. You can provide your own -;;; routine, either in C or assembly for doing custom low leve initialization. -;;; -;;; *************************************************************************** - - .section libcode - .pubweak __low_level_init -__low_level_init: - return diff --git a/src/C256/addresses.csv b/src/C256/addresses.csv index 87c7b0e..c58a38e 100644 --- a/src/C256/addresses.csv +++ b/src/C256/addresses.csv @@ -1,55 +1,74 @@ "sys_proc_exit","FFE000" -"sys_chan_read_b","FFE004" -"sys_chan_read","FFE008" -"sys_chan_readline","FFE00C" -"sys_chan_write_b","FFE010" -"sys_chan_write","FFE014" -"sys_chan_status","FFE018" -"sys_chan_flush","FFE01C" -"sys_chan_seek","FFE020" -"sys_chan_ioctrl","FFE024" -"sys_chan_open","FFE028" -"sys_chan_close","FFE02C" -"sys_chan_swap","FFE030" -"sys_chan_device","FFE034" -"sys_bdev_register","FFE038" -"sys_bdev_read","FFE03C" -"sys_bdev_write","FFE040" -"sys_bdev_status","FFE044" -"sys_bdev_flush","FFE048" -"sys_bdev_ioctrl","FFE04C" -"sys_fsys_open","FFE050" -"sys_fsys_close","FFE054" -"sys_fsys_opendir","FFE058" -"sys_fsys_closedir","FFE05C" -"sys_fsys_readdir","FFE060" -"sys_fsys_findfirst","FFE064" -"sys_fsys_findnext","FFE068" -"sys_fsys_mkdir","FFE06C" -"sys_fsys_delete","FFE070" -"sys_fsys_rename","FFE074" -"sys_fsys_set_cwd","FFE078" -"sys_fsys_get_cwd","FFE07C" -"sys_fsys_load","FFE080" -"sys_fsys_register_loader","FFE084" -"sys_fsys_stat","FFE088" -"sys_mem_get_ramtop","FFE08C" -"sys_mem_reserve","FFE090" -"sys_err_message","FFE094" -"sys_proc_run","FFE098" -"sys_txt_get_capabilities","FFE09C" -"sys_txt_set_mode","FFE0A0" -"sys_txt_setsizes","FFE0A4" -"sys_txt_set_xy","FFE0A8" -"sys_txt_get_xy","FFE0AC" -"sys_txt_get_region","FFE0B0" -"sys_txt_set_region","FFE0B4" -"sys_txt_set_color","FFE0B8" -"sys_txt_get_color","FFE0BC" -"sys_txt_set_cursor_visible","FFE0C0" -"sys_txt_set_font","FFE0C4" -"sys_txt_get_sizes","FFE0C8" -"sys_txt_set_border","FFE0CC" -"sys_txt_set_border_color","FFE0D0" -"sys_txt_put","FFE0D4" -"sys_txt_print","FFE0D8" +"sys_int_enable_all","FFE004" +"sys_int_disable_all","FFE008" +"sys_int_restore_all","FFE00C" +"sys_int_disable","FFE010" +"sys_int_enable","FFE014" +"sys_int_register","FFE018" +"sys_int_pending","FFE01C" +"sys_get_info","FFE020" +"sys_int_clear","FFE024" +"sys_chan_read_b","FFE028" +"sys_chan_read","FFE02C" +"sys_chan_readline","FFE030" +"sys_chan_write_b","FFE034" +"sys_chan_write","FFE038" +"sys_chan_status","FFE03C" +"sys_chan_flush","FFE040" +"sys_chan_seek","FFE044" +"sys_chan_ioctrl","FFE048" +"sys_chan_open","FFE04C" +"sys_chan_close","FFE050" +"sys_chan_swap","FFE054" +"sys_chan_device","FFE058" +"sys_cdev_register","FFE05C" +"sys_bdev_register","FFE060" +"sys_bdev_read","FFE064" +"sys_bdev_write","FFE068" +"sys_bdev_status","FFE06C" +"sys_bdev_flush","FFE070" +"sys_bdev_ioctrl","FFE074" +"sys_fsys_open","FFE078" +"sys_fsys_close","FFE07C" +"sys_fsys_opendir","FFE080" +"sys_fsys_closedir","FFE084" +"sys_fsys_readdir","FFE088" +"sys_fsys_findfirst","FFE08C" +"sys_fsys_findnext","FFE090" +"sys_fsys_get_label","FFE094" +"sys_fsys_set_label","FFE098" +"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" diff --git a/src/C256/genaddresses.py b/src/C256/genaddresses.py index 6c8d1f7..2f4e689 100644 --- a/src/C256/genaddresses.py +++ b/src/C256/genaddresses.py @@ -12,6 +12,9 @@ with open("addresses.csv", "w") as addresses: line = line[index - 1:] line = line.strip() + elements = line.split(",") + if len(elements) > 1: + line = elements[0].strip() # Process only actual names if len(line) > 0: diff --git a/src/C256/gentables.py b/src/C256/gentables.py index 8fd8b89..ba2a399 100644 --- a/src/C256/gentables.py +++ b/src/C256/gentables.py @@ -3,6 +3,7 @@ # sys_call_names = [] +internal_names = [] # Read in the list of system calls ("sys_") with open("syscalls.txt", "r") as call_names: @@ -18,7 +19,13 @@ with open("syscalls.txt", "r") as call_names: # Skip blank lines if len(line) > 0: - sys_call_names.append(line) + elements = line.split(",") + if len(elements) == 1: + sys_call_names.append(line) + internal_names.append(line) + else: + sys_call_names.append(elements[0].strip()) + internal_names.append(elements[1].strip()) # # Create the system call table, which is used to call into the kernel jump table @@ -44,10 +51,12 @@ with open("jumptable.s", "w") as f: f.write("\n") - for call_name in sys_call_names: - f.write("\t.extern {}\n".format(call_name)) + for internal_name in internal_names: + f.write("\t.extern {}\n".format(internal_name)) f.write("\n\t.section jumptable\n\n"); - for call_name in sys_call_names: - f.write("sys_{:26}\tjmp long:{}\n".format(call_name + ": ", call_name)) \ No newline at end of file + for i in range(len(sys_call_names)): + external_name = sys_call_names[i] + internal_name = internal_names[i] + f.write("sys_{:26}\tjmp long:{}\n".format(external_name + ": ", internal_name)) \ No newline at end of file diff --git a/src/C256/jumptable.s b/src/C256/jumptable.s index 6309e8e..ce9aa25 100644 --- a/src/C256/jumptable.s +++ b/src/C256/jumptable.s @@ -1,6 +1,7 @@ .public sys_proc_exit .public sys_int_enable_all .public sys_int_disable_all + .public sys_int_restore_all .public sys_int_disable .public sys_int_enable .public sys_int_register @@ -20,7 +21,7 @@ .public sys_chan_close .public sys_chan_swap .public sys_chan_device - .public sys_chan_register + .public sys_cdev_register .public sys_bdev_register .public sys_bdev_read .public sys_bdev_write @@ -55,6 +56,7 @@ .public sys_proc_run .public sys_txt_get_capabilities .public sys_txt_set_mode + .public sys_txt_set_resolution .public sys_txt_setsizes .public sys_txt_set_xy .public sys_txt_get_xy @@ -62,6 +64,7 @@ .public sys_txt_set_region .public sys_txt_set_color .public sys_txt_get_color + .public sys_txt_set_cursor .public sys_txt_set_cursor_visible .public sys_txt_set_font .public sys_txt_get_sizes @@ -73,6 +76,7 @@ .extern proc_exit .extern int_enable_all .extern int_disable_all + .extern int_restore_all .extern int_disable .extern int_enable .extern int_register @@ -127,6 +131,7 @@ .extern proc_run .extern txt_get_capabilities .extern txt_set_mode + .extern txt_set_resolution .extern txt_setsizes .extern txt_set_xy .extern txt_get_xy @@ -134,6 +139,7 @@ .extern txt_set_region .extern txt_set_color .extern txt_get_color + .extern txt_set_cursor .extern txt_set_cursor_visible .extern txt_set_font .extern txt_get_sizes @@ -147,6 +153,7 @@ sys_proc_exit: jmp long:proc_exit sys_int_enable_all: jmp long:int_enable_all sys_int_disable_all: jmp long:int_disable_all +sys_int_restore_all: jmp long:int_restore_all sys_int_disable: jmp long:int_disable sys_int_enable: jmp long:int_enable sys_int_register: jmp long:int_register @@ -166,7 +173,7 @@ sys_chan_open: jmp long:chan_open sys_chan_close: jmp long:chan_close sys_chan_swap: jmp long:chan_swap sys_chan_device: jmp long:chan_device -sys_chan_register: jmp long:cdev_register +sys_cdev_register: jmp long:cdev_register sys_bdev_register: jmp long:bdev_register sys_bdev_read: jmp long:bdev_read sys_bdev_write: jmp long:bdev_write @@ -201,6 +208,7 @@ sys_kbd_layout: jmp long:kbd_layout sys_proc_run: jmp long:proc_run sys_txt_get_capabilities: jmp long:txt_get_capabilities sys_txt_set_mode: jmp long:txt_set_mode +sys_txt_set_resolution: jmp long:txt_set_resolution sys_txt_setsizes: jmp long:txt_setsizes sys_txt_set_xy: jmp long:txt_set_xy sys_txt_get_xy: jmp long:txt_get_xy @@ -208,6 +216,7 @@ sys_txt_get_region: jmp long:txt_get_region sys_txt_set_region: jmp long:txt_set_region sys_txt_set_color: jmp long:txt_set_color sys_txt_get_color: jmp long:txt_get_color +sys_txt_set_cursor: jmp long:txt_set_cursor sys_txt_set_cursor_visible: jmp long:txt_set_cursor_visible sys_txt_set_font: jmp long:txt_set_font sys_txt_get_sizes: jmp long:txt_get_sizes diff --git a/src/C256/syscalls.txt b/src/C256/syscalls.txt index 4355a7f..0f4b587 100644 --- a/src/C256/syscalls.txt +++ b/src/C256/syscalls.txt @@ -1,14 +1,15 @@ -# A list of system calls to be used to autogenerate the various jump tables and sys calls stubs\ +# A list of system calls to be used to autogenerate the various jump tables and sys calls stubs proc_exit int_enable_all int_disable_all +int_restore_all int_disable int_enable int_register int_pending -get_info int_clear +get_info,sys_get_information chan_read_b chan_read @@ -23,7 +24,7 @@ chan_open chan_close chan_swap chan_device -chan_register +cdev_register bdev_register bdev_read @@ -44,24 +45,23 @@ fsys_set_label fsys_mkdir fsys_delete fsys_rename -fsys_set_cwd -fsys_get_cwd fsys_load fsys_register_loader fsys_stat mem_get_ramtop mem_reserve -time_jiffies +time_jiffies,timers_jiffies rtc_set_time rtc_get_time -kbd_scancode +kbd_scancode,kbd_get_scancode err_message kbd_layout proc_run txt_get_capabilities txt_set_mode +txt_set_resolution txt_setsizes txt_set_xy txt_get_xy @@ -69,6 +69,7 @@ txt_get_region txt_set_region txt_set_color txt_get_color +txt_set_cursor txt_set_cursor_visible txt_set_font txt_get_sizes diff --git a/src/dev/channel.h b/src/dev/channel.h index f47e782..03f0eb8 100644 --- a/src/dev/channel.h +++ b/src/dev/channel.h @@ -34,44 +34,6 @@ #define CDEV_SEEK_RELATIVE 1 /* Seek from the current position */ #define CDEV_SEEK_END 2 /* Seek from teh end of the file */ -/* - * Structure defining a channel - */ - -typedef struct s_channel { - short number; // The number of the channel - short dev; // The number of the channel's device - uint8_t data[CHAN_DATA_SIZE]; // A block of state data that the channel code can use for its own purposes -} t_channel, *p_channel; - -typedef short (*FUNC_CBS_2_S)(p_channel, uint8_t *, short); -typedef short (*FUNC_C_2_S)(p_channel); -typedef short (*FUNC_CcBS_2_S)(p_channel, const uint8_t *, short); -typedef short (*FUNC_CB_2_S)(p_channel, uint8_t); -typedef short (*FUNC_CLS_2_S)(p_channel, long, short); -typedef short (*FUNC_CSBS_2_S)(p_channel, short, uint8_t *, short); - -/* - * Structure defining a channel device's functions - */ - -typedef struct s_dev_chan { - short number; // The number of the device (assigned by registration) - char * name; // The name of the device - FUNC_V_2_S init; // short init() -- Initialize the device - FUNC_CcBS_2_S open; // short open(t_channel * chan, const uint8_t * path, short mode) -- open a channel for the device - FUNC_V_2_S close; // short close(t_channel * chan) -- called when a channel is closed - FUNC_CBS_2_S read; // short read(t_channel *, uint8_t * buffer, short size) -- Read a a buffer from the device - FUNC_CBS_2_S readline; // short readline(t_channel *, uint8_t * buffer, short size) -- Read a line of text from the device - FUNC_C_2_S read_b; // short read_b(t_channel *) -- read a single uint8_t from the device - FUNC_CcBS_2_S write; // short write(t_channel *, const uint8_t * buffer, short size) -- Write a buffer to the device - FUNC_CB_2_S write_b; // short write_b(t_channel *, const uint8_t b) -- Write a single uint8_t to the device - FUNC_C_2_S status; // short status(t_channel *) -- Get the status of the device - FUNC_C_2_S flush; // short flush(t_channel *) -- Ensure that any pending writes to teh device have been completed - FUNC_CLS_2_S seek; // short cdev_seek(t_channel *, long position, short base) -- attempt to move the "cursor" position in the channel - FUNC_CSBS_2_S ioctrl; // short ioctrl(t_channel *, short command, uint8_t * buffer, short size)) -- Issue a control command to the device -} t_dev_chan, *p_dev_chan; - /* * Initialize the channel driver system */ diff --git a/src/dev/interrupts_c256.c b/src/dev/interrupts_c256.c index fcebfed..71fe8f3 100644 --- a/src/dev/interrupts_c256.c +++ b/src/dev/interrupts_c256.c @@ -199,6 +199,21 @@ SYSTEMCALL short int_disable_all() { return status; } +/* + * Restore interrupt masking state returned by a previous call to int_enable/int_disable + * + * NOTE: this is actually provided in the low level assembly + * + * Inputs: + * state = a machine dependent representation of the interrupt masking to restore + */ +SYSTEMCALL void int_restore_all(short state) { + // NOTE: this code uses Calypsi specific intrinsic functions + // and does a cast that may not be valid + + __restore_interrupt_state((__interrupt_state_t)state); +} + /* * Disable an interrupt by masking it * diff --git a/src/dev/interrupts_f256.c b/src/dev/interrupts_f256.c index 6c03a04..a6ac763 100644 --- a/src/dev/interrupts_f256.c +++ b/src/dev/interrupts_f256.c @@ -194,6 +194,21 @@ SYSTEMCALL short int_disable_all() { return status; } +/* + * Restore interrupt masking state returned by a previous call to int_enable/int_disable + * + * NOTE: this is actually provided in the low level assembly + * + * Inputs: + * state = a machine dependent representation of the interrupt masking to restore + */ +SYSTEMCALL void int_restore_all(short state) { + // NOTE: this code uses Calypsi specific intrinsic functions + // and does a cast that may not be valid + + __restore_interrupt_state((__interrupt_state_t)state); +} + /* * Disable an interrupt by masking it * diff --git a/src/dev/kbd_f256k.c b/src/dev/kbd_f256k.c index a3e7e12..78b7e0b 100644 --- a/src/dev/kbd_f256k.c +++ b/src/dev/kbd_f256k.c @@ -209,7 +209,7 @@ static void kbd_process_key(short column, short row, bool is_pressed) { * Returns: * The next scancode to be processed, 0 if nothing. */ -unsigned short kbd_get_scancode() { +SYSTEMCALL unsigned short kbd_get_scancode() { if (rb_word_empty(&scan_code_buffer)) { return 0; } else { diff --git a/src/dev/kbd_f256k.h b/src/dev/kbd_f256k.h index 6140bed..87068c3 100644 --- a/src/dev/kbd_f256k.h +++ b/src/dev/kbd_f256k.h @@ -27,7 +27,7 @@ extern void kbd_handle_irq(); * Returns: * The next scancode to be processed, 0 if nothing. */ -extern unsigned short kbd_get_scancode(); +extern SYSTEMCALL unsigned short kbd_get_scancode(); /* * Check to see if a BREAK code has been pressed recently diff --git a/src/include/sys_types.h b/src/include/sys_types.h index 1266162..0efe322 100644 --- a/src/include/sys_types.h +++ b/src/include/sys_types.h @@ -63,15 +63,6 @@ typedef struct s_color4 { */ typedef void (*FUNC_V_2_V)(); -typedef short (*FUNC_V_2_S)(); -typedef short (*FUNC_S_2_S)(char *); -typedef short (*FUNC_BS_2_S)(unsigned char *, short); -typedef short (*FUNC_cBS_2_S)(const unsigned char *, short); -typedef short (*FUNC_B_2_S)(const unsigned short); -typedef short (*FUNC_LBS_2_S)(long, unsigned char *, short); -typedef short (*FUNC_LcBS_2_S)(long, const unsigned char *, short); -typedef short (*FUNC_SBS_2_S)(short, unsigned char *, short); -typedef short (*FUNC_LB_2_S)(long, short); /* * Type declaration for an interrupt handler @@ -105,6 +96,38 @@ typedef struct s_sys_info { uint16_t screens; /* How many screens are on this computer */ } t_sys_info, *p_sys_info; +/* + * Structure defining a channel device's functions + */ + + +/* + * Structure defining a channel + */ + +typedef struct s_channel { + short number; // The number of the channel + short dev; // The number of the channel's device + uint8_t data[32]; // A block of state data that the channel code can use for its own purposes +} t_channel, *p_channel; + +typedef struct s_dev_chan { + short number; // The number of the device (assigned by registration) + char * name; // The name of the device + short (*init)(); // Initialize the device + short (*open)(t_channel * chan, const uint8_t * path, short mode); // -- open a channel for the device + short (*close)(t_channel * chan); // Called when a channel is closed + short (*read)(t_channel * chan, uint8_t * buffer, short size); // Read a a buffer from the device + short (*readline)(t_channel * chan, uint8_t * buffer, short size); // Read a line of text from the device + short (*read_b)(t_channel * chan); // -- read a single uint8_t from the device + short (*write)(t_channel * chan, const uint8_t * buffer, short size); // Write a buffer to the device + short (*write_b)(t_channel * chan, const uint8_t b) ; // Write a single uint8_t to the device + short (*status)(t_channel * chan); // Get the status of the device + short (*flush)(t_channel * chan); // Ensure that any pending writes to teh device have been completed + short (*seek)(t_channel * chan, long position, short base); // Attempt to move the "cursor" position in the channel + short (*ioctrl)(t_channel * chan, short command, uint8_t * buffer, short size); // Issue a control command to the device +} t_dev_chan, *p_dev_chan; + /* * Structure defining a block device's functions */ diff --git a/src/interrupt.h b/src/interrupt.h index 1dd0320..2b4a60c 100644 --- a/src/interrupt.h +++ b/src/interrupt.h @@ -258,9 +258,9 @@ extern SYSTEMCALL short int_disable_all(); * NOTE: this is actually provided in the low level assembly * * Inputs: - * int_mask = machine dependent representation of the interrupt masking + * state = a machine dependent representation of the interrupt masking to restore */ -extern SYSTEMCALL void int_restore(short int_mask); +extern SYSTEMCALL void int_restore_all(short state); /* * Disable an interrupt by masking it diff --git a/src/version.h b/src/version.h index a7bbcb4..cec152b 100644 --- a/src/version.h +++ b/src/version.h @@ -7,6 +7,6 @@ #define VER_MAJOR 1 #define VER_MINOR 0 -#define VER_BUILD 24 +#define VER_BUILD 25 #endif