From ef473f74ace190e2cb7d575f50d8259e51e5fa9f Mon Sep 17 00:00:00 2001 From: Peter Weingartner Date: Sat, 14 Sep 2024 12:08:21 -0400 Subject: [PATCH] Updated 64TASS Client Files --- client-64tass/README.md | 30 + client-64tass/bindings.s | 867 ++++++++++++++ client-64tass/genbinding.py | 33 - client-64tass/genbindings.py | 282 +++++ client-64tass/hello.s | 15 +- client-64tass/macros.s | 68 -- client-64tass/tb_params.s | 124 -- client-64tass/toolbox.s | 122 +- client-64tass/types.s | 100 ++ client/src/bindings.s | 142 ++- client/src/genbinding.py | 4 +- client/src/include/toolbox.h | 2 +- src/toolbox-20.bin | Bin 8192 -> 0 bytes src/toolbox-21.bin | Bin 8192 -> 0 bytes src/toolbox-22.bin | Bin 8192 -> 0 bytes src/toolbox-23.bin | Bin 8192 -> 0 bytes src/toolbox-24.bin | Bin 8192 -> 0 bytes src/toolbox-25.bin | Bin 8192 -> 0 bytes src/toolbox-26.bin | Bin 8192 -> 0 bytes src/toolbox-27.bin | Bin 8192 -> 0 bytes src/toolbox-28.bin | Bin 8192 -> 0 bytes src/toolbox-29.bin | Bin 8192 -> 0 bytes src/toolbox-2A.bin | Bin 8192 -> 0 bytes src/toolbox-2B.bin | Bin 8192 -> 0 bytes src/toolbox-2C.bin | Bin 8192 -> 0 bytes src/toolbox-2D.bin | Bin 8192 -> 0 bytes src/toolbox-2E.bin | Bin 8192 -> 0 bytes src/toolbox-2F.bin | Bin 8192 -> 0 bytes src/toolbox-30.bin | Bin 8192 -> 0 bytes src/toolbox-31.bin | Bin 8192 -> 0 bytes src/toolbox-3F.bin | Bin 8192 -> 0 bytes src/toolbox.bin | 2182 ---------------------------------- utils/genparams.py | 62 - 33 files changed, 1448 insertions(+), 2585 deletions(-) create mode 100644 client-64tass/README.md create mode 100644 client-64tass/bindings.s delete mode 100644 client-64tass/genbinding.py create mode 100644 client-64tass/genbindings.py delete mode 100644 client-64tass/macros.s delete mode 100644 client-64tass/tb_params.s create mode 100644 client-64tass/types.s delete mode 100644 src/toolbox-20.bin delete mode 100644 src/toolbox-21.bin delete mode 100644 src/toolbox-22.bin delete mode 100644 src/toolbox-23.bin delete mode 100644 src/toolbox-24.bin delete mode 100644 src/toolbox-25.bin delete mode 100644 src/toolbox-26.bin delete mode 100644 src/toolbox-27.bin delete mode 100644 src/toolbox-28.bin delete mode 100644 src/toolbox-29.bin delete mode 100644 src/toolbox-2A.bin delete mode 100644 src/toolbox-2B.bin delete mode 100644 src/toolbox-2C.bin delete mode 100644 src/toolbox-2D.bin delete mode 100644 src/toolbox-2E.bin delete mode 100644 src/toolbox-2F.bin delete mode 100644 src/toolbox-30.bin delete mode 100644 src/toolbox-31.bin delete mode 100644 src/toolbox-3F.bin delete mode 100644 src/toolbox.bin delete mode 100644 utils/genparams.py diff --git a/client-64tass/README.md b/client-64tass/README.md new file mode 100644 index 0000000..e03c6f7 --- /dev/null +++ b/client-64tass/README.md @@ -0,0 +1,30 @@ +# Foenix Toolbox Function Bindings for the 64TASS Assembler + +This folder contains the assembly (*.s) files needed to call into the Foenix Toolbox using 64TASS assembly. + +## Foenix Toolbox Assembly ABI + +Foenix Toolbox functions are called using the Calypsi "simplecall" calling convention. + +1. The first parameter is passed using the accumulator for 8 and 16 bit quantities, and the X register and accumulator for 24 and 32 bit quantities (with the X register holding the most significant bits). +2. Additional parameters are passed on the stack, pushed so that the left-most parameter is at the top of the stack before the call. +3. The return value is passed in the accumulator for 8 and 16 bit values or the X register and accumulator for 24 and 32 bit values. +4. The caller is responsible for removing the parameters from the stack (if any) after the call returns. +5. The Foenix Toolbox will preserve the caller's direct page and data bank registers at the start of the call and restore them just before returning to the caller. +6. All functions are accessed using long calls (`JSL`). + +## Files + +The files that are included as part of the client bindings are: + +* `toolbox.s`: the main include file. This file includes `bindings.s` automatically and also defines the `alloc` and `free` macros that can be used to help manage the stack. NOTE: the `free` macro uses the first two bytes in the caller's direct page as scratch storage to preserve the return value from the function while cleaning up the stack. + +* `types.s`: this include file defines some structures to match the data structures used by some of the Toolbox functions. + +* `bindings.s`: this include file defines all the function labels as well as labels that may be used to treat the parameters as locations in memory, rather than as values on the stack. This may simplify coding in some cases. + +* `genbindings.py`: this Python script is used to generate the `bindings.s` file in the case that Toolbox functions are removed, altered, or added. It uses the files in the Calypsi bindings folder as the source for what functions are present. The general user of the 64TASS client files will probably never use this script. + +* `hello.s`: A simple "Hello, world" example. It also demonstrates using the program header for programs to run from RAM, flash, or the cartridge. + + diff --git a/client-64tass/bindings.s b/client-64tass/bindings.s new file mode 100644 index 0000000..c85b7c6 --- /dev/null +++ b/client-64tass/bindings.s @@ -0,0 +1,867 @@ + +; +; extern SYSTEMCALL void sys_exit(short result); +; +; result goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_exit = $000000 + + +; +; extern SYSTEMCALL void sys_int_enable_all(); +; +; 0 bytes needed for the stack parameters +; +sys_int_enable_all = $ffe004 + + +; +; extern SYSTEMCALL void sys_int_disable_all(); +; +; 0 bytes needed for the stack parameters +; +sys_int_disable_all = $ffe008 + + +; +; extern SYSTEMCALL void sys_int_disable(unsigned short n); +; +; n goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_int_disable = $ffe00c + + +; +; extern SYSTEMCALL void sys_int_enable(unsigned short n); +; +; n goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_int_enable = $ffe010 + + +; +; extern SYSTEMCALL p_int_handler sys_int_register(unsigned short n, p_int_handler handler); +; +; n goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_int_register = $ffe014 + +int_register .namespace + .virtual 1,s +handler .dword ? ; pointer to the interrupt handler to register + .endv + +; +; extern SYSTEMCALL short sys_int_pending(unsigned short n); +; +; n goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_int_pending = $ffe018 + + +; +; extern SYSTEMCALL void sys_get_info(p_sys_info info); +; +; info goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_get_info = $ffe01c + + +; +; extern SYSTEMCALL void sys_int_clear(unsigned short n); +; +; n goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_int_clear = $ffe020 + + +; +; extern SYSTEMCALL short sys_chan_read_b(short channel); +; +; channel goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_chan_read_b = $ffe024 + + +; +; extern SYSTEMCALL short sys_chan_read(short channel, unsigned char * buffer, short size); +; +; channel goes in A[15..0] +; +; 6 bytes needed for the stack parameters +; +sys_chan_read = $ffe028 + +chan_read .namespace + .virtual 1,s +buffer .dword ? ; the buffer into which to copy the channel data +size .word ? ; the size of the buffer. + .endv + +; +; extern SYSTEMCALL short sys_chan_readline(short channel, unsigned char * buffer, short size); +; +; channel goes in A[15..0] +; +; 6 bytes needed for the stack parameters +; +sys_chan_readline = $ffe02c + +chan_readline .namespace + .virtual 1,s +buffer .dword ? ; the buffer into which to copy the channel data +size .word ? ; the size of the buffer + .endv + +; +; extern SYSTEMCALL short sys_chan_write_b(short channel, uint8_t b); +; +; channel goes in A[15..0] +; +; 1 bytes needed for the stack parameters +; +sys_chan_write_b = $ffe030 + +chan_write_b .namespace + .virtual 1,s +b .byte ? ; the byte to write + .endv + +; +; extern SYSTEMCALL short sys_chan_write(short channel, const uint8_t * buffer, short size); +; +; channel goes in A[15..0] +; +; 6 bytes needed for the stack parameters +; +sys_chan_write = $ffe034 + +chan_write .namespace + .virtual 1,s +buffer .dword ? ; +size .word ? ; + .endv + +; +; extern SYSTEMCALL short sys_chan_status(short channel); +; +; channel goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_chan_status = $ffe038 + + +; +; extern SYSTEMCALL short sys_chan_flush(short channel); +; +; channel goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_chan_flush = $ffe03c + + +; +; extern SYSTEMCALL short sys_chan_seek(short channel, long position, short base); +; +; channel goes in A[15..0] +; +; 6 bytes needed for the stack parameters +; +sys_chan_seek = $ffe040 + +chan_seek .namespace + .virtual 1,s +position .dword ? ; the position of the cursor +base .word ? ; whether the position is absolute or relative to the current position + .endv + +; +; extern SYSTEMCALL short sys_chan_ioctrl(short channel, short command, uint8_t * buffer, short size); +; +; channel goes in A[15..0] +; +; 8 bytes needed for the stack parameters +; +sys_chan_ioctrl = $ffe044 + +chan_ioctrl .namespace + .virtual 1,s +command .word ? ; the number of the command to send +buffer .dword ? ; pointer to bytes of additional data for the command +size .word ? ; the size of the buffer + .endv + +; +; extern SYSTEMCALL short sys_chan_open(short dev, const char * path, short mode); +; +; dev goes in A[15..0] +; +; 6 bytes needed for the stack parameters +; +sys_chan_open = $ffe048 + +chan_open .namespace + .virtual 1,s +path .dword ? ; a "path" describing how the device is to be open +mode .word ? ; s the device to be read, written, both? (0x01 = READ flag, 0x02 = WRITE flag, 0x03 = READ and WRITE) + .endv + +; +; extern SYSTEMCALL short sys_chan_close(short chan); +; +; chan goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_chan_close = $ffe04c + + +; +; extern SYSTEMCALL short sys_chan_swap(short channel1, short channel2); +; +; channel1 goes in A[15..0] +; +; 2 bytes needed for the stack parameters +; +sys_chan_swap = $ffe050 + +chan_swap .namespace + .virtual 1,s +channel2 .word ? ; the ID of the other channel + .endv + +; +; extern SYSTEMCALL short sys_chan_device(short channel); +; +; channel goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_chan_device = $ffe054 + + +; +; extern SYSTEMCALL void sys_text_setsizes(short chan); +; +; chan goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_text_setsizes = $000000 + + +; +; extern SYSTEMCALL short sys_bdev_register(p_dev_block device); +; +; device goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_bdev_register = $ffe05c + + +; +; extern SYSTEMCALL short sys_bdev_read(short dev, long lba, uint8_t * buffer, short size); +; +; dev goes in A[15..0] +; +; 10 bytes needed for the stack parameters +; +sys_bdev_read = $ffe060 + +bdev_read .namespace + .virtual 1,s +lba .dword ? ; the logical block address of the block to read +buffer .dword ? ; the buffer into which to copy the block data +size .word ? ; the size of the buffer. + .endv + +; +; extern SYSTEMCALL short sys_bdev_write(short dev, long lba, const uint8_t * buffer, short size); +; +; dev goes in A[15..0] +; +; 10 bytes needed for the stack parameters +; +sys_bdev_write = $ffe064 + +bdev_write .namespace + .virtual 1,s +lba .dword ? ; the logical block address of the block to write +buffer .dword ? ; the buffer containing the data to write +size .word ? ; the size of the buffer. + .endv + +; +; extern SYSTEMCALL short sys_bdev_status(short dev); +; +; dev goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_bdev_status = $ffe068 + + +; +; extern SYSTEMCALL short sys_bdev_flush(short dev); +; +; dev goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_bdev_flush = $ffe06c + + +; +; extern SYSTEMCALL short sys_bdev_ioctrl(short dev, short command, uint8_t * buffer, short size); +; +; dev goes in A[15..0] +; +; 8 bytes needed for the stack parameters +; +sys_bdev_ioctrl = $ffe070 + +bdev_ioctrl .namespace + .virtual 1,s +command .word ? ; the number of the command to send +buffer .dword ? ; pointer to bytes of additional data for the command +size .word ? ; the size of the buffer + .endv + +; +; extern SYSTEMCALL short sys_fsys_open(const char * path, short mode); +; +; path goes in X[15..0]:A[15..0] +; +; 2 bytes needed for the stack parameters +; +sys_fsys_open = $ffe074 + +fsys_open .namespace + .virtual 1,s +mode .word ? ; the mode (e.g. r/w/create) + .endv + +; +; extern SYSTEMCALL short sys_fsys_close(short fd); +; +; fd goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_fsys_close = $ffe078 + + +; +; extern SYSTEMCALL short sys_fsys_opendir(const char * path); +; +; path goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_fsys_opendir = $ffe07c + + +; +; extern SYSTEMCALL short sys_fsys_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); +; +; dir goes in A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_fsys_closedir = $ffe080 + + +; +; extern SYSTEMCALL short sys_fsys_readdir(short dir, p_file_info file); +; +; dir goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_fsys_readdir = $ffe084 + +fsys_readdir .namespace + .virtual 1,s +file .dword ? ; pointer to the t_file_info structure to fill out. + .endv + +; +; extern SYSTEMCALL short sys_fsys_findfirst(const char * path, const char * pattern, p_file_info file); +; +; path goes in X[15..0]:A[15..0] +; +; 8 bytes needed for the stack parameters +; +sys_fsys_findfirst = $ffe088 + +fsys_findfirst .namespace + .virtual 1,s +pattern .dword ? ; the file name pattern to search for +file .dword ? ; pointer to the t_file_info structure to fill out + .endv + +; +; extern SYSTEMCALL short sys_fsys_findnext(short dir, p_file_info file); +; +; dir goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_fsys_findnext = $ffe08c + +fsys_findnext .namespace + .virtual 1,s +file .dword ? ; pointer to the t_file_info structure to fill out + .endv + +; +; extern SYSTEMCALL short sys_fsys_get_label(const char * path, char * label); +; +; path goes in X[15..0]:A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_fsys_get_label = $ffe090 + +fsys_get_label .namespace + .virtual 1,s +label .dword ? ; buffer that will hold the label... should be at least 35 bytes + .endv + +; +; extern SYSTEMCALL short sys_fsys_set_label(short drive, const char * label); +; +; drive goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_fsys_set_label = $ffe094 + +fsys_set_label .namespace + .virtual 1,s +label .dword ? ; buffer that holds the label + .endv + +; +; extern SYSTEMCALL short sys_fsys_mkdir(const char * path); +; +; path goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_fsys_mkdir = $ffe098 + + +; +; extern SYSTEMCALL short sys_fsys_delete(const char * path); +; +; path goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_fsys_delete = $ffe09c + + +; +; extern SYSTEMCALL short sys_fsys_rename(const char * old_path, const char * new_path); +; +; old_path goes in X[15..0]:A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_fsys_rename = $ffe0a0 + +fsys_rename .namespace + .virtual 1,s +new_path .dword ? ; the new path for the file + .endv + +; +; extern SYSTEMCALL short sys_fsys_set_cwd(const char * path); +; +; path goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_fsys_set_cwd = $ffe0a4 + + +; +; extern SYSTEMCALL short sys_fsys_get_cwd(char * path, short size); +; +; path goes in X[15..0]:A[15..0] +; +; 2 bytes needed for the stack parameters +; +sys_fsys_get_cwd = $ffe0a8 + +fsys_get_cwd .namespace + .virtual 1,s +size .word ? ; the size of the buffer in bytes + .endv + +; +; extern SYSTEMCALL short sys_fsys_load(const char * path, uint32_t destination, uint32_t * start); +; +; path goes in X[15..0]:A[15..0] +; +; 8 bytes needed for the stack parameters +; +sys_fsys_load = $ffe0ac + +fsys_load .namespace + .virtual 1,s +destination .dword ? ; the destination address (0 for use file's address) +start .dword ? ; pointer to the long variable to fill with the starting address + .endv + +; +; extern SYSTEMCALL short sys_fsys_register_loader(const char * extension, p_file_loader loader); +; +; extension goes in X[15..0]:A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_fsys_register_loader = $ffe0b0 + +fsys_register_loader.namespace + .virtual 1,s +loader .dword ? ; pointer to the file load routine to add + .endv + +; +; extern SYSTEMCALL short sys_fsys_stat(const char * path, p_file_info file); +; +; path goes in X[15..0]:A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_fsys_stat = $ffe0b4 + +fsys_stat .namespace + .virtual 1,s +file .dword ? ; pointer to a file info record to fill in, if the file is found. + .endv + +; +; extern SYSTEMCALL uint32_t sys_mem_get_ramtop(); +; +; 0 bytes needed for the stack parameters +; +sys_mem_get_ramtop = $ffe0b8 + + +; +; extern SYSTEMCALL uint32_t sys_mem_reserve(uint32_t bytes); +; +; bytes goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_mem_reserve = $ffe0bc + + +; +; extern SYSTEMCALL uint32_t sys_time_jiffies(); +; +; 0 bytes needed for the stack parameters +; +sys_time_jiffies = $ffe0c0 + + +; +; extern SYSTEMCALL void sys_rtc_set_time(p_time time); +; +; time goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_rtc_set_time = $ffe0c4 + + +; +; extern SYSTEMCALL void sys_rtc_get_time(p_time time); +; +; time goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_rtc_get_time = $ffe0c8 + + +; +; extern SYSTEMCALL uint16_t sys_kbd_scancode(); +; +; 0 bytes needed for the stack parameters +; +sys_kbd_scancode = $ffe0cc + + +; +; extern SYSTEMCALL short sys_kbd_layout(const char * tables); +; +; tables goes in X[15..0]:A[15..0] +; +; 0 bytes needed for the stack parameters +; +sys_kbd_layout = $ffe0d4 + + +; +; extern SYSTEMCALL short sys_proc_run(const char * path, int argc, char * argv[]); +; +; path goes in X[15..0]:A[15..0] +; +; 8 bytes needed for the stack parameters +; +sys_proc_run = $ffe0d8 + +proc_run .namespace + .virtual 1,s +argc .dword ? ; the number of arguments passed +argv .dword ? ; the array of string arguments + .endv + +; +; extern SYSTEMCALL short sys_txt_set_mode(short screen, short mode); +; +; screen goes in A[15..0] +; +; 2 bytes needed for the stack parameters +; +sys_txt_set_mode = $ffe0e0 + +txt_set_mode .namespace + .virtual 1,s +mode .word ? ; a bitfield of desired display mode options + .endv + +; +; extern SYSTEMCALL void sys_txt_set_xy(short screen, short x, short y); +; +; screen goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_txt_set_xy = $ffe0e8 + +txt_set_xy .namespace + .virtual 1,s +x .word ? ; the column for the cursor +y .word ? ; the row for the cursor + .endv + +; +; extern SYSTEMCALL void sys_txt_get_xy(short screen, p_point position); +; +; screen goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_txt_get_xy = $ffe0ec + +txt_get_xy .namespace + .virtual 1,s +position .dword ? ; pointer to a t_point record to fill out + .endv + +; +; extern SYSTEMCALL short sys_txt_get_region(short screen, p_rect region); +; +; screen goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_txt_get_region = $ffe0f0 + +txt_get_region .namespace + .virtual 1,s +region .dword ? ; pointer to a t_rect describing the rectangular region (using character cells for size and size) + .endv + +; +; extern SYSTEMCALL short sys_txt_set_region(short screen, p_rect region); +; +; screen goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_txt_set_region = $ffe0f4 + +txt_set_region .namespace + .virtual 1,s +region .dword ? ; pointer to a t_rect describing the rectangular region (using character cells for size and size) + .endv + +; +; extern SYSTEMCALL void sys_txt_set_color(short screen, unsigned char foreground, unsigned char background); +; +; screen goes in A[15..0] +; +; 2 bytes needed for the stack parameters +; +sys_txt_set_color = $ffe0f8 + +txt_set_color .namespace + .virtual 1,s +foreground .byte ? ; the Text LUT index of the new current foreground color (0 - 15) +background .byte ? ; the Text LUT index of the new current background color (0 - 15) + .endv + +; +; extern SYSTEMCALL void sys_txt_get_color(short screen, unsigned char * foreground, unsigned char * background); +; +; screen goes in A[15..0] +; +; 8 bytes needed for the stack parameters +; +sys_txt_get_color = $ffe0fc + +txt_get_color .namespace + .virtual 1,s +foreground .dword ? ; the Text LUT index of the new current foreground color (0 - 15) +background .dword ? ; the Text LUT index of the new current background color (0 - 15) + .endv + +; +; extern SYSTEMCALL void sys_txt_set_cursor_visible(short screen, short is_visible); +; +; screen goes in A[15..0] +; +; 2 bytes needed for the stack parameters +; +sys_txt_set_cursor_visible = $ffe100 + +txt_set_cursor_visible.namespace + .virtual 1,s +is_visible .word ? ; TRUE if the cursor should be visible, FALSE (0) otherwise + .endv + +; +; extern SYSTEMCALL short sys_txt_set_font(short screen, short width, short height, unsigned char * data); +; +; screen goes in A[15..0] +; +; 8 bytes needed for the stack parameters +; +sys_txt_set_font = $ffe104 + +txt_set_font .namespace + .virtual 1,s +width .word ? ; width of a character in pixels +height .word ? ; of a character in pixels +data .dword ? ; pointer to the raw font data to be loaded + .endv + +; +; extern SYSTEMCALL void sys_txt_get_sizes(short screen, p_extent text_size, p_extent pixel_size); +; +; screen goes in A[15..0] +; +; 8 bytes needed for the stack parameters +; +sys_txt_get_sizes = $ffe108 + +txt_get_sizes .namespace + .virtual 1,s +text_size .dword ? ; the size of the screen in visible characters (may be null) +pixel_size .dword ? ; the size of the screen in pixels (may be null) + .endv + +; +; extern SYSTEMCALL void sys_txt_set_border(short screen, short width, short height); +; +; screen goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_txt_set_border = $ffe10c + +txt_set_border .namespace + .virtual 1,s +width .word ? ; the horizontal size of one side of the border (0 - 32 pixels) +height .word ? ; the vertical size of one side of the border (0 - 32 pixels) + .endv + +; +; extern SYSTEMCALL void sys_txt_set_border_color(short screen, unsigned char red, unsigned char green, unsigned char blue); +; +; screen goes in A[15..0] +; +; 3 bytes needed for the stack parameters +; +sys_txt_set_border_color = $ffe110 + +txt_set_border_color.namespace + .virtual 1,s +red .byte ? ; the red component of the color (0 - 255) +green .byte ? ; the green component of the color (0 - 255) +blue .byte ? ; the blue component of the color (0 - 255) + .endv + +; +; extern SYSTEMCALL void sys_txt_put(short screen, char c); +; +; screen goes in A[15..0] +; +; 1 bytes needed for the stack parameters +; +sys_txt_put = $ffe114 + +txt_put .namespace + .virtual 1,s +c .byte ? ; the character to print + .endv + +; +; extern SYSTEMCALL void sys_txt_print(short screen, const char * message); +; +; screen goes in A[15..0] +; +; 4 bytes needed for the stack parameters +; +sys_txt_print = $ffe118 + +txt_print .namespace + .virtual 1,s +message .dword ? ; the ASCII Z string to print + .endv diff --git a/client-64tass/genbinding.py b/client-64tass/genbinding.py deleted file mode 100644 index 6c7ddfa..0000000 --- a/client-64tass/genbinding.py +++ /dev/null @@ -1,33 +0,0 @@ - -### -### Generate client bindings for the Toolbox (64TASS version) -### - -# with open("toolbox_bindings.s", "w") as output: - -table_entry_size = 4 -table_address = 0xffe000 -syscalls = {} - -with open("..\src\C256\syscalls.txt", "r") as input: - for line in input: - # Remove comments - index = line.find("#") - if index == 0: - line = "" - elif index > 0: - line = line[index - 1:] - - line = line.strip() - - if line != "": - name = "sys_{}".format(line) - syscalls[name] = table_address - table_address += table_entry_size - -with open("bindings.s", "w") as output: - output.write(";;;\n;;; Bindings for the Foenix Toolbox public calls\n;;;\n\n") - - for name in syscalls.keys(): - address = syscalls[name] - output.write("{0} = ${1:06X}\n".format(name, address)) diff --git a/client-64tass/genbindings.py b/client-64tass/genbindings.py new file mode 100644 index 0000000..41465de --- /dev/null +++ b/client-64tass/genbindings.py @@ -0,0 +1,282 @@ + +# +# Create the 64tass parameters structures for the Toolbox functions +# + +import re +import sys + +class FunctionParameter: + def __init__(self): + self._name = "UNKNOWN" + self._position = 0 + self._type = "" + self._description = "" + + def set_name(self, name): + if name.endswith("[]"): + name = name[0:-2] + self._name = name + + def name(self): + return self._name + + def set_position(self, position): + self._position = position + + def position(self): + return self._position + + def set_type(self, type): + self._type = type + + def type(self): + return self._type + + def set_description(self, description): + self._description = description + + def description(self): + return self._description + + def print(self): + """Print a simple version of a parameter""" + + print("\tName: {0}, Type: {1}, Comment: {2}".format(self._name, self._type, self._description)) + + def size(self): + """Return the size of the parameter in bytes.""" + if self.type() == "char" or self.type() == "unsigned char" or self.type() == "uint8_t": + return 1 + elif self.type() == "short" or self.type() == "unsigned short" or self.type() == "uint16_t": + return 2 + else: + return 4 + + def emit_asm(self, output): + """Emit the assembly reference for the parameter.""" + + size = self.size() + + if size == 1: + output.write("{0:<16}.byte ? ; {1}\n".format(self.name(), self.description())) + elif size == 2: + output.write("{0:<16}.word ? ; {1}\n".format(self.name(), self.description())) + else: + output.write("{0:<16}.dword ? ; {1}\n".format(self.name(), self.description())) + + def emit_accumulator(self, output): + size = self.size() + if size == 1: + output.write("; {0} goes in A[7..0]\n".format(self.name())) + elif size == 2: + output.write("; {0} goes in A[15..0]\n".format(self.name())) + else: + output.write("; {0} goes in X[15..0]:A[15..0]\n".format(self.name())) + +class Function: + def __init__(self): + self._name = "UNKNOWN" + self._brief = "" + self._description = "" + self._type = "void" + self._parameters = [] + self._address = 0 + self._prototype = "" + + def set_name(self, name): + self._name = name + + def name(self): + return self._name + + def set_prototype(self, prototype): + self._prototype = prototype + + def prototype(self): + return self._prototype + + def set_brief(self, brief): + self._brief = brief + + def brief(self): + return self._brief + + def set_description(self, description): + self._description = description + + def description(self): + return self._description + + def set_type(self, type): + self._type = type + + def type(self): + return self._type + + def set_address(self, address): + self._address = address + + def address(self): + return self._address + + def add_parameter(self, param_name, param_type): + """Add a parameter to the function.""" + + param = FunctionParameter() + param.set_name(param_name) + param.set_type(param_type) + param.set_position(len(self._parameters)) + + self._parameters.append(param) + + def parameters(self): + return self._parameters + + def stack_size(self): + """Return the number of bytes needed on the stack for the parameters""" + + size = 0 + if len(self.parameters()) > 1: + for parameter in self.parameters()[1:]: + size = size + parameter.size() + return size + + def add_param_comment(self, param_name, param_comment): + """Add a comment to a parameter""" + + for param in self._parameters: + if param._name == param_name: + param.set_description(param_comment) + break + + def print(self): + """Print out a simple description of the function""" + + print("Name: {0}, Type: {1}".format(self._name, self._type)) + print(self._description) + for parameter in self._parameters: + parameter.print() + + print() + + def emit_asm(self, output): + """Emit the assembly reference for the function.""" + + output.write("\n;\n; {0}\n".format(self.prototype())) + if len(self.parameters()) > 0: + first = self.parameters()[0] + output.write("; \n") + first.emit_accumulator(output) + output.write(";\n") + output.write("; {0} bytes needed for the stack parameters\n;\n".format(self.stack_size())) + + output.write("{0} = ${1:06x}\n\n".format(self.name(), self.address())) + + if len(self.parameters()) > 1: + m = re.match("sys_(\w+)", self.name()) + if m: + short_name = m.group(1) + else: + short_name = self.name() + stack_parameters = self.parameters()[1:] + + output.write("{0:<16}.namespace\n".format(short_name)) + output.write(" .virtual 1,s\n") + + for parameter in stack_parameters: + parameter.emit_asm(output) + + output.write(" .endv\n") + + +comments = [] +functions = [] + +def process_comment(line): + """Deal with a comment line while we're in the middle of a block comment.""" + index = line.index("*") + if index > -1: + comment_line = line[index+1:].strip() + else: + comment_line = line.strip() + + if comment_line != "": + comments.append(comment_line) + +def process_definition(type, name, parameters, comments, prototype): + """Deal with a function prototype.""" + + func = Function() + func.set_name(name) + func.set_type(type) + func.set_prototype(prototype) + + is_in_func_comments = True + + for param in func_parameters: + m1 = re.match("^\s*(.*)\s(\S+)\s*$", param) + if m1: + param_type = m1.group(1).strip() + param_name = m1.group(2).strip() + func.add_parameter(param_name, param_type) + + for comment in comments: + m2 = re.match("@param\s(\w+)\s+(.*)$", comment) + if m2: + param_name = m2.group(1).strip() + param_comment = m2.group(2).strip() + func.add_param_comment(param_name, param_comment) + else: + func._description = func._description + comment + + functions.append(func) + +# +# Read in the C header file with the extern prototypes and parse all the function names, +# return values, and parameters +# +with open(sys.argv[1], "r") as input: + is_in_comment = False + + for line in input.readlines(): + line = line.strip() + + if line.startswith("/**"): + is_in_comments = True + comments = [] + elif line.endswith("*/"): + is_in_comments = False + + if is_in_comments and line.startswith("*"): + process_comment(line) + + else: + m = re.match("extern\s+SYSTEMCALL\s+(\w+)\s+(\w+)\((.*)\)", line) + if m: + func_type = m.group(1) + func_name = m.group(2) + func_parameters = str.split(m.group(3), ",") + process_definition(func_type, func_name, func_parameters, comments, line) + +# +# Read in the Caylpsi Toolbox jumptable assembly file and extract the addresses +# +with open(sys.argv[2], "r") as addresses: + for line in addresses.readlines(): + m = re.match("^(\w+):\s+.equlab\s+0x([0-9a-fA-F]+)", line) + if m: + func_name = m.group(1).strip() + func_address = int(m.group(2), 16) + + for func in functions: + if func.name() == func_name: + func.set_address(func_address) + break + +# +# Create the bindings file with the relevant information +# +with open("bindings.s", "w") as bindings: + for func in functions: + func.emit_asm(bindings) diff --git a/client-64tass/hello.s b/client-64tass/hello.s index e68ab83..117aa32 100644 --- a/client-64tass/hello.s +++ b/client-64tass/hello.s @@ -4,9 +4,20 @@ .cpu "65816" - .include "macros.s" .include "toolbox.s" - .include "tb_params.s" + +setdbr .macro ; Set the B (Data bank) register + pea #((\1) * 256) + (\1) + plb + plb + .databank \1 + .endm + +setaxl .macro + rep #$30 ; set A&X long + .al + .xl + .endm * = $10000 diff --git a/client-64tass/macros.s b/client-64tass/macros.s deleted file mode 100644 index 9c3fab7..0000000 --- a/client-64tass/macros.s +++ /dev/null @@ -1,68 +0,0 @@ -; Set 8-bit accumulator -setaxs .macro - SEP #$30 ; set A&X short - .as - .xs - .endm - -; Set 16-bit accumulator -setaxl .macro - REP #$30 ; set A&X long - .al - .xl - .endm - -; Set 8-bit accumulator -setas .macro - SEP #$20 ; set A short - .as - .endm - -; Set 16-bit accumulator -setal .macro - REP #$20 ; set A long - .al - .endm - -; Set 8 bit index registers -setxs .macro - SEP #$10 ; set X short - .xs - .endm - -; Set 16-bit index registers -setxl .macro - REP #$10 ; set X long - .xl - .endm - -; Set the direct page. -; Note: This uses the accumulator and leaves A set to 16 bits. -setdp .macro - PEA #\1 ; set DP to page 0 - PLD - .dpage \1 - .endm - -setdbr .macro ; Set the B (Data bank) register - PEA #((\1) * 256) + (\1) - PLB - PLB - .databank \1 - .endm - -TRACE .macro message -; PHA -; PHX -; PHY -; PEA #`txt_message -; PEA #<>txt_message -; JSL ITRACE -; BRA continue - -; txt_message .null 13,\message - -; continue PLY -; PLX -; PLA - .endm diff --git a/client-64tass/tb_params.s b/client-64tass/tb_params.s deleted file mode 100644 index 3bc274c..0000000 --- a/client-64tass/tb_params.s +++ /dev/null @@ -1,124 +0,0 @@ - -; -; Allocate a number of bytes onto the stack for parameters -; -alloc .macro count - .switch \count - .case 0 - .case 2 - pea #0 ; 5 - .case 4 - pea #0 ; 10 - pea #0 - .case 6 - pea #0 ; 15 - pea #0 - pea #0 - .default - sta #0,d - - tsc - sec - sbc #\count - tcs - - lda #0,d - .endswitch - .endm - -; -; Remove a number of bytes from the stack (previously alloc'ed) -; -free .macro count - .switch \count - .case 0 - .case 2 - ply ; 5 - .case 4 - ply ; 10 - ply - .case 6 - ply ; 15 - ply - ply - .default - sta #0,d ; 4 - - tsc ; 2 - clc ; 2 - adc #\count ; 3 - tcs ; 2 - - lda #0,d ; 4 (17 total) - .endswitch - .endm - -tb .namespace - - -int_register .namespace - .virtual #1,s -handler: .dword ? - .endv - .endn - -; -; Channel Parameters -; - -chan_read .namespace - .virtual #1,s -size: .word ? -buffer .dword ? - .endv - .endn - -chan_readline .namespace - .virtual #1,s -size .word ? -buffer .dword ? - .endv - .endn - -chan_write_b .namespace - .virtual #1,s -b: .byte ? - .endv - .endn - -chan_write .namespace - .virtual #1,s -buffer .dword ? -size .word ? - .endv - .endn - -chan_seek .namespace - .virtual #1,s -base .word ? -position .dword ? - .endv - .endn - -chan_ioctrl .namespace - .virtual #1,s -size .word ? -buffer .dword ? -command .word ? - .endv - .endn - -chan_open .namespace - .virtual #1,s -mode .word ? -path .dword ? - .endv - .endn - -chan_swap .namespace - .virtual #1,s -channel2 .word ? - .endv - .endn - - .endn \ No newline at end of file diff --git a/client-64tass/toolbox.s b/client-64tass/toolbox.s index e3428f0..c8027b4 100644 --- a/client-64tass/toolbox.s +++ b/client-64tass/toolbox.s @@ -1,59 +1,69 @@ ;;; -;;; Bindings for the Foenix Toolbox public calls +;;; Definitions to connect a 64TASS assembly program to the Foenix Toolbox ;;; -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 + .include "bindings.s" + +; +; Allocate space on the stack for parameters (count = number of bytes) +; +; Affects: A +; +alloc .macro count + + .switch \count + .case 2 + pea #0 + + .case 4 + pea #0 + pea #0 + + .case 6 + pea #0 + pea #0 + pea #0 + + .default + sta #0,d + + tsc + sec + sbc #(\count) + tcs + + lda #0,d + .endswitch + .endm + +; +; Remove space from the stack previously used for parameters (count = number of bytes) +; +; Affects: Y, #0,D, #1,D +; +free .macro count + + .switch \count + .case 2 + ply + + .case 4 + ply + ply + + .case 6 + ply + ply + ply + + .default + sta #0,d + + tsc + clc + adc #(\count) + tcs + + lda #0,d + .endswitch + .endm \ No newline at end of file diff --git a/client-64tass/types.s b/client-64tass/types.s new file mode 100644 index 0000000..767e509 --- /dev/null +++ b/client-64tass/types.s @@ -0,0 +1,100 @@ +;;; +;;; Types used by the Foenix Toolbox functions +;;; + +tb .namespace + +; +; An extent or size of a rectangular area +; +s_extent .struct +width .word ? ; The width of the region +height .word ? ; The height of the region + .ends + +; +; A point on a plane +; +s_point .struct +x .word ? ; The column of the point +y .word ? ; The row of the point + .ends + +; +; A rectangle on the screen +; +s_rect .struct +origin .dstruct s_point ; The upper-left corner of the rectangle +size .dstruct s_extent ; The size of the rectangle + .ends + +; +; A color (BGR) +; +s_color3 .struct +blue .byte ? +green .byte ? +red .byte ? + .ends + +; +; A color entry for a color lookup table (BGRA) +; +s_color4 .struct +blue .byte ? +green .byte ? +red .byte ? +alpha .byte ? + .ends + +; +; Type to describe the current time +; +s_time .struct +year .word ? +month .word ? +day .word ? +hour .word ? +minute .word ? +second .word ? +is_pm .word ? +is_24hours .word ? + .ends + +; +; A description of a screen's capabilities +; +s_txt_capabilities .struct +number .word ? ; The unique ID of the screen +supported_modes .word ? ; The display modes supported on this screen +font_size_count .word ? ; The number of supported font sizes +font_sizes .dword ? ; Pointer to a list of t_extent listing all supported font sizes +resolution_count .word ? ; The number of supported display resolutions +resolutions .dword ? ; Pointer to a list of t_extent listing all supported display resolutions (in pixels) + .ends + +; +; Structure to describe the hardware +; +s_sys_info .struct +mcp_version .word ? ; Current version of the MCP kernel +mcp_rev .word ? ; Current revision, or sub-version of the MCP kernel +mcp_build .word ? ; Current vuild # of the MCP kernel +model .word ? ; Code to say what model of machine this is +sub_model .word ? ; 0x00 = PB, 0x01 = LB, 0x02 = CUBE +model_name .dword ? ; Human readable name of the model of the computer +cpu .word ? ; Code to say which CPU is running +cpu_name .dword ? ; Human readable name for the CPU +cpu_clock_khz .dword ? ; Speed of the CPU clock in KHz +fpga_date .dword ? ; YYYYMMDD +fpga_model .word ? ; FPGA model number +fpga_version .word ? ; FPGA version +fpga_subver .word ? ; FPGA sub-version +system_ram_size .dword ? ; The number of bytes of system RAM on the board +has_floppy .byte ? ; TRUE if the board has a floppy drive installed +has_hard_drive .byte ? ; TRUE if the board has a PATA device installed +has_expansion_card .byte ? ; TRUE if an expansion card is installed on the device +has_ethernet .byte ? ; TRUE if an ethernet port is present +screens .word ? ; How many screens are on this computer + + .endn \ No newline at end of file diff --git a/client/src/bindings.s b/client/src/bindings.s index 9014065..57e395a 100644 --- a/client/src/bindings.s +++ b/client/src/bindings.s @@ -3,6 +3,14 @@ ;;; .public sys_proc_exit + .public sys_int_enable_all + .public sys_int_disable_all + .public sys_int_disable + .public sys_int_enable + .public sys_int_register + .public sys_int_pending + .public sys_get_info + .public sys_int_clear .public sys_chan_read_b .public sys_chan_read .public sys_chan_readline @@ -16,6 +24,7 @@ .public sys_chan_close .public sys_chan_swap .public sys_chan_device + .public sys_chan_register .public sys_bdev_register .public sys_bdev_read .public sys_bdev_write @@ -29,6 +38,8 @@ .public sys_fsys_readdir .public sys_fsys_findfirst .public sys_fsys_findnext + .public sys_fsys_get_label + .public sys_fsys_set_label .public sys_fsys_mkdir .public sys_fsys_delete .public sys_fsys_rename @@ -39,7 +50,12 @@ .public sys_fsys_stat .public sys_mem_get_ramtop .public sys_mem_reserve + .public sys_time_jiffies + .public sys_rtc_set_time + .public sys_rtc_get_time + .public sys_kbd_scancode .public sys_err_message + .public sys_kbd_layout .public sys_proc_run .public sys_txt_get_capabilities .public sys_txt_set_mode @@ -58,58 +74,74 @@ .public sys_txt_put .public sys_txt_print -sys_proc_exit: .equlab 0xFFE000 -sys_chan_read_b: .equlab 0xFFE004 -sys_chan_read: .equlab 0xFFE008 -sys_chan_readline: .equlab 0xFFE00C -sys_chan_write_b: .equlab 0xFFE010 -sys_chan_write: .equlab 0xFFE014 -sys_chan_status: .equlab 0xFFE018 -sys_chan_flush: .equlab 0xFFE01C -sys_chan_seek: .equlab 0xFFE020 -sys_chan_ioctrl: .equlab 0xFFE024 -sys_chan_open: .equlab 0xFFE028 -sys_chan_close: .equlab 0xFFE02C -sys_chan_swap: .equlab 0xFFE030 -sys_chan_device: .equlab 0xFFE034 -sys_bdev_register: .equlab 0xFFE038 -sys_bdev_read: .equlab 0xFFE03C -sys_bdev_write: .equlab 0xFFE040 -sys_bdev_status: .equlab 0xFFE044 -sys_bdev_flush: .equlab 0xFFE048 -sys_bdev_ioctrl: .equlab 0xFFE04C -sys_fsys_open: .equlab 0xFFE050 -sys_fsys_close: .equlab 0xFFE054 -sys_fsys_opendir: .equlab 0xFFE058 -sys_fsys_closedir: .equlab 0xFFE05C -sys_fsys_readdir: .equlab 0xFFE060 -sys_fsys_findfirst: .equlab 0xFFE064 -sys_fsys_findnext: .equlab 0xFFE068 -sys_fsys_mkdir: .equlab 0xFFE06C -sys_fsys_delete: .equlab 0xFFE070 -sys_fsys_rename: .equlab 0xFFE074 -sys_fsys_set_cwd: .equlab 0xFFE078 -sys_fsys_get_cwd: .equlab 0xFFE07C -sys_fsys_load: .equlab 0xFFE080 -sys_fsys_register_loader: .equlab 0xFFE084 -sys_fsys_stat: .equlab 0xFFE088 -sys_mem_get_ramtop: .equlab 0xFFE08C -sys_mem_reserve: .equlab 0xFFE090 -sys_err_message: .equlab 0xFFE094 -sys_proc_run: .equlab 0xFFE098 -sys_txt_get_capabilities: .equlab 0xFFE09C -sys_txt_set_mode: .equlab 0xFFE0A0 -sys_txt_setsizes: .equlab 0xFFE0A4 -sys_txt_set_xy: .equlab 0xFFE0A8 -sys_txt_get_xy: .equlab 0xFFE0AC -sys_txt_get_region: .equlab 0xFFE0B0 -sys_txt_set_region: .equlab 0xFFE0B4 -sys_txt_set_color: .equlab 0xFFE0B8 -sys_txt_get_color: .equlab 0xFFE0BC -sys_txt_set_cursor_visible: .equlab 0xFFE0C0 -sys_txt_set_font: .equlab 0xFFE0C4 -sys_txt_get_sizes: .equlab 0xFFE0C8 -sys_txt_set_border: .equlab 0xFFE0CC -sys_txt_set_border_color: .equlab 0xFFE0D0 -sys_txt_put: .equlab 0xFFE0D4 -sys_txt_print: .equlab 0xFFE0D8 +sys_proc_exit: .equlab 0xFFE000 +sys_int_enable_all: .equlab 0xFFE004 +sys_int_disable_all: .equlab 0xFFE008 +sys_int_disable: .equlab 0xFFE00C +sys_int_enable: .equlab 0xFFE010 +sys_int_register: .equlab 0xFFE014 +sys_int_pending: .equlab 0xFFE018 +sys_get_info: .equlab 0xFFE01C +sys_int_clear: .equlab 0xFFE020 +sys_chan_read_b: .equlab 0xFFE024 +sys_chan_read: .equlab 0xFFE028 +sys_chan_readline: .equlab 0xFFE02C +sys_chan_write_b: .equlab 0xFFE030 +sys_chan_write: .equlab 0xFFE034 +sys_chan_status: .equlab 0xFFE038 +sys_chan_flush: .equlab 0xFFE03C +sys_chan_seek: .equlab 0xFFE040 +sys_chan_ioctrl: .equlab 0xFFE044 +sys_chan_open: .equlab 0xFFE048 +sys_chan_close: .equlab 0xFFE04C +sys_chan_swap: .equlab 0xFFE050 +sys_chan_device: .equlab 0xFFE054 +sys_chan_register: .equlab 0xFFE058 +sys_bdev_register: .equlab 0xFFE05C +sys_bdev_read: .equlab 0xFFE060 +sys_bdev_write: .equlab 0xFFE064 +sys_bdev_status: .equlab 0xFFE068 +sys_bdev_flush: .equlab 0xFFE06C +sys_bdev_ioctrl: .equlab 0xFFE070 +sys_fsys_open: .equlab 0xFFE074 +sys_fsys_close: .equlab 0xFFE078 +sys_fsys_opendir: .equlab 0xFFE07C +sys_fsys_closedir: .equlab 0xFFE080 +sys_fsys_readdir: .equlab 0xFFE084 +sys_fsys_findfirst: .equlab 0xFFE088 +sys_fsys_findnext: .equlab 0xFFE08C +sys_fsys_get_label: .equlab 0xFFE090 +sys_fsys_set_label: .equlab 0xFFE094 +sys_fsys_mkdir: .equlab 0xFFE098 +sys_fsys_delete: .equlab 0xFFE09C +sys_fsys_rename: .equlab 0xFFE0A0 +sys_fsys_set_cwd: .equlab 0xFFE0A4 +sys_fsys_get_cwd: .equlab 0xFFE0A8 +sys_fsys_load: .equlab 0xFFE0AC +sys_fsys_register_loader: .equlab 0xFFE0B0 +sys_fsys_stat: .equlab 0xFFE0B4 +sys_mem_get_ramtop: .equlab 0xFFE0B8 +sys_mem_reserve: .equlab 0xFFE0BC +sys_time_jiffies: .equlab 0xFFE0C0 +sys_rtc_set_time: .equlab 0xFFE0C4 +sys_rtc_get_time: .equlab 0xFFE0C8 +sys_kbd_scancode: .equlab 0xFFE0CC +sys_err_message: .equlab 0xFFE0D0 +sys_kbd_layout: .equlab 0xFFE0D4 +sys_proc_run: .equlab 0xFFE0D8 +sys_txt_get_capabilities: .equlab 0xFFE0DC +sys_txt_set_mode: .equlab 0xFFE0E0 +sys_txt_setsizes: .equlab 0xFFE0E4 +sys_txt_set_xy: .equlab 0xFFE0E8 +sys_txt_get_xy: .equlab 0xFFE0EC +sys_txt_get_region: .equlab 0xFFE0F0 +sys_txt_set_region: .equlab 0xFFE0F4 +sys_txt_set_color: .equlab 0xFFE0F8 +sys_txt_get_color: .equlab 0xFFE0FC +sys_txt_set_cursor_visible: .equlab 0xFFE100 +sys_txt_set_font: .equlab 0xFFE104 +sys_txt_get_sizes: .equlab 0xFFE108 +sys_txt_set_border: .equlab 0xFFE10C +sys_txt_set_border_color: .equlab 0xFFE110 +sys_txt_put: .equlab 0xFFE114 +sys_txt_print: .equlab 0xFFE118 diff --git a/client/src/genbinding.py b/client/src/genbinding.py index 7f94514..59de67d 100644 --- a/client/src/genbinding.py +++ b/client/src/genbinding.py @@ -9,7 +9,7 @@ table_entry_size = 4 table_address = 0xffe000 syscalls = {} -with open("..\src\C256\syscalls.txt", "r") as input: +with open("..\..\src\C256\syscalls.txt", "r") as input: for line in input: # Remove comments index = line.find("#") @@ -35,4 +35,4 @@ with open("bindings.s", "w") as output: for name in syscalls.keys(): address = syscalls[name] - output.write("{0}:\t.equlab\t0x{1:06X}\n".format(name, address)) \ No newline at end of file + output.write("{0:<30} .equlab 0x{1:06X}\n".format(name + ":", address)) \ No newline at end of file diff --git a/client/src/include/toolbox.h b/client/src/include/toolbox.h index e285221..9866b4b 100644 --- a/client/src/include/toolbox.h +++ b/client/src/include/toolbox.h @@ -733,7 +733,7 @@ extern SYSTEMCALL void sys_txt_put(short screen, char c); * Print an ASCII Z string to the screen * * @param screen the number of the text device - * @param c the ASCII Z string to print + * @param message the ASCII Z string to print */ extern SYSTEMCALL void sys_txt_print(short screen, const char * message); diff --git a/src/toolbox-20.bin b/src/toolbox-20.bin deleted file mode 100644 index 631f42bf3e16f2e58562339c99ccef499f315530..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 eX1_l|Kliu diff --git a/src/toolbox-21.bin b/src/toolbox-21.bin deleted file mode 100644 index 7b190573ddfb8372129d6648c49deb9457967294..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 P3tbL9q9aVT(!zfM6x0Kj diff --git a/src/toolbox-23.bin b/src/toolbox-23.bin deleted file mode 100644 index c173390519e76972a89fa25455d513b0f267b801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 D1_bde diff --git a/src/toolbox-27.bin b/src/toolbox-27.bin deleted file mode 100644 index e838e315e2be95e014dcb28042822b8eb010addc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmdT}e{dAneSiCVZ|`&*7MMf9}WF~ILlj1^Y5sk;&37vK{o{244GD4H)Y!k;- z4%E;0?e6IiFlp1jdL!+=AK&+V-}imr-`j7N)T!L4`h2@$oX&Zyq?0m?6;F1x9ohW}cAT*xy`-Y8h_+l}K4bQ}f4b7K zy{;4aIK_sML@R2koJ$ZULoAU7x+Dybv#*;d7{Ml>S~r9V|-1ugIc+p%jk3)!XYI zw{XA)!&$#kZ1}y>@dmT+m}|I-zqr^ntvsacX3jRH&_C^OS0hMYX7*jrHZB|N@-yAs zuzxVqs1=JB&qIm|(^I+e=eoi9;JVKEUw0cvaJl{C&vxT*<0IXM{r7{7@o#n;`SEA) z@XJyQEv{B9iX{-I4%+LvZa=>qz{y54b8OktWz-d3n&OHrKi2U1vST=_xsvxkwjw^9 zBo0>`9BfKVFMgitYMu^RycKf2s-#wB_Oe=%M}Z7OGKLrpv64PYN~%J-bYe25K=UZu zyvXXEG{udQ1r0Mt&8gg36?|GX%b=$c^t1`?ye<|52}mT=worb%1wscxbyN)zLUMsH z4TP!D6cC!HbM;lTt@{gbAfyGsTF`2NR?}05A@ZR3n0Z3>m~;D7&S%3QXI8xl$RPb% zCA(FhHb(k{BS>9y85T>8H^Y@{`#2F8jfZ?q3mq;U-^lFFFOkCi_@3hi%l5M&3+GdA zFrF@@h~1_u(Tm#0Oit}%saQ2(9rvqXIFwS0&6uBK_J%)hKxdy~n0Tvo-Pyqhi9rNeOjS+va+&=VrLzu+`jL`buZxmji<;t+h zwU8-B6(+>wiK>nl3}dniI{+~O<)OKx8)K5Vu}lFQt|ew=`y?W*m6r+d5)A8u^uZ$u zVQJ+XriIyxr9IGyH)$>jp9HIX%)czyL=4#SQe+-Ui2g4u`sq9WBNlz)Yko6Z#O;k`r1ROwCs-q2e*9k;j5FOO z#>=>AHN0u1Fmuu0nkcEh0h<*qhqgsAg~zHAJBDCmDpys|AWtfGuxkD=yMJo}o4XRE zNMRdpnaWx8JDr=#De%AH=qfR~G}c@X8I+y}0zzp&{N;voH>{+vQbS9-!$Qd=YbcfV z%>GmfaytrxB?26cYqi3sFNWqQ_Odq=qeIX~G9YkdFt3q{+YA5RAkl}dt#Qd!z!Ebw zSDE#(>cNlgz666PJuft|Ec65mGP?h>#X{GmQIl-x1D72J;WLP__R&4?m_>9$Q$y;i z+(cbp`MHoqXhdhMUcVd`QO|8$%KN+ZWo|0ed1nQVvqUjh$R5%8n~H|ekd9o~GZ)+K z>(nkoMqDntD!(00;-e*VJo72T)yHqaQ!vr;f6iQZ86TG8bk6?jcw<6hVAjCAXP(hL zYuY?X9ljwJ!G1Ge?zckm!Qo{pGJW$aq$yi$ic0)D;GeokhqulMWr! z98Y(IbQIpa1df3N#ITm|Enl`K*kUC?7rqJMukFc81FJn2tSnnuMXI-X@@D5?a7%ex zTbE-2NMrR6PD*VHZl#p8<|FUS?h9?$$ZwV9%Fm;@_g{w`5@ah z0vR9Ua{ZBcoCEhOlbvv7uGS87*}|Q79$`}bJxtztz*Wo6d+bDJ)AE)uZq4C-^m=#@N_w=@qm3RbfK#NI&Ew*R@rOCOG0d()N`>FRA$^R3xaa~$;poGklYdcPhL>>s>j!`UGhFwY0q-4FG-nL zUmF7ZM8AskE@`<*-qz{1ZBox?{$r%8PwCg^o?>GQ#bQYa$22+E>ik)K=2a%0%x;vo-KMLX*e3aK@P7SY_p-e*IP3IQ7tz|w zoQFZ`$@e@pPkIUT^$?NA=JU`%O~nvRFi#E#&=do*r&^U&f#$KEO4}?860qnYKM01I>!@T?1tau7ULmv1+1? zRel`;EWqnFocwy!7aUfJFd^rspgPr$LIsu&r+~;g5bq9FpE|5Igy=+PBtmGD`i>Bf zh`~RB!j8lf6aY}QAvMHKq=%4}F0p`X!%W;0OptR2*CrMh>sf3_Q3RDru5pRLhAfZB z@4!|{bRG;8-guYTCXyTqC02lKCNLx^LV^)*4~;lRRyIdEo&>$c;tBKOd5G9I-hUH* z=HWMGiYg}G=PR*OTehzq`>ckgr1}e1$4;T0Y$I$ZEHqzje_=vD+=zEDcVTVHq!1XD1O=4@4J>TlI|^M!*=>)d zlD8wgjS5!09sVN>Zot9I*d*e0+@ca7N_R4<1`G_f9~`+t7r<9efb;2ARL&mW2H7Ib zz#6}eJ*aAWpaZ1c`MQ^K6JFX)&cdg|KA}{GLSGt)5gwwpkUE{??Hx7W3KwYzp`COK z$%T!VDU2LufRln%q#BWakhOr6IvLNz!BO#w%1AZvP zg$b2aj&O-o5^@6$2*EjFd1iM1Rf%FG%E72+7*S&j1!R0M7@OQ{YBK%M6VL{bP!{(4Msv`F+GSlf9r|H z@x5WWB*kUwX8Tj9iYU~iqnlh6O{$Lg2ib;%=uwe`o7=?Q!#|?_oFKC!n%tmPd zJ{GOGHV?S7A6B=ZDpmp~Jm}W8-}N&Lg`a!K9o4r~*VCL{T}Q8`6`;zzs0o#;bP$qo z99nCt1iGj_5h1}{vE=~HmzgLm#Y9AE_E!a=W=m_9S`gr+x_%Sq(tMr5!C@gaVKr~b z`v_6*_1h^}MY%$@-}wXh+hAqO$ZwY#h28~w-JV8GxROT}%9|Y~zHEGEp-dqP{vf)L zx$@?N)RJI(iBV{5Nq7SdRRap+wDOpa0V9m2>rfkBbF8=&SA zXuEnt&_L!FE;6?O_1%LI@d#H75T0ptLp%EAj(HUlnaYn|GpsM zyCu~bN1m<8R*%LMX{@+#?(l%fE`nn?!_xwsk`T=qZgt}+m`%u0k_vX$erB4=@ocpX zszzqaUr|lQO(yIM7DTQq4ll8V{k1POcoHJm5>$dtctxTgo)IPr!5iELLbuIuw^Z+G zy5^QpPej4wWJ%2tMTkbc;SC~6m{QtWg6dKk4a+oP4v;lAxfMAv z5wQ+YelvI-O+gba96U*C=d^=gN)p^b2ZJCbd{c=J1`({g&cV}{J4$5`>ckFS1zYt} zT3mo&fV4fz0OA0s=W2X1yTfbLkTkN4S}qi>V$Bdkst^O-f3*zW;tNj{%z*QK23gT4 zMj76z84zwbS_W)a-3RPX`wiXFZKkRgTb5 zTYT;kyV1OmcJV2d<{)j4e&PznQd|jf2A>84sAl1mK;2oS{U{->^lf(ZkM1*Q3WWm4 z`5l@HGM;``4(Ky(IQsD}7`5^Y8!OMqwGqPV+y*H=%lyTItymTp0l#>V&I*E2LIm?5 zksjQ1{bT5%UB3;k*FK1|V)_gQf)w?_&uHN{w2-~RRlT;;VBgMMWiQ;xn8E1x+Rjy1 MMT4nq@qh9AZ^?on9{>OV diff --git a/src/toolbox-28.bin b/src/toolbox-28.bin deleted file mode 100644 index 49a6bfbf49d0b0cfe4d047e55a4eef8ef99faafe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/src/toolbox-29.bin b/src/toolbox-29.bin deleted file mode 100644 index 7db4db207df3b683f3e952af3cb1149e58f90100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 Ux0c(m57pUwM!B6J`ibGc0eJNmAOHXW diff --git a/src/toolbox-2A.bin b/src/toolbox-2A.bin deleted file mode 100644 index e88b7f648f57adbe456c4fc5c18eb27baadaba25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmai34UAORb-wR!=FQBTnO(49Jp7Fx27<8xH)&WFrGzYy0l#3U*c5}2?JUH*rYMeM zM=goWM2`o~I?isY#?YjSM|<;F-nf*N30g-qb;Js{xIY>xs6do0>z|D07sUK|H2;OCr;p`43o~8Cx0dCK^-Q3k zjU`G&r(blpSVj)-)sFXEss9mAdMY=t3#+=2U1ff*x|sbB8(&@}4ql>4EIeKEJ(csV zaDy%Cw6*Yb7B-3_;+#2Zb+K!u;FI&s6XwMd*XqyV1!&==&n}j__TEw$SPCY^4kiVk z4K8OM<0&tP?O9cYO<4B%&oy0bfGdr*({+bDj;xD##D~_X)yQ8fai!XgydLBd*Qp&uEC9l<`{jxX{77a;CXj0?{@Dd%`BjwMOZ&qtPhug zfc;%ZuKf9@I))Wy_w-M@S)K*etDmCvNuDGwr+KpW;|v?`JLwuHi+KAGRJg`tkXt`A zImTAbFxMDzQ$s~JBQ-~ZDH1+6jzj!Bd75WxmAB>aF&z^Q=rkc(b7SPD_oR`ISi+G^n_yw4|Fqz3QC#`92g zx0k?EuP$d3daZgNe(eYTwn^u$KP4w!D~*9Hc5Yw;8a5ENbhI+T3d!-VV83jpg1)H9 zyK6jO80=w%euFe-r`~EFw}z@JJ7JMX0nq-*53`ISS%zo%s+W_NfwR(aVQuu+ zb2H5z)wZ!pm*)J#7SNwCvDpRKqUN05Qq{u#-l#8bBdylB27xKKMzC}f+Utc(w4M)Q zTIns^D8eKoZ!yKDSZk`(j1Uk66N{f4qXx6@f2LWxR(faG;^xItJ?~q%>N!ufpFG!e zegLv^3fHccei2UkOt5P)%(}_QGeqOD{^=0ROA~vB%K=+&kXa|?wU7+BV*mTDkVP@H z2ItQ{F=?YX&@VW`ZL z;oKDMAeuXHoWcH-$|9~n{u^-cj1VAcNhmwimsW)673@xfbG?7F+&aky%%SZLL*UAt zn}V#tN`Y>Ov~!~`^dqO?M&`hfpfVDY>ZRq$gAB8mKHm%sHmQtg&gfRIL~evH#wA$j z>0>%1uzyUS!ha$Tka?UY@;~lkHWKXgE?4UkcDWji^ol?to*Y$aTi zWmt{8uWl1Bw%yxBli)5SwaPeoxkw_Q9wf;S(SS6vK^`0mgKME47bXST_~+(>^>{If z7vu9Vz0ePvA>CcW1bS9r?O2T#e1pcby>2(;Xb8phYs8;s3is39u;3mQxW_Ed*GF2@ zy2EL~%QTHlS!|IjlilMxr4Y$<6moQtE9$*tz)t)L8PXiy-8-o?im`^mc-ZQWi47EQ@y$b0KH%NzfNfdm2Fa?Z*ClsaA9X}37EiV}KN5dju2|eOE*Av*kvvqq*H?PBm zEZ*J3yWk$eOYlbt@XLy$fSLW`fhO)`y7tb%b4f4p&gb!~cTBkQZMw(d0*cs$L9Kmp z2iexhtW~jyfA>W)sgJ}|KylWX6>r{ozKr7>Clv{?(v##$&rq;IS0vawjxbwFbWW_J z;6w(o>dg+XL=Go*H~AsAyM#>1e0cFri=;{jHrOJVmOfZ^0XkGB{~QdE_cT2VDg zw>nWZ=%M?%Ye03$*1UF-u)83gkf(qoNqtg3h{#x*Zqr!nO{&mWKqCM z4Z&(6j6<%*^3r1#sr52rJaefguEskwSGf0e-dm06j1oqV0+)TU^n!`W^sO5H-N!A75!CwzB75 zsoy>&umF)oRpbPEBr znu>_0moq_}U^B!HIc3}oM^Gd8&r_2I&st9r3CpKU4W~xdW?|lZt8Rc+<*8FDc7apsLWH^yp-$;bK}S{crn(Z3G`^rqmTSwl%`~)z6L}l0F6Yvm2>dIn}0b&gx9X;S~)m`3my7bRrvS; zOsM(I+A-XduKDkCqa5^g$tiHb2m=F{Lz`Il2+@Dz3-`gb4i#(8lCVF2dDPE7LhcHl z>UEK!YskA-m9nip08Ko;zkn;IkD!P+sQwJ*$<1^VKo3effota#{@#S(JzSw z9}~lHLkUDm;u8kZ%q}bs8&7B=< z|K^LR6$upgjh*~!2*F1LT3jfPE*d5f{| ze?Hg#@3&FDxb-ngV!uMlc)!f=v1fkP6d43Orr6n+aF!#Y7_e#=e-WK6vhxx;j_iCH zovpItH9o;T0=<8|q*;FFJNP+Et+Uh$zJ>fzxLvRfAwM1P<1gci4GaXonQ>O{;w~A? zWra~zbXjGMxp-)-kq8UX3wGgb6p`PciULkl=>Jx^Jk);z zj#?hKM8`e*p~npnhsO|yGgyM`91i#rIj0ZQam`8YlCOP+!#!a%%TKrOh?t)()Bh1O zexb}S+@|=;e^mC>vX4r@of4jyyug2W{YT?V_=TS96R^bdWqw|)q8xGp7Xl@?Eq~f1 z=(}Gn@N@kWWj@h=0Vy@vXoN1tvwWh^e~ttvY$<~l3T^vUe(nFDf;Jl116U`TNKCtH(|L8l?zS>BT+&%?w!{nOR$5lF(U>EH5r65HtgT z8Vk`=5}q(6O0YFiV=W8o!OUSJYEGWnmE5Z^cK>)%?s7WW_W}Gv) zgewWyWme885wJVFn*ai8(=@kOS8fOj0*geo-g&fshq$bWH+OGTM+=^dbL-s}y9 zn{W%y~dOcCRu8E4Y1ZzNPka@yu?ll<*Db zj~sLe-2g2Ky6Ldb@@}rwKV-kZkKLM)X;-7nMAHliH%Y<;@4m1LtO{P*QX|5Rg0YIo z5al(ue@dyQfd!Q>z+&jS7y=!On8!7Od?q&t@&TITTE#0PuxN$~f((JlO`au8j+r%{ zjA7kU6kcOkhxveYWEfKJ+XwV1kY3>-w& z=@M!XBOj3rr!3GnFIn|@e)>|b-ZiF26+u_!YOSK-2S8I6LFR#>2u!|yoB=80y0Ia| z0@|-&wMKZ?6?+{G><{*{ZllYF)&0MOWv#o5P<4AaDwqQ@3U4*Ga@avh%$Nyh)(3beh z+9DM>I${*dBFGEQEY3FipGFCI zDeBG3WRStCrSgA{c#zWSYL7?}+Fo^4`=VFk^V<$_IYnf*ht6Pa^ifV^2oWK{ny`H5 zpqPm~AmWTftBuX->JuTGRS1+1BIJf^qqISOVifg4K^fr^p|34V=+HxyQ3;%fu*LBw hvxoW%d{d2YEDX+@b&^d84;x#R$M_JNz-pt%{uhPElE?r6 diff --git a/src/toolbox-2B.bin b/src/toolbox-2B.bin deleted file mode 100644 index 85944de9a1c22602d82b783f2b24074999ffe1d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmb_heT*B$6`$Spde`5+JLk@^lbo~1U2-9Ox8XPh4WNJ_QDiLVp~8D@d_x!8&)9^VV+Z^N-MBJRxA9DA@*tphvE;rTyZk$L>0`(Bj|%e`zF*bIOvRZVg3*t{)X(21x{ zMAaNabriKJ9YjAGWHX9%kcS2t!*~u#7*CZ|y!!@cBBr`;HGZ>HcU{2jJl`$2QsNT1 zFnQ~aUBNalJ{~4N_LCn=1(pjI3i|Fz2sE4+{d35P2`#8-yHw%$yIzWSJZll}nvU@vp4U3!sk46R_tEWHx-=j)Z$)FpdMS!Mc?f{LaSF-Aw*@EUnnBb&%@lDnTo)+dL#860_e3b049P;El z>FZK_37C!JbwpOFyBP<>@ATGMAtc37^r+m{&RcK>2%Rfe+90oOKTkf484YU&>BWr4 zKBZ|L=3cneu&pE1h0h9gTO<-vqi#!dJH9Zol|(yV`)2bVWE8rDu@!(=~iShYe5WgsE`fhjtzWkOXcw+Ii-(tXD$^yh_^MEsf zwX;3AzDz27+*`L-XZXi0*J^;>Mqdltf`xpRK@F8!S9uLoU%^kO?lcjU>+=il}RXY5=s|am6Y*OBwS;fa^iKR!aFu;+lZ zWFF@d>`;Ppq+Vhxt4Abb<*zk|6vVB zgX4^mTB;SXwd>%?_(){vWFHt|P&(oxNvbG3DNNS|p>5Lzj&@bLN%@cvDa0cHbXZcx z_Ymo)qKi<_P6lbTyVmIvG`nDamG{6(KcxVA4Q5pNxf`{d zT>cqKL{nI=dswx%wNZr8r71Sy&*{cr?y6;`HcqF?_jiNKbYtd-{XOJ5YxA>0Rqbpin;5KwO*Al68f?*+nl1OiGRpza{BXrlaWK<^Py zlz^gcL#N@L&pO5_ubab2>P9SqSeVN!CsV9-B$b#>?WV*Dw!5PIEfBsFgqL7Fo(roC zAou~TA+AvPCiGh+1VRY})Efvw;jaPV27!PQ2&gv@gu>SX;W~kU5(ua}2&C}UfL&?h6;rpMavJ&q43m3+bgaDg|7+rR{-G^mjQl-fTIK)^)~p$fL|iuC;>

yJ~uMJx9X;#MVT23epg5Mreyf${Q+#U z07n|&6f;(RuST1ay;flwaU>B_3;{&yNa~Q1Q66cfXFPRSYIx1VXhWya3CHsesgb4BqopZ z&@m<*3KRpjJQDUxzw^nJqtcViPEpDV*T)?j64udazI*eDSco9|%{>&GUrgp7F!6_=q$ zf5Xy@zKrKHI62@FM&lQo+rZe#heiafau1@`g)TR;B)cSqY!g7CX|qjEIF?jWY~xIhnO*5sZA0x zn(1-5A{ZtQpyW!)$lyegm-gbaP)IV8Q^;^d!ial5!W z+SwlktB8x5M=P^Zdtz>9cK31|Fp1=T?&Oqf#%uqnQL-gsf23qCM{-!o5)p7h86RRY zRYa}Oh8ncWkI1U7Yl$xru|ezSx4I!YGRC$u2Uw~yCgw$ZQtQkP@NV;)SxEN$MOq|$ z)6vU4w15t95juWsQHBP_6_LCj-rkdF<@6y0rKyX+_gv0VprB5_|w!EQJ;ZG`+~t zbbLF&od7qQGxN8Duinb{Hhxiw8#qU>4^aIBOdOz|NWY@*Vz2mj$t2GL=j_ip6U8B- z6`lkamwXspqgK@1h@ASS0cB|=#xF{f99bZRAw$%PnR)}g6X-EOV%Q8ibL<}s!9gd2 zgV-z^@MzA-%K%xQ>cw(*rDtfXM2gLWC_5IG7Q8tagSm{Hb!yCJ_y3wa%8NZNO433?mavk%BhC9<6mW~N zB+(kDsVitv_7zDWi&N9Q$3-NRCaoSMzC8(RJ`bgNuZsd&QP?T~Hxe;g`I+lAP6K!S`LBZLPnYv(?*9!Q4y)`rA>>wbXdWtj1fY@ei&Yvf1Xob_qc~ zp9|7Oko((N@(_j~lz{4imT|~t3AJGwT9T^w097K?_8}|px?W3{pF&aG(uKn!1hRDX zlXQawW5rImh}&X&4F(qtL6(FU1k5`wKv>ZHeymAzej81S^hHZ6O&n$tP1n0{lF_17 zn@)Tl9BW>JTx^zi{lv8p7+~zpbN20&eXb8T-e*N7tqz1*I*#`J*jxhGTtaYe9-(`w zj#J`ZYQ;_-vG1iiu=k03sTDh?aPsfmLcR3^eA;(Vx6&t0d8^(@c+urMc}EF-&%1I` zCYxb`bLFHsS5BIJ*F)9@SG> zP^>yKc_3XMD{DOMt8K{CsEK z_yo^JJcsd6oAaDLecHHvXMIo5cmk!Dn&V?bV*>pxpdK8rk5M6LfFp4g4*@}Q%y`Bj zN(_kTyF2TLv=?IM)}9`(uO-g!;*D=Ky%Re(w!HgXG?;$1=iCe3=Zs_H^{g#2kt5R7 KTQ<)ukNp<{2o0P7 diff --git a/src/toolbox-2C.bin b/src/toolbox-2C.bin deleted file mode 100644 index b931c34cce49325ec2c537d35059bf61e7f30b21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/src/toolbox-2D.bin b/src/toolbox-2D.bin deleted file mode 100644 index 74e8ab454f363f9bf6a673287f6b206d70c1e1a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/src/toolbox-2E.bin b/src/toolbox-2E.bin deleted file mode 100644 index 0871d09afd58d119eadead2643f3af1169556c80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/src/toolbox-2F.bin b/src/toolbox-2F.bin deleted file mode 100644 index 86e0c7c50c8eebf1734f2cdefa21df5c9587cf62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/src/toolbox-31.bin b/src/toolbox-31.bin deleted file mode 100644 index 5916b543e5bf4674bb1ab94c245bfca1dcb69823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 W#m|chyr{s73cRSmiwgYBEAR(Aqyhr~ diff --git a/src/toolbox-3F.bin b/src/toolbox-3F.bin deleted file mode 100644 index 575f35bb2e559de6608ca7108022d29a3e6e9d7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeIuPbh>z7zXgKwJj|+Irx7N2W2mgqPz`QMW?e zs=RCwYcV4CoXAmoGgm~QkJvaO+!10`WpbSGj;V9g#B7#@;}B7HN7#CZoom8gXyM|9 z*c~E@hKW)?@f09JO+>BF!a=5mVvhx{`paVrkYKmYKmYKmxNS|(saY68yR17hi=$)!=@XW{@PLV>-)lO{LOuNZ}H0cdn^3oGl==A{k7_o Ls^c@?HK$e|J8a#9 diff --git a/src/toolbox.bin b/src/toolbox.bin deleted file mode 100644 index e094680..0000000 --- a/src/toolbox.bin +++ /dev/null @@ -1,2182 +0,0 @@ - -9;<=>?@AB /,123456ABCD - -> OK.*111213141517181920212324303132OVsd0sd1 RAMROM%d:/fd38668K86088K960ARMELFM32PGXPGZPPCRCESPU 0ODDSD0SD1INFNaN %s -None%02XGenXEVID/sd0FILEFR20MIPSNONEPGXRH32S370S390V800COM1COM2EVENMARK %s/ -%02X %04X /sd0/%s%s -%04X:%d:%sIAMCUPPC64SPARCSPACE %4ld Done. -%s%08XC256 UF256 PGenX32M68020M68030M68040(null)dev = PARISCVPP500SCREEN+,;=[]%s%s%s -%s: %s -%024lX:A2560 KA2560 MA2560 XC256 U+F256 JRF256 K2F256 KeM68040VUNKNOWNi486DX4*float*CONSOLE%s: #%d -no mediaA2560 U+C256 FMXF256 JReF256 K2cF256 K2eM680EC30M68EC020M68EC040ReservedWDC65816rtc_init*:<>|"?FAT32 Sector: -not foundCartridgeNKӿӣӇk~hvhnhfh^h<<|\"?;$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: %dR  - 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. -chan_status error: %dCould not load file: Could not open file: uart_open: Bad parity -Trying to create: %s -Indicators initializedInterrupts initializedToolbox v%d.%02d.%04d -file is not executableCouldn't load file: %dchan_write_b error: %dFPGA %04X %04X.%04X -volume has no work area #+v-g0XJXopux9Setting 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: - -Default boot source: %s -Error while printing: %dCouldn't get channel: %dfsys_open out of handlesCould not find screen %duart_open: Bad stop bits -Creating /sd0/hello.txt -%04d-%02d-%02d %02d:%02d could not write to devicedevice is write protectedCouldn't execute file: %dfsys_open out of channelsBlock device system ready.Could not create file: %d -could not read from deviceBooting: /sd0/fnxboot.pgx -Booting: /sd0/fnxboot.pgz -Booting: /sd1/fnxboot.pgx -Booting: /sd1/fnxboot.pgz -Returning a bad extension.uart_open: no parity tokenCould not open directory %dv"e~ԏٍ΍*6:[\tChannel 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 %dyyyyzyeyOy9y#yA 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 K4>424&444 4@33444444 |4@p4d4W515%55 55 4@44 PC: %08X Address: %08X -Press SPACE for default. - _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / / / __/ //___ \/ __ \ / / / / / /___ / __/____/ / /_/ / / /_/ / \____//____/_____/\____/ \____/ PC: %08X       _________ ___________ __ __ / ____/__ \ / ____/ ___/ / / / / __ / / __/ //___ \/ __ \ / / / /_/ /_/ /___ / __/____/ / /_/ / / /_/ /_ __/\____//____/_____/\____/ \____/ /_/ Unable to mount drive %s, FatFS Error: %d ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / //_/ / /| | __/ //___ \/ __ \/ / / / / ,< / ___ |/ __/____/ / /_/ / /_/ / / /| | /_/ |_/____/_____/\____/\____/ /_/ |_| f9f;f<f= f>f?f@e;e=e?e ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / / /| | __/ //___ \/ __ \/ / / / / / / / / ___ |/ __/____/ / /_/ / /_/ / / /_/ / /_/ |_/____/_____/\____/\____/ \____/ Address Error Bus Error Division by Zero Error Illegal Instruction Error Oh dear, something has gone wrong... Overflow Exception Privilege Exception Range Check Exception Spurious Interrupt Unknown Exception Ŀ - Foenix Toolbox v%d.%02d.%04d starting up... ___ ___ ___________ ____ __ __ / | |__ \ / ____/ ___// __ \ / / / / __ / /| | __/ //___ \/ __ \/ / / / / / / /_/ /_ / ___ |/ __/____/ / /_/ / /_/ / / /_/ /_ __//_/ |_/____/_____/\____/\____/ \____/ /_/ -TEUX"bcdefosux _________ ___________ ________ ____ __ / ____/__ \ / ____/ ___/ / ____/ |/ / |/ / / / __/ //___ \/ __ \ / /_ / /|_/ /| / / /___ / __/____/ / /_/ / / __/ / / / // | \____//____/_____/\____/ /_/ /_/ /_//_/|_| -fsys_rename("/sd0/hello.txt", "/sd0/renamed.txt") kYG5#چdž -[!] Incompatible CPU arch: expected %s, but found %s - !#{*i-W<D>1@[ ]{|} 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 ,\U` NG%<K1&@OcAvBCDhGJbKcPgHɖmveiA;=?hj,* .!-" 0#/ -$ 2%1 &:4'3 (c6\5k9[aEAAEEEIIIOOUUYAIOU~r% -KKKKKx*KKKKKKKKKKKK/  }c,Z 0@QYR[T]V_`pN!2!p!!!$0,/`,g,u,,d-&A (((( AAAAAABBBBBB #%%%%$%a%b%V%U%c%Q%W%]%\%[%%%4%,%%%<%^%_%Z%T%i%f%`%P%l%g%h%d%e%Y%X%R%S%k%j%% %%%%%%")"a"e"d" #!#H""" %ax029J.yMC= (": e,;;=f,?@AAF -S@UXZ\]^_abdefgjb,lmnpqstvwxyz{|d,~DE{ -0 P`"6Da&`l@N# -bz@c`[WOؓhG'${jJ۝uW~:g5^-Q'E1ڨˆyk\Q?I9?05(~#swVlN^EP;6*ԁO)шwWހM&Լd`ˀM&{ky\i@MrrAB++$% -~ -oS ծe̜JËB|8h/Ui3uW93+$wvX;5-%O(oM&|lQeCp"WQJC 6cnHUyALm7@].4N#'>uuuaaaBBB!!!žx}`znTdZEOG782&1234567890-= qwertyuiop[] asdfghjkl;'`\zxcvbnm,./* -5+/ !@#$%^&*()_+ QWERTYUIOP{} -ASDFGHJKL:"~|ZXCVBNM<>? -5+/ 123457890=   - - ;"`\ ,. -5+/ !@#$%^&*()_+   - - ;"`\ ,. -5+/ 1234567890-= QWERTYUIOP[] ASDFGHJKL;'`\ZXCVBNM,./ 789-456+1230./ !@#$%^&*()_+ qwertyuiop{} -asdfghjkl:"zxcvbnm<>? 789-456+1230./ 12356~`|\-= qwertyuiop[] asdfghjkl;'zxcvbnm,./* -5+/ ;Kc{;Kc{;Kc{;Kc{;Kc{dIdIdIdIdIdIdIdIddIdIdIdIdIdIdIdIddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd~~~~l|88||888T|8|8|<<$BB$۽?0($$( <$<$$T((T 08<80  < 8||8HHHHHH>JJ: - - - $$8~~8||88TT8 @@ @@|$BB$8||8(((((|(|((P(8DDD8(8DDD8 8DDD8(HHH4 HHH4(DDL48(8DDDD8(DDDD88TPT8$ x "|DD(||8D@D8$ p 8DDD8HHHHp4X|(D(|8DD|DD88DDD((l< DDD8ll$JR"\@<@8@<8DDDDDD|||||  8 8 `| T T(P 8$$$8 <<<<< -  !kkk::kkkkkkkkkkkkkkk>k`>k"WUk"gkAkkkk k8k -.Bk -Ak"Onk"Onk? )k"\k)"}k)"k kkkc8k k -k k%'kikb>d>kH"hk -kk)!8kH"hkH"whkik - kki-k -H :Hkwwk:k)k)k i -k -"]k -"]k -kH"lhk,.kkk  k"YU"^)k"("@["" -wk:00k'' ɀ k:k 8k8[dH )"Ukk )"Ukk ) "Ukk )"Ukk )"Ukk )"Ukk )"Ukk )"Ukk )"Ukk )"Ukk )D"Ukk )"Ukk  8 k [𫫯d>b>+kM"Elk [𫫘`>"2X+k [ h )X+k [ h )x+k)kkZ"Y: czkZ"X:czk)8kZ$"*a7ezkZ"Zj:zk8PI"`Ukk"[k"Za"W#"Xk  " " )kZ)))zkwk    k"l"}WT'"&kHHHH"zhhhhk  IiIKiKk -7k"[k)k)k) - - - - #e  kZ   ;",zk"x0HzzkkZZ  "YUH"]hzzk:   / k -   "akHHFf ee&hk0246k/ JJJJ /  kz"Y:z"6kZ8PIzk"mk - - -H -H"Vhh`>"2Xz -zk [𫫘"g+k)  -  k"W   k"W  J kZ) :8zk"W  k   "Zd"Zk(*kZ  HH )H )"hhhh"@`zk88(PI - -LHLky= y= - -{=}=y=y=kk "El"Elk:     )  k"U" hk>>",k:% -    kZ   yy I /yy zk# k -  -"? - - - - "? z z -zk","z  )   k"W  J:kkdHHJee&hzk)8PI&"*a?ekZ  )  zk!ɀ8 -ek [𫫘8b>b>d>d>d>b>+kZZ JJJJ JzzkZZ;"X  zzkZ   -)HHHHH )"+;i -"@`zkZ   -)HHHHH )";i -"@`zk - -8PI"oz -zk - -8PI"z -zk - -8PI"z -zkHZ H $  - -()h  zhhhk - -"r|z -zk   ):kH -&H) -H)*EJ&h)jh)jhkZ"W"    zk=""[8^>kkZ  A )8 -"Z J ) "Zzk"Z*"Z#"Z,"Z"Z"ZE"Z"dkZ  8     գI)8zk -   -  ) zz z -zk4"h"ʿ" ) H"h"V:1"hk"Ġ !  kH)ɀ))ɀ)zh @zzkhk -"Bs"NPHP -Nh"Vz -zk -BBBB -"Vz -zk4"h"]:HT"hh"V:1"hk - -8PId " -z -zkZ  ) - - -/ e) - - -e"#pzkZZc, -" -"*a8 - - - - zzk -ZZ -; -" zzz -zk -Z"W - -!"qH"Zdh  zz -zk:0 -#H`a&Tk - -;iHH ->="|hhz -zk - -) -H"]h H"]hz -zkH"]hZ  )Ȉ -I  )/) -Izk -Z -d"Z'  ; -"zzz -zkH - )+' - ) - - h((kZ  i  " H"hzzk -  - )"X: zz z -zk -i -)" )  z -zk -  - H -"El zz z -zk - [𫫘ZZ -)  H"hzz+z -zkZ8PI0zk - - -/ e"El"QgZ" X18 PI"e  zzk [𫫘ZZ"U"U ` )%zz+k -) -H"]h -ک H"]h -H"]hz -zk -ZZZ -: -  ڦzzzz -zk - [𫫘"Bs":< H< -:h"V+z -zkOr|Uȗȗȗȗ:ȗ  k - [𫫘 - -"   -"JQ:"X+z -zk;8J  ;"j;"?;";iJk"VU"/"rnj<"K"W\y [𫫘Z & )4"*aw$e"g & z+kZ  CC UU CC U* CC UU zk - [𫫘"Bs -  - -"V+z -zk - [𫫘"Bs# -"V+z -zk - [𫫘"Bs& H -h"V+z -zk - [𫫘"Bs&>@ H@ ->h"V+z -zk - [𫫘"Bs&BD  D -B"V+z -zk - Z -:d  - ئzzz z -zkZ8PI08$"*a7!7$"*aezk - [𫫘"Bs$ H -h"V+z -zkZZ"W4   ))   7 zzk -  "`$% - - - - - % zz z -zk/):#):k -   - )"ZH)"Zh8 ) Պzz z -zk -Z )"W  w"W  zz -zkW>,>>>>%>A>==(>=>>>>~Z>\>k [𫫘Z"8" -"r|"Xz+kZ8PI9V"*aMeH",hzk -  "Bs&JL HL -Jh"Vzz z -zkZ     J  jj) ec  :  ȈǣzkZZ   JJJJ ))#) 8PI0 8PI0 -"*aczzk7 Z |UȗȗȗȗkZZ:2    zzzk - [𫫘"Bs* HHH -h"Vhh+z -zk - [𫫘"Bs*68H H8 -6h"Vh+z -zkZZ8PI0zzk8PI0Ӣ"_qZ  CC  CC    :zkZZ  "Za7  ;iH;i"êhh -"Xzzk - [𫫘"Bs( H -h"V+z -zk - [𫫘"Bs(&(  ( -&"V+z -zk - [𫫘"Bs(*,  , -*"V+z -zkZ    A) - - -?/   # -  ) - - - /  "Qgzk -Z"Bs  -"VHd ",hzz -zk - ["q4"On"On"gi -"g -PI0+z -zkH) H -)87IJj(hk( -*(zzk - [𫫘 - -" -"Ahh"X+z -zk - [𫫘"Bs*24 H H4 -2h"Vh+z -zk -ZZZ>\>\> -Z>"Vy=:"Uzzz -zk - -}= -{="V:Ӌ [𫫘ZZZ"U"U'  l    l zzz+k [𫫘ZZZ"U"U'  `    ` zzz+kZZJJJJJ)?HJJJ))H#H JJJJJ)H J))iH "h;i -zzkZ"ZaC  )zk:,:#02460246kZZZ  ,o0.o2 "*ac @ ` .,"ήzzzk -;8 -;"tHH -;i"][hh;iz -zk;8T>8PI0:HHH;i "6~hhh;i",;iTkZd;  )H)h8   :zzk;8 -#JJJJ  #   ;i"7;i -k -;8 -;"lHH -;i"][hh;iz -zk -ZZ8PI6""*a;e - -"Vzzz -zk -;8 -;"l;iH -;i"][hh;iz -zk -"d > -> -E>"}Z,>"}Z>"}Zz -zk"`U -;8  i "a  i "a;i k;8T>8PI0>HHHH`;i "6~ hhhh;i",;iTk - ZZ - -  "  w ^>zzzz z -zkZ8PI0zk""*a;;""*ae [𫫘ZZZ"U"U.' l I%   l zzz+k - [𫫘Z - -" -"]"r|"Xz+z -zk - [𫫘Z - -" -"c5m "r|"Xz+z -zk - Z  -  "W -  ::zzz z -zk - - ?  2)(d"hhz -zk -Z -Hn"Zh -"2ZH -HH"hhhک ",hzz -zk - Z - - -"2Z e  - ) zzz z -zk  -  [𫫘"Bs .. 0 "0 -. "V+zz z -zk -  [𫫘"Bs .R T "T -R "V+zz z -zk -ZZ -"YU"`: "YU"Y^:zzz -zk -ZZZ - -"W#/;i -" zzzz -zk -;8J -;"j)  ;"?;";iJz -zkZ    N#) - - -/ e  !) - - -/ e ' "Qgzk - - -"Y:<w - -eɀz -zkZ    P') "*ae  %) "*ae ' zkZRM$&H)h8PI0 "'e zzk;8T>8PI0FZHZHHHHH;i"6~ ;i ;i",;iTk -ZZ - -"[:<w - -eɀzzz -zk -  [𫫘"Bs 0" $ $H$ -" h"V+zz z -zk - ZZ    -   "W: -:оzzzz z -zk -Z -0B;H -i"êhhzz -zk - [𫫘ZZ8PI2""*a;e -"Vzz+z -zkZi  8PI0  zzke  Z    NH/ ) - - -ehH/ ) - - -eh"Qgzzk -ZZ -%;i -"z zzz -zkd"V:Z&"z   )  6HH"3hh    "azkZV            I%  zk -Z -"Z  ; -"z -": -"Qizz -zkZ    PH) "*aehH) "*aeh -zzk - [𫫘ZZ8PI6""*a;e -"Vzz+z -zk -8ʆ8ʆ - -$2 -0 -d"\eHe -hz -zk [ Y )d Z )Ȉ -& [ )+k -ZZ8PIG6"*a:e% -"Vzzz -zkZ   0 P9  E a 0f  % A F  )i)i )80zk -ZZ -"ZaC;iH -"êhh Y "r|"Xzzz -zk;8 - "r|"r|`>HH  "h]hh;i -k - Z "Za - -< - " "2Z)"Xzzz z -zk P X Y Z [ ] ^ _ X \ X k -ZZ -{", -"Za/;H;i"Ehh) -"Xzzz -zk - [𫫘Z"KZ -)&"*a?e" -"c o$ z+z -zk - Z  -0 2  " - "zzz z -zk -ZZZ -8PI - ;iH"ohhH:H"ohhzzzz -zk - ZZZ  -8PI0zzzzz z -zk "YU -cH"]h8PI0/8PI0    .      "k - [𫫘 -HH$"Zhh8PI+ -6"*a:e6"#p+z -zk -ZZ"`N8,"% - - - - - ) ) JJJJ zzz -zk -ZZ\ - -C7 -"d0 -zzz -zk -ZZZ -8PI - ;iH"ohh8HH"ohhzzzz -zk -ZZZ -8PI - ;iH"ohhcHH"ohhzzzz -zk -ZZZ -8PI - ;iH"ohh8HH"ohhzzzz -zk -ZZZ -8PI - ;iH"ohhcHH"ohhzzzz -zk - ;8R >8PI0B;i^H ;i"}hh;i> ->"V;iRzz z -zk -ZZZZ - - -"2Ze) -     zzzzz -zk - ZZ  "0< "[0* "U%zzzz z -zkZZ8PI*8PI Ȉ :H:H"ohhzzk -Z -8 -PI0@ "*a  4 - "*ae":e: zz -zk - [𫫘ZZZZ;i;":;$ -"Vzzzz+z -zk - ZZZ - 8PI c   zzzzz z -zk -"i - Z - _"r|H H"hhh8PI  e ӊzzz z -zkZ  ) - -  ) - -   ) - -e) - -e  zzk - [𫫘ZZ8PII""*a;e%HH -h"Vhzz+z -zk - ;8R >8PI0B;i^H ;i"}hh;i> ->"V;iRzz z -zk -ZZZ -   -;"&8PI2 -'7) -"[zzzz -zk - ZZ  -", "Za*;iH -"Ehh -"Xzzzz z -zk"_*"hi"#mhh"__"hi""_ "h""_"5"5kZi:] -KH`"^WM"^WD? ' 0 @ ! '   zk - Z!ɀJ=ɵ6% - - e 8 ֊i)zz z -zk - [𫫘ZZ8PIN""*a;e*HH -h"Vhzz+z -zk - [𫫘ZZ8PIN""*a;e*HH -h"Vhzz+z -zk -  -   -L       "#pȷ   "El i - zz z -zk - Z  - - "@ -:)0 -i2 0 "-hzzz z -zk -ZZ - -HH5"hhh -"h0/"H"h"F):ܣ"H "hhzzz -zk;88PI0! ;i"7;ik%ک8;ie  FfFfFfFfZ  )az8 ʆɀ8)zk;8 -cJ iH - -he -  ;i -k:  ;8 -JJJJ))  ))  JJJJ)  )  ;i"7;i -k - ZZ - 8PI0 -"zzzz z -zk8PIH ch  [𫫘;8RZ;i"6~h ;i"hh""r|"X;iR+kZZZZ  86PI0zzzzko2 "*a84PI0 0ce @  `  -Z -"Zaf -""XW% -eHeh""X+ eHe -h""Xzz -zk - ZZZZ  -8PI0zzzzzz z -zk "YU"^H -c h  -ZZZ -+   zzzz -zk -cH"h - Z - - i  )     "    @' ) -"i)zzz z -zkZZZi0  :  ;8"*a&e"Ha",h)H;iH",hhh"Xzzzk -  [𫫘ZZZZ;i;":G0H   - h"Vzzzz+zz z -zk -ZZZZ - -i"Z  7i -"ZHhzzzzz -zk - Z  - "7O -)  - $ - zzz z -zk - [𫫘ZZZZ -CC"qQ -G -="On -  "gi -"g -PI0zzzz+z -zk;8 8 PIx;i H"o;iH"w c c 8;i H"mw d8"s;iH!"mw;i;ik - Z  -H "2Zh+ "2Ze  zzz z -zk c)"ZH -ch  [𫫘;8T"L hhhh]H]HHl;i "6~hhh;i"nY"r|"X;iT+k -;8: -;i;i":O;i"/+1  - -;i"ѯ;i:z -zk -;8T ->8PI/"_H -HH;i "6~ hhhh&ڥ -HHk;i "6~hhh;iH"hh;iTz -zk [𫫘ZZZ;H"C[hhhhF&HH"hh1H ",hH ",hzzz+k - [𫫘;8 -;i;" >&("( -&"V H -",h ;i -+z -zk - [𫫘;8 -;i;" >*,", -*"V H9",h ;i -+z -zk - -  -ȈFj -  -ȈFj -  -ȈFj -  z -zk - Z - 4  6 -g "O - i8 "bh -4 -6 zzz z -zkZZZ -84PI0086PI086"h6:,.o0o2zzzk [𫫯CLC"!v:#"!v:4"!v: CV"UCC ɿ 4CC    C"UC+k - [𫫘;8 -H"Zh;i;i":B "  -"V"c;i -+z -zk - [𫫘;8 -;i;" B"$&H $ -"h"V H ",h ;i -+z -zk - ZZZZ  -8PIV "YU"^   - 5 + -c  zzzzzz z -zk -)Ȉ -&)d - -Ȉ -&)d - -Ȉ -&)dz -zk - ^>LU~ f8ʆ -8ʊ -"Nz -zk - Z - - i e )8PIF cH"h c   zzz z -zk;8 8PI0L;iH"ohh;iH"whh8PI -cc8  ;iH"mwhhd "s;iH"mwhh;ik8HHH -**** * * * 8Hh hhhzzz****Jh;i(khhhhhzzzz(k - ZZ -."  v 8PI0\    +)"ZH -ch c  zzzz z -zk - Z  -  W  N  )<   !  "VJ    zzz z -zk - ZZZ - %;i -"z S 4  -"z;i -"zzzzzz z -zkd"V:L - ZZ - )"W::   "W:S))e:"a  zzzz z -zkZ?8PI@8PI0PG"*8 A"*:P8PI0"PG"4c A"4zk -  [𫫘;8 -;i;" K.0/H  0 -. h"V H1 ",h ;i -+zz z -zk -  [𫫘;8 -;i;" N243HH  4 -2 h"Vh H1 ",h ;i -+zz z -zk -"Uix -d" ""dd"_q"_q"_q"U -PI0d"_q"_q"_qz -zkZ"Z8PI0T8PI0zk$"*a77$"*ae6"*a::6"*aeLA;864 K aW(!B\#%+-/1')35;":9;";i6k - ZZZ -##"DV"OWʆ""OWʆ" 8PI00c -7cWc  -    -"DVЁzzz\;8 cD           ;ik  - ZZ   -  -":L  ; -" [  -"; -"z; -"z#  zzzz z -zk/)$(*"Lɿ+&(*"c@+&(*"3@+&(*"k;8 -      ;i -k"i) -_vH) -hT#:.#:  )".JJ   L -;8T - -HHR "hhh - -"h8PInH"h;i"6~;i"2ZH;i H "ک -"h ;i -"ӏHM"hh;iTz -zk -;8 cJ - -cic - -   Ȁ ;iz -zk:L;8"         e AUY=!;":"  ;";i"kZsBBBB8 PI0_ h i j l m n ` a b zzk - -eL^ - Z - V - 0 E X - x $ȷ )":  E% 0 6 X - x ! 8PI08PI0 zzz z -zk -Z8PI0Lţ$"*a7e -r -8PI/ -6"*a:eE -"r|$ -"r|zz -zk - Z  -"b - - -c i -c - - -c i -  c   +' ȷ ϥ -ȗȗȗȗ ȗ -ȗzzz z -zk;8  - ;"X Lcǣ - - - - - 4  -   -  - - -   ;i -;i";ik           y "_8 PI0Pz"}Wʿ"3hh @     "ak -Z A"SPG""PG"4c A"4?"Sń'7""PG"*8 A"*:zk - Zi - -)) -eHeh)) 8g -ȗ -i8 8ʠȗ -Hȷ -h"z\ -  [𫫘;8 - -H -HHHN -",hhhh;i;i"J  . -H  - h"VH9 -",h;i -+zz z -zk -ZZ -)L64 -i8"bhL  84(H6*h "H  ;4 wH6"wh -i8"bhzzz -zk;8;"l8 -) - - - - -ʪʠ Ȉ -& ʠȈ -& ʆFj;ik - Z   -     L͠  L  w   -) e    @ Z   a "z   -"C  H"hzz z -zk [𫫘8PI0LΘ""*a;e - -  +kZ H Lϯ(ʆ$ʆ". *ʆ&ʆ"."  s  i) -ʆ$ʆ".) -ʆ&ʆ". 8"8 "zk - ZZZ - ; -" LWХ  -"Lt -"8c A  -"ѯ -"=V zzzzz z -zkIIڅd*8&zzkHCh"mH"mIk$8$8 - -ddd d & -&&8& & zz -z zkEH"z8kk;8  L5үH h 8PI0j ) - -     '  ) - -e  %  ) - -e  4e  e  L;izk -;8 -   - -  - "?L"Ӡ -ic  8<PI0S;iH -i "êhh  ;i -z -zkZZZZX - - - - - c  :Lӣ -H`HH> "hhnHH: "hhRHH* "hh6HH6 "hhHH2 "hhH "wh)"%"Մzzzzk;8V', U q΃#[!#%_79e\;=\')l{+-\/1[35ή?AmWCE{GIhKM颃OQ^SU;";iVk;8 -;H"mwd"Q"3HHH";i dd"*d""! 8PI0""o"ohh;i -kHH "hhdd "%d "Մ  ZZH"Zh0V8PII$"*a77$"*ae$"*a7ew8PI0Y$"*a7J$"*a77$"*ae$"*a7ezzk - ZZZ  -   , .7  . , "L t -  ",I      "=Vzzzzz z -zk;8 / ;i"g;i"gH;i"2Zh?;i"|:"Lhhhh;ik;ic   A +Z  )"ZH;ich LM - ;8 -  - -":L٥ - " 46 -i8"El -i8 -6H c "bh c  - ;i -zz z -zk - ZZZ  -  "LLک -  ",j    ) " "=VL>ڣ zzzzz z -zkZZZ: -8PI0.80PI0/")VPI0 -80L۩$8PILۊ80PI09",VPI080^8aPI0V")VPI0i28API06")VPI0izzzk -  [𫫘;8 - -H -HHH "Zhhhh;i;i"q HH=",hh . -H   - h"VH2 ",h;i -+zz z -zk -;8   - 8PIL -ޣ"*a 8PI0L -ޣ8 :8PI0m - "78 PI02 c - -jChC "7 -H "h  H "h H "h:Lw;i z -zk -  [𫫘ZZZU"Z"r|8PI0Lߣ6"*a:eLߣ" - n ` - E H  - -h"c"V  zzz+zz z -zk [𫫘Z8PI0 -z+zke  ie  ie  ie  ie  ie  ie  L=;8@;i ;i":LB ;i "/_7  ;/+)  "ͦH h 7  - -  :  ;i@k - ;8 -  -  "*W"El ) - "3;i -zz z -zk: - - -c - - -c i -cH""Wchȗ - - -c : - - -c i -cH""Wchȗ LZZ -"hZ"'8PI0Le:",@"hhLL @ LL @ LL㯜@e@@"z@H@H"hhh@@H"hhh@"hhh@"hhL"n",H%",hzzk - ZZZZ)* -  ϧ) L)*  ϧ) -!   -zzzzzz z -zk - ;8$8PI0L8PI0L$"*a7e -$"*a7e    -i;i "#p i -i "#p;i i "#p;i$zz z -zk - [𫫘;8;i# - & L;i4"*aw$e" "XL   8PIL;ic -i c   -i c);i+z -zk - [𫫘;8;i# - & L;i4"*aw$e" "XL   8PIL;ic -i c   -i c);i+z -zk - ZZZZ    L) - -)oHoh8PIL/ ) - - -e  ) - - -?/   # - - - - -  # - - -  ) - - - /  "Qg4e - e   LNzzzzz z -zk - [𫫘;8 - -"8PI & LI & L8)B;i"]h;i4"*aw$e"* -4"*aw$e"HI",h"X & ;i+z -zkL] -  [𫫘;8! -CC -  "qLk -Lk#eHe -h - Lk8#PIcHcheHe -h - "On  -  "gi "g PI0L;i+zz z -zkH - )&" - ) - )0 8 - -hk ڥH - )2. - )! -8  -ж0 8 -𚰥hkH88HdR8W)) -*)(j)J(j zzkJjfȀ( -  [𫫘ZZZ"Bs LF H L )"ĠL;iH"ohhH"ohhL;iH"ohhHJJJI)8 - - -H"ohht;iH"ohh8PI=H:H"ohh HH F  -h"VH:H"ohhHH -F h"Vzzz+zz z -zkZZZZP8<8;H"mw -"hAHAH"hAHAH"hAA"Hz"hAHAhZJJJJH"h;iAHAHAH "hAHAHAH "h ;i H"mw"o;izzzzk@"$f"#dH̢:dFfc c  e - * &ؘ8ce~hhhhhh/FffF8&/y$0&&ddZddQH)hF8&H)h)H)h) -J Jȥ -Z먊JjzkZZZZLo >  -"LfLf)#cLS~ -H`8`f8P\cR8H80>8 48*8)88 -e  -eLzzzzzk - ;8 -  - -i"Z:L~'): "*a  1@')" ɀL~ - e j -)e"Z; ɀ9    -e';i -zz z -zk  L -;8;i H"ohh;iH"whhLQL c ;iH"mw H"_f;iH"mw;i -L c  ;iH"mw H"_f;iH"mw;i -L c c8  ;iH"mw H"_f;iH"mw;i -;iz -zk - ;8 - -:  8PI0L;iH;i "Ehh ] ) E      -E L$  -;izz z -zk -;8 - -"]*LL   : - -;i e / - - -;i e"]*;iz -zk -iH - - - -he" H - -;i ehLn - [𫫘;8 - -      JJ -              #   "5td"*a "5te "5t"5t# "5t0   "5t"5t -;i -+z z -zk -;8 - - - L;i;i"L  -"/L+ 0G7)+ "ͦ - ,  -"L  ;i -z -zkZ"Y:"6LZ"]LW):LO))  )  <)H"n  hLZ )H"n  hLZ@)H"n  hLZ)H"n  hm?)H"n  hC)H"n  h')H"n  h "]L4zk"$f"kI"$f"k"#dHhڥ -E\8~FfjJ8 -Fl$ zzzku -**Ji -Jȣ -fjhhzkFeeJjj8j -ЧгH -JhȈkЗF@ - ;8   -       -i"a ): "*a)  -e -)e"a    L/ - e : -  @    ;i zz z -zk - ZZZZ - :8PI0LJ -"LL8PI0L?) c q -W = c  c ] c ] c J8PI": c L,zzzzzz z -zk -ZZZZ -  Lt;i"j"V - "V +  "V  "V   -"V"m9 - N"^>D -.8"^>    -%  "V  "Vzzzzz -zkA(A -@ -ZhhJjhzkک"$f"#dHҘ8i0 -*$ &$8 &ccd&8&&&8j$Ff19Ffj  -,&JȀJ dd -ZhhhhJjzzk - ZZ  L7 L  L    L  L  L"CYȷ   - - "  L -e8 -d    5  ȷ -  -ȗ  :"CYzzzz z -zk - ;8  - -i"Z:L?'): "*a  4@')$  -e:LL -)e"Z ] ɀQ   "B  -e"B  , - ;izz z -zk  L;8:c U Uա!;#%i')\/1U35dZ+-)79;i":Lf U Uա!;#%i')\/1U35dZ+-)79;i""hhh;i:k -;8;i H"ohh;iH"whhLAL H"_fhL ;iH"mw H"_f c  ;i H"mw H"_f;iH"mw;iL c c8  ;iH"mw H"_f c  8:;i H"mw H"_f;iH"mw;i;iz -zk - ZZZZ<L87g0f -g -  ȷ   ȷ g7 -80] -"tVȷ"tVȷg7H h"zzzzzz z -zkZZZ "*aec  )"Ġ "`\@"`O1 Oyy y  "_"` "`  L + ~ - ~     ~   a  . ywz"[:"zy)))"ņzzzk - ;8  - " 7)L -7)$ - Ȉ -& -8 PI0     ")_ -  - "Ӷ:i:У    " "Qi;i zz z -zk -ZZ - -"LO   L)   L)  -i8"El -i6U"a -i8RRaA" -irrAa" -i " -i$"&$4664 -i8"bh  H"^hzzz -zk - ;8 <L c)   "b - - -ci -e - - ȷ - -L -ȷȷ8 Y -g  -c    7 H  h" -i;i zz z -zk - [𫫘ZZZ -8 -PI0L "*a  L& "*a  8PI0L8PI` -c   A)"ZH "*aech  "*aezzz+z -zk "*aec L.L  - ZZZZ  - L L& -"{L "r` LE L %L -"{p8ʆ'   Lzzzzzz z -zk -  [𫫘ZZZ - -"8PI% o$ L o$ K ",L" - L H",h  -&"*a?e"  WH ",h o$ "c"X!", o$ zzz+zz z -zkL -;8 -"h - -8PI0';i H"hhh;iz -zk8 -PI= -":0  ;i H"hhhLs8 -PI0Lk -c -  )HN"hh)"\X:3)"X:&;i c . $;i c   - -LF -ZZZ -  ) -zzzz -zk)"Ġ   L   L ڃ  L ك  L   L   L Ã  L   L ă  y ۃ  g Ń  U ƒ  CH"h [ [H"h     H"h  L - ;8   :L^ -H`L^;i H" Hhh ;i H" HhhL^LaH} - -"c: - LaL^{Hy - -"c: - oj"YYEH - -"c: - ouow;izz z -zk - ZZZ  -   ;iH;i -H "hhhh8PI0!HH "gyhhzzzzz z -zk - -e8PI0%8PI08  L8ZPI0a8PI08R  L8(PI0/8PI0 8(  [8dPI0k8PI0 8\  3 -   # # L - ZZ    LbH))"*a8PIL() "*ae  ) "*ae  ) "*ae   ') "*ae ' %) "*ae  : - - e H - - e hL%zzz z -zk - ZZZ   ɀ L  L)8 - -BB  )"X: ["ņ6)8 - -B -B))"ņx;"ņ JJJ ))"g  (#)JJJJI)8i0"ņ#)i0"ņ )"ņ~"ņ!  "ņzzzzz z -zk -  [𫫘;8 -;i-  -"8PI & L & Lo;i)HH -HH;i  4"*aw$e"Dhhhh"XLo     8PIL;ic i c  i c);i+zz z -zkL[ - " X - -L4 ) )  )       `  "Ui "U PI01   "Ui "U PI0驇!  "Ui "U PI0  "Ui "U PI0   "Ui "U PI0   zz z -zk - ;8    "7)L7)%  Ȉ -& ? ")   ",:L 7)ʆ " ")^ -  - ",:i:Щ ",: "Qi;izz z -zk - ;8 -   -C #  7"    L!     " "Qi "Š:L!@   -                  ; " ;i  "z -  ;i  "z:  )ӣ ;i -zz z -zkZ  ) "*ae) "*ae  ) "*ae) "*ae  ) "*ae) "*ae  ) "*aeH) "*aeh) "*ae -H) "*aeh -) "*aH) "*ah  zzk - ;8 -;i -" L$@7)L$ K -i&   "bhL$ 7 "  ",L$$"      -"~ i " i" i"a   " - 7 ;izz z -zk - ;8 - -L&7 -"d^>   == - => ->> -  L&=eL& -L& ȷ   ȷ ȗ"}Z ^>  7)" -"(  L% ^>;izz z -zk - ;8  - - ^>L(7 ^>Lk(& " ^>Lk( -"Lg(   L`( 8 8 ȷ  ?ȗ - -"[ b L|'       :   L'8    ;izz z -zk"_"U",hhhA"="_V","pY    """x ","^i "," ","us","B]"e",")","2",""r|","4","Y!","E:H",h -","N:"r| ",k -ZZZ -  46 -",:L, -i6"Z8  L,U+ -i"t:L, -iC"Z E :#:L,L,L,  L,)):%:L, -iF"Z:L,H):r -iI"Z:Z -iK"Zɀ$ -iX" iN -"Z:Uzzzz -zk;8 -(*$& H 8:BBDF<B>@LY-"q"H"[hB"Hd"_hd"HH"#[hh H " ;i"l{ "d"ή;i -k - -eH - -eh - - - - - -eH@ - -eh - - - -@L, - ;8 - # :';i">L/ : Ч) - L/ -   ? _ * M;i"> ;i ">  L/ L/L/   ?   ?  * :H  "-h4  ) ;i"> Lb.;izz z -zk - ZZZ  -  / : \ (   - : / L1 \ L1 -  & + "LLM1;i "n "+ 8* L1 +  7 )zzzzz z -zk -i8H7 he -"ͦ - L0LE0 - [𫫘;8 - -d" H d"*ah8 "g  "g  "g  "g  "g  "g  -"g  :0 :        "g  -"g                   :     #   ;i -+z -zk [𫫘ZZ"U"U:L4LU4 L^5"ĠRF:#.'"+/ -3L<5L^5+"Ġ7R;F?:C.G"KO -SwL^5O"ĠWR[F_:c.g"ko -s  zz+k -;8r -;i;i"LR7? A;i?"/ -j LI7i  EJL6][ "ͦ -EL6  - x  -;i "LD;i "8c  h;i?", -&;i? -"2 " -;irz -zk - ;8 8PILJ98PI0-;iH"hhh;izz z -zk c  ":L8;iH"hhh8PI0L$Hf"hh$$ H"hhh&;ic )"X:&;ic  $;ic . ":"h)H"hhL7;ic L7 - ;8" V  -  L;;"V"j"V - "V +  "V  "V" V  ;"V"^>L ;"Wʆ" "Wʆ" -;i )":y  -]  - 8PI0E -"Wʆ"\eHeh"V" V -L;:"^> - II -    5  "V  -"V" V  -;izz z -zk -;8  -:Le= --H`;iH" Hhh0*"h"f>"hhhZ;iH" Hhh0="h"f>"hhhک "hhLs=;iH" Hhh0*"h"f>"hhhZ;iH" Hhh0="h"f>"hhhک "hhLs="MhH"hhh -J >  1)'"f>d"hh/"h"h;i z -zk - ;8  -7)Lv?LT?Lg?  Lg? - ")LR?; -"Ӷ:LR? ***)  v ) -)Ȉ -&e?# )ʪeHeh -Ȉ -&  LO?## **) e# - e  - ***) ) ) - -e#) - -)eH)8 hȈ -&   -"Š: -"Qi;izz z -zk - ZZZZ -;i -" LA)LA7)LA LA: - -"2 -L@ -"r`  % E  > & - "2  @ j [ -i&   "bh  7    -zzzzzz z -zk - ;8F -TR ;i;"LC -LC;i"LLB;i"8c LB C1/c)   -c    -e : -e ţ   LC LC&$",_      'd Ci8c"  ;iFzz z -zk - ;8  -8 -PILE  LE [ LE):8PIL -E -):e  "*a V  "\LE"*a V MV"*ae - -;i "VLELxD -c  )"X:I -;ie -"*a)80eH -;i eh ; L*D "\;izz z -zk -;ieLC - ;8 - - "#pLF:d&#eHehJ))  II! #i0  JJJJ9  c      :;ic    А;ic ~ S -c : -c"W::    '   ;ic)  -c  ;iz z -zk -  [𫫘;8, -;i;  -"8PILAI;i -"dL8I     8PIL;i-c i c  i c)LFJ"XLFJ;i "te - -hjfj;i "ԕ;i ;i"te;i"ԕ;i  -"q:(;i -"q: LpH      - -hjfj i "te;i,+zz z -zk -;8     "J  ) LK  - 8 -PILK -A%S ", -",u -"h0;"V"ӏ "r|& "r|;iz -zk "*a  LL   "*ae":e:f "*ae "*ae -"J - -   -LJ - ;8   -  LN ) )LN   -  "  .,Z ȈFjdLN, .  L]N - Ȉ -&   g "r`%LN3#8 H h  LN -"       _ ȈFj eH eh  -i8H%he  ;i zz z -zkZZ"te8PIL:Q8PIL*Q8PILP8 -PILGPy̩" t" S" ;i    UU;=)c#%!')tv+-t79{/1Z35 "zzk "*a   "*ae8PILPO "*aec "D09Hm",h"ڣHC",hhL7O o$ LO & L O -;8 ;i"X;i ;i":LS / 1;i/"/ -ZLSMK;i "#p;i/;ic4"#p ;ic"/: 7k9m?s AuLS;ic"qLS -;i -i "#p    7)     7)LSk7 m9LS -  "ͦ  " X  ", iX1 . $  mk"~   : ;i/":  " -;iz -zk -;8  -"4;i{H" ;i s  L+Vt E L+Vu L L+Vv F L+V= - -HHHH;i"6~hhhhL.VL.VL.V   ßLV "*acHHc" ;iH" ;i  LV  -YH`L.VL.VHH"HHHH" ;i û㽰8㷅Hc"El dcHch c d c    LT;iz -zk -;8 - i  LX ) )LzXN ȈFj dLXLzX ȈFj  -:d%%LzX -"r`LX%LX LHXLX -"/LXCLX#LX ":o "   i8H#he;iz -zk - ;8   L.[   -    - : ʣ : p 0 7 9 (    -)808PI - L.[ / L'[ / ߩ - - -hjfj  -  - - -  - - - -   -   a !z  8      a !z  8       - - -  LY   / + 8PILY8PI - );izz z -zk -  [𫫘;8T -;ic 8PI0L];i -"mL`] L`] -;i?"te:;i?"ԕ;i?H;iG;i"DhhhhL\;iU)|;i;iU"m;i"D:';iU;i?"te%;i?;i "L9\;i "g"E "r|L]9;igHH;i ;iC "]JhhIZ",6;igHH;i  - "]Jhh;iT+zz z -zk;ic L[ -;8V ;i;i":Lc`#% ;i#"/: -N Lb`;i"/ - -E -% - " L_ -"L_ i8 "El .8  C iN "i8 -"~i8iX "#p .Y +-iX"~  ;i#"qrA?i "A? -"~A?    " -";i -"2;iVz -zk - ;8  -  Lc  Lc    L b  La  Lc ȈFj -(cH*ch",:  Lc -i8H - -)he" %H%hLc -*(  ȈF j eHeh",:  Lc -i8H -)he"ZLc Jc -*(H J)he",:  Lc -i8#e) -*(H J)he",: - Mi8#e)) ) ))JJJJ;iz z -zk - ;8 -  -         Le -  ",Le  - - Le  ? 7   - Le - . Le#   Le  LRe -@Z   # -    ,  .     -     M   2   "x:):     P    "s  , . J    "=V   Lc  ;i -zz z -zk - ZZZZ  - '"V  -   Lh   -"  LGh -"  L~g;i -"z  L{g ɪ L{g@ -")e_ -:")A;i -"z@    "V:LfL3h -"          -")/ -")  "V: '  )     -"Qi )zzzzzz z -zk;i -"z:   LEf;8&!!062!c6o28!66o2:!c2:8!060c4o0 8 #64o0:c0: 8 # "*a% "*a8% "*a! "*ae8%  Lkw "*a8%U%c  cԣc @ c ` #c!w "*a8%U%c cԣc @ c ` #c;i&k%c%cc8#cc8# c  L j#c#c @  @  `  ` #c -ZBBBB -"VLn `   LmJsuu -s"VJJoqq -o"Vkmm -k"Vgii -g"Vcee -c"V _aa -_"V@[]] -["VWYY -W"V ` a   Ln  J1SU'  U -S"VCEE -C"V ?AA -?"V@;== -;"V799 -7"V a b   LnJ355 -3"VJJ/11 -/"VJJ+-- -+"VJJ+-) -'"V b zz -zk;8X;i ;i":Lq ;i "El Lp;i" "B" Lo "[y   -X &;ic  ;ic LoLq Lq%:;ie :ף % '-/;i%"LLq;i%"8cY;iCA "#pCA    " -LqLqLq;i%"i CA"ElCA  ;iCA "#p    " -;iXk - ;8  - +7 )Lt  -e:Lt i ;i  "#pJLr @+ dFH H;i i "Ehh "*dLtLt + LOrJJ  c " "Lt:Lt   H - - - - -h8"LLs i "s   -  ",[H   "h  "=V  : ЂLt -  ",k   "El i   "#p+7 H  h  ;izz z -zkLq -;8*    "Z - -LwLw -HH "hhh 8 PI0LKw&("$8 PIF&(PIg -c;i c (&("$Lw"$Lw&(PIM$"Ȉ -&H -c)henC&($H$h -c  "$(&&("$Lu  - E ;Lau -  -";i*z -zk;8b "x"9o ;iH"mw HH"gy H"}u;i"o   HH"o"j  HH"o"jH#H"o;i"jHH"o"j  HH"o;i >"Ġ3"jhhLy"jhhLy"jhhLy"jhhq%"jhh\R"jhhG"jhh-"jhh`"jhh  HH"ohh"jhhY   HH"o>H>Hs;i"6~ ;iH"j;i  R   HH"o>Hv;i"6~;iH"j;i -   HH"o"j HH"o"j;i - ;8 -  L6~L6~  L|  LK|  L0~ȈFj -(cH*ch",L0~ ) ) -i8H - -)he" ))  -i8H - -)he"  L0~ -*( ȈF j eHeh",L0~ -i8H -)he "a  L0~Jc -*(HJ)he",L0~ -i8H#he )) -  ') - - - -     -*(HJ)he",y -i8H#he))')# ) FjFjFjFj   ;izz z -zkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkHπ)hkH)hkH hkH)hkH @hkڢkڢ"k"""k"*"*"*\"7"~"~"n~"~"7"7"7"P~ "{~"7k8k"~"~"k""~""""~"~k"~"~"~"7"~\\~"\k, H"hk"*"~""~,"~N""ڢ"~"J"~"~"""~""~"~"~k"~"~"~ -"~ i0"~"""8kڢ"~"~"~j""~"""", kx0"G(k(kx0 @""~(kx0""~"~"~"~(kx0 ""~(kx0""~(kx0_"~"(kx0?""(kx0"T()k0(k(kx0, H"h(kx0"~"7" (k - ;8  - -"LLՄ   ,.   ",Lӄ Lӄ? 7   L   L  L߃@+7)L @Z  #   ,.         U  :   ": ):          Lm  !"s Lӄ+7)0 -i  "t:Lӄ  ,.     (  ,.    -"=V    L;i zz z -zk -ZZZZ -&"@$  ))*(,. " $Ll -H`8L|L|Pà|@j耠XaF N47"p]"ĠL|SL|L|L|L|C|jXF4"KKL+9 - -C -C K - LD+ - 4! - " -  - V:@) - 4/ - " -  - zzzzz -zk -;84;i!;"L:><!##!8ʆ#!&#!L8#!  LB!%#' -;i%"r`%  -L4E  -i - - - #!L{ L#!#!*(   -  I  #! ",   - Lꋣ     #!  8#!i8c"Z: - -  - Z#!i8c" )) - -c # : -     L  >#!#!  ;i4z -zk - ;8X  - "YU" h -;i P"g;i ;iH;i "}hhL"@W"p J?(4Q)G | "YU"q;iH;i "}hhL"1Wʆy"p ;iH;i "}hhL"1WʆE -EL;iH;i "} -hh -L -":e: Lc -":e: {> -":e: PC -":e: (% -":e:08 "YUH"ZdhL< ",L -",q} ",[",E",/?",k ",;iXzz z -zk - ;8   R    - -_ "r` L -%L -  L - -  L -LB -LB -   "r`EL;%L;h  "   - -  L - - L  ii  '   L - - - -"r`?E'%  - L - -LkL - -  -"{'! - "{e -   8ʆ    :     -=;izz z -zkZ8PI0L=HV"*ahMMV"*aeMV"*aeMV"*ae - - MV"*aeMV"*aeMV"*aeMV"*aeMV"*ae MV"*ae""$$MV"*ae6688MV"*ae::<<MV"*ae&&((MV"*ae**,,MV"*ae..00MV"*ae2244MV"*ae>>@@MV"*aeBBDDMV"*aeFFHHMV"*aeJJLLMV"*aeNNPPMV"*aeRRTTzzk - ;8 - &$;i -"  L)  L7)L8 Hhd -  L77L ȈFj -:d%%z - -"r`  L%  L"  LcJ)L- -c -8H   "bh  L X8Hhd2 -i&8 -) e"#p -) LO L웠 W -i&  "bh  L 7  -i&  "bh  L78 - -i&H7he  "#p 8 &$ g c c   L;izz z -zk -;8|n> p Jz>n>n>     -z>    -z>   -z>  -z>n>n>" hhhh7    8PIL "\_"'kXD"Q"3H H*HJ"dd"*""!D4;iH"mw ;i "h 8n>PIL 8 PI0L, "h8n>PIm -p>X -z>"MhHH;i3"6~;i3"2ZH;i5H" ;i ;i-"6~;i-"2ZH;i/H"hhh"gi -"g -PIR"]C"e -,8PI: -p>: -z> - -;ie"v;;i|z -zk -p> -z>"/ - -;ie -z>":L砣"V -p> 8 -z>"MhH "hhh -z> - -;ie   Ly$ 0 $ JJ 4 L - ;8"  H;i"^hLڥ ?"    S )"")" -         "Eli") -  - - L -L - L - -ed`dC5 d""\  -cHc -h % -cHc -h - -8H" -hL i -" i " .  -")")" - -")")"   -")"   -JJ))  - -cHch:")")" - -cHch:")")"  -cHch:")"   -JJ))  -  i  - -cHch - - L\iU"a"bh;i"zz z -zk - ;8b  - ;i;i"L;i/ ;i7 ;i7LϨ;i/ "LLϨ;iG",LϨ;iK"ͦH;i;h;i/"LLϨ;i/"8cV;iK"ͦ ;i/"=V LϨ;i;i/"ѯ;i/c)Lè  y :::;i/cc  £:c /  LL&Lv " :c /  ) - -hjfj  c )Lj Lש - - /    H c   -  Z    -c       L. -  - ;ibzz z -zk - ;8 - &$;i -"  L)  L7)Lc8  LA77LȮ ȈFj -:%L, - -"/ -"/ @ LE  L%  L - - W -i&  "bh  L 7 "  LcJ)LN -c -8H   "bh  L8Hhd?8 -) e -i&"#p 7  -) L* Z D -i&  "bh  L78 -   -i&H7he"#p   8 &$ g c c      L;izz z -zk - ;8 -  Lണ,.7Lz  -  -e:LM   -  -e!ؐ Lf8ic - d - "a c Lfie  L\c) -  5 .i c . i c  Li c )L -ic ? B    i c)Zie  ) L i c).     A@Z9 ))%: cic    Lⲣ? 7  i" Hhi"Zi"Z;izz z -zk - ;8  -;i -" )   Lo  %7)      LK - Ȉ -&L :" :" x::II%%8 HhLW -` -"/E  Lo%  Lo -  L9      L8 HhcHch7)C -"/L -"r`%  Lo9!  Lp  LocHch))b"  Lo ȈFjeHeh !  @ 77Lm Lm U -i&  "bh  _ 7  -i&  "bh   ;izz z -zk - ;8N   -  - L. ?# ;i;i "L ;i"/DLּ8;i"q   !  -  LļLļ" 86i "86i "86"ͦ 86 86"~86i"  L64;i "29", :Hh  ) JJ J  W @    46 6"8$    L 86"ͦ -86i"     -i&"El L L  - Ȉ -& -  - - x n -"r` - - # -  8Hh - L) )L" } ȈFjeHeh -i&  "bh  ;iNzz z -zk - ;8 -    .  - -"i%     L'ţ  -"1 -"\ -    +  -  "iLã"iLã& f L8">@"4"c"y"O c8 PI0 j Lã"iL£"O8">@"4"c"y - -"Oc8PI0\c8 PIK8PI  -H">h"4j -   "  Lţ - $           "> - -"4" \" -"*"\  0cH  h  :  88PI0Lã& f Lĥ & $8 -  +  -"i0   -"i0        L  ,           )Е ;izz z -zk - ;8     "X Ld̊ - - - - Ld̥ - # )/"V  J   -Ld̩Ld  "U  JLd   -Ld̥ -"$Lḍ Ld̠64 -iC"Z Ld̥ -iN"Z# -i\"  " H      Ld̠)"\ -E) - -:La̠ -: -7:Lḁ -iI"Z7: Ld̥ -iK"Z# -iX"  -iF"Z  Lḍ -c JJJJeHeh   Ld8 Hh -" Ld̩    Ld̦i$&c (* cHch02e -ib"Z: Ld̠: Ld̥ -id" ,.&&Lʠ: Ld(cH*c h,.G"\Fj77eHeh&i ȈFj " Ld̩  L"̥ -ih"ZL"̥ -",:L"   -i6"ZUL"̥ -i8" RRkaAd -i" rrEAa> -i "  -i$"     ;izz z -zk -;8@-/ 1"Z - -Lӣ)+% ' ! # 1L -HH"hhh8PI0Lө))++%%''!;#=79 53??8PI07))++%%'';!=#79 53L*ͣ%'LΥ -c? Z   4 -c? z J  )!+#;=79 LxөLӣ=L -У5ʆ;=PI0L -У7 9 A=;"p -c?))9H9hx -"r|  Lϥ -c?)9H9hc -"r|  x -c?))ʆ9H9h  5 -c?)    )+ Lң5ʆ;=PILѣ3ʆ;=PI0Lѣ)+ ]5ʆ8;H?h"p -c?))Hh/-79"r|)+ Lѥ -c?)Hh/-79"r|)+ x -c?))ʆHh)+ 59H9h -c?)    Lxң3ʆ8;H?hPIC)++)  -c?   )+  7 9 =;L4ӣ3eHehPI08     ! #   53?%i%'i'!)#+%%'';=79 53?Lͣ1;i@z -zk - ;8   - ;i"%Liۥ)H - - e h   f/_\Xɀ"[Liۣ Liۣ   - -eL9ԣ    f / Lܣ \ L            - : -e.I L֥ - : -e.L֥ - :: -e.L֣ -e , Hi eh Liۊ  .i e   2 -: -e . :ʦ - -eLi۩  - -e L۩ % - -e. -     ' -: -e. :Ң i  "El  )       - -e  Lqڣ Lۣ.  Lۣ L!ڣ L!ڣɀK  "#:#)    } :.      Lۣ   i c     L٣L٩"[{AZ     a'z  8        $_         i c     Lۣ    4       L{      - -     # #  -     JJNJ              + ;iz z -zk  - -     '         Lף  L֣L - ;8   ;iO"j;i -    Lmߣ % ;iO"? Lo - -      0 0 0     " O - %         "  * . -   %  n -   0 D9  9 -"*a)e80      -%   . L    * 4 -     s   0 D9  9 -"*a)e80      -     -   l d    l '            %;iO";izz z -zk)"ĠL#i - - ;c)L0 -# :#%;iO""?ԣ -)/:"  ;iO"?ʣ%;iO "?إ  - -LoLߩELV -7;iO"? Lo # :Gi - - -+)'L# :LA d EiGiʃL d 7;ʃ - - -+)' d L-H;i;i'8  -+)' ;i;i;i -"  ;i;i;i -"  3 x  'c      #0cH;i1ch # # Lx#:&##;i/c - ##:#%;iO""?ԣ:;iO;i/c"?ң%;iO "?إ  - -LoiH -;i1"Ch;i/"2Z -# :# -%;iO""? - -ԩ;i/c)6 -%;iO "?إ J;iO;i/c"?;iO"?  L^ - ;88"DVDF HJ "U "U  L % LK "U "U    % L;  -  +) '+@a#  )"Ġ+";V6+";V'++";V ";V )L+L - 0 {9 p 80  #+-' - - -c)c";V+ )L) - - -c)c+";V L * L#+3 -  +)L - + 8  ' L . .#+;i8zz z -zk+";VL z  t  . ";V+L l h   j +#";Ve l *#+ ++#";V3 h Lm#+ ++#";V )'"U "U   -   +)'"$ &   L=& p :#&"$ - & +)'ǩ & E G & & e 7g & ,"V"VV[ LE &  S L c L: s L& d L: i L# &"V"VV L # # )   # "$ ; &)"Ġ#  -"MV L$""U $""U  V ;  # @ LHh HH"2V"][hhL6"MV%# `  "MV #   $;"V "H;i/h8  #    L"2V%H"Vh"V"2V&)H"Vh"V"$ L6# "ViNʆ# (# -I)8ʆ# "8  -  #   % -;"V "H;i/h8  "$    #NJ - )8PI)  # @# #      # c):;i-e 0 #  %   @#     "#     # L.# E) )8PI "Vc      -    )8PI' "2V H"Vh"V  ȣ     )8PI0  "V # Q "2V0H"Vh"V@# .  # xX"2VH"Vh"V  [# N #  +  #  -  "2V )H"Vh"V  )8PI#"2V0H"Vh"V:    = : "2V );i-e)H"Vh"V    L - ;"V ]"V"VV   #  "/^  # 1  "2V H"Vh"V : ۣ    L  "2V)H"Vh"V: :  "$ "2V H"Vh"V:ݣ L    "2V)H"Vh"V L - ;8N -;i"X L: - - - - G  G"U  JL: -L: - -i -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 -  - - -? A -? AJɀLL: -  - 4JJ4J   4JL:   "cJHcNh$&  -; ==;  L|LHLhZJ h  -u= -ud - '&LJ"(**(&& -  -i - i Hd -e - e -:H" - (*7(*+    -, .(*LpL:LNLJ ȈFj -  -g= -gd - '&LJ" -  - .  -& - -i  <   -"\Fji  cH:H" - "Ȉ -&H"    -, .(*?cHCch.,5"\cHchc(Hc,h020cCH4cGh - -:EC:II%%80H4h  9cHch - cc - ,,..L5"F: - iiii -  -  - 5"c,Hc0h - ,. &&&& - 0c -H4ch - 8 -?HChJLL:8JHNhH209"\h8Hh8(H,h " -   - - !;=Ff   L} L:  L - r;=& &@ &  p4JJ   =; P;= &  -  0L: - 7;=+ &    ;=LPL:   - L:H -"El. - "#p -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"#pf -i'&$" -i,"a $ )&  -i+"#p -iU"aCA -I"bhL:  LH CAi -I"bhH -"El -RRaA" -irrAa" -i -:" -i" -iU"aCAi -I"bhCA -I"bh7H"*a -"El -  - 5L8  ( -* - -  - - - - - - 79 - - - 7 -9 - - - H -I"bhL:cHch - 8Hh - L      ZJL   4          49JL H -;iI"3hL:HI"^hL:L:  H -" -i" -i"A   - - -  - - -  - -", -. - 79 - - - 7 -9 - - - H -I"bh;iNzz z -zkH -"ElcHch - 8Hh - L - L{  @!#%')+-/=@CFILORUX[^adg@@+#} 7A3;5f,Q8qClEuSwFr@k'''''''''######''# ##'# '# '# ##'## ##'''# #''''''''''######## ########'''''''''''##'# ''''''''######## ''''''''######## gcJ''##'; #''# '''# ### ### '''# '#                                                                      gcJ gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; gcJ; ; #' #''' ### ### #''' #''''''''''######'## #' #' #'## #''## ##'''# #'''# '##'' ########''''''''gcJ; ########'''''''' #'##''''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #''# #'''# #'''## ##''# ##'# '# '# ##'## ##'''# #''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''## ##'''# #''''# #'''## ##''# ##'# '# '# ##'######'''''''''''''''''######## ########''''''''''# #'''## ##'## #' #' #'## #''######'''''''''7Gh t G~}  Yk  )%GR+R(R$R -R S UWYZ ] acgkmmmmmmigc_ -] [YX V T -S"R%R)R+R 0R0R0R0R0R0R0R0R0R0a0R0R0R0v trponnnmnnnnnmnnnnnnprt v0R0R0R0~R(R(R(RRRRRRRRRRRRRRRR0R0R0R0R0R0R0R0R0R0mphc!_$]&[(Y*W,U-U.S  S R%Q(Q*P*P,P,P,P,P,P*P*P(Q&R R  S.T.U,W*Y([&]$` cho~~~iiiiiiiiiiiiiii0R0R0R0R0R0R0R0R0R0^O:3P:2Q:1R:~:~:~:~:q  BK:o BL:mBM:lBN:k:j:i:h:gBG:fBH:eBI:dBJ:c:b:a:`:_BC:^BD:] BE:\ BF:[:Z:Y:X:WB?:VB@:U BA:T  BB:S -:R -:Q :P :O:N:Md1ru6:Lb]f:Ka?|Q:J_f u6:J_J f:J  -  ^$liPzQ:TnYX0Pzu6:6xp[X0Pzf: `t\X0PzQ:Cy_X0Pzu6:g}b X -0Pzf:Qe X 0PzQ: X0: X0:  X0::M X0::M X0::M X0::M X0 X0 X0  X0! X0"ǝM X0#ƝM XU7, 0$ŝM -XK  0%ĝMXV> * 0&XN&/0'XWD'0(eXR/-0Pz)}M Gz*ˠMV*! -!+^+ʠMs8*) -!*=s,ɠMwA*' -!*Ew-ȠMh2*' -!*7k. R*% "*/a /L q< *S O0 `d, *Ew ]2(j}H*7kf5ϞRB{m4*/al.8ΞTQXV u9;͞Uc~I>̞W3o T@,F| -cC,Zg#F-fr5I.;vx@LӟҟџПi  - -      !#%&' ())*+%'./0 *12 3 4!5$/"6#6&1$8(3)>,8-9+@,A/<0>.C/E1G4B6D4J7E7F5K7N:I8O;R>N>N>VAQ@XAYDVB[EVD\E]H[F_G`HaIaIbL_KdLfOcNgOhSgQkRlUjTnUoXn[qZt[u^u]w`x_z`{c{c~de~fghhhijklmmnnopqqqrrssstttuuvvvvwwwwxxyyz{mq\Y\\\;\\\F\\\\\\\rp\\+\\\Y\\\ӏ\'\n\\\\\\#m\r\]\C[\ \ H\YY\a\_\\n\p\n\o\o\w\mw\gy\\l\*\U\9o\+u\\j0HZ -  - [dH"k+z -zzz z -zzzzzzh@0HZ -  - [dH"f+z -zzz z -zzzzzzh@8[dH\mP \ No newline at end of file diff --git a/utils/genparams.py b/utils/genparams.py deleted file mode 100644 index 13ea512..0000000 --- a/utils/genparams.py +++ /dev/null @@ -1,62 +0,0 @@ - -# -# Create the 64tass parameters structures for the Toolbox functions -# - -import re - -class FunctionParameter: - def __init__(self): - self._name = "UNKNOWN" - self._position = 0 - self._type = "" - self._description = "" - - def set_name(self, name): - self._name = name - - def set_position(self, position): - self._position = position - - def set_type(self, type): - self._type = type - - def set_description(self, description): - self._description = description - -class Function: - def __init__(self): - self._name = "UNKNOWN" - self._brief = "" - self._description = "" - self._type = "void" - self._parameters = [] - self._address = 0 - - def set_name(self, name): - self._name = name - - def set_brief(self, brief): - self._brief = brief - - def set_description(self, description): - self._description = description - - def set_type(self, type): - self._type = type - -with open("toolbox.h", "r") as input: - for line in input.readlines(): - m = re.match("extern\s+SYSTEMCALL\s+(\w+)\s+(\w+)\((.*)\)", line) - if m: - func_type = m.group(1) - func_name = m.group(2) - func_parameters = str.split(m.group(3), ",") - print("Type: {0}, Name: {1}".format(func_type, func_name)) - for param in func_parameters: - m2 = re.match("^\s*(.*)\s(\S+)\s*$", param) - if m2: - param_type = m2.group(1).strip() - param_name = m2.group(2).strip() - print("\tName: {0}, Type: {1}".format(param_name, param_type)) -