pax_global_header00006660000000000000000000000064137523346360014526gustar00rootroot0000000000000052 comment=09270863f5f70e5200c30d2778f654ff7a40adba dasm-2.20.14.1/000077500000000000000000000000001375233463600127575ustar00rootroot00000000000000dasm-2.20.14.1/.github/000077500000000000000000000000001375233463600143175ustar00rootroot00000000000000dasm-2.20.14.1/.github/workflows/000077500000000000000000000000001375233463600163545ustar00rootroot00000000000000dasm-2.20.14.1/.github/workflows/main.yml000066400000000000000000000024661375233463600200330ustar00rootroot00000000000000name: Build, Test and Package Snapshots on: push: paths: - 'src/**' - 'test/**' - '.github/workflows/main.yml' jobs: build_for_windows: runs-on: windows-2019 name: Build for Windows steps: - uses: actions/checkout@v2 - name: Make run: make test # build + test env: CC: gcc - run: | mkdir -p artifacts/windows cp bin/dasm.exe artifacts/windows/dasm.exe - uses: actions/upload-artifact@v2 with : name: dasm snapshot builds path: artifacts build_for_mac: runs-on: macos-10.15 name: Build for Mac steps: - uses: actions/checkout@v2 - name: Make run: make test # build + test env: CC: gcc - run: | mkdir -p artifacts/macos cp bin/dasm artifacts/macos/dasm - uses: actions/upload-artifact@v2 with : name: dasm snapshot builds path: artifacts build_for_linux: runs-on: ubuntu-18.04 name: Build for Linux steps: - uses: actions/checkout@v2 - name: Make run: make test # build + test env: CC: gcc - run: | mkdir -p artifacts/linux cp bin/dasm artifacts/linux/dasm - uses: actions/upload-artifact@v2 with : name: dasm snapshot builds path: artifacts dasm-2.20.14.1/.gitignore000066400000000000000000000001021375233463600147400ustar00rootroot00000000000000*.o test/**/*.bin test/**/*.hex test/**/*.list.txt bin dasm ftohexdasm-2.20.14.1/ChangeLog000066400000000000000000000154301375233463600145340ustar00rootroot00000000000000 Note that we document changes to the source files and closely related files (Makefile, test cases) only, this is *not* a complete record of every single change ever made. Check the GitHub commit history for that. :-) new in DASM version 2.20.14.1: * fixed support for forced word address x/y indexed (.wx / .wy) * man page added * missing opcodes added for mc68hc908 controller * Support for older macOS versions (OSX 10.5 and up) DASM version 2.20.14: * Technical Documentation / User Guide for dasm in PDF format, written by Andrew Davie in his engaging style. * Dynamic Labels support by concatenating evaluated values * Multiline C style /* */ comments * Support for mc68hc908 controller family * Cleaned up and improved Unit Tests * new switch -R to remove output file if dasm found an error during assembly * Small optimization in the Atari 2600 CLEAN_START macro * SETSTR expression; typically used within a macro to use the name of an argument DASM version 2.20.13: * longstring segfault fix * fix for non-symbol-compliant unquoted filenames * address expression fix * makefile portability fixes * added atari 7800 support * allow labels to shift between multiple passes * fix for silenced single pass non-abort errors * adjust .byte and .word negative range check * duplicate macro fix * reduce gcc Wall option build warnings * added 'strict' syntax check mode (+ added to docs) * enable .word size check for strict-mode only * dynamic buffers for pass-output update DASM version 2.20.12: * Fix for handling linux linefeeds under Windows (fix by msaarna) * Fix for segfault on long lines * Supports using constants for include files (enhancement by SpiceWare) * 64-bit versions of DASM are now part of the release for all platforms. * Dockerfile for building a 'dasm build machine' docker image based on Ubuntu 16.04. This allows you to build the dasm executables for all platforms (Linux, Windows, macOS) in a single go for any branch of dasm. 2008-04-07 Peter H. Froehlich * Makefile (dist:): added README.ANDREW and CREDITS; corrected test/atari2600/ pattern * test/atari2600/*: removed one Atari 2600 test case due to concerns about the original Atari copyright on the code; adjusted Makefile accordingly * src/main.c, doc/dasm.txt: synchronized usage information between dasm itself and the documentation for dasm * src/main.c: completely removed deprecated -t option * src/ftohex.c: removed _fmode stuff that was necessary for ancient C compilers for DOS 2008-04-06 Peter H. Froehlich * Makefile: removed Apple specific warning option, added -p to mkdir in build target (thanks to Andrew Davie); added a test target to run all tests from trunk; added "recursive clean" for test directory to clean target; fixed dist target to allow for correctly structured source and binary releases; default target now builds DASM; install target added but just prints a warning * test/*: imported Matt Dillon's original test cases from his 2.16 release * test/atari2600/*: added two "real" Atari 2600 programs as test cases and created a trivial testing framework * test/Makefile, test/run_tests.sh: created a slightly more advanced testing framework, still far from decent though * ChangeLog: finally wrote this file for everything that happened since I took over :-) 2008-04-05 Peter H. Froehlich * src/main.c: made command line behavior more Unix-like by removing "spurious" output (version, completed); added a new -E option to control format of error messages; also refactored asmerr() to make it somewhat cleaner * src/asm.h src/global.c src/main.c: turned -T sortmode stuff into a proper enum type and refactored main.c code to use enum constants for range checking * Makefile: added to produce beta releases as well as final releases; beta releases work, final releases don't yet * src/*: introduced the new "standard header" in all our source files 2008-04-04 Peter H. Froehlich * src/asm.h: completely removed the old "bool" defines, were not in use anymore anyway (see 2008-04-01) * src/main.c: replaced calls of non-standard atoi() with standard strtol(), no error checking yet; added range checking for -T option * src/asm.h src/globals.c src/main.c: introduced a "regular" configuration variable F_sortmode for the -T option; the bTableSort hack is however not gone yet * src/Makefile: switched on many more warning options, including -Wextra temporarily * src/*: fixed more warnings, many of which came from what -Wextra said about field initializations in the opcode tables * src/asm.h src/mne*.c: added MNEMONIC_NULL macro to mark the end of MNEMONIC tables correctly and without duplicating the code in every file 2008-04-03 Peter H. Froehlich * src/Makefile: added target to make an alpha release, reorganized structure to be more obvious 2008-04-02 Peter H. Froehlich * src/main.c (CompareAlpha, CompareAddress): rewrote CompareAlpha() to call strcasecmp() instead of allocating memory for both strings, converting them to lower case inline with one loop for each string, calling strcmp(), and then freeing memory again; also corrected the casts from const void* to const SYMBOL** following the example for qsort(3) from the Linux man page * src/Makefile: switched on many more warning options * src/*: fixed lots of warnings: shadowing, some more static, lots and lots of const (and casts losing const when they shouldn't) 2008-04-01 Peter H. Froehlich * src/mnef8.c: replaced uses of non-standard stricmp() with standard strcasecmp() * src/asm.h (SYMBOL): made "value" field signed again, fixing the long-standing "-1 bug" (partially for sure) * src/asm.h: switched to stdbool.h from custom define for bool * test/negative.h: added a new test case for negative literals * src/Makefile: use gcc to build on Unix systems, added mnef8.c to dependencies, added a "clean" target, switched to C99 and enabled many warning options * src/*: fixed lots of warnings in all source files, mostly concerned with initializion of MNEMONIC tables and various printf format codes; also added "static" to many functions that are used only within one file and removed several of the prototypes that were unnecessary because of this Note that there is a long and involved history of changes from before 2.20.11 that was not reconstructed here. It would be an interesting (if Quixotic) project to actually do the necessary research, but it's not on my agenda for the near future. dasm-2.20.14.1/LICENSE000066400000000000000000000431031375233463600137650ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. dasm-2.20.14.1/Makefile000066400000000000000000000104341375233463600144210ustar00rootroot00000000000000# # the DASM macro assembler (aka small systems cross assembler) # # Copyright (c) 1988-2002 by Matthew Dillon. # Copyright (c) 1995 by Olaf "Rhialto" Seibert. # Copyright (c) 2003-2008 by Andrew Davie. # Copyright (c) 2008 by Peter H. Froehlich. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # Simple hack to build everything, test everything, make a beta # distribution, or make a real distribution. Default is to just # build everything. Installation is not implemented yet. # TODO: need to do documentation stuff as well; don't forget to # delete automatically generated documentation in clean: below # just an alias for build really... all: build echo "Build complete, use 'make test' to run tests." # install, currently not implemented install: build echo "Installation not implemented, you're on your own, sorry." # just run all the tests test: build @echo "Running tests..." (cd test; $(MAKE); cd ..) @echo "Tests were run, but testing is not fully automated yet." @echo "In other words, don't rely on what you saw too much." # just build everything and copy binaries to trunk/bin/ build: (cd src; $(MAKE); cd ..) mkdir -p bin cp src/dasm bin/dasm cp src/ftohex bin/ftohex # release version to use for archive name # supply this to make when you run it as # RELEASE=2.20.12 # on the command line, that's the easiest # thing to do RELEASE=unknown-version-number # architecture for including binaries/executables # supply this to make when you run it as # BINARY=osx-ppc or BINARY=beos-x86 or ... # on the command line, that's the easiest # thing to do; note that this only affects # the name of the archive, the binaries # are always put into a trunk/bin folder # if left empty, source distribution is assumed... BINARY= # binaries BINS=bin/* # documentation DOCS=AUTHORS ChangeLog LICENSE CREDITS NEWS README doc/* # support files for various machines MACS=machines/atari2600/* machines/channel-f/* # source files for dasm and ftohex SRCS=src/*.h src/*.c src/Makefile # src/TODO? src/HEADER? src/PATCHES? # test files for dasm and ftohex TSTS=test/*.asm test/*.bin.ref test/*.hex.ref test/Makefile test/run_tests.sh test/atari2600/Makefile test/atari2600/README test/atari2600/*.asm test/atari2600/*.ref # other files OTHS=Makefile ifeq ($(strip $(BINARY)),) # source release, no binaries CONTENTS=$(DOCS) $(MACS) $(SRCS) $(TSTS) $(OTHS) DIRNAME=dasm-$(RELEASE) ZIPNAME=dasm-$(RELEASE) else # binary release for specific platform CONTENTS=$(BINS) $(DOCS) $(MACS) $(SRCS) $(TSTS) $(OTHS) DIRNAME=dasm-$(RELEASE) ZIPNAME=dasm-$(RELEASE)-$(BINARY) endif # create a distribution archive for publication dist: build mkdir $(DIRNAME) cp -p -r --parents $(CONTENTS) $(DIRNAME) tar cvf - $(DIRNAME) | gzip -9 >$(ZIPNAME).tar.gz # tar cvf - $(DIRNAME) | bzip2 -9 >$(ZIPNAME).tar.bz2 rm -rf $(DIRNAME) # prepare a beta release containing source code and tests; # machine files are included since tests may need them; # nothing else is in the archive since it is not intended # for the public, just designated volunteers beta: echo "This is an incomplete beta release of the DASM assembler." >README.BETA echo "The purpose is to identify regressions, nothing more." >>README.BETA echo "Please do *not* re-distribute this release in any form!" >>README.BETA echo "Please do *not* distribute binaries derived from it either!" >>README.BETA -tar zcvf dasm-beta-`date +%F`.tar.gz README.BETA $(MACS) $(OTHS) $(SRCS) $(TSTS) rm -rf README.BETA # remove beta archives and bin/ directory created by # regular build from this Makefile; don't delete the # "real" distribution archives clean: (cd src; $(MAKE) clean; cd ..) (cd test; $(MAKE) clean; cd ..) -rm -rf dasm-beta-*.tar.gz bin/ dasm-2.20.14.1/NEWS000066400000000000000000000114211375233463600134550ustar00rootroot00000000000000 This file records only user-visible changes to DASM, the ChangeLog file records all internal changes as well (almost all anyway). ========= DASM News ========= 2.20.12 -- 08 August 2019 * DASM moved to GitHub! The new website for dasm is now available at https://dasm-assembler.github.io/ * DASM finally has a logo (see https://dasm-assembler.github.io/) The logo shows 'dasm' in all lower case to match the name of the binary and also because of the more approachable and casual vibe. In documentation, writing 'DASM' is still the preferred way. 2.20.11 -- 07 April 2008 * Peter H. Froehlich took over as maintainer from Andrew Davie, but both Andrew and Thomas Mathys still help. * DASM moved to sourceforge.net, the new website for DASM is now available at . * Fixed (the obvious version of) the long-standing "-1 bug" that made DASM reject sources with negative integer literals; there may still be signed/unsigned problems in other areas; there is certainly still a range checking error. * Fixed the usage message to reflect that symbol table sorting is controlled by -T and not by -t as the message claimed; also the format of the usage message is now more GNU-like. * The range of values for -T is now checked, you have to stick to 0 or 1, arbitrary numbers will not work anymore. * Removed spurious output when running DASM. In general command line tools should only make output when there's something to report (a central Unix tenent). Sorry if you miss the messages, just look at the usage information instead. :-) * Added new -E# option to select format of error messages; -E0 is the default MS style, -E1 is "classic" style from Matthew Dillon, -E2 is GNU style from their coding standards. 2.20.10 -- 31 October 2004 * Thomas Mathys added support for the Fairchild F8 processor to DASM. Thank you, Thomas! * Support files for the Channel-F Video Entertainment System (VES) added. 2.20.08 -- unreleased * Documentation changed from Word documents back to text files. 2.20.07 -- 17 July 2003 * No user-visible changes. 2.20.05 -- unreleased * Symbol table dump is now performed even if an error occurred. * Symbol table dump now displays string symbols in string form. 2.20.04 -- 24 April 2003 * Command line options now allow "/" as prefix in addition to "-" as before. * Division by zero is now treated as an unrecoverable error. * Error messages now contain more information about the error, including the actual source code where possible. * Output reworked. Typically, the -v option is now unnecessary as more appropriate messages allow you to find errors better. Compatibility with the -v option has been maintained, although there may be a few minor changes. * Branch out of range errors now list the distance to the branch. * Undefined symbols are now always listed in a separate table. If an unresolved symbol causes an error, the table is displayed automatically at the end of assembly. (Note: It can be alright to have a referenced but undefined symbol, for example when IFCONST is used. In this case, the undefined table will only be displayed if there is another undefined label, but it will contain *all* unresolved symbols.) * New command line option -T# where # is 0 or 1; 0 sorts symbol table alphabetically (default), 1 sorts symbol table by address. If available memory precludes sorting, the table is unsorted. 2.20.02 -- 24 April 2003 * John Saeger contributed support for all illegal 6502 opcodes. Thank you, John! This fixes the LAX opcode as well. 2.20.01 -- 22 March 2003 * Andrew Davie took up the DASM project, starting from Olaf "Rhialto" Seibert's 2.12.04 version with both Olaf's and Matthew Dillon's blessing. * REPEAT now detects negative loop count (used to lock up). * Errors are now in the format "file (line): Error: string" to be compatible with MS VisualStudio. * Support files for the Atari 2600 Video Computer System (VCS) added. * Support for illegal 6502/6507 opcodes NOP zp and LAZ (zp),y added. 2.12.14 -- 19 August 1995 * Olaf "Rhialto" Seibert's release of DASM with many changes to Matthew Dillon's 2.12 release. Note that everything before 2.20.11 was *reconstructed* by Peter Froehlich for the 2.20.11 release. Peter had no first-hand knowledge of the early years but tried to be as accurate as possible, working from multiple sources. Please feel free to submit any corrections you may have regarding dates, features, and people. dasm-2.20.14.1/README000066400000000000000000000131401375233463600136360ustar00rootroot00000000000000============================ DASM 2.20.14.1 readme ============================ Welcome to DASM, a versatile macro assembler with support for several 8-bit microprocessors including MOS 6502 & 6507; Motorola 6803, 68705, and 68HC11; Hitachi HD6303 (extended Motorola 6801) and Fairchild F8. Download the latest compiled & packaged version of DASM from here: https://github.com/dasm-assembler/dasm/releases/latest For a comprehensive User Guide to using DASM, grab: https://raw.githubusercontent.com/dasm-assembler/dasm/master/docs/dasm.pdf Other documentation is at: https://raw.github.com/dasm-assembler/dasm/master/doc/dasm.txt This file describes the DASM source distribution, how to compile DASM, and where to get more information. DASM's homepage is https://dasm-assembler.github.io/ --------------- Binary Releases --------------- In case you're running Windows, macOS or Linux and just want to download and use DASM, please go directly to the releases: https://github.com/dasm-assembler/dasm/releases ---------------- The Distribution ---------------- The DASM distribution contains the following important files and directories of interest to all users: docs/ Documentation and manuals docker/ Contains files & instructions to create a docker image to run a 'dasm build machine' container machines/ Support files for various 8-bit machines LICENSE GNU General Public License NEWS Recent changes to DASM README The file you are reading right now :-) In addition, developers are going to be interested in the following files and directories: src/ Source code for DASM and related tools test/ Test cases for DASM and related tools (as of release 2.20.11 the test framework is incomplete) bin/ This is were the compiled executables for DASM and related tools will be placed after you do a 'make' research/ A directory where we keep experiments ChangeLog Source level changes to DASM Makefile Makefile to build DASM executables, run tests, and create distributions Even more files for developers are available from the DASM GitHub repository, see https://github.com/dasm-assembler/dasm for details. --------- Compiling --------- If you are using DASM on a Unix system, you should be able to simply give the command make in the root directory of the DASM distribution and DASM should build. A bin/ directory containing DASM executables will be created as part of this process. You can also give the command make test to run all the test cases that come with the distribution. Note that as of release 2.20.11 the test framework is incomplete and probably only remotely comprehensible for developers. :-/ The often-used NOTE: Several compiler warnings will be displayed during the build process. We are confident that you can ignore these warnings. They will be dealt with in a future release. (And if you know how to fix them reliably, we welcome your contributions!) DASM has been built and tested successfully on recent versions of Linux, macOS and Windows. If you have successfully built and tested DASM on a different machine or operating system, we would love to hear about it. ---------- Using DASM ---------- The simplest way to get a brief introduction to DASM is to run the bin/dasm executable without options, which will print a short help message summarizing all available options. For a comprehensive User Guide to using DASM, grab: https://raw.githubusercontent.com/dasm-assembler/dasm/master/docs/dasm.pdf Documentation for using DASM to produce code for the F8 processor is currently in the directory machines/channel-f/ but will be integrated into the main documentation in the future. Bugs? Feature requests? Please report bugs or feature requests on our dasm project page. See https://github.com/dasm-assembler/dasm All versions of dasm are written in C. If you want to contribute we encourage you to fork dasm and send us pull requests! There is also a vibrant community of developers writing games and demos for the Atari 2600 VCS using DASM. The mailing lists for the Stella emulator are a particularly useful resource for DASM users, not only those intent on programming for the VCS. -------- Legalese -------- the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008-2015 by Peter H. Froehlich. Copyright (c) 2019-2020 by the DASM team. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. dasm-2.20.14.1/docker/000077500000000000000000000000001375233463600142265ustar00rootroot00000000000000dasm-2.20.14.1/docker/Dockerfile000066400000000000000000000016061375233463600162230ustar00rootroot00000000000000FROM ubuntu:16.04 # Install packages RUN apt update && apt upgrade -y &&\ apt install -y curl &&\ apt install -y make &&\ apt install -y unzip &&\ apt install -y git &&\ apt install -y gcc &&\ apt install -y gcc-multilib &&\ apt install -y mingw-w64 #download darwin build packages RUN curl -O http://security.ubuntu.com/ubuntu/pool/universe/o/openssl098/libssl0.9.8_0.9.8o-7ubuntu3.2.14.04.1_amd64.deb &&\ curl -O http://www.tarnyko.net/repo/apple-x86-gcc-DEBIAN-AMD64.zip &&\ unzip apple-x86-gcc-DEBIAN-AMD64.zip &&\ export DEBIAN_FRONTEND=noninteractive &&\ dpkg -i libssl0.9.8_0.9.8o-7ubuntu3.2.14.04.1_amd64.deb &&\ dpkg -i apple-uni-sdk-10.5_20110407-0.flosoft1_amd64.deb &&\ dpkg -i apple-x86-odcctools_758.159-0flosoft11_amd64.deb &&\ dpkg -i apple-x86-gcc_4.2.1~5646.1flosoft2_amd64.deb &&\ rm *.zip &&\ rm *.deb CMD /bin/bashdasm-2.20.14.1/docker/README000066400000000000000000000032411375233463600151060ustar00rootroot00000000000000 This directory contains files & instructions to create a 'dasm build machine' Docker image that can build platform-specific dasm binaries for all three supported OSs (Linux, Windows and macOS) in a single go! Steps to create the Docker image: 0. Make sure you have Docker Desktop installed on your machine 1. Open a command prompt (Windows) or a bash shell (Linux/macOS) into this folder (i.e. containing the Dockerfile) 2. Run the command: `docker build -t dasm:build .` Note: this will download/install all build tools so takes a while. Steps to run the Docker container and build dasm for all 3 platforms: 1. Now run the container: `docker run -it --rm dasm:build`, which opens a shell to the container. Note: unless you want fetch a clone the dasm git repo and build that, it is probably easier to mount a shared drive in your docker container. On Windows, you can mount your c: drive on /mnt/c by running `docker run -it --rm -v c:\:/mnt/c dasm:build` (*) (*) This requires drive-sharing enabled in Docker Desktop, and sometimes needs this powershell command to allow that: `Set-NetConnectionProfile -interfacealias "vEthernet (DockerNAT)" -NetworkCategory Private` 2. From the container shell, cd into a shared drive that contains a local git clone of the dasm repo. Or do a 'git clone' on the container itself, e.g. `git clone --single-branch --branch master https://github.com/dasm-assembler/dasm.git` 3. cd into the dasm/docker folder from within the container shell 4. Run: `./make_dasm_all_platforms.sh` 5. This will sequentally call 'make' for all target platforms and copies the different dasm binaries into the /bin directory. dasm-2.20.14.1/docker/make_dasm_all_platforms.sh000077500000000000000000000022471375233463600214320ustar00rootroot00000000000000#!/bin/sh # this script builds platform-specific dasm binaries for all three supported OSs (Linux, Windows and macOS) cd .. mkdir -p bin/32bit mkdir -p bin/64bit cd src #step 1: build dasm for Linux 32-bit and 64-bit make cp dasm ../bin/64bit/dasm.Linux make clean export CFLAGS=' -m32' export LDFLAGS=' -m32 -L/usr/lib32' make cp dasm ../bin/32bit/dasm.Linux make clean unset CFLAGS unset LDFLAGS #step 2: build dasm for Windows 32-bit and 64-bit export CC=x86_64-w64-mingw32-gcc #TODO: fix warnings when compiling for win64 using x86_64-w64-mingw32-gcc # the compiler warnings have to do with default size of 'long' on windows make cp dasm ../bin/64bit/dasm.exe make clean export CC=i686-w64-mingw32-gcc export CFLAGS=' -m32' export LDFLAGS=' -m32 -L/usr/lib32' make cp dasm ../bin/32bit/dasm.exe make clean unset CC unset CFLAGS unset LDFLAGS #step 3: build dasm for macOS 32-bit and 64-bit export LD=$CC export CC=i686-apple-darwin10-gcc make cp dasm ../bin/64bit/dasm.macOS make clean export CFLAGS=' -m32 -arch i386 ' export LDFLAGS=' -m32 -L/usr/i686-apple-darwin10/lib -arch i386' make cp dasm ../bin/32bit/dasm.macOS make clean unset LD unset CC unset CFLAGS unset LDFLAGS dasm-2.20.14.1/docs/000077500000000000000000000000001375233463600137075ustar00rootroot00000000000000dasm-2.20.14.1/docs/dasm.1000066400000000000000000000035541375233463600147240ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .\" (C) Copyright 2020 the DASM team and its contributors .\" .TH DASM 1 "October 11 2020" .\" Please adjust this date whenever revising the manpage. .SH NAME dasm \- 8\-bit macro assembler .SH SYNOPSIS .B dasm .IR sourcefile " [" options ] .SH DESCRIPTION This manual page documents briefly the .B dasm command. .PP \fBdasm\fP is a versatile macro assembler with support for several 8\-bit microprocessors including MOS 6502 & 6507; Motorola 6803, 68705, and 68HC11; Hitachi HD6303 (extended Motorola 6801) and Fairchild F8. .SH OPTIONS \fBdasm\fP supports the following options, briefly described below. For more information see the \fBdasm\fP \fITechnical Reference Manual\fP. .TP .BI \-f # output format 1\-3 [default: \fI1\fP] .TP .BI \-o name output file name [default: \fIa.out\fP] .TP .BI \-l name list file name [default: \fInone generated\fP] .TP .BI \-L name list file, containing all passes .TP .BI \-v # verboseness 0\-4 [default: \fI0\fP] .TP .B \-d debug mode (for developers) .TP .BI \-D symbol define symbol, set to \fI0\fP .TP .BI \-D symbol = expression define symbol, set to \fIexpression\fP .TP .BI \-M symbol = expression define symbol using \fIEQM\fP (same as \fB-D\fP) .TP .BI \-p # maximum number of passes .TP .BI \-P # maximum number of passes, with fewer checks .TP .BI \-T # symbol table sorting [default: \fI0\fP] .RS .IR 0 " = \fBalphabetical\fP" .IR 1 " = \fBaddress/value\fP" .RE .TP .BI \-E # error format [default: \fI0\fP] .RS .IR 0 " = \fBMS\fP" .IR 1 " = \fBDillon\fP" .IR 2 " = \fBGNU\fP" .RE .TP .B \-S strict syntax checking .TP .B \-R remove binary \fIoutput\fP file in case of errors .TP .BI \-m # maximum allowed file-size in kB .SH SEE ALSO .TP .IR /usr/share/doc/dasm/dasm.pdf : .B dasm Technical Reference Manual .SH AUTHOR Written and maintained by the DASM team and its contributors. dasm-2.20.14.1/docs/dasm.pdf000066400000000000000000017066071375233463600153470ustar00rootroot00000000000000%PDF-1.5 % 5 0 obj << /Type /ObjStm /N 100 /First 803 /Length 1144 /Filter /FlateDecode >> stream xڕVRF}W#lŠI3V[B ԚM^EP%t!iY2f xk Ȓ ȑ6$$E E됄&0!I!HCPiI#K+͈HAi& KK&I;21d9DNQh NR((9 E\sxN6r G!Y Y VC"pqXO!8R@59#h`a웝m2Y$CP.,,⭥8Q`5a ?gD~a,s+Z Bs )FVvJ‰Qk1m. 7cph L,`fPHQRna ,)dWCzz\>罊Ҝ껴"i2lo; 9}Ӻ8+,WI,2EUʗtcJ]yєb9`k8͓bC,cw˕O[Ӫ~\ W`}O4ʡ)Gt4[OG"1`6ΗYU`ܳY,@=Y9_ljo,]<|5 ]V IRcJKLLOi-(5=Ӳ,JzeOok6=̰Ýy|FvEj(v (}ߋW?:.EfMuJh7^臩ŎZ_MXܼy>Νs|q6;OW~sq`ޜu&58:~؈HkeL8{ۗJG{zH^BkU{ ㌥˵/cpN H?׸oqY7K? (<qyߩi$t?*䇯ޞo;˽={]LK'~(Mס$ F)H3ζѳxM/s= endstream endobj 206 0 obj << /Type /ObjStm /N 100 /First 849 /Length 1016 /Filter /FlateDecode >> stream xڍV]OJ}ϯVBRo%84RHIjE#9IM.dyϞ8kHQؐъla R0oIt8Y5!1Xcc&E ja Y :IJ|6Ms5k 䢬Gr z6ޑj`uϹAڀjeEP=*ࢦX"r3C)&y(IIQ\bJ"A:^+gԥVV9N TѢC8yVƁG:Y,`fhv+`f$H3*etI[ ikiF0vz8#g]G` !^2DZ:(!IfA``TCG: (0:" #:q #]`P7C9ʐN +Oi3`+ x(yA8r&,RMr P!‘W"XUbDw|_Ҵ'+7lꩩ塺q<Wts7PNs?~̲hӣGE=zz;*Ne^jwmo,t,MzYPCũ)eF,-j"?ȶ,Խ@T-od洵LrwC9} ߍ8l/"mQFopu徢jW5+6;Zw[k endstream endobj 556 0 obj << /Length 228 /Filter /FlateDecode >> stream xڅKO0 >Hx$@nhQ2@&* q@23\s L1:1``~0Q0K}QIrpnn[vA#i6 !ր4% ДԼ歵RsWeWƾfߵוܡSV;L`A!dw;`Wgw2mUꪗʇMWnd b#$4Q<CS endstream endobj 553 0 obj << /Type /XObject /Subtype /Image /Width 400 /Height 126 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 563 0 R /Length 13220 /Filter /FlateDecode >> stream x}[SY׶IAA ^]QG;.H/i'=^ul3[a?'OHNI}_ళZk _>qx~~}wZ㯗]-!nó࿬򌅾{s/nv$n,1UiQPP^s&a]]{Тޮq}@/Jeyb&Ot-·z R haGgd0odc&04Fh&=6 hSPP_ff{ *G9b$.u=OAA,5+-|S(]/ ޢ)4IR]͗>Ntұ`X lMk\]OYeUfjkK渣Q`ZKSIؤ.ht((+wyg7e$)띩|>x^:?:<>lUGܯ#Jor&7+QJV|̊-&uѧtL)(I@ qT1 KzANZsvmK#^>[}rL}Mu}%s[[n*jƞ&,$ofut)(|5#tdc5L=Ց{I7?,vV5"=8{w5W%b#͈  DzབྷFQ?r LdZ._+^ӝW͑8-H2f_ܟlqsQ}h:(JKGeSP|uxol.S[G^u7'ˁk^u/}E#m1MS溮3t+r+T~lA&e94F~zk|EA:y,M 9Anmr4_^V$9QM$2zN,0Kx1D[KuҐ bw )*OQ}~NbbT7R܍, W觩c-3rgCSe]Sƚۓ}7o$$ gӦz3 + fA[ d9z0[dMG%[{N]pV3v6\^}hlQi{8L!rK8a+ gwc&QRs{Aki0^$2rB2F(/4S^B^tު?r^>*Ρ|EA~0[?ʓ✕EO& EsQ9!DF`&;0K-'7u DՎ;(( "=o!ss~be9i%Mg[UG3Kpsk0W %|k҉Bh<|Ϊ@|lK&.u5_aoo>KbmiYX,EQbUjQo7Xħ␉H4˨-yHbMTՋ3| ^JX2?0{ߨ,XzA)o7?98RBb $&I:,;S]j8^}K0O8E|EAf"4F=9Su̢ؼ :E7 Wކ,u[g#+ Uw aTS ۨ|N(^'l?Yd|㣚Sk O@heuʷ&+&=a=+8'(aTmx7_oJ.oK^\+7y >%D+sW+lB]mQ/4 ^$%M0߆9˶rxN,եW>"yN5XD_se9S=?dW7"!,"gV#^ ]f:Ю2+^+( Pg{)+|x%#%UX$AIr\뉨K8|&kҋ+\ȫ<$#OGW@lu">0sr*,وRRb/:Ogef8n~ӝ^l"VzQl%)b4:dB:T:_,d&$8D`@۱-TvUBY rΟ ĿEɩLCs*B@)c4w,4m%5%Ke>ƚ.0<2HBA7$DPߍmP4WP?N(NeHLNW Ё g*&^"7d7soG(AF1 ]Oe5X;Ahf{Z0|^>FaҒ*dy&ӄqx;GW4bևYfIw0y,{β` _fjtA8͙F&{|I£4Lu,t^Ɋty?-c׬<^yE:$FmL"='@2B0EP(waدIѮyΦ d ?ߍ>B5Z+ vч5Q>j ]z.ty0ox|4=C^\RsQr2m5A%B>G*]5f~t hH@T -ݽeOuH}U[^qao'C;OlǶZYԋ3t0*aُ:)ca?x2(+XŏuqOYh$lSTfKHHSw(YW W2K>:&G8kT%FMX#i)`OԬqYİiwW+߷Ry0zˑ"6\ eWdRSU[48`&6#M~-ө;X6ZniF/._y])gV< F8YE2U?A(?>Mu@w~f1ǹ{hl0qD{5cW 9_ٕ}{J:Z3VY74G1 Vi"Kc/`&C# oqkWW^^a2}ƎB3`Ԭ_BzL5*`i,|_l Uh+ (_}0T_0r"\t}❃"nͅ\MkҙaMA^h[C\*C9Lj˥ yܒ8W#\0 e2$ptʼn萐rLqО[!n0+W _$iƚmkLUI3֨hzj/QgN L{%3Hβgo Dvꢱm, Um2TZAyD-kEcyTzoz@^-.䳭X+t5YOd8֛+u؄ˑ:PqUFYۆ܌Bq/g1dn9"661̅]Qwj#pWqVhSd.v^^u \s~F+2ʬp(`aH{a<=H6N탎1[D!ZDz@WK- cPvJqH4R_lSM̷/A_iN6sl#l p0:cp^ ,t:xgjJ_<8<0]Y0qcxK!(_}; NOwdN5t3˅ydG݉,Z|[JfXwD\3^Lﱶ IƚB0k=h-t|\%.\| !+`(9GBuSU)_}-07rvpx4':q \^q"hxw?S Q{b*Ԁ0Fx:U|syAɬ6 CtQ:_D8LXeM)La#l3V=~G\<;=V~oe6e&t 32 Q1i9̏i4c|*ԅOU,l*Sgl Mᙪxn MABH)Q) ,}qYCK|Q",N5x1|V%IQĪt^3RtN d;n_A;9jےgY.7?-ZhvEk@;-y5gyr{̨SjlYDnk˝Mn>F6=d)_ksq YeV,vVPV9:,́r:"t4S!xbv@cwRN~plL"#K+~kh[/XKGÑ3ZEC5d>x+ɥ!sWPjrga#CKM]?OvNr-+d-\~&ı N893VOVUxՙ␦$:w瘎$t%(;p bQ44͹Sğsjc6 |qͷ)@ mJaTqЬ)V ԬY,Z.gVXkN:y|JLB0wf:((G$5rPuo]l{-<^CP}C=fBfIs3/n60]qgzyx*˶[G]Q^u\89 ߋ#obgJlTl_҉WE8;FE,`kʝdس2Hy\$ꃆj|喝*Qe1⍌(an' zeҘ5ShVdyEA xdeoﰆ"Ǣ^Q6|Y0x$VaRNǻyEA}Pl1\#FG!^e; ߧZVH3LaJ %FC8e g)(("㮣Ui*x|=FoKͩ%*d= 꽯 2|G(_[̼x=>~3.^n{WTǔy[>C|3?G5#{wNhS8wX̊-Ӫγk ]UM$CY񒹊a@v DnS-t)J.c޻ƄylWxN#Lm덭~_xhk|8/ze<Ϯ;tlGʥ>E芦^%%Ԫ$GםqOUUk5ucX jN0\,-1>Ow[8hYjNKvOMmA U=6 @."GQ̊lF T]xj҉ dv" Uwk@mug,ao4w*a?Lhc(_劂b1/aqRdmX(+I'I'Xˋx\v g4ECXeتs-+72is+wEa^`Ulm[=di^ȯVMͧO9s&=SJV+* hmm={ݻwB&S(EEE۶m[2\87?O`^f]w j-qQ>~#֭~eq61V`-VmL^VVviB!x$F%%%ǎ۹s']0y@Y\ g޽[T`9ȲgY+RVɡ?*oT&ty%>tkaw>\PZZi&L(((' #ebbbZZ/[>yѣtRZ|QΘ\l{ZCxt5{CDiKkGp֟}l./(6qՎQ21(Qg˖- ?x`||<?Wr<>}mܸ.^W듯*…Q6*wY噑X0w,7֞ ]7ZS>0V7<!\BFpp8W1ʁU1y(Ŭq=_-%fIJtXAc'Ի=8S1U'gL]! j׮]/_:44D̋7mUBf8x6ь)YQ?_st<L H&ֻ|,MEJg! 45Qxii_ `ܡb>ojj:|04DRɝm*++]]իWsV,:κ:T{Ν.Ν;mG͛7tvQUUuq$dٸDq$F~M{ %%̙3L***CCbelpph}k G2i$+tǏN:U:_\\OJJ:tPcc#?|@C[` bq#W0҂o q&IXXP0vET~ O0IXL: &ѕ={߿zzz axK W K@ooʎ fo':T2d@DI~BEesg~Gw,m[OS/~17VRpH kmhOQ6`!} |/`f>SoYA}6P7gł  >Ϸ!44/BFaDP1 dZ '#"Myy Dv .#_mXd@e+t,4&/_GhI #fu:PkEVP0$/ ٰ ML!'1+I˝ ۠ᐩPs@Y$[D F!tf#{۱lAGaaa!ڈ44%>={FԫSN]|+''B |7;0+Iy"&iAUt#嗆 _萧W0e4aȬLL MĿ|:X\1Wb" JNY:a*h03rpaAkhv0꣯@J8&@@"! uQ-u߉h07T/Psl`IUHP Ik.bQGJ$N;,"/"BAJ C|Xx?Jw_Cn' UJ}^RR|PyT8!vGEˮS\Y¦k8c箮/oFYD1(FAAi;|(ɘF%V؜]0:}4ey0%چe'%|ӕdDRu{f:2? dX!ɂZɐ^X! g|"@A1 9P\:i@ĩc y* +w "6&J_*$q )~GW"Enݺ~d9 sE@GxAj~zɓ#+|C%dŢxća$iy~$vu$|}[Q0m|X1,3iZ/ٵX^<}gF!|yppJًlfIݨdNh$Xb> stream xy@G\I\HM\ynQO%W,,}Z׍ +SVZ4Q^DzJji]EsE 墒UvΛ}Μ9]"6?;gaw9rA'ޑ4!,nicc$ 0}mRM245uPrxss5;);}KNl+Kmҗe6`B`ĩr`W 0',yDBw$?ҝgpSrSXb{/ tX۠fKU&qAeӖ ePr)KUsZn{Kv6+-}ƫHKHLTiqJ_TUm Fl3{[WlBg\Rl--VB:bvC7i{=A.?W *`nb=y0GrA= Y<ܑZR71YQ(y+mo(0*TYa0/O)=䉊JKW9*<xaj|W^eQ)s8"*f0']}WTU_%ÔτJ#욶:gx_J{sRd75ްxuy?oY&+:jY< JDwXV?jQl㚭l-IJˍ{dSbØ4A57G,{ߌK0JCOۯ%6~X_ϽsQ];^Jhx8NtGpEߋ%u1*/K3' IN<×HEO?\ aOu1I $-ȗ{4ȕV4B,Zl>@7u b3{&]ͣ9E%jJ#QYtCfRs&[ryLA',,1?hUNFfZ<Qx&auY)eҟ ,dlV"Փ8z܋9'}@a0ָEUx R׉>Ha䇔<A[өV\(x͸?$IHYHfn6\)>ۨdKٺbxdt!XÞ, >>!v3= h_Vd')y,ƭ{O^\c8N4[5#NV*sF]ۨ=7GZXΪֶO<7b<R$ ח~ⴴ4#&4J?iMm< 8Qoy}iY9f0'p AL:;Y7nΧR#>rM VkUB"\W3<64#? (d5WX>-fxtâWFG9ʒ|*xf+_!8vEا拘W@rOy6Ɯ1)T_}Ϯr:ѵj~`C)0Cw9=_8H_!{x&)o _^>֚ CJcu^+Hx>yqT~IB& 7Hym gE5HM* ahbcݺ~;Ҵ|6g $xG31Brp'_0U*yD-j A ʝC<*6vwH>y8i;[m7_6p qIUeag<(ªЋ)z<@G=mhz塈Z'? }v"y%iika[і~S'!R|[ShӉKWy{,=ZxgXe&ndލ,V[ehW2xZx|!q  ;#Bc]mo/k8cyyj Cx?Pw߅Pey'f7y08UG#(Buyx< JfhᑈGA`-#c)/1Z82j=v{{ I '.X+cX9%(wSI3NnVDMqq|ш~ u|xY?J)%EΙш5O="V~!ظt7ngSwf(Ynhت fjwdMrv)̼;?uLFA<'7\r+77Lm25W?X\{3t^y=4x|t2{\{鰚)wKrKun7_Zg'>XuޣHyݾT*}f<ʃ@!*jCLTy3]o;&q<1Sugp7C$W{j0-33KeD00ۃ}}=ϼ~1ר5/fy~g+ 棏w${-JIY/=ǣlG0$|B!e?^\\]j|tp΁p j;NKahca15b g[Ptw ^o|GR hţjme"Jc#6vyu5\PJJ1zj%ͯ2Fy_\1[)f7.;s-˙vTޒml+-, .y͌zw;`]+XC-H<[Q@9?yPNK8Vф) hԏyǏMvѳ'Ȗfi}N%M EHV]`0g1X#nx2":ay04LdFpJ<Lz8~7A,.6(` @^f7oUA[@.*gq L6sˡojXyy&<6=LXy˱Qܔx6 ? 9>rLcndoX:(?n68ͣ] };1*0h~5߽-Ql~5Ạ#Sev$8K}yocQ,i|b~}ڟgxп:.?<h2SQ$B_p1L~_/.OxjI홋bp^ONR$[k~ldEӼH:EEtCۮPP% . 컑|ѡ$_$\ i0}uvъҋ =Yp~Hm\xF(VqVr`Rm╨O8jY6 qyEtTS]Bg'$4TS=.ؘ@9I.VWsr<ĜCY1<'Cc1P9ȢUo϶tYyeqLKa'ј֝!rj4ԝF*d쥋[fSf4SmH*wF. endstream endobj 576 0 obj << /Length 1269 /Filter /FlateDecode >> stream xWKo6 W 2[~6M-lʌ ٙ"$")6ŒhR"ŏ"X|< xd}0EċE?EZ~jwF-WQxm_ E +"$tEϪr]ثnTڥȽRd;яaPxʱANN[bm:;/yѰ;hꆱ)WrǑw.KT 7Ь֭vc]|;N7eN,dTIY9ײt >1 2?3`qMڪ荬O^($ۇF> D4T?ɋ@~PaO1i:3AA[np)u#82MCe.< ~IlՎm=T8TwZ%mةRBW@C7DIz]z7i083́ӧΗN|Oq/y$," ^4U*U1?dj+-ە!{%Y_kx Ëg qzk3h2$XՁ)b(A!2'n-b=r#HE q BL>t057Cemg,qi3D r+Q˪^* q6;q 7kD4M1psDN0.)ijGGɩRJDj$p;%Vj&Inɣ=%ZMGRs:H@|(/C/"^SY#`甗,g FNڎƺbgCZ׵& 57qcڑ=`T°3 -Żc"e#!:Dݎ-j&LODžJgn o3θz *dNp. U%Bf\ uFTuƱ) kg5O'#-9O}s$~3smu}Yj*ۑ?*H endstream endobj 597 0 obj << /Length 1888 /Filter /FlateDecode >> stream xڽXKs6Wh|:ML/{%`lw,JǍ4 pF"Z*:w,qVY&7XDaf*8Sp%h'|:(GLvJ(0c/aUzԆj`HE`kX.(rec8UdŝRoG8C[sVq ٬iP H25Z k~]͹IV7@Ԩ Νh2Lf]㶓,k'hyanQ,l7hC$ D QFl\ymS0Cf1Z]i@NUCY\EYcVnlj+[^v%)D# }ߙ0QFݓdID9}3+=ǯ02kkQp/Ӡ橙fZ'_{epV-"SF3jL >mWO/XX׺n&{f|Z@ƺ+4J oaZ物vU6zi|-y1dJigqUD-?!৺~hRCv\˘#CGMNu[ƓMrG۹ik{[ޡ%8t[ e">q1J;E#%{v'Qi*J2J抢2hd y_/X%l! |Ç;e)YD+5GZ=N{t%DCq8GSMh"u=\=? iP8|Ȳo 7-{d]tHGUw6^l'@DbseKs"nhb*^bhR "TeyTwz|k5Kcx$ϐd=!9+ބ}Q-l^hEUNEŮySƲ zZ8𗐔PJ$8 @k%(V2ah=]"gvR- 5^?Y~K@8j\ja-ͱ: 2f1gp endstream endobj 407 0 obj << /Type /ObjStm /N 100 /First 859 /Length 1782 /Filter /FlateDecode >> stream xX]s8}k[ M)0CnKjgl-\[IQ$]!+RNZA^$$*$EH昗V4%u#&=ZAJc@2jGc̡#\#79 Y#xMܴ1dyOb_x*rZr&2Σr5X4yg(HS)P%`cwf) i!dC?P?i@ [;JɁ t2.19jZаaR Av50#00&nS°eaxJ8lh*Ԩ0<@-3%<(KxAuc$.} 's#&rV;X91R1&^^\F_-o ZmYeW@ x\U] !=ZxD<e9y~T,7q-Ų_#AV# U7e꟢LмN0o i1rWȚ5h+3w|G8p˦Z'os~??=`,d[b=/ϋLɪhZm}2/DWԫ=LjV]U_Rck^^}!wFN(;,A,){YI6iIWIU U0tZ"+:ˉ3>"k6_I:(mVˡgȦ붨&}l2͎ˏPՓ#ʞxTĞ\Ӏ^-o Q0vmM;]Ըe#^j'ӾK@X&>Q\hZ.Dmht){_հ%}j3eZtO({]^,Lhvo/֣nx6L+̱urlGuۈFC~ɰ_MW?$Qv`͞fϲə:# xG=T El {DE׫w~sz\Cd)XRަքd6;%4緥KWZ&5 wbܥ ЕF4 Hx_J#CHQۉܸS}fVS+SO:*aqA%q9 ]*D2DG'`-8:AŞU" <4m"q *>F=CEh/Fْ%ۄDQdo5[d(& -/w'=;/w0ߙ]L!&7u/c?'&僌:&6k#~B6TX(+""_((lp(OCR~O7w"Qڨ 6h3X4QT:C&ʤ{c;HQQoxi<,J= Tq q3C W> endstream endobj 637 0 obj << /Length 1739 /Filter /FlateDecode >> stream xXY6~ϯpQ +"R>Il܇-6YrEj ?3vuڤI619>*'僈ۧ_t"DX$,VP̋IZHɢdT+ht6/dB+}D+b&typ:Mr%4"Sδ6'^EX]ޖCQT,1VQ/}vG)iPܲ|ҥ˼H1&jKOɷ2.h޶X iR՗|Y|D'`'xjLoƒϣv\LUf/3GTWAtXL!;C9 Rkꚹ L " lu'8O@Tٲ3#D|-]8j. ?B` ;1r5*zk08-KxdQGv`=eJIX?M/o_H 0Ƀwޝd)hX˳.kk݂"%)[iUrkۣf4tꘌZb@lalV5VOYOv;@wftX \T!>J}ݽ'_wN=@}Lؾ|3180S D!8YF<-CIEu;E\죏b U09 xOϿ2 3N%j֚Wxߢ3^jН&Lϐ1@32\pIR H,>`o'!Ef#z03>PÃ*i/՘YS˜X=(Mop5) Iyx:z2lxڟc={9SP:gЬܡ-;^geͺfv^UhJTy3N]H䳥9 Tuپ~xqWuoQ'. KWAե[ݭujt)[cvwEFbtwd͈=nנW=COE>=9a;Px<)}=A{A_>z;?Hc _F 2Ä/6 endstream endobj 672 0 obj << /Length 677 /Filter /FlateDecode >> stream xUMo Wp{l&jRb^$ [7j͉f73ozD9Z?m..K(fhNpYV^7Vk]rS|}:H&+Ɍ'Eɻ4+IǍbr G1^#ȢsH޵;mx*:FwVֱS58DByv Ix "qWorEW CKFlxvKv0➢E'wuU1/0HAbKuBPM/67NĶhR ^CA~E|[7SzJ endstream endobj 718 0 obj << /Length 1269 /Filter /FlateDecode >> stream xZ[S8}WQ錅O[ -CҧnĤ6c;_eH$,Hw kn!TPXOZq^=dsר9k3]ѝ;㱦f`/ N1߼2^3Zm5EuT68E[t"ɫv[W[iFꇼ9:'|C0[3ssooe#@r#fwsGӦ#zCm%mY?Iq((;0a3 bMhO]S_qJl dxfJ!뉧[sj]XeΉ:W"ۺmEJ!zҜ2.s?i& r^6^ZX`[p$7Uz}w3Mgs2 wD }77^*jY?tmBN 1}Z?IwjV*G9iOӒ0uS=gHP?s B- ^> stream x[ߏ ~_")R"p?k.y mnzKlX@3 EQ'J‰*%ힸ %Uƽh)kԥyM*ZMD,׶IGH!L;.(QsH'$q1#\0RpQ{eedEا=I OBuM"Ē@(K\GZR-lRVƜ4/P@0 ѹ8dXդ!K9>b`1ڂWV!-9:) r͡:x=0-n,b,(0M2Cpj"!dM-m }Z%2)Nk^5XI](' =:ΚqgfkXE׀a=}:ŧxr (TJ[(><B/cL!Sd t.9v{ 3Ԓ^ {Qf ;" ƸkV ζ /`O6y$wƊ[u $p]"ՐH nj^8m6 qB0V}#Q~&Fz4eUc؆RX˖"BД/N `I7l4rGX=)#R,iͯ7]$8?vs{xw߶?=^m7V7iH~O#FȂʸLC7v >c4_l~ۦWj?6+nw)2u:yfs7OҤ5u 7s""'u~HZLm-}hP}+^Gkryo|ã}xOF/{uY;kn V_h)`;lRh*K{`b34["{F #,6S+Æ]"M0dGlh!0QKJ[O9[aUB`F_a-fzRjz֛L/eت:, pǪY@6ғ·9=GPgG߃#B`FCH۩ycQq@1(-a`f LptmziCseӡBıvgٱCx.(UM>C j? Đ#p7k6Fb* / Te>.E2#\ʧ|%u[97QuɷCy>Cy>N^TTZ-VF[GѶy4ѐGC y4af(}FV>XlKP6⒒;X(FE'*h Q$QN$˦TCB02KL'a. ftD1EjhKs:>c14D9jz#PN0L5b$!|Eͮڏ9t1k,x_2O9ܽ |qsQ}mO2Ej5Scq0jv4U!l; 9X˧砠skR)<|fp8{HR69gY8. xY n z)ODUySuTU& mАTYN3DĈ@3DЉ)k%XH*./ϡg!ó 003/aOXŰͰs\~TI%HcI0zy0qBloRB$gٯ]LēH}dQ/~4˃Z|QRŽe4i endstream endobj 763 0 obj << /Length 1121 /Filter /FlateDecode >> stream xZ]F}_#Ha2w][9N&iMlv &6 0E#fs=̀{ [p|]a 9,`Q.--of})F[ kX[nߕ~TnHr=ۓ:J[O51"Z yv6&_kzp\ZX^XB*/*4 [">/umqlcFe2*i>9BS|"F 눬D$/C$N$kȉ9#i>? RZr*އ6}.AZD2Ic%eEg!K௎JDJސ" .C2NDb."%gaidc~hAuGl>'^{J%@52JFLG؉xWkjkeUZx> stream xKoHAz8zx5#LF{plB+aƆ0A~Uʀ_w6& $@Lfr@2n?q|5ECޑ <܎Q+ ?ӻM\hb⭧];}o, ,Ax &-3)::[\&@r}R2fBd#\M07G~m1(Na*tGg))ˋpMt dUz;z=H]n PHxfxbP9>h+|UU]&룞CqrH$WB%XK BU9[nΜ>ZӎW'F P5hOC KsGcDJ7~mVѕ|tCg6g{UW42:R}~Kfe+ R}/?8g%^bj _`Ցs\wm@2Jމf3I!C询=NH5(aj 7'Emǜh ώP;DfmfomZWmd0|c]c=mlZX{sz {sI wOaWfy%AQ2q߸O(47$ ĖM3H@lR1#dyM΃F5 < +Yk\[5o`A8wxWuf3go8Mun)J# ahc ~I&y7.d62ϒȜ?~UX$Ք|>1e?0Xl>Az^^zY*;7 Ar;+]buQ&'pAI6ĥ->$waBk[uGJiBWWy?DQM ]Zk|,f,9"u)oCz%߀Aࡧ𤪌xGr,!h At;DᒆSl nl|o endstream endobj 833 0 obj << /Length 796 /Filter /FlateDecode >> stream xYn@+X ȼ&PVwi8<Ǝ1Ҹc:sCoA gӓ Bb {0Dy\1M "?`<ɢ~`>ƅY$Htm evN'?TDCD;M`"*(R-5 6*0aHnUjvKA! h%k k:n"HHv @-2 ԕSfM PFqqqZ*/dOd mDYBBlYW0վ[1'!8+ե:΢\YV7%ΣY uDfo8 /]k?`n*,,joT^R緦ٯ.1E#<~C(C܌b޷Ε9˩6ShHRh4EWZkaɇž)MnŌ@^֕M۾ʬ1ЉP~_?6x6zQYT>Y6˹QA nBGDwZIf%6JxVb+V:Oۘ0yk zf\aA`e:,,4+Z6&hlRђ_b6:Gw\ UbH]~b%S#vOwy' O\})e3.'D endstream endobj 722 0 obj << /Type /ObjStm /N 100 /First 920 /Length 2738 /Filter /FlateDecode >> stream x[[[~ׯcBqn0$qh#CZGhp}9vmÇ"xV>ÑO%yiMSIʆU{Nai=D$xo;TN$5>c ^ x\@kblfO +($7۹`5P '!W^R[88s;bt zxSqO]-u]6kl=Ro :@QObm*6n2o,AJ8Ǘ#zpx?vo+Қ̖̍UB}z$_O7/oi݇_ٷ7Y_}mJg\ր9?\מr-}M\{uTeM{i=yph daYev^FG#V)0-4Yɍ*4= $5ùdY')S?/[rGof7gǛw7/_9$9~:?|!n~L"8Vu q!!7o^$Yڿ<|O?vw}CH\wn>ܾ9-uy/^p1-W.pϯnA}' Es\uX}m9qX=dГAO=dAO=tAO=#9 z6٠g z6٠g zvzS˨td^<|䛛im%wd.#Yme1j+ßH2kn3oqtx CogX1RE)4sKHz]eHBr/9JIۋȐ"DfD}.bM#[ 7dF.7ω%Ȍ ShY/pe"'B\abQgr+2+-Y+J ~+E:pxEtN1.5>ֶg6QFRa΋f: (?)J9.B./Vœ 2 j=zCTRGjj/!!f6=ˎ:!Js,L(zBz8|1SAG}kd6$kL\;+r{h%NeK8$L'U`EA,MN@f ;)Qmz:#+t q&!0.s䲟p)x[f(Y~0hw5`&t>R{Ss^׀R p(z)/x!.F2Sf2T$Whhhhh烞z9q|\6A zmk^ڠ>Az}^>#DVضDkz3HcN *:]7:*aߪ{"ٳ\1[lkLh}T{k]fL v1Qt"h",Ivarzs0:ݐLQ~0 ?&{)tZf$ː#5` Չy.N.S{a`يB'0ۙ2P#^f!ŕ&3HT_f{CRhHi Ik &wnklZٸS|TLŘaJX}Bc,Ffs|e9k á9eл[|N<&wvR =YfBk3B ."_FWZ1C(Y6oؐo LmEDrł JB+|HK@7uM`U )qoCkLFRmiK]̄j$ e%]m|/0  F)cԎR_ }2h~ro'~Fܗ5h~eďM1! )c v{P%-K(3=#*W)0GL\ :_ts3\&8?i9v/X}mIec?Xe:V7& z47ƾ5uCm Q1DuCm Q7ٶzudt1bi”-+Zmp+F^7>+I Dfdd1 UkLn`fF帖Q_ꌙ =0^> stream xڵVێ6}Wy h(/Et4mM\EZR}g8^&@`"ù3#.j}AK%U D,yQ*cebOa$ ;2gC(،BYq؍#g֚n}Br7ml~ "!x-~iҍYݐJ80"H[]<.rprIMl_v"x>~ߩ,\/Nyt*Yeɡ)2M2ZvfY~ib2S=:DX Aą0N^dGU`G%ef4@w-M pP 'CgA7M_aKFm&g˘ yU2UG !Rs)( qvhHxrnHʀYj|t߬R] dz]3-o'̛8v {ݗ(^OA hϴ׬};$lSۉ$ۦcc,oX ^Oܫ1qg_Tl v&HuNE(؟80zTwBv mW@L,L\ܶ0V4jsz''BRGZzִ9 B2,&;O7׽(5j1s萷Oػ6ӓq֍7;jq9?2fFO0Ir+D{%8B?Ɨ-Q˖[2OV~>-Y3ݞ ,em;l)ɖ@_\}DiźZ4avͣ2ghԦy:nyul"ؙMmj>b>&JOKf(|_ v} endstream endobj 847 0 obj << /Length 2453 /Filter /FlateDecode >> stream xڵrH_G*jɣj'n&l<&S[D۬D Iد_MH hMCoVe\Z Ҋ9ՑA|lR7 L I:2`RJ'`bil[q"r6Ψ&cQ+T#'C,[4b2--UNn^չCl1ͪiQI{TsDD"7k98"tgF#{pC`aw&" {<:Auvnt7cBYBu,؛|]bH@PK6f\Ië7Q4%Σa?Tr"M~PZE[` ]u#.ԏP|畣Tش’& hglu7I'R`F1eD׵>ZT" {iQv+PxV,r{W蕣Y?ڊHӸnl70+;qh\Q 0FF,qf &O` K?+!gX',,gXpKGʃ(NtKz&Ҵ݁J53ȸxxI}B^;\$фwk' 3Zܟp)=aˏ6g 0]x" 3qBu3)-ԁ4Eϡct5_o%EމDP."*ȺgÄ\f `Mp>QDP¹`EpB# ޮe8!-sJ/4gs"">L6<;P\L*f CI$$;`DH|%&يNWxxQLDe-s}5-gU,dTU5i6OV)^ k;oHwu⤇' F3mHҘ5b.iRIux-9D׶nP>^ uij8^@3!|-&|ԈNESR&a_T_~5=R3k(i+!x0Az껾a7_wwD09{Md>ԱU=[g@i 2:kJr3ͿlOKD)[@'c` f:+z`8з95E#:w)Ǔ:ֻjػq(Z}2%p{G)ٽjW0lAvJˍںpbgu3v;}O1D]<,pzf$G%QBQή~-zE"Of%H{H؝Z aiBAA|vIH^` tMP&-nFN*kʪޥ0>QU/Aǭuh^bۏ|},&G"eN] eWoznNӦ*\{tHQN係%O#eguWw.#a;u Kkd ȆvL'"ѷOv[gWIeNb endstream endobj 863 0 obj << /Length 2039 /Filter /FlateDecode >> stream xYK6ϯ`DUY 'ufg3bYĎ߷ %2Ԍ^ڃD<#xwoY4(Ix$Fy1&#XqۻŒI.:woAN""6nqӦ%*ZZ}V>5C~]ʡ&jSz7ܘ-\nj;@FIad⇬զڗ~jNMήӧl@J9[őoRv0s(F<³JA_<2(f۹{J [e]6n/~tMШMMmҖ&8k1[LhۮluV߇ܢ2tVtXW/,ZAAZ΋?Ub|Cӎ6Ƚ0|\)Bұh[G5m-RMkVUYz p*bJ8ǣ(t2XA|cls֙ m|mS*ӕ)Z; WD#28a\1VP PdVKQF]ۻtp")NP{Ry^MN=X@4&OcP{ lS16s\cG#Ơʑmn-=4<ƞ$^^h'` `>MX RSz;v@J9fu͌pa}~%! \-xߟ3djUN BY}\^޽"(? \_{̇_&JzznF yP{[iXX t,hDgD&(ly6~9BJ>u, pa꼀ϐu 3D=QO= oܔzO zݿ"6eb_w< c\GD2 -%oVy'^&Ò.m>P{I=BBD>R*~Ri]-oKifPއ5AÑ0JDaT+|jLS{d#EU)qMe(y}m_4v}q\"KJSw 0>^JccB:_\B1 3"̆[:ĝy$x'p|oMjE@\Y)l*_P0+ݎcxmFr}pks>DvmS> stream x[s۸JM#&o:rݤ4}$@KF"}w_2. ;3tx5$y׷  C($TFr|K kڭ&2(2v4d(27)}?e`O\6)lm|a|[܇tI]M{KG "?RpAm%j̤9R ,@)Q1CtV)hg Y@@U\/2 q$ J585Sd J I d:y$/%dҳNN .֮J#y'Tۚwb1B57꽍h6nCya-_FJE (L2d$e6m%{ Σh0~$Q/R$ 'CEDyρ2Sk?I"z[?[s~S}`@2!w;:b$# z<D2l]D IL꧀ruPapuaHuOz&(q ՄғhS%:(Ѭք"5sc LJy𠚂i\% %ufn4C}s{@Q30N87_K-&hݜIVK2+2"K|?k㱌-$^1'½zEəi拐/BZ>=MHFeȋn/6^3ljL\ Sݜ㌉S&!9exaUY& `L^M=EıwI3NB;yA$vgc݁lzH7'!HsbVdfY&|VLȰ#5tk@B/zR+U m<| Zu6{T{Q}]ۃK! W l•z]yl1N"pHUVsk)lN8D9wHXE,:z;$.њ]i!O5zF@ 4z0sWLuKEBHl 0/ d5TlYq-30yiugvP s;UJ).{J2||"V)d!XD8B>~s8ۇ@g5<^zCe ʡ wN L~-Xey?ɿӝYkOv<4Dx"8!ᮧU,a«RE HaÛy|*T;x_ ,b伧G?t9pjhӵ5t~kOk~!e/t܂B릟"B #]ڐ_|ɏ+)1voC[' Mg_<5Ec'BF>ws."4URbu߷ڏD?(?-fR>8yOi\zy%Ug evyRhygLKS*-x$`b #5VDԞѺ3.s~ :uujG,~j͋CZ`Ge@Bl O7?؋% endstream endobj 904 0 obj << /Length 2656 /Filter /FlateDecode >> stream x\Yo~ׯ`_FB8.d7g(i$j =57EJcd,n63_|Suuuhq_3|[ ƈSWwX+ ,aWoէe=3 b^ ?V8M56-_hq W[,wg|3ϵKJtA~h'̹Dq&j G;d2̎*$o]u[K]OZJfi5DPUh͈e%[e\tEsm=쑏-m[SľvfLC҈{3MrQ ?P$"4N+ό|fi`iZG\L9-o@iWXn8%\)GNpPӐs\^C>-91ZqD4WQ3@y{&1e,E,$1LO=rCz2ud5?|5^ΗЮmWi'Z!ƣ/sVۺX,?.u|,HPI(=8mA u9_O:|{@= ƾbGa@< ;vAd5XSoԵݦ]l5+wm_/7wr_?n?ԿVm74_ W8r_u%5=$i'+o6 ܐ q'9'UAULQFFSTMeo6v:*8b95ފ hoMq# 9MK\lﳺ:V 5N//kLw׭NoYvzvV=\`y[|^zbj]P5!w $'`f(01'Vxŝ㮔&q境y8g[bKpWP]Bnޙ)Rdg u1 5?ǝe 9t@[%zd[ 1 m-?ǝ}d 9빰,'aSneAaK/hGE;Oz;S<)5vh#n5|:/f9{Hm;,#u}n0&("$tڤmi֤o=L^\dcIqOrAnj5-o뺲ݬbUmMmuyY4"|VkE쳉)O5pqP棬aj,7kcZ'ھV+ɺS|\r><;j469!O1p8TޝrC蘆&ά22 bgA/d XPSM?zVd[9YZáBuLCfiq'H:7(a߳"]^`&]ZȽBび9l(;eUmq+4y"*gRI=€ endstream endobj 835 0 obj << /Type /ObjStm /N 100 /First 877 /Length 2021 /Filter /FlateDecode >> stream xڽY]o}ׯMr|qܤNhm<؎p6 K3+9Ŧ|6=Μj.!9d%P-5pn-< pB3˜CxL'JȥaI’R#!\Bno@L D%*GIJHX&*Qj z܂bhn `ŷ ._ &TH 6̊!6-r.JI:q9|r#Dƅ[ + _TJs@}R'\&Ao4(5( eךqQU^Ю V+hS+^.𺹎B|,ʍVAu`m 7 B,0.(B@ X\ D1ya`cW4)FvaBU5fn5ظ֚MZ¾ }K Vg|eweg83ڤdq@fd dx߫i_^l1?L x3N}fEKb ( 'ax5{7 lW/f1< ?< H2QjKݣ4)GgPb@7Vq?^-1-2d;(I $1Yݮ[p |Ϧdܠև5"GBDrqZֈU#KƲXT)& nG Q! xLr %Q4t#وpeMڿZ2Ȋtk#c!:?|gL1wIs _&<]ELTX (#7fc%n=FzPPH`J!5A1Wi})zABD^ B%!hJD+K1Y8JBR# $l×}Ee0%'17?Xbyv}ruz> eΛ\2ūb81gQcH-qǨIU`daŗax76"\.ףd>>Ǧh/aT4/{5@,K?^ގVCo\B|z̕LT]-@+N}?}Z,/<ϧ_>#vts/fó_D 8DEƜUa˸|垸p1Lq F(P#Z.,C EoFXuV{;*8.9t7na5>T房N/b(GվsV'9w2?TB/3L8kfX^T ^s*`F`B'b. +Nn>pV;h8{Xr>0k{ZgXs{pmGUJZiO5M*8-R'X@oM\PVȵl讲u2k# NܟIYd>Qvw:1;?oPl֦Ӑ-wˑVcYe5!Җi*5WGs )FMV/vgMDjdžLe>(+E01pc)sW)6%{mn7iXdHsLQQ՝)65w%MA/*I'hН N0? gPF)23!SlSPN0 \k"t-R;mRD|쳀]?:,ʄ}oOk kxt;TRѶ'Ǵc&HvT{v>ȹZeDb>boĸ_Pm+[j({WVkam# {F_J'mv0~* FQ>'bI/ _9 endstream endobj 935 0 obj << /Length 729 /Filter /FlateDecode >> stream xڥUM0﯈zrVw#l-Hrp[6MP#p')I I^ެ+^$T`.KB$,0e%_ 4t۞NI9EjiU>3 m ?}u~b*R\$Tɐe}4;LKtH;s< gvU7uHpf.Ivqo}㐽=w[;*`BRwg ]X* eRT$Qӡ)-`DTkR@~ͩ%96P\0]m]W D$.fzG 4eusm> stream xڵXKs6WH͘ mɸәL@K)*I.Rxl>c rwirゎo珋_o>(XK42$R(ID+ܬoX~}|AKbrpKf56O2acqfQ6w&0C8SOƅ&T$3X56w.p%Fpt8H0(#4pMx>P*aɓ2ʦEx%K*Ȗ:C oYfzvE׻1l#*Zmi>b[yA ]$RBV SoՒvܤtz y`׹5>Ľ SXjwC6E0w5bޢʕˆvDŽ"q`ދM{%ӣf?i!X%a(d0+4%NE|;OV%bP6=12A ޜqdmّ=q4|y\bIiZ>ӇC\T 6x`[tjph?oI}][T{U7R!ѭ84'~v{(*~Cd?+b`pBrs.?jQm>Gl(Y 'ͭl>\o]v_RQ}ׄ>M`WfIEveU] 7"};?m ? ,Y0>ʖDhM?|>Nf* FYN1m} K̛x|饾:+w |6S~*~QhAS۽o;߮| pKӍN| '/v#g6xe'uNyφz6NoB 13f/}W)\熣v-6=xp#/ Gj9Ņp;3=a˞~eNqNkp2xڴ#f_kLBҽ)w>GQ(4gֆPNgvJXc2X~Ӹ v]X!+\T >Ce'azE߇!̸kX#$Gr­|(=Y6mj3f,C.'Cxis> stream x]ms6_s5oDgõM:i8ss,˶&zq%9NbAl3tWE> . H'W:=$&7=M"ꉂOd~trw$1&oR]PJbriEGO1DVE|}K11ĨJM.cH)o~x,.u-pW Bu h<~Wa4Tbp*'+[̈́1bֵ& 0B~j恵PO 9 1أBl:rႯCߠp)M*;Hd8&qqmriPUxN ǎd$|`"&{:T*ٻj(L:-|G9jog1 P¢%3c MF3꟰ ;g(_D~'EM$ݖ(P/] [0يG$S!j h H}ks|r-r2l3N%ȃIJ 1 (y-m2ªQJ<ҡRm¶V^> (9'PA45.Lj2( X6 :4(of63A^\\@4opuFn{k==kP&e@%2H e4P4-5tĪ1lElkPUCa[+`זDkt񿞜r1ц6}j:KvNklNB:&T_Ի UXk.$XFtJJ1"&S:T*j(L:(|2+lSQ #UgMʑCH5j7}RbU~bo:@FG H9OB8*aM(,9|[NJpW )\^ǁvCa@CU/yÎeđc#eVm֝&7]Els6{jDsDy0ӡRiUCaqf%c\b8UM0mtsMQ5crU06W.*HE eS2 |7y0ҡRUCaq`G%c0W8=f393O(hrኇQ 鍺$!Q3F]Dy/HJ]5u[@X=bV<.6}Mgv5S/X3 hb&sgY42U&:D%5E-`C,*`"jUu"j@1o2u0 qĊe4NR8+*tWQZ{myN2G^􉐇'*>Gj(KtMd,U ';ƴS#Uj䐿clcȵ0e4)n2yD,ϔsVE+|OR>fU6ۙLMs3FS4*]5hyZPr>VEkIs(js(>([aF?KL Ql"vPΡΡ (99hU9snXDeTt&].~AgR?}d&<E36z2cH 1J:"P (9c(BG%h K4[Ge8i"xa]ucѯP;Ϋ8kC$מߣo{=v mahF4T )=U`$#<)` CvuLW$H> vCo,oEa-q ◡^.px%H#" -`*Crd,@Jc%qݲgݙOY^gA_b-q힪%5cx0-RYAaRo Άz0vd5@2ݩi8Z(enF9.@|F&_G8`Η}es"\1 K"t?Oj[{WzHC|H!g]"\̀J$ʲq{Pr>VOp!EOФqB̀}}).u#q@}Vƪogrl>ΑGK\ | ג1o4)fiqb Wp6!oqrOQapGXp%0I'.Tf{K$8bFvDȃʌ SAPr>V;&Ru؛(s+>ķC^1 tr )vM#lݟ{xP͚Mwn~ofNq.Z#UE(c y0ӡRUCa&q`O%c0QIh'NTq\_+iBwQx怷vJGNy0{_e1"`C2 *`<+mkw[jk]5:Q@X [ Fi)269nytߕO\l. Ump |*&k\fLjLfeutzuG#dQRnV|>,L>hs|.<,ZݛnۓKna$BLtTwPuZ@ ƪlElkPUCa[+`<+@ٕůȃm-*ֺj(lku죀_LSd/P"ܔ[j^(zQ\ ]5Rvѽbo}Fhwe$'?,/g(7-&)?8i P~{Լý}JQQ};AcT֬z}+/}ݲܣO0%$ rjU4UsbB)ѻ ^ x~.xZ Z缽@O=}\-6b:kY|[{K/ps{hrsbϷJOf\cMw^pTA B4Z,8)pM=Ot۞lX\kv{ޥ1j!VxN)$Wd~>q.m7N|6~a? zt>%E@ۍd?u[7~h/2v:~}1 }P_7}}<A+F%}|;a-샎P1Q/bK&[.S{rg 'ktAI:Z %c)RWkVD'@"ˈQt%OsZۣKa)%EU-`RC¤(`G  lq8Ƌ̰C~[CYp5eOr|}!OG]~nMaZ $LN ,E endstream endobj 990 0 obj << /Length 2253 /Filter /FlateDecode >> stream xڵZKs8WrUͧDfv7=SNezM'%$w v`OAd%l"4S:*\2ku9˄q2#UL29 yM_6LϛUfd.%4͕iz,iw_R7 E^r^Iz m^lKo}ǬTEྍhMEaC~Ȝ43V50*nHlr"c?h!h3ujC jB1;ɝ֘:$05FD FF"aH99fٹH4 _n |#}==Rp%qpowGCBDwW} (P-[kl^qx#Z] I $Oɋ cCxvRx8(sZp)ڣ R':n͡~F|>@CHu %OL4v4b\|Ɓu9;w9@Z?}.HbFcZyg#On]&G[Qo/3Y[PE٤bn-#q>wBp0P%_U;bї?fzE##wUjǬx{oI$;!/;ر*kOoO[ Nv,.2. FΝ <VqlE f, =E gz#9Rex@ P^A u)B~4yVu(߆rʘR9fL135P. Iw)sYl߁`bny?z9& :W;ks5&*M(<ޘ騜9%<7/1>Lm7ˇIs; X e(\ŎvMV2`&'Q%S?PR endstream endobj 1001 0 obj << /Length 2388 /Filter /FlateDecode >> stream x[[o6~ϯ5;EvI)vIfrmM%g=K6mn6]\$&8ͷ 尠mùB @Gg,#hI{&Cat55oT0Ҹ$L -ӧ !a8А!a~n<'`M F-/h}b&B*(|Dvm+tUPcp 6Er"@c"A a,$O{\x㊠.W DV+XM,٣uC(Cvt e)<9 b9/: XB; D-Ihؐ %i(rH𮓂mC'OX[j}Rb"k$56,Юmm'B {/Z3NX"'PCCY[ 3e\<ktu;uGŽWo ""Kw?W8O8P 硂"ڗ3;Gys1'qesy(pi#қul{~zh\}{kYaǕ#;d?>Xn}:b{q~9136 'xF-˷56%&2j0`{T6 8=E-z0Pn`f]Nx)yLE4U͋Qc,G@Lb-;'{p.>?kOAF'2'r UDCx^6oY* rG4澭.#n;Ȅ>M om.M!!?x|S$³d A2o5,.KėE{tҀ+07WɼEdW}J<r#<:D7zjg[[w?o&#h"SV鈡G^eȸʐsy</  ӽT0@c)8D c 7Q@c䠙[IV o\\e>_Y1ΣD V}c;+°ܑE8?Swa{gMREfEw9p ߳-|!8lxpuﶾuW>SE^_;"#һMs'j=*a7^t?XJHö;; ^myI$'il: .?XsMҭDS+\;sY ? { PS?Q.V\_ݧh!LF%&llγ2|=^ %.fLdo-zں֯!+`hj0گ@1U#A:Z5r,[2'~Z1~C&,MWv2+ڗ,-PFxm߱@*8#ZщT:}tyƙޙS;Gɷ ݆˕[ ~ۢ!Ͻ낾к L;RWT/ϔr6KC@4 2(IQ!^Di+;QJk/p!Aszchh&g?gfz3#WB48?;8~Gr"/վ JQ-[aM]t C42Ŏ-`nN>kQ0eN}?nr6zr(q:~k{# endstream endobj 932 0 obj << /Type /ObjStm /N 100 /First 878 /Length 1471 /Filter /FlateDecode >> stream xڵYKo7 бh$>$0QZ shk8"hk 8k~[qJo>Q$EcT՞D3ReL:0|N9q$n>$EWF ,>T|nI\RظKQ璆-+c`@!qw(U5:T hP/^1T{mb*x1x|e떨ϰU'T<N 4 3ІRo fb4olvuC4000a4%`=Y X|åCms%%pUg.\⒎Gbq:# X]fual}$_Ao.X+l\a$vBe~!܌10Hh vN|Q8R+s :aApeV$T5EF-1+EA_X7C9<:\"qu{3\j1p/% Q bdQbXڣ4r =ꭗG(w 2([>D7ʌRo){#c2˥p' 3g*9S :L҃`Le枙̤GbF0> stream xڵYݏ6߿B@*1OI|̡MwA7{8M$'oCʒEǙGGonkEB3"%2%6cn+^y gD%th>qj1e3&yn6o8u@샂"W$ "~B6aQ&47ɣ- U 4o(k2p^sfsWD'p19S kGH77QGD&`X:B9|7H17J2f&U۔q|&{|{@SDTfنFBb_L'_IsW_7:f9B[L9N%6pȭĦX"03,ʧZCRʒĕoЀ$#7%d\=%3!7ȯE]Ċyϗa RFk)xϕn~V2i&}QЪ'KɻGX߆+O/ˇ~L= SI_c>١\eB}=n Br6]HU߄JN ZΩJHWGp.f(1п6n`Ҙ(*LW^)dFb+׸0B2}RwiE~0ђMO9- 8Z'@ _WjBOW0Tźhe`Lk_n[t/eY(E028,FeE d4h¯ol2jn[O>>$xp j 4}je㼡)2Jwp/uAAJfpF=mI.i2J!""e'ɤ x{f );e+D`{KK4.P[tDžܯb+2s('E7'BB`!B`W.Pb 0Ĺl2[JȪ=\ : ց0D}(9<=Ͷ<38οb x}Q#}UlPrh_&[l8&8aͱjAU"ob;"GlɅkšHHV| wK4*Sml$Ӎ1) 9qm86GxPH S%Ds#YW"|j<̗iH~i s*Cϡ>sO5ʩh= ހ PCGuC|f?W#QU~X9h-26.~R4=0DʼZ_xL ("$Mi]#R½w}Of@=zWΚ~iJ3l%M-VcjRj).H ȼ1S5 :}dž~<87qau]m@ڴuݢ9t-zɡPBOfchIk;Pˮ8v>=|x+<خ6V]fŪl*cgA, $U7b5GS2Ppc 5ASs l#$9̋bvV;Wg2 96TP:+Bnz%|tCmsCn*v6{7"LgY&2}$@nr d)-7HKZn\z 37\|.y}Zs"0Ahoݸv{7nݸZhyIή3dNke]^[#Zy1R|X}.^GBKO>اQxzMp endstream endobj 1035 0 obj << /Length 2294 /Filter /FlateDecode >> stream xڵrZ!xLrصg˩$Y{O3{%VY} %Zth4h?>c$VQNH:Sq/rTnMXB\cyxIsW;S޼0b=BZ!ps"Mj{&o:(Y=dHj26dBTKcqJrWqK˱L7GNN~W|>˶|xY,Y5F>O2אe͵")3d׬"U/gDkEEuXYrHvP S"U@R<݆_~+DRlD],m橫?@:xT☨X'R91Jsqh!o-fȻ?k,% .ye=~c1р&15тh>q~& ?=\a%쭌#H1OXK$yE&ALb b7)$2e9]PȣȋC TJݾOCU( )׊(LhV, VK+L]N'tPm4FȘ5xlŀwo4B& '!fNT$LFN>X&Bth/:cyRY"P閌+;(;J;]p =̄`4XK,oz46着1TԵTYu'hY;ٰ)V@>MG- ʡ} %=6zhu$OhidCc1Q;A[ꍚnO^{K@lԆIk5]6Q6j6D30y?ucpp`{>*EOXֿ`-UvjL'<╫&,ǞFC]|4'᠆.f><Qm۴s {8 $o'eץB"d:ዟjb<GGe`0Laej_Ak/<u0҄RH!m OzϲMwPFpjnWݷ"]{);_ɀ@TD(=B?Ds G?)Z1BS-H {Dvb)>Eۊ{nR02Z>vy't^Y+𸲔s0y< WR(U6si i̬/ ,޷& F1f^kAjޞHMz}o]ڵ1΃%oxXcmZ9lܫoqmwKbYXI/5n'FaD ƺp4uRNnqScz|w9@K x l]bTH<إTXisCZL~eM>z{Kfݦ/杔6Wگexhs6,(؂WAUsvvK0\ >;IL׏b I>5ÀcLS2)s%+@zI>y69ϞOb~ ~6̫Ӈ 1E#dtYwJ+]{+--ysK<:)Xֆ+f`%smy@e_>mAaqcn`*vUcnhZPgrNю UR~Pyj2P *Wq^.*\YѦrc@e` R\^WG58fQZp5>QyTR'h?Hw2}PX7Ip\4ۃkHԲ+{-RŰcQ87&XHw)fKқ1ٽg}/Hrdg5^C,:k$nuw}943 ΎiuX'u}xJ0ُi*5zZ\5 W pi$3uׂ[d=yZ$W.>jǺ%` VĴLjrQsV4iIa_ҿN$q%?߾QESBSG}^g0 w4ȱx}bCݪևs{ endstream endobj 1055 0 obj << /Length 2277 /Filter /FlateDecode >> stream xڵZKs6WpoT7TeɤMjwg\Cf)/)F8D |_7͓ۄ'?]%B3LW9;&L\/?Rs׿\qM™MBM~Z ԎI@]4u67o\<>qË *ַP%H}VHMb_)x}+9sr%63g6YTW|~Ы?%տGyNk.Jn|@,3hLykf$."lNr[iqGD:* uHVg:^Iڨ^& $i-HT{K!1P;> ;{$a#7ǥ ) we;,O7rScޥ7t+fe&^;Of"=z= c+_Vwxby2mik\H-U-6,]%P֖d!H27'`'* `&}dZ45L;[Z(/n ľ~aKVMcÊ+whYcLe&/[IYP#(႔=%8+ \mYZ{Ep 7󷠗 f#Az뛺. (7bWe&y՞K] [zz RzR#qG7|YPWTLqtW!+T~# ̤!?n׵X{,s= r= ޙ&Hto%Pkĕ;Qh*ZDzzI-tԆX#rGڶHEWڤs3u;bW‹5[ $N󜶬u\rbٞߍؕ0Şv_H0=pΌ}hk`Ɖ1JHw_4E0D8OJ!h]le dgdS\J$͊05 UQ  #a``/M ],}\qPܗiy UaW. pS0|= |)o՜?Nm# (zE+~,1|`fӮXznMM643k| rU{*5ORK'N\+h=| "c7ٛog9X9 } `ypC;T/kVe]Jhf,狧|`>>"MCr+ƥ 6"L~f 6U./>V> stream xڵZr6+xFv&Té ITHiUCŊ4hZϫY\/LdPpo&SXV}nmU+@q]j02i jFaV[ 1⥠ٔ3utĿ\[tLT%`4ٰO ,d:~L'P= oG{ ҝx-n~A~ D6[fs}E䇮2QDy[f(2X!pRMtyXw]&v~5|#0ho5d()N3E)؜풂`@q--aBvvVYv+3KH'ɅJ=J!>Wi TÖFk6-a1B؋mmC _Җ&NCS_HY!- !-#1.FVk`&Z LU`9pL-|ڗ/W\[Ro1cq )V!.P\٨cx1s,YG bE.W.4Ջqlxu?h ̋Ag&ύkwm|obٶ Ix#8(u& -CKU(n;o8pҹ?Es\>ǫȕ8CSP5u3G | r 'S qС@ԁ XeeA P p[7r;A%;VVPYR}G}gtP. /U>2mvM$]:ĽQʁ*q8^sj/ t5ЕD&`}")ڣK وy ^o(@fz_Uf : AS. kfb1.޵/,RBtgSlNqIm~1/:mB4_ -Hd6(^@j G%l&:0 g@%yp $_։<0S#Ɓ9/8rmrq!cq*F܌GMwa@dkN x:9Hԙ A 7!nua a7f#p+zߛ~ǵbVkFW+ڻtc8h(4)(:*!٣VJ;j6B]Z{5 y'fsOs6VQJ-6%%o@!^(1X~E(Hp6smyygE[-FcdJ*1/~t=9_xַ) mѫFx'ňO=*G'>0Z0F⃩ 4a endstream endobj 1086 0 obj << /Length 1814 /Filter /FlateDecode >> stream xڵYKs6WHD^I2Mf2uKr%fC.Iq}"E⹻vpt߷G -)#"KC;->^aē#Ju;?EN)&a Þ<8c[ܚ˵ֵ}+N{Nywok$^v#H[P/KI~_\sE`"Hc ,E,| >* -UG7W%cPVreF2I#n LsP gli0{$t{ EN;+vʵDp7D '+[e'(:" Уu-v[rz RGʺ3M_ Sq zc@5X1ئka6W"~te e箾u9 ibr(/!ōF}("B@ls5Bi44qsolEE#+fTwlfPl]l sv" JS˪0+?~k <&쏆߱ ȝTPk#*vۤ)BMi'[ͱvco6 p" -$D 1xuڎ:-J8쉍R`IvDo1$-W , M]6HIǛO!3SC8wTf`S ?}mfs bv JoK剼٬v7IbieB߭u2gژb?31N*a )NRayB(:4ګY[L͕F`ƹ=S:I#%IQNvX7d;ysHsޣ|.AD=Pô:nJO!)!oК uYra9X}Hi#=Mچ%9acBlW&} qֿbs;l=pi<0_Ͳ:ߘ*ȝnHwU ÀC 6)e KNf;GIHH], /Ͳ5gIt'l]Cv p_s GV;*g~ ޘrR2wL2Sպ H jyVd-1+` d=Ls=F~ z'p#-pm$D(oimxVy.nm -H&=_2:0"jʀcIr8G[;UH1I oEmG\p{:m_Bۢ < ah2eh]2wqƕ+?SP:iɒƒM靨~+owC||@% !e=΃ ߀)݋3=0Ht^=k=u͎* ;r#'ռA:IBx{|<$O WpO䞪އ:@,~NK٫sQPn|n4χb<\ Su>{8x? q ݥPwiPԃ#bU8Kؾ׾p3|o6X}:捥%<U@.8=;1U q;v3i% ETq.+˪q:ip?mlB. ]Fk_<9y;r.79%)E8ġQLWhIx!7<# endstream endobj 1098 0 obj << /Length 2417 /Filter /FlateDecode >> stream xڵ[]s6}#=S!x錓tlN(mkW~/.H%EAH^\R3|A׷~6ZZԥ:ԙ}mKC= È{E@Sp,A4c5rbK)%pAk5O| W7׀W<+ Q  bYIJes׀*W0Pa6{D6/?#5 yqY]_[kďqM8'\m P2>!S|+fOz|}w}r />)~(.;MȰusLdfV11Ҳoj^̠P.V BI"Z&ˉP*nNtG"?[opqZNQE #4U,CGEU~=#"Y0h6/!WGŶ e~ Ve)2Ct>՗K|OWPj`b9'}*ִ(4+pHu=PE?BOSeD-+,Vl-R OyP0fXOe1)My|!!4Wm(S "lVcV3Y/iO_v?xZ.aiO5s3Э}{Ej jSo 5%1GC1%DDìZ@"'27R|gNB0UBR6wȃ4$sz & 9Y @Ug;#zoZ%W7uj^v9DAޝBܥFClEFF H:bQPE[az_TU%7^#ݺ?L1i 1T`,-XhHk,#p\ <X'""?vw;ym7":Le$L`=. F H:,%ٝ5Yu1zU3/UcU)T`U. UF H:奵$Zc^~K>JiUci!szҐX9n4xS^Z?9w?0Q %czx|oэLr\>6c@Ý:TcaR03.Hs90D(ol[W鷐PXau@-9s#m6sz<ApË)3!?[1ynYSQ!go>/$`ՕlSy ?Ӻ=[bYoB;\Bij퇷۪EV;.@BٙajhнS *afߑ endstream endobj 1018 0 obj << /Type /ObjStm /N 100 /First 960 /Length 1812 /Filter /FlateDecode >> stream xY][G}ׯK뫻L _N2~G,ffdjI#[2`9t q* I:ǯ%O]uM,zI8\v'm=UגTnbq#5b`[@T$ ׸P%Z`ƢC r%H^0wo1pb\cQiWbYiIjXC O(f1'6'0] E`eˆ$;OŪn`^+& 갡'`M$1{FIx[/aIzX~AZ2 0q8l7).*`m^1XZy Tc hjұ8F#̤^5Y)11b4T[2Q2 M 1l86Jpus7ױ8TˠԀ`*-(AȱsanĈj]!8ڳ&Cs̽Nrfitq/(x_Tѱ/Ob#Q|_yKjH9 0=c/q˯7nroi\^^ sWUF.%#b#1}5po^l\כu/°a# =e 2rd% ErLY.ȦzvOF LR"C$s$i(ZL,.g\P52A"yTѵ(E[Vfj6yKjGGh%kC6#31z#8h2d6np@E-ͦHhqy͚;O'o&duݡٹ 57jrP-տZUh'}vCCCC˦k4zȗ Dv8g rGhZ;eOMjkƻ ,P`!X}2&rVg# s`QGIsQ(ffؐ>HvVF2=#:-{F)WDʘVma<=7{n>;G` LO-$}Mn 6KLry)禘jIzn 1*BcF qdiGs1zs+>YhBڧ 1wvngϣwmZPD84e!JpyT{8qu='R(C%a A˾cCvoU 80%CSx]b/$$p|lF{\a8jR"= g"]kFOMGю+$@[~ȃLuvDHn8_h|>> stream xڵXIs8+t4UcEcԤ2L_2v6di1` a9`ZO2"y2QP MH4h2C?9`! FDAwpJ'T|.^uړAN*64H~?&G&6 !IP6C/f0~~~L}ud~Ax#rchMjO}L٘uC#v dQL9@)${|vMažtmkR0!@,tfX1;[bD9(aup4t5Nu5C7p#X>vaw )*CCXQ `+c^V?sxʤGp<$f'$@^5!>371םa{XE\|8JÂ՘eIe;N9SIBe+*1t.Ʌ,8~*l4NaP2ep |A!ݾV}/Я2x[,6z7X WӪqGDwpN @8 >t>\ya6۝-(bc^3<׃Y:pXߍfv= F3$[$A0bFc|ZalWL| ?$3;WeM?' R|rjfmۻc͒ǯx >'\ٟRCpu:yۢ{ ڵ-/dB0L9iّqB"D\8H(0[!BCU*ɾs` P0KPd{n.{6z 'ATf @MI[WOI-Կ,%9H)LI{b/!=VeJԹ#Ωv4d:d/4e fx=%߼9nKmXw;1 rA(~(EԦh=EO90mm``p4w\lՄiq*@?RT cZf6?; $KlMimxK=z +9JNN`P\vUlmci? `y[Wm TfTeb<4[pgHOkC 0#N(CP%t>ͫ=s-”Y?V@Aa.  l/\z*^#G_gbfx1BRp'YRFOj endstream endobj 1139 0 obj << /Length 1070 /Filter /FlateDecode >> stream xڭW]:}ϯHtUުZUͦO}p `v l/mk3gfΌ{~w ka!"$ CIxy- x P%A6^DZkfyvxo *0@A$ $[W[~~p*cD:%aPRnquL20IOFy`"8$A ,\L  (L2L}*x~By!7τhy l02&V!,3Ocaq ׶zfz[]+W-ט3A{V e4:Jv4 FV8F10Az(u*a6¼/RF]{h]_V1CKB;W pָPa[6`SԂ//6v69h`8Zhvx@1`՝xr6hNG'jeL+,uru6/v7TLQ10鮭~gO)q1ϙɟMV;&t-mmeKXz烰,L.;*[>3lSIfMA],{䤌aHonGXL #;G8x̑9+У-hJt]udt5UT1[5E_S)R\l aJF}ٺ0DJʹn1aFPF:9 Vlˀ1ٌq' z endstream endobj 1143 0 obj << /Length 1919 /Filter /FlateDecode >> stream xڵXݏ߿" Ro;b }8mmtdYgiro@&؞<1Ͷ;gooJRjQN.)TvQNޯ aU6oU\VwoV|ع}އ!O^]լ]5NR?CoTfF? H^ aeEN` ]h1_pi JRJÈz =̣ҿf/ߡEˬ, ^DYɢv`XpJ!XxXq߭ x[?:u۠,-=??ġv}X33u+XI,Ya"I5Ԕ7r %8LKbt9sնq S?TBBr 5~zf F.M'1 ܀kj0^+T3jsC\qtչ suf7Q߾6i]=xbF)ua$l$3ZV5[Wq{A:0 ltaW[GVd2ip jNvGQKp ӹ&J!ï>"SKPhP.񂝧&EVq-]lhzsv"RK`B<׮no7&FF=°baЈc‡s!ۑ7bg\Cd=cCVc=| M9;/$eWm9a0u"DH@4XG "!Sf/F/Q(b>| ˈ|Z)I `=$un kc# Mrⵄ   ͌t va&!V`|JܻE $wӦq.Oq75 rv +לM:Pf Ű yn+ް>7-6>&SAljlq[LnŗwR7&eOljj>YQDI1I&Uq(ҋjMNV`2mP|! g_Z-MNMO?uM93CrBHn # ^mE ]vR ¥qʸX(©`T꼤\cUQ3dOHE x -{W@/j90׫sJ_4X ν1U|^wO:/`7<<%EJ|o\ȷ\cҜi$k]u8n)ܴ!m<c. )YZ(gSI~Vp;^Y'DX-U \Z18scҊʹ_p է:BiB͖m' Z*E=unwu?o_x {6c_79YM*؄[Wa3+)Uy+z^ ɃQ<}A0q}0wKX`IPu bW>;,|YQ69V:߷;~u\&VOUX۱ ɷu{8B7.,Ӧ쓮mMR*:BQ#6CZػŻɉAN!@kHsXVXE,N' d endstream endobj 1149 0 obj << /Length 1452 /Filter /FlateDecode >> stream xڭWIwHWxn11\y<+RI%6'x}>&I[BA!).T}ŕ9LJYͲ&Φv;J3@`:WK F'}Q'[Jc Ǐ\` bVg61UǺ9:7O;dLM?D*.MK͹I]ͳ9>Y3e4orÓ:[Z,hݧK6Oh]žhϩu ppji5.:o^-iao^hiC☔H[ Jz~kn.q> 36~v@b7t[:[U*h}ϾLȘLQכL'\e))̃~ʄΏo8S&V_M W&=ʺɔ+ʃW&R׽jrZ?'lNU4d]M2f҃Pe+: h}]ugGAhR --(RsTbL%YpDD8'0sGT0+X|,]5;nC \J?!i> stream x\Y6~_f+V>6k{JԾ8~%Ό*::|4$Ej4c쭩Z ~h|hhv-?xL1U('L;Kr,{?4Y.f,ÏuˋX4qd("Ȧˋ7oi6kG,E"{}ߺmyȆϗlySdWT[F(n>aշ $zg8͵JD"®(*$;.j%EmU T1K;AU5# lEqkCoA}wK+KmSֺk0T0 ܜc}AH%t5g,!-̥sXSb46*a: \3!չ&>[R3)kyC^fO-jw`HsLWN U*ust%Jsox HM>Ey ʋ#"-ZZSKXjiÐZc\AD-`xfJ71,2LLOw$;;;yG}-0@j0 @2A9MY 7es0}:hAb9 CbJq @k Ke}$!K1Al!1!1bt9>⩅"_T894&xU҆!1Ǹ& 5TzѤ XYvf*7t<sf()Q^6,pCW j:( 0=w|F~hKJ9hy0Mƫ6 i2=5%y/ $#OތmK(GcEs?$Q1;\̾T=y(' CU$y<΀q5S<@אKe=vX@?]+X\=%k\=漈Vfa#6K0-ʫ2Ը2T+Ce$s`*0$fLSEFa0~4]O^Ր,sz\=AtuqC\ZG<%W+cs@u^^A_LL(z F#$ x2R4rcG!{tM$^u2Խ'|Qvb=2e R4̓cxU1M1Mz8$uئaTC9(cǘ6­؟&1Fiudwgq*֑0$vΗf%)۴Gy|؜3 Q Fc_Ձ [ih=H #rӻztiLGl$@5{tP *S ̦uw!԰; `.t'ih0YE4g.F=TEFG0.΀qyl@ml'>>!5NjrR;oAYU':h %eUTm+֘n) xoV& tF: G(3b 954xUՆ!1}Ǹ ueYՄ~}!?G%a {rt?P#b NqWxUC C⡒ڽ<@W} ͤDxO0/Mj/l/Lg/|(p@*.K̇OkqwAa \ޟ ~hd8˛m ̓ ^U,aH1Gm*1@ @ |q4gu%t>9zl }-%l$&}UklܝΑ{6jlV#LuoбltH'A *5붃EÛ$;l׽Cü.#v|#a2nh:PձUyj^?\N-Af "ڄ9<sj̹:̓ϹL@h=ӫƑƓ0"~>4vxU߆!Ǹv G,C]_4mdC{;easY`"$5krf]>`YP+ϔljpW.$~b\nn?z5gҰoP|Sy:YLɮ\>_?d0_]z7Jj.c}Hh.DDM2OPƥ./ܖJ֛e1 yEQ` fƫCt1YfhWq^o ߌMv[;^|.[Yc7o ծXw?fFA JeK. Qk՟;U0R2,En1e 9gBWһop蹢XX=ZwA.?|)vMvŌ;È;%H,{N{V#˖omy;-.\]}(6G i>R3uumpm= ^~볐Z⼬\Wk6MZVy e%˷ϫw0ɫw6|>׫""Ԁ[bYorMM!b*͊]1'H9|bq6[M O B{pxZFR،C"K!V&Y/t$XHм˵PC_t}}U~V>6!t>o^~ɲ&%H/C'du\ѵ}rU=nKzpsx9zXsn);TDAWccS1e֥z「%%*-߇-'a& B/m1 m٭546!j VpV!\ endstream endobj 1179 0 obj << /Length 1846 /Filter /FlateDecode >> stream xYKs6Wp3-5!x`{kd)Ɂ E:|q'?((|x,x߂K#9kDT)]"F91FFIjSit=mm&f4ZY9ŎLg/?]13S[N 02[m9˹_T[-FX HT%I:<\%۔_I4_\rH6ʏc&2q^־BIO&UnwK妸(}5$P갥Ei TmyUh1Μ?m lO5mݍ,XثWb!,7,#L3JZ9]E  SՍ649P㜰DyjdRpty37o֓ ni0zQ&oq=`|R7OS<O9:B Ϣ""IX~a3HDnaK WXʦ-Di|@/fM<ض!QQiڋ* l`Ą(c;ʲB @x l ۭ͂PO$ýo&U Qq1s֊w&M7=# eUmBNk)˪388 -!ly[=t$1Z~*`E#->h ׺sIX6$K޶H8qPT^ B` !{I5꠸cPj|6 WQrGp/T23ڛMhCt: "HͪP;2|ql^@SGv{wLJaRUpwsRî>\r2Og,JRIɈ&˳wh4{, Mڸ ý:;r;vQ99~z5Z/7ϝUx )!y{ 'l dk#1{-;c)›ʰM.t o-YceǩcEI}XALC;.p'Oul~&WdK"}F\zs}BkQĹ<1 &qrDŎOCt ~[l?X0*) 2:ϱFc[g#EڄpUWe\ZJ*nKeg̪$M#fm$+痮T9Lwjvu*>ԏ|)O ̗fDai*CIExYry)שU-fSPl&Wfs(pX}Y9|>hppy us_F k}M K]a Z$WS,+#p_/zV M?ț6"_[x+َ`Ĉp(pb?Oc endstream endobj 1189 0 obj << /Length 2221 /Filter /FlateDecode >> stream xڽZsfZj~2tǥr%Z/"u.RL9Av¦<4>\2ؾCcTf[%`pd}C)cڒtq( fTPM ng;Z7Mɵgϒ*wS2dr  Faa[Ȱ;p gӿ^\r8 kq5M e6v'~SgP 1ܼ V V}ĊR4LL%r6}fI1bUh}oK?~u0am< дmq8Bo' v۪L^A95ɴN^Lje1d<ƱN()* s=l}9qjbz P>'u(n pf:{9OE$&ِb˻=pE{6@3l3m MG eizi 8CNt:愿u uN:J>)Nǐ8V]N_u}#R. C9&Q= u ɮ8C]3uܻ|\ -;"2)_ o͆s!@)Ώҷ9x*߷3, YjKߟźSyTҷ7YZq,o?& IJ+%&k\yd݉T;GD"< ErߵTQa endstream endobj 1207 0 obj << /Length 1864 /Filter /FlateDecode >> stream xY[o6~ϯPך%-5-VlfOiɶ PT!uHd;0>i\>|plv1F皓ЛnZa0S51 A<;8|=;$ Z&޹68{{prf`+5 +kg;VQcy,vfaXxRs)H(NVkۢŅ*Pbjj0Ӱĩz2t!ad,6ĮU%ϖ/:-])hj·d04dddk'/{ҏC%{+CW ` 䥓`~u2u2H*m⡙ҵMY *J;VoM}j ;۫B\@ziÓ  S1*2 ܶ2:RYnw!?s4)9YIo-n`|bWr90V@W}ܵĽU }A a?wlؐ;6dPHtҼ3W՗0qc{y];$H3xp9$u9ɝNJ'+e÷Lנ'.8邐6Ba6:gNSmKp+x{.-" RA^V6}bU;tbU ;~ vW/u:%q T pjGmtRxF``7et$) x?LtT 0A b2Lnp:Z^_(U\qj8^h'\& Ovc(Ы;ZOLL&AT\d#6P؇繍6^E"n,C@(ԦxV,^ I#d s >,Gi RW \ߩLI`7pU-> stream xڵY]o[7 }"K% (ЏEӇmAv8@w(',ĺG$ERMIB 9' RFk!sTA )96L3<@h }`A"2ڱ-;R lj%Tr,V!#1 1?2z]KVn߫Q%-g8 Dos"=Xna;ud7W%K@Hn8Ul0adS:Uo$k)`Zx y + f٥N6H}R#x˸I$yri6&:pcvÅ5i©؃S|ߐ+v\ٸrk9HZ""Gn)Tq5Wpэdf}a}O ZAY񹖂) v5VҠiYi, KhX$`FxYB3!xd 4;:_S$!߆ԡX}ڢ"7W?={Z46=5Vh4h$ZF[3. >Q lQ(hhXvNQlͭF4ʑm&\Z4J-&CprF."f͛zq ylOǫ:1w,j(R$U\qz\A70T6ad0q[|]o{ϗ[br}GR6]\.k8u[iJ V7 BOC?iݬ;;`6?Ͽ~Z=X]|\\t/󗧹?YłXR H$/VyI^[D˫Xi \;i+lE9("v!OrEYFHBhi)R-a<.я'd}4M9mlgƬ>a pJ1ޙEcZ4|(JHk-=|cت{n%>L1]I>bێڧpF_VwchNb6}T6c> stream xڥXrH}Waa.iť6ډ=UȒ I3&xH$KӧOw' N^a}8{ )%`e4!SK $%e M\[dqD<+;FJsDMQ2OrZpB/h~4HP.zV-oz4OuW37Es^rd]תQ=_^:b8gɜp$ʀ-/Оxz7HjMw=180'N.^s!J!¹n`5<_ZUZՍREY OGb-QR#H[]Q>l t=hA۠E1`QX+akm3QZl2VF]<pX[H[ uM]۫Y['2f=薂:E% Za]j=:+VIrGnza)cIr3ewdOR#OHm]V5ա r[RNkcDq2O FSb&h* ]WJDhO&2(҈匰00s?06~#Jd@Az-6weRo&S !0:"и:m4hvJqo*(aaoY,Olu7dA# 0K>ɢ5X(ު֛ܺϲqA$Ĺ 3tBӷ9ŒטDP>0/jB[[5GE vm[̷=ۭ>#A҃~9tʪx Ԧޭԓ P((b>fi~c;c= endstream endobj 1223 0 obj << /Length 1092 /Filter /FlateDecode >> stream xWKs6WjB"=4i(9"dqJ *IAP~՞E>* |DS$N"ZUoqƉVS %gF4Ih\6H9XE</`Mvߗg' BH ,Uc`l$$VߞR1Q.'պi /q22bg5ta,Qya]K绔M@_~Ro'y<H15".?evYBƷ Ä1CݰyL*"H994&Y'V|d:R8 ̾̽A?aRqPz⒎ !y0|yBy$TQ»_?}2u'U '8`l e丱#u7uK!WjN⬅n_.XT7wތN17z$)B;,Xk7K[TxBJ8%A@ճl*+//RyoD!RTH'_q u8m*C{ rzdU4U֮卟YצuaeM386Yumԍ$p:Y)"<}1悺1s4 8r ZmD;R$폋,0_:wȠ\K? 0CԌo2[ ]i^ZoWãwmvVA%DhyWkV'/dV6P ۑi'!>4RBo=f]g13tqqqqqMJʧɺ{Vfj w !@NHAu7Tݫs}u4 4n˓dgIJAbT n{n9> stream xڵے4}o83*Ye.CЁ.O-ø{="v$>#M^l|#~y}J&[l$m0}{& LCl& &2xFsZ@H, a҄yERU'"Ra`8҂McK%mƧO82XF҈‘5}B!,$.ʜwa4V,F5'㿣gg[OdG$,pbHDhpS7Ot 5n㚦ճ#{Z׶O.xZ!kGˮ Q7%U˒XTjEſݎQmIUѮ:_v(E,XŁ.khACÒv##%$c\dž] >4׶ŶrMr-x6dĿ((Ew!6H| CEl0mL 2 dlhVoO>N, Wy˼C}sEFG8!w1!;O'5NؠQq 07C Ԉ!peڽT ߉.L: _n"HWeNEH슻Cf8!]el2?9ԱR%eNXQۢ0Ue80~YTge\bߢ_}v^|yJ] ByS4y6n%t4|BO#\Y%4 _ 4'RVywjUkP%dR'ŀ(yT dGS{.Z@yL+%q;>`Cfug:D 2J;,PTظXP,o8`[.)=3I/oUݝl&pz`R =(A9h(\yK~<uG#5uMF<9LsSލ9n`j]ެtRZO$D$3J3D;PqS[v@H18\Mп|B  #Lu(bP9XUIrySn"kxYweLUC锍`"N`H~H-T;w6O(l8F`QA|ͤ 0Ф0œ?7`L@P70H k14(W7Nn c1 rcH'`V}$>\7 :3"\ jB24YvfJs]riJq5R&ﱕg;BnBפرm6]lk#i+NsS_7<&Sp}V, HZaR/>%OKu;[rJs<qg%eKkM R]B 9.:ZW[z:g# Fb م%pH>Ga)?O27Õ m|(W0>PLl:[af0(;c vhbqx÷Ma8p- 0+ywr&~ 0dJF1H~%!e?Gڎ:7mfr^ƇTA,GdR`g>_3fᓩ2)/So6Cx|疆/%}Szҍ[Z~.akq$^3Nóy2C_,1:e$\Z nJgR:HKs;fF4݅W9W5G%Ta%*e JgD@ endstream endobj 1240 0 obj << /Length 2397 /Filter /FlateDecode >> stream x[m۸B= S@`sᐢHlkwV.7R䬽֋QԐ|y44h IOy/x bMbjGD(Xmo>B5b-W$6Q >}6]RJdye wm$TD, ^/n^ALbukd,S21e8DĪ.`pMQDMߴ*cC(4Kpt:~U$h\2qt"! z|jn .k=5G003"v y/7>>@1kQAD `FF[pFlQ&(  宷{b6:+Ŷ%IK)Z6'L F2tRh5΂eӻ& ׳ylc2CK<+=7F4GLoO}I39 -x|)"r3F$EA PjS*GnYJoH5"yt(w70LLc܄ u.4#\O|6K*R C\ʢbOz?y'v=ɝQ ɹJ%MzC~, J4຃\U_01MqO<9hc 5JK*hAx7 N;~tӜ8T05f+&iP [ݥtĠI cF(W(]i2Eٟinr"Fg(s&#fdt ׏JHR1HvR9xM*]%. 7D0}=G*KƁ7j8.QCk3#ݥz`Ja bS7ȟ01Z`v*{s<{[t. Ch/uuaǸ @T>D&` wEr'ׄEu nQ.Ξg}4n-[} ʶ ^JCmX7/ӫ^/~yZ_^z _:dL3ଃќU_01gMq3<9R?g)ea/W@_s6P30{MD御p$B^ ML73SIdi??7 =”7 QEcN+b&* % n^>0*n`T#ٻwOI`w_gUVO׬a]T3Եh"SFB[$32KC[+SãWP= U:;_Uj_i>n.#CLS $R}\}w{bc׊DgʾU~ }NʧY쑾I򵫰Ml'{ s%e:ҵ+Sh Q:ueY,G ?!0ٙ껢ppM GL]r:J˭3MxJrWn&MY~[ݞv~h]8P ~uu [谎 p٦cq$[cJU=1u//*7pA`]a`Y*ّwS>l,D2B-#?)0Iv `B6YE]-_;eB㦏谢lmg.eX>@ON Q:um7^ϓm+FUz8Vy1ǝJ: ? endstream endobj 1257 0 obj << /Length 2850 /Filter /FlateDecode >> stream x\]s۸}` OMf&3}H@KV^ߋ "pv,BĹ&7 M^ߗg?- cHɓQNg5a9PuwcQS89|HCdqHHIK͘ .1+Hsi #s~8~%1}`Ӌ1\-7V=u/g1&F(B'B=(MQ 1k>쑃UWU4DVwJXT )ƈ ͌{8*Xt~XR_X!=9qkF4lOހrdyUK2ALj3{ ߮5sV2N^ʞ]aZJr bk# p[F:v㇙){P=!cs$`mHbɻ4o$_GpϢ۹F8oKc# Wo\aZar0k_#Rux׏E*-1QX>H"i#aG(_UYs $`yN?\)|mkP6!$z|sȃ@]{ 3֟[ {o=HNhN8nN¢SL|Y#˒?, i,K9$qR@\NVxdWMhY!KpcrYeI%1FL ,5﷦UnN2'.NG'(_qYs J<{ȡ6hkpG c=rhyny^[ =΃؝wB~w1|3%Qz#=a;̆4Df9F<%]sG<{kC"Z|;@rL+ 8嶜3l?;x^-k65]f4(zlut޳(P2!S$`(DezƱZw)cFQj8ȉ?+1\oz9K.?~QIB$z<|Gȣ:>H@rgL*=QrCڐȾ?"5(T*۩9cw-zͻfBƘ&Oq,-P2!縓$`I gĘ|m<ێNYbv0Z#ؚ^1I0 7 8,7"PAZCsQzO z'AIFhو& -& ɩ辕Dq},vl7T]3:y2RI]3Ӵ=|=1Ŭʕ»Gfv P*{O cE b]ܬWi_jQ6ǽX5#JTr^WV5-OW{׹v~o^JWEVZ-{6uh}bۺ妪ͼDIa00a3m> stream x][}_1p_fQC}hc'@؈}r`vUoZI^HPFpr842}uAϿ\]K3ƈUgW̴-S6g?XۻWo.u_ˬ&LEO4ÿ} 5Eʾ͜kKJE]d#X^>aֶ $ o"8j=H dv]pu7׶^DIѶUi Thzw!LkF &QfLE` a ;SwKTym ih!iL3>`#rhP!2XjYV0ucev겏3#t>*_@[,Xz_Hrfr h?a\x3Q &޸<^7 ~*LX.fu_dAVSė9:CƗ! Kzۘp1E i Ɣ/.g|w9c _!V*pWuoXFixE*Mв/T"wR!az '퐣I4$v,"3L0 pM8hv?{wx|e~ #TC4 &@˙.@o,%~DS8(Tvm$TrP .5;~fPyAAlر ת =mwm$`zTDu0@ 3k*-tA 3`! (Op@CZ0MOAr֨Ye"5D( N恃CJsS7Xnf9QFYS9:@C! Tz۠KmkrCڐĶ>u&j"SY%wPP8[ࣴz=·X^`nfRaeU>,#FPml@n!=ar{66HPՓ H? 'xá<9|lHCbCKqk H e HPWO|X~9Z9 ,(py٠B`C b0)0re|lse}` gIC(_ҐslñNL PJW^ csÝ0)ܓTrOR9xǻ,E̦T;(FV"gwbW|-^W)-o篫Ӗuة*չ|ypr=7i&u)%;;P.*LSu+10_~w0/wk)#<X7ۧӶ>]r6PqHǪ7[]wِ3v]GX4A*j(,wi6:l6t_%)zȱ +s뀆\pܨ$cSX6LK›P HIɧK,Xα8۞;c\IjI뀟2sOi.x󐹪ޖ?=w$jbm׆l)vҚb:JMrt C1XGCS Sh[> =4;Ws ,W B A5h嶷O*8hŸ P>赑\RI9uR1 ͞|DlMYb O_ endstream endobj 1214 0 obj << /Type /ObjStm /N 100 /First 978 /Length 1583 /Filter /FlateDecode >> stream xڽYn[7+l7 :-AE[# 2}PN"W5Y:97ebB4bno$T_h# - L b ^@0A앴a%oT?e! 58u4HXrp_|_l؉8)~F :gs&X9 vE}|~ ZDŪt$KX*g0 BP$d.ačͩ`M 7? jN4RR܂ Jn *2Tn *,"9yO:N[)QN%. QA.Qnf_W.^δ@5?Q,δx0Vg ZLPQ Z`j7r9up*ڂI &Eq i#̌Te3jհ""Q$AGCtTwb!XcO3l@@jD]°ǰ! 2' 3cSV[g_-g9/"8V&_/=-An(´0=]__|8;_ي8lǟ>nl6@b:^6(LmNHS0 ӋrNq^-?n磼 \j\m.TU_L/뫋|w-߾;{N5Uq.I *ǫns@W|b:zϿ[/./zyezzJh) Y@=f= u'zs wUQV{6sՈnm(P66FE -k 1'Za4* BC J󐡈Q5ոOB! I/nл!nԃ|%KRoŧY}T3`E {b L*hc0}VLvo6=^ݧ4jnQmԕֆohhbyVӨ O2FC+i4L m"3FCˣW>F?3 E?ky4LLi4L簠 ɿx endstream endobj 1328 0 obj << /Length 1870 /Filter /FlateDecode >> stream xXKs6Wp&P3L Yv֬Mm,m$>&۪]G aWWxz`{րu֒T[ٯ!n3[{.i*Wq jNjN{D\e{hLeC7IҸi8i벑CpЂ8@2SRr Mu;47*Pzy!gp"AxOx#F%)SW)C@:C)8)z44ҌwMA18M} }js\9S㺶F^4!rJИ G)Cmf]]U_Hx#)4ể-O,>0ᐾ5͂Uӡ F`P]w˃KRC8$d3E\3Y!:]T~0 i\jY=,#hb($D$AE\"B2Fy}{!z,p0=(\:€ 82acS?/#ͣK FT1.mwmS?q-UفurhL]'b6(`I:~vӣ5`yvPz2{ni UC{f)&ED ebszo^ endstream endobj 1338 0 obj << /Length 1967 /Filter /FlateDecode >> stream xڵY_o6ϧ$3"ǵɊ[)b+0Yr%yYHJ7sl4I# ū_ &E2$eLLXde9Tj|Lw04$B*Ci0hÀV`-B>+Nch9ݼcծs wM`w}{!QP(DX_|J%|{GK_Dk@ɘ< kdDmdĽ;2 IJIb #rcá!zktl. .+\ ծwIQ¨ B=иp"Ј$UO~1(:_!Km!@IX@#]4zOGz!aZq` %Zh\Ƈ Iln( (+[\زe ;nD\ŝ"fҨ9lWݑAq(3%Xy/l2ES"f=]SYݸ.#سɓEZG@%`>߭wX#byL8l\zq1ӤZWrUpad6m& 'p; SHt2 _πfk8]3pEY5]+4KǭPi.T3q- qrkakޗ~OؒU=L*&l`#` "払m7{e,S/Uq밳w;:c!8]BavO|dy:.pr$+d)+@12L26h6FY! @~T;PcC@3m9{Ȋ"+6aZ i]vcP}"?`Z۱xaΏS<ҐlԵ=ݶqi7Y4c{n6$Qzf6ATlgFM Jj.$ /poqlNԷ1B K&! $S{bMq(1cgH8 : A#5L :J> "kKi m2H'[^ٞgSB=%oOԾ=ٔ--v'j{|:>9F5'cE`<$_yGőB׀{Y! EVЄ  {V~hF|6:(_OIHHE19#/opn?![c][M}< <sj iHPrb@n endstream endobj 1361 0 obj << /Length 2453 /Filter /FlateDecode >> stream x[ێ8}Isx`1Y$` Id[ݭm﷊dI;ŻiX**94Kh\F1m('D;Kr:>l?n~04awI^\yK&DEj{_ɏŸ"d|z׈4́R"eNPPRW|œk $sE&85j+ekf`?5[K*!o7AU5#Zي(&@7Z׆0|j9Δٚm\Bh}<(D6Ա%j51#i\/MBkv{~3Lo ,f}iIm{(h 0-QY_FF`Z-`-x9lZ;_g{@)Zcku{@sC ]5sq'gP,"Љ;Lu"1 Xq1Gbp G -|m}-ȶc=x!A|V<'B%|{AjzJʷG 4ƺ @Ky 6]561<kpErߓ/6Tzj_<+ScSYwja٫)Mݬ&sMQ?SK9K@lK!t;:2S(ѸK_6] V>|& ѮyArB>JmmwZk9ђ ?}\E;-2~؆!m~Jf!+='wql'!cq@c my0ɇxŰL<rfI"8&&YEȈp$̮!loQ2ju^fjU" wX6L+oQ.t-&*o g lMݤ('Ji#mޟ-MEтjhHb Xu[=w5)~si;WoNC|:tZ֘V}I # l_О b%ΖJ>Zbrʣyޮ2PCEE2 -\f)vS"7^ tdt"l%Z3l@ՃPqpOcP#Dn ;J{sže" _-?o[]'ȵ)kmM-_Ѥmp>Q!09+}69ݳߧu"Np4M-,tV*8g8 V"}|q ݊71bWT,Ъ.{Mp2*jX-ݫg9$`UG ӽDM]9`lR<R8z}0&g )Oޛ}ܥ0 5N #E*ǻFxwxS|۸; /XᇆWWhomxӑ9Ȋ0=&# ,NNtauyРAR??:05s80y꬟+Hy֛u.,_BZ5Süe .=ΡXϔ19pb]ٻ8z 9fجoH2uNF޴ʦ)Ьt_#%`XA5 W)R?1TDjX.<]WfU2_kpYl> 1#j ־Tw#Ll ]8[pI$V 3*})o/vyvU]֕LWs-\!mҫe@ݔaE Wd۔b^9XyAW( endstream endobj 1379 0 obj << /Length 2573 /Filter /FlateDecode >> stream x\[o~]_ZCMhniTE{nIr8>fHw-^^/Y؂I"ǂQNv0} '/HUP <7/P.S uGBS );M56H΋~/xqۋ_G9'K l['@[Ae\Id\{j; KFt TW}$c4cwsf\X]~V< -Q^%17^raTym߿ 5aow|sU֯ pq:?H {g8ZpFUɴr{<S>Ulm. },}߷ʖr_=n?1T\}]n>߯ZdAkNOҚX%s2ƙeD ,=,Y~ cFyj5rͫ0"Y^'+3p\'9HEGHTA\8X_~a(AR#1칋SLV3@ܷV6Vʛ˅ZoC#nOqB8b,E*b]E̮"?Ǎyg 9{0y Z$[ `m,5S=]ȓ"*.4d7tvgJP ;l_%ZIh%ɉ&U9El%PVҧ! $OzVDz*+\6Gs؞7EwBdk΁<"a@C^kZsu.f'3w3Wd*6_Yxa@-d5> (?Ǎg 9dDZG4kfh<5JgyCZIVF3<kB%&Ikl,%%rw Η]SU.~16\tc^,цQe>Wh+ҕ_ևOз ]nG4} eU_u_:·[ee]W`2P|wwR{8ZPH<[s##OS)!2cRy w(63E(c<5I\Аw1~$Fsu2+{lWa a7"nݢG>b!F@|MEO"ѧƧDۭĊYElPvۧ!縱 $OJʹ$֙ݾ'l_MEPݧ!bQ $OkB#"OֵxX]ӐYsGӱ)j)r08 En'.&]۱+I?Ip534!4aɻN 1bu<6@ҳnudx:ƛT3;Kx=_dܯ ʐ3>M endstream endobj 1316 0 obj << /Type /ObjStm /N 100 /First 974 /Length 1937 /Filter /FlateDecode >> stream xZ][}ׯcBIF|i~H *ؕ Wnc%^i9Ι*ךRxgHMb8,yʓƠ%oc2Q/T(h( H /cU,+QDVh`OD%TqMpMVBK>6ɚı+]6 R09k Hj"Mb (-sL|B%,ŒB=KQyIc$^ce葦1C)i)hICJRjc& O8 KIpT 1bZ|ka|,%耑L9s"Z"1VjS yf af 1ԇ;OkrUcK^G@ qBHFɥ^l/صa"ױ`hC>ѽENo7\%>p\':>ịa`}>/%e!RwcSiA])(x77Co_݇C:mտ~6@}}]n#6v7ovd8>W_?]sd&5n/Q=+FIS,‰6 A?$ԜтY}LP"(dG%vG>bbb.$ BbO2 ]Th[*U#RXtJ(tU{&8Plup칻GxXѸ;͚TIѧ9j58^fP <͚c)^ptlH4#j2ݒs(R D̞X"WgeDQ«&׸ѼCCgkͺ,cAg({:H<: kS1=;8k\рz8}FWd;*rB&?4}|cj:#ڏ"|OK3WZ?^JK6P2lHyŒ<+-SҊ,EvYiq:+ FUGFWfmBNF̃.b7n܎p+JtE)YÒvv>t.<\;98t,|VčNJk,nuؤY(lZ: hV JJw^͟v ->kť.6_lPIGҎ];6T`YfqgCEvcYeY__ >k5 IߣAƌ endstream endobj 1409 0 obj << /Length 2915 /Filter /FlateDecode >> stream x\[s۸~evedd6q7AhG3J&wS@}D7:ً3'6~}?˜&L;K姳wig?3?EMo R"-Ev5PI0\]$Qܿ׭Ӌ~#Ns]\!U.2qdzZI$.ru%E\3R [S(TeJbVD1p6A [ȇjKT:Uha1"c xF< {(c2*QΖX#C8_Xp|a7ZOTj_AbcCHj-BzjtHD%0$&h;tpAx o1|[_|zR AyeGjm額)Y-~X[7N[eAD:c LIdÅ&VJW]?[޳/5lnY@ʌTPD;/dm(iADҳ?vOSf:cX'tHh)ESOʅM/VV V\C Y<Պ:utix̊^Y8,o '`=Be;2bL97yW9=p@ Z^iwh!uU 7o^Ľ Ÿʍ7_0;_pJo3 0VJaBΫH<+R"&H%)~x1 Deg lr ꝯq+7!fm9>Ov2wH QnãڅbSlbUF_G =p, "7z^ެwŪt/Jlr<j g/!y*xe9 eqnqU: r@/­>hW]|vn}}$/`J`/%L5!o4,wS#SUs{p^"4Fao7v#hf?)ҍr֋Oox' x]?ui60IJMӥxxms\ۭ$O"ʣA QpKBl0[a_pߤ`6r'ŝ w;| Mk"F_WW0lXכ7lt_Up_^WU%ӄ X#]%*VtiH]s\k$OaPP:LjL2#ʭ~ixWZ˜oxF3E y\ ib XcJ #.aZV2A' :7}#~ہ<%Z'7Bx1X8&yXCŊUbZ<kȁcAn > gԎ ˤ#&E PqmT(Xzl=b楲amr-߸?`xS5Rr Erɒ+]KnzkiK@) SqxYֵ BPU8HRPAyHCŊT"Z <k؋k Xѡ>}o,M`1K\^xCﯣs(ı/1X}4Ni)t5ĺ:KST8QQ>xYNRzAbRz)=ǵ.I@IzIB,B1=;MC9ă'\5Dbe#.rYD[y^,#[g{b|3F؃S#yAoRcUoΠ{4 َ1W #"} i}8$O:i՛SFWo4-.7w#|-{_csNބ~EǰݘQ8)2L#^u)=6-{ w4ʴϥ͠j**VMuiHs\$:BӉ~B =/Gm7Ë, kGsŲn)i'KI0y}>9]By)\i endstream endobj 1440 0 obj << /Length 2868 /Filter /FlateDecode >> stream x\˒۸WpʂY٤<~TMMej[b˪RKm=l$\\VwhW HBxp &˄&o.hutH0ID:^@cBȳ MD%w\xZd DH͓0i\-&W?^P"Ovˤ J4&;S\),i@_1sp4} ~9itI?cZtrodMMeOF#*{"{*;}ju{ssb0e9_; d<sL0 nJ8r~@֢Vw^TfY:U/\\XPjPf[-kav{z>%JvXm?l@r_{w}]UjȬFܵ{gKgbo]];Oٝu;rYnʚT:zμiNh̥zJ,E֦(?ky08pVe{P[3+gFRDhulkl ރK(PiF̠pWyX.uKa2O"is5뎅N4Ū߾$67 Ãi&DSL{O(A"L1"Lx'x@ =(XHNِ-g2v(N7LA"O0fP}mOÀz26*X&cnʲV-'c'c mhTS4WLm^fT='kĽ+Ahz DzĜ72l; p~5 >v 5G)ǰEO*yW,_Pէ!|縑$`Dd|iaZ1gXaJ*L3EhhUEW43FќH1BxGhfAPsBC\Z2b"?"XA|ba{$=5V"?i>9n#XAcrs!?ܞo3חnP2@y39grN_-vb≮P~/+գ%RN5dq78ӌhc9X{|OCdqH ^ 7$`u#nzAOjLu#إ܅_}1Pe[LGϪMw;Z`_,t9םe%Щ"K?i,!9n>X$j+!X6YUu8=:!KtcލK<_`Sx~@^# GprG#z:Wsw8S}雧4 -{ lQ@Aԟ4o>m|{ bSbPا!G$`ɉdTgȷk²f_Fع,׌dn-mlh]4Dv7fXF{V$Ӻfzl#2qT85+Nj ?Va "0~4oધW,4WV[Pէ!nњ$zL't;zhEK|:nC"Ȫ(`ۮ V\Uq_* EV\(_Yqsܨdc="#}|YuG_7.'ǖQEu9}|vFZ];`!U##KCΓ7ni< F61chW8zRva tNa`)JO-j4b͎iFA?_xo_'4k-X![|1 -~N[|)U~5nE5uxqWLJn30eI/SV2۶]f.)I'o̞44o6cjך :6pbJ7[μa>5'ba_qw'lvl:[#{{ i&^v([Xjcp=?\QmjǶzހq;`,IjQ0B`5 endstream endobj 1466 0 obj << /Length 2503 /Filter /FlateDecode >> stream xڵZo8_*k_z{=l }P, K$~3ʶ\9HH"gOsoq+77W%A ;OpX{a3$M}LFleU\kᛇMm&Jj7fJzoq#=+3zwJ&S,;m]}tb)l6bA)4KͥVLDڛ ʹ\:+# X42ZW+1p'/Z=vc^*q H֤ 仢"- ֥!+Ywڸ}zA?KIxu}s {bo$b}+2xȢn=,H>^AG@a bd=93N]yC!ھ zL`Gy([ D[86O~ M J$ʵC:dhln{{%!dU.CczrI8X1[ d ɸ5(U18OwHI}ۂiA'i~do.VŤq@@#!pΈPk6†0R#)͙Ncw._??!iՔ I vBOʻ?W'/V߬JYdZU3@IKj)”X4N;V-)&?4tah j8`ˠ%fP4sgba$Rni6(Tn^޷GQm9sCĒ O_sDw5GԬN,R݁,_m&P[X UUjzX&mrI6-LcE}!6-g FX-ZF ªԣ+F FdN;ksy46mq-Eɉ_?MaP|k:^Ny8oxi3=)ZCqƠ54h-?{C i\&ƨ0֞sFJۗF;6~;5/&58pt @њ ?meX JK[ w0s|ĈԳi[˗l{{6 Iq (7 =M] l0lyWu<ޔo[S. 4p!0ќq\-Ay0}OM 0P6M' e~9Onb fvrpË D~ZR.qOEkS xfצlUC=iXmCF4e޴ml1,߳q ;)M)g.^!&^u#iQۑ9sp_}?wkGfneiӘRΠv+,2T3PN=9V,)8%8i}Nָ֒tuQH]x/u%z S_KNnd93a F 60P~.zԙ9#5Ld|ww %_N N߶+]wK"09LyёBYLz44~P _MXL% Ť^HP僪Iq=K5T,.7`&Ni,+M_ςthFq Y{޸)KEKs('} %$̜V%޻ak<`djfjzr #xJz٧Is*%Z`fP%>t;@ЦQ65L _ ؤvrzHdfAͥ)MT$,2a\QA +).-O1iZB :^jɬȌ#Whkt;텣pw6է}=>USSqo8{ endstream endobj 1481 0 obj << /Length 2418 /Filter /FlateDecode >> stream x\Yo~ׯXv>$X {c+O>"2"+ߧzNA o*&__o.puqJ.ake%Lf|Jo˙:Ls6oJ|mZBc]EI:_X #uz|jڔHPll&SI|* Jh|޶0 Q"~ H.3n$33,t}mg۠:',liI9>\|& '{^36ɓhrN9M܍(mz$Q܏k?ZLq^Jt?S&v*Pe xJDIQ)T:C(ϴ̎D 0N)KQ%L$` a~SOKKMmc8ʹa(_8 cDr3 x y,N`!!/AK $1\ΌJ3R^ثӁpHQރNY >"5;Mae:?TX-9α-PXrl=ԛ}`n%fO1"<\9GrӤ v%$&#!7a-ȇ栦`Zh//{a1<>ecjf'ɣ4^`G3Ƀ.(x$eaѐ<<I0% 0.>e!$'؃ƇO͐q _:>SE4o*^$6x]0Yղ!L۵1N{ٵ)f %Rg"<\9`DyN:1u sYKB@.!DEl0џ ;ɋP* P"4;E 3%t28tò Zى>ę_8&V0qj-׫y v &3 ÷c~mkb{ mg쒥 Q_߅[XMEҮLALqqcmɳE>6aIKtբewo{Nam_Ox9'՜sz0j"NJQGq+Q\Pk#}JrA 8w:DB c:εz3m:UAP Gzv~#@!kܨ\F5c^?6ssP\ox}_ÚcjљDgt R)%J8@;P:UaD+XKnKm}pXph_|3ކ n/.'DB `e|;E(xp5wgN&!*lև5 `^n;70(D,Rc){0ZoEhUhA\ՈN(fQ|2U\*ɶ|?ezs@҇f͹Wug"˶!]\rw'|UYrު3=K,_pњ,K0 [m'=5t= _&nTK r'k czdm-#d oxA U Y\ .Q %u!: xAl<܎p*o;sD }h~C09kɣͿ߆!Ǹ2 5ymh[|KMgAtB4:gK̟nQB_&MLW0ԋgf/%zQ^#b딹.j5D?hS>\DFqmK;_Jw;*-~<:_ElW?<:!V,6Om1چjtg Vqe\M?)s3a^:- ̕[-Z}>M endstream endobj 1406 0 obj << /Type /ObjStm /N 100 /First 971 /Length 1586 /Filter /FlateDecode >> stream xڽYMo7 бh$R$:-AC[YA^vzنĜG"Gj֐B.\3U5!&2k $=\)9H M@ - HRm݄* -6Q@)&гlW^lh$ ?4p3; 샊yGl2Lqm&ha3UM(YF=ѡ+ +0iWgH%bx 4Z CC$%,Q0ۡQ-C64:a;(bIb,,;hQѳ Q5D44 8k;%i fy?) %,4~m;yx@jJbۣv0HEY*A;Ԗ U[KIÈB*'J7W+6v.-H(ꗓ"-, jޛʶ,A+fi}QTJG-`R%jJ˶Y8cIv\]VBi*CAjCͣLS-CAtqr٧˫e`_rY^my},C/z ''a:EwTB6v8PSUyl1^_-7N: MX':Ҽs׫r1ӯ˛rw,|my,ScXFz cؐ*)vNj@@ko1|z\׶N- iFs5'pMhDgZhSdTF=՝ωơfd{uQ&֎hMgan4(#ydT{*w?XwK?mm7jgno'lŸnmV-j~~^`^a6b&^4bb'Y^߮(X"|oQ;7#!"0DQs7ܢMzd\+)n'1$N'6{ތ1}8$͋FBs^4h]w 4;̢ci]urӺ($Wl{VY6#$mΐ7ܨ(ٻKBH>D#&vvUh|ΡGKtg>׆2ilr]+Qw!NGly[-O)eBpB_wlN[ 3DA\وs7ȑAz =-*-orWz)YHv͂1rGˁ,߿8b endstream endobj 1509 0 obj << /Length 2372 /Filter /FlateDecode >> stream x[r8+8i@jɤ+Ubӱ*_dYMbR)<<8dp5 ?.ӄ6!"x"BDdu|L/׻mCӄ$pt~x}q$i%2I\.>~ \V;Hg*&Wiv9cV'AHwG`#A}p&iIaIҒ fq׌4e[gpu଱*X>34C DJ5L'A'h3DL[䗞זTǀfh40 4c#$Dzd@tk| `rT2}R;{Ŗ-^ 6ں0&ҟ\-^+c*CYC[{N͋tAT Q)j-:4Dj9nG'`!.LoCHo2202)(ij+WV-lͪ)n8Ks;x02"+-:W4D+9n X抐e1SQL/ j_Bϒf)%78lD88X g4l0wS62aߖB;[nlYxzNE¡BRN)>Ǎ#@QNBsQF[lֻ0,(=onڈ4QS{‘MMd'^ r,L%`q5@U#qD}`+;fU߼zwWb\X늌f&h)V!Pqzd 5p4]dMHwdtx>~4OG(Q^p% dZF?" "UzH4MRQqlvQ=CvAG@fG4.gฎ[1H5*w5PJ2z TκK̅F2eZS&*ti T| XcC{Eռǜi_9o&ڈtnH4y#S#{ ,11oY㉻L`8uc#6 _'i dF}hjcc7dJ3lwFPG48: y؍ 30~̎/#!Q6Mo'?*T}"?>Ǎ`#<ԷJȡH/~2fwkI`X|sQl-/jT94"Ot8T4Dt|F y<)M6!+AK"ځMJ~K"yáBߧ!s5ιs&"\^xk+[3ګYJ6[ vҎq#$:)ET4Xqb$WsE,pPqi,7@9\٠=/ټ_Jvl2Y'yH!ulOஓQc a]mB jx) MRnnO1/ExS/?aOahPgF&羫M~G~("q57ۭ}*w^WɒdV%9u[lłfpbɨL@jM7WWܚ#ԹK79 )л|GswXa !K/(Mbj'(\` ۫Aݠ9?.H_?TfHMH08e)xVqFhTo~n}Wݭ+3*^t Z3>;wF_O=Tk׸:y q1cwM}XՂv6 oЙ!ʫ8kšr2tm.}7PE'wm㟻̽pG;971?HRA d9QfQ"ld8{{2> stream xZYo8~ϯ@>O= E76~kJ-4[Y~K\, ,S ?3CK\|\"TC` AFuUA R'Lc]"-*Z#Y%TnX>{OB @ 6% e@ 3kհF>4Z\JjR=TG]iPN8"!Su  &y?_ogX,8oJ$R8ނ/fsNwAX1,sr폜2O6>W~qsڏwPwyջ˫E'58݂Iz§]NNI.1M"HT (Ri_MI`ˣn{2ԙybMBJ*lmCfa~!M?@L?Z4L~2eXcjL0ĬYgE0yykM&69LrG` >7 HTXeJXvL R;p%b ؞+2  ;dՏR7pmIT/fqvQ^=HS j+I(Y6L ɏat[$E>/ RQP_gdQb߾;J ²:9ʄ싮8\Y&<8|RbWDTQb;ԢPȭl7{67ӽ faa͈+5i~6ɪ,HA^|n'6r.ΣyZVkQAغʩ-'=e5I+;m#BD cO_t3%3W#ڤiPTM5"ū']"Lnۂ:q{׺(x0Mӫ*.x.`eIQukb/δѷ<Κ=I1uAùf^ty377bL endstream endobj 1568 0 obj << /Length 2443 /Filter /FlateDecode >> stream x\]s6}[7mNN:;i7Qw6Ah[Yr%j^$D2+}0 8p]pĸ&#"x&BDl~%L~xF2;,< XAqϗTS l< 7b8i\d(TEv}o8[uBe, schV5n@+GGDk9<6v4ҒJn =&2p;nRΠqt̗R.OF1,2)9"`5BgA%t4"ZBS@YW5! M7 #k8-ؘ /X9$95/vJU~pf9 qI~'MW AMsLJ[s659Ll 3Uq⻋`׹i(v\y'VizWm:kΛI Si370&@yzZZhM4ú5:s}zAR~WWo6['żS4vouq^4AB`e_OԷE]Sqqbܵz2N5jɊgJvŸ02dLՙڙ)x)>UHԦaߗUu_cw \7vɩvE|ČU3 pZbpF e=8KA "q0;GZ> @mPb8/-_`20sJqAI{wpAq~\}nB:q:cBΘL]Fนp 93(Hz7"oWH*-zkgv 3K a*y>CGHCb}t`Eaad`aTb! ?T_!4$Bz& 9Q`/i PS9Hm&KV )‚P`n"MJq)Th>X)j!uP= i70X'Q$CE R?ž;&i5`ꫜIϱ$cu)G`9pXpdp9k ypCNHCb{㱺cؚϮޡ4rm yrCUNHCb[{㱺C"fV<be9X]1iqr3$11iR,ʶ*'rhH8n=X!Z"̟l'<ұ1>H}epX5>h.ɘ:͟4bI#V;No 8H,zkNp4TpBY}fSktD@;G^Inz@+ŭ\jTko>1 P U*#!^j6Un?! *ö.Ep7\Oi<%&骠7?2{KdGXBue{uڸ\W݊~}_2_`M`f endstream endobj 1604 0 obj << /Length 2395 /Filter /FlateDecode >> stream x\[۸~_!/2~A4E1I'N"QT!)ɖg1%(CKtw(fqn~.~+ !A}B0EZD0b|Ngu> Cӄ$|HOo]]/sIDD*drs NVp7ZmO tN>^na9ƈ yr?Z13 jOd$#H1awsL]k$8z+7 a,uB DJ4- e`f0 ;kmO}c@]8ih8"!S5 h &y ?Pņ(@Z5/N^K>\re eq67@֕|%nՕ7J贞͡]*]\p>seԄv7,]2s5p^,s0;wVGczpǧ q\#*!<:ąC> C\|X5i"EpŅƕk^\L܁qL^JD48ďڕ2"muH9G;I8Ti$9 ;#~h^̝iV2&z᭬5z-ݱy7H6~@AWK5GA8Ti9l7#D kc$SyC`#<kS)'I҉+.> $/IPG#,p#䱎0*Nhpo G`qaj۬uLK'r'\U?L͙ _t!k&l̍9Xp 1SD=4D9<>#~`/-H@쐄BgЅVV .^VN\9ZKϖ3/vPH_H=5)Q{Dv5P^ ̄w ӺzwW*^y)<¡B]OCd_qgH?!ZХ€ȣ 8*Ԁ4D6wFXg{0w_$sig'P|F'h > '>ǝG yֈ@V?ݸbPȣm<*4DwvXgDf:2 H9ˣ>boGmn#}} ry-G wmsJ`4_fP|Q6yKם<ۼ꼲oE\ՓCΗ' D⼙e0vloN̶b >i|vZ_\7kc/d7XU]lKþw13*>{#`{L+'z޾" IڛWE/}4e]$emA땟{#_.HKyXxI9hBąG˸mvg!fఈ*yېׄ66r(D vsBy4PbxPn!]{6E 횻zAɄAX^ ݅H(J>bK!'* K8kPM\Sfyl2*0q9!n2mXC(Hț}u廀{kmlC,NG 붴;Lv#&FC#} I1$ zA]w&,eorv+vePl]r4Mwiٺu'xݝ]v#iaUz[EVfKAh,p[3!ܢ< KpvsG'sNdz@ڞVYtM?ݻ.[ᵥ!$:}u󡌳^08 endstream endobj 1502 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1895 /Filter /FlateDecode >> stream xZ][}ׯcBIF$-d ʀ{ڻ:jByo7/ޑ4;s8=TT I|*A%N _78>t$un0X{WZyH=+DLC XA+*}CߋFX<6?e(zPfnaJX)!$*TDCbN$bI$k'{7q$%aw#aY$qMR9ɓHRK#8JIl UF9"-,+aEa=TAڒA< LV i,.0\0 P@X5%[}"u0 a(B` ~r|@hls&6V\ Aұ!%3+X's1iأ 4<ȬOan3K+-y-cE4܂v8N"~bDoWIq༷88<`q<{Io7W?_% !m>w7Dpx}ܥ:l_Yھt$A Դ8A-vRÛ1/1'޾ϻ?8~ftLwÇ*2Ts믱 ᣓF_]N!|g,lxvOky/o_!#V,8|ĚH}T$qpU~wxyH⷇},^[ \*_FVDS8[ T N5˵}& L pvt_Ѧvl`:mAԶSV8r9m$*=miZ[siuֶ4\{Q2&stچ<"4M;Bv )K ;Rr% Ѭ82V6 v1{d+'EAyaŔiwKd]{_Nuh˲XŲ,e,mz]sɳ.EI|1xqT>St ܈ĐO@˗ѝ?1" 궠 ͚݃\/i9oH✛!th)ɠ2Ó8']]EYx/@#sXP5-(ҞsǠ|BԀE.RW 2݂qȧ850d-,~G#} 9;qfA4ܣhV g;:U#-GE {TXŲ_ U~sX<5R3I_H&p^fZ.j/m>V\2Ig :;ft:k[Wqh#ɬahuN@kN[rY?'?>i/-GO[DDDE%"pRǥBTc(youv 5n "\>u5LEŻ55$?^nMKuV0Ik_il8Za:[ݚ :퓘1dgK.wV'Xd6P>JtZeZSqx݄iNQd:8Pd:8DAς&AşktIKMztЗ/פ}&5i_.`u(H1xн&1vKrA(5>u'|f lQ1\.H*62G0x5Eh*P. V# endstream endobj 1634 0 obj << /Length 2164 /Filter /FlateDecode >> stream xڵZmo8_o'5Ko}`.6 p j+PGJ溿f8,9Nk[2Z|!PLģGW<<zsb"!:n"*2.eBvb)RM6[e^gmQӈiUU[jR4$ /WնĎ65ufwPbЍʜ-zfLXا-H)z5ıW6?hXp{Tៈahń?x>TG=͜MMlW3 Σ)KAw b:i=xCPc΀9 $\H` {%מL+kU987/2udgF%֚i"!al-v;McuZ4 L%$; 0D;lqg3qr,8` k{Og)eL㋥P2~Eok_C%a'y?.T0?̏qo3XUFJ/Pŷ!M)PjKg94WݷR=smv[u1Xכ룐'Q2,qPL)'y! aSYyS=lca4m.a_@nkiМpN %RW\ն HL~UmWVdV]Wu%).Q.rqLG&| :4])IO4Q QG?1 G#wwh':] T)eUo˔ǿ_*_0fWM O';Bb.zt~hb5A|6N[Ċ@XW>0/B4W@|D;lrQ}Qr0AP7ț7PWΓ8Em]cTa\_426 (yzZS|輄{>~d.ZzM[wKՃ L*E#)2>"X`1"Ptힾ&!DcQ+o.JQaS8v 2# 4(^,H{(̶5Ar4~ѽPBZ-g3"kS&|cjh~zDE }@KFؽ;t(Oo(Kj8։Q<кrz}^a)v΃Q케0h)B=_2_JQxjXmI=>8 xի G] ?p7䠿tT:thpAG~f)3Q\X9X(nbGAN(psHY!f=y㇏'Ga-+yì,a1?g!>= +{Hu"{܃a^x;7ˢ< L7?gr<@,JPw3=9ޫ\ &p= bkN endstream endobj 1651 0 obj << /Length 2257 /Filter /FlateDecode >> stream xڵYK۸ϯ`NTHN򣒪VG$)rvv5$E{v/"l `\Nc%2$6*M| _Tz0V᩼DYn]Y՞vվjuvLl]W6טtbB_ 7۲)T stoQFzNG^(dA+!s[aDMd?a߹ 5;q0w&H7- lԥւ{WsDaZ]5%+P^E0䑲`Zuy+ӂ&Zfy߿~2y~6b>m"L8KRbe f~5D7y v/X*d%e%kD )%3V#}k\J56R&_>@TD2TP8n[BOV#zkf2Cϰ1ﻍ~8~HƩ9A-<2]o8|~f-HD5 7ZZ*7 JIU$CDAG[OߜSH?e'8bi/CY,Y= ʮ;Qv!V=JC(Qia"o46x 괥 P:O-єs%mWRES٪[*X:Sd ?Z=,'i JT|`EM$S\ԢȥF*BUm!RC1O2W*st7,8kEA޹TulM4FF 7ŗ"!c>*,[աrvU]jݞ48@JӞXLS Pzj^g~#jtbE&Lus(Wg?4~ԧ:Ěz=G Acg%:#LJNQgN8N9hh+9SgoV4ؙ28~țbBXoF$һߊmSc+@Y@#]Dh/xqGtwQM>Tݛp3T.t )nu1= J11pg%F/ Q"SE?jMѬ]xk' S9!iA0bo.M*ث ?d^pqF6(ϻ7V"3Vne,Bx&:xboJP$*w.Tcٶ"%Ŧ6;`1"`kc@'iVi0 `#|gN%\)e=YxCҁ |[ڊd*!u{Q.=}.ciq9o-',˿+֎1)}Ф =|Y92UcAs`fgCYKQG|7tKo=J#YR_O# 66*;R {P3 endstream endobj 1660 0 obj << /Length 2396 /Filter /FlateDecode >> stream x[K8a[d fI)Amnae+f~ze^EДDQ_?Vɢ{zxwN=BP(v)=*DD=mDc>򀡩G"aXw v(Tjv[ _0aw8@Sɥt+gWRy +xaII""[ aD8a|ԥz CӥyD N{p̀vo23hP:`@(CbC@Z;yϫuHJoLL'MM6ZRZW( Sa$Ȕ{9&7F(Vͳ)SSƦ,/'\!*=I<;N4,N < q-gn튏$L:AHeE~L/ߛcѯBTK wMƥ:!+1tm'xdD-n9j[viX-vH5-B"7q_RdPХ`=\Aƺ@]`yk]XW}2۹_SSf4` bq3qQOedI& l75M4,&s\$OǺ& <67vDn"lD1uN!GXYZseHgaYgǕ/At"t¶|{,iN B3iܒtXԟ4֐*lzҸiIKj#uޚRę[Vk*z cw`j˗|E{fE% THeݵN.$L=G"Ӹm #U2L8YIi5:g)ҤhO/N?"_khCx5+ 1CK&)._+c`STlok?M7ъ$z;8 yI.0@VIB*']>(PXWu稠`, ~mFJPf VѢjmIakG sw?eV!kۤ7Zj-Or ".¾|fxS /BH?:rrGlͱC^X)bNZV}V!0b>݂Ry )?X[;}9eYkÅ@\1FԅvE=}H4dEbJ8ENyV> stream xZr6+肚 Qx4Sۻ$ ZmN%%^\)[Ц1} Ϩz=w#e\Dk( &^_³*8hTwAyy>;3&(bhDxXϾ|}'|j DjVyk/(%h\ehfv "c;o`Q @"_)l>\9,n;D Ŭ$RbZ{C© bD3ѐ-LL8asf%!Z-mfR=ԑnKC 'تAݾ$"ҢAe ,5ND$щw?8=.wZ_%J8a %s, T~B?<Ǟ?{In@$\ì;p8TBj1`::cLw>c(M cPTa%^֟{II)yOviONַM@,"$<&`I O=/uK,;{cE8's zS Shk4Ll s H5(X$̩o4f1#} IJN;jwiXx<)k 4(=Xǃ3h)THa0ru IS܋L PSYcPx+( HGj4!SXyk]&9Z$rƈNߣJBޝ39s! |Ѻ$j`ВFNa-0909F y%[ Z^#KGK)_ź 1/bBj{~:y^O˺Ġpҽŀ eRH Q| yhbe14TJuB7D!2qįE}Au>_^|8|^95CZx9S>ВI1_$Uf%L:.<}zǰҁbԑ6GMfql` G` MV <Ƚo< /EgX^ [ 6^oN ȓS= -^?YHn1ui_%f~^=pEdoNDpr=}qZ׷"˖<17]XCz3_Il|Qsf5P$\du]V~޺ n޻f{.lm߬n7!rF![gl'`8a{"^eH75穫IZ~Yʁ=5f2&nYu8/W~7HA[VR.z'AviMW*i #aen!]dMôXr +Ц{(=\ 5vV]dsQ]wY ]`Pݰ*ujϮXܲ|ثxQFKߟ:G^˦屜]1LA5CO`%].[afsI)] endstream endobj 1719 0 obj << /Length 1815 /Filter /FlateDecode >> stream xYKs8Wp[\z#;d68L! UxL!8rHH%}-c~?\S A;`➌""_+H'6PD\b/_<"&fcJ!og$ԓH9#M xÈr̰?t=?O@*,uY@e$OujIZݑaʆHt= 1Ě+` W5 = 1/뙢~uOJ=ϳ ~۶1xa_vǚAcBH$ڌbZӇ&B= AA]2#_uQyn&߳>_q9bR1<6s͗wpd̦qxy ~k 𝿟8_|l _duluf(؟su$uHy.ZqV: Ђ he_)jJ x曯㣧 QE9'0.LX?&O-Z0n^ hH$QCs8aO(T^V1Fh\+D QC|IuF Jv H " 0aryi, ,{4D-z\X $x 56W(}I-mà PĚoڋ. Iϼk;>w8#4$BoQ6u΂W973<7sFO v*@f@a_'6OzGdvt}@d"퍂w7PKz鰛Lw )]o!;9xK|8P&ͺU[wT(0Wา+}{ugC:.3ۤc;bt/qjpz48a$8Rp– }/A&6t EM5L 35b SOW(lfHqj3}͖qn'?馶w:NNSVZ,EnNJޒ2^ߧȌǐ`If,-ZlW411 "tr}Q ciq6@%iLNg  RK(eCh/~t~;F͂Z7m:S[$sZ.LcZ.47N=[>̀h!!g wnȚ/6N )x~v1hHDC'\s!N5/F1 )Rꡚ0 nՁj@J"Dm%&چÄZp|  B֡ NZ(nk2eڙy^ł'N*sGi #eyr;`B1y=q=D28"1P$w8P"pWRaSLgC+Ms_]+Kl# i9J̯jM\*GLS6<ljYZi:21v&-ˊ:#nQD%}Fdۚu$]f+Sb*Bk[@6iBjwV endstream endobj 1624 0 obj << /Type /ObjStm /N 100 /First 973 /Length 1856 /Filter /FlateDecode >> stream xYM7ϯ1xp@"%b9$A6Qf Wmf'UZH!!r*.h*. ?Y\]AKǴP7OQ, &o8Xc$Tn.hU](qvBF:TZ`sB 9Av)6\9,ޅ#&>xu 7q=>B DGmriPz tJ`Ld2h1 *c&}0Ch>CbH#@3`,@ћUO6Z,`n$U"VK?w. 0iAA֛q'P8E^K_t2PѠ,>@jz T[R}ɰ4c@IUIƘT ưkfҧkðSKRVl;OcF*mR rжRU*͕2=q-zDhYABHd<&2r?5 Fn)TKhd n}`Ճ_ov_?Z}sa~؇[l-ghNÃa}֏wva0|q+4~5/W_}gm(( )ŵG#AlxmzpϿ ˱zM1eիAӄЈF,D@3V A07&q3:Vcom9&5%1 xb-9E67%Ee]`A0 GF~vhԹsEC/ owvg/6͓~s 4=~vl߄_֏v}gG g6Ya fDjK6jC{Y@imI 踼ӆĄİ6 SjZ xiz~X#v(ތ3XGZVh^6R: Y>(xQGFI(Z$6aͨ#u }Z y[Q0ںA@8Ǩ&z1ЛY s4anv*sn9ʜ[2m`H騇//ja?g fgZufmI/a9a=u' P~ K%^{pjZBˇy ~Z5\G-\ߣjYv^Jw#CѺ@Dgљ@N-V8 5C g\l]\͉oT[G 9erdp6Ea8Q5⥙-ӶӧNo=}:(ӧ[Oo=}:\Wh$GkDhAǣA0QQ!?=j\ܕml>K,S2S`45:]UugvR܆_$1qf Cؒf< TԁtϺq"%~(ڱb]> stream xڵYo6_! &5oQ{XtkѵX>yPl% K$'㑒%q ŏwǻcBۀQ}3;{V1+ŃM('@dž0EpOy:?@?m^}v>;vCaAIL@G- X{H_EyNbvɰR"c9WipskD,v &ڢcɀ%2BMI7():O8"'b*Кd "*&@`#¬kϝPH]; ahp2fD%0n;yw 1s1G)b"s谀V5M&Hw(B~;KCV/kGu! 'vcܹ @> (tԷ?q&6px&Њ .ǂ_OlgHXL+-R@ԭKn+ZF¿@o ϰ~ܒJ \BX&txJšZK `͞\,)ls>QjӔb| _i=|p_5.1d0~ִye ,Ԕ܌zCl[S7O 2z\ϜkG'YԵ3%q̻$|zyLMQ4ъ9LU86?j1:鉨_ 7)jhH8uH idcRvhRwgg0׃(-!  K`?+<]չfhk[jښ7}<&Ni+?|oE\ϊ%c\͵Ho%#R%:nygA]*V<ط]q>6ji0x`ަM^c ŤLc~ ~i8;l?b{1TlSAIJ1SL&}p b^8 v"NsC`q|t 뷰=<#IzWed*]Vi?tuUH_ ^#+!q0ǣ\VqUZMΦn)u (%R}(fvVCy9$PFY @J>e !\/үT"]yфM)j<,&(kgE3 S7/*7!78IQ6TPήs6arӤ!-<|eƉUaU7ntVEm}>f͝upctKw;s<7v7?9M60/-̓B}ovۚ0ӺN=Pg n[|Nr1Dȹq,z򶅍hGI+ lf8~_laN'؎izˬEp3s;&,iuVܶN0 w[(Ar序kjQrc:"uU:])ɼ*i-ˎ[Q>E:CߢHx9OfEX2 ]k HikzxD#; zX3_rn aͮ=ՠ@;PS(W v¦jgVurY8Tۓץ#(,nq_@ז+ W^Eɒ&+ r sGa;y08N|DA⪗9n!*GpN̳"؟.dT&oA["(<8A${ endstream endobj 1749 0 obj << /Length 2151 /Filter /FlateDecode >> stream x[Ko۸Wh)5&qWS -:m1tB[N'EB3(HuP,IY<;J% 1F$BM.ɗ{?.=ˠhBI/:SGt$\d;GگK$Vd~[ǭD y<3YeH wL7P,9T!OY8TΆ4DZ|[yD y oz6U#.ߥc|~`[zԿ04LむIR^K̿l>FWL ̯1-0]o9[b4>;jC"g|[ˋ@ )8|}r^,:֋]6x\az?rQ3\Vk1gn $(tH+ l?ˑc Y oFV{w˹t"{d ! }/>ǭWE yV+ eDk>:Z ڐZq$zz^Tj`/WOmwGDQXKc7ny 4 7 XSvGH;f쿻#HEIcvyECZԐV"<+^hF(csy¡B6!s#LB+B'N;Lç6.pIN?/K tH#>C&G@c_?:Lؘ_?  ~Ȟq}xZvt]aud8ʏ[4gHA0|s 泴_bu5,ѕ{X0Ի˸/WMU_3KjBaw%ņC)K[CyRE^A:ʵn#Zr-M[\[RA?,l+m&)5N},^Enр-hT2{ jXU}:Ӯ:0H >έg݂6Wң!jwnܺ8@-UL9>6ljRdv衺n4]M7>`7'ڐ.U'9_W47=57T6顪2xVPg@_ձ>|*ʡ!pJ\\c  (s:8 ~ endstream endobj 1772 0 obj << /Length 2363 /Filter /FlateDecode >> stream x\MsWLrTDbbN"6IJ忧;_Xr Ryy7?6ywĻ8TFŗFpɼ׍ S{/qص zy#&Xk3LY\}7u??of_q;U ƁL0 KOboXFv' sل:Jкh5U>kg_P7y{ 3.4BA'B1׎y򾥔j :\2`Z982+&i{?`{D,A$,sAAsy׍JKgco6RRåeTR@ _+J^{h3E?`|}%$J!ZPNi 6=ǃ H:\5~ZˇZJ9A@r9KW Lo}K!M{%υ鯁G]nVPrݢV3pK g?g g_?D*y{eRb<0FjC:/yn! +/)1ֲ0G;W+-)Wh :#wF=P;f/ ƕyi!T(a ^-ۛ2hKr?r[.'[V nnH^EWu׵cN9 9"W;2*ג) ĞxpXc ;9FjCj-Xk *׊e2|p R8oYt,z֥IK=~y kr-o7+ ;(S, )Lnj;x3Ì3$x{3p*M6a5rAHAݹjq\ALih/K`ta:GLJ?w8`p;a΁vJCGĠ!0z&'1vZ&[ +B&ř fKPu4) dK X5ْ60y;Bs!JDZS;DmQm4i!>(x1jٚb)]~x޶l|˘7k)=|~WO7no7O?%],8f}}w}|mu׉pOñKk݉bmV~yX]c6] (?Ue\Κ~OڠN J'DH^[] zU`q1tq{j++- >_1c 9|^w $q{%^|B rr@gz\UgWǶ{|=q77-1^u̙a?8>-Et3G PIi 6=ǃ H.Q\3afNqwOf6T`27 '~l|>'mO~k>GOP~ڢO3p{ Vpir\RldVW'_T`>*#3 YwZ?&r`5Ƨ=~qϏkaxx^1oH W/*x) ƣx0 XeƓ,؜cAY$|IՒ·ʕtJ9dH@rVe`AhN3fNVs +bas< re+kl>'@-kb s<Ȗ =Z@CNc{h?v,Oprp@,mr~5\UƷƷf~\|\Q4A$W`K Y6"Wk-*Wk) ZxX&MH.i Hf,3fZbLQ  `aq\m|\4A$c3aqpnpX-PT}8w9jrJԋ롹0VOdUZNm۫9/ntirUWoOݵ{UR/Y=iV;B{(k#S^&X{ٗZ aX'!IAsK endstream endobj 1809 0 obj << /Length 1693 /Filter /FlateDecode >> stream xڵXKs6W7j&B$ęd2$YmM)%wwJ,z.X,'|癀V<Ϙ6ɼcʸd8'3wj0o]R$Wg5L{<=r͸[gHן/gud\v!Y%ʅ}x\pɜTA- &3Z?ҪegrR9zM9 3'B ѶL;O͖jϱKevN3ii_|Gx,Nf@\19ٌN9H֔%r4NgiI2' 1XA^Ԝk@tӱ &k7H wh' X)if&]Q"9%뚔OtBN ] ''W$-9? ƍQ&} [ L)K(A8,ԇq]FIќۆN:IH.9O0Ta1e^` CyC%9+` Hf( pjH [!&9wV+z=`s.lMg2ꈦe2sжjǵӇԘ DdY!P}Ns:-rb Ǹvږ¢t:2u S9P{]-3+e%/`K av_$/m yE]m :?L.>PxЮBG?)L!zu Sjwϡ`Cg'L Ey3)YڬeI/By*T_RBYLM>iP4]UUaQ((˜ac)Xň}L`r2::`;7S90tLm v 8|ڄܼyM"2n}3@b2b#+-jBh@Cv,`6g|zm&#E-C 0o+ʰpf7"r;v$:wסdU[j\\gL=^1n̆e>v~q݉O[¿hH:jX$-9oa~Tad4\Y}>t `X7}[6zyC{S_pqd("$pn,BT_ Oo/KoHZd˗a0 xGư-BD&ZJG%J8Rz^"C)On¤C%e(ix6Ub7'-i,6Frb,gVCERI@S5\֌2TP[|1''惉I]D^ncC%51 , KoBw!|2&;g r=SauwQ0ODQ!L)"0k6. ^ %Zf*4IHm^alP o2d;tŚv*1&esiq~w?!XղU˄? p ޚ` &FJ2Xy1)b-Q.] D:Oh+moBm.^Gf  endstream endobj 1727 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1684 /Filter /FlateDecode >> stream xY[o[7 ~"K")R@QAӇmE؊v8@Q\SyqZ xO"G8צ!\LՅ5\A!%+)9Xu ZvLФ )%$eU'Io( 9R8_PAPѪHBI!8CIqJ K8\n ue9z T0 Ls q(ƾ1cY[e?T'JV $ tZaf-ĭ.B}dC,P-n)|CU]'nKBe_A Ը E7pŔK6ʤ}E ,qPUzxơC+^~ëzx7"q@IkV ;%{V1^ %]X+izGZ¯[\2,q D}RAjezV7,=#Q$b"vbҊ\`4$hP^\Ĝ~ Ovho̓4=JXQ(oGy;X#i!6ԛT_B^ Ez|H;j4=>k1bQx8_\nƇoΞ>Iu0:g;%F(leRq~4vȭD.yX$OW͗)Y^]>$HfVV#ogE핸SܤC#sA{cv@mbF] Xâ014Fk[wP=7H:w]cD)] bRo \I;91ȩ!~QApKݻ6ȜbŀfK;?\QJc:GY7@nZCfr5ۡP'5^Sz7}Nw$z'}N`x֕G%>ɟ1qcnĎhӃheXEKLwI4LGѹF4* [CvuC>|!tv pn]YCG7Ssq|1A`|B0ͭ"#5ĥ`;{ Ъ{ Ъ{ ]; ɺ蝬;ɺSݬ;ɺ蝬;ɺShF 1atG )x90Zb:sn*f7JFsP> stream xXKs6WHX0zK$3Nc<(ǯBiDr39"ŷ߷ "vD:ÈHE0@!1X O_{D KKa_ߧH+XX+8$Mc)ޔ6+e6PBHp36"Xe=2}?!Xč>筀8:4H)%3U@87L. w¶͉0P&TbݘڬVvlN8SAvd>uyg" @bc|`?G=@aMDàtUʿjVɿc)(٘AY+}QQƱ46mjZb zJ'T`b lmb60d0ۖ!+#8B4I;9f\ 1 *<CGrDqۢ "~iЯB-a7 n:?/DDi$VUyb}PMJg14&;þguzIs~J kH3Fx g'Dp%ha5`rG fݖ3ŕP{˕V-**$/<4sӷ(ͫGUfE+wA,~ktwe焖̓RIK}aߠCcZbI͹X01Cs n`#1&셑Fup'74Cyg4+MVa\bK{PX_Heu endstream endobj 1828 0 obj << /Length 1999 /Filter /FlateDecode >> stream xڵY]6}_@KENb !xDN^^pX.s/~^|&:Yt{1I(litǿRN_4ӂ2D<.Zm\$,,޹mQZ}znjzlMQ5n&z/oj_g[Կh!D\}0pWrXtZW_0L[ ̺M&iA88*9oSU8? 8iɢ^GǷ?mёf8$Ma"Ad5|FKr쐄D (sCn,[,˱`WH'2qaٓiS'++2{z]fٖ-9 ©VӃ:`á{xr=EL5nre:H"e7ٚŏ*l5-wض5˶q詀NM}ܔޭbg$˴t.|_˝B/m(O]Ӗ-wU0Ek"ɨ`jqPbp1~`*DPx_vDIl]#XLݚuYgvq>*_Mkj@Ll{ѠFRֶ-,O~`uh uc׽0E3Gae rg7ݾ`ç G\bM#eaISx^}"\dcAn<]$&=.D X|DFbE[. LkS;Xf,XYA\ &SdC8|5FW~y۟1nǫ$9 ]N# S&!su'-FݲOp=H́8uU֍ٸ2v?6>jWi18gh}hF4;rkО\ ]J`C^iq׭=$ԭfdXuu٩K?:$Ys,;qfzO;]kKOr_~!W5L! XC8+sP!:eC9)@PpI Y? ()#X&*˻9~e(P2'A7?&@J _L |Ak;9LHר埰O1L藘~?Xd%؜_b,d&XQSQ}9 ) %S9%/ endstream endobj 1824 0 obj << /Type /XObject /Subtype /Image /Width 120 /Height 120 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 1839 0 R /Length 3211 /Filter /FlateDecode >> stream x]GLUOBWc"HIFW1btRDƲ0\B)qAb/b FX[ Oѹ}^9{͜sf按1^LFH`G`7# p#h'!H#=@6~%ZVV0o!B4Cctikkhؘ>uTM}`44ĉx8 u5@ISSSt:S Ǐ^ah(0?8n8K㇚Uݻw3x(Ōj&zzz233mllʂ5>555+V0 d}}@ͤIAA+PW˗/MW|0 `PS&37n` $MMM 9"4` 늊f͚Ea80=sR\LCЇBBB蓫0S%)KRnΟ?4kʕ Z ]sQΏjaP Flmmݻ:seggꜛ*Ν;80x" 3gxCPrzP?e`.䚚… [[[9l!ߜ|˾P&R[[===˖-S3c ӧO|>P 4IT)8gdd(2+BCCpFGnpijN'3#,oK,EBme5L4n λvR4… a2l^ gOQʞ={DpV[__?zh[lOGph՛6mR\[3~Ggf +PaYJdd$4ΏŔ ФI@FG)  o縸8,4ipFGY:eKǹ`JuJh&[„ϓ <|ĴQ䄞Dkjj]f W(ĺ:Y8=zZ-eG@JLLj?:v%ΊΤeӼ<>+E8gʡܦl0nZYY(]D-|>Y#"\333  aaa&ϟcǎe]Q } rmۦbRΎ "55U.*)Lrɱp 577MFJ7of]TR,E͛7ɋ&#/|q!Eh| V Ϗ uw BG`]O'[MI~M2tՄQ"5669rTqph;::bj2΂ (!!aYq5ÅA6\~]qMy#ފVђ8=~4r~Ud1d)~ ,wAOڵkRB`,@28(U, !q!|ZagϞUEScA;(b/ r=2J$V7Z|ӸKPe5ڬ,qMn RW0Q΃xAʺjifgCOmmĉ,X@p1Z1 %UdSzC4Ұ{(X4ӧOҥK4 H "lllܹÍ~&6?,;bS,G0թkhspr02 6&&;eQ0vDvHHH^ xlC f̥@8r %&$지U <YA;~D{=E\p^&X%~+8.8JzyyeggKmUff&ؒWHw jL46'''WVV޽ؗHJJ zR?-_W4M}8;;;??X8%%%@^<[|X\\hfeAf(U/_d0iR__t׌hժUFuo)osrrEo HP,??5!z3Tgg'FlRi8%+M&P sC7Є  {+ 8ӓ#V^ q"q:ɓ' +FvqL+2;vp_Gsμ<)Gioo}N;x```Ä^ Ň 01D5 1#h'"&ÂF64䟧liSZ endstream endobj 1839 0 obj << /Type /XObject /Subtype /Image /Width 120 /Height 120 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 933 /Filter /FlateDecode >> stream xKa7:.L9<4 DԢ(!BmyDhk)jJnOG&JW\n4[AX^/MdaUSY ͭ e48AD AԄiiC5$%Y 21]z 2c:,_ .s8f[AQYr԰W8uaQ`QOv` lx0K[h6nf$N$Ԉbgqi"<0#oOˁ]99_p!?p-*s\s{j}S{s{^{aw)#}()`9q\Mbd.74 &ہo@M׭Ycwug֎"9\[lѵ:]>\_qk'zXf Qp½*(ZAJ~Ps@ 7&{5и4nW/;BOѸSAR}Tjh&Z'D Ѿ=꽎=潽 w2~ߝ^^G?Wq7U.v4NWjpD\t;&Vto'NL>όپ+_݆R4,+s|STt m endstream endobj 1846 0 obj << /Length 2877 /Filter /FlateDecode >> stream x\[o6~+7Q@7MIMI0\ISCI#MP,`EQߡ> I_:/K%bQ]/^~&İG Lbu{7Xýj_Ȓ(^lAkΙNWӡ#W^HTY(KzHB %Ň#^^ .Ykt/KcjKBN"ƹB,'O1j(.LY̓쐅Q L:bZ8@~my'iL#u ]7#B'icT9$O"T@4'Spŀ8ƑeU2QAAi ʧr[iKʶDUVtg$W=qYͽk|'CqaXc UrߘBzKij HARqB~eT֥&цZ2ӆ E|sUx8?L޴p/V4i,(CD * @](QyR.RVЛ^<Z5xJD,QzU2W {~9r•bQtϥ&~:H7Yq.!_,CqR0cbr[A+2&/&Q5vu7[W6"@f2zwI;osT3ddOMf{6]U_j[jчX# C֪ PX ʹn˫(JUHUV5ՆEjH8#"I()[?H*{!\>n':ʮ*+V +h!܄g6}n^٦ũ[f:k[XBڶ aKfvPQPٸSYuFy[zӰP>nP+`;^& vʹ^T:ȕ&s*4 X'HwtlkA7󼮷YIؤ rM -Ow+y@Wuz} Ƞ)ͧLL\ZVӖMeuIkF̎N1lSwޞGH ]5Td+;/87 ^>`gSF(7iii]m;ԼImHm/TH[3C $Tz@7 \_kKW Ʀ-(#j׍JmyZ`wnb0~غktf Yk5ENx+7AVXǢ1`2-KھsD'n~@Oѩo<N &;5D5{M}* #]T%bhS\tagTuBGzjٟOfWa:x~!g~39`NۈFџUcevHtc֪1ҿu0"ѷ vLDSz{MةN7i/)фۣbq:9sC8>j!Vǡ۾Xܡvu ( w_]>9k4@>5ȶ]3#pܭ+ y  WO,*RE,op uJW0Jpic\|JiӖlh1Q,d< ;nh.FzU4ҌJjgȈ|@fCdKCj1t4 %'(m()-w_ ^49!zP^oLgSy yAdks Ugk38gUc>ӡ `5Zy/Pu(B NRJSS!dBӣOHiU`AySms vo(ͦl3K>ja4 h9!EnEq\'PWɡ[H8? u= ~] 8g`Ue"YM|^PfxCc@Z fu֙0ls[4VϦ&sOCmm\si "ξwl{4x9g`M,CkP6$.E 8j@iƃiKc/(A_(}G%'Kc)Lc<4ܡ\McLgqH#OO^mP44UJU)VWHtƷDtw8-qjo!Ч);>էiSs$O:3d lbE`[;w`qkӚ(L0qYl; ݷG15`K Oa\;j\c<{@tKLSyqCט <<)uomKM-h)>^(Gڣm|<k" rIDw`%Y[J鎈a$S(ybC*ϊ^=<m%[s-ٺkc<{@tGR ^/v_ ʧt}mmRK*z1x`4 ~ݽ@wȳUU4xVyjXO|1,*ē1BCӴ8ɘ 'cZid BJ<&oɘ}cSOx,̤ pHY`[cU.mB{Q= %> stream x\]s۸}J# d'6q_:̎bѶZEJf );A8iv ߝ)c*ųˌQNBf)ϳwTLz5&ʥ|w]]\ݵOd6oe/bX'SX>[*td~?`$RJ6AmDjr q Av a.6O-1>mn?.\ҵXU0寻'7qdl7[hTp]5nqrz0PyTbpqrn]lkm$uɜ{M%%\@Sf嶺\5imַٶ+,7Y׾1=VBN(?c6WYͳOXf5d Ǔwi6k0GWĚ"[foO~hb%DڢBޔe<7G ݫ>a6M_CwuNSfX \f L  GQ~ה^DIєEBX@ TelEP ͵! jB.Ku #Z? cFHnؙ>h: ɴ@]9gSXv #6pPҐ؀s]2`@D .aA0k'@W6&qA3; +ԯ$Y7dp-J0\`°DYXA9zj))TM)9'8ꐒ%W߮x$'1GpP1uiH7H@rbDBԈ KP nۏ)K4cmjS9hnvTcwF Wǧw:_H^oŽWKx*_>@ҟ8sO.$OoǕdY^e?F9 b.v_VhzrBS *ݹy] endstream endobj 1899 0 obj << /Length 628 /Filter /FlateDecode >> stream xڵVn@ +x>6p0&DTv~~Œ4e)j<_" H k# ot(͒IUF1\@Ẉi*4F悠鬅"*Aի?ktHnP^}mx\vįa7 3ϢHx %b htd םeҨmg8dJVA@Q:~bJZJ 'z[h-R|%q?],,Oy<FR!`\$lcԎ*᥁MV a_ЊDOC% X8l fK6A~MX3~ =cSӶaӌЁPKe ;ۑ}%PVs[gq׫W~Ey+uۯ7W ^ZbHInrGyG-ZoH:./?ƫt18T31E,gU}6lQM߱Q2-qWZ[uD<[kHQY2  endstream endobj 1905 0 obj << /Length 1145 /Filter /FlateDecode >> stream xڝV͎6SVh"%٠-oIj%&*%ٷr[] 37C쐉ÃXW^f-ûZ^Rg} ˢʢ॑ٮ>zc!3yUWɭR?J#&/fİUZ7M!#HKɭ1j_iɵ-R\W5iUcs]$F6'P[1qF=m#EqkTB̦!oM\r:-Tk,I3nhg$J]lf͈"3ZA:˥Zdb  ݆MΓ#NSxe~)C5e|hyCfCLër V<$*kPq˭ #\nr)*ޏort//Z'd]ouJnZ/ Kz?Ͻ aɏor-%{<;sя#q/(GI55*8~ʌR+e*wB~?a6, i̋Z0YkȰtѲBDWTN@޹UHH XO+a?RrH r\.DKRG:,1DlK2aTчʑb8tI~3Oi^ʦyc,5W&ʜk=_/.KQKۚ8(LCl)-G,,rf13=)"wg]gFDͩykjqjsDʭa`ސjhؒ%X 2I"gA QfOB.4C2ా!'ekRz}D~:UnzO56 C߱hK] Of?2#)-u1SBL8ϧF޹qm84 ő,i͍މK3#B iH!Ce&yt{:A/Cf5B9n ZZ˦# pt#*}`G9rC`8\}l8*wIo4|]z|E+[Ö+TIS8%?ɥk 4sw~xnqLG.J."{B#KN~E&kxh)TϲtR` endstream endobj 1910 0 obj << /Length 1056 /Filter /FlateDecode >> stream xڥ]sF+vٳ~pqnSKI2# R*, @J x9r`dNaš0B*BԘP%g(y׏e%Y@(Ğh[rM6w{tG܋iݽ 9WR-{ L*[q-xMl8 5 S>oF#?9P <_7WP 5( qV6hG*0 d\#Cn{"9F>̷ AA>`Ttc#p7)hE8[DU,6=)Dg(BџQX?t1)IZ GH%'*67>(꣏vq𶸻P帻\7K#yV\ӿ[ZM2}Z;ҋ${O`ŽYATjPYQA,MWȻ> stream xڽYnT7}߯#z]EH EjUDD!$B f#{ƛ,{Id$Ǟؗ N:QG%dW98h/R  .lol)5- !).f *h%..&,G188b-< 0`-<&j#0IRG FMmLfafY$9$J6B1W[c[Dǩ"$; sV+q!0KI&#afp4MV mDB%6"ULmDE+m-BKmB&nl:b BF[ԍuWcܬz!6A #,YjCÁ,f+\Lk'Y X2dDeZR #' +ɨP d(82mdF@F ^O(dT(2(5Km@BKIA_6ń#r.)lMSIhotP37~^ {dj=@r:[Zdh3OWhzhoݾ)j—zy LbfsL 7`2읽]_ /Ë>S D^6IcB[.>dnYt ^|pzg^#FW᪓99C@:Ixyݗ./˦/Y lW6hm>%U>[F*#8蹎 sFL3$ƛ}$Z#z{=ډ>rADbnh3=ͱz`hN^ׂLXe"^ ڄ8' G[[K˪@Ee@Dfofتk>X(E$G<_46c*:2շ@*jhHxc˞> stream x]Ks6WshQt4uۓI'C['ĝ4=!a TZ֢P}u S,WHoފO>+w?ͥ/>/?>&k{~?ˁ*~H #Yf>seIג,5P4~V,3|>Dwogr7s@&9ZK%tT8p k-xRş/ޑ7v) Pmps :Tm_#Yt=qBNl̬d}F2,,KF;MkT@]3vѬۖvY]1MT.Y|K#h|Sx}Bs Ǫ:c%,CyK[νiI&hhŚ'6'2-{j /d<#bi#SL1$$,xٔ4Mӝi V/煉r E'4NNt:٥r:o viFc5 ql:!\3ƩH/Z-=?G}O9|Mp}4:RG^tY9e唬h)"ؤx WMM4۩"EVHMz4:USS:.O6 N_4}=B|w22su P^ERKnaFSB KY e*+!K%*["khlrll&K|SN1[([3e.Sgm5RMz+QD[Zb2ˬɬcO|:MkhC2FЙ66l^EX# *o5z̚̚}V6?6 h3+$$%j(C2h fT,j(C)0B^DkկM%L~%ɯ2L٪;[띭Fa˘W1ok (wŽ2!cV(hm'-8 r~$-isT!x!Jh OC?6'PP |>_ !b4u.[hь"hmf^t y <*B"bl5~sb,He3˵c1]1/U&9#{{U1UHV!]K4{~*N %NW!B8\ppOcF,!bOՎj&W8> Rl&fYLM_D4m1ӳ,6QF!Ť̬ɬc;b J#ֳh@o韥~Htz3??]4'韁h$zh?INFIN 6ӛ@4OolNxM7u_m#s&Tfez endstream endobj 1922 0 obj << /Length 2129 /Filter /FlateDecode >> stream x\Ks6Ws0Gɖi>ɡLfN]P(2"m'X0%b[ }CG46gjh1~s m %ܚ7|l.~>Z\}Rx 5W^0x/Cy}ӓ u-.BlǿkV{QlZvטji׷mQuo??z~2bhŤL)8ׂn+b\q5((nr t?bRdI\<]#c:B&$Qt+wn^0&taOP'Xf~[ftNDJTiPؓ˽{jžMUPjӜp 9Y)E@Ie_?Sr/LiObK$6p_0WMGow/sjEpuc=:SS"G h{1 zD"'"I;~Sq 樁 /khW̙6RlZAV_ct*( LY6g)'L}vgcf1 OƚywYQ)TՁb(E-t ʹѠ擹 b%Ԣ1yfҹF%P2EJT#DݚK$:(p:gaD4p ln.(ؒnSRTHh\ ܵuKa˶bk?1Z[>`KM`ԯeJςU S[ce? kЖQ%.,JMJxU#yHx_2= "(BEDw5? |TZմ&YNvn{_rA,v)@1B(y9s-aw-z&NZbT;?`T{Nigra%XU? tuCe@?3Sa*- UOH\0 RI1kbMaf<C.}77S3S`Ly[j*{7o&w{i0=G0H-N :mM{wc*66P=%-pAQk&n^F<8H'[cu׏GEn7Gsya ZuYW uP׺ uP׺Z+9ֽ`cWE#Z.) 44ˉC X endstream endobj 1926 0 obj << /Length 1289 /Filter /FlateDecode >> stream x[Ms6Wࠃ|br줙t'N2;{ǯ)VXYkD.[,kYir;'FZeBFqt`-_&7ﴺ/_+ ]sWu5e2_L~d9g Y$`\{Ѩŭ}vrj4BG_b,ŪY-ߕE8r[ĪBZߩ?CZt0#p,Æ.YO=\U cÒvC`Fro0X%`jU.As|o0"Ș&$L7M7f# j綈GM^&ҶڭDu;G7" ,0H. "FfHw pIS+itF<7^FTk4>Jw z5ij--_kesKŊb^a+a3G3Zkѳ邯ٌ5\\ wp>PC y 3W#6CČԠeqJ9 vgyHa> stream xڵSF:`lVGa; r3trHM }WJo}mX}$<#< 3B0-LHΔۣ_l; ,},~:zZLhOTBe쏉c!8\8>Q|?յv[$<):2E?>m Y^\\{Vo0U&+`UAlsr㶘lWάڇ߲;_vHo HE$E&E%E'$&%O2K2Jd2(IF&edyQ^o 5e|NfVk_om6`D#sA3.rhGEtF*:&N1t0|9!*s0DPG"a>oQVK(,-!4ppH\<<=[۾Z^Ɗ\\>rzhI+]OŮWvi8!M#nBQaPj_ivwL"@ i{ICCD 0L^4DL^*&/"80yq y`ir<}Lgdd {D+3~8>nr,&?O'_mMbk-µ ϧM}/or) K]T*sET}1D.<> stream xYMs6W5סر2-ni$%Ww)~Ĥۉ ˇ# Xsiy3ur gvѠ@.AycTEز 5ѣ'A #|,8b}]-X,# 82ղ~1$[ܭ&ڴ&^wpr,ɚ|g$ߛЛ2}4}3Dor!p s|.M7 4X> UP WA *(Q%dW*('*(*(UPTPƛ)ffeNRl#z i9[o-$|ySnRrBb * JRlCRFʦ(WYʇ"DR)jQt'bHwBUH^_qJnz67 6b fi3oeQytTO;kʽ!I,1P)wf>fiTb>18?Sܝ~D^tYB(y;E {ݣl!Iy/ӁZDmΥNZe=i3HK. $!o޵$ZncYaɳ0j$ju"˭{wGIwYtHw9 |%{^J%h㴾5oT#}l[+{sa:%eU~~*=mUOfcH8fdL WcmlxIw 8n[xôF?f${1[H.8 lVVbQ'Rϫt(!TW b1_],W7Fr^|ޠ/՗:h]ݚuc$cBL[]|i~],.>7=5>=$,ls] L endstream endobj 1939 0 obj << /Length 342 /Filter /FlateDecode >> stream xmj0E -%&=F6%I颔]"MTBr䔴taRfmz76|.VbqɲY「gd CV+z\n 2m"1.&ęp(Q?>0ebAZ@Ϥݜ2G2]XY:'Ve@]Issܬkm-ӥB{޴]! =_TᐆKI0=;W;!|lr< T@<]`->) J(SqEݘ\g'!ydy)~1j 烒 endstream endobj 1943 0 obj << /Length 331 /Filter /FlateDecode >> stream xmQMk0 WZv,B[aءk$9J:_{OOd Pb~m]l3U`zp1 앣,^#SXgq∊ҝg9+M)ЗB?˥&@ -(4Bi hD*R(x1&~f4jb'PNe^݆^1WK} $q:$^rx*mBrab_] RvM؆YW6Im C`J#)6ʴq q́[LwTj% /ή.w endstream endobj 1947 0 obj << /Length 330 /Filter /FlateDecode >> stream xmQ;k0+4JP]t@PJV:jZCȿmR:糾bB-[fˮXWjkKVV}0K158:W(ުV##>x-Wq渠Z> stream xڵYKs6WnfB̈́0^$4c4qOIKl$!8.RB6E$⹻@e@_Oh%Ie_}XZ'2 $IACѳׂ\*sD%H(˜/b *÷U9xM] I,\#N"x{\ E**yV00l S]!GY9 ޗoDj֎kXC}.ed03U^2ƸZ*/73b_ՋY$):43(2I$lk]"2&!F;*? 5P8/gaP8 ´j?HA/'ݍxsp2&Mcfbpy)an^ h,e,D>eaVwzL:$CdkETyEz7p.fh壀;w-@OAꁲv;Ӈ݅ HO1johӲʉ},NMpPTk0#no8Fg!ѐ Mn Q,'壵}&14rӺOajwz]=46/S%Ow<&@:N3YH~gog>`z]qjcbp=+vL4o6Ƹ&`*b*.9`֙:[z6bQam+WC!KPkW.t _m ?ȴA) T# mW,ַ>ju#A3.pp *%%:\ ʋx޸G*/Ŭ LC2:\:kSוe|}lҥMA0F_n'mc`ێ:|7(G§$'KYaec nk߫bi أnnWאXY֍+0v殡.qRaΪTiToQZ1X.xٔAmtl.5L;~{,TiwYom8u= ؊I:6ټ*}'"Ҹ *Ѳ*>0 걔n9kLݜÕ)!u?߽ŚֽLebeCɭî t<,e`:aGJI?H endstream endobj 1962 0 obj << /Length 1711 /Filter /FlateDecode >> stream xYKs6WSmI)IN;IӃ-r\bIeLx|.̣Iģ_xfIUgo/gLtt})I(#qt 5z[RHjff(&2!5n0T\ǟr0I<꺬L"!7F2}V2mf }-Pk{1 ݄Ӵ(4cf#hl&8y[01 n}|QsDMr\%&rcar H0gv!S6 9CLixYZ7+q> }7'Mf\$4S:EW ]!eis ŗ;ظfhK~L$I37iBEZM?|Fs6 )`@㇋+\q 42+v1[xSuP/\Y7!]43lL!i]gsvÆ&[`%j,F?x/DY:/y#x= A'N湍h~vGcC0kyYtuGzMk2_sδw rEw@[8״g53SAiqC7́Peʯ W`Z'9f?e'Rλi&RʱDӆ#H_ގk\"d,o%:P[̪]8 =1 6 FзR~T6#UV`)C*<guY63KH #n0 0SjXuÑ>bN> NM~ `hUw .V"2^v,B53d3iRp̻䨔 K_96:oOα&VY/+ ,{UMp}HecpVP(ܺ-ꅫr(pyGn8*&ŸzB-REZ*hPb (:zYS9md6AyPl!+d)%X?Xj\|ټ,yQSQK<*t4\dlPY-T@󩠁uD=> stream xZKs6WPUcrJT\W0-cn(+RnHLI<&)n4??&ŷM$Bj\&rbL)\ϓ)12Fizd*NG*䲨2|VLMjշN#N)/&S *H~_,gy'DwD1 }Clxӧ&S.\- bY, |rMZj6gж?U 4)}7lUJ6YLBJ,KSJ l5(L3D4+cb5a`rh+nQ%F%W D5R8"h̪EfwP8STVU` N4"L֘g<_c馊s0eD3yӠPw`ѠNp~+\ǟZ^T5>,~,=4 JN8UN% o~?a~4q$C@Q~]gk8c2yvVllΓD e9A8I%G/w;"̄Gʄlw-AW]w \Zh?*!Gj 5DPhdl !w ahVFSL[۩黡!\3/c ޟ|,"bmxd űJ8{XIG|3t w~2ү&SR!3뛎mɇ)sw="bcEҷG 3VܩA el+^i{i5Sɇ:F7'`0;VwckGzغb s8Y:TR=^qhظu< k}L>*]ʳ>IGײri9M~b{]EԎK ŕ>6~4TY ŷ~ J>Ƌ U}7^e @ TYh$*Ӷ8M5R>GEG~u@X&BK/Dtt@'10̵D ;8&bW-Ooc HJkڬAKAoȯCԗضV̖AP/eWK0vYա$Ze #dD7۱@6`<<\%4sqMҢp>nt8^ʡIXFr:[ ɱĸ-:ZC%a*ZU!atwyRO,7q4[x#ߎG2.cI&LApCVγDrؤcki9ѐ/Ntt{Bs(95vZeU{,c-#L(U:O-U5TqyKqS^':Tvّu[}ny#_9\h6C„AV1ZX|pv}5HcWh#e?/Ob)NMQ f/{ؠ[7'Yn Rg;r붣v_?ص-V{KƓ]! TgVm?]lC]mU帯O}U }W*怜2~l/}ifz{<N{"Ă[c | X CpR1 IZF.&dښit)hmǔ4a(<"iC!]+֨wcI-HEW [M>(gB_&,Gh ,©IY$@n^ K&Q< ,Kg/]Q"ki狘:[~jlATƄA8b ICd0ꙸQeʢanG51|F>1\gLcq<"[{HEv)ägBd7-Gh#66R4mSa0-aCDž=I={WΖT^GoU5w q~bGE#,1eC# Znбf{发;n3sam`WrM_Ų]WoWe!|.cvɱ,3|򡿘BXbCw endstream endobj 1984 0 obj << /Length 1943 /Filter /FlateDecode >> stream xZrF+pLKrRʱcT,d,ӳ`@ A+Q 7=u7D:ы3\~"#"u͋Og0$2"i4bBG8½WέZ<8{=<q:V#ԆS>įgO #.4zÄ_:9iRK7vgpjwޮ(-ve0,"9ؔd $#\+Dr6C@ik J7G7qN v$墓M` 6'Vei}|Gchl4&DOBr ܑphA K 5uׅ~pyc>iPqg}4a1 6@>:aF/Z .R +W(;sŘPa;qײ=o~ߢV +j"un0縒$Kے kD}3 : WTNU5yUG?T_UiXs\)qڥj򞪩SĶFKm_krwZV7Zvl-FN@ c|TO=o0Oq!H>kӭzN] K5{ifhu7{ z7,ҺzՀnápv JqIo0͙ %AVDPd#&ua2 (Bmq4}9K zTGT:;c2ܯ-VN* VڪٻtBSo|z<i`X8乥SuyuH~ץ+/C {J<7YN'EpKE 7h0]6FGҾeK_~YæjEf BmRm]([4"%H4&iCJp#>gI&B"@ˋ7XI|ѵiea.D?`K SHhi;ٜ5iMVRg{rr-9lV$LZ.#)\FX,y]4YvFl)?xZ/?pL3y&멟ο"/ÍYbf@'3RI.qE\$r(50jqهlˊY'#RQ+]VN6 KԒG^  R H؛=jUYh)Oۑ<ݣ M> stream xnFz .B/Aࢍr-R!$Mgwf4p )r4'GMp񊌈H^Qw'Hd$2XEhĄ'7q߳uq[cѹ6K+f`S^3 jk^ד d$}]0hYD7'L/׵S5w]t=Z#YETnX]n;E$5Gl2a0k"RRG56aĩcyz_e'`DXN-H+әTn:cNgJoݖi+`[f Yqtf ^n}t[]wA S3b+oATs)mźJy0Rl7mvxK_mی]^k8 #IWʃ9iC`{\Z]3RmթʮJ0QK6`| n0V BU6<]mKTg`12 RL/M&"+wTkXhP{Hyr|`CXG`/:8#LMۓzq'C Vq2 `| n0V#}?ОYfg' \B1o)&_ʗ qIeku.%2^kScn#j +Krܴ!0=. `r.CLӶG9uP@J1/Kpӆ.fix?O%RD?Į)&_ʗ qI]kuL%Kwtχr5ҥ`|!nx 7T":^|lA$ĭ#7+-^ 7+ +ךחoaXҼ+`#ڳg i?Z*~W~t_!kz\}|d-ҍFI/\<qMd %.yR߮mִА6?쳖<`~Jmmq@M UԺ:jU()~͢M 0E.p'~9 yV 3binDԊ)7v.3;Kx3>]Skj5Wz첦}z):1x:@[@U>%'~>=,-HrZH۟D6R. k9)]Ne՝ಞY2$I~~YuSf*'{5l6S:b20s\v\]$ `lWCq%jAj> stream xYn\7 Whnt%$Gh΢ L0PԺt>"sH=Xb faPtTqHf\'U.f9Q]5s<74ŀaMpGlb&eh$ MH@h A1!`D%4<ܙ[Iev/0W #u:bK"Z0"ZIe!$fC@\0<?JX\MdXB +L-dRK[$i[pu6is-]@RꌦdqBFf9SBLA.`bۧ jߨ kƔ-:Reɦ`yMȈ&% UBdBd-'T`9aSƧlHGR㡠87AHXnKU-XefTrj\"bTv9Z&)]MPZ"UQ@HYiذ+9e a6CJl3YN,P,İ"k"V!"F=`!F)89YLtӳ_z]Ҋ?[Lgz˗.߹Rd(}/Q4 =kHA2}Th/Vtguv hu樳MKU'wԑY,uĎ:hu$Qg}:=tG`V!Ƌ NA4_DGє}?&fqEED'S=RwE Wvu{SGÝ~zZb; KO`1e߿Z7/#_6 /f)D8wJ=l\Aޯ1zsSysr}[[m'chf[=tMQz"E3yyK.Qtcax ZLϴ~6޻yNmKn顕kG_m'uo2\sGϒF0'-^/ɴw~ݹKm_.uR :). ]nvC-qF3mohIx(:U_h{0 endstream endobj 2019 0 obj << /Length 343 /Filter /FlateDecode >> stream xmQj0+th%YkBRh)ŷC1}.IZ<3;RA+2}M۷mŦ{0hR}e=8mQ L:w}TOB"5XgqpD peq"={\yWB׾c\c׏zIƐ Y`L> stream xWKo8W(7)-(ZfD9AΐlvR`K395.Hv,APM7XlX:cGqMc隶i});Rs_ěQE!a_R2ƢH>~ y6b 3`'uf0wz#L*PfQ>qgg%?z 3$ b^F@t=?`8 +l犨儘>oሖ@@ M}B~yy;B[ߏм`#%5=Elh_$n*PP[{JI;g!alawV/%$SCӿHHO|D]a; /e gK4fQe_D;,MJ?y79b9a*ZT) 8Ǧ~(0o^mߖp~ڀG`=ujʢk9a%_ZN|X>eEzJt 躊-Ãcܻiܗ4WO$ R;\P ^Q~<G2W/bm_jdhuj`~h[#kN?};}AgyWU7Ict,8$Rn~U18xxo!4HS8sjq4 &-/Oqa;O_Pg;W<zLC\|{ endstream endobj 2032 0 obj << /Length 1557 /Filter /FlateDecode >> stream xXMs6WHDA2'8zJrEZUr]DZJYNgz4G40?*rhQn&HۄDWe#QK)bM3~I)6 /6NY8`-*띡CKY-89 l7 "9B48hI& (7~e'*,M@%L쩀ͪXd2]M>_Ć'ZiG^X˼{"HR9R5702gKypUB $v}feuU"|~uJ *5^.u8]˛?|/Tw,5Pd[p~|wHQ$'1n 1~&ڕ7+j f B idžLtmM= \̰hզ|%_W4 H2g'(&^q[ =k&e95|ԓZǞ嗞|`O>00N+ l rW7N>D|]tM<0x' O>sqW/}}W&b>:PWsbEn endstream endobj 2044 0 obj << /Length 241 /Filter /FlateDecode >> stream xu=k0wZBR8JSH$rdBS܇O\5nb6Db@HAwT~t/oIPsY)^|]S?^9Q':Q 2fIa8;!hW˿idCf\ j~~QO]v0mL?Mq|Pd-6 U j3SW> stream xUn0+.)nS(jptkzc ہw)J\zs] dM84zMC:)GcZ脤Dli$]t3z;@DŒ512D05_gZM0KX"1SC|Q 8:}m]K&-~q4<qSum8J#sd\B.Ihϳ-ߡsWVnۑNru*{-CoEU&L<2q> stream xmUKo0WHmVeKUq #')Pqɼ҇7"<þ}'Jbo#Ow$\˺Go, {I ;t[6lFg;:eDNF+숟L{Eu uVe^6.WVڄ-Ѭ{JSʝBr();CK `żUn!e JkUR~=MYE찪5݈L\fѡʜ6aORX0˕_3 cPP֖e",!&wt+)l 9~դL?~g-v֢x"ja[_ "Ve-Y9^'E9f?aNiW[X5 U{}i(gDzH:w<48T0A0׵^'e 6r+Nӷo?&$2kh Wv5,J9Fst|"XyBq"H.'tXX^$ L J'5ϖb䑴O܏vyjC eSڪrfe\ľFozp"m]$i\˒n|Ba %RQXNMDgMD钛7S T5d\,a djokhHsH;up0Bm}sGoS<7 mz6/E^sJ;/bG DL endstream endobj 2134 0 obj << /Length 1334 /Filter /FlateDecode >> stream xY[H~_#Vܚ}NIm$Z)Do7^`d+3"rՕ+wz/Y)oSǡd;P T1RyRG2w< ~"[f@f#\A\&aF(. 4m;luyYGC$|*F'[aO^Ԯ=]ތjqԀvzRa' _L\q[_&rq7M E^ C{or?@&^P%`  &X -t ~@ Ӂ 1(CCU. *@ȮI^,k¬VieA Ũ_rIFʉPCXeM/Q, \FC-qp 2!+gEXl`Xr96yJ,n1Oف%&38pʀO ndkpy zj$\d[IAC6ҊV#X+ڇSg>0.{eܗ ѿaGb56Ka`PEL*> x|CJHfCj峔tk-;5o>RnmɹYMCTIصY=YrOG8q\Yvy{^w&jdИQKDrlaQFæc6<)3eb"ɠd㶙CKڰ?bBT)9~H v=l֑< ˷""2&*2,qDmD4mĸ$UςmL=uu:xm*+ f7iF=l*>[NURfjF+l![:߼_)yjeEyh",8-WJFᖾxvloڊƽR5kiߌώO_wQ|.N4{I hc$#Nvl`ab`!k7U - endstream endobj 2016 0 obj << /Type /ObjStm /N 100 /First 978 /Length 2571 /Filter /FlateDecode >> stream xZ[o\7~c#"%-i8v7ȃ` 5[N=3<GRR9rjMI5pe 8%ZC qȥ9E ),X# (?1V K @la m)aoAŔb7H+VDLNt&d@9akNȒϙ1{e ܨ? I]  PqR \5JZآb9ȬV-UAߺ%B&iGU(Pd3&X,)Y ݫ #``/LXXY*NqtNW"CZX VSRPRr:*) [ 4b h4\j(j n#t#׬ίJZ7ҕ ڽZۈ:wTд5kIhS)uz`!d:%̱Fν!,`>CWsm wݻ?G !la8V4IXxwSKCK\bSͻӳU;nu׿~t=ݮGz9Wᚗ_u+_0d 0Տri+14X]l>.v֟c7+^FjXkwz&@@󚞨hp;ZMj֬Ȓ&.,CV2޵-SaIr:H lހӔ@ -Gɇ߶߮s4}9}uާOM?O?%>ZI(#HKBJkYI~ڼ v{u-+XkdFKWrtj?3g|/I"I%G^f(KB%_ a,g{HG-FQyFf'PN"N i?A"#H[&' D\yb8Oz'ޤyk{R\8ma`?jm}y_lݏZLQI Bj[{R+EI. ^kh7"}zV?BHng~H܉Lpd_rmHpqV"܉Mm P= i1%{դ{<>Cn(=!)>jھԩF=%K>@qA w*O s;jѷp,`_MǚqazkdLǏ93{{Z_.ooM]f'yzrAjv9]Fi<:6 68 ep.s\28 ups\:8ups68 mpns%g*111(cP`pgipgipgǞ= {ă3<8̃3λ.g¥۽];*-jޱ[#.u%l` -~>j'Ps; 5ŏӾBa&h' QbM%6-,V@EІ IJt kqV`UlHz E  h1{ 3,9P(Ђ2^ru OZ8 ӂH}C\)B+r!x+ZN!P %1K9&)_b~OGdPQҲ,3yM qmFE ;=EBUfR%Cwbn ABвY XsB~EeUOv[$N5%Eh(](dtz@Ffe&0hQ>4dΈ0'0BF~*QKEt ~|%c",YDxKiKx]-2Sf7-!WLWa|LId%DCCԅ2 Hف5ě)~p=K([ oz ?$=_"ikծL4S$LF(' s%Ēp;\_EE@z.5/!:E- ^[^%o @B`R)轸o0Ehe!꒶Tx-^U,˦N$)8cä;HR@pd\謙;lY_A(_=γ69LY]DB[}Vv*~T^H7YodTۓY2=P;OxͰAd@7ҐzaG /U!KzC_/]RKEŏz:c Y0sJ(UuX bavO-_l} >沖%MZNPj󽐹5PO~q%DG?y[ endstream endobj 2212 0 obj << /Length 1153 /Filter /FlateDecode >> stream xڭX[o8~1ؘjNWI3jSi[ q`mwvzX,߷jrsA:CQ+G]F. Կkls< l-!U NbˆEnڪ\%y,O B $ΧŚ+N̰u2\ǡ*)rw4JuqF S0;wΈ][~VIYFMnoue~ \KEؿBDMFs7^7ꐗYy§$U4Ы)$+:-T~\J:JGŁ]zpO/P<3HJrA5/Gjz @n b@KT=mʲ F{oCQv &tF1mTa׸kZ f ߛc.1kKLRʔIQfam4Ud5$ @-ꐆ-+S15]ᛅpIyRw]ܘĜ${#j LZȜUP~&w0bSs2:Z"J9UayRWc> stream xڽ[Mo]WpnHI:-FE[ d( (^">Ù34PrpᡸqQE &BEt.J7,!n7X)EVչM W5Zr!;>\`bR?@E֯F%$!!^R5b b͂)Ѕx7<=K zw~WS,kv%6>.Y5Uػx5x\  q{`e)ww^3୼xNY<<Ԣ4f-T|7Lujθ%rD {hVkh5 )-CJWJ)tV%j ]*T xNCwyds{"f) AoNKS t-cig۰g65X{A0h\ `WA(q0ofg0K |< v=NFlj`Ji aMbb;v+>KkحtbIM^Lb#,ER%'=͋76\n$Cz{OoFDsMi5VZyxE>m}y$@SVs,N1!) IZ"Ah wxQj)/@wqcJ}"o%& >Z$jh.gahĂppR@*Kࡵ,8zF4Uxh&N4k$-#dža'a4 5}C 49I,@,~5/-KIī]&lV{9I qdЄ<Є"Gϰ08RT"EKK]Q)>GP ) ' D)'2ج8JK,KA& MH )XL(Z\Գ@v.vłϴQ$iJrEtg u\ ߅7`W;+g$#*N#9Ç4*EJO˷^|6\](?w!_\^=/%Z__^AsTtyp-4߽ o{ oWɯ7sx{ 7/>Krᄍ- ̻T $x=@H@!] GF{hsѯ Ms122:6>SN:%۔lSM6%۔lSM6%۔lSO>%SO>%SO>%)NuJSr\:%)NmJnSr۔ܦ6%)MmJnSrܧ>%)O}JSrU29E22:6>u.\4Vw7P?ݾS!>eС#5ldлx0Y0_Xˍt6`tR !`cVoB" #A4 U~T6*"_En>nf0AvN`Fvb@&nV $eA92;  ltCl1ezu[I Dˀze"'*:3f j'28 fEL\4KR04S AژW!iY6Ggg}y;5"bkڑ AɬA."h;A MdGo.C TՆVQ%I< ̊lUN=%fJUt~;JOW\UЄ#8W@Mon%atXVyj/QN 4`Qw$xЄ;0L lO&'Aԝ,+*F;ݑ^j4 \Ǎ7r;4$oN\3;Ek'j4$U֟5vI#;pQRut8Pu#Ŧcqjq윬Ԟ;%gPHE_^so%p D=Ql.?G}<.ƨJ{w/zOuFYqVs@lF==&7{ \5C&w#8 C-n@3@,Bynϊ`ZW62 -Ο@pJ`J2|6yi8kȪ]Vv^'"1 VdStTO'لBٔQ8VHO` ` ʘ)H/۸p؀+q|Ŗ*M_Pi8jQ^dh>Z^P/D[qH6 smTlh cK)G,** {UKbgR8ʼnch1MFP|&ů^.ƪle5&t4c`D[(NP n d>>:Y0+=ΙZH:*I _aYZL-%eplPyfcpwOm̑Ugc :(~$2VF ;@wKl'8Fږ]͓YlLZ1qLW}q( ҾZ{v: AwԀQ5=fHIO&l58F8c~er}b^J endstream endobj 2236 0 obj << /Length1 2189 /Length2 22201 /Length3 0 /Length 23372 /Filter /FlateDecode >> stream xڤuP\XpwKpwwo;N];}=;ݯs53dEWAAL/hbgugf`H:Y:zZ Y>6((T,W8 5-Ž@CCkT\YC3C;G!lnhp03wh0(ڛd@[ `f pvښJG ^#4?=1,l3k{;S#q:&&xWtÏ?ʔw %5/&@G9 hoh0:@h tO9N LL*sgg{FFbp2e:3RT[Dh00v,lra0LfYCgG w63t?bbgk\`TߖBBv,zfn&;3' > -&?Jښ-?]=M 5=9T@xr#O}SCGhM}(3r44~QҼkGM!'_'ԤoϺhK#WĶIgѲaBm2!ȲPt`l^%Ui3Y/'o1GEH1o"@&0 LtF@_*,; JLo ːt}WV9u5lphQ"ͽOӐ1xH@'챍~fZwc7#_1QgI<2aD"0p^C/5&&TLUT-x v 25g.„FêdQT$l'}fV,w^v1RG|JMx)7 %4PfRF,Дr!PvT SOpv/{ޓ()p{<[mb0ߋ1Q'dsQdЪ Eo;ҹ<8EP8NbQ[&HH;l4}h&m/yʀ<*q(Y%sp4m=م5SgkGwÑCpr#Kax`.,70fp:\$YTQ`^jƘK:R(PA3118BQTyeUrpD_M&>U\b "ˠ'iB5H0񿖆<+ je?k]{M'f5m-HK Í+9= խlLEpTԀ~i@,< 3yB99&4Ç*oݝ7}_ 5_^BjjEQD4yp0T6Y[q!l`GuQ3"i.yN Ls#ґ.KT[,[9'dmp'+?ߢ[Y*.҉4Y<4)H4I@&g2dr䋗`O&_h?~.BNH[(0,g@ TSe+h+2۔'w9u}y W~܇^]BI,T Ue%s4dE6-wFd<+OG&v8Gr!cP&UzqQ׬y 9iZu8r@ygmtƹQ7m3KovhJ(:Y+u 30b[m w N;_jMQ\M],+UaP" _Y3>0ڴ'R<Χ1IW٨4n=$Ѭ}MVkc%Iu#a_{Af7Y S5Z &BP?Ap`x.p!)Uy̛& 5`D߭W)ײL=Q}9YUZfYQc]Ѷ2ޯc{~g,Ow_mǚ TPWj[lr u8]C.2\,'^}aerK +b+~jpO^c glӞ᫔cmmLS3<,<;TGLlg;k}.:JWz/xf9}1n~e+My#f!'fonZ̵SJk rh.50*yQJ[H徶aR>!{լCAN?$ ЕI\#X=ͼNJ^4z϶EvE彳R۠S[^}QX3oU.k-ďZ#.Lw&xJ b:ߡ<%vFyQE*KR<8Pz8IqN_nτ' yЮ%ADEw}Ad63{.=R`1BWuVKWomuEz %m=z:6bt$bu)#(64\9ޥP$]CE(K}Y/8gB@k"?c4UI/a-f LEĉ kK!Z'ڠ#joZK^h>!z):I]\d~TH 1ĮiXE4?fq֍O6%L$LWu+jwD.#(R+Eu*?ɠwRb6teAW >9Qkx ;c =>sԸ:Vix᪆m|ad >rJS+$gk=81`(c:ĎY/i>>/502 s1BQz8a p}WAdHYߘ5$C E(KaITSXA'.y#`vXtT]̨4GRlpa+Nh 18 D2^J]]s;M{WMˀM_n9 ]D%WڎX,X /'0HDͯ84:3ۿx2g@_W>']'zNu@7lagvwp &D,Ұ| {4>0z_ AQ:y6:) }*V4rt:$`bΞ_2RvyZʔ>w7u[ބQ#aQWѷr)BG)fI'I+x]puR~¯볐O_Y ‰gkq7 .槁l鄌v'Ut_grX {*C7]4rsv~׳Ti[(#nLtWY-!a,mˎz4 ~GQlW}P6,#C{!%ML<{lcJ \uf *Ɉw# ӛuzi'-BBϥ4f?b(6=H6 Y'Έm+\(V纸c9SCg7]&P#8nq<ޟ~BE;V$ȇƟ?P97M Yv`xN}b/ XsgKU$ΠS7(4sU~ L//α;|!:eoCh?NP9++C~@?7j_<aʤI%oX26,>Z έPD…ġV\#gc*ց7b9)je=4)2b7% k7h4$X,Ep Sxȩw~ 0Q执Yw=ފz^]eP ESO0[/]ڂ zn a,( PXQ|kE;>oWKTei%BI@Wm0C#:mݰOkOs=z~X%\/1"tyyyIrҪ8/`eF$i9|9O@m51{?CC0(2H]Fa(I Zh8yG/WH m$fO<::5ʀn*KQ40Phjم%*,BẑpUҌZzM-T4 y/2q@JՁAGlHBoeg" xGƤusRHIj0%zKeD|s*cOC'4 DDNn= aQQ\op8::ҒDނf?+v]YMk|$e'PկѲ!VLq1 #lF#K~oy?JG21CTg>ƍv!B5NEp!*S7 ֭(`NÜ?|hy S>K~?PsşU _D4L4'PLg1(t ?#aH00ےi0sog7|]:2Hxy^sB̗T_).$31FK$1L}OV%d#9;0t>:L~Q#\&Ď(Ҟw`YN*juN>AGyU0LEP;Z6/_L/Wc,bOu(4џ48P%;Jw dISAηD\ӞՒ9cUC.. `yn@gv!B&\K}`8@@ז0v#(=_h.\_u J Ϟ[0M4e F,cYU9dVT[xP\Ʀ+J[s! G-]xT&# WLj3e9.4lj5h \.*'v?75Jŗ iJ ңΩ+T7"m3B~d^ FZݾsDJy_vWyS!29p91F`{E/m(4O 1;c}QpxV!JS 4 `N3JŘFhō)X=ZՎi|Pzz'wgW/2Ġs薞?$jDiMI$p[׈r˒lyrS^Z~µq9؃NTN|Bw\awj*64&ٺ&v(H:)/%ïmAoA/SF~g',,:`₰fSltJIg"]]A_*DΉ2q5vADھtVH`b0O)W^NcaX|VC"^K7f{O{Lssհw :of6҃ pc j*$:"Td7̚K B|/CK^Gx_bzmfpy.-4FIL*yInwVo1X(3lq}ɲcOMhzx~C~-(XdЍvxNw:-j8 .Ⱥ.ԿzW=ERRy;mNAb&&Dڨeڷ6P/nTޖ[TW17/#E^+[ߪXW̿Ҿ"L5I vum+yҼhJ- lc@OW9qҦzդʷӍߋ=vc:B#+[Sh{VJ4- ag6c~|Vz?1˕v}}.˽Vc'"齾|yDN PqJ  t wu`;- )E.EaC2[q ?"$_fn S)޲ ˶U$ !8އU-t+ Ƈs^z~R_IPL]!~Ν-H:Kvq_Em>"09!Jw%o$!tPe.ɲ(8GI~Yo=NNW^laU^"Q6*b$(}L^mR>ݩQBt8T |!A[27-q1R&LPBa1c5ߐԿHo*3[zXoLǏp$C+8̊u2{pd< ~ޔ&D|JQC7@23L{DU2XFP`4퍳pة3Z0SE~YhAP2ԼM\+m<_^4#eЌ܆7DB 3( A9ZlCsO #fVhm^铉fNY\-f7g,XT~ճ *f`¹e'+w؅`3&>ܦ_m%|ץh9kIF2* cznIψ{&}r,BЫn$K (&?GEvov67¦r9G|wbc5>O~tEd>G,Wժ$߮~InR]"ptө#eo4C 0x-|=vO"etڸwDHJD`7-U!]649dw˒7ѩ5Oi&"qEȺ 3'Fxs[7Rv_+DWnnjN+aPB=T7{M:!Oaoڇ?fn~DBKY'5 u#C^hS6q &!h$ydi%{ݕ!X#814N,|w}UӖoMѻ*rRk=m "jM4;dae!14п\nwq2 a:hqQy*c 1${j>Ɏd%虓JI${J*6miMCW$%ׂdvD>"-!@AoL軿% U<_R;>\)v3& 1ڜ^zSDaǝ6*ul&ZQT[\o؂!;|n1IP0obV:RG6¼腻εW4)+"b̧}|+;Ҭq5  G(F3<8}gt  !Y YF! 5ye([j_@P|PJ\-kPmŔȬwRHں,Pa 9&J.5ͯa;аy>ȎI6)H<}?{c ߠ:oDy-Y&^1JlBY##cvتۭwcd6(rqxnkf*Z܄RE:6w3ef%#ԖtF3DܙKβH~3GYM2'iycϸV6 s' ZE9H]q>3\\V_)ƎNLqL)M`%*r@VXGj4U8+#3a,ۧwɉjR|]6(QxDM{4~!K?f]%gFKvg+7C򍙨_Be8OdTw,j }pF%Z^۱hZӽssq62O)p*]SvzbXz ёXY-N9U(´Z*SpΟ~EqsDXE3(M7)Hv8j}IJnn58r1jkqkp'!QG%ʽ@:}>mڕQ4M[uzwdSVQorЦgMJrH3|D,pϣWS*Tgt`qd~"jy{Pn+r2:IWbRZS/ J5ve*芸 q%Dyd_̼9A9jaҹ|)j_[UόHb/~u+A^'RDHߵ0}2H#t4A;XyU#*1r 3'ӻ.qub"@f@;$>Ht1z.ax߻obJ=m5AA2A2Ql%3 >NF}0zi#A#ZgC2mC^!ԧ&\DNKCMZb MZޜ=vjjaho:/A!`뤨[ yάs!XHE|Hu8N_:xtaI0,]͡}U6Z@{%+ֹ^apqh#*.hw憌 ힳN,L^RϿX}u_rgu`biΦ۶B#8>LEy/̝`*QBcenY$.0p3}7yq[˴ 4R HA\h96qΤf᧐6Jb7"^pG T5GK27߻5k5NZ)bZU/7%Xv[te}Bx#ׅ*51OoMsS8bxQRX)v›RT2ic]ʷ4 z$#>?+7EѬ -UpіYE 2d PAF?ȫd/A|.E|>p*ٸ"nTzЅQ_@} ` P2_EWzRn 3:$/R4qfMվ /NϰK~fL6*q sDY@̸cw=Eh5mLɰOH$ts!'nNTwv`X)&s~u+89\2SnlHTKKQ~5xͺh2/YW߆800j~(_) hÆ9];Í"Px|oK#*5.T{oBb& sRfoW` k&紥IQ50U?L#_LѠߣv*3Ӹ{7jPZJGF74J|_B9moXY5U)?wxqH4i;ݍ*괍''$ ATga1Nb)HB_=<C$},{;*©8Os*&Oъ?=6 .k3AK|ŞїN8R+^#Gr j+T?Ko` a|D`h+H!9y>$8È/7ݸepu_AgRmј W6:2:otQؔqA۟eBAI OhW_ 8_!xMY7869֝~Jh>t]{kUȠSdLvoudyߟF*>|= ,WNR7r J?MEen$/&toY$)' B=@S]U9&$Ko;3%*PF<(-kG9`f,Q`gk-sCF1I%BPrt #8 Q'ip)r#3 ,_#ec_1gC2P~q?m@P\ΘVIt6)Y}j]B_lKe N(Ǚ0/e>3'"TFQȔCzjYbk W\c#lsf >$Vf|bcxa#Bx[BqUz*-@KƂrhnI' ̓뺤"I[JXfuSL B QaC(7 ~H|[ld;X&PP΍ wZu*bmͦN!N#]Hq*hg?ih- DܧK\]ɸ ?fBaSe}-.dzLlT"+$SWJ)M;Iи :YX6S0%ns-Lu-Q2V m 4#CJfa (bfG$2ϏT:B 㷧/sGR|`{9͈_)"cb)Koynm2T'=j\l"ԭQ"u:W0'g!(6lSz\g`A >lD5( 3U< 9440dU;C]z?ӱh!7XB](UB/@x8 Siu^%ybߡPO2糟;EU-?)ա;ͷO'R?QD~7+А$zOEɖ"g&c#XӰJD+ U-4kB#EFz6sb5gAf_kE\ hLCC%<} (JMN|iS]h#kbޤ']繥ttP-7"xp\TUEJU9O}%8ah9r /NJ4Ēdx(\(SW;}\faIKd\R*paVڴ6TeJ-E8S¿ihqb2ZD.~ x gaɒ8҄Ҵ1P>ީ6U-}kJ[* uYSw^'= oS??(*0C/|o3hm[Z_ Bw˦_5.e|IvvuƘK{M,%% Mt% {&*q<#q-]eg7zvWWE>ǨUbװ_{x4|-쐓򜏹 5LlHc¨jwR`֔y6,uZA'`d`8R zQGd`XJڲvΖr#aƗxűL,>w-P$UE|>g(Q S x7'<{ܻ ԡ2ŵԝIS| aUGx \}{3'޿=5>! Mo G-:a nM$/[O`1P..f"gCŸ!26c:r!x'*9cٱD~;q5W0GJ9͎tzP[ȹţWec딙+tE[8o2K}ŝG Rd O0-8kl6tt.0q'̟Rd jX.u@wDDj~;$P8F}a2Ju 6~;b\',zԷĘ 2E}6yӬy|-WypbEjEJ(]СN$ ⯀az=\ɺIyӆn?yFVNx#0Tǻ:\HdosO#rv 0WrF/á#H} ͦAc4z5\d6-UL[FKXh0?xMcHwܾAXUp7oA #AGӋAOGDH)'U-F46/2AdBϊM|;5tNk֭~O"gҙp5~b+۲RNB d &_`.b]]Zӗֳ2H$7ւQh .nFof!^R05mZބ=K $?7v :ɨgz 7=;ֱsӁF #}o7^Ќj,ّ"ZcJٔ*xG<,z^be{e_e'"[;yjO#M>9\ܮlހ;WFNvIQ8sͺ4)(6]T2rbt{;4hC[dd` =]5߰"T:06}!+~%*z6oiAL@NzO!}T^zʋkc.۶ SϽjE{'D - e;jٻt.i"6s9B+_d(xx'?zũΨ2 ʉ@>QRA7gy`SΕ;PgT?n! _|yc/ESoX`,-59EL_<="ƮczxQX;}r6Ѯj9L0dv4ƙW|Z|@Na Zy+e?qn#:)ևtg='Mp~z](6t ?:?LI|VTxdŽߦ 6RY@ouf[h9-'!^UdjXT@D@ǥƕ(gQ?G{S}&LaJ$ZAEDxr7]v_]MDdPߖ<.(;ri'g|骇)<zgB*`v R6=\rX}EYSN7g ^"œ Id⡈"4҄aN za .d6r!9>}|ilgo;w  G!/Tųb*MIo>l5 )w2|n8oIv"= ;_R695WƗjɷA:# qڞ붱}'>H;eWtPk[̽=L-3ܓnzi9{%Wo!D ?OqWUyJLTȭ"SuDZ𒜍Tg-.hpL~%bR:W E9N2VkObX;"X,75,ŁIb/0X # (fƯ;B榓R.]Qcv 7(z2JGH$ꒆ„v>=.D=]ݳO/[Y0h}.CP~@v+sQ}LZ~ ѾE\ǻd޲3z(S0"m68ϋPO.N֣`6 * Z RxRBQZzi"s/lK{7PL0,bM %h.ݚv ?o_f ] cG0bu&ccH,Gw ,Om;Z@\|4P5tUcH"u^,,*㐤@7lun-)fÁhWIEՌ3um6B/bt̓ڹ9y=a`}k\C7h3ĭ'E?GvJ) i17-e{C ^xək Ng"T,YMJ5Si^3>8]|9&Dw̗6z3f DSj"kTYj{muP\@@ĬfwH:cЃ,Ɣ%zQ Ti-sSr4&n.wԠ!kI*ߐ k\n6j 9 _1~b"Vz&# VChDQQ) Uo$%ASud?| p: `gY mr=z{Hsra`o4 ]] L}#̓Net%"AVreQN^VXy5ݲlN@Sp%~+a$iWgPgVJ crgzq@ݳ1_fEv㉢7Fͦw\|_zh0j8E+G=.L_U`Poe 4l/Bse7e10Gys6Yj*:+U&<Λ7UE[]QwB]b9 Zc醟 {Ґ/MW=2Tuojq֚r eVpոꪏ~mkkek'A+ iKkXsE ×iqKTfb=?c`kN5FF.UZ*:+ ̓+V蘖ȫ>NXrT4V|,Bep`Y[q.f閿L=+j, [̼le#Ne ?p> $N:˜pRU:fsu)EC3l{vhi[q7q{UCGʵΪ6EލC[!0V+5rP@ v \C,MoUL,U%Φ̸3.WzxH\u ;߁FM.slYq1u}6ʯS4WV@FG;A4mX21g"ʒߜiN((Fde8]Q`6B,ĕ/J'x +bj@ qO|x_S:pq rBsD>ZM+%-٤m԰SGt Ŏ&Xi좎:fVZHD%M`j1Yc1̬5=o J(kl͡ ILԽ5*EZeFΗkf|Ungԉ@{mv]O/ݶlL&M_$X+7wK|zBb K>͹u3<WHtcj%"uV!Q g;]an|nyΕ}J"&LNoW>dR$*XWx4k\ *'3ٱ+'/)88%HlV^aW+]q ;qP4KCBXSIWl2 E(Һ,9ZEA})|k=c6聵okg!=N(Dп12u4Qd\֚>ٙT#h_.XS0d>¼mK4x`:\u7X^1%Qa?;6OҹxucC|,]ߥBo`'U'0ECp׎+m@ SZ @ [. 㰎l;~̈́iںe2M[Cr :ީF]B'1)<̓?=._)I2}c}?_&a#Sd6Q8'#)oBBDt<.WAZz}2xV2 ~;C_ȟrEa,ב4Q;*gfĸg0M_RXƧFh;@̖}q) IVgǧ¡,2sQwS}!#qC%ŶXwM<ôؚd9|b BZ]%؅ڦ}q 'qzBM AY:6H s]oX+!o5۲^NACW ZSSfiVLb^2n^ ͘9ZGOcJ  |4Vy._s ԌCPf3oF? @nR>I؟xe>(%XYcaa/ 2qZ*>Ƀd'/JΑ29Q >ngj}ㅽ1㜺tH@ WϺ'd9Dܹ`黠+*c:.Z%ɓľl)^Q=-׊Ff/ݴeLLcpe_n- 6& R[9{*8jeCZ7?.pɝqlN?)1:BqIB=~-0hj̬%٨؎n4,NŜlm[> stream xڜvT˲&<\w . m!8ww sϻ'9w潙56W]Uu7g:~Ck}=#@BA͔Nhhg1“):X;-x2ev@=DHdHXL\l\fF&+ZqM L&zv6@x2AkW;Sc.ߟJ*!#Țgc:a@idjg`g RԂڒs fzk;_l!=БjR@+{!h,.0` Z@4~MDkvFJ._vF譀 T [ Z[Z}~L6#!.|g]UaM#&3?xȐj_+\zj%᜛ئlόgq4h k{lux',;;n7ֲj3ek I8-,7bځ2ݕ=?BӭM ;r,ΖqNL-hզ Eo ŲnSx;/=0RE-5`޻"^eeHwȈ݆Lim?^#|}يw.O",-ùxQ/N^SaK-o1ߟ Qqd¸:?f5NM= COs W1`Ei'1W^kk\~}-߫"ki^?!NDp(6nVH#"~Av9=Kbm sMZ2GUͰ!{<-1Ҭ #NRd]BR%<'[,bW{=Ȣ/&\t\*@gD#;lT Gz2nUxVi k-N;{uo1Xyp/d3[:_b(iM9h'E{,VҋƦ,Y{b #'`O!Z?-P= ;Gv\}؏~}_^ۜBc{8M"bfJ~jOFG euwbz0j,hrt3D5 41Q"L_ iQϫPnD\ |Fbd!%K2{QYf<e1]2v%],~18a<:(0X=ͬ2KJ{k'0j/3dpE0\ӽ] H,釲X;. EBi7Გ’4\`ԦUxO~2K|3]˽i'59Yl Lf( CbB:ېXrQs"?]-pEbl>7w5kl a %jfzKM:tщ~țJ@X*%r' f;>k46OOeyf>Q|Pt牏O~Cq[R(g6ԐN|j5%%b (мZK:UirlyٽkSo NMfCc;~tRrvbhzi' s'Q&#~=F6jer&:4gL ~Ȩ%m!m[@O1[w/?GHXne*VSu5}`7QXnNHĵ HY9 DI (R>_z xp>)`O 7=JɹeMT~3M%zqgvPPDJ5H $^Ŀ{o*T]A,Ku@ sjxA>w[:yM#:g5"6RNذb5oZ tE kG±"%s"8oɾ?jžP_8$ L:5Y'm4!"rKwF|ET,?:|@-GLz@$\#0G貼͋[qM{6 o\2;#~2z']@"kDAmjXoM^/BM`y,'CQ~tZ-L9 뉲Ln߶ ~bsK+RWEifl*KK/ϯw2Fܾ)@&`a2^r:ӁKWw5n}R.e˪y^>J&6an%IeNC6Z;>yӟdן'>E]qwP9SV[}˾lZXۖ(}w@Kۢ3KNcm]G#fm.p Q ^~Ug8zG[(l4*xEs0|$Ud#X>RSO<6Tu0 JWAb{=j^tY҂L5ṙG}>Dq5\U?E)4N׿eiޖԶ ۮ扠x:(6 RZVxYwtS]qew*!ͮA'<ـ Y{㵿H>&QO+9QCS.{uV]$Hy!PP`\6Z$NM+nFϤ +3,=ګqWZ.8Bl _88xWmXX *3*,):&b)''s#R,,nuhOAGô}9PvCa6kBPS2Ol:*' ά-o´ Ij% vӘ$R@#q|2qLe:Pn^'' ˕y9ԉBeh/uedZ$[1a̺Vyv*^b9Gğ/'Y{D r^ʶP! S"\1yrJxf*tW9|J%;knqnt=`&FbGl9dfjs}tևj#T>#rljnJy'z)_Vxv1Et{ nT'FL9owէ:c7Js [՗kʘ+KG]nzCFDbL[PnƍfP'!ݬva] OaS>NwVHg\$%fD!%yrh~{NBCĹ>uJpt9b/J}U rWf_}}Ϛ|Z_6PuLTqҐwICHgqie5 %Vû_.pۥIdۘAsq u?;ApH)Yl_{9Q9aA(È! {C  .9z~>?\qWqƲwr&+t`R2 nPl§r_7LlP XC1=wCV=*>3M3:tV_*jl0eRs8_ä:->}ϖ3!+iǹON7:G_(+N.&uF/x*KZ~B ]'G3l;2?<@塺ljiۀV˞!ZYK}K:=*}~qQm@6;S[6:nu8>mUK?GY.<5K* !FiKwL ̬\  *y֛zWi"o2B ֣sTQYN|W ~eiS0;<=ͱd5hKx(~?Zԅ-fwJP(O2t.BL`K }D::pZgi;5 c ,$8eqɉyTM 2&^## ٜx|&dE0C|vyVG!&Xu!!އ`^!p;'*dW77 l؈d"-k$(YI#kҭ"P~jؽb_˓'}S8G: pZKw3twO2??AKr13 WY&omv~TGz&@f{tcL'܀8j{ :)+J=^$rĸ:'wW(P'o "ײ` `5kfQT= DRkQS86JSrϻTUx̱ ;hNnK{,8k\=W+[YkZlk~J 4H ?NYRLYLm'H.":3Uuð|%{Yp:ħK,LwD]-F铌*UV d' 9L@vzã命PLK*;Va1Bӷ/?fӎ ipg(/We ?Ô?`JIq9B6RҙV݋hC5ߠ(RKiaq MNh^so1^">{O|(Y'1ePmŃj\S|P1s*|ъȟ0## [; Ŷ^3o&\5Zeʤ1̐~z3yv+]#2>PjHBkI i:>X3[oi@e0[&JeE9LnYUĸIq٢i F|%rDbsňEɛLI6Ȏv$t9ff8N[hbLZʙ tJVsdխfԝ?#9L'U/b_G|K5uf] ڧ£~+ ?&mvwಓt֥N"ѦY!b^Y{>@^:D&Tu5 ,*'K5yguGtlw56.] 12WbH4<-n7{kVY "Xjw7x`.{ٙqZ*PD8_ Z>hܪZؤFGx>1a@;#p0& /@ĈHs7 '^WZ;M\R .rE>wh8ۏe|s%^Nz1Q|fx9{(!W5Un5B_f(z!97 托fqr۔UAM,_ Z]'awq,61[0r=,2w>]` 4$02hȤ]h.<`EL q??؟E'(5Eojج@bkYn UCh~mi~<_aǎPl^kVםpO#etVl~~bD߂yľ& ]V Pxvjx)rob'Ch>Yw~ne!*PzB0w”sX/^B $״qW#1i"t^RNՐ4HטgU Bj}2 3œlmpUIb9(1]?&.D#$D&fOA]bi$T*xѪ,-wU.wjmeDo'VB]0顓;@˛漢\b {Ӭ9U⍁4Jr^'xBJxSL|FGYuRy+I$)8"JBD=RNX=д2*ZöG3,>mѴwE3)A+^n7%^^ ҭ¿#s|=7^[1:{R">YfZR!,`*`Ԗ]+^]ٌR|/[05j.nl-LY\p׸Џ1ȟx'?h3V1ƾ>(KE13ew Iܒ yP4N,PMp ԏ3k- 3eq=V$c]KXxB~J ֌;+Gws?-[Jz2B;S+gkT{0ݗii!k җP%0<"I++urBv>s8S,\r˩1YmP r!#{N|XjU9 >/ɞ#6~+kNuId{L,S7 ?hT02!TYק(کyل\6e~ OH+4L_c¾/41G,,,(7g`|tq+~|ѺywWBafY)g^ˁ]oJ (B&9W0+d˷㪳\⸳@oj)' k !5 I7(X^aSHJ),\@@(쀫{t|yI7A3ZI.E[? ,$}z7Lʗ U1=CT̅#9YS%FOJSd``BI_* 5J4b~s|V t6Voݎ#Ow^Yx8X1ٴ4w% =koǢڜ2 *=jU?g]Hv [P^cvPRܑm7zl 0D?X <j?cFAVM29T&NDEmB$` ёDBpY;ɴ]hۙRr_sI,JXZI&]G)G_)FWcDI:;9#RI<Gk$8[?Bʀ${O/l=ԩ+|S>Ȭl׏褺t6!aB|`I\~ʴQ~cT ~c^W0nϼSTR'w4A(ŰQeQ|IÃST~1钵h m:L >Zll&@WOU3-4ԋqO3jҾ*ty*pش5Be,缗1uAz["vkqHg*ZN6_h 3@u+/))*Qc pUu+sve﫫!ffe !cN<ʐ% fw (ժ"tC_l.vN!{$wMV ItśW^MQeRTD@.`֒Vn$@c|%I"X$SvOLURcKcu3ּF:U=+Ww[CB5$UT #?Q !j]3!R_Hch*K|# Oc#s d&~zgC34srJshf eݭ0{^? ;9=$dLxA/5G 6R F+ctY4#uPCy0MڀMJ]g!Z;!BWm!x%7bSv:K`ok-o\Λ2d$W|B%)^ R0!0 \~j~iv}5Rz["4yC(?~JCI'ΟBnW|5G7Bv:od89id οdqX_ 3\+kH(YB M'5Q])KS$1(=X\r&sY%S9&g@ ]A_tmu2s :̩Nk1 >-Ԯ:Bg|Mu4U7 ce%/{A4$L/`f"xy_xߗ \J^t 'EeZ`;@.5T莍,&-\tXB.Tf`73+rw-K*$fC*k/G5VM:djX9xF0< Ѵsf=+Q~X﫜!Yہ"ᘶ3<" QP2<p "W `ԴNi\@<9/?/Z=Wfcc! C o\S''P8bmuKFtifS'a>Ewu*CZEzw" Iƾ9 #"-P̐fTaD7`L0uUc1  ZMtZj.|6rpш;ZfP؂ۻٽvv G3p{%OѼ-J1xfս:q}WD!]¡\vABtG[R^<Qݙ (e= PB7_~&l.g(OXNECv2ϬMm\P1SR!Г،hO0nq+cU5}XFV__&+Π?]goJy_{r~YBCQCk"ͨ FNe禌lWu,Dc%\9@FRFj77 }[&vűI/CӍ7Ȝ%kEQjk0<$8ζ*tL 7.% h3 OsbeHTCG Os4a֨420bGwb.{1JS=K+qܕ|MGuojj!jE UoـLTL>Hj' ~Ѳ#x@POh$i<؞&h|g-+Ygċej醾3|P.-?{%z_֟eŠK˪[RHt 2Thd*G\m[ g @Ds~Z<&2<_S)NJR >z, W~bB>T^ uv|DlK!ܞsFaKg"8tQ݃X.I$ n{/җW"v$X O>pF.*"Yb{A7QD' >)@sh"WHYD<ƘyH])LV>k|՝06:fc3jBCSE]k4cO5OYfSfX5nu%Tw4,4^J%ݟos48c2=wls'/ X(1I|g>y(Z7LJw+!p{k8eH`O##Y\]1eWOQ$G֌ݿB rÇ[gZ]CMuJZVcb{LnZT q2] 晳 S0 }mc8QjwQqĝ`!Y/T0˛i/#•V< }S 96k` x5R#h;獁`)BQ)dc$ Ʌc==8= yAf [tHlΡrvFkM^X?ⶶ/&eL;{H#@Jt'v= sRY 'U3a6ӄ .v§=6],[Phܤw8z4梊Z+^5+ 1tb3lNZK?$UɊ9B>+|&$zˏIx}RCxjHN2x'BvMay+Gv=8z{M=\7hȣ1B50لMȅ]}s.ri&"26L0xwASJ:݉x8ȼr&['&1_!@V',;g<^a6hHn|Q;CUE@f"]t+bdƾ>ڝ]P&1՝Z>c&#fo:g`}:6C@RFZWv^Ԩ ~yc@]1P5] ݒa,v峡<,e . !x@,!~O70=]'r?{'c@e("^ɾ"[vͨ }NSnC;eݲL8Q7PȃE8v=x `opv+kOXmֶ>X| ʅ9? C>tw GdG0k<_ƿ5y{WuΥffY9a~jX9eVg&8ji'L\t WpH#UJ ]BvT9,x ۹dTX,ׁ?QE6"QЏ'ԢL͈FJhm/+.BRHe!M?@1VW%;$@}Ʊi(1^2R"1v<TN_&ʭ1 >ȡCa_I,HIVI&£ > йIX_m;1[`+ -Qgp Q}n4^|aәGHMĻQ瓮"J"[ uu ϲUk |2M%\ʳFe%䵸u`)*Q#Z>z?K"cn+Q탛FPͼ8l (T$큘JzG2&4 +)DHk,ָX"13·zxΡ},ia}l/rrXV@3?.гie9 P& )}ŏS'bA^eS +&YH6p6$WV&D%ꨫIO*E O{KES{eĜkx4_ԏ'r2ƥ'ѭH1`LGMO(d歪) F t +mKPLH5bDL|6IXؐ #bq' -S4 '4}ijem1p&>RU1]CcJ0X+hMN$0#T`>/T(p ', @'' 2|cTk% d\/dL'6 DD!l)qA^|W8GS%۱1KuZf(]]6lYqdP f(@$[O6cD^:7:Ί-krdut@_a&O eecFՂ.3wHi:qν0 Y`{\dk߆ZyG -vsƾךH dk AS0鋹'}\31Y(UeA MI t@RQӞiVz#,q+ʼn(r3|>iw3_KNo=3@x"0p32:Ϻ 0>|CVd)H3U1)t26MA]R2}LCc\ %s,2kذoPD ?C*H,cO=,Sn>Wc: NTID-5z%trkkE#č(c9y s=ڳljQ4]ԲP4"i9R`7)Q08P`<˘>Pj*.Jܪڳ[GbEG,;Rtc!<+66NdaueL+Xym0mv/N.oiHۊe޲h~um8n +mВ_ϘDi%@p u4;jWwOEPzD%$#lC㠈n/`ȣY-tZ4-냲]y;v Q1.nƼވy#.UEŏ ٜJsi, ?qwB[D$ ҠJ& a_$$E)MaxVYGe*{t-| :gQoJX9 KJ1pR,i 62U’[lS7A&Gz٥ :|(~dcZ<~SHEIHy_$nDcm0& ]]ndY}!&-m~n8P6=wS? ˗5E=BϾkX3xB d]K_-Dm@$R0nT40>˲?N9X+vH:4W§ Gh)V1_f?(0sV~L-# YjY/i~*_u}΃GUVΒ0zXf MJGxf@<1vo:B}FAɵ /r?źBW''}}]}2ӿXJ- SNBͫ[;R)_pPmՔdTb93m_ 5 hMB]N(I m)/˩Opᵆ阪ur "􄌂[2uwnHZ`}-O6HN*KcpF94sD!2ZܟGo,~=eḏꇴpqNlRD4<;K|pBk-6:zwk2jY@e^PtX۵ֆdO+-f # 5"<\H`(S{5Ht꬐uBpX>͇!G(Vg`:-V}|X-$92EDz #xG{~t>,w*D.9/D?BF~  䦘@oI똯/UCp8]؍cEjFvUǏYb[zfߝ|gN \+(Q\S)$˼ _:+X0a5LxnXu#(` Ht(K( /#_[,Nv x&) Έ:s+UT# `~B!3$lmFA*NhfWJπ-kÐQ~A뱨c&z.hT͹{3utOh@<;(Quq&#[r2/۝lűZˋ 5Rڎ9;Wq̂4Q> qn{d@x┹MVki襔ޞr%Q#+8 |cG,]ԝZ]قٴ0O78}VR7$gꟾsAyW?v Cm~ qn2ch=8B1Սwlh2<ױU_+=vcTߘ*ᐈ}+dx>pA)ݽ5SAN:$Z 8=oh#;M`T:WyØM{@,v 7i"i _I9A%y ܜErW?R[GZ~*&՘i7j0AZCJa*XQ, qqSF&y1tZOuZ6RQK+ ǔeΡlk?4%KF0+﬒ T~^鶖x.AT:/B'":,:=~ ŢZ5kW#O㌞ aU7 [ |ֆ" aDXvBLBZm͆$ƌ>r@F)cߘOπo@SFOU#d: ?!ޢ#/Fq@>iR\JOjO#ќs2-Mn֢ev 6U(T6v`T3N;}|@cIX^duw *k{' @Yaz,m[ޛC=-jeqe%t7kpHu;TA bጵv)߬ꑠXOcRY>׊@Τ)k YN}9Ф[dqHfۏҡc} q,m( I; ͌f90eεԬc u +[br} {hvnWH!@K41'_O nc;0 4}1]_l i5e+?6k]^CqZ$1tWڌw{@J X9㻅WGȞs| endstream endobj 2240 0 obj << /Length1 1423 /Length2 6336 /Length3 0 /Length 7317 /Filter /FlateDecode >> stream xڍxTS6"U@Cޛޤ $!zo"U: HR7Ҥ R{oe<3̼ϳ٘ vU(iBllFP 򷝘⎄"PrPX2j#0PK %"% 4xClJ7; [' PpC 8@rbw`C AaS r"\O( `AB{: WȟFNP_C` 0(GbC<wvw@  g8 ?_DJW7;0@WU AP ]:a;uC!Pد~YnpuQH_)C!`1r~a&` >h(`M9BPQA 11Q ; mp8`ۀA /b$ = ~>C( 'wv{P/ ~@Ͽ Ga)ϟTTDx|$|b (3Հ; %p@̥27 C,%Ws W( e mV B6^ #|@~AP* bEb_v_zA= /Vd`So#MHT rwag]|XUC~ G!l~;@X@z~0 6U=ݱMl񂀉g`Pס-U |CKmQݑ(>NZjm+͔Ms=z.+h1E=ҽϗ#A8"JHnkoɑd:u&!sErBb (<`NG=Un}b̺7D{2Hx 4D%f26Y=ݩybT{iiA++$dz/ي/iNsQ ?XQX<`Y4!@z!1ʉ*U?mRӉ @P6=(*>1!/2{I͆-֯4Af;] o4D?Pp56\qq9zmjR3,q&FFZ8i:7%'(Ȩ\0+|! P~t8՛?[۹ YkY8pi9Ss?dHT |W'ZOxᓀ{Άcz`FHs<<3=} Uƛ%dbqZmZf=F gqG?ٟ^~Ek|Ťmbď'Ftj(,$ e@;L"BxFfiޫ;1#YVX*u _- ,eָzύ (/mPRz=9&n]]$Z Kn;|_NO?JT7U(Xa3Y$Uj1AԤΣ$u<',Zf`A7gKُ;cJ3YNĴd6ٽ[]n~jP8ճ-I͠*Svxg boQ9\2 #:d^ْ+.n2 SnNzHx-E=؇/ =,NErG5;rInSh;2z@ߪy|NprzpF0"Q+\P|8Y؍P5DT[>֔N Gky>+S~go{fBJŕ*WLt9Bh?_ӌ<qѕ{Y&?e H,^~C%ǭA6_Y`6Z .YjȒ+|acE z.(C9ϧUUPY  DL+;ly9&{ '1`̅-| - zaq_>j3|*󐰮:󷻪3қ~5)[.5Ks#B3l _\Cqbɷ`!_JDhכh*Bs1ϩ|n0u=S~x=ݳ3-Pqx{5wSB|`Q#)B0'۪p'm3ߍ*εFoKj0`MzSjE]j,>"fڀB{ 5ZQטzD, GY5*.GEּ_iPX{kVȵ1 Bk1Eq׾@J  p<]"2ĉ,OG;Yg.j:MnEynܱSMeԕ&bRh\bJ !nqw,S?!!2Wo0>g<]c{fNKY`ǀ<"zRWGoyN}q,.Cj{ɏ?q?2~>c}nne߫{pq|q<J/f6d{[2$ptJ$x}h#np)$:vViroivΛsxZ*0q݀=Y3i3=~^kx2²p_)|Aqęo&N}&;cۏN}eb2g:Du}: 6ߊb֓yyx: R*g~$IKKaP-kKAd-7E0xBHh_@֦\>@WU]o+l+2K5ݎw!~b%(|y҆\T@D{s͵/ e[ vqL0)"?~+7y sĎV[3p/Lm;G^'jW9#~7)0Ҧ: \U,skZK 6< 4q>&7wkf|)k5_~veDI}.w&KcNt_肟Ms[2&pqW^O=icۭu=[ LVX/pN7 pci-oQV|=M x譳U-\oY@ӰkvpRƧ>ؙsʲ>|7R>ED,W;H=WOIZiv_$t> ]Ng1YpCe{ZTr*)MS ??Nuӯ|9= nFZ mcm.'(;T\5c}ؽ'۳ \V-#kw^~},%M?r @$W"J˕=0pXwϹZi6SJOQܢϔ% Ȏ\j }uH`̻޾kL_ o\l5ol IS|A1tVYdUG>̽,ѕgN^"E͠ B'5 حuh ^ h J:Pv "ˮrK ;}Yj?}"Њv5ES5wYL@kY-PϖVդ\]>TtBln+☓!ŭ82w9T-x?J%XOuEB=;mFT5FX~8>vPrcwOg!w'vVoc{-1ͧaXCRgsWj²~2)i&4J񩭐1La1:;?KJPo->y7 '齹J#]^07E-՘RA(&zOa~mdϒTҎgn k%veM&]BwV&;1@[L +Jzkhbuųُv3YfzcF'Y!yIT{/a>21kg WgD_)tK}R1v%0fv%s[=ֶt ~fI 8K,;/SΖ֓LyX;u&DaPQK~s^~7ёhJ˅Esv&t),n[:M3He(7bm7/`Q(Ó]lA\noKY y@EOyfEtDՍE>mE꿦;گ2q>yiq(W4PFnV&]ShAPqQ=|ʗ3kFNOb!o7mz{},A[g?̜|iaff*˶̎gwkOo*5TӗI@HZFM51z9#qO,Krk/KuP]kNʋ3;l;6Co Ti<[r|{W 8ktںPV1^_C[DۻN}QUa_޺Nkc+q!vXgr Uf#(.TXju9]q|ܻ\`!Ky̫s,.YGsiSKKR]ĜU>zxmsXj8la6 z@i:~m}nCn&'Xo0Eg\ X$ ݐ {"ܦhޤ[""sg`pg^b3ǧ/ZrS݃ q7"(gn|̚Dڤ}+랜"A-b->8hՄ{wn}oR++WpW~s?Gm-V-~(C>^He'3Z~{$6*X,˹ S>Sm<ӓy~@ͮ]a4?c#HK_gf% jMA?5B/}Vs?wD,`:> stream xڍSiXi<:ʥ$E A4iIcYPpEqpTEtEPDFpe8 ~ު-"'pʉ Wǁ șagd.RTbK0E0EsEU2q7>g63> C U2| bpxَp-GIL @SRTNQ "BvP |6;>>˕,1J P%JQŰ׷P0 (T8.,z o>'pC0,rk1<H0 BXr0艰LIdp M0TkQ)&1d)1M> =i?%r }}D[Éx< D`/5*T(&ƀ-px]PXfV$1AA(nM$(b$(a5 (R&&|@01bX g dͨB 1 hrVRC\- 5uLJЀ'Zl=!׾#qpP+x!.!ުq}\'f8 Z(`9ą7?]J&3PrL#ш hPSɿ )^ o4ŨOihFbpiӭ%fm&"8mmsu3;+r w-Ml#=JղgMQK%aÑbciC0n5za˻FS:N~鵪sNm+q~ŞEʼntUdpĢ#Nbv|*=Sc$I}ç3ra72f*8 k}sV}Tد+*<>{${\l\mUƸ*&+96zCѼY'TۨD2[ENVƭ6sn3k-lo\- (>;:1nn33t;ЦO ߸{%DXTFOA-"NSBvUʯbz>>ض&ЫɅ-'أJ;̐h#f>|sƒH!٪[{9p߳6)-GW6%,h,c4l{Үs?75nmxq>an7XI,o?nq+fA72 YՈŚZR_,%O%y,à5^Z|\/M֝l;=[VO>low!/j&FXq+ܸ2&lFt453SbV^{{z>e}stc9~h8"cm9eM^GD_2aO ;,96y~m&^٥kˤR:Cl}`ٶtkHo1 bkkỊ;Y^I!D(.(lն}?ڈ  endstream endobj 2244 0 obj << /Length1 727 /Length2 21824 /Length3 0 /Length 22395 /Filter /FlateDecode >> stream xlzspetX۶7۶mtltlIǶNڵYgשN q;[gU{ 3=37@E\X OA!4rي9@S  Op[8Mh[l@u;k;WUɅх" lE-)y @h t4([L `f05ÿ غ!fhgSWW0lM:;qku?ko?<33d 0l?aSIC~4AX["v6.@G) lgm swښMmd7B=lQ?!8hrGr3#w\WT ϾZ{,U;Nؙٚl*(jhӊFP0_abא0KܽYXXf.6 EhoY' hdglZ+V4S E73eF <}cajppwH8`̷s-uDjD;>M\BVi[T+\RD*9cm5Pv-+VڡM9ڰ u+~eVF =SGW:cRxi, xEk`QX`woԎ}Lg6lɪޖ=Y_%-FN:qyZNG{sU:B.{+D%^v4nb!զpJ꤁ r99bG>vY +*q㷗'j;[kFֽpD1V cZR—THEEwՇ'ヲc05&+J'-qߕS"0$a,n:'Kpee8v A1j%B]BQl6S6yDDL<.rH{+a=2Az4<W06Kd_M&t/?f3x -ޱBew3Dw~VथɁ0[|\`)ܵ|mq:M MQ' O`UP ٞ}EpW}l޾_TpWމ,y u9^@nӋp^"5]@]m_!"?[%]i tkR6JKYpUA3};qw ~'gDyq$6pWS8)w gih#?X. L<ZV u^4aЌ$ `UYiif MBBK9[3 k$A?FFXIwnH~JWz Qw)P@'nA^ bR[‚nDYPlӇ4CzJyFDv? (gFPfb|&[B?NĤ`Vg8to]h*`QUR} ?Cn:v"NyE?@73bL>ν!$.EzP&8:Uhs&?Zk"ݽ) =mz:-auvӑ@qxfebc@ Z6a#! a=&5`GM^1vgc2q0pUvnӗOԬV; 0ؽw}3Gj|S?/'؂z$Mi^NH%UÓ&#=rj;}*90YI|Bp`l*rl 1l22q?k$ ugcA_&{Xp zmFHWUv%z:۔?0M*jI ,[G)M(:iňS.^G= e?|  7i#Xae.n7g}m25ٴ+wzL-[/w4UIe Z1*_GGc(&fzDK1``mȆ *֬7ܻa?V5o t3@ y&亹]hcIad柬.CMoWW}8.@J)20/[@gP&WŲ %(2ۍF0`PSUn?+a~ *bM*\ n @Е7+'3T7Q[[ƥeh$v\^d(˿o(0vlq*eHc6Ki 's!0>'255ߊ7(ϟHfAKIU:i~ Mp[qcA{}%l()MfRp1EkuܤzNJnf:=qq66Zr%Hks*Y_ &s@m ~*nux`{_=(tvXQFҗHMDzd _WHǸK"DL½A/ؙ?=jkpАS0񟓢vq76tR*wWDнqB/eQT=)g(C+B3;E7cڂӑ֏Gwe ֛[g1OXcMgu-\Yr.'iX#H"96X3d7aS7yck)[%)/O2[gexq5Jh," !`RB_ Y0,B(D>ͧ3'^haݫ[`CqEzStQؗC(5@1k "?t{[s99oF}ot$\mHle[j3a%Qd*'AC3[MOD_ [&^cy /pFiݙyydu}ddʀE(qH,gPonRae`ڌQ.B\!~v4[ _x55 j(C%jl0\<ҡs ]{bl.਑"h|V)]7<~f쩒^p7͍2LxgVW&' 7rBwh~ģ3Q5(_~e+->56!EE~ۺ0M^֛#fi~uKgQ4V$b}86`:v_)Rh '%Up*Q N5uZ~P]=A=&{u%=0Qa}%X8~zbr"T*='98erg?qi^qRAL1\A׽DXY&(,B<>v($Q!вRRi>x?kg};{-%MŻvAY,m n 1A;?Z9+90U*<]v -=`Iys`(a敾ֿr-:r$5+'~E1XGIdMCWA-?7bkaF3H9Ho [Jf<%-VԪN5 zen)"%.(U &gZzI_4jg6ot_upDRփ6È$)sBi]e~/-\&HX 'lA#V/׭f%i 1 ^d^-a{gՌzBo#lA`ܮ 6QD*ռԭ|E#x aC*kABⲓ86!P%WUCE9厷gu4ѣU&ϸGKiE7={UKG"!VaJIeØ[ gh>\~BI*T pwrDөmuRN$ߐY՘]#3#[-)|!0P@A+o|`bYRc5)Go^)nKu0$q'.lE\lp[ÛUW׎A5}*XF¬ȴy&r6EH|h:Ɲ}i%~AL62>:oô_xWgWw}#ޗ2*E7n,v?Pǰm kS2ďiW\D"_gIzHwSԘ=V>E 2Z 7ikCMdO5"{뎂h}fo`) "F5wI V)~3,_pn1d1 ggk;E Ez>b7LNCsXz XS};;Iʼn*F`v,H (oei5MR[Wܠ()15FM50KxL #@ ]jPscU^] v&9&rKTP *Nw9qfڀ!Lt*̨6(Ouڳ㯭i:;lX=˲c" 1(o&fTK([>ka/VaU_Ĺ%M+SWLw& .b[$"2ҩ#{%XIUDg\cB菾+ M|x S}i-5.Q~qiUw eEpC3l:-2M*hA:-&}UFPU[g|)QfF-kݗ 6-1-K[Dt2E^u~IU4,]pjbfM<_{uU,hoDl!:1UQ+ic(Z\x"2 !HRt&ƠEYKϒ-,GcI}`m0X5wu'd0L1=qw/$U}Hfo-<Y"*0fHʜXĥs8.5;Q"#;3b>-`ΌwU*KR_nM€gy5UNF@)qXcoaƯy.eAHƳn//TubY21^91Qy}]*(V _D+Q LmE;g r^3#W,Nl7ZcK Eɚ7 _ӛuQmGgZVX2*)nZ}Շj[JXF`c|#An%V!|%YU^TBDײ3 |Y)pPƪM `y+ (oXw;j,I ]g^9rkp=Fes.dq"` /Nɞds^S^xCR=(2 hXY1@^f!]YFp&RrG5̙NF5CkG_w lAQbPtf0`#']G~L7aO"/NmP]j-|#~K\t*zyܺ6;(}Kj^Pw_Z3 z.V0Y:/.W4t|=MDJc=bT_/t\>}iR(9:b qtx4LG/9d+{x0C*1('_!ᕞٸvGvA4+SSï2ut&f7BX{uAT:i7 1c=۸W| mBH+dr ޑk*a=O " ́-^̑BCPpx#(giu+hgĞFl4Nq$|;K%sLޔj*V  \D`)$Oꗟ. Of@2yk- \њì#I-? B: ԟf_zRvc^K=WegVҸIL 63m*siebd:{ ~lm7oHpa(fKQʫPMBm–0`|+IjIs1rTTGkܦ!$J( C 'mHy$vE{VR.9:]NZk&j8Ԛ~T LinfqUg%a:hAQOj5؂WʪAKWhV޼o'yK֐nPŗo*裏#-pRdzp+>+6*.TE ]N[\e|.fuIGVPϾu4qn4F pdkw;PU7~Rտcⱜ|~N2gv3#Ihd^Sɓ`T+xTG ;prp475W% .Y9;w(E>] ^UqLe-l#N\@,fD '^ \/3'-U([n([٥;1y\J2]G8>q܌k&:;hX ϓB] (v^ަT^lCmQ@q_4jf)IE?ewy~!<*%.b53mj\l`$|(r@c_iQ7%G' 3%K?;)1cdjRcϜiX-boM~t25E| M<#U[q6=sIpVV7H9wm!!R3wg 9;@V$_!|E.ypl D;j(QWߴ`ػY^ aQ)"P]p'r?Lw+{7gha$t,LДzI-ԕrW }ZoA嫒-yAooYjt1=K;sjB)MEܳ_{ *UENeY::GtD]U}‡|sU ,  MQfб+g~4K~=Fzih@' \h+y@,[D{*P-&fe s]8KFσᄄ ~o:aMp.Ǭ/ S!mB apP_w7Gp׾\*ߩkq*i8dD=sΛEﵜy047񌑲CjKN$W~ꄥs/hlk9O cc/SݔtNZ٧@ j0No b]sJ)6]Eh\-=CM@ԣ,#n ZѺAS+"?+ 7_WpZ:%y{6P~өPɇrB!kmj+g9$aK*֦E>"V\zk tPvcf\LVlUۉ QBrd'bIGɩZʲxZG~wc+?aOrZ`;,r,F_ѥOWq;s1USS ,xߕPm^y#ΗDciuu/spd'!< U"4cBяŸN9v0?7,ذ[C_IU(ADzR8S "16ݐJR ;j2@X@X@={kx601fKoOCD̥V!UXD9 wPySg#xw =e/_ B#TSpؓ>?`iuJl^//Lay/Յ\.˟mս1œuG-soP} }KBҮR%i_ߍ"7˻o{Z.,56 5JqN猅0QP$oREg8j| ,+;@N9lARu'|FL:ǐk%7$0~͹lR@$ 8c =8AoO%Q1m/pgp [Ym.0\պjfH 72aX*tIO2?`t^](NxCҺ*DXD` s?/~؏bSb.ՓJKtqF41aY6'$}f ť ٤LG}n8cl-:0j7Ɵ˪0=# fܥP`S(8YY_:8\6Zф݆x@E קӹ .ϣq &a)k!CPR Gt~M^42;V`ڲ3 ?~ГJ #0kCl1cZq5#E>s&Uw0 ; $= IvM,\,3V`Yb\SH=xX KYP[(;Չ(NG,'cLk[W88)m/pf4+|*i@ kpvS6 v) _(T?Z径M\Q?Lk{pR;fF>Q=66s^.swțBMD$a:Ja;b6D?ݗ 6 y{ Qq|L8>X|`캕NfD aaeZ:|v͠ ;' +:^JB;˩_Ur]? ʿz sWMKU(L,nğ=~,٣Ջk6/@\eӸZd>h8N8~bGΗ5+8 rpf y쌏Wb{aP@I2,>7r56/E6XqA3!7S֎Up\~{_ $cf8!o'dGT6`7hGC AѶ6>/`+intL7iB7ͬ i5.qs+U z0uD/9b=J1"3k~Esg*rܝiLbNzgжA6;s'G[/4SZX~1xU2Z.r/!xT s'Hsr=-#cؘ(-E # A fƳjm~N(s9rzQupӅNm05d}&yX WImHJ&(?.lk.hTAdnke>X-܂F=bл@旂:ѭR⺏Mo$[;}Ǒ{8E^E م5i"70~OV򏸡]/_ظ*nC!AjE^΁թc](22l=SOZ]ͦbR'~[za_ڎeD%{9)J~=3vï8YYd01v."̈A1Wßq pa~`P}t4 KN8M1M11G8w,bO?vaigW2wvB90DC2-rbggHQ69F gOUv,&g<ȶhKcp FNm %ڥ6Gz oCv_cRi,݊O<`J W{~̾A%a}87p{N/ AԓBAC7*]DYdB/-)q,џ>8Fz3@0\99jO A[cK24h̔{]&祪+5syxkY4ͫ|eT>ZèokvH +EhC ad>Z#M3T64ӼOt`wiFp/TNgɂް|w!mg T5|%wGfUR= 8a"Rl%c,)Pu-h6eiF3@ MBBcju4UrSۜXd3s#/Kw#=wF{~n_I(_^Go,oקD-E@S8dĈE;w_t'cC~]Ov XыizRL}A5P\U~۫*\g )ڛJ %5yByv]ã([<*vhP{CA"9AqfWIA$ӺNľcv-)_L:JUXӸ+W/3 MJ朅o6mx֎l/ %h}^]z?2,?0Sc.Į 1#fդHݝL<#i=D4#?T_*܃i3Xk&TVyX7cF,ҏL1aCW6cww ۋ( BCW1~VpA^edJ\>Ӗ,-9hI ȓm;_cӁwm.sJ#*gc)qKX[`U*}X~'[;bqVoaF]^ 3ꡇaT^LՒ]CmSkѲcMchrWG9|jkʬ_&#b 4*1TԹD?z탷c4L!d,(j;Z_cӝNaXDͨ<;pc\KTj'|#EGf>ԪmGoƊIu\9 D#ecq*A=op&w!8(K -We3&@#!Jegx+)3/Oi7p%@"b v ;0o_ѹ}gƷg(18RRIEwbtٻȄ+rE+! )fBV<5}G=_4_L%yOH\gP'Y )oýX`hS?ⳳD'̊$!b/zDwZ Eia~ϲW-${%$`zzc+ +E^)9͜ҕ!``be*$Rh YYqSFU] ^93! y,$kpg,鹭BT,ŹyiaMزMh백 }#}*/ 7h-xq$hUw&4Y Sj^pGfo T +9 r"3L:*v_G]k}+%\W7&#3HjG|5T?CGG\"Bи|>-JY`omd$8TsR0lΆlE⌚EcVHl4@* =}l<8{K[ fxͳTt|=1FK +tVJ|IZjW^1ej{\>ѥMgj.8}:nӚA*2h~4v~O ']l'mڂXbk ʰMlRU=M@$stc W)`NjƈrHk 2o] BYLNb T/}72y%H/Oo{uS+$PUԷEDԇVc*l {?D#L|$d$Wa).kp,W$ "N\کͺ_1HgSX-VYR"|ubYź̝lna Ոj B,!m팄kme.ݔMPN̲N[YZU$$Ezl% is{ `wLhwh]2U%GNeq>!LԔ| r_|%haQ|:o֤#c9b3hrt+AN9҈Q+BKͥʭ SBsQi҇4tZt:</;M/ `ޥX> 4m2fTDA&w~^&lvGJ:dD~WiAwE#$g-^FF;}3'rJڑS3,|+ɠ+7Rn@l {]%>zidFRi+[2h+ynaqE P/:]vPCw;hVvEwtl' 4Kʙ+CB$ ‰1=W3vvxنQ=+wTJLDr}`cSsiyq`Ql郵8r(+aVsҔreߌIm8_ԓN;]Ot>P K8y I %yfw-0I #;?^Չ4iu؍gG踱K7)l5Zw6ݨPXy_j2~6u)Uc,FҖ;i<Ԑ|w,!vn+0RV7;t cbˤ(-I֙(9Nce >RAQ~ Ro∷JNl]|zxGfz!?'gy-2u$7P4,pbf@oy39~sF}xA~g;ݠb6M#<a=qeTb&̼~_npSQ&b|8SkDiTؖJ͋|+FZ?r7f4m^s)bUTsXfUx.Xh'е9$󁢜t69 %ͻoJK9_7Raڧf,hX ê{LJjqoxBB~+a"K#F \_Q W])5NctF xr)Q:Ĕ{+#c,*${,=x~y8;<';\m^q.!]ǭpJt=эAg̸怞 AUq;j0F yh#elpJBf$pU2;wrHWjLguM K.?=%75պ T-sID M6ޤKCs5Ak\=A'͵Ag<% {\ոue8ڶwc#CVA;Y#8Ũrx,N2)]"622 |A?aXqe6q/+Ih22gwp{0Вuã>D%?4i@" ,8{ #YXl@A($3٥UzLۀౣZr2*?V"5Le5ZܒvU<\$:?*"a$&\T_J …؅7 #S8E:g\Tq}Z hޗ|z[5 Y%1#CfĔ¥Ϻʓn: U|jh'~*m cLWdO6D9ŻWa|~{MI~hnMS kHBki!:VFa*/E{{^Φo[868: ok))M?[(CGf^X˶ņ;Ϋbߕay}bӑXсжlqQq-IDL92DVVWu~&$B缥C͡]#R^v,?' JyBf<4)RkhDU񩈌9I3Ƶ{t)q ݭCNb1C}eRҀ d{Ӗ"2*98_.[X(\7͇vӼk5p1Uq' g :fٳkoߐꡈ9PU mϑFHg=f923şdk_ʼn3D.;ئ+һrXCdGh_.V~i(fxG]c9qUI_VnIQY`fuhEl a[C<\G}LZ55zV nL$X? 7c)0^l8u*hʩ/ڟ ژav}d › s u.nȝ(~4t+ aŧ1M Σ$JRPd \"g6]nO0_iPSX{g 9)]$LAJVso%JsᏺC]&b)3<ജĒaYǯ|6T۲ ; 9I:Y<d_-7`p)s2g (uTe7; l%-J{iL`ɬOsP/ܽ'*1udMS /lICْ#Mz$B;Dy+"-~|7>>{-'3/b4W&97Y$#L9梻^@Ea)<_0aDKv/%cLSKvo (}F4$aÅbOJ;$ 7Ƣز|a ]@!d״p9&ق=Nrl(,Rf: ɺN(s]p$׈nTfdRT .ng)?SB)NH:0f9eS| +XpWO9SYޫ@iOu sR#c_`9=墏?6ڻ0lIuU53mCQπt-Sپ+ qK}ny>`tWV( k# A7e$=m ^peU2i]l xic| endstream endobj 2246 0 obj << /Length1 727 /Length2 20550 /Length3 0 /Length 21123 /Filter /FlateDecode >> stream xlcpnݶ-{kŶm۶mm;+mvr߽ꭷjs:+{؛00sDL0B&v&5c=HOC p03wPQ P60pY۹Z]]]]\h]xi)R218L-MBrb 1Y5@ madbdB 0sXg05&'u5qt @FDY@TNV "D,05HSnO p_-7`la 041ov]?pH 061'Z@!dgcl36qYDܝMlMm`ca?!`kqY8Z[8C?TۯfWT ϾZ{Ow;:9Mq)M"Fvf%5p4_ǿWS1pvphK$zk,AA;w/Fv +5rqt4u7dbnblglZ+R8[N=;B2sd1hnwx}7`ȳ{#qLdgw<1MZL\a[V{ ec$ vq眱(O5ɜ{^#Pʃ$_h+FC gO]8kRpm wCg^P`hЁ~Lm4biwdY{$VNf^G}$>AnZ9LcgT49a,0'J6k.@s;3ӸWKqP5d>]"Y{8.{i9quO]kHT1Q!1:Rb)IKw.Z9o"}9GLwNC2`##43rx;Qt-;氓aC&Z?]rN;TW<~)O#oqCMyP'X&!OӞj}KDi%s7;ԫH3;|0?wrvg4hTp4WfqdD+8 ۷>P%Pͽ!B{?.K{29 ɁOB850$sLdE&_8eDGxІP{L.[ q%+ 'OzDRٱĜ8dsgLJ;[%@Am 8zD|p\)P/ v!h51{[ʦz$x#jīO1BZb]\UOʀɀz]{I E3GLYp@z6]]Ciowd޸-D֒V̏cAo*c?e(Sr)LW%1Bt-}{=7Pj,,,@,mOL42'\\ ʯsҋ(CV8ů2Cbv=;x5ٖːJd<{뫽[ GT6!G5u:,^=ygPf[Hܸ+iIFdh)~MnĞml`3ЉoG{њ?㲑fZ@DK`&`|ǧĭ}qï&0dqv, |ʆ+'+k& [dNuxZ/N) .ůZ0ks-0ҽbuCfa$ԜR":~p+fTDЍ=`+ A k~Tj !7.bH(=L81TC;ЭTەkh)^R -4\]S4jķXdKɕDKNuZC-b>;haLl5Fh ` '2UL@D4U0sҌk,'\E86 gV7w*َY[,@L$Jpe mWqxY^bwP|','A6IƫNᇼ>iJVH59a0Cc#9NR^ĕj tܱ4=XMß[T5(F±Hق6wtx%UÜpѣ\M"ob˳0=-}L9\dJЯ4D{nQ&r/bS>'7i!"5w6Jz.g%y44 qM8sSHjdbXQ Pt$ ώbHΏˏ}UR*'/gJPI"f &mRFp>Ćk<ҙASj9?7j! Ul]{ݦeH}*ZB?0,H޴G'97.L ?޽'tmHZ"/H(%Ųۣ lٷ;WO 7K<91s՛GNu[޹7gb3J8xc6gF5_e;/ijzA?i&m>`ill؟'D`$fu^6׉kK̵_1M܂I\®"n-'W:i&ݚ8Í9YR S:Oi[hm16dqh8"%ybK.&k YO+&;o3]bP v4CVQBNf6+=SCja d;ĭ{/0dƾ /Vj[ԽÎB6^!o(}*=JUwsw<$X?H~4[tvMn@2b$U$1 Ds*sPaX@s}CHoUI+0Tb0l`Ku=![y^' ,P5 cGwzW \oo_~.햅hO WM1P5$ΰ'[1K7[ic6W_gjT%ΔhK[X/WZҙ n7Ib*yTl훐! ͵`͞6ὲẢu ǜ5MR|B0)?swpg1:dVʪ"Ը ܕ)PLl8%cFa$DYG~S+)F2UGqii]I?L#f uf^+CDڨ m]?NKU0Om40T2&`cJpAֱ(h6??C{>1sUoWѿƝ1SD8o}I!2܃rAKKU>3LPLZgEjGq+yY~,~#4H\2oL!0@2ڭwvz~JUYC`[z6!VH vlD 7)W#2WGFP#t&'hY^o֨>tIqXcϡ7J_hW/p]sXyscE\FrҮ_#%yI^C:`S!NH G镡5) A)2vA2$^iiK&C6 ?VWU@K5EVQH1Z\JYWVZxO7EOӠEX\I~u}v;#*^ m,Nɲh*nb[\c3ץ*B>$QΜB%^\LvN0S1O0lY?Z%Cq z'(#ґW9GǚYH5 T#8եuv7 K}&mIzhkg``Rz'뎵n0᩺Go54h­uWdb?3m^ 6d2IhMӡ݌2?I]<*nXD j-3'JūGH@T#/p2w'8)<)-HVYMdoKE' qHjm.*Wg5|*5vqgv*Z+ .8Prbankr9jk?RٙrXFR6VSIThy)aF5v}0*>i)(䃑.۠|r[+Bޙv1g$?14s3po d~8 /W3b u]2}X?\Zja/@eW [V\e$ R3ȿ"ʊM(uC{v N!Rf>βV-nrRo'CLGU~Vь8&5oGpP? GP(Ƴ Y e#IV_ ŚA EQ$W-ߍ$tylC_ls+GQ/ό]u/ފޭBDȌŕKG5F?IA6]A$ Cbr\M+OZ'DЮ[aa̎;.="w3%%ٕ4.gPGwsHN)r+.*7Q FWlˈKE3n<Ӷ̸%Biu…3Ko`toˊ.v3Rrdfw9t5-$ڢgi}M_I 2A;NlW-pQ3.֋x8 2k8ÌyD02ϩIz9${@D70M6s惫9ӣJjW^o[!zou{LRtZW -vP]ŤMKVH4МY>?K,x Q&3y +HA"*W._A}I D*(h[tnN E.le4zou|Lʥ7KX7ߊx(05$Ԇ\މ"}8-$5 7}Oc}۴TwY#,ֶ 8룷ZabQ2r Hkv>ȠlB Ô1pg%9^aLMcʣ iI8"ejD__ Y2# /NL5Rppڜr]jQ,c sYYrF" }VMAWjf҃"h6 coնP hdE,s"쥌F*`=y,\q Դ }jg^ECBMF擼PBoA6?r `)ʗd1J;1>s3'Aw&}5@4.hI7dtCU@mq+K3>U|jE,2B֍5L@cI ps@{ѓGP{!+,ĸH5}8#mEA=Q*͢MuD|wauiB{ED1KY=]Hn8-?a{2=۩fWV.7s7 z,3RoW9՜ l3ww9} =cRzn{LVҰ/ 0ެ8(9Ӎ4PdА6pMOgNA|d#`#oQ?Wkjқ^v4Rn@)_]M.$ڗ46kYIٙ!8 &.j>ƊTˬzRˀh̹}=߉;=b8zm}މ+4 ]Ny"=KVԼgB"nƨ+ uȖ?| oy)l:#$~xUPI9μ6)T&ڻi<͋ۃ(H̬gV㵦߷Xx2|<5RWf\Q+b^ϠT2 ec(ˑ/Jt-A{Ͻy Hk%/)U~L^qS-SjG^|8N$*+)srlvȬ#?@{hƷ5/c$ZO˫Z KEXiϞ%^`_ҡdM:x`cR rUo 啝"K7}k3aDsϘPL3JhT24 \*^}I$i4V˳jH4Gv B԰v2=W;Kn[bZv;9qc@MR7 VXEMb!S_T'ϧQ$Bbжr~u+@YA%2eT/#E+5ֱڄ&6K3EqDQ6Kzb+`Vꕌ X'җu>j  vDK2̛-`=>Cps xcx 46p_>yZ]%j?95bI=)$^Sqx% BΞWCZ%2v1ƔKsL"'($eWWj,~Rݵu+k2C.=iII!Vv3h=.ke7Ln$GX~de>j4XփӐt{19a:Z\ ww$^]hH ǧ#. sZ@bCg_vE{c|nlu/Ǎэ6CtMQ:PM{G; EKqͣ|a83rXLiS ;s E ¾sUgy@+.G)Pݥp>1 =(?\y#a9k"{QRA8#mu-+5,Ic68Q%Ͷ47r Gڭ T8Gg^kz FKnJ?}>T8e̒Dv?9_m/M9BMGrPq=ϫqGШ .]Fys̕[O 1yC\IۼHJyV~*.D^YX{WZxSuu'<;'J0YC$qX ybOR] k~@*wɒqv该&:Y~uC9`C<b6(jWN$'ڮ,3A\c_XCj2L_ܗ4ZRB<֨p P:ՃnVQTS t?'*=:bvKj<3s<VPs7K󹫘:S=r'#AT19;TPUV:W5y=+ Jc2MdM\:Hض>ɷ8*HoOԾMIhe~GZdF $ |v/ I''"xgMZ[o4%$ݶ, %>̜&a"ۻqMR4"~}s!pHmY͈FJH Ē.o2$ }_D[>ӣ]u4pW|p6s<9>JWR US E>YgQ{F(:6`8Mcti`IAQtxGl~G YsZ 潹)=rHrlc(rh6Km]ZIhEGQB7ӂ WPԆf f!\.Ȃ988TV?CLyP/ݟZ&t}F  b`[Y_ONs{\;;$ns_[ib(? &ֲf/>j}aP+@ ^ˆgp0ToB''Wx(ni!RoXIRsx*nd}y~ޓ#zrq&$X"S:[j"Ýg HP|]-L՜(Gn3qn!F }tmpV5ɕhzH3֢ 6-Ucy) •]H $-׋t#|N _6;&7̞WMtQ\гl^ GRL^_'q[ hO!< djh}2XA"Jμ=F"Hj#*A@2 ͝"7+0Y?OŊ?U9!](n;Z=xWV_/0=qܐ":@cѱ́ʼ˜ht>XU:<3h(=w ) R [+J G*W٫-z~ 5 I6 (/TKCyM[/:C?"Sf`UL^y|{9ݰ70·R Fb|hO4fʜ*QJu?ymF,"TquAG[ژšlH.Ag X+F7b.c zu6/d -$/L]PבK!4zA<63v~¤t\,:Źӧ+x'cܙiCK~ "Vx%(>HB7>ondi5PJ3w 5v ?~LjkʽMӵ*MM[tQLB= TmȀ$ݘobPda[yeN~ʲmc\QFrsZ6KCHYӦRFI˕(fiwl_ J%YC_hH.Pri6۝#75mgU)1۾Na;[ j˗Khe*Mt\ 4\r|2E!jaTdXwI "Nj(FK$5u";`%Iv WÉM|gn^(O0N-2 εп({b8GR2aGջYj(d7͟ Pي cN<Gz@R xs^G:%mGvYC|=y(IǴ#+Rs0~_ڂ}F9M:9ͩ7yWPoˈxT?خ-+mW8,- ;Qzõ˥ n.ՎQb;](uL46DSU%,5#>TjX]"$g[}'AEM)^2fWrA "pθ`*Xv{ԾGNRHfb[UP`6:ʕ P>[E08ۍQ-kZ x`L2Lٜ eTݑLAl zLL?/iWt#']L#qsoh녨mIeyߖ>;JkO@@;9yF{t̆Da34ׁ_V1 ^*Ǩ|Tu: xQp3Rh`J h:% :"^++!u=E;d_iӒ+h*P`s% h'<$fKIl,s*G'Q|]v0绢F3v yi2Tu3dB\$`|qҵF[jX@“- ?JW+ܭ2h{sBŃV%о>ta1wJbeH-q3KvkFbs1:w=u HO4\MN(+ NO`. [NUst9Is+sȰ^JX F;zϑs U.D+!qxI(l2$=_矆^ܽź lsgPx1 &DɻC?rn_ _r Rڼ3=*+sD(/aЦ)5 떅z8¥%m-k ƇVf:v6f4" ENO84;\=B023܀3M!sY0ϯ &,-J0j@\ĕZ"LvR&pcq:72nIFۈ \9Cd=RXgԯgsvҭ~$ZynFumJ ~murԳ6ty@__>*ΖVO?T҉J%],rpq/"$m2pG@1syҞ4jHZ6 ߱uW^r\lDbֹO!& k!w:rH$z7"'AZ,_D@2j`)?{#||BBd%{.Kuûd65 rDZ03iwit 54kgEY"]0[lj8EѨJMq f ^Nx6{wYwCwƗr`!>ыߧX*f ˗{d$[(rv[ۿ6"U!h&j2 =>Fi.1~D.3.ws6vз3k9Qq B?z Պ! l/QA>Ӥ9'= cn& ,Xg9":;ŽMC-SsxR`-:aeE_Şnap6bK]6epBhNb DD!cHG%꾌3Iʔ>X#0  af'|&OH鐕̐yóu>cS"?Dl>xj[Mʒ<<ٺa[Xx42M[C0wCWNIl"9]7OIX2Rva>'t#ekwQ"P }iZUjVKuDGn;6%e59)m !A& H==wNyBFq. Hs-lR 4kr27:5iQo@O\il9 5 9C05,'Irb1{X;'Yw/M5s*KU+`s-ju 6(˾,^b]-t%^+ Ǔ]k{lqB`:֪u(Ze݂:lWl1l4"Sc4+_]2=eh^~{ (n "vx JzSYm PbI8xS35bV`ªFӈ*a~4* f8/)]o$g-^%dYgrD݌>8ZsvWv{yо>U8Fѓ#R֗ފMOJd-/Ȅ]l7%lÓt/*sW"TEս@z uՆqV*7nt)^]wź;FQ5l&Wi 7YZBQK'(ia0Rаi&dj#M7g` m(dz{= Нb+M tLL iV<0ѽtѳ ~d%4xOa4jLPu)\*g<L:~x.%^qPOjvtB6QceZn|s Gn7ZPQMdYľ1ϐ I1Wl R>M#-l+Z9^:6vwWn,^*Z :W[`=Zj92eH+mdɪV57RC}vվ„.I+9;IQ^J,MՒpǿEնӸB?zt 672d'[>"Z=/dw0 u1Dc$zKByFqwޢaB beX)s7{K^K=yE .FyE6kiTbs O4Bx0浨ݡV .+RɻV¹*_@3-Yzm?W8ۨO>(+⃢B–ScU0 w"+9}|ޏ|L^۱ b_A@o"@I!, K4ܺأ/MOߴ0'@}TE06dDȠdG-v`??7cuC˽>j]!>ކTl|i7l߲lAtPLbxU[rYV˄f-^01`!Q]̣iQ^@a2T?srw,[{5=:G^AwZ D)lh\ b^Q:8l]=B/փ]em;@ึKF~;e'C]u& h>Ui̹SHK ѡp |#2E]SY^aK!~ 9鎿,IZEGI&h}yPORQlr,H"2xv{s˶Aahb,N<{4JSW/N_ i @ %/`zH9DYmLҪywv_VywZYC/fl܀myȐ1pvP}kHtlx/-$^xi?ۂrl޿R̖pýY8 dpP)[PHiF;81Sç KyI{:Zը9ɟy{kˀ m# ;)l/G7z#СhTҮkp(dN@^\j7V.ƅ+lcwQ:*|,8d)uW"GZyRNS{B{anN!{)$mHV,Xe%.(!E)`#KxHfxYaVrk*{3|P%?qGQw}R&X3ڋ`<U|-*\"= 22F%ؐiۍ$Rf1߷߁ZqVu&O,œn%h0`I9"ņC2=N ɰ:0 g]xȌYZUNXFӨ<0i]ɋIN=QB4|{͓tu˶U+!TZ\b [{qG\疬/u=Q :_`{DAT?X59;eOQX'D̺,F.^f2}Z0qmX;,( $$.C\ ߙ:PSx=z&q^N+|P^s(4t@ saE'3v8I6zKX]y46r;e?tvؔ}Eqvw2ة\b{nU>>QX Ds}S>L7'FSnp ^Pǘmm l{z ވ@rXcLS?St]D;@Z+;["f bdw]össQ.fe흲,@3ȡXVLbc$|W)iixg zpX^;s501Ywo)%I/3MviQ,"2Cr6{e` c^+m,-f&qt^u$CCD"ٴv7Pft1B՘ּM.Gݏ-8 ku{N(ll9/I<K|doꁎ;r]|r9VVn~ 3Du=cU)lBaxN6y|FvTa15G{o!4k `KG!B(:&qp߹E+㓉V.tQI7WhOz-s?GE&~|y4XkT Cx(&]D5="favLVΫe|Ph_SPK9S_~V:[)ZǖiޫA}ʥ)¢9˖ :n݇xaQW2Mv Ns*?, sd~եjgʼnct})68\mk u>.!N_?*\HĮ3\C+ǘV.{zֺ7-՘/r<X΄s D"6bhF3s rُM) r=p8hۋV㪩EŢcF= /z ?{̮u:1a1 lߤ4̠ W'{ML#*LՃQe}J3- [- g_xѫL2n,dcaS7Dn:7-iY&y ]BRh+@*Y [xSCy3:G&!*RTHO E9;/'.SM‚p^촄R`h|NɴsDpݼ.A-yt!u+pYG+7@4,qPo& ^ڳ .Y(lʲ& Vvx^Oco3 veԡ<#J_y«tER5m VO$HL5c#gm/`lK3ie-Cj[K{Jr|{ic-j̲H(>,.rڔPlEJ(7B1ͪ$ysEs||HT]度DU*V|zVc3R|d,f~%N6njvcd '-Y"IDr"9jkޓtəH %3r *HMjT9stצĶ\5v#z<5C._ uWTGse\֐GOAnH`3{,d1l![gկTUeBD9g9eIX<͂F9kyʫrgI-֘8sOY]1gAIT4% endstream endobj 2248 0 obj << /Length1 727 /Length2 19601 /Length3 0 /Length 20173 /Filter /FlateDecode >> stream xlwc.d۶i۶m۶Ӷmim۞;;VUQdD^fLtLqaM&fN#= 7@b`b0322D,,]&T.mL쬜V&^wwwAw7zg7~\-VfE-)y @flke21w1;8lLMɅ͜]!f`SWW0MwumfbhOd?t=01LL\fV0 M[r flm"vnf9S3g{)@h#;+[/#\CSr43UrGrs#w]?A9(?j`o̿1h kH 7q0V4K忞0\H/0oP>tL,:&v;klfodfif`bV/VM-ҜehѵHxA. eQeavQsИ-GV#;--1=+m0J^C DH4Ȕ w('Xct:e0c Vf#;tY[MIoTKI`l7wjwVauh4:ģ4G]d귣jQ956d [uYV,L |4=ZNAʝjU甬z4 F Z,]a&aJζ:SΧ 2kfv7qwFΪ|Gޝ;B;Nk% B@ӵFMVEE w e N]1K+47d6!U|ǑH,bCl{g{řfLm1')DL<(WpHgk)?ٸAA:Z])=yv܊>zWu{R"yewEAr"]=0~1Z#߷5g#dH+AtIM|xY2C a]:x*BaVP3AP(A'N?7AzsaIz M41&}FYѩ|Z4Z%o89؂eN*5vp ilqS'7/Y"]-ia*tpρ9" A؍ {d8%ɿٱx *o^gvwI+ SrM!V`;Okm$$Z7wAni^i<.EOO Wy G1{Rao=*q#BBe?b$ 2~maNvezoRsRS>Aerf$\n9]AAe?M.GI6 Xc}g}wd`&^2mث]ئ:lMb9_k>Q+n?cUGaZ?n@G$|LE qzQ,r|-u7L7r!-|~}F-#U;HLοEfv8H>^{ٯ >fצ?t ',1{ƷYv&GW ~#5b$v_b\N8h4xau?_"ۀDmщ/E] 4ۊF g7!@Eԓw*|fZ60MH+5c3VČV[tU͉qWs9ʞ)%K]u'&s~x1}W4=nASdCgH0aTŤ[.?3H+p~,ZajjT4=Ưr!qƌpQ(_/HeimwW,yLH.M ]ag0-[qDDZ'` ϗ L- fdˣ ^%>e_^bڢhw5e<)g;݊VQ:@~VzE*f Z_d32ݞl$Q&TX`gGՁTME.0:,~ZBC5Mhc x*MUB_(սՋU7g][mbew:<;Ǣ<&6O=9"rү O}S?d"~N> Vg1e-8w:&k|Z*^vlwXvy]B4teTr߲v*LvJ{lYMfJ(-U7m7SڦWCE,4[yZu\B`Jt&щ[Xb!1aZc1v\t]6Ra(0"r9 N}er] Ë,~r"TyqAS+?ʬ"2E%7 cW2 :vLi_u]*) B (dV5ﮏ R53ȺB{5GUWXU& Kr3dkN40PDozf^i8;%oSl"]MUn3劄*\fDj1g,RhmN!^b6dAP|l,XAbdd8{VS$EzwN8Dz P BR`JޤIP ]t~&#!&8ϝ9|'yTN+v] <ʘr{ @rEQlҩ0x9DSPL =2_YaWfʼF^,01` Czr4~ q|ݘԎ:d9`:S+H81ÿN^$H_p6Ҍ*JNybT +Y}Z@hll:sq^,0uʞ@ 6oݡjf #+O(rRRJ%/#{ͣ R22sDp  Lҡ pec|Eyk5)$d?Chh1_Rfap͑LrqvA5IXF,[)ʁg**@;2QR.iTa6CH6p6eM4@TVSf@i6[cTMAjKٜ+糗iV??Nuqǥ pه2vmk-FD_etNg>Z f8Ηs4iZr(QWl}-[b2 ʣ\7AM|Cأ-ތ"3Q. 5ǽ_V #( I&%֩C$q$*O`sT]n[cbzO98e^*PJW0jYG߈3X]JҞF^ аgp"r%\o唽lx|^%4 jPwԨDŽ%#D|V7,W G0KG8 ;cYX (5iR:R=C '0"dim6d 35OcA*`x7ݍo Ҹs0ffG6j+8b~čKC"X7 }d.늓?xNc^?.pdI; J`M3I;5BKnKƴ,HkJPJmq+ %r$FK_{xf[gMI# o< $yD!^E|$7cvz嘂VuٶS[*o BgwݥreDA*ܓ ӯFF\cwy(2dr*>q߂o~VWU97'iɝPS."={AJi:́N | i򎏯& e!C|3z%'ՔU-)g $%:A,{+*DvbXF~9Ew(}k@T,N2`DFTͰH#(y<%Ms b) <ӮpM#ygXLGƊ`M3aO\0LS $tG%0/fUQeI, 3xN`"9)x Z9l}%{KO/TTf5(R*"5vǍ]-NI{y}@p!BHЁ3&_2Uʷ~1'Lź5Go'YX8o+A82iTIB !ۗK9vGu2\PҝFRT$B#cXBT*b/uE$plj pB$'2ǙnDz*p|$Y\D`k_mc*Cx|~F0.M[Ɠ z=S-2ݍ<*x+~^ E8yL?pauo`p/'CȻ͊q?%>k`6M(4Xs~0[uiƲ@Lw^$IMX"@!!=`LLtȃ8=K9I>@޿]5&BcS_DjL/) KbY $g=gġjL~8 U>S S8 A.&\SӔnB*9 ]TS ^M+M.ۍ o޸c)UT"cW.޽C+',N*]=^.ѰCYCfq8~E4PTs?m[Zf~r{d=!'dmƩs~.Qx Jcu`M4Òde4\?4$D- jP6iYIV'܍Nk݆s5̄=\.ki [cpV—0&]#?܆H#tۿeu{k԰SQ!yYe뭟cbGl`瀌)0;ݲqcytJ Cy5/5i '5A8MMD YfK4N6=-{3_ym *E<?4 j`x"tg=g'.p5/tO=T=fpɷnPSt֩]2u)t^- DdNMȐ#R] u1xZÁIwǭ̇ѿ dc#z(lݦ+hyL]I#>bZp!y9u`vVj|yE4nDg"l.x[->g%k)rW)nNEٗ,:mhEoxT6m>ݟ)!z-(5XX$L;jW_ם % K_0{f ,)~qk |)~s} i rMKrItK~zY%)*JO#o(o~9i{[gb'j~6Fί) d3,u-lبp8 HX?I݅~ 4װl&X3wX/w6p]Q->3恵2ݻY`7-c* 5 u%jt#Llu{Y0^C d@΃vȇu&oۿPQ/:Y\L_w'JGԎQQmVPSE6^~tI@ak,C)M]11k;0ZLLZDcMZ@'Q`@Gcׁɮ~.¿Gw<΍\xx !m9pA+Å< !+ǻy Y|I|e9L$}#f|j8'xȪ[I!=dMUr˔YZbӑ}ejXX$z tHȓ_=ӈAn闌Mo~ Yԫnӿy'r̊,ܧg#OpCuVJY& |=Xnb,Wo\bvkvԑNgۅP_j%jb>RPA22G+ MNƖׄaI+ݚ1 ljT8>DkfAElַg\;Q>A&|\e14#y, YZ&E%f&Ju:gszVSfGG {rA?aAr*`̾`K[3 `#os)|l$č ^ySvrzZjpṭclįY_Ckr q!izrhXJ늃kwy*7G@Y%a_:Bo0``mD CH4n:M Q6s^p>mZIuSkRG8A6V8ORo:?§1߯1Qk/rI'zBOӝ}5Sͺ~\ Vz&Md+8eZJz>ߓ,W9٘S4bṇ7yF^I }{RIbih>_sݬrÆk듓]SHff(^^jDq[`MeT|@~jרeQ`_GWYPNりSbx%.>N2WwY `t~ûJp aODG` t䯬{g 3/`Kfho 'c< V#}FO0s/<'u1p?ۥ Ui32cv;w|V߻RvX4Å$xVzWe{|z%ČŢ3ՑL[pX6$ q&ƠA;7 v»׎oVGEVTEKD /+^v]n>"hN aE+ Jr5([K"QŞ:)M\QCEd|Áum~efb[+䚓` ۡ~gW|+ѹǬzP _lFhY,^ek[9RmOoaH 'ضe(9>I(NFb w5/k5YGζJfu1 yrJoA\~-z,mQ/]{p*z|b:S? ݙ MMh_IuIXIOsUi3Kiq{nu[ۊ#秕WL)in zDm\f;2Yqm)ԧvo0uBT8F, HbR̮foVJ0_z (_\~x4JV UbGo7ڻ5|CB+9n= ADYߔlZJ}Dܜ{2^ˠJ>1Rwv-r]޷R̡mB&`ry=*V )ڋ20է>OvbPP Wgu|HgDMSi?byW0' ?001>I {`'?sؘ?35nʞY!9dD\# ܥgΤ W95mA95>@~$Yo{[kzTN/~oCӪ*Et ?'YY^p<Ƅ@, D %IA2 . ,%Xzܡ뷖}WXQ:Kl>|%@&S.L_>Iҟ +[cO|\u B_a`EK NXXhrXT!raUC!TF'~*OՠeL2Jv06 xYz"pûm{W) l{7AAqḌ@6lD@+]>~kP"J0P=T{ no#cݯ?8ϰ)V3nK03",'ke69j-0~+fWYe ,Ea7'<5*BIi)-(cZi~(?Ӥ$d-)ɓaVm _+,K20iв}1`jOO}23Y[QzVBӥOJ2 y$yQJd>NMn t b0CzDص:?aOV Ӷʽ7Brkfʸ0埂"j2 \қBok-|%`j 6GVdn&ഛngzx}WֵtRʞgߢcKjmSW/vލaΕ\_A6pjO6#9{GNśX{b s~ۍ` 1 7sp@&5/lǜ.&:?i,'B$,Y 0X$]m*IS3dHPFI|d!lt Gct<R2UtT,BG61˔cdyff)8/qې?0T*RėZ-;6=Rg tĩ|*s-4Y̆l8[d1K^ }׵tw`QZ?܊'_M&zCGAapK7~ɖVxbZ -._PML0eZXo@PY+~+&t\.$va{6dے"GkfVڊe\؍8Ynz /[(@,'KKS/ 2&0Y7>zu}'_UJ*jLs?3/Q :19,|S5u'ؘ2RySm^>G`DOrjVmz2D4Ky[U>@4Be٨&,D+zY l{X`!Mg~$_5 o04}_~FV(]-|I,͗qu4 s"Mf P9Cƚ{ȷgA PW>M(m@I(8"#|An䷢J~a<.;Km~T/Rȩ'Ëӊ|ϴ# qf tㄤ\ g,y  Ł/M4vD &Z1i5"-@ڶ//IbChB,⟕Ȅ /_OK!<=/YL!0aBK$9MlkKs.E|jKv)G#T xNSJD`<`=̋e&Y $Nx+7uo+\ƭt״CrLs꽧1̅aEJ k]Z[ Iow+()>lʥk;`$JP@{C+;j3kw3*(Q>Jш E4ˉ@lrMpZː1@)tPb>-67zm̨fm =/چBwԎ2{!G"(7av5rNm ˟`d{] GRa0Ғn\Ar9[E0byWW/SA7jDIà0'g`:dhÖQBY~Q"DTl"ei?-G4"nAt גq5 [$8Tģ.$Bh@pt2jv>~\H'HD+Xj3myғƼux.ڱ2̈́p5 6bw>LMmvpnS5gWZe x9h,~ZuϬ )taXD9Z?_&s4U*2)6ٶ}ra 'ӳӫZ/ON; Y12S>r "얓ݱ2Jˉ35_ǎ.PلIuz+^=We`ճLF ScA$HjvV\- ߊ`.3MZQbwWiWl%X!vWBoqaa MN̰έ&|CAr&(guA+R>PݻY2&C')D94wYZZ<-?Ħ1(Nwmoc#͸W[!rgO+a=Q5˘'Q꠳ͦ܇E?WwA`TQF5w]nob4Bf]k_zj}(Wn++ح}^rVu.,cRxF pHus)R %K{eBS3F+GQiq;eXo''~NTRu*@#nߨ8Nޤ&|i! Apɳq['(| -I\Um%;'/]/E>pDD0 ?3i 4F} v)e *"D1L?DS-S>)"X7!Igh*LI*׀&Cs{Y 'A~&>]3+R#@5E|8pT5]!"kfOcDmUMfN`8֒J&ĘڢFYyG}Fg1`0i&%U7Js|5Oɑmt66#UfHߓ(M]`$+EH8K{A;8bR>pys.3E=K m5EmJj{sJd^f>!K$q3X(%O7蹣.TrЇ6Ӹ@bɟ|} * M5w7uNq -s(b UbEzF/ssw3DOf[/NX:oCZF+;.dˈgg/  aRlDt2F4;D6&aX -N?1FbGdܟFqxkw! rӺ*| suG n/%lX=7r%>3q&V3º۔T7dKZdGd(U2 dLMhPf&;NA\mYӱ~psmi*Y,*ٿPPc/ufLbf#_~6`UELO#RK ɚra =!.Aѻ܈aCn'DdCչ# J }Fdoy@>&m @k5ǾO=?+o<̔sV5V$xH'7VeӥYJpꥑ̂ %)]{ss8l)Ȉ6\`_6ZIh1oŸq]v*V5zp&,T6C-K>]G@r{e5hͰE~Eo8D4e77il8jk'yge 2Dظpd$ZEf"ѥz_8ں}#cN-)`֥e,L5eEUk/栩ՇU`x>{X͔q'Î[U%`k.nF -]^u:MI!eZR|?[l@d>+nD49\G't[nV9:'u)Zέ|ѬQ :JkjKP{q{.qm Fy)3½ @䃀~DhAztB kZ`fVk-jZ7z]3)AMZ 2# wŐΤEؘNNP x!J%4bԐו%c4 ׇ }<}.J7irbFyC-"(O߯W%CRh{BUx'S8uTY"Zx!}:*&Ew%tD @)4G)2mʞ3LYEK-#t;Da WP~?9|%Kl Qw=ޝ<7řn*o\R TZ_TnO7SD#涎7οi+[Љ?p!LZ9.١6ū6H dGEa? |V4Tb||]`kQ1o,a#,a#'0q;ʙ~d.ƬL%OWi9A޻FzF؋qXa$|6TC'Fbjz3*ṉ+yez'X=H \Ztm1ƞ ʳiὫaVf Bf Xn-Dũ3*_(U>w|0`..uVO\1}hX @l9ߥżAkVc>,*w*Pk%*N=',&A/ZJ$ib{'! iaEʠÌgvm]C3+k8F"up񷆯ȗlh''__[B~tiT\l"f;g2rps" v9Z@pG'ުbM8*pIZ[zP uЙ^ɿvQ2XN79P3IT)Frգ2/բVeTeA cQ&CdqsuϾ8 \,2֡D| R)H ׶L2϶&sLp[3c[nnXEy* a쮷K;W;$&LcQrhHG&y޵;C5 5vكe$n=~Xq ȕ_q/A'\~8!E[?5!s3Mf{2wLql XG1ڴ2V6 T|hʿ 0fv,#>T%vi6ZS0EpH%9,0'kǥw?r8>OLmvDHv[kbV'PUȸ=.$!ASd)y~$B*ri1sQ_4K2ݝ{sUZM,VHֱs ZN>EiKA,Pd_\4L#X<@oAQ)]\oM_:׵ÖۧdI+1MH܂x7"ljn'S+-rkeS*xygV*bnJ ].LcƊk'^,[MxFf޻ė&JpE7:g&Jϥx!ѓ6r{tv"?bDV\XmQ#ɹnx . A mz8;*#hAK_L"逼8Rj&NҧZB&g8InRyx 1MP77FnO'|0 .IJwvȯ^\w繼}?4*G5y֛ IPQR u g.k6O<ػIUK*(*:?s'q7O[]ɠR#LDBHKHZ>,ܡ)<Ȼ&Ub1jDsD 2Nb sQHE˲qx݋Svs4 uv2H`wclZВ\" >$?hd 325Ǖf-d*a1%ƭzZYN+;;ɸ>k3N0$"]~TY8æd(=5Va|t#7 JٛTZӠSV[؈Zį2;ynQ \d#4 6yFFc? cjAX;kKL%JqP`ck]DM8Y;[vm#YtAOO1)I]Kl! $Nufnx[њ\, C_oc_ e,Z4g2e5#ä,7+=NI.ro}Nck\r7ħ^֦:1 9i`J'jzU禕? =wl}?40^UK9уǏeBWW~/h+jgn#ܹX?SҾAŘxc+tsx~̜OI.BCNbWZ:RСaglRtPqx~1k<8Jފ6XM}܊d*_q%,>\E+K%ƧW!0yfnoUm4h>]ْK#rGL`)H]4MQl/ Wn=;ZmUc"ԼJu@$" =!|JB 2o҄[WgTx]X@g 1;<;x%@'qrpOXm#5.?I6;CV^YG%;2sdMm:Qg,mu5!IPIjB_ᭅwBYNq}C1픟dU1,#㵰2R]xNوp?V?j-iGH>9֒ء9͘"?gdD:!PGC!IqKPAtOcTސ4`Sr Qn<[Npâ׬5V/3Rt.NU_ 1T)降*|e H L9M~'+;.O{}'xs֓ogLxV7B&ZVόsAB)2?힉0n5I"g'Eo[ {*jxAs\3};ir E7 emAHv*)]g{27Ì:*nէjL`JELKR'3EuvW>*qI|ี(LNw% \~c][p9SUH_]Wj4<D@B^44 v>ۂX7QUz F!$]V%8W?U>6zV\R H}H?+W;(>{;_.b'1'Vvsh<T9 MEi9IPso3;K*wCm(aN7|CA')xKJ36Md{.OȌLQ)wYK4p&_6$-JmsR㟰mMkQ%Rѿ~hqJtG%ٍ$_fe!ex߅@}9E"ɴÉ[ݖ+#tTx`ݕGdF)aB_X:E>=T{#p60mb{pw-!>)Qα8lm)a$8=mۄ׸pd:&݉omBsvFG֢%~Dicd9\eIIS1e@-QmM>0Y sbgl )2MnXsW F|8}RQS\.ۢ 1xF0ٽ됏B)'^zU! : nfgA]{C$; 9 *ԉt( |jaS!-Vz,w$䤿=NЮF4EXI2t  A @c>oSdt xיsvJ٤o=+?dQ*Y% ><n~9P*lU6r;n9 ^Gz)z s`ڹ1;Mm@8rMFyOU1hJB9! Ig2}@|)*J3HQ=`K,rY:w[tO:=6\&4ᨃ٩j1Bpm0.\~fd-^ߚlJv<S %!G͟OAr 쐞E]윧Г홴^5oGIH1TL' $\Ce/uM:SKp]~O> stream xmtstuF1$Ķm۶il6hFmoo= ٳgCE.egaacbcf|b2s QQ;B@v g?@|쬬lHTq;{G 3sg ?A5lacаs01:0;1- !S k@\IY[FQ@+BAeck  B0sXق-ɉGLl jRJjIq5q ى/bbAk7o 0qC,lXaR 9! 1vV@v6.Gh $ݝ!`?hg_=Dm*;lWrS_kB5wV{Z{oÿӎ嫶  GAPMW9;ZtYu$z%&f``qqs}&.[d; q -/ؙ-ZC+|%+ؠ'u1,Wjn($?N6eZ(@qhp‡J3'džp3X EK猕@e άܣZY2A ihpKs7t4:o(mi3caA[(Ta:Ez#6QV.#!F8CuN5֑;&lp>97 yzQ*z[fd@C!z bX3ĚXZpF%۷ÒPE"Z\ˍ|o>BHO7{OPl1fo' /(ZC6M+Wh\RJ۵'oDi@5QQ/NP L}]2 F7)#RL$Y>6b nB(E^5˶tØ\39O 4f̯2qE+b3 '?1Bm~|=jRvc3FK!dsdcETۣp+6*~W֔d;U0> EZ+?GX&i׺N>mXܳwf#&mjGaHHvk e>5g\C%TFx=;(9@CAMd><)"d(GwN H8{rܟa vJZm;C(^R Kj%AhˀERLnZvz6*5hR,i li:4=3PۀFELm7BJW\ .i b:Y|Wؗt$ XF#HϠ &OPPi+ӥÎfkلۙiU z6`aL9a?#s#I-"!P#aIE9\S1*;c958K: 4{ߒBd-]d#o 1ā]⓯?dZJjc6ߒG-φ0#κxWԺ,3yc2'Gr/n]3`j6%CҸ>& R!%?#re_wф-ޮY)ظjӡ_Ö]2$U[(/C<>~"]gNl=9+P?^4S iĝM*P6^% A1%Aj•/ $v=ZwvC|{7koSL|E`x~,Jko/m )v/ڻ> {GYy%nB_rޤ֧'AL7pܨ٬^pkַ~p%JօoTxbw82L \c2K5L_sFE6ndӌ"`+_N߬9`~J-j єnw4Il}o*F1™G8fq[~[;-hBoܤ,>$klkWP",!.Uo6FSڦɳ`+zho|2|:Wh')rb_F'v/}m{.B5ɬq6o۳W@*Eqݽlz._~JsB֞UZyn[eRL2%JKH{ fv˦LZ#1=-hkoUm5Te u2/72~_}hH1٪g,G4g4rl= J9C dK!6-~uvr}p,"9i޳!4#[iK͛k˟%< L'9=ݜhiҜgoL'mٌECEEw5A+t~ml"{ɀ'?uzzP{To^,P5X/Id&KA3\sC3G@`̱a})uY*gn'l2qD;>qJ|lr/F)V5/06CX$u/t2"txwӈUC\GSNNcq0U/#fXZZ%oDCuy]߃Fޤ~cAI(Chu#4 ;lwZ-Ý+5ꕹ8nMcZrS`imݶQ0k:&"H64)xT;Q)I7#|iz{ tAwG`i'&tP<;Hr;FruZqVW![ *r8n89I4j{:_sY7o ~&@ Mi)_ )9ӮF݈F6e:/" sK A}GCtMGBA&gQZ dfAlI4:2޸uVY 6.iyB :Niմ\rOU,-y1\z4E - p";2]P .CQ(Nj2z86dZW'y6O^`zH˨zr~[܁$ꖊ*h#OYy Wr}SeL#*W%QGm>p 35{8lDOD5Td4g$3@|q 9C?'vy`m> 8"DD"kyͮR&I]l"VEPI0!3MKskxӰI{2G=pQN83=YZ-`Ey}&.x.0h7_3H /mYDS7_[WPJ "E;>I^_m.~Dt'9f;I6@e8bt %RA6:nxVb^YIYṅ&E݁1:g4 c(^7 C%ZS ՄгGJ1O/Z?ÕhU&;gA+aBmaod8;#RD'ؼEJH˒W7O.E Λ+X UuE]}:.j4)ktsJ_sK{ P:O^- yݲBYBw>}F%\Ma0Eh\I_ŊgBn3=WF|6@gh!grj /.1c :hEAΏd尖# 5b)? 2)wDf҇mMGԟJ}^4JQ+ja5uPOMRn5iYhTUF}N.ze^ fĸxqi /B}t!sS)M'!LY3:sT _ދ6\Ď$<@.+ 6zdЭMv2?=('<:%>TK-2S&%}g?c#hbG(7&诸N*C'_|ˑT&ف6E"$--NeQٰZn)!^=&dj5Eqerq"72>܎6h݋q^Vք֢V!GXJLԺ7j(-\,ew,D6 V"# ֒s~f6:T8}7=H@ùqv9*7ߵG-jum_J s,t={ĦDž78t.a2j7;FJnTP3tْP3.$ʷ[!BI1y8Lm~YXq4> *I:*-~ڏhR71„=ф> Ҥ:ͿtWcLX?]"~q*8)rSFMF8d~+D0j [$igd?@7IE TǿA0E5z˔%JFI݋u O@%N#` RsOuWg=" VˀN+ šph3#d30s'5g4ڏP#r S˵*2~t~\Ӌ f/~ #v^Fh|VxM@ܦ^myfC Ja, a) =,W+J@+BAe2N̯v $Kp/2bo"Z[b1zK1E)Qb8 W*KViXCySYG^{$jGuLƼmRME(EBcb JUm2]qIB[KE963MP v 5'KVHү0֟"!%# w,)l |OBi;օ[4xK,eOuZG&-xt8ѧkeAاCrc_Zp=c|aQֱ̼yr𒸔)wଦ ߎca:T{F6X%f6HgRSHcNb{F+םaԞC,:Ȑت#HXFa|/rSMh#3ɜiz:];"!tHbۆY'K4eAeRFf,e8$wSDg؞FBgͱ1zR"@'or[u_X]uN م"KH)3._Wh&ԂO?PHe*6dwZ;-|qu>Y.b/sPdOŨNm%s3 N $=Д,aO=R8$3 zf-ʔi:t#^Xo(tl%oʻY@mnpѲ^6fY4+8{ t VoLP+b~c*Sq8}2(O>b+"kz2M8 "<4htD& BFojgT֭P^8x_N2̯\]b$`YD$h|eɳ V0▽up #i֠`g=_‰D\#FSe/ߖ]:@da!bJoO}6q=-Ѷ% E? y39i/#XX+2eуq%Gk[KM0.c{W+r19%N{ÏNJ$]4 !UnAԻ{}l\g|Vuc&O#yg_v.%o$2AME}Ik\=!a FNUm>|h/huUCՐLؘ;%)30y .F!yXU-<\|>(w-[Z fnr Nt R)یBqݞ yOsQ1֑C? c3AP'̷ 7h1B/C4|PjAMd83 HMn ^Ά,ȋ_(j$bWc-#R8XA5Z-N=`nWMfwm:q`8/i`(6[iU> g1 1ٲ`&'`tG1yEmv53hZ=Z9i+!URvQmU\;qquJg :yb?G@ ps AObdHCnAm˔xI$DfW[Q_|x /r uU]u )Bğ[*O+ qTyY7a[BZA@[Z?^Ay,;B[ȥV+%~!2/ϛVi 'Jl/ D#"嶮>D: %. XϘ '6h}w#+ڜu\cdNIKSX'UvC`fɩ[ _8ƽi߁_(DI r9> `+:e\6!Cݎׯ/~_J~Z PZCxǶ, dGOKw&&5>SGr lx^TEdˆ]ni">Q s[}w(,> Uu8B|}{ <#exGӘX3L ?[];Yr>3pJ(7v# Y>U#Oc_T&N?D)%{0Bm-( p:Bf!<G2;TұJu[1kjzPKI :I}3AoӶ b:/[~߯̈́3}ԪQc[%E?R&f8h<'\\"[Dn_L`Wy7U'DU>GP ) 1`>PM=+nz$VsW5Ÿ"[qϧz~?FgCd'Kx͙ z9V4\1kTS¯:O'dȗT3)"͍Sb,~2?iur @ ZӷŗxKZ۹ȮSIPL]%*hrZ2jut[9}ulcvPAy qcf_A9o.q=5"Br*uWڼ[עlz{@_e1\fc(_p%l1{o"덣 ӵZ<䬽&Exѭ:oc+Pj;׈B!]KՋ3aCC^ǬDr6̀ ;e2b0ǷawGNO+Q^&]`S,g|$>.n V֑2dڛS] Wz !ސ=i5/gO-G5 μ+ѕu64AhطBtbgx{0Æ3We<<i#qH _a1sF?r_FY7kV#7Tz,@Ae)垉N-XάIʅM6D7QN\IPn?U< غU-yO endstream endobj 2252 0 obj << /Length1 722 /Length2 8944 /Length3 0 /Length 9541 /Filter /FlateDecode >> stream xmrePܲ,ƂCpw]Npww.`7;[33SӫȤ@^@VFV&>8+ Jhj r0q5# Š@9z9[[Zhhv&M .&wH Zv@4FZQ t:Lf@ - w09[ ?܁ήY8 RJIqfuq9@qW@33]3odUgGLsk3W)_j8X\SK/+_h@nvv&@8 P&.S7'όw;d\Mj!`W=C.R֞@sek׿r[\ Q[{w_59yʿGYMGBGL&,`2vell_2qrWgkO ӿ,@>F6^+'+/j tpG'I@' amdbV/Y<[M.fٚطЍnW֬ ;+5ʁ|uKk,7qYMVQ%Og ҔT m2\]~n+%>C;/><1Z|jB)T8-P/MJm% A8Ď_$ie8>wzdÐ'Z فUW8dCB` *e`{}0PV7&D1@~aM-SM!ʐD%pZrŝۑ@. 3}.&5w2Ue3XҪ@zNrMsh9JW%XϮU$M(4z*_"{ZV V/B:e0&A%: ugM3= b*.Tp];<ĖtΧ:1*XMuLOJWH D4 q(5~jFz 81"TD2iW2ӗOuR@(/Ԛ2oҪ 7nkGlh)#om5@6rD[)0k1ntT ثV 1mzls۫/mlt#% ¯5k6ku>bt*VɦR /Z,IQRߑ⮜< B-buJT mIjAokabW n)jx1( ٟPlż߲ǠIimwS}rS?Rpз¹,q9I ;$32.3uݍ-U")qR٫ϦF#هB0&?s6*C5*@0L0xدk 3a[ bFͥSM'MYA;IHծ 0ul//ѲJK6(cU5 cJ:`7f+[h‚DoRd;zt l`}w2oFvl4]wߞ2EB\tW2ډew 'H);+/GI@=fŽN5Rʦꄱ=dmy&HkW ya`$6T雬/0׈$u~9^TeΝlJcyMvnf҂Moq$#*R+˻մ- I/3QB7'zkW:OfhR.|Ka.˃MQmۏI2ڏC(jN5Kr Zm87liIӺQ;7##O,*MzY{Y8[JںH9[^Yku~87;oꕤ]F!h<1ðCBư!Ŗf]XNfƧ?-"E9r %D^If>=7rvWM9rx*vّֈ= )) lrx"xb.]O"nF^m|O*)mSA>Ϗ׋\ѝJ;[񪡶׽e!Jv)]`aw9-WDˑr㟼dG]qmVD'?ԟT5xoEO?䲾*X83#CҨiSK$o 1J&`i57#T-._,]20gO(G#(ؚsc~,F@[zD d.*'OkS.IPIkL:)s"6V1vqVzUԾC *(:><_0C݈K5=hu 9:$Cxu޷O=(1/iHqlÊuI.Mf{Ks.DC+prnw-18= dl C=$hSōA? >ASav+s܌d] ^L2y )x?%Q|F_52pdFcΨ8yvvnqVTDڗqn#>i“iEʩ2޶ 36>Ϥc PpT4&}>cW,Ys"\!iiV+'u]ƵX=rA,0 Gܲ` T(B#eOݲho_-|Ea[{\X}L@2Qȏ=$$2ܤ΂ơ/AKKxmm¶萐[[/&Kk(~ˁѬj]J[8XPTC=;M$fەGKi$-L{F 8|-܄F޲di50x8vY~ ۬X,c Ak].OQ e?ie/†68S~a|0.X? ;Þ'mwE8mV״kH /Yu>.q*R/9il;s/#C<iLo Y嚊7$W&ɧР`V"(K!lg_@q4NR2ohpȱbs <Yap֍c]J,▂ѼhN@?#et @v&Ϣ(3 ."s!FqQ\}(Rj'̼Z&ja) }֞y3D@kn$K51SëQ.VY? he(z&^H rcC & uKʛ[ UZmf)Sk'B ((W-ccnx4]f|^ɯ_* AgjPU+GըD?3g(\בZdLs$5,o坢ɵ]|f:jǞ*2 'M,$hꋏTt ,N@TyzS؄;A˖|'ΤjI3EVH0c'S5SvD0oK5elC7Ejˍhs.q%K?@:,ن2AFaͭ+MrF ? ɍ) Qưޮ wT FȮ+_BCt:em0Z#8~XlKN~1 bkezP۞ wİaT0r=vVUn2xXҀ/*hx /_mH Y7`2Q/9fF0nTj\zA q䁡+j$ ( }`^Qw t` ˺rWOfۮ0A`/&]NQFT%8T9GlO# ۚoxG%{҇_[!v~QS 7 a tCG5*Oy7wcJ~f޼Ub5' t \?5bԙytؤ)gv MSoNCއ+^f.0t*]%T1-P' qVFP@ͳ2@AÏQ4~av׻6Lv[LWAzsuYZXa (8tʂS^l:$ٰv/I@!pj\̆L.bw/Qs}0Bw_ VUxHv.,0KCPTYtHi0v49 k/Ž,xEj\/soV~˒#UL Cѩ)Ȱ4&l֐cuD86Zm4e %9 aTsu%+>\TRC PYmNK;>O&s J5eku`!?@&B_Q:dĔ9R:5;,DFu{L zZ z-i.U.2 CQnp}]k d cȱɭ0}1w7*!X|No7dL_Dkf<`Ę仴 bDi^rCRΊAqӮy?oQc1`Cw(魕*DI_i?瀤I@lÃ2x~1~<(s0pcLpۜuuSoR=u/ (*29U6b>g]$+>iM*TcF?݁N|4F`Fj]ϳbE,$eD,U:$έ/Nfe"!O!cB;LsG"[D·$uu']yiΉv+rOe,'~So> ;׬kFЭ:VH|AQyK0u e0sFlQ*JYxmM5w8 nu2Ҕ ݀N4Y r4@A!hgSqU'H$i.3Gֲ"d '09M9|uגm17d0Sf[zk?Z.@&٪}avn`qm(_5k1eYwN /*4X=[ ]Jqs?H\+Ἔ'F%[iIRBrZXԟGI V)$2dz ̭|o!*C }霈\OH@EK0x1yoVqOrnofi{p4}X* /DC# VI=] FK=`R,]97BIMɶ u?#C.φowRuoJSjOdi'7\ʉ@?n.1RVp>(rv-j`?;AY9.ѳ8-T5/,n\ޤ LwٵB"=P|FxuB_pwFe aǘINȲLwyw[ oêzm.~( HBcte f\iGɏZ˒%,+TfIdԱsT>zg])ȕ:*XٻSa7U0H{)~*P)c>Wceg1 n ?U:ϙpo|+55c͜N# u[KBi(d8á:Fbh`C# n,G1r@MtN e{ "?)_?to\VQ?قAo$Ao_!KQXMypRx$û<P~X|5C~?\j,!nnfs| p#W<ވxfM+:m>VWU70F˔`<4`s˖uB#'o[w8F84ˍ%!h!3hحi U g hmmڷK mhrjH }ܰ[ɸ&oxU} UB,[N/ߑ^>::Him k5\;nmnX؝4aO!UL"G {z(MXܲ$IM~&m@[jʙDʔiAUːM nF&K#S\ׁlE>0Fc^%wp<%+¸.MzWw5Q<0|>}Y{9 wxBJewO'eb7UѺ,,!^i&m5GlQgv(=>#EF5mtRBK;D:ҀǍy9R¯,Yɜ#_ Obթ& t#W> endstream endobj 2254 0 obj << /Length1 721 /Length2 25744 /Length3 0 /Length 26325 /Filter /FlateDecode >> stream xllo=\Զ~m۶m۶m۶Sm{{Nv&s̙))#-#@YLI@ MJ*djbio'bbP75(:@IN. cj6&N5{{7Kc ++?MM.3KS8B\N njgdhPp54X9R6qv&LovnN.3sȊ˩DUv&۹8s65vWu4l 2_N&.#SsK;h&igf`OῩ9@񏆔SЮ66r a{[WS'@(C[K_ $] At05QtGj3C$w\?}55tz&v6?e{CzIIEaEM,.hid -3=%i0?_@`_K=i9XL F^,L˿$SSSc{cJ?*pYUFՙ[m$ kwX@#޽]ɇV"xSؓR*s05,[c9{̍ i켋:)r^$qApĝ?Ov┺YZ߰ԵE7Fo {XEGᚏKw]6E^ ㈄Z+B> 'wG<&ZGZ`uѷ(k17V.x!'qKb4JYrhUtpK_f.Up{ f>gxF;Ʃ^\f*`h&nnpr;@K] w;|{]iJa0_ݼ]ɐ\'=kҢ"92^ƞך22Y*'ڡ/q4wGnzX }k’[%F뎀[Mwy5q34r`>~c#:~#Jl+M>ߟ;9ީ cp[jW -3˥C[ÿ,ժ^4!m4) )_*au+YzmEv3x0s>xW.t/>τeOn?2JZRHhȎWVdE(j[BYPv/^'LUΘE E}_ޯؘdnK#Inֲ [>WsCshOxON1zM$[֊PX[ jX^Z&G5. I2Yߧx+`~9tXC}j ^yl+VEq(]8 ]\ٜgTa  p5O}P¹671 .MqفkƤu5ٞ 1ۡ^DHa\I5O/\wuZ~(MV +i0w_R, FetRءm58)Ѹ l#ᇏFDæo;cxN܎gUF%seم%zU-:1 ܢlD|3A}|Sm~ֽ7~6'"]!p bddJت}Y^.`֤y{꾱ڸFr1c{@fX)}1hb#>-9bf2DdsBrcg,h|:ٔ2B~nM[?z8xp=8[+~+:cG#J+ 5B( ~9"p|XX&m\En yTTwma ;XUTZB'h}WV E$? DHc JD^2xH-% s]9זQ9pfV_#1:b@Z1:ݒ?2VC>_y WO9{Gj fقRp?-z {CDɈ' u|Vs ]$FfXh-<9T-cUZ4F '<ӝv{!ecO}! P2`dwG,-}LЋ2~U1 G iYb# & WVkO^i?H/ϼyo %*nI3 1LDO~\5 &6?Q B +xOkt1*}I*[r?Q0@,zjvL /˪'X[Y݇ǟiI@J;̈񢽧rB5Eĸuw1z}C<y,n%&Oo#)#f\k3ag@Mrmsd,pZ =yVaο.evP}۟~.E#ݗXpI <Q>)Q $XKT+C?eDdP'1Ǹt@pΩڹlV}\K0@,aErCw +x;Mj ?Dsla.zٶQe*R;Os@o&͙!bI\+6p$b/OGzBQ_#)yqb.Ws<Rb?U.g2`]H!$:Kq1#DmGSplxĞ`+C;?cSǷɅ *,נƬ:͏[dRR[h;LLk*է?yC.MXn3OgN.Uywsk]| ^ʻ1l  *a@54-*~jٗb$x(1BaKknHbה[nH$ւnf6!̗6.D|WFfuZ0:Xm. ^M j/ZKYSJ͌nRT{:pFkIdnQ'P3u[!*#x _웿/ !$Ò7G4 \-Yi %4Cǟd bK =׃:<_VboyHu^ŀ5yW5jSzXWO':_LGu7 Cy q!JA+9 Eu%lRpF gs%W hKtkAΟ8KP}g&8|D".Q>LKjU:9wfpm=뢑.B'u 0{ 9&Z&“6Dþ1wT޴rrJ-R9ƌ(1D.-mww]O % _V;lJê$X%}JU;@z]4Tq%XV㉋.^w~)VT }a5qgsa~6ě?Dv%)0ɦvJ_(v՞92`nܻjK (K"1;:sW P.yeGv̇ÒaDGԨOO28cb*ƎJrRsE3Ul%1Lo_:ڍvk;so*&\5ϪMdѨ%܏ՌoC&KV9JJ+g{t^r]oK5cb5xƷ'c֭a+~Y$Hb:lG%d۵w݋+|]]8(;,5o-dqZ6:]7< K7.Ѯ%oL|(nt{TbG@t9Ů9[2z,H]uݏS$eslτxɨ )^pZJֺژb*NC8(q&3}xd{X{ʾ! w; 0X1β6[\A480$1d0 *42O K/P8Woz&W|л }&vQ-݅D?[`3&.H-cE@Ru,?&ue]hʁt6ƫpK._ ] :OC=~BL9{ }z,A.̧ᜂGJ/oRO̝D[n'c_'nDW^/b@Tp#0 3wCJc-+ }9[].5J]NI(=RאybjLA11jK6JVز ,oG0M u9 8v@ݵ]+p1)@? W.s'OcX(MYQ4(8(-oˁ;.rKKaY#T]v8|tis YaZjQ4k p! |:k[㮌e{ԒӰd l@:B`7!6/;at*&7 M:"K5w?'4%; ImXkH9 \ޝ#b&-(xåZ|®~E]PhXbʰ$fFz%W^p@Cܞ c9+&%ԇim&NTU^w k|Y Wƪ͋f-3ZՓ@ ohv1c9ykC|hx 5 ]:Ui!Y'ͻrUQ c5ܬ6́1$Ms[YäfWOg^.$?+fBTYI5EnMaLITVWm)\wKcVhn ?X! x Q Z"x^mO tS(.&<3ԲOϧ@0E:tp;\V8GP7v.gf ;K3~L5\Ğ}Yٕ0\lixz  mJ-!LPr71i!)]&{)Dd%Y`xM$3ά%C%Ԣz}\(/N' - Wԏ6r`veH1hhI:0 '>!-^c?H4LSImyrX盫y3P$ypea j7ɐ*҈dYQjE{ߕ(4%uOFh#w{aw8i$s`jEɭ dIVHLJ;-|%Csj! ^05]K$I\faZ3M?{~aNŤPiҕ~AͬSE"0=w6NL9zS?݁>'_kƀ{2s)Bׅbaq#ߘ ӦJqһΤ W>iAs1ßM!5k?dE-l3/1AP-&< 0aI5A*b7Dk`ferq7N%6Y2Yo8V6~NA&yr65aA{Y 1`AOyBP}1[MO2#c&_R3epsP\bAgUs 4M&7f94+Vޙ,{/$@P"Zay^wk 8<}f! jZ£"C"z"P`W Fp% %%m`!, w65uHKc0Bgr pq6oZ6E{\KxyxuetTIXbtQRP ThkU(@nх űtsy/d\fhzS 78/o4뎳p+8(XEo诌p!G va1mhahl15ևk i~5o{LVIG: <` W#*:kA#Ou"=v O`-BG up S)<شnN8Q?>6wJ'ʰH8m! LF;&E=6\C;= 9wݴ`,NjPw}LVMwӍM@j\ps]R@;szB8UgIM==M.g+ĵ&&~ǝd/ܠ "Cʩ._)"B)SxC>m+^;| A5*O^wØ=mf"&|XCd25Km5XP^ULO +Q45i Nƨ`oO%!mx! 'H@n)FiyPSU_'^˯vNP&s +L\ gb0#r۞e73oے'.OsEKp_ \,ŋ4Qې``3azX.d/¦'qÊ̜N@Ҩ& Zw@F!Sf0iEF@a*8H+Sk@+J&')CjjlEqm_F5乆lHTS%Af^!f&nxלѴW򃢪UQ=/A%@N /@6 m:3P''("PnaKk< {,h <#LT]]Ķ.X!? 7Ps֮+B-=nT'YEj)&(IuNg @VMZېPWp_TAWq*d1/o5`g0)}G$,rrV#lݛ^h/ٖRO ,-"`"ϱg{]%Cӧ_q66zT _ƶ UǒrY~u0m+Itc@0/@/;gMw+,'1)Cg{D@Y<~M8Vm ;1< ;#x0;Nauqyuy *!e>D!| #[ۼS8%}QtC Ȥ9 ~^s\pGm\Q-`Bw̋R̢[nv"4'vs,Ҏ(΍骈MAݿ|u'?L bFuhUH=O%e[ e$C JZ!*,˰I7 +⤢1]␅pjMʇ[hra*y8(z-&aHSÄh5u=P,*[aQ cGIViPk7UARt;Jg9uX ;-\CnAފTQ16{Z\>[ R%t1*IT>Cep%wI$ "q)& MP:jogǬЏ2%29;#$)¸Ze&HJcqB?ccIhwU$x~K309!ud5B4 Gy ]Z و½#|+\^҄Va,]Mu BuZ v;%$ Em}^4\"8n\y8wndsռsMl:c4gb֞K;㙿e]hÐ PkM4}ly^HnOq7v}I}n cwIwS)y TDPu=1RN=dZ8E;{JG%+6a* ;rɜZECY\izz"@Qe;IEqh%7RDD+Z!{!6FIC@|9ɷ(uR>8 e d3Ò pTqLhK/(Ojs|ɰsby.Q;8}F/dYI`Uz:n.k,:/*XwxbhLRDշIkTR__;WsK{9 vvл0WZ'cBW.ڲLz5wAٟt'N(hVKxD7& I/hPzY(P]^27h#~2:%RԐι 69NJ7L9Nbhp%$0r[A?vG_m}1wLQeܬ`JSeqs2~w5|+ED8FLu 1PNZcVBQ%KN0ktp@V׺*#Q_ajl;ha~YZWJb}Ȅ*V<ʤIGf|VńMS0~ۮ:E+R{Ig3\'@Uj*4<(p&Z2?n I1]2 !A)Wvc}DVH)vtN5oðCE5-l@f@uynM>zY`C4&-XOu ֲBr,[J5!)Sf_w1Jg! B(ݼ~YPYPW_`@/k?޽csnejLI_V)o~ȯsMxC,a՝v^d+RXg9DА>pűŻO׶%Ѿؚ앤+ZG^R@X=Yӓ"{t0qs(HfG>$ E ''uPG)W-9z D+Hi]kd$ ?69ev~Á1Y7YD Qu֊Uuq\yZ*C~{* xYAD";2rͭ (Y hM8^W$ I<(.xrtVnB&fYlKo쁪CgA̅dֲߌzZ8e@ybj_BV̗@ϋٝ & 6"vbxZskV}|D6@}N'J{ïpO }b k飼tB4C lqUL^Z";[s+&_)6$AOP 8rr"Am4A"=f=/O!T k‹k< jP{E E]/E~-p6Kbhq̞bl?S" "Xqg>]і:zzc()#auÐ +:{}+9uTq6UFQ5 QhUUJP!&.Zr'mO Im|Y z }צsV}e0o3CBAdUMa#X }٦se1,$k_tV-hn|7w_?w'xچGT51Ϥjz/K?d{1Ke?ߦQ-6d l_ q[m-\sHVyPG}(zt+wρzD\g8_GGVJ'k(W 8lT̞Ugj !*  :͏d'-k %?Ёf5 A/sY,b^kѬCw XD%ZmۍMZuH<7琞.c`6{}\ `NoxW$HAЊC]y] c,I$ttlȸlq$S 3ر? ]+bL d 8Ps1%N5ks+B@-N+( qC%ū63kuٖ .|z˚JUO{}X*f"p):!g[f.3WLx p:~6~[ BsV?0nk/QuZѠ\~4Qf_ uptP'Sf|]WQfm dt6&G~W Sh N&kyrq5=K(-IV'L'"wPB8-q'!ƥ-7Dx.bT㚿nHx͇o:T2 s L {#J"[!N󫻫, ,g#Ÿ|TX{ ]xh6e]j-ĵ]Ȇ ktWՄ)UI`tsFEJtŃV0zԻ!>$xVBV9DM!=yS:Wg-,Db<4oϨ|y䨖 xZ6m[=QM\d)"1^#\X[w(H;-<,uȱIu8ԑviGlLH745ctmbiU@/Ƒ]]&ÿφM)B v4#0upf, el)vb“5B=V|NjQWؘC0Ƌf `6ϗW~FwqwbIE||AֶsNж nҳ)WCCx<ί;&tWK)2pR{/^ȴO:n"n?J&JFjyȂq w] ?=S ztɖi5>h{2/ªUc,P )Z Ar97x4*yTjgH]hĪHoÊ4Su]LO۠Od2K7<"ρ>c-" jTAHjy2ä#n$gJ;HSO7-N6_( rdW6B6k>1zI){ZބZ|ĠqwjTHrrqѤܶq vVUĤNt69: /,oK9!ć"1ރz2ͶCyN.LX4 f'| .<\K0NʖSM3 &$Ǝ3&Xj${uPKXSIW@ټPn7jl|^;Xbs|&bʙ󷌱m`+Ϝ<3'&GGD/N9꼴iaؽ'e^6od: 8iUҗg'xlP"Z.ε\:SfAV%-ڶ 5n1ɘY:`=% Xr'YnA^ yH𑕗=ytm<;U_B׫L խjd7UEH a6%KzjK!vSe3Whjْ$3j_8|[M}ӥtR9 &>lɉ. @TN"]DW'"YAyB$@y[x#SQh:ɧ٤vnq qj˂7XBpG<{'PF!ydOᘤؔ G&E:p6ܸhFUmׅ}ì_h!T!vw.ABfH/C J1|eCO34aՑx:>@Ǭ),=QhV=Ǣ>՟OWq9KQ+  7$)wY=eDNKΰ?Z]>>~Ugs3:)N2 B!MC,@G,oI@P.S;'W^pb`HK=P?#|d$7|nְvmWGU͗}pZ@2 lV'0%V]'^/_mI Z klуlk鵛mpFzc/du`Vf=dʍiQyv Z^g.\鵒>5s %2.B퐛#ʤآf8֨s+X̼}Nk&(v yk&%uWuk}uCy+9,'2w~RԀ9"oTE R$a*(xu\?P <|#M¥w<ݬ'k/E5ʩ =)g --Z\j=7!<+S_ڰ+t9ǚ`A6&idWĄG^Y Lӄ&AvғU9ֳOcI,zr7$X_^,2 hE9$D0nfb2; r$sbSfK%7gHS~1}딬fy'-.&aa^, hmHW@QxmR^s6ۂOD%_)uG)A..hh;F.¡9^7R3GMrVCdD{B} Zi~g"F n徨>~?|B%cLM_@2}vpC'  )hFc"<n)&><[='orW?S?KW=,30;2[VI*П?Xw~مxGQ h0u"e`Gi.e;b&OFI2V?Lʸ܉1T*<{fGNފJ>i&xC}@g˹rbuj _=xkœ/a* r޷Gc-8V&qD!x͒,<}Q?V{w|Fի_=kaG=QjIA^O=-X\F?hKҋ$ufJHmJ $=| ɘ>!nPZ=~讳+jQcSOTpb{ɋn- &+D~Q4øFRf×hWV)$9a*p^XR1}ZY/f<h.Kxn=bެ r$Mj̜ٓFr)͵樖 &H9%}ZL vMx -xUe"Wg?}k%`gX\C|n" WQL9}K&HSxa-R73G)*hV؛[k^VNwL؄JC`E,d {Ux[Gb9)XNYZ[7ʖx0NYP0º+bvfu1>սxϚԸRmB}LC*L[X*ZQHCڤJlj1.B2 pK[W␮ZB"'RHŦڳ=9}UyL7:b5M7)t6? ^ fJ0,3=qٍ||iQʬ&'2%Y8:T"yh6^#J^0±:c^hx iT7وbڄ1VzA7-F^J/e7 .DVyHr+U l*ac_%`ngy/Ji:yfQq[tOVewS>փQ_jD~bTTr;0V9m qJ!>գU٬jXϗWcG+YoC[68K=zv)E0N^,k!J/]ykdD7h\Z"{{UnrJ*hh֙F?Ti'0$#dAԆOƱ,.hTѡΉ!cN vE<^ [K7 4c%k#qK_XY'y|wVžXmlŘQJ*Utjq!s|1i $ !:ԨD"RQX q!qYBE{ȳ#yV$E]Aפ&K+S96!G؀>oڄ!0]` -Q)?uDctDzGzpb^,}jݻcå߾y_!]~"0 (Y*SA@7ryOа0QL*Z:0KTnl76wHvԚUU$#pSIf4*XvXWel=921SޤwaVK"[Aa] *&Eg4cSmO<@Fce^~׺r4l=~ς|ǿ)Ty٘cuK)deѠUgjT32"]W I< @1TF"9;EA4,k>P(u农 ,e_zg/5e'+4삳ѭy% D!m\Aa^<۪#T_ێQRQDnG(Wo 7(r"7yE6kÄBU*hlA8`RΦp SbG/j.C* !5E~ FXŃT^y] hxrcoYVc' oS8K״ލuqx|r`t:Eё ^nR/cLnM0h?(kZXZ[3M\~'07PbgCzxA.1qջ|'0:4g gF% -33DZU@gàl׷$4M$mⲏxz:y8}ljZ;2( R"jNS@j7.y'BAMyN)Ტ=6E`S ;h6ջR(g'{O"釓q?go0}-@DnzT[$ReAJUrlZ3ku ̜%_+ 22tb-Bhx(:*0ڶfK7atKɳ5:}- [ߎxeE~ ^0dƆU2uh`ķ MLtW z$Fˉ] U--N! Pï=h NjT{Kg&(bۂ0W# PqSp7jKy}2ԡ8B LR~ٜ;. Ʀ##Oa"y *r֫A<(T' 0ߊ(\7q9 Ea\?F*{hp=n-÷gqdyJI+Ԫ-tˬOplNRjLw߰ꁜ*مc"mB[}5ّ68FBϠdCF6G{fzA6 e˫^:+،uŸh 'aAuOƿJ>a]*dx?Yk4Yn$^gˣEx 7UHb*a$MQ9}$R.Erw\<mE2+t#ZO{z14OL|q0Av#8>WaI6eRBqG݉ti.s5 0Yk"E"Bmo4}}&JXE'}i?6DeN/Xw61q/M\JHb n͈z)I)3x{Ryp ?)sy6&#.R-E#9ͬ0tV{kIK'bj`DON3q wȜ"4; O[0B v Ktc^؊bYgG &NFᜢе@͉s $}R#`FNt "8SG~GT㦞 9sk *キACnV,-T(~%z:"H>)fBx-׼Es^N;@r=bX]l?pCN *-\i[_pUyǪb*8sigKHB??Q},NUE?sp48%danp߹w4JuE>|%Z]%/E; xY \&-򷬸<:SBR~6nI{jݻ5 6&^̓y9cb2YU+ |%CGNì]aZ>yI PFt1Mջ")BC%93cc3dZpO9IzG?`JVg4[8KDYxyɉ\V\ 0ꢢTx U7/bާθy?j1V"U .d#Pcp3!{y&;M'L \- av,܄ Խ5s{'l.A;{aOوrk0^Zۢhz/ ,mGg2J@kn/@ӹ{qoo+TBg|8ci:a5)^4qD%UMY;(ꁰCӵBl GJ#wl1OO\IҟSJ5{jT?dH=>TnNߴ茱8f-Fu5NKlM~s3$?Erޥ$ ATU/ S;P|xHH8+@tfm[s@߂ `C>EHS=&%/JzQZO P=ӯdVWjJ5I˜}OOw! ĬLB$*T3Ƌ"aQƧJ$3RyUJH2~״u&.M N5h^.$EF伽*c|E5fJ=z}&I/~p>zfM+_~, @ @cLΒ?g_=zӠM7 =04_T< gD܊.<1Z_kEQ5Jl*8AϬIu^I]P]YUҠ<]z>0s{vԘP̃Ё'Wq8 -c# q@pq49Yb"KY)1`I0&Bܒ§/egվAʑ/ !oHBc4]фvŧk%&O ֢/x߾zE/y=/n{']YH% fdYB3E 6 %jw">!ӱ*\MLjN(۹pYMR)|S>=.CJk=`귚MY_k,0qE')]i}|*ݘɅngCjX bOWDf??xՕ+o:07'Pɮ?Â[$_5)~B(~Q|[՜R;0krɡ301LI훈? (> stream xlctea.ڱVl۶ѱ۶m;6;6;m>{{ǸcwO=USEF$ngadcg+1rrY`Dv@n:01`"vfJcjֆ&65;k;W cs ?E*@ 0D5%@[5@ ka uRLlM, غ3uȉ +ȫDTE&YmEm+;ZJֆ+^Ga&#-,&ekj`or@C* _ @)bgc tٙmv6ehca" dk96Y8[M-QmjhՁ]9_EMl=ϖφ Z4qۙXؚTqih -{trΎmFj:GQv^tL:&- bc5vqt:F݁ưkvV\ J*aPM\1;)ڂOSlvB] tuu>^DvmnIrcV i?7pj{^M fѳkzW"y1 #*;{' *?vY0\FMYg i'N$`(aO8A:.&wS!SHQ[s5P4T+tҸͤB71nBS/+ | Y{4TXY9߭xđ}]l6OL}@56(`1,Z&{'74oNm0&=LV֎@@̷!zpc?4+"J@B1H뺥uЋ:0kRSf7՞8qo,Ac\ z`96w.x90zr0aI҉@nsJfra(1YtG,Od׷?i^eϏvԢEoKЧ+/}ԕ=[j<ہ]d>M}KcR Kp~͌%B@^kpǽOYnz*bйU?_F#uA@% =(Zmb890xw:z"HV1}}ʜ.ZEM;Z1yX= ([#ww’bf>]{U[}= ";b_j b{aR v:>xW=SbP_EL&L 1);!Q#!!:Fpn=Q֩ލgw 6sz{\1R0|U* e]ag)Xy숖k8ޛf' /*) (j TY=G觟"iC8~ȒuØʯ*H-z/*F1UA7 VvDخ=lE]$dBϾ=UMZɉPGī9j;2]~ltzc8_THɀxY.5x;eԁT܃qeC8pS ( !692Q7|wՂZLRm0t[}gNfمޟ[~!Tjp`"[h%4JdYpdTq*]oM T פ f޵Tg\{͒LjVYout4R].׼u%ϸ*bF'͟/ρlC1ƃ_j+$c ,U0Nwb΋Y>m!sw˅~n[[`M9ox˱?^V!錩>H҅v3th +ݲgy*vH {m†`G<P)i,z -W)U݂3(Uk?np{2!бiRP[Dž^{_s")(b|7K2<ޠc@Fk>kJ@)F+AW@YH_/}p^|Iv5<ȌLRKlzatnOrUhe@q?<̟!m'1snoC<4m6BZjOsej 33Lhb28{Oa\1JkbIeOGҶ=;sITZh׍H 5V/#bl:xp~̌$IB eݗ6tT;#]yL"Ǡ6mG^jLW{-ʹN&؜UpЍF*{R$MI>]_YWl =a Ģ]e_G+XZds!wg)vsuMtXc6^wmu g?C8Ԙ? uՁҹDoTd[ΥYo_V &AsN _s2|)#&ڴ q,w_s9 a,?;2^Hh x 0~\ql$r Y \W,/bZhSx>D04cg=w0Z @&u>DL&TTk:ZEh7tt/cMJxc$K20`I )"wLWL̃{-ӑ?؍ ^SQ*Sl6hwL&X&VBW)W^W_jYr61z F}t8ǽ|nBcDϖM(R{pnz246yv}qwcӻNN'É+P6߂؛@8m =L&،&e|-o(˹N-'5Вd$V -Fffr|Nq6v³re?mXNАMfO)}r23\Zs@,u'Dhߣ]E{rӝ.0V*v)Jy*5UjR0g@n],61@r[J7 :.퓓m<B$ײ;&1-Ϙ<^:+'+yҹ3K^{s.vB3.N}Oz9 sb,ij㿌T^m"z S*jdA/ زԁ{a1E 19ʡ+啂Fu\(]f T߸.aoSVO*sޕخ+!c)mΝY %i뼰3|u*cdm"Z&lL$>7w!HA[+pJdh lpw+|By>9y7׃KO*# 8O,mYs=lo/ej8d@ Z]҅,xLd%]j~&q;6KYV9<0bI?ui hG(ݺh7yqcV 8EX0yTzlF=chByt0z{:;keCH)٧a+EU(+>X0nevRy${ܭ@ Bs ւ=. Y.e\mƯqZ?Жۙeܝ~fD]e >jSnq FHk*1F u y[mW.:+Mʈ/"2gY,ki%"{& |"`qt_M+ؠb#~n!F缇KwHa4ϙZfN<=1n%lJc&XWD $;IN 0z<.cۿN3Ϣi+s!̿/޹ cfx^uEpQz?N I yQC󾒚~zq'Sr !YMm"\Ŀ+v!l(^VF(qQM]וSwԬNeNj&Xʔ>YGe17j?nJ)Ah")dž/yk3N uQgswb`{!]`! qȢ\vxr% Cz 俆6nlWo HfU#SG`Tb_55촭A&L%(9>&7)L9l^$HT3ܥW00Y׬Y *ЩRS殹@Fغ`94}.x9c^F cȃB/GwZR8}Cԫq CW]*.El^=Jw th9ea0Xb\nَź?PhXyH)"4 SBq"ɠ  +Nv;5$.6KǜaI(wڼXctG"ôϏhbS\ K~er8/K4C@=RaUhw$;RN؃xRX^N_jo0eGM:_=4ctф)nГX̼dΑ5ICQ40k5Q*7{s imb4sF=<e]Xh}ƃZOMIޏô"_ rk {Jո2aGnru"|ƕn 3RVV؈zkLO9x&wKq 6 +҇A쟮)-qEJ-t<ʃjC5;yHY~?yZvZ+kOaZhAQ,^?Cg<"h"?!ޟmH۪EF_Yť@]#+w={s67:Bc.㜉WZzIcEN2+Xʴ%ĩqR@XbJZ ܅ U\&d}[\Zs䛓 غ ;'3~KwqV)լ.B68jG_݉yӞ˗{I5rU`^Aw,q=qft;4 UfOTVxmR m~-\arXƅ8\'(&ZRYQjaeyJs@3UNZϒn+iʑ׋q(FB2m4%?|ca` c%<z]?b3aiC&ҼN#TaF9ZR鱗EN`;9X ʕ\ _Q5*?P|\*(-f+b)_rv'Яd:!>+܍59F긢A9 } keup뜌(?L1B G|xPH­iD58Mq[aVcfȦJ|47UwRf2EIJC`2`j:iv*_s'yeݍ51‹ ui$Ň&5fiX@l yB<_S-? u%5{\-' }^m/Gy~29%"2% `W'rp8 [a=*Ll*Ätqg:=峛 v>n[{ !0=yy@8DϾm"=TblmМ%Riu6(h_{31RKZj$m9I?a_m5$Ef'i񂋉7] lH oou҂d C< -Huo Q*ϱB4ńVћ{ XP3rP$%EkwJevs?,'8 eP+ z.n{~I[ Lח[˖ӂvj$42$My1Vh6oG?jXc= U}>W[M bdMW BvσliTMN+\I&i$@E|݄|ؑ6kmiw9/(IUL<'_u-䵤& ~,Y2 2CW蜳{ /L}XlS=ӄth,Ӑ-Ʈ9P51B X\%bOq\Ө [DBdn4ԫXf❞S^Q@ -w8IwLNb7Zj'gjYk ~6=yT B}g%豺+w?)Jy[>銺i`-/FXnK/P{58VAIjRxr2]HIUi-\ޣcQ]1}k(}|1~7%x=2mYt AEnб\0>уdʩg3p&N T]y|Vj0P.wRlv@Sx5i֩'}LJ% f8lLom0"+~in? {yz䱻ե DuΨӶכVKnS' ?}D;z q1mz/l^ }~9ʐs !pnA5^4 1ne[[bcCf!T|KἀkU5vVAΉq6RYd2#E~ƛzl/Ʒ2rc0i=&WgCՋ(4鉈nuVI# > sZGjQXdQҽ4jĮssX.-~ ~$ăE;ꃉqXA0*53[B{o*;&htnt l,1_0:/1F!jF81#ؤaa`(*"ճg&چݾt=X]TYgc\R~hC2tehdD<it3 lRabm?O /s8 AV4eL8p8J}|8D3xAؐ4JqN^YCN|y$5D̚ɕeúouߠ1#y Zm R@ˣ-b=I2gν5[֍It ͠(A%[ 9L:AƴO{J>KVYHD>b %d)EMTu2`Ws7Tqz)-b7AĴռQ͵ Wmpx)ku}sZ .B7FFϲ˜,(NAu#jf .p*"JAf}.Gցt|_o!8[ϝU;ͳ DzHQmJBRU-nz:݁5*G]R&a"hByB)R!vwh m|ɶP8kmYT?$}a|t0Ϩ5aԖX,;vƅ U=X(^3]{*dkBkZdV.GH|ubŃA2S"q:.BCAR䔩tx2lep ?;p[ dzkn !bT)*7sc0'` BMpIDT fXNjސ0ݠ|>X>+CqE1 (qY'L!u;FaJw[w%ܺA!Y׶/SRޑ_txlwA#Z\Bcq  Z4),@^߀{ Tr,Q~TJFMH>U\4 !R#\m~%ZFX[ƽ΢$ŸI-zw2M>~kIAWt\*2R !R) C5%:R֏k׾^ȏ?G4?`¶5s3V:Ij\[|0R ܽf)8f9g)i(8Ni~QfPUNHkn~>q(Tv9rv-UdXKOFTh\z<1 r.*TԎmpjp, =NG`c"l)з|>MS ip=⬧Deu C0xȜl3mD9㩥F. |_Du AG.H4dI*,vkok[E-8YIewN6i`|bwOTƫOO0|ܓȳ]a;~fxS ,JU#?FPZEA[ȉ9k }:-0`6IK["&!1sՙi;@nroyO"%y6-cP~#S9@jS CЭ J4hzn0x}@5,̱U֦b=KBOgvunJTWP++q=ԮzƮoͣ@1Ou)RcT!bI85ѲTW=?? !xAN{2 Vދܷ:{-Zy:;jgU7O<_"[h[ƏWr!MD-Ci$~.H}iٙFL AHY>} 'vy&)y>1x ۷ɼQzI|'.Zx%в,>Sj)n]gQqDŽ{8T "'?7,1 DOy1~ʪнۋ2 ^@]l`x&X)=vƝ ] YN+dFR۱8Z8Pd/)M}/yCp?nD( lH[z 4ILgܿ hݪttˆq~f݆?707]TIyOl4TkXꏞA:0R'xRU,0@f.{|iI?? }̬D;ʤT|~ðgOƃEΑ5A y0N`s|P1 ")AYo=34?7rBMoX}můG@Zl bk)펆cGǹ+;2wl}MQ}eW_OJʰ O(8$YgK/3QnWQ$۽şp([pHV[$eL[j,D̨'v tvR\ A,uiJHMgbYLEPYi`A1%jmꤡ.f7x~$0'JR"n9Mk)D"+Ss-|/Ox ".s!BN(Q6@G"ɽ" :JEќ}@D@ l<1Fk I`2,5+#n+\A?7/ΛW"_&C,yAzZɜ\tnDIr߬.vԞ/2-5[V'> ~%0#MY!'nvlk_.S t136븸ttE㋖L_CcA3)b󞮇d XJ[b%~\?bmĮ7}94nlgP< _3p"p%!v:@omjԪ ^ͬzޖjR\zIi1)PeۈVO]D_={A$ %C_aNKWC#*{,3ɽǕX[4XYô@Ά v 'LKi~,Ey '&ѫ5c6 %w.zf~c{w=&d]\Nwppw\MO/؊rgJo Y嶀wvύ>TEmxq/N'osnmyz# 5zί)iEdAKC fk̐c Fީ$b zP5Slo]ˏ:OO-Z=\ AzYdlKiAP,(HհGGW bUw݁,f3ⵜt)؍ a<)' ϐz yE<#e΂,8SA7J<5  ]&]])~97gԙ~!BE5"vsfIۊ&1  n 쫂Q:E (?'bqgB⬓!ڥ"Gb"H-K6saݔewDU~`c͛AtYrGk|I(_TxY_L8eTmLa9TФi"b+P{nDVJcOZyFTy$e`}JT#'M?PXu|FF$ۂGDT x_:䕰\ e'm'=/qPF,6Xy?Djcl.ݫ_7>U7tidCZ0TQ…pWN* 8ȭ蔶G0Ǝ8%yR#ַ֪ĵ` D;NY.NaOyS5Gpu MZvz$ XvDFfb\~e3|!s;۩[앍>vGSyߡ>8Y:l|:bLGĢc+ObhEҰOJ .nX }NJn؝_y=gTBT#0F[޴ s+Ԝˋe6}Uz a&\}R-=>L9vJbTjodH>ZCKO. k-XY%4!خb*"'hU1kK͍~ImNs鯓u~Ð)aT8&=U!T"!MSRE犕{hQ[ۄ4儣U}Zq5JGpPZtvŸ~YACY6}Fl5rV%ImXyؿn=N<k)v&j@MF%H[BÆgUnyO׻{jd&xQȱU F%2fSAmM;0NlO}I֋tu~i~hh>t|IOu%fY(\O?]&%BWm ,GGa H{4E=c1Ia=1n=^5M{{w` Vqn?saj1CdJBqcX [\t(Bg4 E *eu(j ڣ\v󃓶|w붫|3U,>da˛mxZ!(-FǔtxYS>GD sƺi:>mh2aPGgi{TdPyip7Qt'@ 4doGC0L$n0Dx6c+k* |DI-!)4s2;- 0tn? X%kIT ?f9' Rv7V>x+(nWddxFa-W;ISayz(_\<%O}DWpd,4فsHuʀkO'NvDvD|zڨz3me/ִtHOz F~[IVԃ\qNq70N.Obn7 endstream endobj 2258 0 obj << /Length1 736 /Length2 12145 /Length3 0 /Length 12758 /Filter /FlateDecode >> stream xmvct%̶mlcضmΎ:m۶m;1:vnsxcQR\sEN,`dgf`JJ3311XEƮVbƮ@& t0XV*S [c3+;+g%]ōMo*p̭lQE%miI:@ht6(ZL.@j3_\!`tvK /&,eTۛۻX;:F p3+SW _Iۛ;86ssO/!T5f*Tvn@gjlWg+sNSblge- iW㿢[LqZHXy͔\*onlWIhff;`3{[}oW<ɨ"L}',no`feoPu+LlycWg+.ÿ_?HDD<,fv67Ch{^@SUS` _JHY#uUfеk]TaK3ãK[5s&{ҷ-$q@S%ۯ/ W8v \3~n*Le8J2Gw@į/KRSe|"hkP-C L7q - +´o->Y~`JgT\UbǂLD│&^G&f9;;rbvyA9qUѥ^Ҍ6F*iA iFh"}̵YS6`ycԎ#0F7x#?'IJJ TY~g=gбc؋Tn{ Ŗfsf]`I:I7xV_ |W ēvL0^mt}` lq1kHrié7h'@+‚&Cpɮ%C訮neleu Y}kԼ6;.*4,!>tedg{Mkyg  P@Ӵ,pPz9GUwɡخOLSRQdQKR&ˤ8./SrPOFo9A:*Ɵ뉧*3/>`< '*bmn%»\F<-!PmAr\+hd08z*u*|e8/Fr#%G9yݍ+ߒ|{Õ{|nd<$drQ/ A4)";`e6o:& }g4z{F<:UMv4'zgVCiIL5vR̒s)\aj2d4BD"&ڞ=VbHu u0a@N~d:mp(HCn|қch2v;q6;b/^P4LK+մ.cs9ûPŋQ[Fr2E.0oSTqy#9p8q' SNRjؿ9Q8tMwȳ u)!r,΋Kb{AMCV>7ӯu$)t4i~]ĉ:0kO6ng!J mޘ~N? ' Z!bLr1[\BNsxn.()Ҹ0 /r.u+>?twih ?^@F YZs]$pߘ;MXrj5D,$M O>v]уD7uGj)`WX-]Xv?զLYHQ}B(y8\nodT{m{\ ºi,o)3WjVݼn:Mpw3wQI놔cK>N}JD."gOì>&d8h56K|#hʀfմA3v#bs<,|t #ֆsrGU]!_{;8o[iպZZ%,z)Js+ԀMϰq>I;5= ؑ4W\׭w~ϺV|Eg@k`ANݤ-/2KfFR~$HD!y%lܥ(;$_]=x6`$,ˡ ]xhA6t*>yd [N (CEcBJE,~q z` U0=\*2ED/7&4GG꤇!bR Q-&d #n.o;: V* ,S5c:vFߌZ!dj=p Jdm*|/Wy:tSgAmeݶqێj/cWs0VFHK-h'=:Nfn餣hnB>>Ю{oQ5CwAc|44JaO֍8Sа)wg_~<3 S\J%31cpaq^CBMJvQރF[mwNES泂M^L.Nuc 8?x7V*y&\ra_mr{0DC<0̧SbvZy=-/j&QeNĢ~kBJ2yaRs x`3FE&_`|8h9|m9奲 sbcr~2Ub!BbW a|^8 N`2K& K6Y)0͐OO5WcЯc$Qc :;Q L?Wvᦚ%dtN RWsŒ|Y*c]|Teq.Ze+REJվg6{1A]LOꁡTq5&v{nuSzOJ_AnHT,=u=gI!u<(=Hlx!ef Wjh 9Cb2qD*3 ҳ%[ 1Wkc-hP=; xpӦJ`NiTE3TAKtt^\=_|{-ԜH A:ݛՑ-BX٘k`pe7 PI9AzzMa\|8wfbZ܋ ֥#7qL7b)ͥY bm}x)SuIHt=PFLzй-^3DZDg,9(2TG\8Z7__TzŌV#Kw]è&Fz?t#C/7zr[|-#>Na0͵m[Ԣȸ I#Rb2~)pDŽRxoN٭Cn4Q=qɿ'I!h]gs,iL0ąxA/&(x̬!KN sr4x>`w9VP B絕ŵ ύ/mIХSʼ8PfpƲ3oe5,;lI0V4ƴIyNf) 4aT^$ \fڡV7QSů\n̓DP.cn%%9%z.lB4d63]o]иȂ7~J4qjoj H܅p i lFNW#3}Ua7mD6~Dr520XԜ?:<ϬXh57+XIUS K֒+iH#2N6qy8IAO vA c P,27ޟJp (1x=Iv)!gGD"<6Z4R1dt_'hNd L^^ a)2R$IA)2Q6{bU~C B( |3ò*14}lM ~ Ί_]\ 88~ZH?އYdqkU2 -I-X::PB;@K7*P`=qx}[|:AbN7F{l [J* nmH\wA\6Gk3(} 6eqerJ?Wc&} 7r`l0!$˄ #@m^!crA`π~a-泥 p %ag0 YCfF ^S}FwHj i}~ro5l#a01I?&s[ ƫf}5EAwY mdi#$wfulˇa)LC \YRYڄ=}T`D<2C͟oOWnXFCT|53:Om;CUaPqJFwM<0X YVd_x.|Gq}rϛN'QW1Do?54KMq-[?3$S8/LB;W>(bސhn.|`~}^Ξ}͠ {RyƾȐh${Gw%rœ NA Șa_HD6X $kg5O-^u{k2Rjtm[2Ș(,wf+HGm =g -wڕbo_Ux:zAnz9O>10O7f,r#Ե)T==goGhe?łh' RM.`SG0gМ io+m^*+O%2 SD+[‚QKWvg)qP|n(;Q/g*J!h_V&z}7%\Z4b5Ţ}_W+ImP`ʀn$YG }؇"͈x/؅7k"O10~X\vH. cI9+&Y3+{3{G3Y6Hwsx/DН<[ "Yq(7n.g$ CS[37#3\![/5=Ȗsṉ `1OVwc^4;_>p[hBUӔYŒJu?0+H䔖G05"f@F"Bz$73 Bۘ,\3;/)Ul<:n>rp@hBDT\ zoRǶ1ç\鐯 vS{6N%4jsL9 #;kTݫ 6a7&K< /*վޞb1^eh.A1h;\ A:M(>9v/.}ϧs]L}gt$TL^',vҕeuh]U"!*誯Ha*B-V{0U)F f$(N&ʒ_vC8۫gb۞n|WS!,2 B&Ž\/iʲA>uZTkz- -nI?B~ EvI8I V` )x 5&͜מ$ͥ5S[α޳? M}56<\h'`Ej#M2Pⷎ/!4^ `$L}sG㗆CUb1pn"1P|ТSsXpc ۰-D@1oύmƯuo% o#n}h%o s~qC9nG_$p}.T%u˞Qfvn,l@3zoo<@F[#~'g#I q0JӯRIWFNr[˝•M4$4: }ɃϙJj !oDzOG[]޽ O?wG98&E %㺰%3N_dp0U/&渑~_~h@onJ;+= xU\Pp#^LĶ i>w]6kBMvNxb(+3ɼ%๡OFNA3CQ3^=mG*GOa*B+ }wїò"$fo≮ͬobg`NhN==h`5vSXV8^ :,}7;e?!f@S5~*GֲBI Ƣvĭ`rVe>9O8w&xM$Q> 8`Lmdtry  ;bVS! bj q<y*Ci_TQ1#2u.>ƀ8:M/k XwSAUGj2#1G%4mƽE(~\{a< "4Iy'5&/s+*a:6 7ᔳ\ =F|'tJkc},{3$B f΃ʸA Mk.{~=N 1f)?]]"h[\DlO(VG"M|+}YdB,ޝ˔ 2H!.`}yVC<` vˇ樌.#7п ;< IJt:-6vk[fUѨ SYmgu_#2qVQhљIƙXLEt7TeWeYd(&j($>-KM-ޱczgq8wtv t*)මϪ+ak܀ҶVGK26 >*%n58QNNb '"g'X08M_yX ۜ#wLJH;!su9=5a 7 xԊLFN.2 u ؛J}\U9h"dʒnf)+}'c[G8-YlQ$up5#ZQN~f+np] j!*$.HQƉT2Q*~45+u6id-_f`*A U6+ĉ(8ߣTIh23[ {cfvvVxXB\0|6bK7exe-Ybj~cx4ѫ@<aIw e!#e. ɖ96_yE )^>+^TyWL_oj7OZ7lLk/1ap; ~; ĸ`_-}+ft :*m EFD q^j^/$ I`.[XU!BmC~&Ot-IMqͽ;fBS=­C Ji֓^I&vY^@Q.F;[dٲiWR>SP'Y4+H'S;:gŒxYHPr;=*#LN7^G++NEs||D9y/C8HW5_AnB<K eW)gz)D)[97VȺ_Vp-F'M;Źk%#M❢. 85-s.x̍lvMa'$%/:k!>^$ FOoV],jjvmt^/j6lVtF]:|k%8*ˊ%%Gm;X mXx×(\lL{UЉ!UoE )wwghLl q+dț5ޕ!:vVE(RYBIdonƵAHKFq]no\4ɆT iࠃ9Dɨj{Ѥ1$m;tװRxԬߨ(+C0a&->W!NAڗ] HգC ioa#~P+x bbiYa~v^%&ln]~zHpx~tl5њJ,jZ:-/JW$-s̢*WZJ4f[`Ԟ]+_:,WݲB]RUtMOjί5MW4v2m^ {S{TU?Tev i"1ڧRY~piOiڹ{o:]qC rN>9f(]6D+9%Jr~0zS0jbMCI抝撵_Ǡ)hԽ7ezÝ44N7R*Qg(8FUdܒ3;EHU2d"9n3]}v(͘Z!-곂>nM#[n[YKt;72j]ţnf"^z̛jw=b_J0Ԥ8&/SC+l9Y'Z34Uc_8JcY+t>qƲzY|,5E/g&| 7̯%!Y؜NX@I1%Pj(`Y r~(Ag!n iȸ$uDmTkɷo%mXՎ~V-0+T† K;ldh2(wH]=}:t>U_P5iJ)$%כ,ww)LWEt <&!rr&4`Kvvs "/d,v20gD]v(RE;Sgh-vx㝗[ Eqav%$>ȴp>oz$dVVl+%k)v9sOsifSd318Q  QuDϖւ;#)~ԷFa^ rebEKl4~6 Y5}AnNWByNE4D1ꃊcXEv?ْ6)K2{D4cjLs,r6;X[fLQi3vXHlXHt M_/˲D5˱W]Οk˼Ȫ^U0= tNm qjbz2?ro0݌wI=>,QV-NMC1FA$?uqqCr0BjIa)T]fz h?+ %w^< clsŲebⴻҎJBl#I#ϊ)~#B5Iiz }ۖ7b=C"T4m2l\\3a` x@_~r"!NsAJD(=?o3TSW0s)QXy㊁[ϖ[t790<_"\ endstream endobj 2260 0 obj << /Length1 726 /Length2 7223 /Length3 0 /Length 7821 /Filter /FlateDecode >> stream xmtuTZ=( H -] C;0 0H%] RHw!% {{[~s>Ͼg]F:9{;g$ Ԗ@@'/# uF۽:Åzps6q2H37Ե#lH+fuuuturDsi҆ÁVpQ0PTȫvp$bfU0haav房49q-t#io TKɩ2\` IsrkW@"U?'77s-v8\hga6wqG}@?.66jP[8EڛÑv@mGP[ Eg3,B8!?~[@m7qTLv6{Y ]ٛ#, ".k@пb]) Pg$hkG@#ݽ8x<@n׼@!#Dv,oD['Շ掗P ŗ_X(F,eZh/;yV3g{<:{9ѸUpΑЬUcF P3{^\ oqJŴY*/ v}N&Q앨?`W}%%kjkTaXp ?vY_- {\K^0CDC( LKpALn(_ly?9S"+*y#!($S٫;Ihs8ns9ֆ 8FmDŧoVudtv_dMN9;Do>ZмMʝf0WJQYxՠ}u613sjT} vJ\j"R wTͨq3Q]TM8ܜqgZ:(Fই;x17 9BF~s|tŠ%r/Kt~*P['HنkG,,5q@eEq1͏vY\R ŝ)D/K9>c+Ռ"`E?[BRnj@d i$c#Vp,.ʢAk PhENn$a! Q ,qm vyÊ#>f*!+jSz6 JN nH\a!t Yj>^P&T1&eR9;y=W,cBIikXT+j*'L@C՝t~ƨڽHS1=n_t4W 6/ hhBc X3zOb_j;dHi.Q<{vD& e CŘJ~+{lկ⺪En6jLLBHNa;*b;ـX3ok8<Śa(jʺ:aXˈ1fYJdzL"o"V9>5 5DcӬa۽wE |,a5y|Tɩ׉YnP~F.U)\0HZ/p2#2=&$lV8o2fOgIdG݈3=o;B驛њFw}?v5jSaS|h`;/bg xZ_{8 ~5 G<8rŽo!C3UP{DP^ R<< v]oonD1V׋o;-q9Juz ox#_4(CO}7-6щl,f!)Xه!x}..ǩcA;rvjk{s޶[-OtQ m'atRSN08$;Jz\˥G*R7oI7߫p?mآ=T뗡AJK4:26XLbkS9/w"CraƝM `9T<,O˖k]opKRRQf 4|HA"5N1a Z1Ԋ݆һ~V4\glث&aI&\x]zS jݣ>-ؾ$b1fx'7'6 ()2f،|p\bx2>ix`C63e>wtZ͕{Ÿu; lqe_W~<#[/wZmsඥJz?y$H#ptufBw1-/(+MD jqe?b'Cs1at<˾bhKu'xD*zQ[$m˖I?ѝ=V &yjȽ[;{T#Gל<򍊠>w\~d鋝 zuucq^Ï-*<;m==e6_ |(otP]%q\7^ 'On)#gP8 # sRo4 I#Y" vrDjtobRE݇]XMq ޭu$qL͢* KD:~[y 2>Kktf?oX3ZW.1qO[hdRzJ}Bnj+cWÊǵiI+oPP ;~4^C@S+ ;s?:Csrǜd Au]IE}%W=)wQu&&63oxmmUةi`Σ5⟊b-'`ܜ6ғNM,*v(ߊbv5=Uc1u)ekEb)(ΡOĸ@kEZ1筕OyyɍՕFAbzZ)pʘ֊W*`l/.覔\C2}, t_fPf0='&,5:Zˆ< j P7nvu V:9ۍ.9,m2G*_p#Iu ':NZ^2Cd;qx)/N+gh`1lWͩ. |s|rQ ֱ b'¨+ZCCXI@z.t]۞MG?|4|RxPH(L,cc $kR7U|V XR&], >/I`9!dƭa6#OuY5ռlES1wWKX {aI!gCW=)E%Y ZRʼ!瞦xNCa8+OWR_sG1`/;*KqNmT?^=ʘ^^E~ߚZ } n R}]um+ %:EHR|g1 Ff2GYًM3KhId:<K[a>qU74m:a>lѵ:;VL=\ 4Zj wo67j7.?3,EL!ۚ<{{k11}::&|*,!1!+VxA(;bAOuhQF ʾqvTIe.L8g~ir:{&TN˸3JC%:ou mOXh9H2%$N)^Z=gso)߽0n:%+ n\1CH!~`G+64Vx%ݦ̊t|A/U*UPY3w6}Y˃E< 2\mwncJ=˻)ļW֡L}<",HI0|c΅S#f5`{+~Cg1zzg䔤'T%׵dNjQq{ I٭ A[K*oT=EYrat}rbWx[oK +қd/@de &;[F޽m6Vohz^ڲZlF +aD0d#콋~x1{Vl8(28ԧk?BKұ@ :!!O㦑qsFJ.CMTC*[1ΛŠ#!Kϲiɢtz2_qqTՀ8ǩx.t9sW8+෤e$* t鯕=sUVg(#\ٟ+ Iwa8e#ДMMQQd!ҷa$n$ {p z?{C+\I!ZAUE@J6ŊarxvbwUQgA>aU@j$Ml ~*ap큤^ғS,:<~YԀT/>:o)<2{F^ 5?ۇ;UMķX\+Qhb1<^gJL-?=QWͮnav2|31x%>2PdE?Y}·c~쾴&FJ ,,sXso/>,?^1̓N{:UN+{ɹ5N0-YsJs0d9O K]> k["D>;#/޾ۓ4 W<%v~տbO>r\7Uk~IHNغژ.mᯝL$*N&霉V@vcb\NQpv6vzR*)ͳ濲,JP2C{ Z3: ^?U.߲)ڱ戏gi֍-˩;H?5PҨ\f6]"."$|I"…Oo/iX#ewl2X_PaH@MyDa&ϦBŧQ"> XztPj짳؜'FLUTy}1Wå+>RQ RjGi哽Z Y[J \4f1EUSQfgcgw2q8-uzM9wҏ\5iFTճ•ulR̀ny, s^zXW+ډD)^Ք};Uي.truWnw#3oĖ{gO06 ,$ZIj(܉V|j)p~Mi++899P!.MmOБq@F$byLY/С%ơr^51_eR1<"GAme? endstream endobj 2262 0 obj << /Length1 726 /Length2 30522 /Length3 0 /Length 31026 /Filter /FlateDecode >> stream xlcnͲ-ܶնm۶m6W۶mm۶u߽=~;'1fU樌U5HEDDM"*HHCF&0r5rpjL UL̄@`E<,-\)Mm$T12t"Tw4 usstsvwr%@hfi QPԒ W#l]m,Me-Mv*B3{'B(&vəع\ ޖPNLUH\A^PLAUΔPV\AL\,-J6F+^'H0LL&.sK;&egfO )ᐊ`F@H)bop"78Jl-m<?13n,n0Utp3#]ՑZg?v6w 2RBJ4[vٙ؛ZڙèV4O 23?]҃P_E$b"caf$dbd$bhM\v.fTGw5e{`Ԗr? piC5e&7:ȖW88ypx3|;RF?Dz8$~5[Jo`ض&`7w.kԓ95Ҏ|L :V$(P24H!{k ayAp7daZlTݢ7hǙt6 ~eƛ]q-}TLuW΅M|޻|M|>{ӻ;9^D |6^Odk]ĥOfl\p/7:m JH]j6/s\\a]24 LzބWRfRS.jnoސѮ{hU& RZA)*NrWDM2iR!.:!d^t'e$wo•9 B;9329g-łsHȠ4MM*Twcw/hA]sܝSN#GNDK\THj(,0ݽ>G2լ&EH19uM?I08YGOJ<ޡ=%f8ȧr19: =* f笡3bh]Ŧ 4?0 dvٍETI,"3rvTscړC:Gf$C$a'탺 $j3.?-%e&z4?3|8wSSnϚ8ؒۘ\7$ȖrzT}؟2E*H:J nNg$!e|2'zf}MmYrJ VIX(I@B tip__z%md/)ĔV582%ȁ?aB:i7~@KyP>5JH!_eft]ϫmH^$=<=5xhΥt,Cim6d`G@Yc}թl-a IH!h7!w$~k @[n4(>]@LEͅLd#'d79!,y"Nm[(}Ԛx4u}u5OhΙ= i褣Uߺ7([ˍR|xg'M~n>,|p%|U2)ghdG]ePx?>sS QaeBZ=0543k@E$)i8v8:H:쉋Pm㕍-{.%iWd=/>^Nt[GxGFXG yۻ#6kVHTt>]6#)y ԯň|O삵E-QXjC[͗,҄@_3QK/Kt;4X@e!(@0Y 304}) nPlh֮˲,B_֩w䗛F!՝ji<~&oX|,iG3ոxx6V wYݼ1ڹbaBE2Yg|%Po6Ax])9xLmPE9sޣõu~$O|Q祈pl>> -v~gSg= $)CRE`LI~} yʀȔG辖xCB\s\c`V)a Ku͏ F67iG(,DSWŀץ$u#㞛'Mwx+0 XƏY$zF0'ZX$|Z umd>6:D(gw*ga 1s7"{D(wmP €_4" Y: k0}]!>ge} c gŠ/ya@sME+]<\wYR@R,l BqC?yFTC0Ly7<8g< P\l.m:;l Y?gփSSctޕ0=<-#Gb~(-s@8N׈\G'͠p0.MgUYJgvY[ F;6O(5:1WM%6SNi9֢Ai %TAR?e`ȿ[i  !*uOd/E>>Y`d˙WUJPV׮mDPVC"rҕ?%1q]Ed7ѕ}eɳ2"_ לW4uI):Hj5]=P9y|U+;;}e`i9zV [(C=_0tfgxkԯ^%| O)rE$i8g ?XJvJGa=y?U^ ,<ڼ +B{04%>qЂJ.%(I]48܈|,JuGڷ4G>[Z=c yId]CBP (:0ܼ۠}n塔P,M)%"fIB;I0[/Y f~H3Nhqqmg>;+=E4HB~Y|%R%DdF P"bcN(B>b[*Z%kL/ȕ@tO hZ/Ϳ{C 倥kQ aQ!I&[`W:Ym7)OP~$wZV]$pd7kb9Q(wHY`wv!ؙ3U57dVtz~q^rpD\ɏoa K),sH6%as{Q*ve m8R2L9?qEUj쫵JpȑDhG7bIv5M{Aj&@^q %hn18l>\J{sp#_/KlO(b$άİJsS+ypw(SK9dUa}$*TGQ)<OD( ]/ }B@IQPT}Ϫ!>^/* ]kAr^l|DĮ&ؙ1MXj|ɹ8`Tl3{Y!>ψ#xGoUt3O&Ň#pYPPV6ɵ@!4d;L@G~N珑&ȝIELvǬ(B|,G.f]pHV6&i;;%>4=XPP{E4륨'h;nD[VH %+gJ!s$Fhy!WKpE(OJ/fry,wZR(1cp<֖ۓ@o/[) Y"͂49W6o_ {cM nd>xuT}DyL*SgZuRp;3;tG e| H.>ng lŽ̍fm-Wr5+E9CŹy+v:'`ThY|Whc֨f>(OQ-I׬O]g/;aU;Ce/ e8EdOQ3uv?AxR؉t]! ,0Nqr:ڻ6ԧ]G0b}칢A+,n!=G5n̷gr@j!Zn& Lz!M Nzz2p읛R@mwH莈ai+Il6ӝ q'hϛ!ۇT07te@;ׁe#;)mf#7q{>T?G7Lv?ԝ'G8SQ~\gnfcRv_o}ޔgJ1s+eD5>A5>@Kveu IcTPdb,1B+g' ]޽Ԥ |x,s\,we_L:mAoIKkEVԐ+AHFyϒZ@ޝmx%]A5ޛXvXӊA^u\xFc\5 N@ב+6IK +r u&%Ek*~;UUCαO %iq̲)V#*b*֌keƅѲg(;,Oq("YÈC|CBC5XhlyYi?_E]c4ϓYrSbl.I`.$.:@/'·G7X|>Y4_ᇘR7iȖ 5GNp+.g.2VuO>jԎT}5Π.OV(9"e=[BZo8 'Hy'km>`$&&vl\0mVmL ۗ.gCA3a˰hhqОH:WJ5[zNfx9K/Q6 u, l-ԾmEW&M *l"LT&&Dq %*[ҥY ̌uՁ"; _r ڐoZ.oQ *lA_z2zRG /DOWʷt^u3HXRlK^j(c0ϔ@}M_պ/l8(oWO=ќ&3ItAtR~}3W!)C ,kkuKڙqa0>*"4X2{I1#l<FK`>]`9'zRrBA(f{cFZĕ'J]9p|A^(K~24R"03-az*p}kӕW4t:1BO0 Rh\j)4([pCA۱v~!$..JN;/:Ɖ] 80㙖H=/X<j"W~sK4u g3 > p&sI*2yΨ,]P6 m}!-bLg'R ~2U?9%X쪧B;@~om6[r"-n/uxk*˭it~_iB: f8` (.lOґ䀽{`l AdPlu߶c h "7xh@fS>n!oi(a[ǖNJя9ZZ=QYȗcQ/ՖX ּGSxܥ7BϨkXiҘ }NWd ̫9) m<{fd̍IJ!wψ#[`؊(ue N?˜DT"E=`~}"-mʲpUC}cޜ}{5me*Y֪h0Iyt #v|u3kJ%SezV f#ݣ 0Rb63QǕ:T L;úp"2aOwF0(s.IAʫ^:}WeURєn pm;2+'~M+J到lÜP%񢰇` \P'n]Oh_UXH-x;^}v0]6oc)9k^Fkh8\c/Cqdb<().>+Đv I^;& Mw}gi=/.u2T(Sqlr7 XIϨrF8u[c^M CK x  !Zɀ dy_UPЈ.T ux.lZ5(_NP+ DSύϮ:qŹ:[CZYp.TML6C7ncdsy1ݔ=݆9M-룛ԅ|NwrviHUa&/bۿRs>l/bMډFx?!"M\!${91 ,Z8}J $v%LݰqTOҫJׅo\4oA1}1amaSi,dЗXӬ҂l2P |O@轋!Dedd?+I"a#`B1*4ߋ[3a HJ/]!KԞwNPǙ!.Dx" V#CK8|!x%.:GtWcK"N#$[xq&Svg|bm2q3G% P8ΞN~ 8/Hr^\\%YQ_ #8Xs`YupJR_ 5kT">&P̓xbQ&IYrUv_m8YPm"6%~VVKV?f0P99I3v~-eMna_\J6! (0j~~lsUi, `了cpohZ\x$8QgWhw`8c3J%vxtef6d1qu&?IDj2oƥ=y^V&_>?ШXg\m<$a o3~i5dh1w>1gWbP2GaQtu27&Orh<{+WD;S3ȻLܶ YԿx<5 ̙a^ZE ]ЏWA7#`Fh6y/|;:L . 0zsg/ wH$X3{P ?:%Dx6j.tʳ#a[^WWU2;*pOjkϮ,ф\e  |яaFv%{`uw.}X VG@+ֵ,wC3[6ǓiV;Mhև@(uS}v01ٌAfU,&}t۷E;R:>?Wwm?jUEŞȖ<(rsP[O5:(;~[>8UjY(Kj[UZ:4oq9~o'fInw|  fl$þZ9 :ٝՀc+Z3'Z{s{T{$ۍ(/EUфvHmvuj" }ݔbc &٪f>f1-r? *Ќ} $U45yoǑ#C] $8iqRߛ[ Ͷt*RT0=nAJsc {f _W@FgWZGujs[$Nq#6 ӘDo&n/zTkV" hXN|cE/8\qbhǂ{[יYBs_L,K=. Q59(v llJj\8N_k7֔*"X٩c/xl'ؒj8j5tҵmY6񜕾X?&Ҿxר'0TɩlG81wI׀| *teFu^`.F *af4u9rB=* :#a`W7& O˨YMVc@st-rf7OĻgA?-pZhwK{B [s|B%ώ><Ή}ihʦ0*;'\eX2T .g*y^\if͗ > ![$PoP'q9Uezg/ /oPNnB̷ vXi~ag([FB8 @b͈t3ZEŃ4p u"Uj>9*]Yt!-ҥhxTRUr{&\YBY΃-(=GKqE4yuV65k[<ŕ}ej%tƓQ+(:]k' EX=wɛkC- Fn~X-l`#BΉ|(j_3c\rpTlJuUVĩnp{y6LY^P86͌~P:09 +,1XNBHIqXc8Lƛ(4>s*?|7YjorB7m㼎XpW`Tq:@lp.)01Q7?΢y4rjWǒ686)}}{+)&'etHʌBBԡPP*q͍Ff1̵ y]~̯߁A:^>{_A οOqSySwƳ, *ġf!KRoNnBA7.wb1jYyCsVʨR62?[ӛpݖԖCxfu{GCҰfXc¢o9:S!VU\"9^V|.]O^D pǕ.ʰz m<ΠYxv^$ K.Sk8/ Y}!=-LؗnҘّcemrf|>k\WrOFü-|J{:dlMPbШ/d#ODvSvP 3Yۋ8ŃId'bSxC;Ry~p{ЏR l#JBzo>i_ Jâe^ntlC)LFcYdF67':^"v$C # ٞ/j?>6h:(L$8)y~&Yxf7?$09}ڲ k٩KZ;c攁9 Rݾ3jH8:;Ozp\sFp15)Z㗒DuA?@x!TsZ);~WS=׳ݧtآ P i4\YJL&;:r>2 NVFdܓ,'^)3k>clcBrљꏷ9A+Zcő,+8y7VO = %[j{FqLϝ*I&u{#UkVXA'ٲEi eg4Ɔlڴ: 500`g]'v#-_GcBM>`[{KNZacؿJ\"{bTM?Ĥ=Z:C/J}/B rnk}VVe+=wߛ-7ıoz8Ϻц){$J Gpyj/o*%;2J P~m ᤅ1tY$ӔjtV9鄶gpHC仏gݧZg\VT^b!,jHto[`}u"!g'+/Q yw92Ha˗So']ޥ0R>4.IGx$Zz\f:6u/iܽEW52eb$;tR!2oPVki P$k +Ԫ mr)}U0wqX\f .[3bd3hB)q>'Hq  onFŧҨ^ְ$#Xp=|tCʹ^0'|te[)yQ .eEjV|H6%Q?WFeRHi6+ ! M5]6U壱Tj>FνcLP9 ɂLCe ?ݠШQd "Q~#I6xy$K`IOng?g-4gVFzMi)~ RN-5Vj@"ɛY3`PnSvV{EU}4x>t?w}!Iv8fLf8+yOcVCdL"$zHBJq5sItT䪚se=Ǩa_SDAߖʖ2D߄b3Iܚ秾;mua|" \ ™o F&'bVFa6 k8"]e a^fIV{su!;l2!OVz1c8ww5<1տj+ %d:pAo.;D1u),d<*뭀 ɮV׮;G*w6 #~Kbﰼ,6FC"y(6] E\ۘ_⎧3 ):E:]TVD.HlEu'Iҹ s5V!)d<u>x'JJuVvF{iE;hN`kE]ğAqf*'[٭҉x@x~*j8ė\F3vK^{NyGzR- Z c| I#Gb'hSxJ↋H%)ˉg9Ĥ射 ɣ#Ae2N- զZOcNFY9fhK .k}_8Ϝ3*#qi!W;[?7IH‹ I%{Z v6P_2$Q3Rmp[)ɛ,Gujg(۫V7/aWaG F&{ =u(yx\|pnnҐZ3{'wSAbrnK.ћ֯PӃ!N]K\+Vw;`uyeȕ a4m8q`=.rJTWn52o^Ůa!^䤇$4qy7{GO:!Ń čw!t`?qQ{@óQak2÷.O)5/= Dԑ;G o^09|,2lN_<0/vca>jٟ2Z\&u+(I5!."&Nǟ)6z8>,TCzn^Xt=A&ŧ0B"^p?f:8,^E"]zrI>1MȝV}604a|5T\}`Az?6?pM-k[vjQLRsštK%?דM~U{vbT 4HI:ҺF k5XP:ɲ3xQfBBzŚLYG–ECmvpv R ?w(Y^Z0pUQ'ՎC5.r c"+uA(Ō_2l/! ,K>[#{#T)e.5Hnw$Zh'X;dTT "0} QeTl}I` \A/X=-|UgB8Xv,'$?;ǘ:z!WO^FmL]o r"O񷒬mݪ D@3{ahj\N]2!t{{4aw]g;~!F3%MJE3u OfV7alo.OEwV/~VyfP<|wP*ij!^ lcRy48?)RC`Z.%#Vg'A+J@NμWjfSK!F2޾+qEiN8'l&%\sactאضe8j{~iiho>hqrU-ٯ@{uʷW+850XN,a d?!U^Z HkHC2SSXY)̟~ _ސj_&2A*G7ׅ`%ok!s4{ k0:CJ R&݋YK]R:}f$#PnP6䖰xgLPOyac3!.‡c &9t@;lS& d\~K>%?3zRkLT/{ YBTgE'z;^TJαG" QRdI7. |sgi1ԟ3 zqOcOOsAsOL)XFGNF׾ȟXkK?/VDLxډ,MeZF[TȲ.fNu0Pxgm6Mq$HO"5yߌ&GqO(JJg_i g fyY@&D$8%u7p# {-q0XWlVfe费ZD``a ƍKQyU2" q;L,3 A#`Iw(뫲 @- l.=9WSO@IRN[Eݓ`CZIM'=PpDZh~_NJb5xwbH@"/ksnһ;?;+Mnh9~\EP Dnrw:&%wgnitЙRZQ6JSRh(z.CXӵG3@ 4vW2JGlwW6rI7z яކήے'<,`} 䆕S-BLbMv*rUDHw!qZ~S]Bx&^ XfG$ j  ,à 6/0PwZr=FNbhAwJȓEzuHǃ-ĩsdsT%U2`~ff(t'ۧ*i:s_:Us@P[sy5j9::2DW:Ǩmlj&ƚ_ۛ0 Xbk^Y(0G^</.k?s$JWw{A_`a7` U:Nߤ Ͷ,*$׺ dԳBG9tgA;2^d7lL|ö-rR iE w>jQ yg"6ۯ0gKSL3{> lc ,l>XdNLdi҄Ű^sP)DZ@q[S]苘(:MHTAowvԓ CZ֞rT:g3ɳ?IhaDž Пhcf& K](G%C=Il'j] N?uzRMi2)I*C`aҀ2{@+S|տ/ ]~z2+x砶u! /YЊRX'WЋB00Mmi%\(˄&5&j*3K; |̶ {3ׁR{faJ๩O](ضm۶mm۶m۶m5onv7myDu S~Қ>݈X!O!I <ؠO>m$S8"1ÆyMpU{6Ձ&3;crk* .]( :QFmQ1tnQ'R@4mRxPq,\Y6AB?Q4v{ %\Hﭫ,bH׹JP=5FEgmXHM s*?LwJeoT0*ϣ`f[>;;0:Zw16RW1Bq1]%.6jpW'闊Dw5Xs1ģn(4m/f25{rL)Ϡ m/O36YQ;u7tF&߫oPh.$D_R'etYO53Y,A,mZ-UӺt-g)HO;)gr5#cAm%A,R`(Cx Sl78+DӅ%札<E?2j GkhQbvM$'-O~/p >JTh+lҕ*ٶ[G%=0%Xf؀ųf"5VM8'# 3/ķBT\S[F0`fpʿ1“v AKc 9#c Ig@N/7H75M4Ϗ?&A)/S S:6gAY}oY E˞]ht6H쑍R퐌{pWMb򙢩'@u?`՟LJiz y f/Ui~PF6+H&ΥN{ 9"닰?Ѐm۬Y8_ۮJ@6u VlA#0*<_'\pUHaA[^S ni]TVDQ2T漽 _i$Qyѿ,QI^` ը!)w#ø!)چuXW8Ub*7f!>7=k-G5 )>o5{>@ K\c64(ADGܺ^r&Oe@a2 PN|K. zUSz+ j:+dP%9t;I*(5Aݜ:e? b5UQ"Aꭅ ^H:#X5Z~"P ָ9C÷:Qxs:/YWO]%8d,BvR<]op<&cӲgO3uzF`\X>,3r3.l$4VDz~]EH;IZ7$<"Rn-6 >ZB[ޣBʢ7XX*@+IzHA]YsIadtE@^0&Izޢ vYf1/;#?!:_իXhz`)Ot)GvHgu`ۆys>HZ׋|SE(S6,Hjtmr݌@J]x֕Ŀ:#'t*^(1&cQ VՐj4hG:0s\^uU/QS^j2>n)N69cm2kfR  vEAa> DQ%}oJSn{sK-KaJD"~tYyOLsԺjjvdc}2y Q&`Çw;(%0cNP&WuUacr" gڞL3Mix,EYpJZJ/5Vo/?YL(rgxF _YA(GeEVnjlKU jpИ!'t>P)`]s;+vT8ciN5)^~hl1b&Q v?Cܝ8HKw~~?eW~>fԻ1ph=7+NFױN[e3N,2k }`:Va$)DtXШ>[FzG5-Ȫudz㮠`GI1n6v]U7SHT|0v;%G`ZGSDT6ь֧@"f䉦K|YctըELbF9ɮtRRTҜY{ hHrYbl#6{0p fl~xPp"DI7Cnsc4 |"O)~tc7&1CIIep>@43ycqA1E03Ja+2ͳ +V89/A@2DC(<<'W+ CjO@[~tQ 8AHDJ<S(jk! +O}Ӏ "n*<ٖ86h^,uC _P_E~]XQ㿜}q 4 {JUά1=~mW4gH{N(^`{qKuQ* :_}pAGwVyN8VqZޫ˥`IYR];ԠG ks+&.Bw%?BLCiQ d=tx8c,x Lȵ) Njm e@L%+ xXyc|rKEaCd XfD,BոoԠ\kVLӄ͵e!Cl^K7ܭJ𱠐5̾1|cl&0 _ܙi>i)öˌ!OeyN%d+y xMSv':HyЅ_n>G\Q#АbEH{k!֒5Q}DWᜆKKHy~" ܠ_tQ72Ak~qY*ZbykW &xt?6='mn7<]~ (ՌKbd!1:(,1!!mҊ A6x~At%Zu@{ƺx- ڏ?:Xe]u.4\vK%>AZeq n31s7yKiM5Iudk2rMʹ/ДIyNuʇ2dW HeŢZ{pE8o:uZbR𒄕s6T[34 @;[H쯱I eI{&5݅z>Rح6$]"|УJ W!'&|Ŏ| ? DS#Bbc:7{ވD8USo^H&g5IK&Whci>_jWpmX{~otն1e 5M\Fd'dxpS mqc0>(yѺ5%9QlO&U-v4r#×*kqq+{^~VyX sv#r!AaZ.>H>8VB5-}tf Euy5xX sR&^u(o^"r%3omP>_ ɣbܫ+VNv@Vɜ{>:xJ}֦*6+kit K8y*cyYk ode\ -bwǹZx=CdQJ<5x^dIhYtCjz NK/ 5eA0Rc̆:l;+ɎOŔ,`6==VҾ^@͑Dp,\B?|wltvts$pp(dTK7+Isj7NQf!03p]6KyrWije\7&1& twSYT~}T-=4flM6K1*]"0cPGRP5?C67@R掤zlR{ćGL' 7AcT*h)JOA<^O}"sZ52›Ph\䗘ء/&^%y;ǡtbkW:c" {NS6҅ JU=1%j3qBZ+fϠ\b\<3ѥ1 $Mo/X d(f[=!T+C{Z຾VqSrn"<=qI\utXjt_/ %L-] DήU'D~J~lseYw5g諨>nXtj(2i#Mk.覤j9d`c{ 4ܺ`hVwjBĔ!N, VCc+ML$% LO#V:=Ή¶=D3KMn}iB>G}]B(z&:l&/cAOx:2M! >oF/SCe> ]uf+PY I"_x96\pkSk|e#EIvNu"Xw()P 0Ť2?_bMC"G'EJ`mqF`|e7KZh3ڲtE,bJ29QVuIIήF߾h)tKhsCaTT6.?(T?eJ8lw4]QKYO?wDAd 71Zܕ[MfJכn/LiBk6>U6)%K6|e{ҩk? JO"} K9y]l@d349 *-bil Gw0w3i,Y-⦹yS`JLW?qZ8 74 6SFm2<~}Ў"3{q:\\zD٪BehʪX?͎ZX5V }gog37t#^De/ 1&V3fJROR|M\e$֏bSsZrY{}vx&{ ;YbBM8F.s:ڢM =M ΰ;,/.j]pOa# G My\q0j3RRĢX3,_mڣ{ʨeKmN\6BF?"^6Ҽ&̓in+hC˓9{ab;OOF¢ 9#9ށʪ1BٯD+h[1C%s܆~Ze>k@a WB,~ ݢ vZӒQ][|G )҅Y  Oq:rGے}Y?92z XܔkYH%dx!~CPV*Z駻EhzOBJUBT4UE{$k*laV dX*ًm`[IS_9olpԑH,+S3M=֭IQ7qMԲ鹯Hц>55aSu|OO"N<&brh_ UCxNRu/-0<(^RRon7Q/nY(yC3ijv)RIU,l,WYJ񂉍l ZXuWKVcWĩe;*B [[U;__/a؛rE%8!# VCjytZXw~ "z*phc9AJituϴ뼌Eg1Փ90pޥ.;A)$?o0Qb3(*~>U*r cERA5 ۰'79dB:I#-35s ~_jƑx(uï#/A8͒Tb&ãHi5r%LJusڱGdLk_lCg ?迂u.5 \LAjv Nэλl /̟<%f! ճ #jVHj]G˛ҷC$~f)Zyw##4/ۖI Ϫ҈o]K62rZt!c+q5VRTYYST́F9di<.w;͞9r AyFfV/?i(T?k\#7HΪ @ox>3a-g d&㰦D &YxI+6&|Fr$4;T0 `Ӭ \<4OfS4n5pT[XY]'"Un}.5Mi$_)`s}Y4(>K܍Gp@F/1Q$p6B[$B&#ԯTbgߵB-~Kivu5 YFsu 0KՎdkj)}.*|ګ$Dl-iJ:f<B^/BF7Z@(*M>V3}ӫB!+wsz5\ za%e fAȋ7o&Tx|<HK*}y?jYbO`ꯐ(Sdn u &wK^ B ZQjj/MdOȕa<I;T *d=& ŻNAns+lo2qn %ʯ祖$?^>[n UY/K* -ϟ]$$C(-\fq(fpggR`|%]yb?;{^ʠvC;3fp2=Z8Yu^"r"BW:mJsq G`QZX9AcaF_#q剓xkh,O5=#!0l> +'1wQa)"$.}YrWZ3? urGo~yCaT0shzJjmvwWZ{~Z)<5?Hji=YX-[Wņ}Cx*׻iƉ;^Y +߇:nzql O>\ !^ cC-Iǒ}D n ?1i\Hkϡ=68S,8EK/BЩu3jk{R,)Sz3rK<]#hbдU'#/AyIYb Ei^dL~]s캡l~ۍWhF EJ)GKrz$䃈ܬA#c-a}}9(ZūJ9hE}˅ƞ1(beG jSYuO#p3E|յ9Վ,muٗp e0 ?KҹyԬ*MڰC:_şqpv՞ه^S7J->)MpmK \!u^ ؎k? gI+tRԵ- :L1J  C6[ЬX}Rcxx[p.+ aEdm$o3`'mgICQM@U)ke4:5'-6UvaNL!*hGǮ7=Xʗl'Yi >-Y&"8w9qh1"mBo 2rY`CJ9RО7r5-Âpi]'"|y8rmڬZGQÂlR`.Ω0͘pЍp*~:UEҹ /- 72/QH]|VK79D.C{( Z9Ip3 3y0@>F_RVEC)0vS Gdc1ܠ\~Gt\2`7)=5Ғ!LV0u4㇃Ue(@{rC6F{thp&%={@aaNo>zC7tfzZ_iC+$jMjjIhe/\(S"t9:-E| @:t?nH/ѤŢE_!Zٲ+ca;4pEu| e( [f(&HsXZMzg}R?B|{(C9JM<%K\4"oeWvK)KqD6mgP(bIn\o|m,[0ÁuøkJErf68,DЋ _|!6Uo"csɱTuLOS&I5K0:[W*w|o d*+\zx<< Jr'Ai倍dl>,J"SM|Q.u]-X!#\-i].{LC%6FHvWH[,w䰧2Z2kpnsccKHKpjN*_+#͙s+UbO< Buv+җ|)@:jOfT! @ϩ*_h!X."ʊ]ŽJlGzU塒0Reut'勦i:VوSg3P#F $lB >ƪ}:bgun"5&x[!x T~jf ѯ#Xֶl,8tW9(anPCJFP<] '3xiH^}"c./qCȞMkz7F0f%dq2Ab$HifNN r[#O_pͷccŤ\p=7?jԷOَ*/ɢDh : :ZcfYwu!}Hsn# |pn2E` mb ב^ì` +"*kLWojf wax7^XBPr-~9U7CC6ly}̇gAٺr- &^US[7-f@.$1VL k}_A[aVuIXzmT{oC{n!Rcعyhؐ8S7RӠV> y C M3etT{0bgb*ON KGHF̉g1ʗ-S⠉Ԫ(xL9eLWYb!ȸhJ5)z5wcY S@Xšm8Zękc^{j2N|&9r9+s:. mgy,vH6/d?A]wHmZIpC#M`ӂ kVfو*~7WN|op怤%i$e0r)/ܜ+*3ʈ4˒,d4KӎV4*sZ\j3g8}|f&O6>nB]a0"çɏ-w! #*%՝c]X)-jVϓO].ݶk#.1Bp'/%2>Ge)UKN A6)% 5/]J 34xmoht_45%" E҇gm۲ ye.Ӣ7kßk I~.mgm %P- >yLC]>.lWV5[Ei(rls J>9D]`6<'b,\๣vS9 [Vڛs w ) 1s3F<$piyd=5G^B)zT=CO?l-gshp˙FIW pV4(0( pF endstream endobj 2264 0 obj << /Length1 1606 /Length2 5642 /Length3 0 /Length 6444 /Filter /FlateDecode >> stream xڭTeX nAFKFqnFidHADPݴ "tkΏgŽ< MG:! "(,03@x@A7(c'TAAP\X@U * & ({>__!Gz0Pg8 !n?N4@.Zikx48 =aP@ !' !`1XJ  A1i@BPnPww?pFx P8 EcwB&D!0nBALUCU?yz=~vb&yjzpwW-G uG€0$ ;~ Daww t"0وQpDD15AP8ЯEт;!" 3@0!NDBLIO+Fߡ=a0}w Pg߿bw!,(  o ApFCH?CkAh󛵐? 1{"1ц/ ee_@DT *.\7aS7_g= 4-,|!c__n' ]@| H6qVsUd[⢧ՈG#d}W|t0 ȏB@v"O\͒7CKIߝ]Ƶ6\12/gk~"=}UIʬMmây+u䘻g}s$BNY }P4G÷ks/ -MmL*FrlWeMBqV.<'\;MvNRԩۉMnHNufvIIEW(BȘ@ľ٬_ٗ[d Df@ u4aJ=><Лz.k}/fHN w-c5ϧd]zTlË|l.\C,% ! T#4 KdD5jg5fT qҦ,(#5DnxaD,jTd4Ϛ3_~pODcZ2*VF5srwKQ9G[1JG%s Jg7HQBEo]RgC?ٳu 3v3&wgx1yNBVE~OtV=(7wF?^b z`I^:kHLr7NG/]Lp92,=".MV[-Yl&_&"9V~}IٛI,P`j*1}1ZStө@ЗXcGz3W ѹ) ᘋ-ڍAq!mnxY\ \2E0msm0+>FO|J碫{bv}U[(cȀ^(IKlY4vkP卦T(x( /*$-yY*AlM ژnШfvgK3jc0#/=y{rĹE>(]\wcg?BuVU2H 8Rܦ2]Q,Iw'\HV_F[#*3\UD;LNCjTDpK^elz(N5$5*x&~muwŶKE4tB1-مQ+'/rIeX24rxSfA~cos&tD}Х"XmP0AZ +HqV^pjBBj$G=T-$@ @pMpmJ>՞+f|ow%-ST;qdMWy/E#/c8!UHת}_>߅P00ml3$Kb̞´V\.kzO2ũ« ˻=jg 8ɖ&yU^ApD-%Y+m RI*H)Aϗê}>] 6y4)Ѭr[V`xCi} `QC-0a9&:bnḳrUdG3n3Z` Xh(go[>}UmkΝ?Wm*5 {ÆY?zSTʨZxYx&CV2'I aүj u0y-{ņ)a-<|} wi]27M1(cDp6a0 %\C;M_˄ 3֟roRi -mԭڶ>W) ^`.fF5$b 7MoO|5mqy;v6-=9y-kvKcT/o#}f{ĀARa1%B^mu^Yb`J'D;-JDIʈ)L Hvԏewog[%ؖ:Rv\rm\-Z5)Gm1G?).tTdMN)7M>HTҬΘ_ZGT*2(m[鉓91؝7tQ¯sڒ9VKF6EXC6ajVmEÑ]dHt-%:&DV괯~plwgDV|/.n]v՚S1a*`ܡeҥB΢N}K tυֳ?Ut-"*"rnIbY4<~?Bs_b_r|\h{EυL4qI@d.#8[捪e\i^ N(Hi2X@s#m$Y猘hmF܆2`<1CHYG@WSڀ:bϚqMvN- y裾O.؃4]uuARڤh~vh e$ʭyϨHb;8+⣽2{=rc99'*1׉|NBT^}@K)H+Lz“J :ah;5)-$}Dr}HY̓u]|!V0q>JZCeg)GF3TċJ١h 3KRw!/$ˮ|S4՜h'hfo]>|8>F) 8k_$(5fُ}X<ܼF#d_j8~<4m ~ZTvsv>Btcve'l7ańBv%/|FFo-&d//+=it\a_M|IԸΔ]8r`C1$\;m]+p`A[ &Xx_{U i͆ ;gmtR|2W8{&0zca²ׁF\^L+u\#c 'pѱU}WP*Tf,T%镱v-4 BFUA~%#RlN%vᚱ(ORv vOd[(ԅojοJYu;tqx{s? aCb[x/#%f7MVP)κ)*M1o ty'{ /-?sOFrΟà4x`Mo2 64qpTQ5J=I'ɖӥe^2k #Uӧ7h?w3W)$)@0HʛΘu/6=+th,lNf8 QͶ*8#} #`XSSȪCin5™#yq:^ʾdxF;zK{;L!v=>H?Ru4m3e0bEiWm^u'iuܒ |P endstream endobj 2266 0 obj << /Length1 1567 /Length2 1232 /Length3 0 /Length 2019 /Filter /FlateDecode >> stream xڭTkThCT,I!`Qd03Lh"@PDE%vYAzE,^DJ(Qbz'j˽?zudopJ< D*!pS OLlpb   T(X3@~9\ &H %&1 :2Dr3B=g @ƀ* E9DxtIH|:?<Gq@JPb0`Q7 '(| \shDa=a4@DA" +UAaIH`+RX%4CF2* $A70 l%BgKâ 4`P5c蕀I%a{d$eh֊ <&BDia y;'I*5ӄQٞ h"s rKE)\__7VRT '+pޝwb;3s!oW?<R־O(SjZ4&}%MT)!j8@sDv|U%E'9d`GJ)1e2. x A087luBqdlvF^s"%o4ROfd!@sj)kK#m12vR8h0y8L >(H᳔B&`. ? xpaRh cxl$nHrB (EήxQTœfe*v3&6ɪjȒЕW??Xūh f9Թ`ZW]|Wurps{Z{c7=nԗu!"2Рn::ȱ-|P1b^\T[sمA2r{`4 Sf,ϺnVs(.#vIUoK͞uzԎ[,Jlkr r\]Rq~f_9:+--pܬVG/ׇf}+Ťum:巑u7~$v≖m7jGY\S=g"g]u@O qZH^88rP93~v!s*Qdu-KuXƮמ.r[yM|1t2]sŕ^j;Np}Lni^pΝT#f]G^mʌ^=} 2J/Zߟ],o^{ u(0@=,q ~`u>d1K$5NUZS`k5O[tCv2焇V(7ƬHL7F^'B+y3nf3 >}\9si;qoN{=O3K^<᭏nҭ+FihԢW*rZڮfgQXeeV#Rcߑ{ӣnS`#QzdCԚm-nU޷lmK,Jr|~U☓+r"$;cpgsV[μ;6]1܂].GA㕈i,,uvNꁦMgm5F3)*k5?V8qU|Jm'ٟ6_9UsS6@'ɨb;+[fܤ@Z@lY5IC]684@lji| 36 ‘Gn=UA]QyF6iwG)ɫ'DڤU/@WWj2CdjYjE1uVM~/d%!vkz endstream endobj 2214 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 5122 /Filter /FlateDecode >> stream x\Ys~ׯsebߪRʒ(^b[-dPLR9v~pHJ}H%h-]%+1HJ{DL H2 YxhUS{U1`_ń| TT)Pr jQ@@m+s^!* UEYY-R 8VDVZ\qOf*(Lka=ޢ4$ .^&Q+ghm%Q# ֮(e94+4P!; 52J% uzPUl\&̱P쐯 /D/Zgec_>6P`\eO%s#"0` lkF\E>bd$cD&cXR? > 8JXp9MpKZ"n2p 3xAsXKHF#~D(P#j8PFhL G+%N=qG AT )%K8#EJ f! ` 4p @F\a履񏋺&bO]~^g{b:R>JY^ɢhL$Zt{D BH0AO8ē] =~@~&Ɂ% I' Z9 2M7T-:; s1[3ķYLK$t嫔0Ta2~]w?@-!\ǟJL𤆍.l|}h1\i { 0H/gӓ >q}Qe%ڦsqxX1:_?>>} ! 0na\* #]5R^ڡ5 _ `n:;SC:?c[+L ' O!SH.<=H /!ps6,9C¬{:FhSLc/-S8ZҥtH|ha.R1ϭAAVC8fP?)AVzEe늖BHHfj8*3DAgFĩ6,<|jWݦERʶ4l#iD`M$0c?8DNĝ%:/a!KQh3F2KԦr.-Ӯ[^-ڢG<ƶ*YiyS38 xRGn p40DtE+8/@_,v9pƅAWb)zMURI! c* & L(WE) ޒXL/T80%bHV*oH,2GfЌH~n!5;gBGd,J5*[Uns ̧bN[9dh4e?Ӹ]1m;:ära!hztu܎{%{uư>^өҹ!P2MChƭo0Dzj Q6bh:X0w)blCAGV1<+'iL9Ǡ0;ATZ}ʨ1M-;tD򨛷̇*[](FP LCFbAxDtFLڴ܈3sR7Iv嵦9:zG_!lt͑sxoƽ˓pK<@<cލz&WRő87x'ދ,>φ'׋q}hr'⋨Er8L|_\|'b$+~cq.&b*.pVOh>Q<_LB\?wCoV5Tz}m3O=z~x8[D!+wNC _ӭ|8"d4;<zl2_ꥱj{ .N!t i$۹~2OGtz9ß!(wq=LFZL.?bFgSs!˹&]v9]_>o^0 z$:ؼ>|]0b :kr<şlq|roY&1z;\er.#j[-:^o&UlwJop 67 ߷X`T-ٝ6oo <##f/о) n6zEMJAu+A}>| p2m￀el `$>ڮaUQ]%th:Eb341oTnqxxVBE4*~xBYߖ^oTi.3Pa-VWWx5n4P(ު@lR9欀dNJY!v#&ݳB׏ƆIru;X^?.F0 !}dz[nۋn}= < gw;GtcҝG8: *Cj -0=_0uk߻V;b/>xt|9'Ӻ?,rӨ,p[18(W]Gk2zįi}w˷~{tutCʛΰ~/R`ƟmϾ^Mgƶ;JWKJlWde>[nWG??p49<\7UU*/;7X򪂢7=Qk5dA뤞Wm$$&"Hb >F1t-oJ*>FTs*cdEJĢ*|}m,+%*A8sa勦HU7(yeWEݯh(뗶jiދ׵wX&^`z/K*zuqYYmulhhp:R^]fFɝKθ./[RkW:kcV)5pkI/+lUAf6̴뜿P6n߿)z Bآ t8+qgWc=ZB+#D]QOu2N_jz.B VZiezXَV܉V;V=oG= R+u'Z=v1hD9UVwdQmU+v6fDR+}7jͻVSEK:=xzagKE\t?oju?zJΕ/Ztl$Ū2f }nP\i[t w2鄞/k(jKz9MnNyvX3;Rf_8Ͷl^<,4zUHފM#3ueLUnM&Y aP:$j$c$5rg:$Jm\T@zTk 5RH(,[Y?UbG.)_.VJ^LhSl;^,'@*Ӷ2Wa6nWDuju\:*K2 endstream endobj 2273 0 obj << /Type /ObjStm /N 100 /First 880 /Length 1852 /Filter /FlateDecode >> stream x}Y˪Fܟ0]0 0Ɵ?#RY#UfFFd)ttvJH:>%1i:\%I륥B;y WJ{ii$ʂ o};￯O?P<<~E77}\eK\s.W\%WsնU\. rUc~}Z].do_|5??-F|_5U֚&PYE$GK$*~M4嵦I't &ׄ'F5DM8RALn{n((Ȧ/4v`d?-F2h$ShMBnsrqѬd2d $jrfE4.rAC!xRdBQ{Gɮ^,O z늎4c-O.z&7=ʤGִ&IJr<=0_=%+$$ORkDD5I*oIRMw(UL\rE*%riP\jll_E|o߾a?Ɏ׬L7 endstream endobj 2274 0 obj << /Type /ObjStm /N 100 /First 984 /Length 3976 /Filter /FlateDecode >> stream xڅ\ˮ$9nWr@׈ԋ621`cT1#nVIŦ:n8EI-(C1AzyTcԣhZ{dL{k~jr~=V:T ">L1],_:Z9r8h𔃋eOj4O&ӟ@~r1vVtH?HqTqhT\juf_mtR}<壻iT-04}i:"ע0ū^cku cA3`v3Þ,BCJ2Ei2k'gOF/ 6Zu XQqNB=aT|()Bn'TZ+pfYrIk<%x״񨮍#1fF:3ǣiS|\K<\273W5g 6#մ5ȶFV֫zԫi#L7 ǧmX8fF| b4ƻZfڌX Ck<665mRLq-IZldZأieM4mZ?~~zXޗ_?/_ͧv?,bxQ3H> ʻ9?(x3 $mKV(iwɡa椇w!w]J+irC?>?Ya ˕GC#>'uw"G"|PNDGV:`Yi II`@Ǹ}{h€ws"2]wiw"ðʏֹw@Lw|xuϏӁ|)<}h&ۇ9l}ۓ ;fvK[*zg333q~|6ͦ\ ~|&>}v{|s1~۷_3}X0#! obE!AB>;XHmca#@Zͅ|l Tv[n;-c/PBtB%Еc©v>J<7(-i5b:Z6BBHU%q7,"u[ldVP) bti*x#\+ղϴ0́AWgJF|V k{7UCc7>!twQ E +. X| 7 ݌W&d%V+ V3 YjtW+7%uV cY Nf<ٳqiAIB Ĝb`,*X_Uwsxp;+\Vla W`pYQ aecdf*A)spVXJ%l26|؍:00h s5^f/@'`̂`àpf$@] D/1{헁NѬ/@P0! [rכMQ :GB8]G#lu腻5WQcQ`ցp^{GJdu8U` Ka(] eDX&6cs^9)N ;0 f am8CݜtWn:+C6l:+m@W$XpLNV+7 ^) NL V2& NZ VG< "ͽ0rqi @ar503Y.\K^ 14:hc+:+E4 /˷~S :%w+|i5{0/`yzE=ݬ DqÛ;PчӚ"a ӓF.B["k-H=Y~ bёWX4U!t+;Un! q'Vk EFXD`^2cB؎ DJO7'A,ܜ pvxO{7i lXlCB,v!T "xXٜr+II(ČVP/z:8YIW4f4;AqLCmLjM,'>Ŕy6@#d}i*w}}`7#cQq0Rv FΎu6W&wlrapYbKz(߀q3 T(%Z9"SC0:'"6UpgOZBA A0"R!qu/KJ%e hXPh h a0Z]Vh]VRr B͑f4SX1#OA,Di*yh7L1gJJ.B `-ؤܕnƒGrjWR őV2tlP^5ĮMZ9h4ȷ.h3oQl_?t^bȑuB|rn#s(϶ ]9$MHouBZ'$ɯuB]{lz߸ \w*:Iu8<= ].s:$ce/謁{Kg݋\X%kXO8؄Xm{7sW$ #wLsf#p1g3^Hʱ/6`ϯpQgzA,O21fcFNy4 NyWy60q9 "l~R^=E"W3 \&r(hSùgXs':E}/\s 9"b;؉KQ_'h(TG-}} Pоsc't咴%]^s)7!r N+ʝ(j*y) jZv=/smQeR'N\w ]$M瞢+sKQ%(mw:_-g^a`휅s"buЙGd{7vhG4]q ^gW9٦/e4[|W/;3'I'h\I'Mr] f. P"v9Ʈr[%R=(v9h@,~Ab ܅akhir4zG"gPndȥ؅{SSDʈN .hcn=u&[U/@-KF'ݲtPP JlˍmEj[-<#p$h:euwEl^.Z?U*B \HZ'<:K)s?ܫ8TBXD{{yZ ^l.ޱ ܫ8|ў4Ҟ0oVrڻȅ | endstream endobj 2356 0 obj << /Type /ObjStm /N 100 /First 1042 /Length 4016 /Filter /FlateDecode >> stream xڕ\ˎ% W2`%J%*Y$ ; xQ]*tMC-J9DR q7H@BJiR[΅o}G)-%Y-BR[Bjur=\2 &)zi7Tq)o}AA[=DkEJ}ô RsQZQFi!myeVoí-XG[Y{XEtծz[(boB?QA 0gDEQ뢷v6Hڎfʽm A3Ve15RUJuRzIYJep N?pn7ҖD:`L.;Q sH}K'>%Q"A5ԧ"/ XXgJj-k Y, t ˂ "dͲPkYGkY]1ĘlmY[AkڊVׇʬ w5Sfm@eU"k,bbn;@6jڰg!L<b*#EVdamUY[ESjM Ml0V jGemxZ[" EFYڨb-]۲6T>|O>oӏO#sĻ|]D"DUE5(5HUE퇯ۗ|sK&¤QD "@UfQDE?)عߒ H:rTVBYVPeʪڊ!;>I:tʺid6l&C!Pzt!wԻJRs vE;DeͯݖNDN,3PQ-<L]ݏP!59u[Q`~E:,I dͦH(-֩ے^9T`.4޵CH("|KH yi 2vl iv-Af[JmI^H Dͼ K3Alc\c\| mIϜFhܶ1YFA m!bauS(@ YV^`״ѿ)V')^KNai43R$لPE=W w]iXnKzEJp 虻 FtsX6a-Y:A4N!K 45ـlt9*K1S%=rԵR$"A$j* U4~߶u궤w8[JAbeu⻝1WG;:u{BOwM58HkpRKq?PYd*a{-Z1[A[[mdaw ~bvB[?D~çW>{.U߁ZyiMY5=|Nt?zr:catm@RvM‡*˂n✉;{pEe>rTRPP NCY O< *1 D1T<&vjYQhP"vphZu(vz\j+>xglUԇPAVb E3]z/ݏf7?vlU; C4!N͏f18RC3_RC38bC>,v*Z5B*U%Yz1Z"UPIF}pl ິi1G۬o/ QMj&Umo_~A'恇w)ޫ5W!Vk ^m^ӵj <<Zfyse$YM~x=;&9'zĬY_hE O%}ڦj{zJ597_D ]&B%]kSʵu ]^g _7vx] nzZnԧ{ih~_rzݜ7ѤWs'+x͟_s(\Fve 6vݴZ5Ћ[[pFI1eh|-Lɺq{nZhY5bis ku_Rt(_D;rZ;s}A~v],Jertj]5X ><|TޣZeKQZV[3>r_1 ]#N7W3\+{Uԩ[~ \ oqcx-MеV}`Z~xVLYWj/juakKzջoHcXxUk2C3׌UMje^pN$;2f;u8~>,ַ/߾?9#5p %2>KRoN3O}f2&Z-x\XsV *,hq~,@\E{/z<߽ʤd8X^o}Ego%)~f P">6.X`w :i=NwcqXf2{5-g]tAϧDpCFMdP"O>8?OCz :>#O#$1E!fGF9ZC [,Ex)|y~xiMH©_V "%/X~+v0 jxOHbч92dN&ɼ"!,v$HlOL;A<^$5lw8%}^7~9z p ;x1Byy6)//{󗷟`Y+;.?FqxШ~,liH@}`RQgeΪ;;J|6)%yoԃ+Q)d/~y*,N0lJq} X*S u&gUrVGzL\^{YJN*9)pcÂ+^2~UGI)8+pV  R,VvZ٭W^Gi>G]evRIe'aVPΑ┊S*N*K 5:⌊3B74:*\2yUSBN  :||}5*SNxpїLuJ)U709wWuq$gDΈ4RaI(8ث9-idg!׺\`#W h:>y36{ݑ{U:5~$|}hoWTTMP{R#蓣蹦yLUEZhX<wJ &gwP3\\NaNhhpϦsL/?Th%2J& endstream endobj 2464 0 obj << /Producer (pdfTeX-1.40.21) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20200918221740+10'00') /ModDate (D:20200918221740+10'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020) kpathsea version 6.3.2) >> endobj 2457 0 obj << /Type /ObjStm /N 7 /First 61 /Length 338 /Filter /FlateDecode >> stream x}n0 ] /Length 5733 /Filter /FlateDecode >> stream x%g$_~>7z̝swrs'ϝ ZaKr\ϮEӶA~cV0~m,`(V hZ/󜺧ΩZmZ֙ kZ6XFKP-U6`֤-Qm-mr2&"eh.m?mŗ-PҎ+cih8Rc\erZr=eU0FF]M2ڄr-Eĥ h1FDE3m-+r+LnӢv}ZMv`7~{Gp6isi mmU)18NpvJy N ]PHKpL9 Wh/iOWZ66DynV+o->?Rކ;އʻp@yжӢ/?SƁx9v'vvG8C 4q^n)aG->֝CKSn(<ިߚ@$W]]QJqo)䳶 ZReu4\zE^ۛOsS[HJ;{ih{Kiig:{o9-%k=vvZVfhr{>N*u:M{:{o-r\6юB;{ShS}Ӟ+uNZ]Qg*u^r>{i+ッJ0,m2N(-]L[ qxl2 8KI "kەaEZs4I2mJB{M挰^mQJ{o &aһE&^ֻC ?F=wAw>":{o'quJE|t3ZhJ7Ck콗4>V״{KJ{O{Ew٧:_|0e>يYl-K0A;b$d"K_BO[L{<iKh0#pfy<inܝpJy NTݴspwf"s%LG{+4#SUWg( js.M9 w!wT;W#x q8xU\V_4νT{؁؉3F;ԉ덫qG7Fa aRXoR8PNG,>JLBs< `!,% X RV((7;`}pa8'$57E7a-6f zr'v vn ;ݤc\% hp.% pTWtOiѦGvnM܅{pCx!Z7 ^x =D>0Ntѥ\bQ W)\pRR Cٸj?3)#9+_ M^Jy)eRhJ,%RrJ)WjX.9]rt)M%Kv.y9.e/RJ9(R"J+j{q1C],oRTJQ)ERTJQ)㷢RJy䥔:C) 0P C) 0P C) 0P C) 0P CRʣ# DQJD)DQ~zt<7 !'!@<σx_{ R17m|'cXjV|%Ϝ9 rcV< <"Oӻg齩_ϺӇp˘:GYy@>KÉT?]Ϧӗ43L_kpnM܅{.0v E-mh@["E-mhǽN"^R}siWi/I?Qzi!+R|3>X1bD7Z* 1AvLp!n1!9mm&Mrnv8>os6os6ns6Ln3͔6ۣ_ymvCx:3ݿ?cmmֶYfmmֶYfmC??>;dp"s_Oi=C:Ա.u!Cra$%5!kn:ꐡC8d㐍Øb Ý)51b*:0b*&88& c2)fٔ_C^y9P_rkȭ?||bx'c)0~(C92oȼǹ#hݷ)vC^y9M`ec00 ́0Xa?Njc~`#e)]nbЄ֧ty|o-)ϡmz|bF.p8 8p N8 <\p .IU[1r&6L]`mqJ_=s78{1s ;5ok߁a⧵}]vw)T,[O|?XJ?z-4JDw,H'HD)̾Жrtw%'{b]{amJ8;tE+-l ]aJw7ݗ?NTKvE+]@W"tE+]@W"tE+]N~ٕuaN0ҷ#v+]9AWfAAOn7?$+]JD7fp@۾ew7h?:uh@̽?Ƨbu< NdJ[%brtĔ0:eVrjyJBb-ͩm`rj'Yɩ`.rSS*HO/! 8 4p.%095 fb:mA_숭p܆;p}x<'sx/7{1Wc"99sNߜ9s7o܄x4xߜ9scyLoj;ߘ_S Lcz5svٝ;gw9s7K+#L.®> '^pt"}R˸3x3^+x J@0~4;q4y)䥐B^ y)DXk=))R=M!4 X S5 >bVHN!9RQWbSHN!9S)ħ2TP!B i*Br *4Sq<rOT!RH2TP!C 2TP!C 2TO R2 'E, R }T< -Z0`hUmYgKeTlj7"XS_Y̲[Wk6R_f㐥.rT"h\ʚYsL]l Xjk^C0ߏ›T A,Ɗ,[ZKO[Φƙ%[#χ(c5T'RqI9xZBԘOB[h.֒X Ocsej,4Zchʷ֦Xt-N8t-ڛ>ݲt-bh)ө bh-bh+eu-5Y-ںiEk/8ozG v`ݾ[[/|@ 08ݚ[ zKK%#׉\/Kߏ۷gc_uݾ^W,oI?ueh~, Lr |H~ُ%b6caX`?؏_6cX/+}>s>r}9}9`}9`}9`}9`{w]fpeFs\f4eFs\f4eFs\f4eFs\etYEe3 %e3xFo-oNeuq]f\euq]oewY|ceٌ#2cX/3 x5/3ˌSp΀" 2.3 2.3 X˿^3}#,FxƎٌuü0/3fLne[Vfne[VfneP&dxeoٌ7a2c&;RK,2&-w߉~'nCi{"9{0tb,^؈yfj|{qֺ4vSlOc~-67bkcڔ'cks֖4#:o}5ֶ4q_4֎4c3M.wX:V:ߏg4x,ޭuW9pW9ix8:^@`/K@>} iHY 0@;uxX>}oK@>} iH@>xW>} xW>A%Zr9{"s,iH@>} iH@>}ё3Os4A00 `>,X `9 VhZXalMVmvNa}A8cpNI8 sp.EaU܄[p]exp take MSB byte of an expression BINARY 19 * multiplication 19 / division 19 % mod 18 + addition 18 - subtraction 17 >>,<< shift right, shift left 16 >,>= greater, greater equal 16 <,<= smaller, smaller equal 15 == equal to. Try to use this instead of = 15 = exactly the same as == (exists compatibility) 15 != not equal to 14 & logical and 13 ^ logical xor 12 | logical or 11 && left expression is true AND right expression is true 10 || left expression is true OR right expression is true 9 ? if left expression is true, result is right expression, else result is 0. [10 ? 20] returns 20 8 [] group expressions 7 , separate expressions in list (also used in addressing mode resolution, BE CAREFUL! Note: The effect of the C conditional operator a ? b : c can be had with [a ? b - c] + c. Constants: nnn decimal 0nnn octal %nnn binary $nnn hex 'c character "cc.." string (NOT zero terminated if in DC/DS/DV) [exp]d the constant expressions is evaluated and it's decimal result turned into an ascii string. Symbols: ... -holds CHECKSUM so far (of actual-generated stuff) .. -holds evaluated value in DV pseudo op .name -represents a temporary symbol name. Temporary symbols may be reused inside MACROS and between SUBROUTINES, but may not be referenced across macros or across SUBROUTINEs. . -current program counter (as of the beginning of the instruction). name -beginning with an alpha character and containing letters, numbers, or '_'. Represents some global symbol name. * -synonym for ., when not confused as an operator. nnn$ -temporary label, much like .name, except that defining a non-temporary label has the effect that SUBROUTINE has on .name. They are unique within macros, like .name. Note that 0$ and 00$ are distinct, as are 8$ and 010$. (mainly for compatibility with other assemblers.) Dynamic Symbol/Labels When used in a symbol name, the "," operator indicates one or more arguments that follow should be evaluated, and the resulting values should concatenated to the label, to create a "dynamic" symbol name. symbol,ARG1[,ARG2,...] String literals can be specified with quotes around the string text. Expression operators can also be used, but due to label parsing constraints, they should not contain spacing. The concat-eval "," operator also works on the expression side of EQU/SET pseudo-ops, so dynamic labels can be used with opcodes. WHY codes: Each bit in the WHY word (verbose option 1) is a reason (why the assembler needs to do another pass), as follows: bit 0 expression in mnemonic not resolved 1 - 2 expression in a DC not resolved 3 expression in a DV not resolved (probably in DV's EQM symbol) 4 expression in a DV not resolved (could be in DV's EQM symbol) 5 expression in a DS not resolved 6 expression in an ALIGN not resolved 7 ALIGN: Relocatable origin not known (if in RORG at the time) 8 ALIGN: Normal origin not known (if in ORG at the time) 9 EQU: expression not resolved 10 EQU: value mismatch from previous pass (phase error) 11 IF: expression not resolved 12 REPEAT: expression not resolved 13 a program label has been defined after it has been referenced (forward reference) and thus we need another pass 14 a program label's value is different from that of the previous pass (phase error) Certain errors will cause the assembly to abort immediately, others will wait until the current pass is other. The remaining allow another pass to occur in the hopes the error will fix itself. HISTORIC VERSIONS: (pre github) V2.12 -Fixed macro naming bug (macros wouldn't work if the name after the 'mac' was in upper case). V2.11 -Fixed exp bug, exp MSB (it used to be reversed). -Fixed many bugs in macros and other things -Added automatic checksumming ... no more doing checksums manually! -Added several new processors, including 6502. -Source is now 16/32 bit int compatible, and will compile on an IBM-PC (the ultimate portability test) V2.01 -can now have REPEAT/REPEND's within macros -fill field for DS.W is a word (used to be a byte fill) -fill field for DS.L is a long (used to be a byte fill) dasm-2.20.14.1/docs/ftohex.txt000066400000000000000000000010331375233463600157420ustar00rootroot00000000000000 FTOHEX Convert assembly output file to INTEL-HEX format suitable for, say, a GTEK prom programmer. ftohex format infile outfile Example: dasm -f2 example.asm -oexample.out ftohex 2 example.out example.hex This program converts and output file generated by DASM to the Intel hex-ascii format. You must specify the format you used when you assembled the source for FTOHEX to properly read the out file. Generally format 2 is used for assembly (see dasm.txt) as this generates the smallest hex file. dasm-2.20.14.1/docs/sources/000077500000000000000000000000001375233463600153725ustar00rootroot00000000000000dasm-2.20.14.1/docs/sources/6502.tex000066400000000000000000001532051375233463600165160ustar00rootroot00000000000000\label{changelog20200901_nop3} \chapter{6502 Processor} \label{processor:6502} \index{Processor!6502} This chapter describes features of the \mono{6502} processor that may be relevant to the use of \dasm. \section{Endianness} The \mono{6502} is a little-endian machine. Byte ordering in words is low, then high. \label{changelog:20200904illegal} \section{Illegal Opcodes} The effects of the ``unused'' opcodes on the 6502 are by now relatively well documented. These are variously described as illegal, undocumented, invalid, and unspecified. Modern programs use some of these, as they provide additional capabilities (particularly speed improvements) over the use of the standard opcodes. \dasm explicitly supports some of the commonly used `stable' illegal opcodes. \url{http://www.oxyron.de/html/opcodes02.html} was used as a reference for most of the data shown in the following tables. They have been cross-referenced with the \dasm source code to determine what instructions and opcodes are supported. \iffalse \subsection{\texttt{ANC}} \begin{usage} ANC \end{usage} \begin{table}[H] \begin{tabular}{lr} \begin{tabular}{llc} \mono{\$0B}&\texttt{ANC }\emph{\#imm}&\mono{A:=A \& \#\{imm\}}\\ \end{tabular}& \tabcolsep=0.1cm \begin{tabular}{|cccccccc|} \hline \scriptsize\mono{N}& \scriptsize\mono{V}& \scriptsize\mono{B}& \scriptsize\mono{D}& \scriptsize\mono{I}& \scriptsize\mono{Z}& \scriptsize\mono{C}& \scriptsize\mono{?}\\ \hline \mono{1}& \mono{*}& \mono{*}& \mono{*}& \mono{*}& \mono{*}& \mono{*}& \mono{*}\\ \hline \end{tabular} \end{tabular} \end{table} \begin{code} ANC \$0B A:=A\&#\{imm\} * * * ANC \$2B A:=A\&#\{imm\} * * * llegal opcodes: Opcode imp imm zp zpx zpy izx izy abs abx aby ind rel Function N V B D I Z C SLO \$07 \$17 \$03 \$13 \$0F \$1F \$1B \{adr\}:=\{adr\}*2 A:=A or \{adr\} * * * RLA \$27 \$37 \$23 \$33 \$2F \$3F \$3B \{adr\}:=\{adr\}rol A:=A and \{adr\} * * * SRE \$47 \$57 \$43 \$53 \$4F \$5F \$5B \{adr\}:=\{adr\}/2 A:=A exor \{adr\} * * * RRA \$67 \$77 \$63 \$73 \$6F \$7F \$7B \{adr\}:=\{adr\}ror A:=A adc \{adr\} * * * * SAX \$87 \$97 \$83 \$8F \{adr\}:=A\&X LAX \$A7 \$B7 \$A3 \$B3 \$AF \$BF A,X:=\{adr\} * * DCP \$C7 \$D7 \$C3 \$D3 \$CF \$DF \$DB \{adr\}:=\{adr\}-1 A-\{adr\} * * * ISC \$E7 \$F7 \$E3 \$F3 \$EF \$FF \$FB \{adr\}:=\{adr\}+1 A:=A-\{adr\} * * * * ALR \$4B A:=(A\&#\{imm\})/2 * * * ARR \$6B A:=(A\&#\{imm\})/2 * * * * XAA(2) \$8B A:=X\&#\{imm\} * * LAX(2) \$AB A,X:=#\{imm\} * * AXS \$CB X:=A\&X-#\{imm\} * * * SBC \$EB A:=A-\#\{imm\} * * * * AHX(1) \$93 \$9F \{adr\}:=A\&X\&H SHY(1) \$9C \{adr\}:=Y\&H SHX(1) \$9E \{adr\}:=X\&H TAS(1) \$9B S:=A\&X \{adr\}:=S\&H LAS \$BB A,X,S:=\{adr\}\&S * * (1) = unstable in certain matters (2) = highly unstable (results are not predictable on some machines) A = Accumulator X = X-Register Y = Y-Register S = Stack-Pointer P = Status-Register +(S) = Stack-Pointer relative with pre-increment (S)- = Stack-Pointer relative with post-decrement Combinations of two operations with the same addressing mode: SLO {adr} = ASL {adr} + ORA {adr} RLA {adr} = ROL {adr} + AND {adr} SRE {adr} = LSR {adr} + EOR {adr} RRA {adr} = ROR {adr} + ADC {adr} SAX {adr} = store A\&X into {adr} LAX {adr} = LDA {adr} + LDX {adr} DCP {adr} = DEC {adr} + CMP {adr} ISC {adr} = INC {adr} + SBC {adr} note to SAX: the A&X operation is a result of A and X put onto the bus at the same time. Combinations of an immediate and an implied command: ANC \#{imm} = AND \#{imm} + (ASL) ANC \#{imm} = AND \#{imm} + (ROL) ALR \#{imm} = AND \#{imm} + LSR ARR \#{imm} = AND \#{imm} + ROR XAA \#{imm} = TXA + AND \#{imm} LAX \#{imm} = LDA \#{imm} + TAX AXS \#{imm} = A\&X minus #{imm} into X SBC \#{imm} = SBC \#{imm} + NOP note to ANC: this command performs an AND operation only, but bit 7 is put into the carry, as if the ASL/ROL would have been executed. note to ARR: part of this command are some ADC mechanisms. following effects appear after AND but before ROR: the V-Flag is set according to (A and \#{imm})+\#{imm}, bit 0 does NOT go into carry, but bit 7 is exchanged with the carry. note to XAA: DO NOT USE!!! Highly unstable!!! note to LAX: DO NOT USE!!! On my C128, this opcode is stable, but on my C64-II it loses bits so that the operation looks like this: ORA \#? AND \#{imm} TAX. note to AXS: performs CMP and DEX at the same time, so that the MINUS sets the flag like CMP, not SBC. Combinations of STA/STX/STY: AHX {adr} = stores A\&X\&H into {adr} SHX {adr} = stores X\&H into {adr} SHY {adr} = stores Y\&H into {adr} note: sometimes the \&H drops off. Also page boundary crossing will not work as expected (the bank where the value is stored may be equal to the value stored). Combinations of STA/TXS and LDA/TSX: TAS {adr} = stores A\&X into S and A\&X\&H into {adr} LAS {adr} = stores {adr}\&S into A, X and S note to LAS: is called as "propably unreliable" in one source. Bit configuration does not allow any operation on these ones: NOP = has no effects NOP #{imm} = fetches #{imm} but has no effects NOP {adr} = fetches {adr} but has no effects KIL = halts the CPU. the data bus will be set to \#\$FF Aliases used in other illegal opcode sources: SLO = ASO SRE = LSE ISC = ISB ALR = ASR SHX = A11 (A11 was a result of only having tested this one on adress \$1000) SHY = A11 LAS = LAR KIL = JAM, HLT \end{code} \fi \subsection{Abbreviations and Colours used in Tables} \subsubsection{Addressing Modes} \begin{table}[H] \begin{tabularx}{\linewidth}{cll} \toprule Abbreviation&Mode&Example\\ \hline \\ \emph{abs}&Absolute&\mono{LDA \$F000}\\ \emph{abx}&Absolute indexed by X&\mono{LDA \$F000,x}\\ \emph{aby}&Absolute indexed by Y&\mono{LDA \$F000,y}\\ \emph{idx}&Indexed indirect X&\mono{LDA (\$23,x)}\\ \emph{idy}&Indirect Y&\mono{LDA (\$23),y}\\ \emph{imm}&Immediate&\mono{LDA \#1}\\ \emph{imp}&Implied. Operates on register or flag&\mono{LSR}\\ \emph{ind}&Indirect absolute&\mono{JMP (\$F000)}\\ \emph{rel}&Relative to PC&\mono{BCS addr}\\ \emph{zp}&Zero-page&\mono{LDA 1}\\ \emph{zpx}&Zero-page indexed by X&\mono{LDA \$23,x}\\ \emph{zpy}&Zero-page indexed by Y&\mono{LAX 0,y}\\ \\ \bottomrule \end{tabularx} \end{table} \iffalse #define ASTD AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|\ AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY \fi \subsection{Mnemonics, and Opcodes for Addressing Modes} \subsubsection{Opcode Colour Key} \begin{table}[H] \begin{tabular}{ll} \cellcolor{illegal}&Stable. Supported by \dasm.\\ \cellcolor{missing}&Stable. Not supported.\\ \cellcolor{unstablecertain}&Unstable in some situations. Not supported.\\ \cellcolor{unimplemented}&Highly unstable. Not supported.\\ \end{tabular} \end{table} \begin{table}[H] %\def\arraystretch{0.98} \begin{tabularx}{\linewidth}{c|cccccccccccc} %\toprule % \multicolumn{1}{c}{} & \mono{}& \emph{imp}& \emph{imm}& \emph{zp}& \emph{zpx}& \emph{abs}& \emph{abx}& \emph{aby}& \emph{idx}& \emph{idy}& \emph{zpy}& \emph{rel}& \emph{ind}\\ \hline \mono{ADC}& \mono{\color{ghost}\xmark}& % implied \mono{\$69}& \mono{\$65}& \mono{\$75}& \mono{\$6D}& \mono{\$7D}& \mono{\$79}& \mono{\$61}& \mono{\$71}& \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \cellcolor{unstablecertain}\mono{AHX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \cellcolor{unstablecertain}\mono{\$93}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ANC}& \mono{\color{ghost}\xmark}& % implied \cellcolor{illegal}\mono{\$0B}& % immediate \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{}& %ANC#2 \mono{}& % implied \cellcolor{missing}\mono{\$2B}& % immediate \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{} & %rel \mono{} %(abs) \\ \mono{AND}& \mono{\color{ghost}\xmark}& % implied \mono{\$29}& % immediate \mono{\$25}& %zp \mono{\$35}& %zp,x \mono{\$2D}& %abs \mono{\$3D}& %abs,x \mono{\$39}& %abs,y \mono{\$21}& %(zp,x) \mono{\$31}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ANE}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$8B}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ARR}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$6B}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ASL}& \mono{\$0A}& \mono{\color{ghost}\xmark}& % immediate \mono{\$06}& \mono{\$16}& \mono{\$0E}& \mono{\$1E}& \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ASR}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$4B}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \cellcolor{missing}\mono{AXS}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{missing}\mono{\$CB}& %imm \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BCC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$90}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BCS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$B0}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BEQ}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$F0}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BIT}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\$24}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$2C}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BMI}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$30}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BNE}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$D0}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BPL}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$10} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BRK}& \mono{\$00}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BVC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$50} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BVS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$70} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLC}& \mono{\$18}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLD}& \mono{\$D8}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLI}& \mono{\$58}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLV}& \mono{\$B8}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CMP}& \mono{\color{ghost}\xmark}& %iMP \mono{\$C9}& %IMM \mono{\$C5}& %zp \mono{\$D5}& %zp,x \mono{\$CD}& %abs \mono{\$DD}& %abs,x \mono{\$D9}& %abs,y \mono{\$C1}& %(zp,x) \mono{\$D1}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CPX}& \mono{\color{ghost}\xmark}& %iMP \mono{\$E0}& %IMM \mono{\$E4}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$EC}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CPY}& \mono{\color{ghost}\xmark}& %iMP \mono{\$C0}& %IMM \mono{\$C4}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$CC}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DCP}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %IMM \cellcolor{illegal}\mono{\$C7}& %zp \cellcolor{illegal}\mono{\$D7}& %zp,x \cellcolor{illegal}\mono{\$CF}& %abs \cellcolor{illegal}\mono{\$DF}& %abs,x \cellcolor{illegal}\mono{\$DB}& %abs,y \cellcolor{illegal}\mono{\$C3}& %(zp,x) \cellcolor{illegal}\mono{\$D3}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DEC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %IMM \mono{\$C6}& %zp \mono{\$D6}& %zp,x \mono{\$CE}& %abs \mono{\$DE}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DEX}& \mono{\$CA}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DEY}& \mono{\$88}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{EOR}& \mono{\color{ghost}\xmark}& %iMP \mono{\$49}& %# \mono{\$45}& %zp \mono{\$55}& %zp,x \mono{\$4D}& %abs \mono{\$5D}& %abs,x \mono{\$59}& %abs,y \mono{\$41}& %(zp,x) \mono{\$51}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{INC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$E6}& %zp \mono{\$F6}& %zp,x \mono{\$EE}& %abs \mono{\$FE}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{INX}& \mono{\$E8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{INY}& \mono{\$C8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ISB}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$E7}& %zp \cellcolor{illegal}\mono{\$F7}& %zp,x \cellcolor{illegal}\mono{\$EF}& %abs \cellcolor{illegal}\mono{\$FF}& %abs,x \cellcolor{illegal}\mono{\$FB}& %abs,y \cellcolor{illegal}\mono{\$E3}& %(zp,x) \cellcolor{illegal}\mono{\$F3}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \end{tabularx} \end{table} \begin{table}[H] %\def\arraystretch{0.98} \begin{tabularx}{\linewidth}{c|cccccccccccc} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}& \emph{imp}& \emph{imm}& \emph{zp}& \emph{zpx}& \emph{abs}& \emph{abx}& \emph{aby}& \emph{idx}& \emph{idy}& \emph{zpy}& \emph{rel}& \emph{ind}\\ \hline \\ \mono{JMP}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$4C}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\$6C} %(abs) \\ \mono{JSR}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$20}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \cellcolor{missing}\mono{KIL}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LAS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$BB}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LAX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$A7}& %zp \mono{\color{ghost}\xmark}& %zp,x \cellcolor{illegal}\mono{\$AF}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$BF}& %abs,y \cellcolor{illegal}\mono{\$A3}& %(zp,x) \cellcolor{illegal}\mono{\$B3}& %(zp),y \cellcolor{illegal}\mono{\$B7}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LDA}& \mono{\color{ghost}\xmark}& %iMP \mono{\$A9}& %# \mono{\$A5}& %zp \mono{\$B5}& %zp,x \mono{\$AD}& %abs \mono{\$BD}& %abs,x \mono{\$B9}& %abs,y \mono{\$A1}& %(zp,x) \mono{\$B1}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LDX}& \mono{\color{ghost}\xmark}& %iMP \mono{\$A2}& %# \mono{\$A6}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$AE}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\$BE}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\$B6}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LDY}& \mono{\color{ghost}\xmark}& %iMP \mono{\$A0}& %# \mono{\$A4}& %zp \mono{\$B4}& %zp,x \mono{\$AC}& %abs \mono{\$BC}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LSR}& \mono{\$4A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$46}& %zp \mono{\$56}& %zp,x \mono{\$4E}& %abs \mono{\$5E}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LXA}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$AB}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{NOP}& \mono{\$EA}& %iMP \cellcolor{illegal}\mono{\$80}& %# \cellcolor{illegal}\mono{\$04}& %zp \cellcolor{illegal}\mono{\$14}& %zp,x \cellcolor{illegal}\mono{\$0C}& %abs \cellcolor{illegal}\mono{\$1C}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{}& % NOP #2 \mono{\cellcolor{missing}\cellcolor{missing}\$1A}& %iMP \mono{}& %# \mono{\cellcolor{missing}\$44}& %zp \mono{\cellcolor{missing}\$34}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$3C}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #3 \mono{\cellcolor{missing}\$3A}& %iMP \mono{}& %# \mono{\cellcolor{missing}\$64}& %zp \mono{\cellcolor{missing}\$54}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$5C}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #4 \mono{\cellcolor{missing}\$5A}& %iMP \mono{}& %# \mono{}& %zp \mono{\cellcolor{missing}\$74}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$7C}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #5 \mono{\cellcolor{missing}\$7A}& %iMP \mono{}& %# \mono{}& %zp \mono{\cellcolor{missing}\$D4}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$DC}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #6 \mono{\cellcolor{missing}\$82}& %iMP \mono{}& %# \mono{}& %zp \mono{\cellcolor{missing}\$F4}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$FC}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #7 \mono{\cellcolor{missing}\$89}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #8 \mono{\cellcolor{missing}\$C2}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #9 \mono{\cellcolor{missing}\$DA}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #10 \mono{\cellcolor{missing}\$E2}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #11 \mono{\cellcolor{missing}\$FA}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{ORA}& \mono{\color{ghost}\xmark}& %iMP \mono{\$09}& %# \mono{\$05}& %zp \mono{\$15}& %zp,x \mono{\$0D}& %abs \mono{\$1D}& %abs,x \mono{\$19}& %abs,y \mono{\$01}& %(zp,x) \mono{\$11}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PHA}& \mono{\$48}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PHP}& \mono{\$08}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PLA}& \mono{\$68}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PLP}& \mono{\$28}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RLA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$27}& %zp \cellcolor{illegal}\mono{\$37}& %zp,x \cellcolor{illegal}\mono{\$2F}& %abs \cellcolor{illegal}\mono{\$3F}& %abs,x \cellcolor{illegal}\mono{\$3B}& %abs,y \cellcolor{illegal}\mono{\$23}& %(zp,x) \cellcolor{illegal}\mono{\$33}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ROL}& \mono{\$2A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$26}& %zp \mono{\$36}& %zp,x \mono{\$2E}& %abs \mono{\$3E}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ROR}& \mono{\$6A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$66}& %zp \mono{\$76}& %zp,x \mono{\$6E}& %abs \mono{\$7E}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RRA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$67}& %zp \cellcolor{illegal}\mono{\$77}& %zp,x \cellcolor{illegal}\mono{\$6F}& %abs \cellcolor{illegal}\mono{\$7F}& %abs,x \cellcolor{illegal}\mono{\$7B}& %abs,y \cellcolor{illegal}\mono{\$63}& %(zp,x) \cellcolor{illegal}\mono{\$73}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RTI}& \mono{\$40}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RTS}& \mono{\$60}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SAX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$87}& %zp \mono{\color{ghost}\xmark}& %zp,x \cellcolor{illegal}\mono{\$8F}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \cellcolor{illegal}\mono{\$83}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \cellcolor{illegal}\mono{\$97}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SBC}& \mono{\color{ghost}\xmark}& %iMP \mono{\$E9}& %# \mono{\$E5}& %zp \mono{\$F5}& %zp,x \mono{\$ED}& %abs \mono{\$FD}& %abs,x \mono{\$F9}& %abs,y \mono{\$E1}& %(zp,x) \mono{\$F1}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{}& %2 \mono{}& %iMP \mono{\cellcolor{missing}\$EB}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \end{tabularx} \end{table} \begin{table}[H] %\def\arraystretch{0.98} \begin{tabularx}{\linewidth}{c|cccccccccccc} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}& \emph{imp}& \emph{imm}& \emph{zp}& \emph{zpx}& \emph{abs}& \emph{abx}& \emph{aby}& \emph{idx}& \emph{idy}& \emph{zpy}& \emph{rel}& \emph{ind}\\ \hline \\ \mono{SBX}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$CB}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SEC}& \mono{\$38}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SED}& \mono{\$F8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SEI}& \mono{\$78}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$9F}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \cellcolor{illegal}\mono{\$93}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$9B}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$9E}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHY}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \cellcolor{illegal}\mono{\$9C}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SLO}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$07}& %zp \cellcolor{illegal}\mono{\$17}& %zp,x \cellcolor{illegal}\mono{\$0F}& %abs \cellcolor{illegal}\mono{\$1F}& %abs,x \cellcolor{illegal}\mono{\$1B}& %abs,y \cellcolor{illegal}\mono{\$03}& %(zp,x) \cellcolor{illegal}\mono{\$13}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SRE}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$47}& %zp \cellcolor{illegal}\mono{\$57}& %zp,x \cellcolor{illegal}\mono{\$4F}& %abs \cellcolor{illegal}\mono{\$5F}& %abs,x \cellcolor{illegal}\mono{\$5B}& %abs,y \cellcolor{illegal}\mono{\$43}& %(zp,x) \cellcolor{illegal}\mono{\$53}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{STA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$85}& %zp \mono{\$95}& %zp,x \mono{\$8D}& %abs \mono{\$9D}& %abs,x \mono{\$99}& %abs,y \mono{\$81}& %(zp,x) \mono{\$91}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{STX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$86}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$8E}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\$96}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{STY}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$84}& %zp \mono{\$94}& %zp,x \mono{\$8C}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TAX}& \mono{\$AA}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TAY}& \mono{\$A8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TSX}& \mono{\$BA}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TXA}& \mono{\$8A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TXS}& \mono{\$9A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TYA}& \mono{\$98}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \end{tabularx} \end{table} \begin{landscape} \subsection{Opcode Mnemonics} \index{Processor!6502!Opcode Mnemonics} \def\arraystretch{0.95} \begin{table}[H] %\tabcolsep=0.085cm \begin{tabular}{c|ccccccccccccccccc} %ccc!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}&&\mono{\${\color{ghost}x}0}&\mono{\${\color{ghost}x}1}&\mono{\${\color{ghost}x}2}&\mono{\${\color{ghost}x}3}&\mono{\${\color{ghost}x}4}&\mono{\${\color{ghost}x}5}&\mono{\${\color{ghost}x}6}&\mono{\${\color{ghost}x}7}&\mono{\${\color{ghost}x}8}&\mono{\${\color{ghost}x}9}&\mono{\${\color{ghost}x}A}&\mono{\${\color{ghost}x}B}&\mono{\${\color{ghost}x}C}&\mono{\${\color{ghost}x}D}&\mono{\${\color{ghost}x}E}&\mono{\${\color{ghost}x}F}\\ \hline \\ \mono{\$0{\color{ghost}x}}&& \mono{BRK}& \mono{ORA}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SLO}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO}& \mono{PHP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{ANC}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO} \\ %\arrayrulecolor{ghost2}\hline \mono{\$1{\color{ghost}x}}&& \mono{BPL}& \mono{ORA}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SLO}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO}& \mono{CLC}& \mono{ORA}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{SLO}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO} \\ %\hline \mono{\$2{\color{ghost}x}}&& \mono{JSR}& \mono{AND}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RLA}& \mono{BIT}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA}& \mono{PLP}& \mono{AND}& \mono{ROL}& \cellcolor{missing}\mono{ANC}& \mono{BIT}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA} \\ %\hline \mono{\$3{\color{ghost}x}}&& \mono{BMI}& \mono{AND}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RLA}& \cellcolor{missing}\mono{NOP}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA}& \mono{SEC}& \mono{AND}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{RLA}& \cellcolor{missing}\mono{NOP}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA} \\ %\hline \mono{\$4{\color{ghost}x}}&& \mono{RTI}& \mono{EOR}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SRE}& \cellcolor{missing}\mono{NOP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE}& \mono{PHA}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{ALR}& \mono{JMP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE} \\ %\hline \mono{\$5{\color{ghost}x}}&& \mono{BVC}& \mono{EOR}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SRE}& \cellcolor{missing}\mono{NOP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE}& \mono{CLI}& \mono{EOR}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{SRE}& \cellcolor{missing}\mono{NOP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE} \\ %\hline \mono{\$6{\color{ghost}x}}&& \mono{RTS}& \mono{ADC}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RRA}& \cellcolor{missing}\mono{NOP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA}& \mono{PLA}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{ARR}& \mono{JMP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA} \\ %\hline \mono{\$7{\color{ghost}x}}&& \mono{BVS}& \mono{ADC}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RRA}& \cellcolor{missing}\mono{NOP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA}& \mono{SEI}& \mono{ADC}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{RRA}& \cellcolor{missing}\mono{NOP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA} \\ %\hline \mono{\$8{\color{ghost}x}}&& \cellcolor{illegal}\mono{NOP}& \mono{STA}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{SAX}& \mono{STY}& \mono{STA}& \mono{STX}& \cellcolor{illegal}\mono{SAX}& \mono{DEY}& \cellcolor{missing}\mono{NOP}& \mono{TXA}& \cellcolor{unimplemented}\mono{XAA}& \mono{STY}& \mono{STA}& \mono{STX}& \cellcolor{illegal}\mono{SAX} \\ %\hline \mono{\$9{\color{ghost}x}}&& \mono{BCC}& \mono{STA}& \cellcolor{missing}\mono{KIL}& \cellcolor{unstablecertain}\mono{AHX}& \mono{STY}& \mono{STA}& \mono{STX}& \cellcolor{illegal}\mono{SAX}& \mono{TYA}& \mono{STA}& \mono{TXS}& \cellcolor{unstablecertain}\mono{TAS}& \cellcolor{unstablecertain}\mono{SHY}& \mono{STA}& \cellcolor{unstablecertain}\mono{SHX}& \cellcolor{unstablecertain}\mono{AHX} \\ %\hline \mono{\$A{\color{ghost}x}}&& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX}& \mono{TAY}& \mono{LDA}& \mono{TAX}& \cellcolor{unimplemented}\mono{LAX}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX} \\ %\hline \mono{\$B{\color{ghost}x}}&& \mono{BCS}& \mono{LDA}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{LAX}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX}& \mono{CLV}& \mono{LDA}& \mono{TSX}& \cellcolor{illegal}\mono{LAS}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX} \\ %\hline \mono{\$C{\color{ghost}x}}&& \mono{CPY}& \mono{CMP}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{DCP}& \mono{CPY}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP}& \mono{INY}& \mono{CMP}& \mono{DEX}& \cellcolor{missing}\mono{AXS}& \mono{CPY}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP} \\ %\hline \mono{\$D{\color{ghost}x}}&& \mono{BNE}& \mono{CMP}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{DCP}& \cellcolor{missing}\mono{NOP}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP}& \mono{CLD}& \mono{CMP}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{DCP}& \cellcolor{missing}\mono{NOP}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP} \\ %\hline \mono{\$E{\color{ghost}x}}&& \mono{CPX}& \mono{SBC}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{ISC}& \mono{CPX}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC}& \mono{INX}& \mono{SBC}& \mono{NOP}& \cellcolor{missing}\mono{SBC}& \mono{CPX}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC} \\ %\hline% \mono{\$F{\color{ghost}x}}&& \mono{BEQ}& \mono{SBC}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{ISC}& \cellcolor{missing}\mono{NOP}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC}& \mono{SED}& \mono{SBC}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{ISC}& \cellcolor{missing}\mono{NOP}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC} \\ \end{tabular} \end{table} \begin{table}[H] \begin{tabular}{ll} \begin{tabular}{ll} \end{tabular}& \begin{tabular}{ll} \cellcolor{illegal}&Stable. Supported by \dasm.\\ \cellcolor{missing}&Stable. Not supported.\\ \cellcolor{unstablecertain}&Unstable in some situations. Not supported.\\ \cellcolor{unimplemented}&Highly unstable. Not supported.\\ \end{tabular} \end{tabular} \end{table} \end{landscape} \begin{landscape} \subsection{Instruction Cycle Counts} \index{Processor!6502!Instruction Cycle Timing} \def\arraystretch{0.98} \begin{table}[H] %\tabcolsep=0.085cm \begin{tabular}{c|ccccccccccccccccc} %\begin{tabular}{c|c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}&&\mono{\${\color{ghost}x}0}&\mono{\${\color{ghost}x}1}&\mono{\${\color{ghost}x}2}&\mono{\${\color{ghost}x}3}&\mono{\${\color{ghost}x}4}&\mono{\${\color{ghost}x}5}&\mono{\${\color{ghost}x}6}&\mono{\${\color{ghost}x}7}&\mono{\${\color{ghost}x}8}&\mono{\${\color{ghost}x}9}&\mono{\${\color{ghost}x}A}&\mono{\${\color{ghost}x}B}&\mono{\${\color{ghost}x}C}&\mono{\${\color{ghost}x}D}&\mono{\${\color{ghost}x}E}&\mono{\${\color{ghost}x}F}\\ \hline \\ \mono{\$0{\color{ghost}x}}&& \mono{7}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\arrayrulecolor{ghost2}\hline \mono{\$1{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$2{\color{ghost}x}}&& \mono{6}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{4}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$3{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$4{\color{ghost}x}}&& \mono{6}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{3}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$5{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$6{\color{ghost}x}}&& \mono{6}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{4}& \mono{3}& \mono{3}& \mono{3}& \mono{5}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$7{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$8{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{6}& \mono{3}& \mono{3}& \mono{3}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{4}& \mono{4} \\ %\hline \mono{\$9{\color{ghost}x}}&& \mono{ 2+}& \mono6{}& $\infty$& \mono{6}& \mono{4}& \mono{4}& \mono{4}& \mono{4}& \mono{2}& \mono{5}& \mono{2}& \mono{5}& \mono{5}& \mono{5}& \mono{5}& \mono{5} \\ %\hline \mono{\$A{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{6}& \mono{3}& \mono{3}& \mono{3}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{4}& \mono{4} \\ %\hline \mono{\$B{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{ 5+}& \mono{4}& \mono{4}& \mono{4}& \mono{4}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{ 4+}& \mono{ 4+}& \mono{ 4+}& \mono{ 4+}& \mono{ 4+} \\ %\hline \mono{\$C{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$D{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$E{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$F{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ \end{tabular} \end{table} \begin{table}[H] \begin{tabular}{ll} \begin{tabular}{ll} %\cellcolor{illegal}&Illegal, but supported by \dasm.\\ %\cellcolor{unimplemented}&Highly unstable. Not supported.\\ %\cellcolor{unstable}&Unstable and/or not supported.\\ %\cellcolor{missing}&Illegal but stable, and missing from \dasm.\\ %&Use \mono{.byte} to insert opcode, operand(s) into code\\ \end{tabular}& \begin{tabular}{l} (+) add 1 cycle if branch instruction performed\\ (+) add 1 cycle if page boundary is crossed\\ \\ $\infty$ = Instruction never completes\\ \end{tabular} \\ \end{tabular} \end{table} \end{landscape} \iffalse \mono{}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \fi dasm-2.20.14.1/docs/sources/6803.tex000066400000000000000000000003071375233463600165140ustar00rootroot00000000000000\chapter{6803 Processor} \label{processor:6803} \index{Processor!6803} \section{Endianness} The \mono{6803} is a big-endian machine. Byte ordering in words is high, then low. \emph{No content yet}dasm-2.20.14.1/docs/sources/68705.tex000066400000000000000000000003131375233463600166020ustar00rootroot00000000000000\chapter{68705 Processor} \label{processor:68705} \index{Processor!68705} \section{Endianness} The \mono{68705} is a big-endian machine. Byte ordering in words is high, then low. \emph{No content yet}dasm-2.20.14.1/docs/sources/68HC11.tex000066400000000000000000000003171375233463600167270ustar00rootroot00000000000000\chapter{68HC11 Processor} \label{processor:68HC11} \index{Processor!68HC11} \section{Endianness} The \mono{68HC11} is a big-endian machine. Byte ordering in words is high, then low. \emph{No content yet}dasm-2.20.14.1/docs/sources/ChannelF.tex000066400000000000000000001575231375233463600176070ustar00rootroot00000000000000\label{changelog20200901_nop3} \chapter{6502} Special-case information, and tips and tricks for the processors supported by \dasm are described here. \label{changelog:20200904illegal} \section{Illegal Opcodes} The effects of the ``unused'' opcodes on the 6502 are by now relatively well documented. These are variously described as illegal, undocumented, invalid, and unspecified. Modern programs use some of these, as they provide additional capabilities (particularly speed improvements) over the use of the standard opcodes. \dasm explicitly supports some of the commonly used `stable' illegal opcodes. \url{http://www.oxyron.de/html/opcodes02.html} was used as a reference for most of the data shown in the following tables. They have been cross-referenced with the \dasm source code to determine what instructions and opcodes are supported. \iffalse \subsection{\texttt{ANC}} \begin{usage} ANC \end{usage} \begin{table}[H] \begin{tabular}{lr} \begin{tabular}{llc} \mono{\$0B}&\texttt{ANC }\emph{\#imm}&\mono{A:=A \& \#\{imm\}}\\ \end{tabular}& \tabcolsep=0.1cm \begin{tabular}{|cccccccc|} \hline \scriptsize\mono{N}& \scriptsize\mono{V}& \scriptsize\mono{B}& \scriptsize\mono{D}& \scriptsize\mono{I}& \scriptsize\mono{Z}& \scriptsize\mono{C}& \scriptsize\mono{?}\\ \hline \mono{1}& \mono{*}& \mono{*}& \mono{*}& \mono{*}& \mono{*}& \mono{*}& \mono{*}\\ \hline \end{tabular} \end{tabular} \end{table} \begin{code} ANC \$0B A:=A\&#\{imm\} * * * ANC \$2B A:=A\&#\{imm\} * * * llegal opcodes: Opcode imp imm zp zpx zpy izx izy abs abx aby ind rel Function N V B D I Z C SLO \$07 \$17 \$03 \$13 \$0F \$1F \$1B \{adr\}:=\{adr\}*2 A:=A or \{adr\} * * * RLA \$27 \$37 \$23 \$33 \$2F \$3F \$3B \{adr\}:=\{adr\}rol A:=A and \{adr\} * * * SRE \$47 \$57 \$43 \$53 \$4F \$5F \$5B \{adr\}:=\{adr\}/2 A:=A exor \{adr\} * * * RRA \$67 \$77 \$63 \$73 \$6F \$7F \$7B \{adr\}:=\{adr\}ror A:=A adc \{adr\} * * * * SAX \$87 \$97 \$83 \$8F \{adr\}:=A\&X LAX \$A7 \$B7 \$A3 \$B3 \$AF \$BF A,X:=\{adr\} * * DCP \$C7 \$D7 \$C3 \$D3 \$CF \$DF \$DB \{adr\}:=\{adr\}-1 A-\{adr\} * * * ISC \$E7 \$F7 \$E3 \$F3 \$EF \$FF \$FB \{adr\}:=\{adr\}+1 A:=A-\{adr\} * * * * ALR \$4B A:=(A\&#\{imm\})/2 * * * ARR \$6B A:=(A\&#\{imm\})/2 * * * * XAA(2) \$8B A:=X\&#\{imm\} * * LAX(2) \$AB A,X:=#\{imm\} * * AXS \$CB X:=A\&X-#\{imm\} * * * SBC \$EB A:=A-\#\{imm\} * * * * AHX(1) \$93 \$9F \{adr\}:=A\&X\&H SHY(1) \$9C \{adr\}:=Y\&H SHX(1) \$9E \{adr\}:=X\&H TAS(1) \$9B S:=A\&X \{adr\}:=S\&H LAS \$BB A,X,S:=\{adr\}\&S * * (1) = unstable in certain matters (2) = highly unstable (results are not predictable on some machines) A = Accumulator X = X-Register Y = Y-Register S = Stack-Pointer P = Status-Register +(S) = Stack-Pointer relative with pre-increment (S)- = Stack-Pointer relative with post-decrement Combinations of two operations with the same addressing mode: SLO {adr} = ASL {adr} + ORA {adr} RLA {adr} = ROL {adr} + AND {adr} SRE {adr} = LSR {adr} + EOR {adr} RRA {adr} = ROR {adr} + ADC {adr} SAX {adr} = store A\&X into {adr} LAX {adr} = LDA {adr} + LDX {adr} DCP {adr} = DEC {adr} + CMP {adr} ISC {adr} = INC {adr} + SBC {adr} note to SAX: the A&X operation is a result of A and X put onto the bus at the same time. Combinations of an immediate and an implied command: ANC \#{imm} = AND \#{imm} + (ASL) ANC \#{imm} = AND \#{imm} + (ROL) ALR \#{imm} = AND \#{imm} + LSR ARR \#{imm} = AND \#{imm} + ROR XAA \#{imm} = TXA + AND \#{imm} LAX \#{imm} = LDA \#{imm} + TAX AXS \#{imm} = A\&X minus #{imm} into X SBC \#{imm} = SBC \#{imm} + NOP note to ANC: this command performs an AND operation only, but bit 7 is put into the carry, as if the ASL/ROL would have been executed. note to ARR: part of this command are some ADC mechanisms. following effects appear after AND but before ROR: the V-Flag is set according to (A and \#{imm})+\#{imm}, bit 0 does NOT go into carry, but bit 7 is exchanged with the carry. note to XAA: DO NOT USE!!! Highly unstable!!! note to LAX: DO NOT USE!!! On my C128, this opcode is stable, but on my C64-II it loses bits so that the operation looks like this: ORA \#? AND \#{imm} TAX. note to AXS: performs CMP and DEX at the same time, so that the MINUS sets the flag like CMP, not SBC. Combinations of STA/STX/STY: AHX {adr} = stores A\&X\&H into {adr} SHX {adr} = stores X\&H into {adr} SHY {adr} = stores Y\&H into {adr} note: sometimes the \&H drops off. Also page boundary crossing will not work as expected (the bank where the value is stored may be equal to the value stored). Combinations of STA/TXS and LDA/TSX: TAS {adr} = stores A\&X into S and A\&X\&H into {adr} LAS {adr} = stores {adr}\&S into A, X and S note to LAS: is called as "propably unreliable" in one source. Bit configuration does not allow any operation on these ones: NOP = has no effects NOP #{imm} = fetches #{imm} but has no effects NOP {adr} = fetches {adr} but has no effects KIL = halts the CPU. the data bus will be set to \#\$FF Aliases used in other illegal opcode sources: SLO = ASO SRE = LSE ISC = ISB ALR = ASR SHX = A11 (A11 was a result of only having tested this one on adress \$1000) SHY = A11 LAS = LAR KIL = JAM, HLT \end{code} \fi \subsection{Abbreviations and Colours used in Tables} \subsubsection{Addressing Modes} \begin{table}[H] \begin{tabularx}{\linewidth}{cll} \toprule Abbreviation&Mode&Example\\ \hline \\ \emph{abs}&Absolute&\mono{LDA \$F000}\\ \emph{abx}&Absolute indexed by X&\mono{LDA \$F000,x}\\ \emph{aby}&Absolute indexed by Y&\mono{LDA \$F000,y}\\ \emph{idx}&Indexed indirect X&\mono{LDA (\$23,x)}\\ \emph{idy}&Indirect Y&\mono{LDA (\$23),y}\\ \emph{imm}&Immediate&\mono{LDA \#1}\\ \emph{imp}&Implied. Operates on register or flag&\mono{LSR}\\ \emph{ind}&Indirect absolute&\mono{JMP (\$F000)}\\ \emph{rel}&Relative to PC&\mono{BCS addr}\\ \emph{zp}&Zero-page&\mono{LDA 1}\\ \emph{zpx}&Zero-page indexed by X&\mono{LDA \$23,x}\\ \emph{zpy}&Zero-page indexed by Y&\mono{LAX 0,y}\\ \\ \bottomrule \end{tabularx} \end{table} \iffalse #define ASTD AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|\ AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY \fi \subsection{Mnemonics, and Opcodes for Addressing Modes} \subsubsection{Opcode Colour Key} \begin{table}[H] \begin{tabular}{ll} \cellcolor{illegal}&Stable. Supported by \dasm.\\ \cellcolor{missing}&Stable. Not supported.\\ \cellcolor{unstablecertain}&Unstable in some situations. Not supported.\\ \cellcolor{unimplemented}&Highly unstable. Not supported.\\ \end{tabular} \end{table} \begin{table}[H] %\def\arraystretch{0.98} \begin{tabularx}{\linewidth}{c|cccccccccccc} %\toprule % \multicolumn{1}{c}{} & \mono{}& \emph{imp}& \emph{imm}& \emph{zp}& \emph{zpx}& \emph{abs}& \emph{abx}& \emph{aby}& \emph{idx}& \emph{idy}& \emph{zpy}& \emph{rel}& \emph{ind}\\ \hline \mono{ADC}& \mono{\color{ghost}\xmark}& % implied \mono{\$69}& \mono{\$65}& \mono{\$75}& \mono{\$6D}& \mono{\$7D}& \mono{\$79}& \mono{\$61}& \mono{\$71}& \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \cellcolor{unstablecertain}\mono{AHX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \cellcolor{unstablecertain}\mono{\$93}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ANC}& \mono{\color{ghost}\xmark}& % implied \cellcolor{illegal}\mono{\$0B}& % immediate \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{}& %ANC#2 \mono{}& % implied \cellcolor{missing}\mono{\$2B}& % immediate \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{} & %rel \mono{} %(abs) \\ \mono{AND}& \mono{\color{ghost}\xmark}& % implied \mono{\$29}& % immediate \mono{\$25}& %zp \mono{\$35}& %zp,x \mono{\$2D}& %abs \mono{\$3D}& %abs,x \mono{\$39}& %abs,y \mono{\$21}& %(zp,x) \mono{\$31}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ANE}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$8B}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ARR}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$6B}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ASL}& \mono{\$0A}& \mono{\color{ghost}\xmark}& % immediate \mono{\$06}& \mono{\$16}& \mono{\$0E}& \mono{\$1E}& \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ASR}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$4B}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \cellcolor{missing}\mono{AXS}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{missing}\mono{\$CB}& %imm \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BCC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$90}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BCS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$B0}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BEQ}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$F0}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BIT}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\$24}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$2C}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BMI}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$30}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BNE}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$D0}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BPL}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$10} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BRK}& \mono{\$00}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BVC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$50} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BVS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$70} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLC}& \mono{\$18}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLD}& \mono{\$D8}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLI}& \mono{\$58}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLV}& \mono{\$B8}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CMP}& \mono{\color{ghost}\xmark}& %iMP \mono{\$C9}& %IMM \mono{\$C5}& %zp \mono{\$D5}& %zp,x \mono{\$CD}& %abs \mono{\$DD}& %abs,x \mono{\$D9}& %abs,y \mono{\$C1}& %(zp,x) \mono{\$D1}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CPX}& \mono{\color{ghost}\xmark}& %iMP \mono{\$E0}& %IMM \mono{\$E4}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$EC}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CPY}& \mono{\color{ghost}\xmark}& %iMP \mono{\$C0}& %IMM \mono{\$C4}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$CC}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DCP}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %IMM \cellcolor{illegal}\mono{\$C7}& %zp \cellcolor{illegal}\mono{\$D7}& %zp,x \cellcolor{illegal}\mono{\$CF}& %abs \cellcolor{illegal}\mono{\$DF}& %abs,x \cellcolor{illegal}\mono{\$DB}& %abs,y \cellcolor{illegal}\mono{\$C3}& %(zp,x) \cellcolor{illegal}\mono{\$D3}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DEC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %IMM \mono{\$C6}& %zp \mono{\$D6}& %zp,x \mono{\$CE}& %abs \mono{\$DE}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DEX}& \mono{\$CA}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DEY}& \mono{\$88}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{EOR}& \mono{\color{ghost}\xmark}& %iMP \mono{\$49}& %# \mono{\$45}& %zp \mono{\$55}& %zp,x \mono{\$4D}& %abs \mono{\$5D}& %abs,x \mono{\$59}& %abs,y \mono{\$41}& %(zp,x) \mono{\$51}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{INC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$E6}& %zp \mono{\$F6}& %zp,x \mono{\$EE}& %abs \mono{\$FE}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{INX}& \mono{\$E8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{INY}& \mono{\$C8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ISB}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$E7}& %zp \cellcolor{illegal}\mono{\$F7}& %zp,x \cellcolor{illegal}\mono{\$EF}& %abs \cellcolor{illegal}\mono{\$FF}& %abs,x \cellcolor{illegal}\mono{\$FB}& %abs,y \cellcolor{illegal}\mono{\$E3}& %(zp,x) \cellcolor{illegal}\mono{\$F3}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \end{tabularx} \end{table} \begin{table}[H] %\def\arraystretch{0.98} \begin{tabularx}{\linewidth}{c|cccccccccccc} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}& \emph{imp}& \emph{imm}& \emph{zp}& \emph{zpx}& \emph{abs}& \emph{abx}& \emph{aby}& \emph{idx}& \emph{idy}& \emph{zpy}& \emph{rel}& \emph{ind}\\ \hline \\ \mono{JMP}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$4C}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\$6C} %(abs) \\ \mono{JSR}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$20}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \cellcolor{missing}\mono{KIL}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LAS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$BB}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LAX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$A7}& %zp \mono{\color{ghost}\xmark}& %zp,x \cellcolor{illegal}\mono{\$AF}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$BF}& %abs,y \cellcolor{illegal}\mono{\$A3}& %(zp,x) \cellcolor{illegal}\mono{\$B3}& %(zp),y \cellcolor{illegal}\mono{\$B7}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LDA}& \mono{\color{ghost}\xmark}& %iMP \mono{\$A9}& %# \mono{\$A5}& %zp \mono{\$B5}& %zp,x \mono{\$AD}& %abs \mono{\$BD}& %abs,x \mono{\$B9}& %abs,y \mono{\$A1}& %(zp,x) \mono{\$B1}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LDX}& \mono{\color{ghost}\xmark}& %iMP \mono{\$A2}& %# \mono{\$A6}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$AE}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\$BE}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\$B6}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LDY}& \mono{\color{ghost}\xmark}& %iMP \mono{\$A0}& %# \mono{\$A4}& %zp \mono{\$B4}& %zp,x \mono{\$AC}& %abs \mono{\$BC}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LSR}& \mono{\$4A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$46}& %zp \mono{\$56}& %zp,x \mono{\$4E}& %abs \mono{\$5E}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LXA}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$AB}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{NOP}& \mono{\$EA}& %iMP \cellcolor{illegal}\mono{\$80}& %# \cellcolor{illegal}\mono{\$04}& %zp \cellcolor{illegal}\mono{\$14}& %zp,x \cellcolor{illegal}\mono{\$0C}& %abs \cellcolor{illegal}\mono{\$1C}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{}& % NOP #2 \mono{\cellcolor{missing}\cellcolor{missing}\$1A}& %iMP \mono{}& %# \mono{\cellcolor{missing}\$44}& %zp \mono{\cellcolor{missing}\$34}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$3C}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #3 \mono{\cellcolor{missing}\$3A}& %iMP \mono{}& %# \mono{\cellcolor{missing}\$64}& %zp \mono{\cellcolor{missing}\$54}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$5C}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #4 \mono{\cellcolor{missing}\$5A}& %iMP \mono{}& %# \mono{}& %zp \mono{\cellcolor{missing}\$74}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$7C}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #5 \mono{\cellcolor{missing}\$7A}& %iMP \mono{}& %# \mono{}& %zp \mono{\cellcolor{missing}\$D4}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$DC}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #6 \mono{\cellcolor{missing}\$82}& %iMP \mono{}& %# \mono{}& %zp \mono{\cellcolor{missing}\$F4}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$FC}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #7 \mono{\cellcolor{missing}\$89}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #8 \mono{\cellcolor{missing}\$C2}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #9 \mono{\cellcolor{missing}\$DA}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #10 \mono{\cellcolor{missing}\$E2}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #11 \mono{\cellcolor{missing}\$FA}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{ORA}& \mono{\color{ghost}\xmark}& %iMP \mono{\$09}& %# \mono{\$05}& %zp \mono{\$15}& %zp,x \mono{\$0D}& %abs \mono{\$1D}& %abs,x \mono{\$19}& %abs,y \mono{\$01}& %(zp,x) \mono{\$11}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PHA}& \mono{\$48}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PHP}& \mono{\$08}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PLA}& \mono{\$68}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PLP}& \mono{\$28}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RLA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$27}& %zp \cellcolor{illegal}\mono{\$37}& %zp,x \cellcolor{illegal}\mono{\$2F}& %abs \cellcolor{illegal}\mono{\$3F}& %abs,x \cellcolor{illegal}\mono{\$3B}& %abs,y \cellcolor{illegal}\mono{\$23}& %(zp,x) \cellcolor{illegal}\mono{\$33}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ROL}& \mono{\$2A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$26}& %zp \mono{\$36}& %zp,x \mono{\$2E}& %abs \mono{\$3E}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ROR}& \mono{\$6A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$66}& %zp \mono{\$76}& %zp,x \mono{\$6E}& %abs \mono{\$7E}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RRA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$67}& %zp \cellcolor{illegal}\mono{\$77}& %zp,x \cellcolor{illegal}\mono{\$6F}& %abs \cellcolor{illegal}\mono{\$7F}& %abs,x \cellcolor{illegal}\mono{\$7B}& %abs,y \cellcolor{illegal}\mono{\$63}& %(zp,x) \cellcolor{illegal}\mono{\$73}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RTI}& \mono{\$40}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RTS}& \mono{\$60}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SAX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$87}& %zp \mono{\color{ghost}\xmark}& %zp,x \cellcolor{illegal}\mono{\$8F}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \cellcolor{illegal}\mono{\$83}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \cellcolor{illegal}\mono{\$97}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SBC}& \mono{\color{ghost}\xmark}& %iMP \mono{\$E9}& %# \mono{\$E5}& %zp \mono{\$F5}& %zp,x \mono{\$ED}& %abs \mono{\$FD}& %abs,x \mono{\$F9}& %abs,y \mono{\$E1}& %(zp,x) \mono{\$F1}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{}& %2 \mono{}& %iMP \mono{\cellcolor{missing}\$EB}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \end{tabularx} \end{table} \begin{table}[H] %\def\arraystretch{0.98} \begin{tabularx}{\linewidth}{c|cccccccccccc} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}& \emph{imp}& \emph{imm}& \emph{zp}& \emph{zpx}& \emph{abs}& \emph{abx}& \emph{aby}& \emph{idx}& \emph{idy}& \emph{zpy}& \emph{rel}& \emph{ind}\\ \hline \\ \mono{SBX}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$CB}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SEC}& \mono{\$38}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SED}& \mono{\$F8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SEI}& \mono{\$78}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$9F}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \cellcolor{illegal}\mono{\$93}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$9B}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$9E}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHY}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \cellcolor{illegal}\mono{\$9C}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SLO}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$07}& %zp \cellcolor{illegal}\mono{\$17}& %zp,x \cellcolor{illegal}\mono{\$0F}& %abs \cellcolor{illegal}\mono{\$1F}& %abs,x \cellcolor{illegal}\mono{\$1B}& %abs,y \cellcolor{illegal}\mono{\$03}& %(zp,x) \cellcolor{illegal}\mono{\$13}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SRE}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$47}& %zp \cellcolor{illegal}\mono{\$57}& %zp,x \cellcolor{illegal}\mono{\$4F}& %abs \cellcolor{illegal}\mono{\$5F}& %abs,x \cellcolor{illegal}\mono{\$5B}& %abs,y \cellcolor{illegal}\mono{\$43}& %(zp,x) \cellcolor{illegal}\mono{\$53}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{STA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$85}& %zp \mono{\$95}& %zp,x \mono{\$8D}& %abs \mono{\$9D}& %abs,x \mono{\$99}& %abs,y \mono{\$81}& %(zp,x) \mono{\$91}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{STX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$86}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$8E}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\$96}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{STY}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$84}& %zp \mono{\$94}& %zp,x \mono{\$8C}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TAX}& \mono{\$AA}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TAY}& \mono{\$A8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TSX}& \mono{\$BA}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TXA}& \mono{\$8A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TXS}& \mono{\$9A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TYA}& \mono{\$98}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \end{tabularx} \end{table} \begin{landscape} \subsection{Opcode Mnemonics} \index{Processor!6502!Opcode Mnemonics} \def\arraystretch{0.95} \begin{table}[H] %\tabcolsep=0.085cm \begin{tabular}{c|ccccccccccccccccc} %ccc!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}&&\mono{\${\color{ghost}x}0}&\mono{\${\color{ghost}x}1}&\mono{\${\color{ghost}x}2}&\mono{\${\color{ghost}x}3}&\mono{\${\color{ghost}x}4}&\mono{\${\color{ghost}x}5}&\mono{\${\color{ghost}x}6}&\mono{\${\color{ghost}x}7}&\mono{\${\color{ghost}x}8}&\mono{\${\color{ghost}x}9}&\mono{\${\color{ghost}x}A}&\mono{\${\color{ghost}x}B}&\mono{\${\color{ghost}x}C}&\mono{\${\color{ghost}x}D}&\mono{\${\color{ghost}x}E}&\mono{\${\color{ghost}x}F}\\ \hline \\ \mono{\$0{\color{ghost}x}}&& \mono{BRK}& \mono{ORA}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SLO}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO}& \mono{PHP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{ANC}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO} \\ %\arrayrulecolor{ghost2}\hline \mono{\$1{\color{ghost}x}}&& \mono{BPL}& \mono{ORA}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SLO}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO}& \mono{CLC}& \mono{ORA}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{SLO}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO} \\ %\hline \mono{\$2{\color{ghost}x}}&& \mono{JSR}& \mono{AND}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RLA}& \mono{BIT}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA}& \mono{PLP}& \mono{AND}& \mono{ROL}& \cellcolor{missing}\mono{ANC}& \mono{BIT}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA} \\ %\hline \mono{\$3{\color{ghost}x}}&& \mono{BMI}& \mono{AND}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RLA}& \cellcolor{missing}\mono{NOP}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA}& \mono{SEC}& \mono{AND}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{RLA}& \cellcolor{missing}\mono{NOP}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA} \\ %\hline \mono{\$4{\color{ghost}x}}&& \mono{RTI}& \mono{EOR}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SRE}& \cellcolor{missing}\mono{NOP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE}& \mono{PHA}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{ALR}& \mono{JMP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE} \\ %\hline \mono{\$5{\color{ghost}x}}&& \mono{BVC}& \mono{EOR}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SRE}& \cellcolor{missing}\mono{NOP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE}& \mono{CLI}& \mono{EOR}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{SRE}& \cellcolor{missing}\mono{NOP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE} \\ %\hline \mono{\$6{\color{ghost}x}}&& \mono{RTS}& \mono{ADC}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RRA}& \cellcolor{missing}\mono{NOP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA}& \mono{PLA}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{ARR}& \mono{JMP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA} \\ %\hline \mono{\$7{\color{ghost}x}}&& \mono{BVS}& \mono{ADC}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RRA}& \cellcolor{missing}\mono{NOP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA}& \mono{SEI}& \mono{ADC}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{RRA}& \cellcolor{missing}\mono{NOP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA} \\ %\hline \mono{\$8{\color{ghost}x}}&& \cellcolor{illegal}\mono{NOP}& \mono{STA}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{SAX}& \mono{STY}& \mono{STA}& \mono{STX}& \cellcolor{illegal}\mono{SAX}& \mono{DEY}& \cellcolor{missing}\mono{NOP}& \mono{TXA}& \cellcolor{unimplemented}\mono{XAA}& \mono{STY}& \mono{STA}& \mono{STX}& \cellcolor{illegal}\mono{SAX} \\ %\hline \mono{\$9{\color{ghost}x}}&& \mono{BCC}& \mono{STA}& \cellcolor{missing}\mono{KIL}& \cellcolor{unstablecertain}\mono{AHX}& \mono{STY}& \mono{STA}& \mono{STX}& \cellcolor{illegal}\mono{SAX}& \mono{TYA}& \mono{STA}& \mono{TXS}& \cellcolor{unstablecertain}\mono{TAS}& \cellcolor{unstablecertain}\mono{SHY}& \mono{STA}& \cellcolor{unstablecertain}\mono{SHX}& \cellcolor{unstablecertain}\mono{AHX} \\ %\hline \mono{\$A{\color{ghost}x}}&& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX}& \mono{TAY}& \mono{LDA}& \mono{TAX}& \cellcolor{unimplemented}\mono{LAX}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX} \\ %\hline \mono{\$B{\color{ghost}x}}&& \mono{BCS}& \mono{LDA}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{LAX}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX}& \mono{CLV}& \mono{LDA}& \mono{TSX}& \cellcolor{illegal}\mono{LAS}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX} \\ %\hline \mono{\$C{\color{ghost}x}}&& \mono{CPY}& \mono{CMP}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{DCP}& \mono{CPY}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP}& \mono{INY}& \mono{CMP}& \mono{DEX}& \cellcolor{missing}\mono{AXS}& \mono{CPY}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP} \\ %\hline \mono{\$D{\color{ghost}x}}&& \mono{BNE}& \mono{CMP}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{DCP}& \cellcolor{missing}\mono{NOP}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP}& \mono{CLD}& \mono{CMP}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{DCP}& \cellcolor{missing}\mono{NOP}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP} \\ %\hline \mono{\$E{\color{ghost}x}}&& \mono{CPX}& \mono{SBC}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{ISC}& \mono{CPX}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC}& \mono{INX}& \mono{SBC}& \mono{NOP}& \cellcolor{missing}\mono{SBC}& \mono{CPX}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC} \\ %\hline% \mono{\$F{\color{ghost}x}}&& \mono{BEQ}& \mono{SBC}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{ISC}& \cellcolor{missing}\mono{NOP}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC}& \mono{SED}& \mono{SBC}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{ISC}& \cellcolor{missing}\mono{NOP}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC} \\ \end{tabular} \end{table} \begin{table}[H] \begin{tabular}{ll} \begin{tabular}{ll} \end{tabular}& \begin{tabular}{ll} \cellcolor{illegal}&Stable. Supported by \dasm.\\ \cellcolor{missing}&Stable. Not supported.\\ \cellcolor{unstablecertain}&Unstable in some situations. Not supported.\\ \cellcolor{unimplemented}&Highly unstable. Not supported.\\ \end{tabular} \end{tabular} \end{table} \end{landscape} \begin{landscape} \subsection{Instruction Cycle Counts} \index{Processor!6502!Instruction Cycle Timing} \def\arraystretch{0.98} \begin{table}[H] %\tabcolsep=0.085cm \begin{tabular}{c|ccccccccccccccccc} %\begin{tabular}{c|c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}&&\mono{\${\color{ghost}x}0}&\mono{\${\color{ghost}x}1}&\mono{\${\color{ghost}x}2}&\mono{\${\color{ghost}x}3}&\mono{\${\color{ghost}x}4}&\mono{\${\color{ghost}x}5}&\mono{\${\color{ghost}x}6}&\mono{\${\color{ghost}x}7}&\mono{\${\color{ghost}x}8}&\mono{\${\color{ghost}x}9}&\mono{\${\color{ghost}x}A}&\mono{\${\color{ghost}x}B}&\mono{\${\color{ghost}x}C}&\mono{\${\color{ghost}x}D}&\mono{\${\color{ghost}x}E}&\mono{\${\color{ghost}x}F}\\ \hline \\ \mono{\$0{\color{ghost}x}}&& \mono{7}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\arrayrulecolor{ghost2}\hline \mono{\$1{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$2{\color{ghost}x}}&& \mono{6}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{4}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$3{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$4{\color{ghost}x}}&& \mono{6}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{3}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$5{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$6{\color{ghost}x}}&& \mono{6}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{4}& \mono{3}& \mono{3}& \mono{3}& \mono{5}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$7{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$8{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{6}& \mono{3}& \mono{3}& \mono{3}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{4}& \mono{4} \\ %\hline \mono{\$9{\color{ghost}x}}&& \mono{ 2+}& \mono6{}& $\infty$& \mono{6}& \mono{4}& \mono{4}& \mono{4}& \mono{4}& \mono{2}& \mono{5}& \mono{2}& \mono{5}& \mono{5}& \mono{5}& \mono{5}& \mono{5} \\ %\hline \mono{\$A{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{6}& \mono{3}& \mono{3}& \mono{3}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{4}& \mono{4} \\ %\hline \mono{\$B{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{ 5+}& \mono{4}& \mono{4}& \mono{4}& \mono{4}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{ 4+}& \mono{ 4+}& \mono{ 4+}& \mono{ 4+}& \mono{ 4+} \\ %\hline \mono{\$C{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$D{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$E{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$F{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ \end{tabular} \end{table} \begin{table}[H] \begin{tabular}{ll} \begin{tabular}{ll} %\cellcolor{illegal}&Illegal, but supported by \dasm.\\ %\cellcolor{unimplemented}&Highly unstable. Not supported.\\ %\cellcolor{unstable}&Unstable and/or not supported.\\ %\cellcolor{missing}&Illegal but stable, and missing from \dasm.\\ %&Use \mono{.byte} to insert opcode, operand(s) into code\\ \end{tabular}& \begin{tabular}{l} (+) add 1 cycle if branch instruction performed\\ (+) add 1 cycle if page boundary is crossed\\ \\ $\infty$ = Instruction never completes\\ \end{tabular} \\ \end{tabular} \end{table} \end{landscape} \iffalse \mono{}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \fi \chapter{The Machines} \dasm supports specific machines and processors through the provision of companion source-code files that can assist with programming each platform. These files are located in the \mono{machines} subdirectory. Support is provided for... \begin{itemize} \item \nameref{machine:atari2600} \item Atari 7800 \item Channel F \item 68hc11 \item 68hc908 \end{itemize} \section{Atari 2600} \label{machine:atari2600} The Atari 2600 is a game console from 1978 that uses a 6507 processor. This processor is similar to the 6502 processor (supported by \dasm). The difference in the processors is the number of hardware address lines on the chips; these being 16 on the 6502, and 12 on the 6507. Thus, the 6502 can directly address 64K of memory and the 6507 only 4K of memory. From the point of view of \dasm, the machines are identical, as the 6502 and 6507 share a common instruction set. For programming the Atari 2600, use \mono{PROCESSOR 6502} at the start of your program. \subsection{Support Files} The Atari 2600 is explicitly supported with two files generally included in most programs for that machine. \subsubsection{\mono{vcs.h}} Contains the standardised register definitions for the \mono{RIOT} and \mono{TIA} chips, defined with uninitialised segments. The implementation allows relocation of the \mono{TIA} base address to a shadow register address. \subsubsection{\mono{macro.h}} \label{support6502} Contains some useful macros. \section{HD6303} \subsection{Broken Opcodes Bug} \label{changelog:20200903bug} The \mono{AIM}, \mono{OIM}, \mono{EIM}, and \mono{TIM} opcodes are broken. These instructions are \textbf{three} bytes long according to the data sheets, yet in \dasm they are treated as \textbf{two} byte instructions. These instructions are supposed to work as follows: \begin{code} tim #$10,$C2 tim #$80,$00,x \end{code} So there's an immediate value \textbf{and} a zero-page address for these instructions! \dasm, however, only accepts these: \begin{code} tim $10 tim $10,x \end{code} These opcodes simply don't fit into the "regular pattern" of 8-bit CPUs we deal with in \dasm. Fixing this will require changes to \dasm beyond just fixing the instruction table, and the parser code is not even remotely ready for this. The "workaround" for now is to use macros instead of the actual instructions, see \mono{../test/broken6303hack.asm} for details. dasm-2.20.14.1/docs/sources/F8.tex000066400000000000000000000130501375233463600163700ustar00rootroot00000000000000\chapter{F8 Processor} \label{processor:f8} \index{Processor!F8} \index{Machine!Channel F} The F8 processor is used by the \nameref{machine:channelF} machine. \section{Endianness} The \mono{F8} is a big-endian machine. Byte ordering in words is high, then low. \subsection{Processor selection} With DASM, the target CPU is selected with the PROCESSOR directive inside the source file that should be assembled. The F8 CPU is selected like this: \begin{usage} processor f8 processor F8 ; case insensitive \end{usage} \subsection{Expressions with parentheses} Some of DASM's backends, for instance the one for the 6502, don't allow parentheses in expressions that are part of a mnemonic's operand, because parentheses are used in the 6502's assembly language to denote indirect addressing. Instead, you have to use brackets. This is not the case with the F8 backend. Both parentheses and brackets can be used everywhere, so the following lines are parsed and assembled correctly: \begin{code} as (2+2)*2 ; Assembles to $c8 as [2+2]*2 ; Assembles to $c8 \end{code} \subsection{Data definition directives} Since \mono{DS} is an F8 instruction (decrement scratchpad register), the \mono{DS} directive isn't available anymore if \dasm assembles F8 code. Instead, use the \mono{RES} directive, which works just like the \mono{DS} directive: \begin{code} ds.b 4,$33 ; Would assemble to $33 $33 $33 $33, ; but isn't available in F8 mode res.b 4,$33 ; Assembles to $33 $33 $33 $33 \end{code} Of course \mono{RES.W} and \mono{RES.L} do exist as well. For source code compatibility with \mono{f8tool} (another F8 assembler), some additional data definition directives are available : \mono{DB}, \mono{DW} and \mono{DD}. These work just like \mono{DC.B}, \mono{DC.W} and \mono{DC.L}: \begin{code} dc.b $f8 ; Assembles to $f8 db $f8 ; Assembles to $f8 \end{code} \subsection{Special register names} For some of the special registers, multiple names are accepted: \begin{table}[H] \begin{tabularx}{\linewidth}{cl} \toprule \textbf{Register}&\textbf{Accepted Names}\\ \hline \mono{DC0}&\mono{DC}, \mono{DC0}\\ \mono{PC0}&\mono{P0}, \mono{PC0}\\ \mono{PC1}&\mono{P}, \mono{PC1}\\ \mono{J}&\mono{J}, Any expression that evaluates to \mono{9}\\ &(This may seem strange, but \mono{J} is really\\ &just an alias for scratchpad register \mono{9})\\ \hline \end{tabularx} \end{table} The names \mono{DC}, \mono{P0}, \mono{P} and \mono{J} are standard syntax, the other forms have been introduced for compatibility with other assemblers. Thus, the following lines assemble all correctly: \begin{code} lr h,dc ; Assembles to $11 lr h,dc0 ; Assembles to $11 lr p0,q ; Assembles to $0d lr pc0,q ; Assembles to $0d lr p,q ; Assembles to $09 lr pc1,q ; Assembles to $09 lr w,j ; Assembles to $1d lr w,3*3 ; Assembles to $1d \end{code} \subsection{Scratchpad register access} There are several ways to access scratchpad registers: \begin{table}[H] \begin{tabularx}{\linewidth}{ll} \toprule \textbf{Access Mode}&\textbf{Accepted Syntax}\\ \hline \\ Direct access to registers \mono{0..11}&Any expression that evaluates to \mono{0..11}\\ Access via \mono{ISAR}&\mono{S}, \mono{(IS)}, any expression that evaluates to \mono{12}\\ Access via \mono{ISAR}, \mono{ISAR} incremented&\mono{I}, \mono{(IS)+}, any expression that evaluates to \mono{13}\\ Access via \mono{ISAR}, \mono{ISAR} decremented&\mono{D}, \mono{(IS)-}, any expression that evaluates to \mono{14}\\ \hline \end{tabularx} \end{table} The \mono{(IS)}, \mono{(IS)+} and \mono{(IS)-} forms are not standard syntax and have been mainly introduced for compatibility with \mono{f8tool}. For some of the directly accessible scratchpad registers aliases exist: \begin{table}[H] \begin{tabularx}{\linewidth}{cc} \toprule \textbf{Register}&\textbf{Alias Name}\\ \hline \mono{9}&\mono{J}\\ \mono{10}&\mono{HU}\\ \mono{11}&\mono{HL}\\ \hline \end{tabularx} \end{table} Originally, \mono{J} was only used with the \mono{LR} instruction when accessing the flags, but since \mono{J} is just an alias for register \mono{9}, \mono{J} can also be used in normal scratchpad register operations. The following lines assemble all correctly \begin{code} xs 2+2 ; Assembles to $e4 xs s ; Assembles to $ec xs (is) ; Assembles to $ec xs 12 ; Assembles to $ec xs i ; Assembles to $ed xs (is)+ ; Assembles to $ed xs 13 ; Assembles to $ed xs d ; Assembles to $ee xs (is)- ; Assembles to $ee xs 14 ; Assembles to $ee xs 9 ; Assembles to $e9 xs j ; Assembles to $e9 xs hu ; Assembles to $ea xs hl ; Assembles to $eb \end{code} \subsection{No instruction optimizations are done} The assembler doesn't optimize instructions where a smaller instruction could be used. It won't optimize between \mono{OUT/OUTS}, \mono{IN/INS} and \mono{LI/LIS}. For instance, the following line assembles to \mono{\$20 \$00}, even though the \mono{LIS} instruction could be used, which would need only one byte. \begin{code} li 0 ; Assembles to $20 $00 \end{code} dasm-2.20.14.1/docs/sources/HD6303.tex000066400000000000000000000021331375233463600167220ustar00rootroot00000000000000\chapter{HD6303 Processor} \label{processor:6303} \index{Processor!HD6303} \section{Endianness} The \mono{HD6303} is a big-endian machine. Byte ordering in words is high, then low. \section{Broken Opcodes Bug} \label{changelog:20200903bug} The \mono{AIM}, \mono{OIM}, \mono{EIM}, and \mono{TIM} opcodes are broken. These instructions are \textbf{three} bytes long according to the data sheets, yet in \dasm they are treated as \textbf{two} byte instructions. These instructions are supposed to work as follows: \begin{code} tim #$10,$C2 tim #$80,$00,x \end{code} So there's an immediate value \textbf{and} a zero-page address for these instructions! \dasm, however, only accepts these: \begin{code} tim $10 tim $10,x \end{code} These opcodes simply don't fit into the "regular pattern" of 8-bit CPUs we deal with in \dasm. Fixing this will require changes to \dasm beyond just fixing the instruction table, and the parser code is not even remotely ready for this. The "workaround" for now is to use macros instead of the actual instructions, see \mono{../test/broken6303hack.asm} for macro templates. dasm-2.20.14.1/docs/sources/changelog.tex000066400000000000000000000160241375233463600200460ustar00rootroot00000000000000\index{Change Log} \section*{Change Log} \label{section:changelog} This section lists recent changes to the document, with most recent entries first. Each item line should hyperlink to the relevant place in the document where the change has been made. \subsection*{Changes} \begin{itemize} \item[]\mono{2020.09.18} \item[] Corrected licensing to GPLv2. Wrote a new \mono{dasm.sty} file to handle the formatting of the documentation. \item[]\mono{2020.09.15} \item \hyperref[changelog:20200915endian]{Added DC.S endian-swapping magic directive} \item[]\mono{2020.09.13} \item Added some structure (new chapters) to the document for inclusion of information about the "other" processors and machines. Started to separate the machine from the processor into separate sections. Should we do an all-in listing of opcodes for all processors, like for the 6502? \item Removed malformed coments examples as they are no longer applicable \item \hyperref[changelog:20200913bugs]{Added link to bugs/issue reporting} \item[]\mono{2020.09.09} \item \hyperref[changelog:20200908optionm]{Correction to how the -m option actually works} \item \hyperref[changelog:20200909comment]{Examples for good/bad comment formats added} \item \hyperref[changelog:20200909SI]{Notes about SI unit usage} \item \hyperref[flag:maximum]{Added the -m (Maximum Output File Size) option} \item \hyperref[flag:remove]{Added the -R (Remove Output File) option} \item[]\mono{2020.09.08} \item \hyperref[changelog:20200908source]{Added a new Chapter - Source Code, and inside a description of the source code format, including line ending format,and the various commenting styles.} \item \hyperref[changelog:20200908brackets]{Clarified the difference in usage of brackets on F8/6502} \item \hyperref[changelog:20200908atari]{Fixed some errors in the Atari 2600 section. Switched to SI standard units for describing powers of 2 sizes. I suspect people may not like that!} \item[]\mono{2020.09.07} \item \hyperref[changelog:20200907deprecated]{Added the really unusal (and deprecated) definition for labels... "\mono{[ ]...\textasciicircum[ ]...label}". This is a suppored/valid format, but it is likely to be removed. Do not use.} \item[]\mono{2020.09.06} \item \hyperref[changelog:20200906res]{Added the RES directive for the F8 processor. Replaces DS on that architecture.} \item \hyperref[changelog:20200906f8]{Merged the interesting Channel F documentation. This has highlighted a few missing things from the main doc (e.g., RES directive)} \item \hyperref[changelog:20200906spaces]{Corrected incorrect usage for spaces in filenames.} \item[]\mono{2020.09.04} \item \hyperref[changelog:20200905range]{Documented the range checking of byte and word values.} \item \hyperref[changelog:20200904illegal]{Much work on the illegal opcodes section of the 6502 chapter. In particular, all of the mnemonics and opcodes are now checked/cross-referenced with online sources identifying illegal, but functional opcodes. These have been checked against the \dasm source code to find out which are actually used/available. The tables section includes opcode-to-mnemonic, and also cycle timings for all instructions. The missing opcodes that \dasm doesn't support have been identified. The next step of all this will be to list the illegal opcodes that are supported and exactly what they do.} \item[]\mono{2020.09.03} \item \hyperref[changelog:20200903bug]{Added the information about the broken opcodes in HD6303, retrieved from the file BUGS in the source code. I'm starting to go throught the code itself to bring the manual up to date.} \item[]\mono{2020.09.02} \item \hyperref[changelog20200901_nop3]{There's a new chapter where all the special-case stuff for specific processors is going. In particular, explicit support of 6502 illegal opcodes is in the process of being documented. Did you even know \dasm explicitly supports many (but not all) of the illegal opcodes and their addressing modes? I knew about explicit support for ``nop 0'' and ``lax'' but few of the others. Note in this section how I have lifted a table from an online page, but have attributed it as I was taught when I was doing my formal research writing, so hopefully this will be OK.} \item \hyperref[changelog20200901_nop3]{There's a new chapter with details for each of the machines that are explicitly supported with include files, macros, etc. Of course, I only know the '2600 so that's all there is at this stage. Help needed for the others.} \item[]\mono{2020.08.31} \item \hyperref[changelog:20200831help]{Documented the default \dasm help message, and in the process spotted two options (-R and -m) which were not in the documentation. But then I found that the latest version of \dasm doesn't \textbf{have} these options; they have recently been removed!} \item[]\mono{2020.08.29} \item \hyperref[changelog:20200829substitutions]{Added extensions equivalent substitutions table} \item \hyperref[changelog:20200829formatdescription]{Tried to simplify the format templates for this document's descriptions of options} \item \hyperref[changelog:20200824passes]{Actual testing shows the default \# passes to be 3, so document has been updated to this value} \item Modified the 'output' box visuals to black on grey instead of white on black \item[]\mono{2020.08.24} \item \hyperref[changelog:20200824const]{Removed 0x for hexadecimal. Apparently recently removed from the code?} \item \hyperref[changelog:20200824license]{Upgraded license to GPL v3 to be compatible with .STY files used for generation of this manual} \textbf{NOTE: This change has been reversed/invalidated by use of a new .STY file compatible with GPLv2} \item \hyperref[changelog:20200824processor]{Fixed table of processor types to explicity list PROCESSOR values} \item \hyperref[changelog:20200824rangebug]{Documented dasm bug in constants signed range checking for 8-bit operands} \item \hyperref[changelog:20200824const]{Constants and Numbers duplicate sections merged.} \item \hyperref[changelog:20200824arithmetic]{Corrected error in table - || is logical-OR and \&\& is logical-AND when used in expressions. They will return 0 or 1 results.} \item \hyperref[changelog:20200824org]{Clarified the ORG/RORG usage in the \nameref{flag:outputformat} table, in regards to the requirement that data must be in order in initialised segments} \item \hyperref[changelog:20200824error]{Revamped the comment about error types} \item \hyperref[changelog:20200824passes]{Mentioned default number of passes} \item \hyperref[changelog:20200824developers]{Clarified the -d option} \item \hyperref[changelog:20200824sourcefile]{Clarified commmand-line format} \item \hyperref[changelog:specialcase]{Added note about special-casing of negative operands} \item \hyperref[changelog:alternateunary]{Added alternates to unary operator table} \item \hyperref[section:numberformat]{Added section describing \nameref{section:numberformat}} \item[]\mono{2020.08.23} \item \hyperref[changelog:20200823colon]{Added some usage notes about colon in label names and why it can be advantageous. I still hate it.} \item \hyperref[section:changelog]{Added this change log section.} \end{itemize} dasm-2.20.14.1/docs/sources/dasm-logo.png000066400000000000000000000555151375233463600177750ustar00rootroot00000000000000PNG  IHDR~ GsRGBgAMA a pHYs(JZIDATx^|Gg5 \xX EPR(-bw=' oξ7o >sG :$@, 6NdnߦP10000g@n"'kR3 T1E/;7o@c%ʊ!Kzz@DwE$s:ݤǸG 30000'@K_jS"+riRd#2 x84XP6R!:FZuFHඤwOF_['Ort|Zr'Gp&j,BlbD$DG%Ϗ}[j'nˠNe```+3K~u. GAE;W~L}9b}Ư--PJ) ,uN򯲄 Y< b5I$b!UBZrM4U0gMT B~JӋS!Kq|X|;b'z̓ -F_KXn*>@ni8hAYzrEFNe```l Fğ)hdfݫEԑ#rYNS Ut.X08ԑlp%obiE}&xMa```( d!'NE|!<3#kԫ2Gxa:Q EcLRDX\$D3Sbvמ %%@c?mV̦B[nk4z>JLZЫJUguG-^H;H\_$E\Bbs>/#KQ!JTl%!&h]b 9 s=T,'A+,6OTm YbGC[C'mM,r-~;B HDvN/"(:-R)eF!JAʴ7E~ oOK* +=^GX,Dr2 h0zQGJ5Ū@^]?ƪZyF6P)TCU\w00u͸}b䤷kgF_Y q0sK`(EoQQ bS '6OiɊ ˈUʨX`H_یԄe>U#qS.ca'=9dG,RK$'%m Qlkk5"n P갹9kN(+a! wߩذ?AFN9h*nyRo:KnؠN|""BEͽTL"?`QmX eIΉa偛tK`r[F.B"P`ZE浌G]f```(5LJ\}#4XD` ߩ܈vCLhiLuTg;ߘ``K +P֡W:#mΖ뇗hRMqe;*gܪf*X XuvlgQ> #SS?ـV*QC䙉GZ.>:60!۠8BY$KW:S>BE[僡s(;-4oshHc```0_3۹23yRO__:^=eY&e]Xpt6H+;(ˠ*CJ*e X"E|:;U#RLggfX$QK&OivTCA[\>B;0 $,tWVqB _6bez)Lh:R`#-J{~CYQE2|R:Tbϑ,+y(d```(1h+GىOD:9c$[H\"<EVb,hEKDXQ_z-dW$m8>m?&' ]F`Y8 2000w|S|?%C:hwm&yl\WBh[1ЫҁsH%B9Vv`]Nz@Tl㻰*TpR~B&q/"D~O*(uҍQBڭmqy*]i+H/~R!6)p]le(h)m;42d<>H;E\ob e "5 ٺcſs~{rɻTI.HbAc7:!}~XGE}4.oEzC$r([dI2~6<*6AKxA*[y?߅Ħ a\8^(R\X,u', yNjn*P6M ZҤ})+#Egx){Sr`hG[IYb<ͱo""|fZ>Ia)vDZ|OvA%@n-K"kjY*L;C`/qzJ:\&Sl376Z yfzuOO@>Vf'DSC9Ǥ|`a/T%OȌw?be| l޳9œHA5|#r\&*@v/6JK}9<_T-z2u{v/]dw@b~c $+^DUMŖZ  TB8mEǧR5łU4T*"'gnw1AqyۄHh6• [G = ` U Q7=Akv[ !*]!*ߐm{LRc!قC\z:T2#=ry'G,<>rVĺ?El,l*ș]G,"/6ʓ6Gˠn6~,UM]"(pʼn@aodSQVV-S8D7hxNkt{lW۸Vf.Ѧ":7,-6'B9PѲDؖVH&ɱ9`2'Ń 8տq ,,`.p@ " Q@>xX)nh[Fcn; | xΕT$)onD';bq]^m}ku B[ȱ-"XmA2qY,>549Q6C|@.X$׾09Hv*[bn2wtAgCsNvmDžJ8v80,5IpCE:\ 2E~yyP6g܎uoY;ܘ'vA.UhTTۮ^|7Y[Ni[5^B2=?,A`u 6W0!x-(Ln8x|tcZXV?x͒oKD VvҫԾ䤼AO YD VIZ؎QbEr d,=TدLCuωM*o$F(?BVиP-nc'|ScۨMw*[$YvPQ$ k]1q%m畷8=moǑڳYZ W4P;>[OvkZz@vrsNМnp  &=q6 i\ ZAVd,7 Z'鴪bsM1XD^gƎC,n˴!k9iFHi+"`Sv"M$~u^q"-BB%Oˆ@:M1P3,~ת.9*(+-'`.*ȋ`)cLq$HRW .P]sh;`F\NVe|) BO(6;n$k,T[y933Sm3:͖ Y{܇q{bCQpAJ|g f@8TܨJAH/0݌s!|ģF%W,. !_t0)U|#rl,_3\+3=ήv[B5Qf5gĔUm2/,v)tϪy+sR.؜f` yxXmGcp.HmzGzr ɴl=K|Z.\Hk01ǝ ާ.:Q!sȈ{'%vƼѰ% ءbGPB~ u"!B9\E4K)f*zycmxsԜ[]3;*QEpVԥEZNh;[ڸ~܏:Gu{Gpd`ۼt*yAa iQ5]1CJY`pv\Jg$ 4fa`cѪdԨ[b.G1{qw7컰V0Cq974jUpw+נ@|H(u5iyfd` eAAB[*>  $IPl Jr2q|>tj9Jk2_Ztˆ7Ai?_̻ýBIn`tkmKOOե"i$EZ^eRdcU}C UrǶPEױ!U(d=R ^ZQ{͇S`:'0U%qY2{e n׶u͹xKh"1c Krl3{F5zv뀄]?IyS.39 d^k5fGs9ݱ߻U;"جBjۍΨ>5Nki":ΫNXwNg%)74C ٹ2bd%4>:Hum[4l؄JiͷN<ޤb:tTȮX}|9l΂_:Y d>vL|yy^OX 8w;|%jYvb6KPJېJzikJV]?L )C [o+^.̠\сrRvzq\kz+>(l{]/&&їhMZM/W+7eiU9IWz a<Ը%Ł[@۠?haAQ& :X22EfLVrR$S NswmmQ[RA#8 :svj Ϟ#%oǺk2e EYu:O* ?Z՘tk'G\? S$+ut;@,6lL<%K~ٝZ6 aXH~ t!tz7Dz?WUJ-~ Isr|󦼹"oCOuKVʩ v^(`3Qj:K#_?^)`E^hOBӻszczBkG4sV#/QRc/یg6fܝBBFpzRAZy::%^Ldp[ch#`W j& Vc`:<ʡ&f{g$?_HM/}rCm"&BDy96|0G0;?v3'uS˒6@,*HF!pe弝{$s=FdiyBO.llUd FW -1|6_ ԨT@t|>|He9:ݷI<$N~:YBd[5pp׎щ:@ٿj4 ;U2-2ɑ(7dYl߇$8{HAU@Dž2l>ӏS^W K.IhçxxWiůmo+Xlnc -fP:uzxeqPɳQjff~P<9 Z@[s3 !uD:u2ގGGnoǕ]iqo)Olųؑ2Wp Hб,r Hh!%} +gg4}8`Atˠ׎J]_b;zjN>ߔ~@LZOΓ":`qAحZ4?Yi$W e+,"|w &0~Qv|sP+sPfr*X" $r<,aj푫o-*!(B4/QV=l/:;YHo[V65bp%x~w"GKa9{"G=*T<,pfՐ4׀zٷPPJ*YM׀0.> }+uz: ʫRK$vb.}< s/ϫrK$+J7\Hs*wD.g^;)l3wd1$2=<:oEߟ3z͊5p}>ܯqo7rM,s*T죥@?:8W`_t ar/hF #vxƜ;|Mn<+jTkw "}k~\P<{Yzڂߍݧ>vbpGxVN33έur i6˳0'LmP i[fřnk{:k7.d46h|xH`ڳ6ɒ4hCld_&'O. ONl'=H ,-xvȭR !?t_–3^=lN}@ QVd&p"Ddz뇍Ҩr& }.o5ZU(u28Ze@A si>5J!~ڧ͍edi_\2ZD2I<#yVlvН)fs#|ƏqO0ȆI <ʙpjH ݏ;=g[`.0䤐*`ʹTN>_tdĩS8>EcR6-rEB\ncטel|:z6SZrŮHt~ױK\B2'ZJmU놱\Zt4:Xd?Ax.ĩ ? B&Z;-L|ato-$sEg>J<9:i-kϲ34IfO[gr›k>:Sw}B8Y2r}5kĚǐAC{B_)pLזK,&U,Nh!]c*T8^5^$*h=>^ߡATL<&ϔ}l3 K.RLYgo?,pl5```(n򤬛O]`}Xjf [(M{NحRin[:oPFݦ5s۽\)JT〻神Ցī߇-bC:% ֽ\TS -L>,d$K5 yHV%E|4YQ-.Xև*_8:q*=X` <+u bFxAcTrkm~?G41000'y =0dL3dc D(ח79IOAFpݪvOH`󰋋Ε:@G# {6lew֪uYY/.Ȼ.㦛Dȧ@^h@̈́8Z #^.$0ҡq:SF,+8"yNό6#h"HQ~4ԽoCsA/Ϛ-@\_AfMc```_sRZق,"qٙh0*,&pĖhM B=za$סWi,'Xlpg`i`HTEXZЫފ!Y0YM?BB|ˈ]u~u6>.b```(V>opsRYgKEY[H68{d[?w[&PQfq>P ;~ 75kӮUjɈvk@+:B8jd'TE\;Z)k-LE*eUV<NHlaOkc3:7;#E AU1nf v6{EjR'O2_yȳV<Pb(z×Z ldNTi}\mA[ߓ̉ $5Yծ2Ip~nA+R%O$Jq}9~k,`H $> yfEB?PA,**h9Jd֙mQsɌe2?(͗"{Tib```(Q m28"wQiwpk* IM9abMZn?;uqwXd1B5ĕjy[*D1ib6ikG\nȂTI6Mm0N^NԎTUpvH]o_zRء .R] {UuryMZ>#;vژ?~˗mhZ̚5 2,q2eXdI .p??:OJ֭[D>>>-Zgڅ=uP2u(bR`rd# ',p͈tQEEՂKW%vNc9|[wR2(Wysk鍻s ItzǯݷNo]s^2C+*-2kёu×˹?ʐZ b%%...޼yVٳg+UT$]y<޹ݻw[.,_3x 6dee!H3hrPE*нK`>Ԅ^ܿt, ݪ\eqdN<<;ށTgԥ? s~><Ĭӻfw%1"uADfFRgٌ\痭|2D(ϟLEZ~drֺ" =:C{#_e0^۱ϴbQ9T bd O {:*M'A<{?J_(FCJyR#<Ɉ;u*0z+ حb֜> ƍo߾*T@`whѢ'O+}]xqWPxyy?_vfԨQ={6իH,Q)]vz/pK?` 8q{4\rlΝc/={L|EwXB!jҤ rrr  0>oܹ323NF~BٳO|R׭[.Np݇i FX+&SNAfhӧOz @TuΜ99sӧOiLSVP/{-Q@322¯]-B T6P޽7=0a„:߿|W*UV 5nX:RqB~4˔)jժڴiSh7M ?F5kD!OR|oѣGQQQo*~(hW$<@Hp\ @o?H7fɒ%ז-[-Z kjj6lbܹP#88VRR]`8 ʧ;߰ګW/T~B qҥx(;ȞE}鯯$?*6WV3~7dD+Kz@n&%x(X(DbD^X[ؼ5;}@4ܡC+X0ݻwo.^u!θI$o;Tt.)/_4?7Ifπ@8::*q(ClG ,s̆{<50 A .?nf`R"><,E Ǟ9ao ?‡dL0PfaAw^101§ d E7|OxMeYG.!TAΠ8RÇ}A~}ԩxX4J ϏqHS޹pΣԩXRxyq^pfoZO (-Fg<#ʥ THCY~2ܹs5(Ko  2ԩFwܸqC rk׮a Vj|;XWU%UҐСCXf~!gϞwI.laE XaPq,6;pYA~aRa*  2l~4^ \^u D ,`1(8ȿ0G=/b|^/*U #|m ᾲk `q9 ݏ~MHH!MZd3ZGc@`>ҥ˗1Hdz㯿õKYP37Sjٲe?5͑-ViF@-նm 0CM9a_.\jec{кuasνC.n}m *X Q awR1x~{_@Hϧ (滀ׯ{:N68> f(O!O_ | Ҹ ߤVZ `\2iFb  ̘gY k2Z1""b=渌;hҤXʣS(pOʦ7(ԡ< 4nD8?OF2d.Tf@#G95e1< _U`|}S֬Y rjz!#pL޹s `[vY P}d]Wc<7fxIǏ@!1hi@!L>T@~݁$+ ~ `(ŋ|  x1f!xWȻ/?Ƹ!PWB~,-()Z#@xBt}偁J!(cY=b"@0^Ir"X-ꤻ9Z%ڭBU6(B'$5V8@x`_gϞp:A-|x<+,HV Yjk<(6mڤ[q:d=z}(... T*?Brl꧴Hwr# =#FR_a|YΚqX#aqň%-szi"הX ZCm[>r8p 7Bz9t]ܦLɓ'ntgς;Ke˖42իW/z)xS oO~TtttulOHHHraK@1(L6gŵYumڱc6DFF񩴴S ~9;;(ز ?#\PR=݋ؖO.9!R[gt=+<_A ~NZLf=,%I@:֤"iӢ߬䁳N,l,iٿyvFzRpp]} Ƭ19Y4k0s6m%t9t ]8 Lv}ܙ#EpO;w\+g̘ydt qKO *cHHH=Ԯ]ۨA@ "R% X%c]t>[K,Xm۶dx5k$ýLKHhѢ/^$ر6XƃIsdSP=`e֨qmF.<<M/6N  4}Mam5`ZR:XUUaaԫFEEWzU8XUg94Y@,V[YwS|j+u!ëZ;nݺ&pN=sjHtr;ny= 7QtrMZ|-*bRX N0kOwPW+iZQG?l"Y`}۵W3.ovJGP3ۖcb'88xҕ+WfᏧrx;:w\Z5CٌCv cps (j.vjւΝ;@_[~ٞ! <W~LLLX{\rp(22r>V0آw0:T(q/ dҥ?ˤ0>q[.p.{m Oֆ1MR*UpvvK`)7FޱgϞ?; UMʕ˗~~~,k!@ w| wS`EabQl] ȫzj?l>qϯL~sJjq""F=2h䏐ܣbm\A (P+k4 ˛7o}DNV @ gוQz/&SVi@-ЉvZxdP{3v(b!KL2)t"!毿B4x.|_-sp޽{`Jn0xR%HV}&xA6qsc(nfsM6K{"!_+HܱO16v級^{b+.3ψ~w YcHiCGA9o?ߺkn߾g O O!SM۶mBegJbb:8m˗7KM6= (ϟB'ifr @^O7FR@Y<~{&RAcfB?8;O0`[(A3(K X9ifE~wߵk4(k5@Ak*yJPiJHO7<'ň glRit9?WoAF1ncÊ$JCb8v~dY92pkglaC@r&ur*~PY3U<7JHw/n@L&}(( \B:p@C.=ϋ-Wx(z*O+d`:TFv'*6qqoPVs1WK\;d'y)r@p4 Pΐ&].4uvb^|j!ojFݿg@$ LaQ } BȤ S_x; \B8|!3g``%3gά5&ag r `¹y>k8~]̿1}9"v=,$2000|\XN!NɣGUY,"ʹ~ueuzZu(>GVZt-KrcZY &yV]}8ʪ9$ ES uf v.r$UTul9AjyGPA.13TF>[>ݳ+?,gp'yLh ȧBKo.,#ĈTI &=:N0AY(+=d&!Ev2"QkAu}m|ct'QUY]RcƌGS kA#HYBO "~H$uA"%'u6-qD#yNR2D* s'H`9D3000|j ˮy]& $W`oϥwsD?ky 9Dߒ\6XfH wK3cTN"T*VF$QS ]HȦäQ}F$HRK](Rk|OL9[ǗoU$r4oEA ɐ`BIR4dmH fU,Fȕqm E`,-S)J^+ ` ׋A?"ń\PuXH'+jq(7\l(ͩG bqxB  0dI[wC7 | Y@\4#RxOH"<0*PiH́91< ro,jIHƚ j:Di4A,AKb(1A #:&xGkln8=1pA5ER"&qduƸ;3q{u8x \jUMC|UsŕRQ(vQǚ1TUȷsZb i8v;5v k.`GT< Ɂ~$XYSUIkkG(n0Tt$K\œ F`zS y.2[p17_t/G. BW]i(c` x?BX@ ,Y`(`X ցM`+ )p\m:3ހ>AHa ƈb8#n @B($IAґ,D(|YC 5O!8riGn!.%Pjv(rH4fh1]Vn=G3,1q,l : W{q]qx=ފ_=g`Jp&x ,4B)ppM7D"I'zû1MA\L@Kl&{I$1əO!IRZn1eR'YlAv#SRr ||GѥR|)1!e:e)erIQj6uZG=IC}e5^K5WRkZi4'FSҖvКiht=J//Oi3Gjs/k?סpt&TйӭKѵugVҽ۫XoY$};P}'205031N2: zns=Z%FtsrU]uqot!qӓ9{O^^r:.ot7XbO>}| |11mzqdsvs˃rgqC𐲐Pu¬²jz=g7G""#G^XﱳƶF"#E>rG5CǍrܝhhitC ŬkxUǍw:?%~W -I:IiI5IoCW$wL5aք)&)TRjRމWOLL+M>~RѤM&N>2Eg ʁtBzr~57>G< W D'+2fg+dEvD919;rssI9֩S˜e|=Hvh,0  MKvHHZtaEӟ8!2r漙gqfmΘ2z΂9sG3ג%'oZ``߅W[]*/ % /Zs\kyEł~CK2-Zqqtw[Qq+WVzzP(tTFU6Yluuת7]h 7md|Ӈ͒7oJZmdXd{O;;:vleki-ZڝҞ=u.u[2)#`= ↎ƔCc45e/;[:bxdQGm5w:eJN\mv2SaN>v᳾gck8u煃zzͫK>Ǵx+򮞿}z7nt|z+֋ =N]ݻLU#C_xCg>v.xL\ISº.1gg}ݥ Bτ/2~{o-{gn{?<㧦ϑr S%xL> >O>;H @F-dU AuwjQd}&>6gT곦JlYu[QC"·B7eXIfMM*>F(iNx&ASCIIScreenshotn pHYs%%IR$iTXtXML:com.adobe.xmp 1522 Screenshot 1062 JiDOT(! @IDATx D(aEWq~".A# zdQAMdAAe_]U6QYEE<[鮤N9R[ʭ% R>Y?pN 8'pN 8'pN 4EkMo n17pN 8'pN 8'pN B#>-HC '04+bVIQ)qp~8K\?%`}>a X>'@_ t^ϫ|dkDW\7O;F/<%`}>a XyXay 8'W]*=ى].m̐?*68.罼|<,sp~8K\?%`}>}N 8躽WG ovŻu& WUq<,A<,sp~8K\?%`}>}N 8躽Wo77䇨LṮ+xߐ9["yX<,sp~8K\?%`}p}%u{==n nQs]W!sDyX<,sp~8K\?,9'Jz^{ݐjܐ2纮}Ca XyX<,s<+yvC~MpC~뺂 %<%`}>a XyXay 8'W]*P)a XppNnU 6 !*Sx 7dÖp~8K\?%`}>a X>'@_ t^ϫ|ϷCmCT*{ᇓ'>j6x -Y|śM@bs@wΦyruyx{j9ˣo~8Acf}3޼t#L S@ t^ϫ|ϷCmC;,Z(+_Wɫ^կ~u׼&y;ޑ,btLչz(˒׿3Li<,X9[ΣoO-7ay3Hog}/˱"\:/<&~t}C|9眓~2,<᳣xq UZk%/z[/[J;ЋDy"{Uk~ni6xw'o\z[ߚo^p~|Λni}xߞ o0n䤓N2|CJ^zG'.,sOzғg/ _v(>RK-z{>яf\B7-?)O~ӟ&7|sww/-o&Pl~ʠ l&<)F_|;sڎ 1s{l__rclP[lV%5>ay<,/1[lEޟl͒/ބipX$ڏ>ߛ/V[> L/n rGX#11v΂?LdV((w^/})=MyA%ozӛ ̨qU.Og?[NQ{'[6`.72 OxB;JIW\,9#F%d, '0,Xf$ mo{[.?H'7|,|:xhbnjdXĠ<ޏy<6뮃t o_2W#V7ƢM,s:y|d*19_&2;?J܌|vN EN,0˘ʕǞv*e$x`6+?002Ͼ,,$5zֳ,gaKWyN@󰐝yX>VZ)ky/x<,q|]߻jOyW ]fy`d[uY' n??fձ%eǾ)ܖN!^{%?O]vP\lj^=ysJ$5&/<)b#^,f5q}v*r쓤+M.n]x_\b A\!k>`׿>@?]} X1 (99J.[9aH9r }[uU9FtCy4Ѩ+,ߐ-_k[LRj91Cm%kc䄥f>zny^LC[ӭ7_c_'?:mgmԘwuis.d&tM={EȥLlO ySCC<_0nc妻q`\rg 8b,sc]&#t~\vb[ miSo\>ϑ!#W7bRp1.]ʑ+ RK Eru<h\t̠?pS鲅bA:4H?`&ȧr 87g!tHG:bmҖQr%k3P6Xcܗor"^y<B|o2R?үF4ctFʌb#Cʷ6n >-eo$ Y<ŕ6(SGi1$/Y"MAwyn~m2qOG<Eх]vYDxz,V8@ q!W>'xxLm# }i1R7ř|U3[ּ#o:yxqJ0fCO;4Y7=+?&in_cwsr;m&85p<5`Ϫ;qѐ@r+g&;q Cnd?'"0%A!sGuTN?~ۆ!@&\K!SA|\e3ubV5 )s,acI7`bQru>)æ&ڍ[LtmC>I#.{`9~07?r НNnf 8Ks&zi ')* 0E⣱LjTv 0tXtzG_//a(K@u#ڴ#,QOYhta9_^=b奸EH+ |u:͘01L;igxhrڡqt|~A?܈8#L+:}<#释A'4 " ˀ]]LT <봓A {y&R c0'F(řLn K&}!mǬJ UjS_{G~0>bOObPOxL_%C>yc@C/mȧ,-S+1K뙒:dtg^2T'Hqb0$mڐ,> {xWk_-֪9'b_S4sҮqԃmmXlC}Fʡ;6EC/dẀb&ʭjg Y('cJx91^bnrJPb#^pb'{+!}*Eq?6:s҉!WfDѳeE@H?P Ͱ|!_p  Ӄ 믿=1$~B/TYI`Ut2C$HQN!}MciӮivQ!\h\lAzc]ΏlkEٱrŞ*ύ\ʐ_l:/Llӣ⌹>Jn1چ|$#>ƣ꽃W+^hKf0 0:_$([5.iFV:4垐Â\Bfʄ5b ^fӈd e6GRʬTeN ee8PQwyeeEC>a>gcyH|z*b!\+{Yu.O</vGѸ/ך>򐴆S&AoV+I;P1$]І!lB 1N[`C іs~J fvjmikOI{!<*'֞u^ ukǘvlV%BBrNXY2:&0o9N:DM Y>}]VBDo@Co'y~Vaڐy&`(m*vhӐO](1_sl+[IFM1{Ka;vaX//#GpN@m ŶNqĞ ̊[Yk_O'+_{BX1mm{$]fC(ۇR! r>5vJ-WQ=5J.ߥ9C^ (8JnR`LDMX$` ,{((2,ӡ4,3N3|׿B|tbx)/#᪆| '+Ļ!MYh[y 3H4yÝ nIy!k3<~L\=$YhOEx:dȯ'ICd!>@W<5#ݶ!_Ol+/i(5ŸE7$7) 8:b_;̐u=ɉgoːUW ϡ]7H_A[gISY: r=5ƐwHX.S<+/ԫي򏒫W"o 4F-Xh5|,DLDz_{=3(Dť-l# N+^ȐPtqbXb~6.v[^A7e /=HQL{cʋM·d|c EȰF1H]>mSw~L0=שew=}>0Yr<#(ǏP;*wŃtry/^ wbxL1k'fUCL9N/2hLr5GxhО,U uWۿc(CL=AbyOѫܐA`s b5h42+WS},N&H ޵m+?6ei*#< "㤓NEq?Ffm T1rD?2(3`V[>CV!vQ;o}bFxqAV2Ȝ䃼?*zaa6\=qTq`Io00C~[A@v}1̐ߗud elS 2]XɃ7mݦVٷ. ɇW>cX{{_h!q5t p7V}8vCѕ{>![A}s&9bb19V~a#Nq>mEkC.wydW5?rp@<i&Le6-߱/}(X1m^abj{0CYge 0+?&*DQ+=1r TE۶O|gSyX|"ZhQ@a얊C8N+Kŵc;2Z$qfkx/T gւȾS"I1z~`=0Y/\c~qoy~Rc in$xc؂g&E'3dՃ>lysz) !BwyPEgîXobu${Q,_ICc_x)m8!qwb}ӪG,=rΟ xk 8uu{OGYWp=x N2(*פ'>5|]N뼠x+$X~ܞY]g>H]cY8tR޶ >eZ'+xf0qEeǴzު,/{.?ʄ"{E༼p+J[I|ð\~ *qqz2=erꩧf=Sg&qrK:3IPc ׊G 8' Ķ2 i94yסjӐO[.}md)by}n Eo{ȻB*+deyo]wdGlz+pȧ?d_|6Xr؆|"bEfsO6K/Cc&sa(C$6䳿_>AG^⋍AQEG*Dq[=#Ark8#z=Bd1Arߌɋc U mҢ Ctju:a/ e58BK>GzFGY%=/m[?$ź1/~\Yoq%JQ<(o傺ˋ}eV| px0E㤬AWb +PFd&, k(̳֞6VQ2.d~^޵ӫx0dIxf'ͣ'XQY 7) )H9Rz%K- i+tI 0s(8r}1M)Ҷ~~ZS^f5Q)N]mS_d!90ނM'eXdhp1<0t=tdÉ6Wňij]oR={LG 9:,r|ah'mJow̯c(NO!񲪏Hhbh 8'H사>6E_|d374i5⹘&bюogcv5/\%b+ev%H  1.F>cl8lEFr5,=3lq:=10Զ_(Sy 7l*r߈!0"\wtAQ4^r8m׳._!=Fx :I!D:nU^[oPe6{alA"˳F^e5r<XHeĐ{Əz ȫRNysLn:?I;ɋ^Ҿ ?~Y3Y-X0޶NG[yo_yk{Z^c謁1q/; \k2Miey=w'< Y0٥^Ӊ8Y8;]Yi$5$/xW眀OmD oxC֞mB>m&ρ%XLL&F>BWr%I]ɟFʽƜD,R=mŐ/^X4?Or܇Z ʉIeG~nHVXa$FJw&e_|rݐ?N)ު?wi#I0/.˷,睇%.f}{ߛzbu&17-k<(KYf$~@6.lYߤyJorvxx{jˤO>OpN`:tWo7Zӏ%;sFNI뺂7)aK} 6IGQV<,b%̺OCm=~#I[ Hvk"&c=Hҏey=H?{OGմuyX}->ΣO<-N 8 k^{ݐj!:7ga$s~.Kcd 7J+躂O?ΔN?udQ>Lrч~wg@ N$&%a~-s7l?l~~qV;<=e'_y􉀧 8'0~~ͫ|ϷC-D믿>mBiKjdW ^@\&x_!C=|)x4qiGw<,>ے#8"p/Ywu:9kGIrH?>я~4y3+ ѫ$yX0}->ΣO<-N 8 k^{ݐj!:7躂WOqw8y8K\?%`}>a XppNnU 6 !*Sx 7dÖp~8K\?%`}>a X>'@_ t^ϫ|ϷCmCT\oȜ-<,sp~8K\?%`}>}N 8躽Wo77䇨LṮ+xߐ9["yX<,sp~8K\?%`}p}%u{==n Q|>8 ߹N8!++/GyXu>a XyX<,s<+y^qU+-Zhh~GZ7Eد^^<yX<,sp~8K\?%>'t5=ߓ]n̐/MKCY(G 8 yX<,sp~8K\?%`}p}%u{==ߓ]rǞ*M]i:^^tVyX<,sp~8K\?,9'Jz^{jfR+EGE4).'L`SYa;a XyX<,sp~XsN @|TwU#ȗnoJ5ډja XyX<,s<+yvC~MpC~뺂 %<%`}>a XyXay 8'W]*P)a XppNnU 6 !*Sx 7dÖp~8K\?%`}>a X>'@_ t^ϫ|ϷCmCT\oȜ-<,sp~8K\?%`}>}N 8躽Wo77䇨LṮ+xߐ9["yX<,sp~8K\?%`}p}%u{==n nQs]W!sDyX<,sp~8K\?,9'Jz^{ݐjܐ2纮}CO7oNgr>6ygGQ_WY]K;#Yi^;?غamGꋄeAK[k%Uo+ pk.se{Ye/K7'na^3Q?$z׻O<1YjF_1^I":zQi'lv-K`w%Wߕ:rз;(qg$ < AZЃg>󙃍7x>ߜ/|a~{:H_ykk&5==ܓ5+bLvj|lyHgԆ-`ń; ,zD\~c;0H;I&~Y8G9HA;LX<[vM~q5XpoS'!iL_$+L4(ìoS??(3϶]<$̣~~O t-oy@VYe-SO祗^:>=Gqb<ǀ8Əm LA! 2C4hza[Qӟgo}pu m U gG m5vt#0n4ye@]0L׋}if brR',C%Sͪ^M׈&w%WXv%?FngR&2tMyAx7aPtĪGt(>OaV*tbnITcxХNڐ f;r]wd>X01b _)ӟtAxNC9KNq b&aJ4VϵU |l~K@ hɫR_?<L_:8]:^d<8[]vY`k|~ޖ +SUÖ` H;.[E\JO+_eV1A/KJ7y:s^_Ȭ::}s6&0nVOe^>1)E~7кVs1O0]JpJ~6rL8eȗ%TNFCNf++37U#xqP<,Yw{G^&g @IDATfuW19Jʝ#[ɱB@A3`R|x_(CL`URU1 ƍ4z4x˷zoCbxw%WX|=L~!Q.x4!Ecg0^|IM{\ÖPbh;7J0X`'KآUYM^t)a&w}e ,gcfw3aζ"kqV70>lyS~8!_I?9X}6#1Kt 袋.2}Q(ւ1ʤUkR1&BpWU8Bv%+ +U6o"w,C}g}*){ Ƹq 뭷^0d<۞TU->aK$ۼH3$B/$.F➲eQdlMcsќ ԍc$>oVϵMfQOPo۵#q˴G?b ;s6+1}s}aK4Ɛ`NCKݐ-Y%am% ^{핿>B 7˜|˄4AYغgfl60e392HYe瞛FœFqla:,.t{Y]ЦcE[uPlk$:&u=30-cLJYsV'2=æ](+l{}gd[aRd#gxEv+N1t%+¤+rַ˕rːO$z4|8klq bBwУU5p8K&[lw>_y6|zO`8̴( +f)lۮ 4c#Pg\T}Gn묳N6c2hG(uˬG?wef` 7pWmccՏjNohaˮ*[1MHCG.suC@/}abȧSo?A[Ꚅ b~6va}3aarar{zrΌ'-.#}7|slVpR^zi&G z'l-UaE;lؒȊk9\+(S*eT0z]kZ_)C]([a(1C5u+]n]ɏۆY DZ Dr5*hov+}53.ၡcDv\R~GyXBUxj]W̓:t l%̀I',רmɬcxC76cB'?nD'MPzԗY1~hõ>Đğ6tmȧc/!g10rEy3luJQ- uQlǪ )QFC9${xr{n8b}}#>(8=(u'騣ˌ|ĐYnhr&Ϡ:+[_BG3,ЌObL{a'} n)w&khe멪.F~8J~WrMWc䶡o}+e±C>dPp`aҢkg_? 2h}_,c}4Qiϸiu`U<\=p&^89a!lF+/)uG !U ̣Yc){9Q0>Yn˵#*expV|O0l>)8<,=mGϨZ;iGnaM-*<06dQ" Vmlt]rϐNڐϞҿe'8fbe :[y'e7LW˽|0TWCt#*H򗰡L" l&}X|jU+?šê8l `aVd 7?EoX!ЕXx&zl. P`lc؊%ׇU1iZL{]L|C*בwLw%Wt%&mZ6nȧk :*12eic1P(ܬ1q W^9W>1Љ` v98E=,shqVJ1whξk#WG?[-l>L\r;'F| vbCljҐw䃞Y #M-3Ebp/D4|nM6ºcţ^ecU_=5F߱ӆ# нQNv=-/SV:cwU*_ix*?qm+U60!>K)i>zPVǑ^XSѵjw޶;Kx/F ӆ|~y"iCXB,uh rmaV*ӍnG(uꋎgy[ne2nҮo<;&'9[Uyy{DB xsz?|[ ms lUsN|C #s?Vݼ+r(desE/e~Vu`tH 0~ʀp/8%Q$#]Bieu/rlYD_?ܔ!:GꏪuӉWo7X|efA2W;F/}Gda7h0dv l29V ;+x9["x!!tpڐO%:KK,anZa 0SjR-RSڨXGipmGL?>8Q'.-xԗYQG?`HHS|qҮO<| * ?H_9ԧ_sܙQr,#hc.輬gKX+tΡ='&l"8`9[n%Oakf[┅,E|P2r`=&23>YwqÂedv::=/en!\/uo/ ^4-V_},[ i'[uAF>/׫]ЪN{]ORyvC~Fe'󁡜 rA!3%Jg9K(DgD᣺2@5smw QK:f'/^ '[=qYO{ R &6xhѢL&Ix?G9 Z.k>F}l }8e}2ʎ!N#h|4OFʎed;_nNzߕ\)\)q,C>l#{k#z{f@H#.{ё+𨣎Z01gRsdbxb/ĨOZC3p=t#ElN NҵɃ iXl$˧kYmyR_D'D8q󏅵ͫMUˬ2NfƤ\_y [PCr:Y>شяe9>aKkfBM%FE%gL>oˤ1q]wu60)V:$Gd@FP ; {3ሏµ,KOʦ.F r?Ї C}z(r=C%}fllI=0[CPπ衄HؘAP$yiM<*3Ch1N ӜKggt0$ݓ6Yy啳kv7IJ8Гɓu"0Hn$N^%+B?-q7z<,:)OIYfd(IԼՏXnm~x%Ua|ÖgtBYN*_:)^ZMTOxy8aKW_=aژ'LkiLռ|!?Tܐ2纮}C9ק4E) ^[3*PmqC~뺂 %<%`}>a XyXay 8'W]*P)a XppNnU 6 !*Sx 7dÖp~8K\?%`}>a X>'@_ t^ϫ|ϷCmCT\oȜ-<,sp~8K\?%`}>}N 8躽Wo77䇨LṮ+xߐ9["yX<,sp~8K\?%`}p}%u{==n nQs]W!sDyX<,sp~8K\?,9'Jz^{ݐjܐ2纮}Ca XyX<,s<+yvC~MpC~뺂 %<%`}>a XyXay 8'W]*Pe_q 'ףe<:a XyX<,sp~XsN @|Oo-Z4 iȿk݈?a.zyp>a XyX<,sppA׼|O~tŻ1CD4Yl.fp%<&8a XyX<,sp~XsN @|OFt[{F'4uQyy=JyXMr>a XyX<,s<+y~tIՋx6fѤ0?NUwge<%`}>a XyXay 8'W]*g|S+U#_fx!)h'N*e<%`}>a XyXay 8'W]*P)a XppNnU 6 !*Sx 7dÖp~8K\?%`}>a X>'@_ t^ϫ|ϷCmCT\oȜ-<,sp~8K\?%`}>}N 8躽Wo77䇨LṮ+xߐ9["yX<,sp~8K\?%`}p}%u{==n nQs]W!sDyX<,sp~8K\?,9'Jz^{ݐjܐ2纮}Ca XyX<,s<+yvC~MpC~뺂 %<%`}>a XyXay 8'W]*P)sI,}HgM 'dnv^ϫ|ϷCPmCG}ݡ8sK,DO7oǯ~%\qJ+?/ƣy$mG"ԱmuViae]k%e+~8|9餓LܓdeIַ&'?ϳz׽.` %\26:89{^o;Ys5<0@iM|ـŖ[nAO=Cٻ_z|&qQ|ٻAT'{~_'guV֖aCN#/<ñyoX4(}VmG:tɣN$6yTяO?}OzA{󖷼e @riN=&qd}EEXKvr饗 _B#HjK)Ǝ1=y#5e:LF8Z?tԝnRwuk_ڀvXߟ'h#{QlÍ}M,rx4zvc=V]tQ8`V\e7&nix&WuIw,O'U&:|Z{wuU|W+_Gn6-r)16o{Ί8: O~F\6Gp+?h{Gly6 'yX1mvzdɒq1d 3?v7xP#oW+,# }\)c7pü RSf6F|M8f~\4"bn_̛DbxХ򲛵!v6=c2BF~qr3*ѻg(|sm`fm Y&7M<$plK?XWթ6ʧ-uV瞦ţ~7}B.%/.+q۲Q-t[y^L}_zR&]~4)q9[BuxmvVMyz(mC4&* m;~u[ !R]ҨpCqa][.>s~LʓI*%2[v׺ߕ\Օm[Jpې/?!N4EL} Ë[b#Kf(,翘7a𐥿b3q(b${W_-qW 3q_3[wok $dBfh#4|ñ S_`]U(6x۬p 3z0s>yqD%gkȐOhKyя1ELWҟ:ld-!7xc^nRg%!e?} An uL>mgՀ0`euN 8#=nBƴL*uX@ꮺJwS纒ߕ\֕m[JplݐrByp ش!?P&3@x Ȍbxȃz?dF}fo]w>GZd<%IfwvXPsOi;iWRWͤy[{I@01\s?p1-C78j% fYG!oZYU2wyMD꣯g}5THX|d%|5>ʽ^{VkC>2'2! 1FxE~De[R^L4bKPٮmKĈ ?񼼤|b,4DZMq\0`2d*V!Um&d5LJdagU[2&‹wB ={>z%d;>>a|$8ɳ4sm~LjYtV_ɐOd+/yeu#잮w%W8t%?VnwR.%(CٲCQC sdA" #!Y e~_d$_%";юCSq0s=sYn`3yޗO}JGfV-^O /thb\_yĤ}ôE>1 *ʍͣNQQ?J?ᚗ]^OOdڐO<_g,@,?^đU6*zweVˋޖmv5aoaC8ĉA0<5~kߘiAY%>m@?c矟O 2@EÞv m9rDvm}'afk?=Yډq&0XL?$qT77ud#YfЖţ<_x!^+GqD~O}#,r~=`p'裔i2@ Yyk[d],:.|FygYg}c[Íi)[BvE u#+]]ɏۆY F x#В]-XnҐOPN˸f(ܬyX~SWJ%"vo;:w*byʐpma53-[o=Hf3QimGOL}iBrcm󨓷:wTymE|=0 >[Kղv &_t ]MgW!c9[Ux`[wu>}2F> B22p yNl]X-N+^ *ŏ?1 +:oh~6co6E]|r)^A1Pxr,΢;ec 3ϵ[R1x&NځM9:-qpL-s]w]nPd4dlۊW4-(ZHdp#a]9a<%cr+]6]ɯ# }Y;I4$irlʐ dp+^zLɀp`6 uF R0nj nC\nБ$ +yͨcԕIGRGa9IuVM ІkfFI_ *ka?)=E'3~GZ? JxÖN ڋ>2xF1QLgeK/4? M$avX{lce1Q@fn],щ3Ѯ!lD[qz8f3+[oR\}]f8-e&6%I΅V2Hj %y]bg5^CɶEE2`R4AD}#[GD<ݨwPe+:A,)RHUeZ&Ӫa3[?&uSrOx[{ߓ1k\p0} 3 S( /P.}c qN  y,mڑL s#bwC1cs-:IC y]ܯ_4y'~ ʻ ! &g:De13 BVȜx≹XCFp ҆A6ކ my*/읗6<,I-r&!ûvu r?3.0u1u(Y(ܨsu及7zW+\_W6-rKd)t:NҐѸh/bo~:y?=c!M6-Na !|^':d!_V@\KC2:7 Ŵ[zNbf? *:%9NG1]uV瞢$xTяuLꆙbچ{˳]oym-l ntbx03QK.|b4T4q1=v;:& ŀϑ0XH U'~׆|pqlˀ>Wǐߦmw* aᮝkBvm6yax eW\$ *EwX=pw.`U쇏^!w $mrYܤ!vwq[VX'i.;ƴe6q~^{WMPT]*5C>UVY%ohTʌ{U 4RYi؀ZqRq44a1AnjNOO5: §a*N^?)6|#T#cRdS{Q:ysOm}7\|)+vkȗu1>WVΏ/ÖhUzJGó1-bNuV&id4Icco!L.78 o۴MbORg] /yf$b/oN]C5@^I0cGƅ zU;rEה! gfj{tU 4!_fG:"4\gyYh$!"t1bޟr]|[P⺮}3SÏ{Y C9lrG Q\3~%sN n 3Bʀo[f7۶MUtAꏦ)y+&ʳ뮻ܘ5s1IAWXG~hk҆td\#_Q#PP[h{Z j{]WN}*Px)\U @yycJw߽ i' .-s42p?n>d2_F##6b˫yh2mC tH!!dѱn7z:lOLefԤ\[vPicc;-:<0ޡ1CN>(KzCV:cLOW3D;&5=pV%rl[nӿ.s暵?.Ze~2̞ \[h'[Pv/㚴M`FN;#:* ofWnPR3]ܞ{PqLqRxnZk Gyd~-dw-Z_GH1XW/E9oGFx>J:vIC[N{dZU z4!``:f^FÍT`QE4JlCL7t1P ރ-ǃ4_@꺂watR0# H2C4dԧ^ARLGR76xPO>?!|yAcXgZ j|Q'oui"8=}#^4"ckGݲv0"lg}kW(B]u &(hR4 sM&tx\G2@E~B-•#z)zkcG}ayV(S /:QP=63EV~#w&@wEQl"Q<(Rx*E幠lłC % `v,h $FȢ( 3gnOߙ;3枙^~}L/}6>-o>אf17`rׁ{0:&ek4f uʴk7 zm5A\ѾYhf̘5QEY 9}P {Ov'@IDATky N,Fc:\RG!hT`s%~sXNy䑾˵+q9syQGM2&G^G|[_D'bu{`Q\ \:A)\F;KGߦ!0\5 Wfaa A>8IK~ C}hd> {50~6!|Gm%GS}K+C>rX:/8@Cćp|ݽ.R!\W~m[ou.E" \󪊘WTWJӶqlÝh$G;Rth. DzeԩS}!2&MV$vzgV[mBL~U]ټ51뮻:8gK]$}VXAv9 3e׾6Ь9dF%:5rގߊ+g /Un $c>0~2/ggPx[M~5oeV;¼o4jz=$^ͼ m *=PG fW7+{9| _0֐XcL{]"^5~{xMF7<-n*>L|IY!ÃEy&%yh#<_FN YƎ5zj'?6voV)G~Mg] ).BN;u!f}5v摱s4ǴU&d\gi#}T:x 6dK$:2vwcF@"]1D3{lci%ʘʄk7 zDCJ5]ۆ̟?|4?\."?%uo4>ḫj>OL2.<$8g\!wew#ky sWfu5[n.WF?JC%]<.^veINv['x,\\uUs5zkү9ȗc?1g{g>ꪫ0+oɒ%fv07;zg?Ybo77쳏Yc5.}sfaSO=ev[s5\(F&L/"s7˗'O?6]w]Җr-I<<9g8zg{].=#0gqtMJZLEWT1Vo>мk_Zրy=ٓԳ/=[н׿޻~6s{ӛޔnޙg{׻ޕ\?pN/g_{eTaƽ-"E6SaZ^~ M(52PP_>~_L3zHoƇ> WgΜqwpoU'ay/iV#M[? ?'Ϻ]<ԗq-<{_'|Ӷ\+"@r[<^s妛n}[JR8Cɽ)DP6"y袍a lCgEhP3'{#WZGQ*ԇzwK]]*:< c=6~]w%|$- )aðm DXnܹIo5Hŋw_<3O;_Jӆg4=teAw Jx'/{CL0xUS[u%^#=d.mIp {?`}ўy6NYc/pHN۰3/i#F~YOw<#=~v/d<4E=Aos;&^ng hx#eiәPW$h0܋I8aQ}?/ڤy袜7o^R({|q l^u?9D?4o%㨣JtAtvOZ?9ᣀ/= {ƅX,ߤ,?O`T.S(G|z2"0D~Dֆ#%: x(_ iN._I2',|)$c!וwTM+,?$:J8!_N5rM~ð//TٯsOz/Y-#v@'=O/(\W6䡉CNKnv 8ю^dnj1o֐o;%:doDR<$sLwǦ:ԯ/FmogaUG<:Ce t?/zvCu~PM.Q,@>/Z }u֖uVP?'W$>̌I\ i/I݃ τm-(!?赦o*^T!֡omWǁ ?OhמwM=[Y1P*ϐ/~0}ܑE|{{GڹZI/yhz!$pxeS[9^)2_v)aag2~e%C>\w>2Bnd2АBxȃ _!5z=`R=Ym߆1<ܗLmD>0{}?+G6m,wȈ!9,WGexeX=mN!oݍmEb:U я*k{XK(1C۷hѢd>c'<=אe&alo&GWR`/r3,;Q{m!.UAJy1Cg׮ڳalw8I솣ɠ+o>K_9:RϧE^6(;/4K3="Gڮ%mA=4lS!_!LgU-|NMݴ` .y1H|{x%M_6ު+d42 HC\!_!l}.Đi<1f_|m=WVښEd,"Z4!&1I )e V]y.- ?OJlxJx=ץkT]]mV /4x8s"N )e `qnLmǺxE Mb4ᅣM:2F<*s//ӧOXEţ2Jw1i ߗ5S }ksR&8VbG@YJ CfkȗF=3/®! ֦?42jl RG]Yxf3^"kr<ɹMa@}>]#7W m?*A.2wހp``&%Qp KuU [Iv3f mMܛ=ʇ nJxxuX&J7{oK[>/18@(PC:>v9|kM?qn[0c;kȗ%_R=CFlh\(^K0"1&~aTM+l?&*+Vfȗƨ(4*ٵ]C>#n.F4}_'.kc]<]AC[/umq[ HO " :y@?O% jS1GApDCxi0I,yM7}3@w[wz/uF9(aF]tщL<3N0QNF_ ٲ ܋2:wOoavx>um-:uC/Ǽ?we?o쇍cr7g^}F>{- uX_>@HޓN:)7 >'f GD!aJ QpgGɵǘQ俩WX4LU[Wܐp<!c]H!_\4%`=0wZ eJ.]TZR>V]{޻0X~TY_Bu:xKk"au be ~ǶyK!_]cϩ믿^. |я#mq '@/ahX 0aH~l)01c9tViȗxf?Uljl(o\wҘZ&2_`da&K`fh T9q9ɏ;lC,ox[n%^Pϥt;Û$,w t*#$]ҶwGH~2WOzQ}@ߒoc}"`璏ȇl$LyrҐvMlc%q}%ǐlek޴iʨ@~]6WZLv)LasCv:Q!aaiqM8G4M\?]ݯAL^?!us J%5| \[#R^!Gc Ei\#QЏK]G֗l8]1~p|ɖkV.xeOps٥u\X߆|2eK,w 꼥/>C,^xN\C8ti@<1WPK;6e~I|+aLP̉k& # 1e^#u}:< J3kc))Ў>+6bMjaWu|7!_5!cn~Y@uU/x`l:BuHek7 zmG`h, uX _]\N%?t>:yӜeNn 6nKQ15c{ejXn&q r6"bYȣ(xmQ:t^y ݡK1F ۵M?Ck@!%WZ~!HڢyK@mkt×JoאS]֐-0F2muo c̳Go wŒ !}*F8Eq!’"~}N ُ>I|}.>` <ۜ)X'q!W'^ie2WCFXbdAWѼswW4 ,%=/&|t`qtwHyu9eNX?bGD6r TE?'CHa:xF1s1=8r:vL:mo~סE܊˕W^:嘪:7*(2[_FGQyW hخMAO(~(*'v7=sקp~x#]1<7c[˨kWKs}q:,K"XF}SE0";$Nn1?{ M~vZb"J6G~Dvz]协HcьI{18/~(Fl5>G ywuv ,."~\Ln> 6sgR`y"w5CX|{$}XG/Z( ~\[w@ω iŴUe\giգ GydX+Fh|ѹAK-4ܮ1V:P:< =vWpq p :uX_pѠ͚5Ku0i]mLCH?.sx0Ah$QNa1hI|Kg1Oq^-#RІa:ȣS[ywTסE mC}0T[GL}eEe硇R/}W(]r-A7胑N''Ȃ%6`1JO? a.~7iJa=03zߟk@e_ h$_h|NfO"61$LL߽k{lb7sϝ{I4#=y+w68!4~u#L'Fq\ p'i~j׋NǦCLt Ĩ:.LF||Ga:x`;UT!Um1i::(OEEtB G{.oy92s=}{/w ]?M'lʬpD8?YqqܭCg} GDQ:,5Q/zvw 4u󌼠?FzkvI:pˢLq/_9^_ql]< l0/9Fr#E'Sqj.5xFyݬ W7DecٲefԩƾI&+lΐYojVQS;k(^:󶷽ͬ*.T=֥(FZɳ5yYwuɓc.eTyDN nj~4*********ḫj>OnX ?<Ǽ_?,ȻKҧyc[<^*Iyv^r%ܫ_j-\+ m f…檫2{nҧ2e@{?I={g>ϘUW]]"}L>|]nSO=ev[s5\6]w]Ra7Z|P҃E]dn$NO?J$o7pw}km7'*M_6#8馛f,%w1RN7LU[g帯}k=Y^wA6{}{{8mo~;'GozӛToxzW\qń0x{i~;{_yu6c ' .w+_::cƌɾvy7߼gO?fΜV_WPS% ʣx^(a0֭oϺ]]C?vX_ץ¨3A59XZh@IDAT\iΤ熘|{>T1Vo]hh>:+I8Skhӟeu׿g?^{Ǔ{0$qKF#<.F5|&C:xoNξI;Ry/Kv}Z׎;?O+!apI}?&_Չ:x-枪pè/>Wv$_AH^(JI lI8vzTUD~U,5o 7L҈e?4 $=v$BП@NWE0@Cy*^g}zv6i$m_}">{G5a;{OrS[9^\6. o^*:F6>.:4Gzʼd)g>,9Dᆕ6CBxࡋp!2F;ϐoucw}:r`҅G=,%ClG}5 2".Qæg_ c=ٟ76EئW$==VC18ʛ||9kKnH{}0(g,I߅{-$߱aT!֡om- b@P*я~ǝQ7{g\u)?<42Wb(GFaD0z_F},3gNu[=.~*.c[JfTm͖Ql2H [aɬCh0c}l_솼(E2ϋ]u~sPϷhw=8d܋vu7T9昼[aoݘvۥi\`JK|C↉|Pn< [n"W귻tfp$kFEX6oa靬{E?е5Xc kW޲vwS񗍷*}JѰIG<\!'Ta ~ '.ݍRbe?yh!<ԅUteDBw_1{c |;뮻裏נ#HCSP`Qeҁ)6(ۨ]K?/_җe)uxX1\c/"0õM?Cr!_3*8c(B8ѺJ%fyQs CKX|!{|HaYfc6w 09i1 St~_*Y @$ 6~1$X^8HbC|"`({͂sz\ fwH50_M%Jeբ4aYRxO9<e?Y{n"ř=ù}oLC #}-FĐ~u:P+q1BY1+|1ȵj}k{RU^ ʒ @( *QpלzoSC ;^Cy|i]:wmiv_e?y=y{i8.y [=y;ʣ_8r=G{yə>}zߗ*ʤ.yi+#=g& (%V?C+2ctLw7ob9)(jw}.<`p~^{YQWj'pBq/Ul bxĐ&F36e~]cѸ̟/Q'#Cao1 c? 0FG'/_; r!~{ P>qch1#Q]~ +pkk2t'̳u K8cM7݄`z*pDeL޾w_n! Dﰴ-Vw߄SG7yCkãasCQ\=73ɗ.KB=hE7Hu[u˩RC>}8*osא8၆ i1p0Cky$q駧&/xgGףIg P_15f̘ċ#vu(JsLb)JCѵ2<kex ađI908H(=!?j<iO]5Lxѕ?%iC>< 鹆|ѥ317kVV^*~{w.<< ;R?]tQk^#x}]ΝAb= Y%t E.\00,r;bTz֍2?,u2MgΜÀ>83x~w$76v5xdo۩wp? D#<844h1f׵ ٥c +dTw|2ʮMJ]4 ͽG~ y9Q 3|dFÎ;䭬 BkVQNSݻKV( ƅM_SYׅ)HC‰T!֡om-J ҠGl%݈߮!߽W~zzg=E ̒zYr(.] Q.gд&Xٕzwm;8"cc?'/)1~ag#+-72(v1c%S12ӟt ヌw<c5\cޕ?rdX (2~ 0bAW2hGfRT;w.2<`|K~ c X.c]%Me]&Ay[א.BF: æVȽ:[׮~Ͻs.d](k0?e ]\'Fm\Ò;e]z!q¸Y w_^3QHd3]5%έOMB!p pWFiB.]`Řg޲z'䬳Β+=i%b)"߱S|ꧩcBߺo|Lqt;IhHdzZ|E#*;]# t)Eݝ&qӆK.c M#yhr1<0uEjRw_'|u9XvBG^bsO^!cxU?1Jyh1<bsz$/L'sy_`sHk|<{9#$ܮ1"\@lWG^Z.= 1\c-({mA ]cZ =Gh]GBxxcº ap̍54K0ZOqWdȗeXPy8Y}1+a;9(MSt>ˌpG]@OQaX%}iedt!#av ҋwut[o=a㢰oA4% 徘X~i:|K}ICk_g>u5~w=6 To]7I!J4dh܊֐~ GPkyNEGwᇧa̋-C˫-; $:ɑ8'SF}]Ȑ/ow /#/m1y'/1s|w}|~ljQx.ۿj1B^=KϞ{ 1qe rٍ2sн.%^čAPnPߨv ?,)Sdp%o:ȗuߧ}u0x]pn}z"7ɇG 7r{.4oWFϒAeA?34g  kM}9'ݕ_fe_L]~Aw^&&uto?%ҏ&!Ag 5":p1cNRo/\t=r]9/܈Á;sw}wNr,y{X7~Ц Qܲ Ĺ(zoN*Z)@~ޝquuËf H:Ee鮫:$I Ψ &z0Ȼ3?c=wIÌ<}GwDVGğWV#=ދHwlOYSiL˸|ӐG1mЀf<ԝʆ  1e, od"+kסᔎ4@ }(6n y/2E`0Ch$)ІthLDsY F:yHzbs7ȱAx yVek%/0TnW'I{),s_pџ+Stl~ K Fl(0~bq,~ۏw_UՅCR 1!+p(uz+fg7{R /U0x9aܽ"u]dMqu嗿@FRVȣ|]t0K}VFhš!6=k,Txџ*>,IqIJHh:-E9j?wG4O)|O[ρ|Fۻ#[Ywwa}9AP1'-FDOC͗s1uH~5~曆|_6代Fl(4zWdΝ$ ެ#ٲjZ&]!<ЉEĨ/3, aA߉'X4Ӂ#*ѷ;wnzҥKSC)gyfOE*W+o"q]y~c Qrŷ-6Ey?a.)5~>d? =X\#tT\z!{%m:>^ǽD&+p = C3a|L wM|kr3CuY#|X;->n|XGirbۭw( h]^CǴסao}cNJ?Ywr.h ~x=X^,cp˖-3SN5L4I##ƎB1+2eJlΐYojjc,SU0bx=إ]ݼ51뮻+gց7,͙3<#݊ȯMSO=e0gѢEɾ_ky]wyh_}я~%i734 >*********?Kw}w  Fb- ެ~(S_ϟ.>h6h#뮻O}S臤wexԩg}v*z]v1x;ޖ @Fy$h[/첤>v['x,\\uUs5z2e@{?fuM=g̪Zp/p Iߢ{z6qglzy[ޒ_=on>&y3{YkxH:uU)oug x_< a{_{{g87MyO8dɒ䞏|#eO؎C oHp7ٳ/u_qSna){v寋Bhyu1o1i&M-w++_ڳR~cAD{,$@iL͸|ۣ1񚼌dmFipxڑَL8{~yM=}x}[JSOt\Hyu2c& .|DCoۤۙ5,#t/8tPr m80avV1G呶81!:ċ8<C9DN1<p/<@NKr-):~G50r(s?|\҅2Eȃ<4-QG#a,ٙOI\h;ҁն8Ÿ,O~8q{B͛~ }>O$aOHG 2u?MC dȿ뮻)~aؗ̿/gO:’Y/߯:qHnFFk CD}'{;sraџ!SNIm6:B+)i]~'v}C\bˏL!< t7j󥭗Y]ҏe t j$ Ν;z'BVaXGS\|h_1z.'Bpzy#0;u`5H$}wټ$\|i8y<71˾{ N-`~<Ŭ җDH`b*534@K$ w=2ZT]/°k1%yF5]Ɠ1u!<K.- M@K1!> ۹6i kapX޻|^Z瞴e72e,C\ޘ)01@]LK$0z?MC /I/<{y|~B#:c? XBovZ"ni }zrn80.E'2:pX`'#*k7 z4!FrᏇ.q2^:xp#>Y9MW#]"!<;kr{!ѹ{pD$3t8[>w0k"pG3:e[yH @L{;5~曆ȐeCyioFd;$x1/a"2][(;]L|mto7 CN)r2GxY*i[neQt\~h<臻RRIhEo=F(CZ_0"pwOa\ݒP(nW~u7"FZW8GW˻lC#TV?( /P%2NH .ܛ`D I |7@k8b}aý/rG mN|ӐKE]4။̙3:ҁp2=u|qIgM]? 6K ~z#GlX%_t# e܌30ʎ*-CcNN4h04G(7o1{ /9b4\67e#6.W05`>eec8)j6c0X_^ya?xG>|`@a_rd[|y#(~(!QA]f$JZBGqD,g~m4+#IOvPkgu{{o">dn@$P _?MCBOI]!9? ፱ӛgic~7k: v#&]Ǭ*0v@"%w?Z{yޖz3c94'ONύҏ5Jy<4;0/Ůo6`;|Cc=Rov!sᇧ2 @ԍkw=*kwx}}c w&>$#Ccuwlx3$ 8c'9C9[^CI\mdGe˹i?o곛BL_B1t5G |lvF-wG |]Џ(* qò!Paw_ :[Zao=-qu>ХD h)D?~bkOxg,3 {q?+F23xfoݺkֻ{`ٛg?$ﻈ }f̲[`Aȭ9Y~a3\aSwe8/rd+؀H9!uoիJ5|wqgy'k1Pe@p_ܛ={ ?k&'mCFDbx bY:~TZlZկ~5벮N+҇ݵL_Zէ=!S  0Cs9'Ցi £&pnlWя҆pcxԩ!|ԹC9|1ؠ̰l(pЇ|C? GoUExY^Z~OI/fVW0qvJNiH%u3XNi٥|O;4cGj$S1Ѯhjd #͏]۬⊾;{T4,9Xl:uA]w&@UA@$X$Ag5]XP%aY.AoP#Fk9E|ewe]UWG_z{cG{.Qp~hR*ǰӮLU'8J+dڢɟLv ѢAYlzs, = C>R_}1`ZjD- Uݖ:|}Mڇur+c 2Ƀ<4-#׍epYgetؗ:uk&9$߁ev'>YnǍ]rƎ7.hrؽb,V[me[%|y{ߛw *EY$Įiob[nv[3<1So,#eHآ/%$Ϳͻdx K;lҝvCd㠸xH~RCޮ;㪟:޺c_ޛ{M޲Eѓd)W_}uug2>do7<|(⣉kЄx>c/AcH#9OFu?B+Ygz} 7k&ABa-zx~sGuXo}QG}’aj{S!>xx >BF72G7yR!T>L*-%%eD>co[ >Ʉ.#٭[%}7޼mcXHާo6KyX:~k%=6}tu ɦ C\ŏe{xD! mNg9"W*-cG5 H7*d믟Lseρ쮹}NI4Ƹx >{N[#Iy<ƸC y&aG흝a#䶉3-s:򫬑gS!^4?"ٳg'᠀H:@>zcgL8 /Dw8| p; /q|k( Kh{]u+Jc^)#_cd{UKuwܑܐ?Oq:VX7~:|Hv;y!5X$ב-Ny;..e)t117~I}l~A.FJ +V:ڢ'GY/wcup>iS&m<;g{Gb Xc& ܑgьiy8c鉭]"tH~8={3hfA9 FL{]rѸg9"W*98jמOns3udn<7[t`)yʇ0A@\pa?:v:8ם~1'ġ·mCHOB@#h@82+fvR㥚<ah}I7ZYxhf1̴AW!y=`6 hMkm}Q@0 KXpTf]~uγt%<ò0bihm&u1nХB h}# $,'NlO5kVNcwzFcVgUX3<3Ϲ06(`Ǯ#TZ} =ewV g;X`M7MӇtb |D蓀3ظ/S$?`/x鍁>RЋ| {vQkH:2uua\3tW%G>nԸ)vwobg?jvp.nOW\,b<2<NR#>Of..G7Ekp|mYf3|Q5}4 h>"HT;M'Ml2k6@$@]#P3㪟#WQmCy&%yhZ}&%yhZ}&2%QGDu6`cã#,x~֜tIK䭿f̙ ' @Nt㪟#WQmCy&%yhZ}&%yhZ}&*;̚5+FӴit%VK/Z*݊A1 @W Tig:}T:/vo2%B hAh hAh hyP" ^~曎|_@GJŮmCFDȃ<4->C<4->C<4->4J$@$Vq|ӑkQmCy&%yhZ}&%yhZ}&%ڇAHJ v{=o:}m>* y!D M@KD M@KD<( @[ nU?MGM#GbW!#]"Ah hAh hAh% h+g ttp_ 6dKC<4->CCD$@m%W76|]ۆC<4->CCD$@m%WfU/b͑ѰR@`So/yhAh hAh hAh% h+g֌]To2›Lx|3hO˂C<4->CCD$@m%W76|]ۆC<4->C<4->4J$@$Vq|ӑkQmCy&%yhZ}&%yhZ}&%ڇAHJ v{=o:}m>* y!D M@KD M@KD<( @[ nU?MGM#GbW!#]"Ah hAh hAh% h+g ttp_ 6dKC<4->CCD$@m%W76|]ۆ{juo4W\q9쳓 +/>O'=pl6dZjA I$@(^ßN:|s2+)\K,XVUZ'7|:IW]uUn&6{כ:uj쳧b$ޛn) /4ه}{8lgw駫swy~.+.JC a_r>$cXizۨWx`>4HE0XoTzڗ }4c Q>g_rg>ӳ9{7|>k"F׿N̎&x䥣h}A||p_6?OToG]L<ʞ&/6۬P MjlupP+yxwv{gȤs'6V^yeuUB(*:t-yҪ#mZ3g+uGk/o3[%a:҉6,Z=;"+t[$Ȏ;X џ(i_, XC6ao!zMۢz+;:3f̨%/vZAY@;u''|r¥ax`PG%ALtQ/bב!uxKqp?膓£=]#GYK&%eo6`Zk˰\5K;$.I/vJ2 . ' "hG@Rah0 x!$A9+n/EC BrFK✲Ιk!$Ez5}?{XBLQ&ޮ^#F{*FUC6[Х\GQ`:QWdd)|{X`6\ XeReg?@$-!5|qx^$1vT^aeB2^K,%M[^aS綨9eٳgT?O<`k?\d,otgX[ړCiѢsԛ:N}/t sq6 ,7i!ZBoF-Dbnk}0ҭU?ؔxw](xMh4đuUڵ!<ʶu!|8I]e2Q%]K6v-`vtKᾂ I?ۦ8}:b#Gx駳'>@vKع|2l#n0Kgё?9w@ mцȷ1*fV EW6XzA,EeoE ۢz[(%,ZE:\0::$iG6!U#đXU !<ߵkCxlOC7pCm]+*%M,*mN_ %;oXf2| s|NjZ9$/"pxQ&?%Amߌ:'  ꫯ2l63oRy_*b鏥Wn{ +|*G>F7 xWtT!^ċc=VVS[Cj(=3}hA=ܣ# ] 3j~K HNC\sM‰|zMG%ϑ.mMC}x/exTmC1zI)alŃ{ dlL51Ftk1^GqD\0ǵpt!Of>q1l1x.?<3 t@H{}]wfY#h+B+lbۄ6unm#Kp;\rڢ#``*󨆢?$_!$m80 p#ƺy: }& t(/£}'gm~]!/`$XݡInZ/F(᤾bX$:#eaFIn:ڇ8p!TFE9ܴ ]ǠxFX1Sב!v-DN]t6 >>/Q| u  -7pg?kΜ9É~3碋.JqpK[o=ٕnؗK~a/ǰ->zGݢ//熲L @T!5h\/:| 蟖!K,2M[^aS綨IPno9sf `Q;/9f;~\{^NK=c$nXXNz7hV_}T5*yhBEyl̷-_*>;Ƭ*>Guخi]vYUWwQu<؇)n>O%.> >8&!X'S͖[nrI9MDU_P/ncƮk QaǦ鎒?Q}D^{-1|_|eMMujMKVƮelп{GuՅEyVб v{&Tô0:ܹs+/ʣ–G@m),~.I|͗ aĘo~󛡧:Rm9o~;ؗs1 `>=ѮuoV\q{E}l]8vrܨWdp-X۾,0SLI~r!i&;#IpYgb9H 4Ch{Tή7v3+%J 3Kd?2z밷2zUma"pױǛ_O߸q`9w޺yxO>XGW -j:C,L[P06tbdO :-2LpizaB,ecB$#(:P|X k3l~-T_ywpɬ*e]w<(|Kz*!^HYcn k -!I} Me6Bt m#Fʦ|K0:쭌^aUe[To+ځ4oNޤXb|/4=m9h%M<42Cぺ R/O;ASuXR9V!6Gq )ԩSwձ/W@<&ꋛ_Xev ĮzCGȈ x8<KȈ: *GyR*£{kMxt?oi?M7$h[neIh74v Nz_Fs9鹾v4K`VN=4 h?"uWK&3z+/>75qOOa t0}vDq曾;'W;XYN؎߱N.yhdyBvYھϓsGqS@7˷}뮻n&彞ȯF" ʹHB;o:}u#ґ1cOG܏l0ݠr ԛ:밤yBtPr6Gv}*a'e=uhq,KYM&yQ_P'0zQ6nx‰Q>1A~P%Iu؇du u nPS!GSzo6f6x4m.Pu.K4ApPc&~wy'Q.}ױ-a@>XvվEiwAa}?cTz}9ǟ@"983 HE n*W㪟#W*9_|E\ǔ .p}ٽc=HgCcj;aKڇY@@prlP <r]Ǝp0Q8묳NWg֩N缤]V+'Y1엸l?oF`kcΗsB/ycՎ%se?x1(7DHS=o:}u#}xxK ͦ7~n1y1 NF9Ww\ؑ}¹܇\FGUwI]Ɗ42 !9n)3+b^ziu /wp]Ҭ fJdr_þ407u zHbBd\33]T/"/ZKYM䡹Aǂf8C.y&%Gu:ђh<1DC<4->C<4->4J$@$Vq|ӑkQmCy&%yhZ}&%yhZ}&%ڇAHJ v{=o:}m>* y!D M@KD M@KD<( @[ nU?MGM#GbW!#]"Ah hAh hAh% h+g ttp_ 6dKC<4->CCD$@m%W76|]ۆC<4->CCD$@m%WfU/b͑ѰR@`So/yhAh hAh hAh% h+g֌]To2›Lx|3hO˂C<4->CCD$@m%W76|]ۆC<4->C<4->4J$@$Vq|ӑkQmCy&%yhZ}&%yhZ}&%ڇAHJ v{=o:}m>* y!D M@KD M@KD<( @[ nU?MGM#GbW!#]"Ah hAh hAh% h+g ttp_ 6dKC<4->CCD$@m%W76|]ۆR(!Q.]H`nU?MG#GbW!#]"ex̝;L<7&Mv\"]exFK*ÃEy&%yh#2fo˶oXӃ?s s nU?MGq(ȿ ?3,f%0'?I{n/뮻o[<3fe1ǒ«;ssiA}Yi̔)S̒K.OmgǮmGDx7ͬY_nMf:ꨤެ*zPx뭷z;gΜ>#fEI-}vm͕W^ ^{/ˠc{Y`r;  <mѾ]s5yY1Ys5stBcEx c=̙_ެudj6".w}C'z"T6×7lN_TUmCQ}L>}`,{i33e,BI}} =PGh]>UTf.?^~,eaokioßu|'ٓnޡڳ gvjb-z^zi6lozu]{na>TcЇ``{p:sqS}qw,'e]jR?S EL{|')c9rf诬ԉ Xz%[uEnC3`G,nF :GbGiPM;K9 Zq7ɣQ:qG  Fze/cX%p(u;+*9* LJ{Wp}L }v:(*ٳgN\8HЅ\vA"p78㌴/ uY'GƝe<Ȁ%R]|؈xD#S6d.RZ~헦Cxxa\!5|n_}X;+#){UQR_/#-pA, XC6aom+emeG>F G?w8~/8;g ;:977|#0XtA6*!F%! M)dM]G>vI:1TFg_)y衇RgʃfW@IDAT>8!q-j;C?FQG/h;}NNՆcTQ_u厑n@Xfs޺$: xwL 'OٶkɁ;Q=_|i1RoPz뭓;$:Cҏ`rz'e-S8Ӯ+<0:NxX6Ex˄e5K bIPTq@ڥ`xw~hʼn(m\]|>^Xkj!fk!/ᄏp>pzd'@H{5f`(d p !YXc6mڬWʎ|!#0}|fΜVz< _;ZwGJ"vybp]_Ѵ&Cb+#P ea%ZɴAbovHsxKm"(9da&EQi£]#F}Fg:2VRcU~7iOexQ=t⥧9ϑRUa/ˠ/~k?S>G>)2=G]X[>TV/YJđ_ef)#&lh@H{ O f%_&/o5+\bۄY CsCٽޛ>4B^{-mܱـq;7ϑevpyMGkC:ФCxȍuN|#߭k.0<:X?/,#@~BO8_c89xPzFXWs#e]&(oW!]rex7 KKf`r ~ 2fxoe?Rv#߷Dwq #.9^F˾:ί:_40?Hrϕ5Cm˽;#cU:>&-}|8b:ٌȬ3<3{rGmі  ԅ-V EW6XzA,Eeo];TG>8!/bX蘹!ϑ=M\ݴ wQfb"M=FeJ@TH;p|lo6t9|Hmƌ:C<$}EO&J\-:`Btu!m/G];&xH"/ŃP - 64đՆ4CʡNqc(Ry| 9=X),!C ~xR:nXd;97Rw]>u'WQǓM|[Y3R"kȋgThC}A=:ujrEz;4CT}HqtImaٚ"$}mN%i#,Cp>ı0sJM؇謓GqoqcI*N"<$%]Ey`԰sёCrrE縎y8%Ȓ(뭷Jp싾^z)ݏz!dRw}M]瞛Ɠq7&/1խwn{Fu~2CU%%}slyEr_Y{Gz 2{KF}yx/^rI2+[q,.}IlvHnia[_'vEbCxnEs} |h_4"K?DofR&d} Bn"7:t#7:<:+9E80C?-H C/7W^!]ND[8Vw|xl6QneTCݼȦk,"EGh>\'5fg hEq ӑ8 g;clK9 m?5 Cbp~"}]Ɲ$K`Y3YlҎrq7 X qԍ+Z8dTPǀǙ_?⌮RM(LY Nt?]AQ{s6 ~lSNI΅y fߠ`"nvK~:c鏥WKu[Wݑꩧ||i)`b*x2y}Q%H!.8%1QfCtG nR7Gt*%YDZꋽ~!:|mĕʲ:>T=?T.#4.WG"ݏa)B<$mMсi[M= qc~[ NsC'ãJ A|iҺ:ECEut|Хųk XFϛȇ#QXz$tKܘ.zrNq'Ny)O /הuc^qL~[??u^{mbLo`|YR#_f|{E~o3PƑQd )>;ڗҖKS}+b/uELaz W)ȟқ2eJY|#s] 822)C`aT8eT+.ĺ.}g &J\#ݵ]s.ã.\WG2h!ihHbUE3pM= qK^6CU}moD謺 GFԡ2#JZm. J~#E9g+_>?6L:9vgL?G>$} 2"G8QRǗVk@H{d U?=\f,EՑu3W_M:|adH+G䗥VxpxYN vNK먜'SQwq=r.u'M@Z8]#x nkk Eex`#4ţmeU}ő!|,%"}slB Oy%$Q:8:q=s/#ߖqCݺ&P;7㪟#W0`,e?V^Z!k?HБGptnF6(P/4ΩLwc5n#L!#T0U$-+)HC)M#n!{ǣEǣME+B<)H{S"r~2QW{z饗~kwk}uڇ;`$G<ġJv|):fه-y.y-!ɇ>q .qqUl0I&N8Se4v۲a\e9\őe.QytQk"V[-ыYdyRbӧOO/Y"8vM7凼FăIh{]w.U?MG.UvO:5)zt`8+ICFÍSL-D7a!SgǮmcGDxcb):ّ(Y;|\Z:dn~Pp4Qg(:` nuzxeCmeΜ9=LMG5dIu + X8qˬ%QG{M&ya{ݵosaQo^URv"ЅWBuҏ97 >Ϭpc2P㣢n+؏?Ce3Koؠ/M6٤{VV(u%Q4=aAz pع/wg:ꀻ?l]Gq݆n,*:q\ǽ5$kwxN{iLgգJ|v~0% N{K  =f#هFM[,!څ1,7y'NGDiZH\Ni}+x۰.<{@'/Q<$nܐN? n1"Mkw?Ʉ@}B( )ySqċ7騹u[:$,sѹl246QR+GvmX0{oxFP7:Fc=B5#L{zG헡ThG]0\g{_N6m|ʇ]`}7yYXO*wZ%V1yypc@2Z}SN9%Hn]SOMU/d^7t!%9qO|3W!\F_u"JYKKFp\#[:|/Gg*9۲-"яfȽі_NRuC>+q= p Bw{ˠ<%C7 igգIi 6>;>mizfGJuc;3f3b_~Uw.6W.2<Νk&Ol4i0Gk&֎5K,DRo?яX`vV#[̒K.h=68hb :rD72<&D2B;f}=cG&\QQ63vİA۳b%Nx6i^>:>luxC-C0Zy,}X/ud4)k^zig1/Brx׻ޥCv9C +Z(<~Ho~wn>qly}͜uY}7;|VY pc=޲.I{o&_d",b0v@KynKiLg돎ŻV;Wт'Q'W>8&Iˤ hIexh D M`|2QSkm4cG;x;l$ЅXa2R()~5,g6jaqj{5p ~uݰO":]Ͼz ƀ-[n˷&#n #P3㪟#WQmCy&%yhZ}&%yhZ}&2?gsQG%ay 69#K7x5'tR%MT&ft-du]7}$zߌoA /0Y /W\aV\q6(^יq|ӑGttp_ 6dKC<4->CRwb0w֬YZӦMӑGO|eJf́I~ z|Kns=͇>w_M|?_k1AJ{M +X^:שV]ZI y80O M@KD M@KD M@K̓ @z\3kQmCy&%yhZ}&%yhZ}&%ڇAHJ v{=o:}m>* y!D M@KD M@KD<( @[ nU?MGM#GbW!#]"Ah hAh hAh% h+g ttp_ 6dKC<4->CCD$@m%W76|]ۆC<4->C<4->4J$@$Vq|ӑk+C ̜93)+׼"mAh hAh hAh% h+g돎z̙3 utDخ,/]Ah hAh hAh P" n}WpG,޵9%b20 0yhK D M@KD M@KD<( @[ nU?=|:k4eG<%yhZ}&%yhZ}&%yhZ}hHHb㪟̰E,Y9"X %͞C<4->CCD$@m%Wwؚu՛X]#_Fxӑ_i4Oтo&퉕C<4->C<4->4J$@$Vq|ӑkQmCy&%yhZ}&%yhZ}&%ڇAHJ v{=o:}m>* y!D M@KD M@KD<( @[ nU?MGM#GbW!#]"Ah hAh hAh% h+g ttp_ 6dKC<4->CCD$@m%W76|]ۆ} _H:Xn+{l#-ǮmKDx7ͬY_nMf:(3e*_<30/B*b-̲.sϙ:+ҥ^lֹ煞&nG>bTɛ/r"<8f}nzymg}|0mr-q2k^/?wy3>9~~mxH{Z=vy&Oy睅RKm٦u _k|L%{ޤOv ,@s(£.]GK.I>hr/{jo4W\q9쳓gVXAg`6O?Ϛ,!1cyW̞{9zkwߣ|͗ƒHk miOI'ѫ$W-om,eaok~ցeO={v?q>,~^reǭêgM6$݇~{:ѳ+'8Ǿ(F1r^y$u;$K;S}{_XUW]wKZOV[m#ǡCԩS'\/ۍ7X.e&hx㍔ooBn$IXoD>c{;c_/./ BMSbۄY[wqG{՝Kk$Qif]#~;1{J*é!N&G [#ZFCotqlב#>q<ȗ78g@`(Lo/S0u_gkW£Ecu]'r)L8^uGx.Uvy Y28 rN6ȶ)זݶG6?x ; pt<ލ6(e x06lZFYQ6oex j:`%J3yB\B]|TCZ'?%TvaFRBk" i/Ԗ0yփ~2_XHr],!z6u˫#_*'*nƝI:@˞t'.akw{z5vDQbplC ik( $0(]^g#qi-jO&\,Fz|/qJh 2ev}dR<(ۛo)𨤠cv}B8Cx4iE Fefy/?Ɛ iL3=GlHz1ȑo?_2 wr92 1%.2<xy$DzX./`LucO6 Ny;ʨOW-ٸDƀ.܎:?`^ty|dF0pGC#/)z6$G?J~TnQ];h{ϯwVJ^k۽߱[uEo|7+̲FV?BInweaܨ!]!<ԍ;t%č=qt^7|%y{XJ'$֮l*hJw Ѧ[Bt\c/pF݁u@\y jOCPb'đuq 0 ͻ6@:pI#0ʩ£=]!&(*ć_1yc:AλB(-P [ouRg7|\b/pcmLyi^{ʳ+<'ϑMx>f G>6~}p` ?`uRC]%-p#8"U]ؗ]˽ㄌ?qp>qo*Ҳ-f9ֆ8uva)J:##oO]K4h->[|Bv 6O rBwƌvl2F^3@K-of/]Kw}!cmڬ-8q8ӛp饗I~c49[|!A,Zno܈q:Q#_ڋ*] đ/FG~.)a;R_8lv #+ xe1(?#v!$lQOdT ru :p_v EXP>ָCLQX_^lw_zE]*tpKqR9ǾsScoaO%ӎ1;uolfO}fJ~ێ#u>Bk╣A:]X'rc;ؑƮi[`QUtuڢ<]_캪 ه"c;:Ra?fҤI龪?b/v;wnA{eGLk"fWO~ҞjCxaǠؗfEMc~s%͚})jXcqp0֑o\rxm<}_5vs=;,2.`#Ǡ l:b-(~=y*: l'?i{aYg`׺7+b}fų%v]XUQgPw#?N2%og4O~gH4vJF+RvH/#O>9iϊWZi_a3Lظ^>lvsuץB~׿6{lȩ9➷ .sb{ؿۿ̲kG+éi%/xޝ>}ˏ;QvvQf.*LX:껿CD|wa XYkRx;''9[M U+.2pMf;K| `{et:/;;*{NEyt^|X޺5nD!|1\'7I\?8#(}:V׸"]ޙQTo"vD@_(aDAC@V(;YT`$(A @h@X¾l "X۩陹=;s~}ԩSYxxb|3|Kc8gLKpxqMLy\uU=vQK^s(;},k7Fv,O;?2'-Qd5Y!HZF躛نzR|;G5üyӴס:b0Zn\|^g-U}+K5=vׁ>ـNo 6|N0ac dU8>KH2 oD #~y3e 5Ϋ<]{y1תOۋujdGB޿qı?K#K9e9F|Iv>m07qC>5#Ӥt66HÐ?c wI$# ǸRƄz־wi'wD1NLvP۪{(cuVUoCRˆ|,x>'~LEn=e%.62%v^4woz{7E<ǏOZ7ވܡ䧲k<=ШMC"K24F<my2eJt#䅈)x̀z:# |K/81b}IYxʥ<# {37L>}>$`OvFpocFMp<ށq @]oZ%CX@IDATC>tp+QN|EπXy&MDǶ"̜9a4L`s+J ng]Z-C~9jɐ ,x|&Z;Ǐ!Fa}Fy1PC^ baTA|^Be[x8ߑF<23t Q?P<[)'#Еᄏj><?3 1fpLwuǢJxGL;S,CYxg#e P|0\^q..oF|'x㍣/<hWN*zPVFh37&YsF~I^ ' ۱4z'G<餓ED߱Bkuf>BYBRpMYSt/+"ng}Z-C~9Zm<_?n >|ylxꩧmJ+)fΜ9z.5\ӧO4rylAw휘[μ0`YhR3~u ;uYY`실.,(<6Zo 袋koYxtrr?u؎ /lV^y~?-"Kh/Xbk"hm<@<x΃]R.\,aL3"5F}P }Qg.~SYc5",⎷e}_>,Gӟt,-mv~-)6~ʲ]t/nW|ջ5{t:f!Ypʟ@7>[)9J<^e[Iޑă9gg.) =/!L%x0HY~_N 2v9#%\R <ƍ3v֋Vg1HWȫ\^u K{W|[s$C~J  x |.ăob|: X~dqak6۬Ј^{5cc35 y&˓~˖giY㪖zːzdQ)ᶼ!#!L%x0X~`I!L,j'p ^gȐ!Ʈ'Y]W]8A[,+\Wp^o5j Hn/2;"X~`I!L%x0XjE?ЬY̽kҨQ9KG6X 1k)_FEWJ{ݎW|[#C~J  x`,I?ă $&C<K`,I?$(*몖zːjdQ)ᶼ!#!L%x0X~`I!L%$" E%w{]UoCm !*%ܖ^4dwD<ă $&C<K`,I?ă $`D@DnZ-C~M!?D~L6C?QbSiY  4x&x0X~`I!L%x0C@uUW{ȋwܖ=e]Zn:t$&C<K`,I?ă $&yHȻjP3\;Yn N[`UN@ދ`*C<K`,I?ă $&C<K!ID@J bƷɋw6=eojt<\Eq*|/C<K`,I?ă $&C<K!ID@J 2CTJ-hăx`I!L%x0X~`I<$@Q ^W|[P C~J  x`,I?ă $&C<K`,I?$(*몖zːjdQ)ᶼ!#!L%x0X~`I!L%$" E%w{]UoCm !*%ܖ^4dwD<ă $&C<K`,I?ă $`D@DnZ-C~M!?D~LT>}^ ]@@uUWel^ xG2bĈH_`M7d&O6z{k?̹}3q/(k3cuF\X!•j.3-{mx Zk~ xO7#G4.hto;lO0c6<?~c=x9c^yhol\pAbNs2KZm(M!L%x0X~`UHR{O׿eVYeW_}5=<> 'iӦO}SMU_\g54w95\ ء/ HowVXa(СC7dm`/Kz7Kf̘.mQY^þv>kR~K&Ϋϫ,CRnG V?xh%O>^,|4^RB /Dxy ^̏=<`Op,<Ao|x1eQ235O !e /_\h~yc9s?>b2`0Û#c{ۄ- pK/|;۰//g-R,&C<K`,I?ă Ԋ~dor靗]S2nˎ07rKw5}u/۽v۹ C?88NpFJ; 4#u-c,]v@OSkH^]%8G4oKm墋.j֑T'ͫ,*?Mз" >;b?3g6e(Ўp<>FTx _D|FU7k_Mr1Ro~\wu,B+K]qix`nAo^|ȟ:u>wqGsw騘^Oxi=#ܔW .=d`}"t2.<]gkȧ}^IQό?gMŃx`I!L%x0Xʪ7 :'}қ* ܹscn\miظ8kv_m8}nO3t{uU?HM M{mÉ?QsdכpskO]fccx~\efLiZ@|G,XC0=>#HCۧOovΏhG>p 8|ǵ]}ږG[ *Iăox`I!L%x0Xʪ7}>kfs"nbGhI\ȏ1Bqzo|xC=jq1 !E7]XO6q/~.dN|F1"E~as̈́ S\f˯n,ηbQ^{ͪ 3zu1KZfe|׵WV_b'Q 0{!&l{cmq=)8p`f͖U~^z ylҷvC%"-K! ڇXǧ!C~|e-?g (wM7o.f4xix`fvr%`Z)ӽZVk%~W!8)Hx1݆b:\|`tC>2[׿`pg%c8^~ӟ--ԋ ka{>l7`=] mp蟡ofgG&L`*cg O~q 7n ׋ 61LX~`A`%cҶD!50PhڂfS=oyWK^-Vr}i!̙Ɔ‰1?~i @,D ߆ Cu;y3u3x!8w%ॏxv_q~Ն6{C>bcf8 ?O;'8~98>lmX 땡L0o{}ڴinqTaFsTo2,0̠;@D ig͚elkGm Sbo\Av,]ҔIyWe^)Vr=q Lib%DzGH}=1b;.G|7.A^;3·֐h_/|^pԩSݵOaNc\z属NFߣ^5J6$h)ִaM}ָG\'~ߎxv|7|躬o_ ېpZceןzH^ۙG=vҤId%6</B<ӔI8 *ףɫ4vBߊ\'lG>aF0N?t7/a #HzrVcTO =c]tQȏD<ҌUc<fc& Mcq{キ;^+q|?bc_P]ox9=+8GRx_x>|{;|ql#>},nmVn]`VO~X ceY#P/r}^#AH:6l?R~͓WyU~rۡo)7nՏO3Ϗթ&y(d~JI|NuFq~+d#Oޯnr,#;M=z~J2O#y ψy>:Yx\hO |sC<K`,I?ă $&Rю&_Av0OzK/ Ggʻ<}6t<`1V7,g ; y4nB>'*!?ƤG>fQ|ݾdԦ,3y]\sMttG}cCe6LO<@4^%B\FEy}3 yc~fe'|C<K`,I?ă $&R3Ѯ&_A{'xyq9+W|F_{53Hbƣ¿F2<蓞_Y'8nC֖I؇밎pBQk :4&C}_1TomhzːzZ6ەup0Fl=጗x‹-->Daa||/ @_'^Yx91B -73h~4SN5m!njq]w]=\s 'P=p@-94!?>Y@XvF`'cZ&l⾟㎫!p 78ωG>Nox58Xn!B@§`jᩧj<̺e+迼F ሱ}b]\K!0k cι\iӦÇUSL_-Ã1)ri8׌3RK-"碋.a*};w[ eY&& Ю$`!L%x0X~`Iv7xhQX?㖯y " f# /\D#g;}5X??AB}xcvus)k}xB~q31[}?ֈ?<e~,:2Z#DB}|h[8^nu8GCܝ>Db+oF\G`-. aQ w1ڷ~c:yC3'0'7t9Z:%!0aN2.Lj)aJ 7Ǐ҄x~B=0ca(a^6eNy?Ec^'NhSvb (rYf,6/g!VE/T%ӿ:ix4{2{!L%x0X~`~E[: k3Кm|%8y'zY-Z?'a8PH>0p?_|-l_r%0( Nmc}W\_z;c;2`-UW]:9ڃv@!oǁg#FD/@ 6^ ~0'p,91fu<sk0pQ}h^wKUWe=[ 6bg͚MO^ 7X Gݐ~0 d4uz饗g jCu*O"W<.x0X~`I!L<;U/a0aw?17DžCl޷#]v|Brͳmȣj /!WB/>R{/6fbiC,պYx:W7l!L%x0X~`I<(a;+r-$97. 9uVD 몖zːz>eQ)ᶼ!/k>zYz=YxZf;!L%x0X~`I<* 2`M9eF{7 m6n6]h$"0@uUWeA2䇨p[xѐ&C<K`,I?ă $&yUB("Ĭ1q -굧.7yd0NfL4PvyU-_!?ԶȐRmy?EC&|GC<K`,I?ă $&C<KQt Ϙ1L>y~ET7zhou(_6$!w{]UoCM !*%ܖ^4dwD<ă $&C<K`,I?ă $`D@DnZ-C~M!?D~L p>| u"[װz ژVR[)/yl^U^g)Vr;foرc͖[n`Ϗ?؉}/+#FdFxltMfnzgڋ {.g>k8O>=Xgĥ%(\I270ky`΍7^O?t3rH袋F1i$nEr : 0s1Ju7vyR췣]w՜viΔG;,ăx`I!L%x0XjU?7ޓUVY|W_~?~xy}]N@ӦM3ԧЗes}>Ϛki;K;{6/G˅7K<ă $&C<K`,Y\z-'zW* 뮻̶nc: ~wM߾}]_vn;7 x<#;,qnkfi.ӟX ]t@C(|9r7>|%\b`[袋u)#I*?r=˼OSn'{ώa_jP>a`GxTXLD.B' JڕhWYe8x]`,I?ă $&C<KG&_Ag%R>;/UP`d3;g믿j܎ Gq m@V(P ",T8 vGYGu.4AJRHosm†K3)M͜ټyWO^)Vr=q=5 IӃ?6fΦ{ɣN8a| w;&~c_\B{o}='7vrWi4lBNOˬ;w܉J/=O>vG?evNь?V>kȧ}^IQό?gMŃx`I!L%x0Xʪ7 :'}қ*ꣾܹscn\miظ8kv `'p5G?_ S3_g_gy[z@Ҵ6XϏ=G6}=c:Bo5Zj)s'|_u!s1HƠ_~uCP]x)W\qE?[`[l(/fUW q=𺘥sgM.͒e!0{̀.}@ 4^fmsg ag.ƁuIDATyWC^7[n,ݐ/},"vf/Rs{}~zC>!?)t|ȐfY`@tMKY+M2^h^qa^4 ՆB1pSdc7s Qn.|WC<K`,I?ă $&RVߴ>9su a$`LF}R3!%`pj`/~3f[ .en!Fun%ЇnS-C[oe~_~ }Y2c?b-BXv І׌fv־ˇ(k„ 檫2v qQ8p€7΅  C~iD@I^c!OnV`} ""0&ٔfϛ6^UWim\_jȟ9sp"#$~_qC>. !CСC]8Nq^nLp ^x_x>|{;|ql#>},nmVn]`VOHX A߬&'"/w}f饗w$fk@6FGYOs޴y*?r=Rn;4ƭiF":1{cԤVJz|vc4225R#߯|6^?E6{HvʥӳBѺ4]w5,x3bzF^'(裏gi{-Z&C<K`,I?ă Ԭ~W~ivp3̓R;>= Ggʻ<}6t<`1V7,g ; y4nB>'*!?ƤG>fQ|HN&kw#>Spu]s5uAVH}QG0=,.#l{ @sj+K-;A^Uz^g)Vr⑏{v aUl֚ #?ςC>62F匸H?;N:UHYFKXxu1v=S?"Ub-X qKbc|z2k- z+>;(X~`I!L%x0яv7 +=΋;Y*:~ I/t﹎f8r{LcG^avFvsG+X;$X~`I!L%x0яv7 I;>zmC2=ꨣ 5 .GXOy HXuwSB0vdBxܸqn%\b{=c=K,aP!6pC Qj;h &\x˺Y I ǻv~ذa|^ T@3u'U|ջVu//͖C>F_{53H"bl&\d<ȐoĪ 19_}nW46vfo|"*5 6$_a˹i9NA5>6cf=4ves]wEq']|L#/hS6NŃox`I!L%x0XjF?+'!Uwf¡ K.Kg/ۿhkuYQIO.ysi.pkYdiO8amc֯:v078Cg7 fE"P%ʹםRUoCSˆ|n~l=጗x‹-B>{-' _Sa-c0K/G6&YhT)h~4SN5m!36}TE ,^n} ̂ "1"ga}ڑhGe:x`,I?ă $&C<KiMyҤI\(оzgYx Z)>{<2fȑn;:p <őЧ~Gkfz{ 4ȝ DX >~u+! "jZYfW_ m%j6NإhWyU~^UʭeCnfX+}csƌc0.0g̙3A ޳y767|Ƌs=qʚqΣ %/E/ wIxxC>!+xq1~:ʧc=\|.6eR x,w2c^1 PO?t9egl#yzx`,I?ă $&C<Ki[oqg̘ek+_/K.4m>OG~6av<ᤄ7ܬaĥ,xxëԽaNIXQꫯVZ)x-f+c]׬Q>vP>??vގ08`S}?q>< |H^wKUWz2~(0kfh0q /*l~; $6W 'M7-B8xɀS O=Tsg-ӝ~ZQv99m43|psWDՃq\K|*A.(ʎi\ϝ;y,?d3ڕhW9e9x`,I?ă $&C<KM̦&g򕥗~+BP /pxx>`>D W!0D߂>b/Oȏ>n|G_c}4~8e\Raw0{Gwy'Z'8LzW Y `[s¢zǨo> ; ;B2a '7Kn%oyWð8r;䑏 &>O:$gDKI|? {| 7ǏOx|bYJFl~,`S攗YxA8q]d7>WO>0<}PRx&ɿE/T%ތ9mKã9ix`,I?ă $&C<K]M,zA90WX_RK-ExEkgCB3sIG@X2r\?狯K._0pjCۭ ~WZt*us1pCPB#F_؇A x`OX|߇c0ln-]1eOΉpFx}*h^wIUW1p}5a5kVp4=y<7q#o< r7 uji/k,<*SeQ)ᶼ!/k>zYz=YxZf;!L%x0X~`I<* 2ĭ)u]hOFm͆:tQ_ID`몖zːjdQ)ᶼ!#!L%x0X~`I!L%(PDY?e,bc"E4ׅ5x.F\v`AO?!9G@uUWe-2䇨p[xѐ&C<K`,I?ă $&y]b3f0ӧOw^~x/9=ڼn,Mu2@E^W|[P#C~J  x`,I?ă $&C<K`,I?$(*몖zːjdQ)ᶼ!#!L%x0X~`I!L%$" E%w{]UoCm !*%ܖ^4dwD<ă $&C<K`,I?ă $`D@DnZ-C~M!?D~L6C?QbSiY  4x&x0X~`I!L%x0C@uUW{ȋwܖ=e]Zn:t$&C<K`,I?ă $&yHȻjP3\;Yn N[`UN@ދ`*C<K`,I?ă $&C<K!ID@J bƷɋw6=eojt<\Eq*|/C<K`,I?ă $&C<K!ID@J 2CTJ-hăx`I!L%x0X~`I<$@Q ^W|[P C~J  x`,I?ă $&C<K`,I?$(*몖zːjdQ)ᶼ!#!L%x0X~`I!L%$" E%w{]UoCmY@IDAT$EeI2<$%I$,I_䜑$IrtW sVt33w[so鮮鞮ӧNW2ŭ_~y\3U_ &C<K`,I?ă $&C<$ e~kjGŻzǓ!7β ߪ^/|C<K`,I?ă $&C<K!ID@Ju֯vːL!?Jn+2+"X~`I!L%x0X~0I" "PUe?~[g YTzp[7xՐ_&C<K`,I?ă $&yH(yݯ2g=dϢ҃ʾLCapZwu>fo>68v{a7'D}YNVi "=#s1ow贊QuUYz˪Hз^wP ?k\ 6ؠW>0"u]aeys)H>agK/9p934S49I^_)pf矇ǓO>X ^~'p!NXuUK1^ͿkZk˩79CE|˚/H؏>{ޢ<<݋lj_5&C<K`,I?ă ԉ~or#0:M+jq80O0$4=~'F^ a<^y7\HSyM{'38#n-zcߟ9}M74;6z/eU}#c {띕>,-OY|!%Ȍ:+9@CtS/0@ yx.% HWd?JJ mü)>zC>6{d1yLj^%}d2(Gߕ,1Q"5JmYŃ/x`I!L%x0X*7?8?U9,Iy0BJ:lI 1+b#}1Vz}ǼcÃbYL,cƐա/r̋6`rWリg'7 9侘8p4lFy!P au mC̛>/bȷ~ZNj<7H}o SN9< a_~`?|~P7+a`LllҀ=J"0.FcFp"ԗ x^M_FǕUY:on[u|x9 5'~3%3nko=>|,yS}y\:8<<9 _6*_#^0n<by5^3j{qq W;"F,/7MkF(wW/1/ɓl2?QZI&}G%W>o֚MxMܠП{c< );1e_VΤm}z~]jaanX qݚ4efqcUU+/֍H1JW,؁AVrC(7+V{ χ>Uz=_ڐ0#C=A}if J7`PLp|}5JX*'BPvќlG~ѵ?Ft@5 hG'  l@w7眧c)UY:S`[keb#մNSq&^}^ۍԋml8;Sjbx&B8ɻ掑o/Ƹz뮻b8( J7SS9ߛ>|w.+6xp݈nF0DEqφI&ċinav O=Twycnj7-qf6YnlWzza033<3+p}aGp@ż^{ޯǼg[mU>Z`k跥jn̶-BĹ,PdqJl 8s㏟_ybplC ژ'=!O<\x뫒,FvdQ:q P,BGV*;˪כ_VE톾Li~z=ϗt~Nm;IoǐC>Ir!t={UU^ϧxB@Oz^ 9tO{ #pԹ ExtR_ՏB!L%x0X~`]FϠs /ݨdćF޴'M=zo%\O@; g1{W$۲VYg^HrJ1>su 1 O}z|>3b{>dP}0>d}21bD<&,?dsKF]f5 o2q>gqFR}Xqlk20k>q~>Cǧ[+MPVeM/"vCzޮxc{̰=3[7=-Il6|2؋HhDυEps[zybd^l6(ζ~Wf9S  w1Yp}2} ${i )=c^M2Xʛy㹘!?X!m #*0)6l}27C~0^\ålM v}h#3GGm-dk.z\?ܮP_d,<`zG\z[+똲/^gPVETzޮ#2_diP7C [wqC>^veŦX `3vH,*ܐh|F#pC>o喋C+1dռm0^& n1{C>2(1DbmbTGǕV#X~`I!L%x0яn7 `h㐖>uMi#q>3`,Q6+矏`HA9<T{J*X`4LxvC Y x~W3/?Ob?@ks3jԨ`!{qjţ z &X~`I!L%x0яn7 ,TI!݄Quw8 xY?#1 h5|þKx"OzO_]\“|aF1%\yoL(q&]uC>>t|{ߋa~@aرuCQ|jh0"hdkit@Vr~[}{hg/~6/jߔ{b>8Oyc/875 fOgy~? O{]{zyϿĒTRGI$ZD̼*!#$Yoy("[(Rf/#|C<K`,I?ă $&R^f+_qV&]&ke`}C=4Y.x|7C|?+Fg,L i$1Y1-Nܗu-bY| '|Bf oxba΄FwߍM7ݴf2<͑1s6@7 }^wtYZ֑nŻzC-?a/aM1N}JoC qNxɗ_~9+׬d?PIyPiov|)mNjOe3.Njd7oDV^yHOp6QȞ>D9yh_xx{WC`d^1xB;p\!gs|~G}hީ??Wd??s=7ǵs<8:mCKacs0rV6@u4:_WeϺ' 2Ėlq8O7dÐ;3|92&5OK9.Arj!B 8]ẅoɹFGA7pCd?qVX!7U׊ 1%bZ iPW_=\1#&r~'ܲy|pdO;C1l裏N_zqҗgy&N<6'bZ^|M&\i#g1C&x`,I?ă $&C<K/)Y  Bt#! 32Cy׿N=7;ZY:C( -?`ٝv)9>rx+{WyfmX7fP?x>|x#.9昀7̰{<}xu%Bxf&/L0A,3m07M̋~p = b7| 暸n#4L<N:ig1()}6aF $Lwyq]̀_k|Yg\2ht@uiXL֯v+NMeǶV_~,._l&ˬ/( cNj疇<",ndm#l5Pt> 1oa:<-pܮZ;3jIetCãJWJ<ă $&C<K`,ҏn7+6Cz{Gd:rÿ6+'F׺%B {b( \H8{k6AO>d, } n3(\ .̲-ov3SFBhy@ 4 eX*Ye(p[2j[}[]23 F"V.VYT֯v#?(o?J"P RGdUkS'SG'UX+$X~`I!L%x0xg {P5<1x Oٗ,o@v6-u@ n2gQmeUC&|EC<K`,I?ă $&C<KCU?< ͌1=D/8D0`|ca 7 Æ ۼK/ 6@ !>aԨQĻFUV 0FքZ^ P_Wez>ȐE}W x`,I?ă $&C<K`, e;vlkrd򅧟~:$1^{fu֞o_~ ÇYmSOݰ]kV0zD_Auذaa ,@jD oV>l|<馛a^Q ^5n}n|[ڢ.iwygc=|ɰk>:\uU&(8ae 30ClooGǕ@I<ă $&C<K`,uy\븑pn\pA~.?Z+4LS>o~_%\P'~߇_=N}F[o rK Ϗ}oV\q㏇:?lTL_ /p쳡z5dquׅ믿>yAKVZ)q!_g{2FpM2jE@5+p@8Sb-b5iw72ʪHз W A7tӚ]ڽ0vB/G?q o쇊aO?̛nf/,k_ZmEabiO?=^g{^wqG5sdOt栃?_ً\<^k}'I~v 'fi&A%0޵?09[+yyt#|C<K`,I?ă $&RɵteվoƎ۲N;-;찖y2/~2fx{챵?7BYs#|蛛7}fqf?}f$;CWV`;0/7f$W]uط|r5{|=$@fCRI%"ks1j/q"F^FY+@" 2^}f 6MK8=1?^[&aX-I>Hk&]dtrzY矇O<ʟ皿`%Fw$/ȗ>9IV/O?|/R|s~Ρ< yxtZG//|C<K`,I?ă $&R'Qɵd gV }7Pyw]cG_+[\mz?F-GFO7Sݬe_!&C<K`,I?ă ԉ~otW9rd|߇W{ާѫݴ +:18`lFߺ#a A5Y܆EnA_{},1#`B;%]wݕ1dw{-O+B8r /)yP ) vmCհ;b ؈T-]O1l2=l2qY|dŐ3/7=jM b;Ń/x`I!L%x0X*7 'uY'wop a`Pꫯr-90J؆ʍ;bȜFmjώL`|o|0+BI' >pG}Zi@Fm.s""HgQ>_$BE-&dM<l8_] >h8Qm`c`Q4C~aD1'k&KJ'L2c/0>`b)"fF8yMGW g&䯘B5xϰ袋gͨ̋>mFq&M3M"ft f 0}`w_3S7lpEsj9/&?2u4F 2:a 'Ny}Ӏ%fjtM? (N;S~5A]L0oFno8x& .8L9唴hrHx嗃ctذaqBm& f, ߲ht@'|2(xnQ=ϫ/mwenҷ^rau/8S8g Bz+>8)/0]V+t ?`L,>qѸ:*ԓ&H즍(!^zxxY U ǤR^6 u3^x`,I?ă $&C<KEh>rqǻޤ?7νǢ7gm>{nYǢ /qa:Eo==I,=uR =Q}X7#yOS ^87xz}}'|r͌qTH{sK~}tˆ_ѫrLyp(4K1ybl@ZI[ .E 6Lx6;*<{YP$JE옼nVF'ʪ?oַײ|FH0~Z ifOOkf7/x~N^6N/-*\/sc=HtoXn: %^t!1(}hzIؑGD(X~`I!L%x0G'MLG/nk7/g(xyn\ˆm4Taq؏9l@R.?/0!-bL(2pNyїر,Lf'̙d9<"P@u:1=6$귍ރ ۦ<;O9EUzCߪ\ovՐ//:C75\lZIᙀ ĕKQ) O siů~Xb@֋Hr=U j> G|,iBPv~N6ʔ?ѾF2]"5y0,lXW3sԟx/_ݐ4*;Vzרk1ni )8o7QD;w Xc4#8 1y1}& lAq}ӐXiH4I#偘;SRsrrk@#$?cv5܆9,J@* gƫ0rȆĉƜm qҳuGBb7|̊f4 M4Q'1q>ldI navy77y%? B\t`0̐^F[Eݍz/Ro7WJh*ǥ~TߏC|q4!߇ĄDC-Q ݞ"<ܐaxtË-g6 Jy`̐yʏ2}),£h]pxU`,I?ă $&C<KG|K\pA[ͷ}{ֳ> y0)# BY +hyl4q26#5d=Ie?StYԐew#f0ː[} ^NCSVvlh#b޼;@IDATCD<]/z_c;]F'e_NWJhlr8oYf#N@ǹBHֱ 0.b0qx`ӡu0 pW0DЇb3H>{ uP&Bq '6|B Ѻ:( }W^y%ePwBh$?Wd@B 'õAHpF "9m&1ǽ[I$6:!!»X>5Jl_|DH%%(@;8~_<Ә1cCYmu/oz k,}%N23[G>2b2 6gkf<< | v  nшVdBIȳ ~u㑏GJ+kNj_1&C<K`,I?ă Ԏ~tgT?z[-}[+7uebo c^LNt~x"Y2="=[bw%GZ-|W#CffM\7sH^}ո٤hD; .y5"0 Sj ,`TfenގC}{'Q>k^#C>p2)i>Cz6v/3V<`.8ky)o9YpYЧSC>IۍXr~xx~Y_i&C<K`,I?ă W?3J2GD?d!6%Qv8}̇~HG}4 CRjYy>`>K t|0@~8!zQ i[oK.~䃏)yq Nf%|u@x'g`8f/m[~J~w&PѣXI>\?H˹>a"σ%^[Uj\Z 7pC Xa:Fx'譿^tE/e>\+&s^zi|)==M-B.?z+yJyăx`I!L%x0Xjo#nڗ,}R. U7Fr~XZO<#F0wodc exCNa.5JxIݘ~w}E8vu_6<<-_=&C<K`,I?ă J?tcG}jg_G8㸧>F[lOz4A{キas 'xc,p.YZ.O5Y q~~Xv0F>A Nろv!~<l=izr)m(y>~_2gQmeUC&|EC<K`,I?ă $&C<KCY?ƎG!,a꽧~:$1^{fu֞o_~ ÇYmSOݰ]kVp駇{'L:a5mQ%e-a OwnpLJ:*,aE Ç<~;رcK/fyb.L11W]uUFi& 38cXfe 3([qe=PxE`,I?ă $&C<KxoKq(s97hXlo=P;E`=7'xbxG÷+]w5L9唞% :fm/+2c^z??!<# w'+V[mKi7'~o| :"kW8{l%"wR_e_V/Ro7HΪe6E >׾pI'Ax7#n OxG'?IͰaⶬL3>ꫯ_4=a/?7|sb`2Ӿ?J{+q҃xyy>μaO?t~Å^?tA|&Kk mYw1opGėk:1?^v=jԨ+$e,"a &x)x`GzTZ#uȐ^!L%x0X~`SE] G0Rr-T#`_~4L$;J_~y/?.^x!' ?&p¬n[ve #g 70\vepm`[on)~,yic /+My(3c{GX*;˪כ_VE톾Yul†|?ɿoa?؆(Leu]7~IX'| 8x"pZ4sa/nân_*via9 𶀷5L^ ;ڽJ*^;UW]5n'>l|1ğeY?8VXaʷc{Gvm $b?^&ӞIã{X+&X~`I!L%x0:я󟉱aezUp1bD>8% [O>0jgIdaNqc a9 ~׿$/DzV\qA࡟?):Og'9|hw{1akyO{W<\>C$ss G`V>mykUVe,˪?Ooyu6\[odž|<~at5A6d8 7p^ȏazyhUxm&]_Edw3OUb aH(TSMC?Cf?!,*!}]%= I GBk/Bwߍfr"㺵˪׹UzCllޮAh$ v#|0<?w_xBng^Z g0oˆ5z[`k9T<<0'eސKn#DG,{E(ؿ.gc /!CS<<:\!L%x0X~`~| #n;{,ᘃP:^G|XoE_p?i3QF|rmY2x?jtg<*\Y ^k!sj[z5cVh'=JPé<8z@]b''N<'Y@k<;}{ ]tڭpE ,u enҷvuN.ۭk|8X` [rFtx$C 0Mb"nzHP6^` K$L:M$ė=_6&kænCϐw,P C[c'?IbHQ< F70Mt!Qocd~/?7F ־o~?*aLa9ٞ{+駟yqdpx gH`X+H}B`ߧ3kR8™#`4M gA)o햛7YUs)v[|lޮшtxo^^ܛZG?>1bxXkV C< )o<aEb/S kWT!&[I|@H~mNj",_o>ߕ,R!hyFw Q_ u QyR`# }|#풧X +ue՟з<:n.ۮBd&j3)c}ij셪f/9oBff/GI&Y\{H5[D< $lRҤ3&۳Vy ^^U9nG;KS~A<\rɚnxˌ/-C\e=%8FB& ͐O)gaM}f#F扟{w}4َeO v0}mHn4JǛWl.}G "hD+cfQ2>ac//Ome_V;^gev#~;„x99ŖK|_s5<{BZ!w|_%cR6,ɶ⋇~81 |o P=L.T* K<b Cq ^=b^!~ ;>=፲;{AsH fw&N}}YEvyZ!L%x0X~`]23?$siqCۋWR ߆%N_= X҆׫jH \c"k|mXf{̔b>R~i|x 5wt7?z6oX,/{ OG..uf 9{cLjdF|#F,6Pfy< ң?,LO:E x>x*RǕ (UzoEuV,ۭ60,qh0c{}l'a1P=Kx,d%LѪY 涶 T"A,bc}{If>Ţ.c{:d8Jb$N8 ym?d$6u@<~$7gNQ>'fO>?]Gn''?&Ǽꪫs{_xᅑ2Q%9+iO}}B\Cs4 7|sV6m ae]'&āgɄn?>NȓQƈ0(&&gb14'!?֗Ye _t܊pC>t 8/ZB%\ t-~<|dpaC;FU-C<ʈx0X~`I!LvN5뭷^~BVj^IȘ\qjdϬ# oV|n-JIh 0Z#ab1Oc؍>C};vlK;.r)AlZhafm6h & B6JE m][|L馛Ӭ75|ec `/T;%W<Q֯vS+w\fj׵Cfly*!D%{i0 Q0˴Y}3gFMnڰhzU4Z0C}F~ĉ$<!_b*0AW?O> w5 Έ]m>[ӹ 70yNqVmݚmlxמP-xGLZ)(9@=ُrЗijgOf2YLl1x.Yu|vB\tE Q >Ck]@;ӯ A{0T*̲x[/ev +~d~{"KfJ6)mgYmXvτ$AߔL7I2vW/slz O|ny`\dq^,ypn#3"5݈%ee)|C<K`,I?ă $&R^x;MI61i.[ؖo13ȃwxE'K!Fp]Q&iM{|[A~O\O6 7im)}R+psΊYq^([ . 9_?7_1Nh)H zkj YTdž|Lb/Jj򃈼0׿8`bZPӢUz饗zoGy$ouڣ~S{1}WY+nQxFJbFy4ODS#J$*0Ab2&y_9?v yŃx`I!L%x0Xʫp{+IxNOz{)Px)y0m7өd\N:t'/Z$@b4=O9c~Gr<yRz;K6L؛N~7Cߪ>5y?mB&=I$^"o>K֯vːuO6 c%^#7|iAŋ,H{gbŗoÀʘè`1U—v/KxR76hU^Y˾jwz[˛{<np|Ź*0CWf&ӈ>ط{en/x˺!ƒn e_%&C<K`,I?ă J?'Ky駹 }R3<䲹}I+pq%W=/A}O8 y>Ck0@Om _z<=r6w]<-G8<&M>NGG /i')\tJ;FN>(>#׺ e׃~_!?*<-fa;X믿~^~Lx &!u~y$$'MDlAzS8aidD~)?^ mOPt0`Cit kD;S\֟f¶`B]t;c,l a'F,}r)NΌ6l0餓,JE=Rx`,I?ă $&C<Kcu •»aF `U3v' u qc9ĶJgk{ڢ|3NbFm"-0'0 r-n|쿦3`#¾&|`Fxfm`x(k 8#-ZnfI.7|1ˋ/fuVn`!b6W@@;{`^.80|;By0am+`eL&>ɀ́0Ns1ɹa a#Ps9iW׃ͥ_W5mֽUؐUGg\SO=w`a.8ռgy ]vh &Hj9x0S&C<K`,I?ă T~mI@~_!?#C~V ^5dWD<ă $&C<K`,I?ă $`D@D~^kj Y඲o!"!L%x0kzq/zB-Lb:fz1Bbt !8!w(jw%+;sf4?iGGgΈ`I!L%x0C@Nm_!? C~ } x`,I?ă $&C<K`,I?$(+םھ-C~=A$*+/23"X~`I!L%x0X~0I" "PVE߯;}[{ IT*W^6dgD<ă $&C<K`,I?ă $`D@D_wj IT0 lăψx`I!L%x0X~`I<$@Y }o 2'Q`^xِ&C<K`,I?ă $&yH(~ݩ2'dOR/!>#!L%x0X~`I!L%$" e%PSWeO'ȐDyE_eC&|FC<K`,I?ă $&C<K!ID@Ju~ːtOHeׯR 6̝+IJ#!L%x0X~`I!L%$" e%PSWeO'ȐDyE_eC&|FC<K`,I?ă $&C<K!ID@Ju~ːtO!?JˆLA!L%x0X~`I<"j^,T:*םھ-C~=#!.3qRg?a|'駟nn馦\q?[n2,O#Gv);TS:5v/̯~+{駟>e(/ K_}5j;СC-RfgOݵ,:{gonN;ӧYyO~n#mU.'|C<K`,I?ă $&Re-Oz7̰a ߷yNQifFke]֋9~x˻?s53vm붏Çg7|Ӽ矏 plZguܳC=d{umygQᄏYlv:$2K,7n0`k݋C=L7tM3qg1G}4Ջowc#}7dN)묳 <SN99uϵ~lsϕmY=X]wczk +z|t 7礨K | }/%?r@5eW> ;FHz1Dyc6lۄ0_r% `DEK xZ5e=eG+ W^y`Ϻ5/\hO?Ԭ.ر4M:Ƽ:{s9U+`[wym8p93oGJzQ)X~`I!L%x0Zяco>I /eN81qf,=xVB -dN8~Wpx<'?Ƹ05gƨp4s8$xGͻk()2`gޜࠇYH^o&I 6o3mm饗v?F /8KM~-|j?Mݡoilݖ ;\d1w@m4w {]w'ɘ^YBߔM~߬Uߞ? x+>n8]zLZYу XـɚZgˋ=&C<K`,I?ă W?Z{t`h  R_fVp+xE$#矛Yf` fi&]9,^Ww޹Yqmh@ 84 v U?OH&iSi6 E_T_Qi;-MM;?[:C>m3 `&EH c-b!db$ZfV]uUW˜2ǖ@ Fz#:LOZ4=\z8ܳ^p t?-X~`I!L%x0G+co>d) }04/s iha[, #bF2`مB 87nf/B M34]Z/.|gA^Z`ݤ;03Fmk*܄ț}كkcV>fY\~f]vA aa{˴EYE߿'풵 ٱjc(K߲9%=Ӛ#GEF'>>mthl3C><[l(Nxᑴ_o>!L%x0X~`)~2#Hh/K3n8WF`O?t*m[o=sZ: 믿vaf|pAxQc"a=o7sv{i2xqEPgqxbF2,f?5 ~Af" _㞇'xѸ⋻_7e$mVZi -O*ܡjc)[Ҷ3k2?f3K``*WC/ꀱ % B0p_>Enz<֞h;-ľ/ & 0  8HSWo(#|C<K`,I?ă $&RhuGP_z']Dpbǚk>}wf2|[}v5\-|gnq[x? f )?60؇[lA۽ u)4{s5BnA.<,6uWmውv lFSO s/ ^>bmPâa[CzםRK~ʪr+j?Mݡoil]ÛEWRK- C9f;lzR[o]f6xTã4_l\5G[4 Ez뭚Erپ=_e;:,<̋HG.,7=Vu4چAqzDy8[`7=zWGo>!L%x0X~`)~:#h,><&]tE5fيTWXow}wTXOwWuq6$- ڲ7G򫯾5Gbꊶ~kxzG۬1fM5kW/j/kw=o,"@>}'xbF9z li!i?,E_T_Qi;-MM;?[|ǂ4x1x`;Ƙ/87%͟~a*ԭ·逈}h;ro:u-rC78ElDŽ \;#:fڡG>cNckApdPE>!L%x0X~`)~cGXA8{7#F<3SHGy[ Zr}38WsDI=oiNSj3)oy~fm|Ie|'XK뮻FX,cy-$j?[xEYO|m oWw?nΦ1䇃_DB@ãAu$| C<K`,I?ă $&Rh؛ Ys3a GV$ٌ=M0cڬif<XnQYlfjAN$茱~o0.k`mBWϬ' }j`36pC|]S!z/x aAn<0V%G}ԬJ:5㑺^RP!L%x0X~`)~sGm0xT8nG^J ꫯ 3f#۫jӰJ<û :w3=X獟_剀#~:}[īz&'&O? lꫯWf/5;`pz뭨q=Kb 5iԖm=U./\rp3}9T8qk]tkvک[g:v'H@}/ʺIьG:zS)X~`I!L%x0G;/b %A vz$շ[wi}H$}Uœ]h92C0jjvVtIW:馛=К EǒUH#kU./|C<K`,I?ă $&R3h۷ gp{gVaؗ ?mHW_ԍ߱ J~19ܨ=oȇ[oK˻lS@6j^SWeOZZoJ@Y%@@GUXq!w`,I?ă $&C<KEG}d~a[MkZ Kv毫w,ZlXc }m.AB k`mN׾ھ?eiT{x!C~bO辣)fs X~`I!L%G9xص{aǸ[zk;pj=5wu #G46Do:'M߯Nm_!?ږ!?Jˆ,iN-[wZ><ƆP56ܮy D@(~m~ː^ D?ˆO3"X~`I!L%x0X~0{>j(3abvN>;fe1+R(ξnnE߯;}[k[$*+/23"X~`I!L%x0X~0I" "PVE߯;}[{ IT*W^6dgD<ă $&C<K`,I?ă $`D@D_wj IT0 lăψx`I!L%x0X~`I<$@Y }o 2'Q`^xِ&C<K`,I?ă $&yH(~ݩ2'dOR/!>#!L%x0X~`I!L%$" e%PSWeO'ȐDyE_eC&|FC<K`,I?ă $&C<K!ID@Ju~ːtO!?JˆL#!L%x0X~`I!L%$" e%PSWeO'ȐDyE_eC&|FC<K`,I?ă $&C<K!ID@Ju~ːtO!?Jˆ,޼f%,[wZ><hLY/nWw}sUW%e]\s͕3/B_An ;<3Ϙfuuϱ38c:aǛn,?9s͎;UGfǞt zG9q̵̀^݃6zn4JmN";whO>Չ_~c_/00?ip H7h#~>}|\iy䪼;4&C<K`,I?ă L?`> Ĝfeu/o| fy氊~3ǟw}ำaÆG=￿)n] y.sNMxN;T|`6l3SOg!zk }z8c8ܳ\B̂sO?mnvsǻc="2,d 4k6~X}1bDk~;*c=KmAvaEۡ믾j=ϗ4<[}ăϜx`I!L%x0XJ/WHo>0/2Y#|4eĉQ uhsZ9] Ih=pqڗn5\;JO?싋uJ,[oլ^m֪Y'2Uij"?kد!;@5ɶ{=guVmr<_3ThQծTTi}+sӄB=Mw >rw;&][iWdOFx^n TYUN784<#oj Ȱ3D!߆rwׯa]/Yh7ƇHv6@ԎI*:/ ԕ'Q<ă $&C<K`,e2c mCpeV]no"%.`)a XSТ}."W'Kޓc씾Ȁjyij}jx'tdsM ȄGh6&~<\yۑ:˨t+) VھgL<ă $&C<K`,eՏC9$a+Zd-w Xx?5 ~p/c\ienfwv]:8_H⧟9UXdzD|*@ _>3dȐAnE'i?Oi)\j?Mݡoenן|=F>!n8ba!,矻E@b/Qs9Xc[o eV3փI8zX 7LXd]wfW{XNlOHֈ>ink$͕E,}Vg\J+E;~gŴyERix>!L%x0X~`)~|w.ƺ5ڻl8K,:+7HX XTPeWcтAO!!;0lbٌ Iaj#߆0O>yžY>c'\; <_r%"8_urrefiܶrpSXr~!ù3U }f} ub[{=_},f,K/5ܹmV^E(Yׯ[k¦qM7>nΎE_TCQgm]Vvn6N;9r[ơw:w_M?}ÊoYxc=ffah[ˉ'h8(`wy%^lnWa?CC~X/oᢷX6(ppdK3^dVޔG޺xY`,I?ă $&C<Ky_6v "8\yΉ̆äEQB?~wpb,4>/˶"h 0{=ꨣʿ|Ci]S+z~! ϴ+.Bv Gހ3v:Iŷ%0nf|s}g뮻-s{qn3f [cHS9ei,,^ 6o33!ZWSN1pK ,4gH8yx%]kސh'=M cn\|ō k;ý׿ #miZj)[ޮ?/m5M}Ec|xf)m7 Q?^h8ŏ{6TiDܭB8 :yP{.kc/fgCƭmP)eY2wH×gX<ă $&C<K`,`![2`:metdCD31Ʀ g3<tAsfx\#?9uSLs<#;"Nsب;찃3/Kyv316\n +bO=)/~W &?1[lm@/_$xC;}< 3ᙏYhdΚ`!m*6{i;&LyFpt<1$e%~sϹbu6L+13 b-澧u)WTE~vCܮ?'%4;"`Ծh1sqlcEio1&,g i,s>d馛g^\(f 4(*~s;<.^X/fsC|d^:DՄ32@Y{]YD@H`〭6؆~SO=Յi OD$xq.q^D#],p.<駟lr7ڞFeVTE~vۡoUim| L0@DLU 0R~> ^zbۓ7CΗ*~Q*315}uFzhF%\ b8i14ۗjڴ3\ "!ThcM<tCx[;y|UԗT7w<+\nxB z;CȞ@;XaHy8ZqCC}Ov;|J}C>?g<a"!Z oCJ zȐ!wnVڋ[TE_TymUݶZ< >V?I0Nbaf/d&bGwq#[neA^lȳ h6MZ!~ph-o9ܷj۪Uݶa"204.G| M'b3O=ƢsXLoSf[=L=_8Ǐ*r^Jgސ[}W|AL34ѡEM 54LX7O#O;UGS|`1f36B[^wp櫗w*!a;;ycFXEd_:}{"iB9C❹]k@LLinN;Y]>moЅ[eA믿+k>}کvQXǾow,ႻBX|ǁ9UljkX'pc;Xė uYX:zNьEԌGzx`,I?ă $&C<KY9ݸznSE6lK4^Ƹi{3EQnS,FIEmh'0"/(XiB&8ndkO(Y`%,Fğsz`=!:sf=i `o7\,^y@Qޯ}ھTmj:խ(YۭkAL[pw?>v0.RHW_%8p+g.XƏsam?RhT~UNpx0V|Y`u0HE]75jvV u^ZkQbMhZA/+ |BC<K`,I?ă $&R3aݘP%G_a@Ovƫc/|'|a{x З06?.%xVg.&dI:N_Y߳=zאbȷaS] .T@uww~ːt=յ U @k'a"D?IoaE]v.z_Ձq]m/N߫问 yxT.RN{<ƞlo_uUk4"| N'6$z/?{(;?Pg$,cūO-7㑺^RP'>jܧ aS[q2ϼ6{@ᅎ<~&ڷQe m>Jy|hoۄcGxުA] f/Q6m7<_2L1va.Yw[#G<'M&B!e"~]ܩ2']S 6^3q%Oyxcph þ߆iRޗkj8$NTx5h#F~⍏~}ʔOċ `=# H얍} ^/tË=G;q/2)Mcq_6n /Af3 v핛ăOx`I!L%x0Xjpy"c)%eYQaYƩwbF{@(<"X8k\p{>@nB:7*{q;o3 \ı{wT/aF3fڇɮmjዒK.O?\ /VqKvhfQK^wdȯGHe!~٩2'][ v%F%<>>hpã1;~|MWSx[Ő놑Š+S/xXV ;~BB|xG9`Jy 0LZ ח3 urgQ<ă $&C<K`,5ӏ_cs9'Ϗ}y9Fku7oxmAF6~3hIFzx8ꨣxa,N:$״]63vR{j.#^L7txQaBkffqF⋛93Gޥ;f@i@IDAT۷f&tXv`iƎkg/;X3-j2]c)CgA<ă $&C<K`,vqXc=<S" ϯvNjfi173p Ɔ1^zioqvjwڣ❵^i/Nv.yxb/;<<ާVO#!L%x0X~`I!L%$" e%PSWeO'ȐDyE_eC&|FC<K`,I?ă $&C<K!ID@Ju~ːtO!?JˆL#!L%x0X~`I!L%$" e%PSWeO'ȐDyE_eC&|FC<K`,I?ă $&C<K!ID@Ju~ːtO!?JˆL} +`[o=?榛nr'K/M:3hYfӿ3TS-߀}Y/^x{f3K,^eUO?mnwL,}]QF; :Ԝ~fr7G]˜>G)lf7z˂z }]uUͼ[X,2eu1O?y衇s]m^>va;@~yװy[.v*R9OѮ}J-y ~򓟘u{ Z~~}G]wen2?5,8q;v+̀l%}kN;mZqͲ.kp|0cA__(\/v.m|Gϸq㜾]{Ngl=P3tә|.>Aȑ#k^"a`yI'wyov/b 7x?ꨣu%-Wn7S&X~`I!L%x0Zh:#8#6^:keLձk>h]wgN<ă $&C<K`,0,X;n9D8X5W5\;g }PLz뭚usI)L2G5Wu"PJi׸/5,`mg#w8Ϊ^<*'.M]_gQi;sϖF? oм}Tw*Vxl>3n2o0ẁc JJãx`,I?ă $&C<KD5bv /R|jvǂ瘱YJ֡1nVNFG}ӗC?aۻ@Hs¾XucFK/1{ a%#KBYl~+OOnw[ۥZiD୶|W_}mkXd5~|ƽ쉋>UgIJ+/9_d/~j=}Sp9H0sQ1;k:iLk˗MGzzK3)X~`I!L%x0fڐXvZ#3Q_r55N~=nꫯ -FJG~ Fh+|C<K`,I?ă $&R^@vˆxBL3čĤٲO>-mx _B˭$E x\r%6`79\i}plxos٥f8Ʒ[ź|˛}ٻ3fuV3 .r)}1z>l{~gfŵ]D @+ ZEPsWKew(KߪnK| OP Nhf}``EH# 6&}s=/zSʪpI}I.onw,?M Iu1c[o^~.U1тLi]eۥWW<ă $&C<K`,,:qkw_n$`^`ܳ+A=# 6 >t Wv=.@ᑅHa~0UB FvUmx+-BakɮB/w4>d]̅a܅2^{+w)$KxՇo=!.rFAlb8N\v|]$_e%BE/B}កo VZ)V{s*7Iij?mַ\K|TzJb)??&'t ?+BT pcH2F;KZiyc3 ,?|1O~$|vm]t*Q/uri\=jG:z6)X~`I!L%x0O?f{G;cjnϓx U8  :) if7|x opVg0}{΀+=g姞zL5T ÄƓO>-"P lP7 HkZyh>x0۰nx>l1߆Or|s &D'^vEHO 3paJ/l1k x3[+Bk~j?MݡoenNOg'&6/o߶Wb<餓j͛/3oف@OeYGy˾X ۗ.;-#6Yxo#]:ehjv*o@\7{juLcfB[n.>bL'&֑53 uWxY`,I?ă $&C<Kyq1oʰ><ʏ!ijxĸzG?˧uމ_׆Y#Ϫp34myXOww/4lC 5җC?njS_1uX|ZHmsqnC_t\GKhΏ1"ʏ΋@>iv摳ag;gOsAB|Lu ?;< `fmM6$j ۬16։_Ҽ9$.Yy֋z> Dh10ųL#AgC=ySmj5ej{e_< x0X~`I!LĹ`GH7#Nc:+.ꫯ6SO=5gfM7uz:>Qx@Yx"-<^fРA! .٬_xg# ^:D텳3gveǍͤ@+/Ϋ #f z.?p  =Y~iU /c .Ns С9ͨ+#= 'XOG~R|{饗 baK&Bz0a/?zhcƫJ-ᑺ >i!L%x0X~`)~X㵋sM,;nU~ r1#7MBwޙbv;֙KJs=]z?nfaaFpS6=}\nvX"ܯCw,oh@br)]8w^|G}z{;f^zYmg5c0o zhg饗15mHdJx䪴;<&C<K`,I?ă E?VYecC'%x0n'y0"|fc Osb{c{u2[o=Ox+bx#.>5)6ָ1;&C~8Kad&ܯTks~ːt62 _oּ4[o!!92GqS X>ao'ng}Y^6~x3Ihѥ! [^xᅨ0c!)zu|ax/nCA1COvZ_AVu?3'X~`I!L%x0<bقm8a>tq ٱlO>dCO61|WA${,$kcЛ>}4®[gfi&WQμh^|솗&YBnSE_wNm_!?jɐ0袋 hPBt0 4AaĀ S YgW> w5 /ql;0НА)c2XSy} <^൏BI?vS^1X?fVs=Ccb`n$ Ǎx4ٽm>!L%x0X~`)~l.t;co>$0orxD\ܜyѬ\_ᙏ0-38AF) =rXW q&8!Fа߬.|>p.bl ?f>%ޯלnNm_!? iɐ銈128Ow8qEN 00`O=d? b`Zk7x+s )}e3ĵK,a;n1bg t .Ģ ZaP;0eSk18曝k-/bz,^h]?z>Y?Z_ˋA&C<K`,I?ă L?-  -(a|j`G gsgܺ9!+֌Cy4LS&Q (gYfg5!>ἆٺpHdM<4,#8Le8&BG}pVB Xveuq'fY8ަG%\馛ÇXoG8"@uo򓮘 AQ?x!kzj ?0b (cўfL <@^^4 ?<:c/LFu{K'LQ ~xCorO2I &,<v؁BrY?Zgˋ=&C<K`,I?ă L?b 䱍0hc> NC?+'Yg_}Α-,{sJzH"sloAo;!Fwp:Si]we9昰:"8} vesW|^~崏tݯՒT~ːtմdG z+!]x#~RݑO~MÔ@x]XZhh4u}ďGZ{z_y'mUa?$X~`I!L%x0Џ G\sf¨ voOX[C>"nEܯ>tj u࿷dxE_#C|f؛ŦGFڪ[XDqnbcq`%|_wj IW IT*W^6dgD<ă $&C<K`,I?ă $`=-}3F2&L0CCƏo.3s>}[L;Җ*N!PSWeOȐDyE_eC&|FC<K`,I?ă $&C<K!ID@Ju~ːtO!?JˆL#!L%x0X~`I!L%$" e%PSWeO'ȐDyE_eC&|FC<K`,I?ă $&C<K!ID@Ju~ːtOHeׯR 6̝+IJokɧ_HOB<ă $&C<K`,I?ă $`D@D nZ[P C~J%]ӆLMIW4&C<KnLbz!3zh7ܴoߞ3^z7̙3 F&ٿ;#wߵyyݻ}>qPg}Jh~ӟ$(-N%|*偺3i$3ρ?L:<榛n2g6묳_@6oҥ} 2Ĭhr/BzijvSODŽnfmpoP23x`ӱcJ6Z05Xþk`|``:Dֺ=[v@T^ԲZ[P!F?fڴijje~38Nf 6oM7|p68{v\uU//m{^0aO6}aÆ1cxs 6"E)BaOEsgSO=? 8q9蠃LN9c fN9|(H?}a]vm?1Q*z<ŃJ<]_q/Nd.`~h몋{M~Xo<.I2Qm~_<'xGێZrCGA߾}!ߝo]8i<d6}t 6tS?Y|N.Qg<+1bMt9t5k(w-P|{هpBOgu]?+2sB [:,;޽{h\7:p .lV/q:tp&PI{] jn%O8[yr-Qa/zӄ"7hJb㢏8]k\q4nE-ыf D8-MijWV"LR<ă $&R)uPʑkȘѲfY\piF۹-} \l>Q|KQ2wܖh&^ #21JQ2Ӝx)G ,׍kO{/l lhK0M4fk6hfw%YJ p]77y:t^z)oZf%PI{]kj]R-r3}P7@2Y_uvmz[`^B.SۨjWα`,I?ă T~uQ9;#Ў!?UoQ\`$qvkx?{챱6\yH?Eu)8ߘRx4|C'Ib,G4O0fqqfucLKfϴhwJ9|W5B42|7{rw__wq6junѬ0P;#`cP%@%u-d|] zTsC>F2giEyH6۸V˹KǖO CTt6:wD<ă $(:LvFvgXw|<+?#W8\`$E'pBA,ݣֆH lK?xϣQg>K H~g &(pm=:||C~5qzOh||͸m;vn63rǕU>oC;0/w-r_cqz_X$jnCmI}G/Uf7-GVZn.;2,r /r3/2ۅBj{x>k}aQO?\q _~F4Y?_Tz%K,=$x`,I?Ȉo3!?^|0z ({c=7? /&xLj>₫ `Q>FKGz~ G|,L] `Q=hq΋%vd5i(:-w&k'eW1y/]e;Q84|/|, +5ݮ{ݝHϸg-/Zos㾠|fӛ`h{ DdM}|Ǘ`p k` чuMv%U4%_Y-_-|<[n9~8^ w|?Waܰ;ɓ'h-RK&&hؐ~0U(G#.ϐyY#Qbj I?xTL a\Xc?-桇2z-͗\rA]@XbQ]h&i߾5cnD.s"W}Т!뭷3h(-hG)r5~qшziN|, sm,P@ߡC:8c`4[Ȕq-M]R\V $jnmNh>"cwًF/:vYbeFڵ g Rɵ#ϥ,4{&ob,{Atшhe0ZFJ?xTƣQwW9n(\cKLI<wmusfK-XqDZw, ~n]9-B Fsׯ__xo]_j㓊6"S|~|3;7OFkqo4h%2Yvqw_t"jqnrSg@ϯkP;Sz| ,טv<v;ZDv;tkf(5\s2>so6K jD~A<ܙteڠ&rW_}Sp#2b*wDFv^ ~SO=e"i۶m{… g?`Ok`̭ؕJߑ8/y 7o^z`Mc D0m4uY7f:mKWaL>\~ 10s̄رKW\]w@}pIwC_jչ#1ù GdZ'F%@u/=5"?TjfCn(ڙgi2G ߐO\ĕjǴ|LB|`^C3_J:)9{!&]Ag!c-&C<K`׉L ;;+bK/m0  ?`EM401xQW[.jKw\/!?j]3mBS@IDATB]!QoQ߳I>rxUaa]hF/֣z-f͊`ZG%\Zg8ߐﻀ߉qgfSƝŎ~<#᏿0`!^wp`ĉm9 w8oDWjku .0v|C>sr-C>((,iiqY-_-C~>#)O?;uSt[xZVZ|9D vTl|"2f̘ȏMI rWBٰbŃQx0XD?wxF#%n39M.Q%ȎkzJx\Ґx]G=K1:8h\mT~dRq)sz?|W-#Glc=Z`ȏFQ\{-µ1h{Y&L7];*Qmi>^#T£瑖<ŃD)<::gGG0:y8?Os|qϧh4wlkiwG ߶5`r4:x{ǧyq׉<(58tE3l羻?xGfUs!?/n RzbjnC&uڵke{g:uw-uW̵N4*.x7we1Qe] EìZ6fq#!L%x0*+m&ZϺ{Էo_-4hs.׽[\$;(5fL'|*Q։&ZOR%<|Jf/F=Ǻx.x&s5&̵ѬjB6)+p駟n㜻?/E,֔XuUny?pS,Ձh[luBG \p+R|H-2]w Gm4u͌OvB ;keB4!vUs] > :/ڝ\ KWǏo/oI.ܐuq`jGGx{oف_PGMkwFחRFV*ƣ?7{T.hX,A[otv ?~Dq~mFn-[|w2q##3-}SS~GkiĬz67M`T}!ZkMGDP=PsӈVa׵FuKU֙>}}bj|rt0א?zh|g3X<gi[< ܒ4:I<;P.hT{ϡ;wkq!77!By\n:m~./Z 6.> * h:,fJo8 u6t‧unA{z "(g|] T!\<Ν?$4 єݱ )0B9M= 0`{{oF[iXs[E1Nz x4?]7g_{ڗŃO%<#C-(F#pYc:}gweQX;0,b7ވ/`9|p_KVvjk玌裏{`!Zt6fuY-~qu,>uYߒRx4~]qۘҨP FK p߂z+gc0 . Ѣp x6ߘpۚk(FA6|g¸oNW/7Ck.?-kT(#Y 2dHoeu!3 \~q_.t{u.}-ͭgq.ZY@f|] zCU({V9(tx`I!L%G<^~eӭ[7TL6m8c"fM61z2/|0]n'|bk׮ҥi۶mn+g}k$`Q=;hF~ȨzRD#MΝXcfV3K-C@ȍYgur-gtСUr"_L!:Q޲.7M;"Wx&Y`qfM7m?g?Yo]uN傕4@ϯo5|Μ9 x[ QR%[x0&C<KG)I.yJx4Օ* d&ۛhFMQFΔJwyoEm'AJOU%" AI?Z[P!?D 㒮iC&|GC<K`,U0TDSM3[Jx,ăTC.R%!L`ĈfС6rgϞ eҼyLݎ`g} " "l~~e|] B&K x`,I?ă $&C<K`,Upv)#G^&Zg3OX:u5W_}K~ǗF.W" "@*i)*!?TudQi¸+xڐ&C<K`,I?ă $&R5ߚٳg)ShU3zh`өSxkfXv?M~h{9s嗛oѾ;RtO;"X~`I!LrSL1==z9rxonڷo/r̙#{azk;_|}3gn^uJ+_!=P#mã &ၶdҤI=A1o<S~~Ξ=۬:|$|[K.2dYuU Q]O=1cF0㥖Zw}O>A[vuWVC~̅^СCM׮]C8|<Xc 3h >0_}(8pOwvԆ@ϯ!?T6曦O>/Q?o0jO>Ė;c?#s}cǚɓ'焏#8E}E'/./0l0?gmlf34;Y~] ^P?xmtwqS_9ͽk/9ic$|GC<K`,I?ă T~/+#4v}_{۩J':8s W]ufN9~C|(x?EhV[me>33m43w\: "I;JQfM\<։G<0(Wm~>>5uՅ}ZC;~qڥ/+4ӧO0XlM7uF||(!ҪC^2?Vv'v'c=֬Z.*4t;W\ь1w5 `8 JrYgv#otr-K[{A\~E@D WVuːU[ZZ/@h^ږpB 7`\8>.:B/8N3]t}VO?mGg7vsb+" yѮ];ӿ“{.]ic"|GC<K`,I?ă T~8Dِp`._|16a= `ꫯn~HLg4;xwPt \tVv0+ n`IՖLNj-gm=ɹW/aF# JCn-Ѧ{0xOum_jFy z( 7,邏N2]vMQWYe8'zaG/UnA3>p#\"a|~;0FYq{a ǴmJ /|}͹t6jwD<ă $&|pi7 pِ|pc:FG?`Ĩ3p hNgwbI15 7xgdM* M<ă T~;9J!nY+8;lkVW׎`wel]c\7jNԵ^cCsXwpS,Gg/BcܽG/2H "P_׵ _Jp/bH[ C>ιqXvԨQH7ȐMHK(;"X~`IQ>gj?eZsw|.1-7|C0mhpInY+rhwYq%XD?c!C>wi r`tfmfZKyg1#ц`qm 6>馛̽k]?ic0Y73C{`qZar}:8p(Ŏo_%e:T0;}0_D\BE *iky%Y-_-C~UeGnA?s$B ޽aV|8/Ї/ ppS(Ȑ_NsKK%;"X~`IQ,L ~nxF8r{WC ͣ􃩊x0|/mfB&y+:[)H00>ѹpu{mNvu!-ft& ub?:fqŌ\83aÆqRa-cZP3 ]g},}ZpA|GB"n׵!?T6#SFí ^ZjPdwB ƒ({ E\@6 aW>m1Rݟt62wD<ă $&rW_}9ꨣ(1bYeUxe"1!?# E-#oBD\zJ?x`\nF{a3͆{'^d06uoa`w爵;+܁l8/䉙{+7]~4h_L 'tSAq>=N\ds=7,E|+ct1xLn$1i]wuv||C>fL8j c#ߑЯ4k Ǐoa]]Vu7Vߒ]n51raqg nUOAG/W{I3#7#8\s5,t duk_"Sx`,I?ă $&Rws /w4FbE`Nq(b%_؏Q$B<8F)L[<*灑uu3vuW_v`=Yfnl B0 5'Md~~[.DFb0c.[w}ĉntvp .R(!Y.ȐHWC WVuː53Gޥ FN]AK1#3cu~_`3oDZc/cB#fIW_năx0X~`bݺuw)F胀QfdU"F_5n.rg&5Z_*@{qmuFu ~9WF><z=Zo]?nnb~a#;ud nWv:nqaZ.wi<.2V;H6G;f5k׮. GCdh[O WVuː57#Ϸ`a\RCs W~nyn߾ &D))@@ #T8>%&C<K3vAJ@k+ WF5e wp7;zMT` $tu!ds[ zOy(6w}M6m8ZX|)Y☡ 8m:!Cۄ~Q>B|~ߚѣG{~]G \A}[\^{m;SOuY!E@* $jnC Bņ|trӘ>L|gwS4i3lIW#!L%x0XD?!vmORŢB߾}#F|t,Y߹~n{޼ysr)uc[(m9|u1;2l}Wlqph~ijsG\"E \Oj``Vuːj*6|](s!FQv!?D+xeg]ăيx0X~`~}aDsK|"\b_d'l]:2}HK[b\ȸE+qFȍۮbr _v̘1>| :'{ νP!Hu2Z E&ߋFtٖ{C/XBKnŋ͜9 q; 6fwD<ă $&C<K#1sk\C>B0 ctwRR~4]s5+ J#X PG7wL<731;S%\bmsÇyM75~N;d}Q{cᩧ\b7,[N8 Rő(7`r,T=cgF8 .\'>BA򑟏E>~~e|] ]!> ǍgGcɽ(QS0c\S]VX;rH8"rV[ӧۤd)6[+xx&C<K`,gǂ< ߐc \`-#L0`!}1X(&Md:t*]we`wn O8ᄠOm0=ƲjC1lNj1񨞇3ta$3sq|wޱWhNj! X}~o]kl~~e|] ]!#v6Rwq]uƇ_C ٟ%/#8yd{*=m4Hti=X3◔ߤ+x8&C<K`,hs_\tEvG~̃>hFaΚ5.TgXCv >h|V3ך;Om:Hu2䇪uU|P x>sFBad>``ݻ}!OM0oˎCx[BtyQpQJG0- `B):`(b-̐!C-+Q΋]bϭqp<: nC;NR/_Y-_-C~fWe#>)1}p׎ W;IW]Imr(X~`I!LJ͚3txzLX| K0.CUW JicăxTmǎkzfu[w*fF#kh[|MЍ˯_޽Mvȹ NAp4Iǽ{@ot2]k[D9$jnC-DUPK@<_x0&C<K`,U*`[o.]z:dꪫ8z)3cƌofmonXG<0( n裏6OM]So߾֐.jvil<+. tMduݞ5k5j[|@G f!,\~w-w=sOc+lp G|x+ Cw5 `v3Π$guaL޽mN;Y[adǨ} LkJp.*!Fo=N}~@8Z `Q= _jsGssKp{^oRKؽ&7جԼ*M裏NBw3/|n" u"+eU GO<NE3cF!ctxv EtP_Ӗ?>‡">Vi#!L%x0X*E?n%0CkL#|Hb~#[Pḩ~B=ѭ8yy!C>u]M*£Ve5C>wFgg-θsv9ky}~{ klfwn}ikݘ?XcCnnnX@M-tH_ D@Kgu2QU|ʷ~{/^rb6lCq- #Q)?{2¶6a?s4t6dwD<ă $&C<KG8ד-sfmcJ&ElGrg.Fpϐp_ܱ-G-i<ăT%<#:0PBpߊݻw J)'PfCw;ElQ|cjWw]:[~ u||9ёD%p=lqϖ(_j|0# b>? @ T^Z[P=ʐ_ukf< "2! Foތ94h/OBtc_ ^(&C<K`,?ׯ=a~Yεhw,~Yໆ,Őc%fP\ JnăZ%`pMFc@FߡX'γXd#1@ )a䇛n+ xx FP k X\lpt\ f r~1c}s)i<Q ~E *ikyEY-_-C~UeGnA?s,wF {v k̙֍]ei4v ^ڨ&C<K`,XK/bs lE$"]̐<M C Tk//99ߋm۶.,̚!fc[wa}s;Zү@u$eե { H]tEi M|% ^f+!^\]Ň~ǐ?).MqIW4&C<K`,I?*qW:2۝#FUVY%]X oi.a8CXhQl 4#>\ 䱑5'`Qtw071nt6-2/+-|K{*+܁l8/䉙X@]^~7C|ڴiv7s˳a̹LsӧOf\g>NDЊ+hwc[o΍Xn:X7w$+!kXuWuݍշx[nM \Ƀ n\ǃ;_;wn ,ŐkV%^|&pӓ0+Hro|g$S<ă $&C<Kҏx}cgƍg`sᤓNHZ4zn+` t78ֲ^z)C#V_[?蠃:?;찃f͊@v3^`xG=1nn9i$koXydXG]È~)P8G?r€ .|p%Fϟvioùz0wL8&GǤol 7޷o9oȇK|npmAAAGgu2S .s"Do?0Ȼ!u`$LE^/`رc1LËSjt|[<`B!L%x0X~T#auf [_5FcQ # >j('ߐo[CtȵNn/v]+u[ι5Y5|xTsc]!4{nnb~a#;udC:T(fpvF[܏v{ຏ?@;4dkGX I=zf]vq|C>СCsIJo;!?Ƣ hRzHVuːW57FXWinx$=X0a'x¦O}3|ۃ?Z10c|Oʼn@:/0,; L꾫9+6E{ CEQCkm'OD4G`b r_>\|3&ie&|gC<K`,I?ă $(ޟ@'m۶|4ƬR.E9E7Q~(א;XҕUɶ􃩉Gu<܀-tra}q`0nY?}?Ah~ p!ĵ͎ftDoVݞwy3h5S}u:_e̘1vu=^op?ۖ!ߑЯ@ϯFIbC>,|/R=йsg"#O,Z~P\`h[(`=t܋+sq[ok-Ń)x0X~`IQL\C>dxP-F'#wwJ wp{G;#b$n_&'q C :frKlMu_|0:oƏ DZp׊SOY7V(/~ c X_R79\vv$v/(7\ve sr" .܀;p|磤x_Y-_-C~FWeȇB,\sM G Ep]k/ n79.H@FHEaD %ƴ%!$]P;muïO_#8yd[FM6-~^B/'8؟^ /x9[s5!6uH x`,I?ă $&<ڵkW3w\.ag|A;Gy5vq ?0V"`0 䐋 䅋IC8|rc |nc0̙3H\\aڃ+'`pQ=g7Fz:Jߨ؇6>:\b6 ҢC0B}+΅[КqX_wug n /v-8t%о~f` X x03`w3* ׇ}] w֬YqgK ztpNhЁsc|S(L WVuːU)xՍv ‚YwA6ǽLS#sbkw$q:\/0xyO<.,qIWq#!L%x0X~x3fX>r{0F~q #>yD(W =3}ڟ/._BLH< >h 0Y0ov&Ga+u VRG^ߎ0# F z/ x @Dw{,x\ ?s˺nVv | 0#=:0;6?pw6gu>[/.9a>fsfxtׂNܴE@#+eܪ GXxLC+vൻ$Q<ă $&C<Kҏyu򍔅X wFC~}yYcǎ9I n6ߩA]nm 7AU.R~{6) NX7Yi\u6? r~m4_Y-_-C~ʐPqH'sKf#X~`I!L%GE@"PM{]Uu2 !*MtO2;"X~`I!L%x0X~0I" "VIY-_-C~M!?D 㒮iC&|GC<K`,I?ă $&C<K!ID@J :e 2䇨4a\bŃًx0X~`I!L%x0C@uVu3V&)[G-C~T>{sU<^x0X~`I!L%x0C@uVuːjdQi¸+xڐ&C<K`,I?ă $&yHHjnCm !*MtO2;"X~`I!L%x0X~0I" "VIY-_-C~M!?D 㒮iC&|GC<K`,I?ă $&C<K!ID@J :e 2䇨4a\ŷm믛hөSo<);>*H 5CD@H4"R";JhEJ!B@~T RDx3s߽߷{y߻gwvfggwϜ9X`vۅUVY'Kg}6H#HӴ30Cct. _~yxGK,fζq}%eeӡ%#zYW_lM0U?F~ eMI߆|~_|qQ{%>瞳UK. [o[%| oVxw?o|#ex{ wuW\~Bo~>J>fb-T}׍x+" xI! xIn-lVCЇ> 28|__WL3TT C(}y_>S:(uQ 7puGp E zݻ8 H9r9~\z.-҈/{i1㶽سXs5hwۇMt|{ xx^~'%xx^~#whk׿Nr ӈōhlO2,YޯV7^}F4_[Gg[~y7ԧ>U ۣG3^A Gt|Rt\,îqhN>v =m2=nЩi*OPU?F~w=zrfU޾=6Ȱ_WD<C<</I?R7AxSO=5lf)!)ᭈ3^xw3?a1 -P&/KQĈTbנR7<U0#*uaG!7y?cw}~(,n|tK<~H"`YLv!W<sgn$_OK$OK!.^{͆|JĠG‿+aN2m(G_HXI艣X uc KT7<O:J?(_*uZDgB(i$bc>kNF[/DOC ^K}S nxgw9%f}S1]fȧ̌9b$Fie8sRuڲ6ß07/RG,{:0wӱbvcvDSqV߄&M{=9j:oKVC:u#>*eAbb+ C*1Sc;3f⒆Wli*bW:]^ᯠx'%xx^~'%G

dIl=fpcqn㒣a.>Ҝ U[E9S#A\i]?nn=`^K1Q_4˪m@ϯQ_:eIqe''=0Veɳ†YѰb0|٪ogh7VsY7pᯈx'%xx^~'nO'ѥK o_eZHjBSvU/OaJ(ggX Ou C x+Q)ECz;'?N&|r>B὘P_b;o'K,DF )\->Km].=˧~z w) xO &%-؟ ӛo`@Ķ%17w GĨ'ɆQLuy\rI~,̛/sBݔ%F,,I c048-H~]w%Ix:/ =gBI2C>!d˯%b\d nXK{F3ϸ'tR:&mi z-E3gn0=8r;!,[_.(/)Vu[*~E/1Z~#z蛇;D6aQaUb=xC/ϐӭtWйn{K xe=u#$OK$l eBOKxM^ve)Ԥ<̽`BD#W l# HN x6KsСGv%g[B٤оp c7YRK"$,c)u3z`o_hѰbBWFL7tI{2aD 3̐wG;%w&ΝzmU_L+}r612qސb.rڧyǕ>I#6ZdڶV[6D:+[iƒb$B/iJ6 ]8VB .(ODviijd@o:"#bIqn裏t9lcV)UPldY5_ȔYYoOLL8^d^Ce뒯9 #e+#ƺ+vyIz 9rixx^~'%xx^~) {)r>|DeΛlIjF#;#<w>LOS<#vt9E8\,*xkތ!w7'_vf[& =xtɸMwćXgg^#][O|:,WSW1GN#OK$OKҏxǒd 6e))B 'RT;落x ]amI6' ,shO8/e,0x0)qƙ$>`'y;w{h'nylvq/}y-'|eb3)߾1bganr7fiy gN)҄u2DΤxߜl>GC~c9lS1&e9^۝L;ɓWYeTS Zh̨F2IymW0"#?H (K\o1$y~~j:oy䗵,w4t3*{BYih!3ߗ ^&)*wU}׍x+" xI! xI1~f'lz2&f㥗^H뮻n ɇq SxQ#)$y /niao-͗u`^kIKL=#>!RLzWɭGˎ ǽM.(bմ\>^{=4Q.F5X#`&a 9KN BV`t& 믧P03bUpAѫ?D;-Ygdo Ґ饗qBCg'ls{C [{Yle.Ce $YV-)fy梈 'S+T(:ق  -%PkTyː_zc鳮!6<0Vָ[&%ȴJov#>ċb1cӥakDzkja\sS$OK$4QMRiuFޔŻ+a,ڥ8T=څ˵/M0eYiGo<':}:*ѰTnmѲT|Bk&`!o<^cBgX/R~'ײ WMn`kdr,yyPCB(Oa_;S:.g8 O'vtG(\be`lӸx΃Ǯw[tJÉ_n䌡a~)7z|v|q-a_c1-1^Ɛ[ Fb΋ ͉o|#vaf#Iz+zm!bO*w,|sث!㽦8k+-cHacxXsvXN̫6_~X?#Z]C˼Q4Z~~j:oZc촢o!DDNj1n_}޶Ӡe[7x]8qxW<C<</I?7Sx}w5\3- O,1BƬhȋ {e5b4pч3x<_ᯈx'%xx^~'%G<0: awZbvm(yNDb{wpޓg݃NOTh*+B&O0i6ĵygyf:~ڲV{M0Ir>`q,.c'1K::Z%ñJE|aZzƘ9hׁv*-saT9Stf1kI3'T[*(=xjU?F~ e TTc f}_~L3DD :kXb%d8SKuYGksut @zTyː_>Ȑ_FeU} x+" xI! xI! xIyHu2䗵 2QuUuC&xx^~'%xx^~'%xx^~xD@DnG~ em eTp]7xݐ"! xI! xI!$+Q_-C~Y C~!\W ^7dᯈx'%xx^~'%xx^~'%!ID@JzTyː_&Ȑ_FeU} x+" xI! xI! xIyHu2䗵 2QuUuC&xx^~'%xx^~'%xx^~xD@DnG~ em eTp]7xݐ"! xI! xI!$+Q_-C~Y C~!\W ^7dᯈx'%xx^~'%xx^~'%!ID@JzTyː_&Ȑ_FeU} x+" xI! xI! xIyHu2䗵 ]YfR \qZz{x'%xx^~'%xx^~'%!ID@JzTyOY{tUCm:y"F]/=C<</I?C<</I?C<</I?$" Aר֯GUfȷ,6Q8w OK$OK$OKCԕ@֯wDUz/CU~k.A$ xI! xI! xIyHuREU!SAS )'P$GUZC<</I?C<</I?C<</I?<I" "PWUףZλokc䛇 RSN~E}J-C<</I?C<</I?C<</I?<I" "PWUףZ[6A2*Cn_OK$OK$OKCԕ@֯!M!2WD<C<</I?C<</I?$" u%Pu{=e/kd/2몾L<$OK$OK$<$@] T^j:o˨ Ẫo!EC<</I?C<</I?C<</I?<I" "PWUףZ[6A2*Cn_OK$OK$OKCԕ@֯!M!2WD<C<</I?C<</I?$" u%Pu{=e/kd/2몾L<$OK$OK$<$@] T^j:o˨ Ẫo!EC<</I?C<</I?C<</I?<I" "PWUףZ[6A2*Cn_OK$OKҏ_x≰K&$Q<$" Aר֯!!2WD<C<</I?c<{챰RKoa$P<aꩧpmL4U?F~ emI߆s9'ee~a+{7wq.vg |x|#aV 묳N*kf_җz*s2W}׍x+" xI! xI??Oo?O '{[nя~45\EW^ye*M7tajoJ 7tS6VN34a9 S :x GߋQ W\ _oSgM w//aWl^]*{C9|H0ߩOKw+i6w /Bxjh7wpy[3{w +<ͺ6l@;K[o5 L=עh4E]~8;cXXc5;<|"P[㏇w=;|__WL3裏=\Q!*1z [zꩧas m}c:#>MK.eW᱉`y ?A2s?;Nʿk-oo)2,g>_||?<|H0c8{]wU o_Sj_Lq}v`=[n@~QC~:,&v%ַ6E};K~;ʁέ:]38#<#nH CkN~ t,\{K,/"&W@?ϯ?|O߸νUaU_UvUOз~5V޾ v4ۋGzl[S/;o]y3:o>~x8䓋|ɰ^J>Oq,z'i< hC<</I?C<</I?z裏$ IN;m?B+]8li? 8Xqe]w-Jl4,X@7,E_sQG10c@cp<^{oH xb̽+l?5?'K/4uY<8p;蠃l7QF3Î;Hжe]6-? Ufh[ɖ~{v~xxb! xI!SOM  iÈWI͆(Bw`@38O<)/攇!4Ds[wq{4V~xR18|/Jl c:_r 9-0r6wy?':C'^C'u0xMDG#`kFu Hz: KO2[!m&F>=~O)#iN*:`7t͒E`ؽbxwiNl}nOw'xb1WUzi޿Mﶪꯪ^UU;9z {w܆|ZxK.$ O 1ԍ{,<Ve+_)z9ןe-yMz቉xx^~'%xx^~΃8fC>%bh:S7<| 'D!?0 |rIɉ`xk/r39ók%n|>%e2@"\[opu׵-W_MsUI*sY{-OE`tBG_u Bh|ޑnϽ-|U_Uƨwr[7AZo 8l6"33ܗV)ʠGꫯӳH Io'ROs/;TC<</I?C<</I?zS $ {ny;/ռPye-b:yo;eIᩈ`xko-O'{x4Z6eV+bs22yVފyb] c`nɑ̐aZCH s1u-뭷9g?+|vns1GL_`m^/|Pact0)Zk厥Y l>"LPvz׾|E`( " #le]"d{o=5Ukҷ^5NRqNjۛM|UW]ǃ _ /x'%xx^~'%G<0I"ilK#o^ap}@tn/y9cSl37=! ħ?O~4(ǹ S?|Ba[ }_Lo|F_]b%9ZdJ;LD>Q8pHd6JMʨ{-U_UƥwmgP[+Cߟ$$z;sG^W^ye SA> r{ߋW~xl1~^GZ"J+2 W2 g%:u]vi%n}y?9ݳ5Xcu xZus5$c;|X B"ㄙ!1̐X`ص^kRXbk qntX93<#p6:\h1@Z6ɇ3te[~^:] (te{*U_Uwr[7A\o|hx5C_i2ƦgcoďF{XX_{oE1N.f]kœpH<C<</I?ѳt;km˾пKрI1Ѩֈ,>z6A V1@ՈWF 9Ѳn7H?<)?~/#h/q婧jC[㤏^%~(İWN7pCQ-D8ovY޶6ʳ:cb=G}aW^Սh/ֳoFtkđ[䳅ZЎڎh\_Wo9z]UwSзn56x3Ď鉰 Lv믿>)=wub8;NsDt>၈xx^~'%xx^~ޟL{YK6[~=u/$<] OIlڲ{sbeHlSI;:ӗ:$1E$ /\lb"T\/6:!b>8+ĶLnSCMaɋ/hFN[$6r>o=g۟{†nhե_7|L;7<)S,|X%Qe'\1~nNHEQ6_<Ș#5a %䐒L&G1 ; Cz:|ՄXOnsሇxx^~'%xx^~kZjd]JŨKƲ9/馛ۯSrC>ƭ/M6׹S*lڹNwOj<[ C>q0ޛ'Q;< t-pwqGXeU-b(zqቇxx^~'%xx^~'M".^&ΐoyxʶΐvs8{9^'I?<5^Gds1*fxYjd锁:'ocΟ:V[vor<hx x:묮Ao=5ztDl2xadKK.dП<~Q8}N99qc64k&%\]U; ڲ~ TUUkHzǫokZ .8?_zY9iҤ fm<tB<0/ڰ9;vtC<</I?C<</I? soWO^ 䍥n e${ュɐO&޻ QA»IpIOM<1E_s{ONu! #^7dRW^fM7ZkҼOs{M6oltVvi}HVNF:n喔^ߟv1CyFeҐ;SϤ8Lއ;3?`6τtB)b&hu 7rLdqXz73l~E`( Tu޽u檊wNqC>^x!1xdztDžm⅒8<>v>я:N b?q 'LOoq"xx^~'%xx^~r-<,sn=N%Jƀh5ъ EB<͡u,P|&._oz~x\?~/[K‹' v{u ;SLG}e[n.tp݄! ,dZl&Ct:/@I cz3vHU 8ݽMy{ + gyfvڹYaG9MdXZX~[naJmuޖic"YYGկ _Z[6b܆|>G3ӧc*bf^sҽޛvUW]5JP9 31zBʼCX ^7hᯈx'%xx^~'%GogNlnUg y"l͖Vb!=ؔOS-÷uk05!<1O:S;z$E#)LR!'ÀsF7uZ~/!zCz뭷\Ӳ _Z[6"z┦/_NwߝY_yo_4qB/NxSuӺ ^+[>E]+s٢q?m/?n qb߇~VOnׄ9'"x'%xx^~'%Go)kqm3n2׏%^a^e2K$WiGo<H;ߓ?| [ShJLʼnC< Yc VZh!7GXdE-ߪx{ 3Λa#_ve wF35pynYg5}3<-+|;ayMzVXxweg32# ڝxGC~C]^ꌡҼ}K/tb>RWZi%W,1"y02*I=pMD`"5_֎LC~ɍҺoEC<</I?C<</I?C|p"K_խG ;s K(ɕ>p&Ƒ=㏯c=R2B\Cq:HFUjTyːo@+C~NcN<$OK$?'ywk{%釿Q=qaRvG?bx47[ VXaP%b2zn\A:u;FLU?F~ em eTp]7xݐ"! xI! xI!ЏW_}5}90=su PtB8wG& pL>BU}Ϊ_@:?Q_-C~~ز FbO<$OK$OK$<"~{{]dž~ 놹瞻. KzTyː_֨Ȑ_FeU} x+" xI! xI! xIyHu2䗵 2QuUuC&xx^~'%xx^~'%xx^~xD@DnG~ em eTp]7xݐ"! xI! xI!$+Q_-C~Y C~!\W ^7dᯈx'%xx^~'%xx^~'%!ID@JzTyː_&Ȑ_FeU} x+" xI! xI! xIyHu2䗵 2QuUuC&xx^~'%xx^~'%xx^~xD@DnG~ em eTp]7xݐ"! xI! xI!$+Q_-C~Y C~!\W ^7dᯈx'%xx^~'%xx^~'%!ID@JzTyː_&Ȑ_FeU} x+" xI! xI! xIyHu2䗵 ]YfR \qZz{x'%xx^~'%xx^~'%!ID@JzTyOY{tUCm:y"F]/=C<</I?C<</I?C<</I?$" Aר֯GUbS<jdğ$Gp\9\=% @\o w/aCi]0m/Ӆg|} hԬvL0R p0+a(KHM=t1`[1ɨp`rO0)V0#og_m̐" # %Y2 9dEI"po^$'weCp3a rGt| G FWqV'd1dRB=0 %%%t:a'PZXRRZ$7n?@$;LO?4#""NUV I~LX]QFww7ʘvtTٳfI"i۔R <={,N]^ }vt\a'rx$w̷‘iO@ix _3zP19r$␜+mmm˗zQ]] ǃJ477k۷oGLLfQݨ@r$ҥK:u#&&//ӧO}RYUU۷GeLL6{NK.1{Y?Zx9X$|kt۹~pXvΌ)g(<^$Yղ*~߰1\niֲQQQڒΪ*3&&yKŢ &%%X>lll4!6mNJJbEF[k'*֜>};ażpj'=M>ɜ6m{9VVV_WWEn_bb"O>v555񲳳;6\l 0 .[̒z=FU[}LE{SSҥKޮ>444pܸqzn@[[M9''MMM*E SNN2EQQQ/~p-Μ9+s֬YuKiq~?wajN%Q=IuH֧~Zq|U {&k8q)UTUd{pl_WnѣyՆ m`ۭŖ3gpݚ7IN4KA gϞU-?]70N:er)-6sJ].UԼkR ݜ>}RCFņeoxK/iFRҟ=3T]0|p~ʝu',YDK,jӧɻwVQgUrJnjj͉DEEɓʝ &MFIwImHS"(b ۹srHT[lܱc+WT)ӥ^/ &6W)tF{LlGDD>iˤV\)66++˒*t[B[[v^ZE`FlHWX-K܄[m-//t:UfWxp ab#/^l ]p؞ 6~NZhll%?)txzKnn֊0&&--MQȁ7x~*֭[L\d5ƌ5kֈ~x7ǁ֋I."3fyډ1oz<\ӥBN*rEɓEunI, 7nTv!oSy2aĉt:M_t:1qm: KEf;$Hj^vM$177\2(w}ַe |UDф"#F&`>|iӂoi҅U>R IVn:x zc-C(+ `d(ܼy3Į~nݺDܸqCX\z5,^^ܼyQQS09NtuuD]q@~zkDϻ!}ۉ~8$իs݁@Ơ~[/< $_] xm'f̘!=#X+Raذa={ٳ1l0-QVa*z@4k UpۊGyD\w(|FoT:IM.gÒ+(..|p8P\\Cw ;N$= YzڍѣGv+|`@ g}PH~tKx' ~?WYaA2[rN|d$UhmmWө3%TVVyq֢, ? v+deeapYpw<  ,@JH2.;rHa=Xm0^xZrgHϙ3G%aEޞG pz,Z+_hѐpn@{{B|S't|ԅV'%%i f{B')*;;[dٳʹ6/ 8qD~66tر*bo?GR'?aWݯjjjDpR}SG@zjc˖-e@z 1p 8ydzѨ )ֆGܹsV.^cNJvޓaq_HQzΝAM̽4\z5###bWdd$׬Yc&6lذA܏TlKA\"A5R8r}ǢD1::Z܇ _\\*r-ZT'EssRL91|}7nT=xQ P増^ZlWoYvm;r.өBw eC8JGfffM+Kŕ+Wr9YFE;C44ϧ}ɒ%Z2 o2öxb=_+[  я~$ կ~;w뛁P8g ۷oGyyy=xꩧTBQ0W@Hz455)E[w:֭[M?[nͮ HIդ$,\VVԑf2`}[l2sϞ=***!{RWj:hoo75r: ̤)((PDqj+5$//O[bXf28<숏QQ#[H THmwAՙڮJSl]Po=ܣRQs$Ҁq2ĉ*j̙3o \REqK/Z"`IqLN1EzY䦦&8zu:\nm۶ƍ*.LpJެ$...jooÇm6n۶> Ch1H){KfffH}Vqm5jTUU N%)z… ò(SZrILL4h`H.$III;!&&7nTYQ ܰaxM|Ċ qz^|N[G VUUU1==tgAڵkUsiEMM KJJ\t{ů`T-Ӓ0 q޽!YkoogYYĻTno.IdhAS/3ߩpܺu+?#լܲe ϟ/k$)3f0;-;GRkK0}Gى|gذacVHKKɓv\1HJJ $сv\~/_Euu5<*++ڪݶk?87C?4i86'iӟjM.-n?tJ?g“HXPzC]]_{5?dFFvB322|r۷O%l .ɝC2N χ\v W^EGGG_,k˅D$$$raܸqppEFF]A`;!"$@V(!GwB0! O2 nBI.'?M?1 chY5H>L];F1a1_W3;{^I7ə^ IV!0[&-aU6?  `>1*~cag@ Yd29wBL;;nF[ 3Lp/YTp "@Ku؎@2tsH wovr"; c,~?pIENDB`dasm-2.20.14.1/docs/sources/introduction.tex000066400000000000000000000137401375233463600206420ustar00rootroot00000000000000\begin{savequote} \sffamily %I'm completely operational and all my circuits are functioning normally-- %\qauthor{Hal (2001, A Space Odyssey)} %\index{AUV} %\index{AUV!\emph{Starbug}} "Do you program in Assembly?" she asked.\newline "NOP", he said.\\[0.5cm] %\qauthor{Sayer} \includegraphics[width=0.75\textwidth]{dasm-logo.png} \end{savequote} \chapter{Introduction} %\begin{epigraphs} %\qitem{ %\emph{``Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows %where you live.'' %\end{epigraphs} \section{About} This is the Technical Documentation and User Guide for the \dasm macro-assembler. It explains how to use \dasm and the supported assembler directives. \section{Home} Since release 2.20.12, \dasm has lived at ~~~~\url{https://dasm-assembler.github.io/} On that page you can download prebuilt binaries for MacOS, Linux, and Windows operating systems. You can also download the full source code and build the program binary yourself. \label{changelog:20200913bugs} \index{Bugs!Reporting} For bugs and feature requests, please visit ~~~~\url{https://github.com/dasm-assembler/dasm/issues} \section{Features} \dasm is packed with features... \begin{itemize} \item fast assembly \item supports several common 8 bit processor models \item takes as many passes as needed \item automatic checksum generation, special symbol '...' \item several binary output formats available. \item allows reverse indexed origins. \item multiple segments, BSS segments (no generation), relocatable origin. \item expressions, as in C \item expressions are computed using 32 bit integers \item no real limitation on label size \item complex pseudo-ops, repeat loops, macros \end{itemize} \section{Conventions in this Document} This document uses standardised terminology to describe usage and function. \textit{Should the name be ``\mono{dasm}'', ``\mono{DASM}'' or ``\mono{Dasm}''?} Yes. In this document we shall refer to it as \dasm. Usage of directives and command-line options are shown in a box like this... \begin{usage} dasm source.asm -f3 -v5 -otest.bin \end{usage} Items/examples that appear in source code are shown like this... \begin{code} MAC END_BANK IF _CURRENT_BANK_TYPE = _TYPE_RAM CHECK_RAM_BANK_SIZE ELSE CHECK_BANK_SIZE ENDIF ENDM \end{code} \label{change:lsbmsb} In 8-bit microprocessors, 16-bit values are represented by pairs of bytes, either in low/high or high/low ordering. The ordering, called the ``endianness'', differs between processors. In this document, \mono{LSB} refers to the least-significant byte, and \mono{MSB} refers to the most-significant byte, independent of the endianness of the processor. See the unary operators \mono{<} and \mono{>} which are used to retrieve the \mono{LSB} or \mono{MSB} from a symbol/value. See \nameref{operators:unary}. \subsection{SI Units} \label{changelog:20200909SI} Computer memory sizes are referred to in this document using SI units. In particular, \mono{kilo} (\mono{K}) is \mono{1000}, and \mono{kibi} (\mono{Ki}) is \mono{1024}. A \mono{bit} is \mono{b}, a \mono{byte} is \mono{B}. Thus, \mono{4096 bytes} is \mono{4 kibibytes}, or \mono{4 KiB}. Historically, disk drive manufacturers were responsible for this change in meaning of the "kilobyte", as they divided capacity by 1000 instead of 1024 when listing drive size. This not only made their drives seem bigger, it created an ambiguity when discussing computer and disk memory size. The adoption of the new SI units for computer memory size removed the ambiguity. \subsection{Format Description} \label{changelog:20200829formatdescription} The following format templates are used to describe items on the command line. \begin{table}[H] \begin{tabularx}{\linewidth}{lll} \toprule \textbf{Format}&\textbf{Result}\\ \hline \\ \mono{item}& one item\\ \mono{item ...}& one or more items, space-separated\\ \mono{item,...}& one or more items, comma-separated\\ \mono{\{item|...\}}& only one of the items, bar-separated\\ \mono{[item]} &optional item\\ \mono{[ ]...}&optional whitespace(s)\\ \\ \bottomrule \end{tabularx} \end{table} \subsubsection{Examples} \begin{code} A[ {B|C}] "A" or "A B" or "A C" DC[{.B|.W|.L}] "DC" or "DC.B" or "DC.W" or "DC.L" DC[.{B|W|L}] the same \end{code} \section{Assembler Passes} \index{Assembler Passes} \dasm is most likely to make multiple passes through the source code to resolve all symbols. It is not necessary for anything to be resolved in the first pass. The maximum number of passes (default 3) is controllable. \dasm will return an error if it can't resolve all referenced symbols within the maximum number of passes. See \nameref{flag:passes} and \nameref{flag:passes2}. \subsubsection{Example} The the following contrived example will resolve in 12 passes: \begin{code} ORG 1 REPEAT [[addr < 11] ? [addr-11]] + 11 DC.b addr REPEND addr: \end{code} \begin{outputx} > dasm test.asm -P11 test.asm (8): error: Label mismatch... --> addr 000b test.asm (8): error: Too many passes (12). \end{outputx} In the above example, the example does not assemble because the number of passes (set to 11) is insufficient to resolve the value of \mono{addr}. \begin{outputx} > dasm test.asm -P12 Complete. (0) \end{outputx} In the above example, 12 passes is sufficient to assemble the code. There is generally no harm in setting the number of passes to a sufficiently high value. Most everything is recursive. You cannot have a macro definition within a macro definition, but you can nest macro calls, repeat loops, and include files. The other major feature in this assembler is the \nameref{pseudoop:subroutine} directive , which logically separates \nameref{locallabels} (starting with a dot). This allows you to reuse label names (for example, \mono{.1, .fail}) rather than think up crazy combinations of the current subroutine to keep it all unique. See \nameref{flag:passes}, \nameref{flag:passes2}, and \nameref{pseudoop:subroutine}. dasm-2.20.14.1/docs/sources/legal.tex000066400000000000000000000023541375233463600172040ustar00rootroot00000000000000 \chapter{Legal} \section{Authorship} \subsection{dasm} The \dasm Macro Assembler is... \begin{itemize} \item Copyright \textcopyright 1988-2002 by Matthew Dillon. \item Copyright \textcopyright 1995 by Olaf "Rhialto" Seibert. \item Copyright \textcopyright 2003-2008 by Andrew Davie. \item Copyright \textcopyright 2008 by Peter H. Froehlich. \item Copyright \textcopyright 2019-2020 by the DASM team. \end{itemize} \subsection{Manual} This manual is authored by Andrew Davie and is... \begin{itemize} \item Copyright \textcopyright 2020 by the DASM team. \end{itemize} \pagebreak \label{changelog:20200824license} \section{License} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see \url{https://www.gnu.org/licenses/} dasm-2.20.14.1/docs/sources/machines.tex000066400000000000000000000054241375233463600177100ustar00rootroot00000000000000\chapter{Machines} \label{Machine} \dasm supports specific machines and processors through the provision of companion source-code files that can assist with programming each platform. These files are located in the \mono{machines} subdirectory. Machine-specific support is provided for... \begin{itemize} \item \nameref{Machine:atari2600} \item \nameref{machine:atari7800} \item \nameref{machine:channelF} \item 68hc11 \item 68hc908 \end{itemize} \section{Atari 2600} \index{Machine:Atari 2600} \label{Machine:atari2600} \label{changelog:20200908atari} The \mono{Atari 2600} is a game console from \mono{1977} that uses a \mono{6507} processor. This processor is similar to the \mono{6502} processor (supported by \dasm). The difference in the processors is the number of hardware address lines on the chips; these being \mono{16} on the \mono{6502}, and \mono{13} on the \mono{6507}. Thus, the \mono{6502} can directly address \mono{64 KiB} of memory and the \mono{6507} only \mono{8 KiB} of memory. From the point of view of \dasm, the machines are identical, as the \mono{6502} and \mono{6507} share a common instruction set. \subsection{Processor selection} The target CPU is selected with \nameref{pseudoop:processor} as the first directive inside the source file that should be assembled. \begin{usage} processor 6502 \end{usage} \subsection{Support Files} The \mono{Atari 2600} is explicitly supported with two files generally included in most programs for that machine. \subsubsection{\mono{vcs.h}} Contains the standardised register definitions for the \mono{RIOT} and \mono{TIA} chips, defined with uninitialised segments. The implementation allows relocation of the \mono{TIA} base address to a shadow register address. \subsubsection{\mono{macro.h}} \label{support6502} Contains some useful macros. \section{Atari 7800} \index{machine!Atari 7800} \label{machine:atari7800} The \mono{Atari 7800 ProSystem}, or simply the \mono{Atari 7800}, is a home video game console officially released by the Atari Corporation in \mono{1986}. It is almost fully backward-compatible with the \nameref{Machine:Atari 2600}. It uses a variant of the \mono{6502} processor. \subsection{Processor selection} The target CPU is selected with \nameref{pseudoop:processor} as the first directive inside the source file that should be assembled. \begin{usage} processor 6502 \end{usage} \subsection{Support Files} The \mono{Atari 7800} is explicitly supported with two files generally included in most programs for that machine. \subsubsection{\mono{vcs.h}} Contains the standardised register definitions. \subsubsection{\mono{macro.h}} Contains some useful macros. \section{Channel F} \label{machine:channelF} \label{changelog:20200906f8} \index{Machine!Channel F} \emph{No content yet} See \nameref{processor:f8} dasm-2.20.14.1/docs/sources/manual.tex000066400000000000000000002226251375233463600174020ustar00rootroot00000000000000\begin{savequote} \sffamily ``Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.'' \qauthor{Martin Golding} \end{savequote} \chapter{Source Code} \index{Source Code} \label{changelog:20200908source} \section{Encoding} \index{Source Code!Format!Encoding} Source code files are written as plain-text (generally ASCII encoding) files. \index{Source Code!Format!End-of-Line} Both Windows-style (carriage-return, line-feed) and Unix-style (line-feed) line endings are supported by \dasm. \section{Comments} \index{Comments} \index{Source Code!Comments} \label{changelog:20200909comment} \dasm supports two different comment styles: traditional assembler single-line semicolon-delimited comments, and C-style ``\mono{/* ... */}'' delimited multiline comments. \index{Source Code!Format!Unicode} Note that comments may contain Unicode characters, as \dasm effectively ignores the contents of comments, but assembled code cannot contain Unicode. An open comment directive anywhere on a line ("\mono{;}" or "\mono{/*}") terminates \dasm's label/directive/instruction parser for the rest of that line. \subsection{Assembler-style Comments: ;...} \index{Source Code!Comments!Assembler-style} \index{Comments!Assembler-style} The presence of a semicolon at any character in a line will flag the rest of that line (semicolon included) as a comment. It is common when writing code to place a semicolon at the beginning of lines to disable them from being assembled. There may be valid labels, directives, and/or instructions before the comment. These will be correctly assembled. \subsubsection{Examples} \index{Examples!Comment Styles} \begin{code} ; this is a comment ; and so is this label ; this is a label followed by a comment ;label this is a comment, NOT a label lda #2 ; <-- this instruction IS assembled ;lda #2 <-- this instruction is NOT assembled \end{code} \begin{code} MAC TEST ;{1}=value <-- a comment showing params ENDM \end{code} \subsection{C-style Comments: /* ... */ } \index{Source Code!Comments!C-style} \index{Comments!C-style} C-style comments mark all text between and including \mono{/*} and \mono{*/} as a comment. C-style comments make it easy to disable the assembly of blocks of code spanning multiple lines. \subsubsection{Correct Examples} \begin{code} /* This single line comment is valid */ lda #1 /* And this comment is valid too */ /* And so is this Multiline comment */ \end{code} It can sometimes be useful to enable/disable multi-line comments with a semicolon... \begin{code} ;/* lda #2 ;<-- comment disabled. This IS assembled ;*/ /* lda #2 ;<-- comment enabled. This is NOT assembled */ \end{code} \subsection{Commenting Out Large Blocks} \index{Source Code!Comments!Disabling Large Blocks} \index{Comments!Disabling Large Blocks} There are several ways to disable ("comment-out") large parts of the source code. \begin{itemize} \item Place a semicolon at the start of every line of the code to disable (Assembler-style) \item Bracket the part to disable with \mono{/*} and \mono{*/} (C-style) \item Surround the block with the conditionals "\mono{IF 0}" at the start, followed by "\mono{ENDIF}" at the end. To re-enable the code, change the \mono{0} to \mono{1}. Note that this method is may fail if the enclosed code has conditionals. \end{itemize} \chapter{Command-Line} \index{Command Line} %\index{AUV!\emph{dasm}} %\label{chap:Starbug} %\lstset{basicstyle=\linespread{0.5}} % {\centering % \fbox{\includegraphics[width=5in]{dasm-logo.png}}} \section{Usage} \index{Command Line!Usage} \dasm is a command-line tool. It parses the command-line for the input source file, which must be present, and optional assemble-time options, assembles the source file, and produces outputs as specified in the options. The source file must be ASCII-encoded, but comments may contain Unicode characters. One option you are most likely to need is \nameref{flag:outputfile} to specify the binary file for output. The assembler will return 0 on successful compilation, 1 otherwise. \begin{usage} dasm dasm sourcefile dasm sourcefile [option ...] \end{usage} \label{changelog:20200824sourcefile} If no \mono{sourcefile} is given, then \dasm will output a short help message, and exit with an assembly error. Otherise, the \mono{sourcefile} becomes the file that \dasm will assemble, and any further parameters are parsed as options. \label{changelog:20200831help} \begin{outputx2} % ./dasm DASM 2.20.14 Copyright (c) 1988-2020 by the DASM team. License GPLv2+: GNU GPL version 2 or later (see file LICENSE). DASM is free software: you are free to change and redistribute it. There is ABSOLUTELY NO WARRANTY, to the extent permitted by law. Usage: dasm sourcefile [options] -f# output format 1-3 (default 1) -oname output file name (else a.out) -lname list file name (else none generated) -Lname list file, containing all passes -sname symbol dump file name (else none generated) -v# verboseness 0-4 (default 0) -d debug mode (for developers) -Dsymbol define symbol, set to 0 -Dsymbol=expression define symbol, set to expression -Msymbol=expression define symbol using EQM (same as -D) -Idir search directory for INCLUDE and INCBIN -p# maximum number of passes -P# maximum number of passes, with fewer checks -T# symbol table sorting (default 0 = alphabetical, 1 = address/value) -E# error format (default 0 = MS, 1 = Dillon, 2 = GNU) -S strict syntax checking -R remove binary output-file in case of errors -m# max. allowed file-size in kB Report bugs on https://github.com/dasm-assembler/dasm please! Fatal assembly error: Check command-line format. \end{outputx2} \section{Format} \index{Command Line!Format} \subsection{Spaces in Filenames} \label{changelog:20200906spaces} \index{Command Line!Spaces in Filenames} If a filename (source, output, listing file) contains spaces, the whole filename may be surrounded with quotes, or the spaces may be escaped with a backslash character - depending on your OS support for these. \begin{usage} dasm "source file.asm" dasm source\ file.asm \end{usage} \subsection{Options} Options are specified on the command-line, after the source file. There may be zero or more options each separated by whitespace. Some options require their own parameters. Default values (where an option is not explicitly defined) are described with each option below. An option is prefixed by a dash ``\mono{-}'' or a slash ``\mono{/}'' prefix, and followed by the option letter and then the parameter (if there is one). There must be no whitespace between the prefix, option letter or the parameter. \subsubsection{Example} \index{Examples!Command Line} \begin{outputx} > dasm source.asm -f2 -oout.bin -llist.txt -v3 -DVER=4 \end{outputx} This example will assemble the file \mono{source.asm}, using output format \mono{2} (random access segments). The resultant binary will be saved to the file \mono{out.bin} and a listing file written to \mono{list.txt}. During the assembly, verbosity of the output is set to \mono{3} (unresolved and unreferenced symbols displayed every pass). The value of the symbol (which will be available in the source code) \mono{VER} is set to \mono{4}. \section{Options} \index{Command Line!Options} \subsection{\texttt{-d Debug}} \index{Command Line!Options!Debug} \begin{usage} -d \end{usage} \label{changelog:20200824developers} This option is for \dasm's developers, and is essentially inactive in release versions. \\ \hrule \subsection{\texttt{-D Define Symbol}} \label{flag:definesymbol} \index{Command Line!Options!Define Symbol} \begin{usage} -Dsymbol=exp \end{usage} Defines a symbol and sets it to the expression \mono{exp}. Can be used to set values for symbols used inside the code. See \nameref{flag:definesymbolF}, \nameref{flag:definesymbolM}. \subsubsection{Example} \begin{outputx} > dasm source.asm -DSPEED=40 \end{outputx} \begin{code} lda #SPEED ; will load 40 sta velocity \end{code} \begin{code} ; Use the symbol to assemble different code IF SPEED < 30 jsr FastDraw ; not assembled ELSE jsr SlowDraw ; is assembled ENDIF \end{code} \hrule \subsection{\texttt{-E Error Format}} \index{Command Line!Options!Error Format} \begin{usage} -Eformat \end{usage} Sets the format of the output of error information. Many programmers' editing environments (IDEs) are able to monitor the output from tools such as \dasm and parse it for information about errors and warnings. If an IDE is able to resolve file names and line numbers for these errors, then the IDE can provide quick-links to the user to allow ease of editing. This option switches the format of error/warning output of \dasm between several ``standard'' formats. \begin{table}[H] \begin{tabularx}{\linewidth}{cl} \toprule \mono{\textbf{format}}&\textbf{Result}\\ \hline \\ \mono{0}&Microsoft (\mono{default})\\ \mono{1}&Dillon\\ \mono{2}&GNU\\ \\ \bottomrule \end{tabularx} \end{table} \subsection{\texttt{-f Output Format}} \label{flag:outputformat} \index{Command Line!Options!Output Format} \begin{usage} -fvalue \end{usage} Defines the format used in the binary output file generated by \dasm. \begin{table}[H] \begin{tabularx}{\textwidth}{cp{12cm}} \toprule \textbf{value} & \textbf{Function}\\ \hline \\ \label{changelog:20200824org} \mono{1} & \mono{default}. The output file contains a two byte origin in little-endian order, then data until the end of the file. Any instructions which generate output (within an initialised segment) must do so with an ascending \mono{ORG} address (this address being the offset in the binary/ROM where the output is placed, as opposed to the \mono{RORG} which is the address to which the code is assembled). Initialised segments must occur in ascending order. \\ \\ \mono{2} & \mono{RAS} (Random Access Segment). The output file contains one or more hunks. Each hunk consists of a 2 byte origin (little-endian), 2 byte length (little-endian), and that number of data bytes. The hunks occur in the same order as initialized segments in the assembly. There are no restrictions to segment ordering (i.e. reverse indexed ORG statements are allowed). The next hunk begins after the previous hunk's data, until the end of the file.\\ \\ \mono{3} & \mono{RAW}. The output file contains data only (format \#1 without the 2 byte header). Restrictions are the same as for format \#1. \textbf{No} header origin is generated. You get nothing but data.\\ \\ \bottomrule \end{tabularx} \end{table} It is a \textbf{common problem} to forget the format option on the command line, especially if you are expecting a pure binary ROM without a header. Use \mono{-f3} if you are assembling ROMs. %\hrule \subsection{\texttt{-F Define Symbol}} \label{flag:definesymbolF} \index{Command Line!Options!Define Symbol} \begin{usage} -Fsymbol \end{usage} Define a symbol and set its value to 0. This symbol is then usable in the source code as if it were a part of the code itself. This can be useful for controlling the conditional assembly of parts of code. See related options \nameref{flag:definesymbol} and \nameref{flag:definesymbolM}. \subsubsection{Example} \begin{outputx} > dasm source.asm -FTEST \end{outputx} \begin{code} IFCONST TEST ; code here only assembled when TEST is defined ENDIF \end{code} \hrule \subsection{\texttt{-I Include Directory}} \label{flag:includedirectory} \index{Command Line!Options!Include Directory} \begin{usage} -Idirectory \end{usage} This adds the \mono{directory} to the search path \dasm uses when looking for files when it encounters \nameref{pseudoop:include} and \nameref{pseudoop:incbin} directives. Use of this option on the command line is equivalent to an \nameref{pseudoop:incdir} directive placed at the beginning of the source file. See \nameref{pseudoop:incdir} for the format of the directory name.\\ \hrule \subsection{\texttt{-l Listing Filename}} \index{Command Line!Options!Listing} \label{flag:listing} \begin{usage} -lfilename \end{usage} \dasm is able to produce a comprehensive and extremely useful listing of the assembled source code. This file includes symbol values, code locations, and the source code itself. To enable generation of a listing file, use the \mono{-l} option. See alternate: \nameref{flag:listingall}.\\ \hrule \subsection{\texttt{-L Listing Filename (all Passes)}} \label{flag:listingall} \index{Command Line!Options!Listing (all)} \begin{usage} -Lfilename \end{usage} This option behaves the same as \nameref{flag:listing}, but lists the code on every pass. Warning: this can lead to some very big listings if \dasm needs to perform many passes on your code! See alternate: \nameref{flag:listing}. \subsection{\texttt{-M Define Symbol}} \label{flag:definesymbolM} \index{Command Line!Options!Define Symbol} \begin{usage} -Msymbol=exp \end{usage} Deprecated. Defines a symbol and sets it to the expression \mono{exp]}. See similar: \nameref{flag:definesymbol}, \nameref{flag:definesymbolF}.\\ \hrule \subsection{\texttt{-m Maximum Output File Size}} \label{flag:maximum} \index{Command Line!Options!Maximum Output Size} \begin{usage} -msize \end{usage} \label{changelog:20200908optionm} The \mono{-m} switch is not intended to limit the size of the created binary. Instead, it provides a safety-halting mechanism to prevent erroneous/recursive code from creating huge binaries, in situations that may not otherwise be detected. The \mono{size} parameter is the halting condition. \dasm will halt with an error if the size of the generated binary exceeds this value. The default maximum size is \mono{640 KiB}. This switch is generally useful for architectures with more than \mono{10} memory banks. It can be used in conjunction with \nameref{flag:remove} to detect assembly anomalies and clean-up afterwards. \subsubsection{Example} \begin{outputx} > dasm source.asm -orom.bin -m128 \end{outputx} This example will assemble the file \mono{source.asm} and write the file \mono{rom.bin}, halting with an error if the output binary exceeds \mono{128 KiB} (an indication of a potential recursion error in the code generation). See aslo \nameref{flag:remove}.\\ \hrule \subsection{\texttt{-o Output File}} \label{flag:outputfile} \index{Command Line!Options!Output File} \begin{usage} -ofilename \end{usage} Set the name of the filename for the output binary result of the assembly. If no name is specified, \dasm will write to the file ``\mono{a.out}''. See \nameref{flag:outputformat} for the format of the output file. If you want a pure binary output file without headers, you \textbf{must} add option \mono{-f3}. \subsubsection{Example} \begin{outputx} > dasm source.asm -orom.bin -f3 \end{outputx} This example will assemble the file \mono{source.asm} and write the file \mono{rom.bin} with the binary results of the assembly, without header information.\\ \hrule \subsection{\texttt{-p Number of Passes}} \label{flag:passes} \index{Command Line!Options!Passes} \begin{usage} -pvalue \end{usage} Sets the maximum number of passes performed by \dasm to \mono{value}. \dasm will keep performing passes until all references are resolved, or until the maximum number of passes is reached (in which case it will exit with an unresolved symbol error). Typically on machines these days, \dasm is so fast that a high number of passes is acceptable. \label{changelog:20200824passes} The default number of pases is 3. See \nameref{flag:passes2}.\\ \hrule \subsection{\texttt{-P Number of Passes (Fewer Checks)}} \label{flag:passes2} \index{Command Line!Options!Passes (Fewer Checks)} \begin{usage} -pvalue \end{usage} Sets the maximum number of passes performed by \dasm to \mono{value}. This is the same as \nameref{flag:passes}, but instructs \dasm to perform fewer checks. \label{todo} {\color{red}And these are...?} See \nameref{flag:passes}.\\ \hrule \subsection{\texttt{-R Remove Output File}} \label{flag:remove} \index{Command Line!Options!Remove Output} \begin{usage} -R \end{usage} \label{changelog:20200908optionR} Removes the binary output file if \dasm encounters an error during assembly.\\ Can be used in conjunction with \nameref{flag:maximum} to remove erroneous binaries, for example if a ROM size limit is exceeded. See aslo \nameref{flag:maximum}. \\ \hrule \subsection{\texttt{-s Symbol Table File}} \label{flag:symboltable} \index{Command Line!Options!Symbol Table File} \begin{usage} -sfilename \end{usage} At the conclusion of assembly, the \mono{-s} option directs \dasm to save a symbol table to the specified file. A symbol table is a table listing all the symbols encountered during an assembly, and their values if known. By default, no symbol table file is generated. The symbol table may be sorted alphabetically or numerically with the \nameref{flag:symboltablesort} option. \subsubsection{Example} \begin{outputx} > dasm source.asm -ssource.sym \end{outputx} After the execution of the above, the file \mono{source.sym} would contain the symbol table in the format as shown in the example below. Each line gives a symbol name, its final resolved address/value, and a flag field. In the flag field, \mono{(R )} indicates the symbol has been used/referenced and not just defined. \begin{code} --- Symbol List (sorted by symbol) AUDC0 0015 StartAddress 1000 (R ) TIA_BASE_ADDRESS 0000 (R ) TIM1T 0294 TIM64T 0296 TIM8T 0295 TIMINT 0285 var1 0080 var2 0081 varn 008b VBLANK 0001 VERSION_VCS 0069 WSYNC 0002 --- End of Symbol List. \end{code} \\ \\ \hrule \subsection{\texttt{-S Strict Syntax Checking}} \label{flags:strictsyntax} \index{Command Line!Options!Strict Syntax Checking} \begin{usage} -S \end{usage} This option switches on more stringent checking of source code issues. Duplicate macro definitions are flagged as errors. \index{todo} {\color{red}TODO complete list of strict checks}\\ \hrule \subsection{\texttt{-T Sort Symbol Table}} \label{flag:symboltablesort} \index{Command Line!Options!Sort Symbol Table} \begin{usage} -Tvalue \end{usage} Controls the sorting of lines in the symbol table. See \nameref{flag:symboltable} to enable symbol table output. \begin{table}[H] \begin{tabularx}{\textwidth}{cl} \toprule \mono{\textbf{value}}&\textbf{Sort By}\\ \hline \\ \mono{0}&Symbol Alphabetically (default)\\ \mono{1}&Address/Value\\ \\ \bottomrule \end{tabularx} \end{table} \subsection{\texttt{-v Verbosity Level}} \index{Command Line!Options!Verbosity Level} \label{flag:verbosity} \begin{usage} -vvalue \end{usage} The \mono{-v} option controls the amount of information output by \dasm while it is assembling your code. This information includes warnings, errors, a segement table, a symbol table, unresolved and unreferenced symbols, and reasons for performing extra passes. Use of the \mono{-v} option can assist with diagnosing anomalous behaviour. \begin{table}[H] \begin{tabularx}{\textwidth}{cl} \toprule \mono{\textbf{value}}&\textbf{Result}\\ \hline \\ \mono{0}&Only warnings and errors (default)\\ \\ \mono{1}&Segment table information generated after each pass\\ &Include file names are displayed\\ &Item statistics on why the assembler is going to make another pass\\ &R1,R2 reason code: R3\\ &where R1 is the number of times the assembler encountered\\ &something requiring another pass to resolve. R2 is the\\ &number of references to unknown symbols which occured in the\\ &pass (but only R1 determines the need for another pass). R3\\ &is a BITMASK of the reasons why another pass is required.\\ \mono{2}&Mismatches between program labels and symbols are displayed\\ &on every pass (usually none occur in the first pass unless you\\ &have re-declared a symbol name).\\ \\ &Displayed information for symbols:\\ \\ &~~\mono{????} = unknown value\\ &~~\mono{str} = symbol is a string\\ &~~\mono{eqm} = symbol is an eqm macro\\ &~~\mono{(R)} = symbol has been referenced\\ &~~\mono{(s)} = symbol created with \nameref{pseudoop:set} or \nameref{pseudoop:eqm} directive\\ \\ \mono{3}&Unresolved and unreferenced symbols are displayed every pass\\ \mono{4}&Symbol table displayed to \mono{STDOUT} every pass\\ \\ \bottomrule \end{tabularx} \end{table} \begin{savequote} \sffamily ``If you have the words, there's always a chance that you'll find the way.'' \qauthor{Seamus Heaney} \end{savequote} \chapter{Numbers, Expressions and Operators} \index{Expressions} \index{Numbers} \index{Operators} \section{Constants} \label{section:numberformat} \index{Expressions!Constants} \index{Number Format} \index{Bases!2 binary} \index{Bases!8 octal} \index{Bases!10 decimal} \index{Bases!16 hexadecimal} \label{changelog:20200905range} \subsection{Magnitude} \index{Numbers!Magnitude} All numbers and addresses in \dasm are represented internally as signed 32-bit values. \index{Numbers!Range Checking} Numbers are range-checked at point of usage. Byte values should be between \mono{\$80} (\mono{-128}) and \mono{\$FF} (\mono{255}) inclusive, as these values are the extremes of what can be represented with signed and unsigned 8-bit values. Word values should be between \mono{\$8000} (\mono{-32768}) and \mono{\$FFFF} (\mono{65535}) as these are the extremes of signed and unigned 16-bit values. Note that the assembler cannot tell the difference between the representation (in 8 and 16 bits) of signed/unsigned representation of negative and positive numbers, as they share the same bit patterns. \begin{code} lda #%11111111 ; is this 255 or -1? \end{code} The answer to the above question is that it depends on what the programmer does with the value, as in signed 8-bit arithmetic, \mono{\%11111111} is \mono{-1}, and in unsigned 8-bit arithmetic it is \mono{255}. This is not as confusing as it sounds, as the assembler works in signed 32-bit arithmetic and the signedness of these values (particularly when taking the low byte/word) is unambiguous. It is common for programmers who want all bits set to simply use \mono{-1}. \subsection{Base Representation} \index{Numbers!Bases} \index{Bases} Values in \dasm can be specified in base 2 (binary), 8 (octal), 10 (decimal), 16 (hexadecimal), or as ASCII characters. It doesn't matter to \dasm which format you use, so use what makes the most sense in your code. The interpretation of the value is determined by the prefix and digits used, as shown in the following table. \label{changelog:20200824const} \begin{table}[H] \begin{tabularx}{\linewidth}{lll} \toprule \textbf{Type}&\textbf{Format}&\textbf{Content}\\ \hline \\ \mono{Binary} &\mono{\%}n & \mono{0-1}\\ \\ \mono{Octal} &\mono{0}n & \mono{0-7}\\ \\ \mono{Decimal} &\mono{n} & \mono{0-9}, first digit non-\mono{0}\\ \\ \mono{Hexadecimal} &\mono{\$}n &case insensitive \mono{0-9,A-F}\\ \\ \mono{Character} &\mono{'c} &\mono{ASCII} character\\ \\ \mono{String} &\mono{``cc..''} & zero-terminated ASCII character string\\ & & \textbf{not} zero-terminated when used in \mono{DC}/\mono{DS}/\mono{DV}.\\ \\ &\mono{[exp]d} & The constant expressions is evaluated and its\\ & &decimal result converted into an ASCII string.\\ & &Useful in conjunction with ECHO diagnostic output.\\ \\ \bottomrule \end{tabularx} \end{table} Even though decimal numbers can't start with \mono{0}, as that describes an octal number, the octal \mono{0} is equivalent. In other words, \mono{0\textsubscript{10}} = \mono{0\textsubscript{8}}. Negative signs are placed before the number prefix (e.g., \mono{-\$123}). \subsubsection{Examples} \begin{code} lda #%101 ; binary = 5 decimal lda #%10101010 ; binary = 170 decimal lda #015 ; octal = 13 decimal lda #$FF ; hexadecimal = 255 decimal (unsigned) ; = -1 decimal (signed) lda #'A ; ASCII character = 65 decimal lda #'A' ; ERROR - no trailing quote allowed! \end{code} \begin{code} VAL = -129 lda #VAL ; ERROR - outside byte range \end{code} \begin{code} ; A great approximation for Pi is 355/113 PIDIGITS = 1000000 * 355/113 ECHO "PI DIGITS: ", PIDIGITS ; obscure ECHO "PI DIGITS: ",[PIDIGITS]d ; aha! \end{code} \begin{outputx} PI DIGITS: $2fefd8 PI DIGITS: 3141592 \end{outputx} \hrule \index{Expressions} \index{Operators} \index{Expressions!Brackets} \index{Expressions!\mono{[ ]}} \index{Expressions!\mono{( )}} \section{Expressions} Expressions are calculations involving symbols and numbers. These calculations are performed by \dasm during the assembly process. Often, symbols will have unkonwn values during an assembly pass, and thus an expression cannot be evaluated. \dasm will, in these cases, perform another assembly pass - often, unknown values are resolved later in the assembly. A successful assembly is one where no errors have been detected, and all referenced symbols have been resolved. \subsection{Brackets} \label{changelog:20200908brackets} \index{Brackets} \index{Expressions!Brackets} The precedence of operators is the same as for the C-language in almost all respects. Either square brackets \mono{[]} or round brackets \mono{()} may be used to group expressions and to clarify/adjust precedence, depending on which \nameref{pseudoop:processor} is in effect for the assembly. Differences are related to the use of round brackets in assembler instructions. \subsubsection{F8 and Other Processors} \index{Expressions!Brackets!F8 and Other} Either bracket type may be used in all situatinos. \subsubsection{6502 Processor} \index{Expressions!Brackets!6502} Use square brackets \mono{[]} when you are unsure. The reason round brackets \mono{()} cannot be used to group expressions is due to a conflict with 6502 assembly language which use them to specifiy indirect memory access (for example, ``\mono{lda (zp),y}''). It is possible to use round brackets \mono{()} instead of square brackets \mono{[]} in expressions following directives, but not following mnemonics. So this works: \begin{code}[caption=Valid Bracket Usage] IF target & (pet3001 | pet4001) ; OK \end{code} but this doesn't: \begin{code}[caption=Invalid Bracket Usage] lda #target & (pet3001 | pet4001) ; fails \end{code} \section{Operators} \index{Operators} \index{Operators!Logical!OR} \index{Operators!Logical!NOT} \index{Operators!\mono{< LSB}} \index{Operators!\mono{> MSB}} Some operators, such as \mono{||} (logical-OR), can return a resolved value even if one of the expressions is not resolved. \subsection{Operator Precedence} \index{Operators!Precedence} Operators in any expression are evaluated in order of precedence. The following tables list the various operators, their function, and precedence (PR). Operators are handled in precedence order high to low. \subsubsection{Unary Operators} \label{operators:unary} \index{Operators!Unary} \label{changelog:alternateunary} \noindent \begin{table}[H] \begin{tabularx}{\textwidth}{cllr} \toprule \textbf{Operator} &\textbf{Alternate} & \textbf{Function} & \textbf{PR}\\ \hline \\ \mono{$\sim$exp}&\mono{exp\textasciicircum -1}&one's complement & 20\\ \mono{-exp}&\mono{[exp\textasciicircum -1]+1}& mathematical negation & 20\\ \mono{!exp}&\mono{exp==0}& logical \mono{NOT}& 20\\ &&(0 if \mono{exp} is non-zero, 1 if \mono{exp} is zero)&\\ \mono{exp}&\mono{[exp>\,>8]\&\$FF}&take \mono{MSB} of the low word& 20\\ \\ \bottomrule \end{tabularx} \caption{\label{tab:unaryoperators}Unary Operators} \end{table} \label{operators:specialcase} \subsubsection{Special Case} \index{Operators!Unary!Special Case} \label{changelog:specialcase} Some operations will result in non-byte values when a byte value was wanted. For example: \mono{$\sim$1} is not \mono{\$FF}, but instead \mono{\$FFFFFFFF}. Preceding it with a \mono{<} (take LSB of) will solve the problem. However, there is a special-case for negative numbers used in operands. Although internally 32-bit, numbers in the range -1 to -128 are treated as two's complement 8-bit numbers in this situation. Another way of thinking of this - it is not necessary to take the \mono{LSB} of the number if it is in the range -128 to 255, as \dasm will recognise this as a valid signed/unsigned 8-bit number and do this automatically. \label{changelog:20200824rangebug} \index{Bugs!Range}{\color{bug}Bug: Currently \dasm allows values in the range \mono{-\$FF} to \mono{+\$FF}. This is incorrect. The correct range is \mono{-\$80} to \mono{+\$FF}}. \subsubsection{Examples} \begin{code} ; Special case handling of 8-bit negatives lda #-1 ; OK lda #$FF ; same as -1 lda #-129 ; ERROR - outside 8-bit size \end{code} \begin{code} ; Extracting low and high byte of value lda #$12345678 ; = $56, the high byte of the low word \end{code} \subsubsection{Binary Operators} \index{Operators!Binary} \label{changelog:20200824arithmetic} \begin{table}[H] \begin{tabularx}{\textwidth}{clr} \toprule \textbf{Operator} & \textbf{Function} & \textbf{PR}\\ \hline \\ \mono{*}& Multiplication &19\\ \mono{/}& Division &19\\ \mono{\%}& Modulus &19\\ \mono{+}& Addition &18\\ \mono{-}& Subtraction &18\\ \mono{\textgreater\,\textgreater}& Aritmetic shift right & 17\\ \mono{<\,<}& Arithmetic shift left &17\\ \mono{>}& Greater than & 16\\ \mono{>=}& Greater than or equal to &16\\ \mono{<} & Less than & 16\\ \mono{<=}& Less than or equal to&16\\ \mono{==}& Logical equal to.&15\\ \mono{=}& Logical equal to. Deprecated! (use `\mono{==}')&15\\ \mono{!=}& Not equal to &15\\ \mono{\&} & Arithmetic \mono{AND} &14\\ \mono{\^}& Arithmetic exclusive-\mono{OR} &13\\ \mono{|}& Arithmetic \mono{OR} &12\\ \mono{\&\&}& Logical \mono{AND}. Evaluates as 0 or 1&11\\ \mono{||}& Logical \mono{OR}. Evaluates as 0 or 1&10\\ \mono{?}& If the left expression is \mono{TRUE}, result is the right&9\\ &expression, else result is \mono{0}. \mono{[10?20]} returns \mono{20}.&\\ &The function of the C conditional operator \mono{a?b:c}&\\ & can be achieved by using \mono{[a?b-c]+c}.&\\ \mono{[ ]}& Group expressions &8\\ \mono{,}& Separates expressions in list (also used in &7\\ &addressing mode resolution, so be careful! &\\ \\ \bottomrule \end{tabularx} \caption{\label{tab:binaryoperators}Binary Operators} \end{table} \section{Symbols} \renewcommand{\arraystretch}{1.1} \begin{table}[H] \begin{tabularx}{\textwidth}{cl} \toprule \textbf{Symbol} & \textbf{Meaning}\\ \hline \\ \index{Symbol!...} \index{Symbol!checksum} \mono{...} & Checksum so far (of actually-generated data)\\ \mono{..} & Evaluated value in \nameref{pseudoop:dv} directive \\ \mono{.} & Current program counter\\ \mono{*} & Synonym for `\mono{.}' when not confused as an operator.\\ \mono{.name} & Represents a local label name. Local labels may be reused\\ & inside \mono{MACRO}s and between \nameref{pseudoop:subroutine} directives, but may not be \\ & referenced across \mono{MACRO} or \mono{SUBROUTINE} scope.\\ & (as of the beginning of the instruction)\\ \mono{name} & Represents a global symbol name. Beginning with an alpha\\ &character and containing letters, numbers, or underscores.\\ & Symbol definitions may end with a colon, but reference must\\ & omit the colon.\\ \mono{nnn\$} & Local label, much like `\mono{.name}', except that defining\\ & a non-local label has the effect that \mono{SUBROUTINE} has on`\mono{.name}'.\\ & They are unique within \mono{MACRO}s, like `\mono{.name}'.\\ & Note that `\mono{0\$}' and \mono{00\$} are distinct, as are \mono{8\$} and \mono{010\$}\\ & (mainly for compatibility with other assemblers).\\ \\ \bottomrule \end{tabularx} \caption{\label{tab:symbols}Symbols} \end{table} \section{Why-Codes} \dasm can display the reason (via \nameref{flag:verbosity}) it needs to do another pass. Internally, these reasons are stored in the ``why'' word. The list of available reasons include: \begin{table}[H] \begin{tabularx}{\textwidth}{cl} \toprule \textbf{Bit} & \textbf{Usage}\\ \hline \\ \mono{0}& expression in mnemonic not resolved\\ \mono{1}& -\\ \mono{2}& expression in a \mono{DC} not resolved\\ \mono{3}& expression in a \mono{DV} not resolved (probably in \mono{DV}'s \mono{EQM} symbol)\\ \mono{4}& expression in a \mono{DV} not resolved (could be in \mono{DV}'s \mono{EQM} symbol)\\ \mono{5}& expression in a \mono{DS} not resolved\\ \mono{6}& expression in an \mono{ALIGN} not resolved\\ \mono{7}& \mono{ALIGN}: Relocatable origin not known (if in \mono{RORG} at the time)\\ \mono{8}& \mono{ALIGN}: Normal origin not known (if in \mono{ORG} at the time)\\ \mono{9}& \mono{EQU}: expression not resolved\\ \mono{10}& \mono{EQU}: value mismatch from previous pass (phase error)\\ \mono{11}& \mono{IF}: expression not resolved\\ \mono{12}& \mono{REPEAT}: expression not resolved\\ \mono{13}& a program label has been defined after it has been\\ &referenced (forward reference) and thus we need another pass\\ \mono{14}& a program label's value is different from that of the\\ &previous pass (phase error)\\ \\ \bottomrule \end{tabularx} %\caption{\label{tab:constants}WHY Codes} \end{table} \label{changelog:20200824error} There are three types of error; those that cause the assembly to abort immediately, those that complete the current pass and then abort assembly, and those that allow another assembly pass in the hope that the error will self-correct. \begin{savequote} \sffamily ``No symbols where none intended.'' \qauthor{Samuel Beckett} \end{savequote} \chapter{Symbols and Labels} \section{Labels} \index{Labels} \index{Labels!Global} \index{Symbols} The terms symbols and labels are synonymous. However, common usage is to use ``label'' for a symbol referring to a memory address, and that convention is generally used in this document. Otherwise, it is referred to as a symbol. Labels are and symbols assigned addresses or values by \dasm. These values are calculated during the assembly process by resolving the location or value of expressions defining the label. Often this may take multiple assembly passes to resolve. Label definitions start at the beginning of a line and are encoded in ASCII; they must start with a letter or \mono{@} or {\_}, and can include letters, numbers, and some symbols. \label{changelog:20200823colon} \subsubsection{Colon Usage} \index{Labels!Use of Colon in} Label definitions can end with a colon, but the usage of the label must not include the colon. This can be helpful when you are editing your code if you want to search for your label definition \mono{label:} which will return just one result (unless it's a local label, which may be duplicated), or \mono{label} which will return all instances. \subsubsection{Examples} \begin{code} ; Usage of colon in label names loop: jmp loop ; OK jmp loop: ; error: Illegal character ':' \end{code} \begin{code}[caption=Global Label Definitions] ; Examples of label/symbol definitions Label1 ; standard Label2: ; optional colon lab3 = %101010 ; life, the universe, and everything LAB4 SETSTR "Hello" ; allocated as string .lab6 ; local lab,{1} ; dynamic, inside macro lab@ ; some symbols are valid too labWhoops ; invalid - not in 1st column lab SET -INFINITY ; SET: initial definition lab SET 0 ; SET: and re-use! \end{code} \section{Local Labels} \index{Labels!Local} \label{locallabels} Local labels begin with a dot ``\mono{.}''. They are local to the scope of the current \nameref{pseudoop:subroutine} directive boundary, and may be re-used in other subroutine scopes. Note that the usage of the term subroutine can be misleading; local labels are local to blocks defined by usage of the directive \nameref{pseudoop:subroutine}, not to code-subroutines. Usually local labels are used in macros and within actual code subroutines. This is handy where simple names such as `\mono{.loop}' can be re-used many times. It is particularly useful in macros, where global labels are problematic due to the inability to declare a global label more than once. \subsubsection{Example} \begin{code}[caption=Scope of Local Labels] ; Define macro MAC DO ; Implicit SUBROUTINE inserted here! .mac jmp .mac ; OK - local macro label ENDM ; elsewhere in the code... .local jmp .local ; OK - local label global jmp global ; OK - global label DO ; use macro ; implicit new scope has happened ; after macro instantiated jmp global ; OK - global scope jmp .local ; error - outside scope jmp .mac ; error - outside scope \end{code} The example above shows the result of the use of local and global labels, and the effects of implicit \nameref{pseudoop:subroutine} as a result of a macro instance. \section{Dynamic Labels} \index{Labels!Dynamic} \label{todo} When used in a symbol name, the ``\mono{,}'' operator indicates one or more arguments that follow should be evaluated, and the resulting values should be concatenated to the label, to create a dynamic symbol name. \begin{usage} symbol,arg1[,argn...] \end{usage} String literals in arguments must be specified with quotes around the string text. Expression operators can also be used, but due to label parsing constraints, they should not contain spacing. The concat-eval ``\mono{,}'' operator also works on the expression side of \mono{EQU/SET} directives, so dynamic labels can be used with opcodes. \subsubsection{Examples} \begin{code} ; define and use a dynamic label CON,"cat" ; define label jmp CONcat ; use the generated label \end{code} \begin{code} ; Use a dynamic label inside a macro N SET 0 ; instance number MAC dynm ; {1}=base name {1},"_",N ; define label using {1} and instance # N SET N+1 ENDM dynm fna jmp fna_0 ; OK dynm fna jmp fna_1 ; OK dynm fnb jmp fnb_2 ; OK jmp fnb_0 ; ERROR - does not exist \end{code} \section{Deprecated Form} \label{changelog:20200907deprecated} \dasm currently supports labels defined as per the following... \begin{usage} []...^[]...label \end{usage} That might look a bit weird because, basically, it is. Essentially, whitespace carat whitespace and then the label name. This is a \textbf{deprecated} format that may not be supported by future versions of \dasm. Do not use. \begin{code} ^ weirdLabel ; this is a weird way to define a label normalLabel ; this is a normal way \end{code} \begin{savequote} \sffamily ``Success is often the result of taking a misstep in the right direction.'' \qauthor{Al Bernstein} \end{savequote} \chapter{Directives} \label{chapter:pseudoops} \index{Directives} Also known as pseudo-ops, directives appear in the source code. They instruct \dasm what to do during assembly. These are distinct from the mnemonics in the source code, which contains the human-readable instructions for the microprocessor itself. Directives include macros, segment definitions, setting the origin/location of code, etc. They are not case-sensitive. There must be whitespace before a directive. Thus, directives must not appear in the first column of any line. Directives are not case-sensitive, but in this document they are shown in uppercase. Some directives cannot have labels on the same line - for example, those where there is no possibility of evaluating a label's value because no origin/segment has yet been defined. For directives where a label is illegal, or does not make sense, this is explicitly stated. If a label is present, then its value will be set to the current \nameref{pseudoop:org}/\nameref{pseudoop:rorg} either before or after a directive is processed. Most of the time, the label to the left of a directive is set to the current \nameref{pseudoop:org}/\nameref{pseudoop:rorg}. The following directives' labels are given their value {\bf after} execution of the directive: \nameref{pseudoop:seg}, \nameref{pseudoop:org}, \nameref{pseudoop:rorg}, \nameref{pseudoop:rend}, \nameref{pseudoop:align}. All directives (and incidentally also the mnemonics) can be prefixed with a dot ``\mono{.}'' or a crosshatch ``\mono{\#}'' for compatibility with other assemblers. So, ``\mono{.IF}'' is the same as ``\mono{IF}'' and ``\mono{\#IF}''. In the case of the dot, this works only because unattached, lone \mono{.FORCE} extensions are meaningless. \section{Includes} \subsection{\texttt{INCBIN}} \label{pseudoop:incbin} \index{Directives!Includes!\texttt{INCBIN}} \begin{usage} INCBIN "filename" \end{usage} Include the binary contents of another file literally in the output.\\ \hrule \subsection{\texttt{INCDIR}} \label{pseudoop:incdir} \index{Directives!Includes!\texttt{INCDIR}} \begin{usage} INCDIR "directory" \end{usage} Add the given directory name to the list of places where \nameref{pseudoop:include} and \nameref{pseudoop:incbin} search their files. Multiple directories can be added through multiple \nameref{pseudoop:incdir} commands. When the other includes directives look for files, first the names are tried relative to the current directory, if that fails and the name is not an absolute pathname, the directory list is tried. You can optionally end the directory name with a ``\mono{/}''. \index{todo} {\color{todo}AmigaDOS filename conventions imply that two slashes at the end of a directory indicates the parent directory, and so this does an \nameref{pseudoop:include}~\mono{"/directory"}} The command-line option \mono{-Idirectory} is equivalent to an \nameref{pseudoop:incdir}~\mono{"directory"} directive placed at the beginning of the source file. The directory list is not cleared between passes, but each exact directory name is added to the list only once. \\ \hrule \subsection{\texttt{INCLUDE}} \label{pseudoop:include} \index{Directives!Includes!\texttt{INCLUDE}} \begin{usage} INCLUDE "file name" \end{usage} Effectively inserts the contents of another file at the point of the \nameref{pseudoop:include} and continues assembling the original as if it were one merged file. \subsubsection{Example} \begin{code}[caption=Declaring the Platform] ; Typical first few lines in an Atari 2600 program... processor 6502 include "vcs.h" include "macro.h" \end{code}\\ \hrule %------------------------------------------------------------------------------- \section{Assigments} \subsection{\texttt{EQU}, \texttt{=}} \label{pseudoop:equ} \label{pseudoop:=} \index{Directives!Assignments!\texttt{EQU}} \index{Directives!Assignments!\texttt{=}} \begin{usage} symbol EQU exp symbol = exp \end{usage} The expression is evaluated and the result assigned to \mono{symbol}. \nameref{pseudoop:equ} are equivalent. You can use the common idiom of ``\mono{.=.+3}'' - in other words, you can assign to ``.'' or ``\text{*}'' directly, instead of using an \nameref{pseudoop:org} or \nameref{pseudoop:rorg} directive. More formally, a directive of the form ``\mono{.~EQU~exp}'' is interpreted as if it were written ``\nameref{pseudoop:org} \mono{exp}'' or ``\nameref{pseudoop:rorg} \mono{exp}''. The \nameref{pseudoop:rorg} is used if a relocatable origin is already in effect, otherwise \nameref{pseudoop:org} is used. Note that the first example is \textbf{not} equivalent to ``\nameref{pseudoop:ds} \mono{3}'' when the \nameref{pseudoop:rorg} is in effect. A symbol can also be defined through the command-line options \nameref{flag:definesymbol}, \nameref{flag:definesymbolF} and \nameref{flag:definesymbolM}.\\ \hrule \subsection{\texttt{EQM}} \label{pseudoop:eqm} \index{Directives!Assignments!\texttt{EQM}} \begin{usage} symbol EQM exp \end{usage} The string representing the expression is assigned to the symbol. Occurrences of the label in later expressions causes the string to be evaluated for each occurrence. Also used in conjuction with the \nameref{pseudoop:dv} psuedo-op.\\ \hrule \subsection{\texttt{SET}} \label{pseudoop:set} \index{Directives!Assignments!\texttt{SET}} \begin{usage} symbol SET exp \end{usage} Same as \nameref{pseudoop:equ}, but the symbol may be reassigned later.\\ \subsubsection{Example} \begin{code} ; Using SET to do calcualtions N SET 1 SUM SET 0 REPEAT 10 SUM SET SUM+N N SET N+1 REPEND ECHO "Sum of 1 to 10 is", [SUM]d \end{code} \begin{outputx} Sum of 1 to 10 is 55 \end{outputx} \hrule \subsection{\texttt{SETSTR}} \label{pseudoop:setstr} \index{Directives!Assignments!\texttt{SETSTR}} \begin{usage} symbol SETSTR exp \end{usage} The expression is converted to a string, and assigned to the symbol. Typical use-case is within a macro, to allow the macro to echo or otherwise use the name of an argument. \subsubsection{Example} \begin{code}[caption=Use of SETSTR to Display Function Name] ; Use SETSTR to output a parameter as a string MAC CALL ; {1} = function name .FNAME SETSTR {1} ECHO "This is the function name:", .FNAME ENDM CALL HelloWorld ; test it... \end{code} \begin{outputx} This is the function name: HelloWorld \end{outputx} \section{Data} \subsection{\texttt{DC}} \label{pseudoop:dc} \index{Directives!Data!\texttt{DC}} \begin{usage} DC[{.B|.W|.L|.S}] exp,... \end{usage} \label{changelog:20200915endian} Declare data in the current segment. No output is generated if within a uninitialised \mono{.U} segment. The byte ordering (the endian order) for the selected processor is used for each entry. It is possible to "swap endianness" (the byte order of wide-characters) using \mono{DC.s} The default size extension (\mono{.B}, \mono{.W}, \mono{.L}) is \mono{.B} (byte). \subsubsection{Alternates} \begin{usage} BYTE exp,... WORD exp,... LONG exp,... \end{usage} \subsubsection{Examples} \begin{code}[caption=Data Generation] ; various ways of defining data... DC 0,1,2,3 BYTE -1,1,2,3, dasm source.asm -DPI=3 Are you sure? \end{outputx} Is \mono{TRUE} if the expression result is defined, \mono{FALSE} otherwise and no error is generated if the expression is undefined. \subsubsection{Example} \begin{code} symbol ; defined! IFCONST symbol ECHO "Defined!" ; we'll see this! ENDIF \end{code}\\ \hrule \subsection{\texttt{IFNCONST}} \label{pseudoop:ifnconst} \index{Directives!Conditionals!\texttt{IFNCONST}} \begin{usage} IFNCONST exp \end{usage} \subsubsection{Example} \begin{code} IFNCONST symbol ECHO "Not defined!" ; we'll see this! ENDIF \end{code}\\ \hrule \subsection{\texttt{IF}} \label{pseudoop:if} \index{Directives!Conditionals!\texttt{IF}} \begin{usage} IF exp ; block TRUE [ELSE ; block FALSE ] ENDIF \end{usage} Evaluates \mono{exp} and if \mono{TRUE} (\mono{exp} is defined and non-zero) will insert the following block of code. Neither \nameref{pseudoop:if} nor \nameref{pseudoop:else} will be executed if the expression result is undefined. In that case, another assembly pass is performed and phase errors (in the next pass only) will not be reported unless the verbosity is set to 1 or more. \subsubsection{Examples} \nameref{pseudoop:if} is a handy way to comment out large sections of code or text. There is a caveat to this method - the code is still parsed by \dasm while looking for the \nameref{pseudoop:endif}, so this can have some unexpected side-effects if further conditionals are encountered. \begin{code} IF 0 ; disabled block that won't assemble ENDIF \end{code}\\ Paired with \nameref{pseudoop:endif}, \nameref{pseudoop:else}.\\ \hrule \subsection{\texttt{ELSE}} \label{pseudoop:else} \index{Directives!Conditionals!\texttt{ELSE}} \begin{usage} ELSE \end{usage} Begin an \nameref{pseudoop:else} block for the current conditional. If the current conditional is \nameref{pseudoop:if} and \mono{exp} is undefined, the \nameref{pseudoop:else} will not be executed. Paired with \nameref{pseudoop:if}, \nameref{pseudoop:ifconst}, \nameref{pseudoop:ifnconst}.\\ \hrule \subsection{\texttt{ENDIF}, \texttt{EIF}} \label{pseudoop:endif} \label{pseudoop:eif} \index{Directives!Conditionals!\texttt{ENDIF}} \index{Directives!Conditionals!\texttt{EIF}} \begin{usage} ENDIF EIF \end{usage} Terminate a conditional block. \nameref{pseudoop:endif} are equivalent. Paired with \nameref{pseudoop:if}, \nameref{pseudoop:ifconst}, \nameref{pseudoop:ifnconst}.\\ \hrule \section{Code Generation} There are two sets of directives that provide ways to insert meta-blocks of code and/or data. These are the \nameref{pseudoop:repeat}/\nameref{pseudoop:repend} pair, and \nameref{pseudoop:macro}s, which are described in their own chapter. See \nameref{pseudoop:macro}. \subsection{\texttt{REPEAT}} \label{pseudoop:repeat} \index{Directives!Code Generation!\texttt{REPEAT}} \begin{usage} REPEAT exp ;body... REPEND \end{usage} \mono{exp} copies of the body are inserted at the current location, and assembled. This looks like a loop, but it isn't. It's a text-insert of \mono{exp} blocks of code, so beware of code bloat when using this construct. \nameref{pseudoop:repeat}/\nameref{pseudoop:repend} can be very useful for data table generation. If \mono{exp==0}, the body is ignored. If \mono{exp<0}, a warning ``\mono{REPEAT parameter < 0 (ignored)}'' is output and the body is ignored. \subsubsection{Example} \begin{code}[caption=Data Generation Using Nested Repeat Loops] YV SET 2 REPEAT 2 XV SET 2 REPEAT 4 .byte XV, YV, XV*YV XV SET XV+1 REPEND YV SET YV+1 REPEND \end{code} The above example generates the following code, which is then assembled: \begin{code} .byte 2, 2, 4 .byte 3, 2, 6 .byte 4, 2, 8 .byte 5, 2, 10 .byte 2, 3, 6 .byte 3, 3, 9 .byte 4, 3, 12 .byte 5, 3, 15 \end{code} Labels within a \nameref{pseudoop:repeat} block should be local labels, preceeded by a \nameref{pseudoop:subroutine} directive to keep them unique. \subsubsection{Example} \begin{code} ; Use SUBROUTINE to delineate local label usage VAL SET 0 REPEAT 4 SUBROUTINE cmp #VAL bne .reused ; reused local label ; do something here jmp .exit .reused VAL SET VAL+1 REPEND .exit \end{code} The above example generates 4 blocks of code, each comparing with a specific immediate value and branching to a re-used local label which is made distinct by the use of the \nameref{pseudoop:subroutine} directive. Paired with \nameref{pseudoop:repend}.\\ \hrule \subsection{\texttt{REPEND}} \label{pseudoop:repend} \index{Directives!Code Generation!\texttt{REPEND}} \begin{usage} REPEND \end{usage} Bottom or a \nameref{pseudoop:repeat}/\nameref{pseudoop:repend} block. They must be in matched pairs. Any label to the left of a \nameref{pseudoop:repend} is assigned \textbf{after} the complete text insert for the \nameref{pseudoop:repeat}/\nameref{pseudoop:repend} block has finished. Paired with \nameref{pseudoop:repeat}.\\ \hrule \section{Structure} \subsection{\texttt{ORG}} \label{pseudoop:org} \index{Directives!Control!\texttt{ORG}} \begin{usage} ORG exp[,fill] \end{usage} This directive sets the current origin. You can also set the global default fill character (a byte value) with this directive. No filler data are generated until the first data-generating opcode/directive is encountered after this one. Sequences like: \begin{code} org 0,255 org 100,0 org 200 dc 23 \end{code} ... will result in 200 zeroes and a 23. This allows you to specify some \nameref{pseudoop:org}, then change your mind and specify some other (lower address) \nameref{pseudoop:org} without causing an error (assuming nothing is generated in-between). Normally, \nameref{pseudoop:ds} and \nameref{pseudoop:align} are used to generate specific filler values. Any label on the \nameref{pseudoop:org} line will be allocated its value after the directive is processed.\\ \hrule \subsection{\texttt{RORG}} \label{pseudoop:rorg} \index{Directives!Control!\texttt{RORG}} \begin{usage} RORG exp \end{usage} This activates the relocatable origin. All generated addresses, including `.', although physically placed at the true origin, will use values from the relocatable origin. While in effect both the physical origin and relocatable origin are updated. The relocatable origin can skip around (no limitations). The relocatable origin is a function of the segment. That is, you can still \nameref{pseudoop:seg} to another segment that does not have a relocatable origin activated, do other (independant) stuff there, and then switch back to the current segment and continue where you left off. Any label on the \nameref{pseudoop:rorg} line will be allocated its value after the directive is processed. \subsection{\texttt{REND}} \label{pseudoop:rend} \index{Directives!Control!\texttt{REND}} \begin{usage} REND \end{usage} Deactivate the relocatable origin for the current segment. Generation uses the real origin for reference. Any label on the \nameref{pseudoop:rend} line will be allocated its value after the directive is processed.\\ \hrule \subsection{\texttt{SEG}} \label{pseudoop:seg} \index{Directives!Control!\texttt{SEG}} \begin{usage} SEG[.U] [name] \end{usage} This switches to a new segment, creating it if neccessary. If the optional \mono{.U} extension is present, the segment is an \textbf{uninitialised} segment. Segments may be defined in parts; the \mono{.U} is not needed when going back to an already created uninitialized segment, though it makes the code more readable. Unitialised segments are particularly useful for declaring variable locations without writing data to the binary output. They have no origin restrictions. This is useful for determining the size of a certain assembly sequence without generating code, and for assigning RAM addresses to labels. An uninitialised segment with a \mono{name} will result in the generation of a warning for a \mono{reference to an unkonwn symbol}. This is harmless, but a good reason not to name uninitialised segments. For segments which are not uninitialised, the segment name is used when producing the diagnostic output at the end of each pass to indicate the memory usage of the named segments. For uninitialised segments, use of a segment name will generate a ``reference to undefined symbol'' warning that can be ignored. Any label on the \mono{SEG} line will be allocated its value after the directive is processed. The following should be considered when generating ROMs: \begin{itemize} \item The default fill character when using \nameref{pseudoop:org} (and \nameref{flag:definesymbolF} \mono{-f1} or \mono{-f3}) to skip forward in segments is 0. This is a \textbf{global} default and affects all segments. \item The fill value for \nameref{pseudoop:ds} has nothing to do with segment space padding, so don't confuse them! \end{itemize} \subsubsection{Example} \begin{code}[caption=Declaration of Variables] ; Declaration of zero page variables SEG.U variables ORG $80 foo1 ds 1 bar2 ds 10 varn ds 2 \end{code} In the example shown above, the \mono{variables} segment is unitialised. The zero-page variables (starting at location \mono{\$80}) \mono{foo1}, \mono{bar2}, and \mono{varn} are declared using \mono{DS} directive to ``reserve/allocate'' appropriate amounts of memory. Their addresses are automatically calculated by \dasm. The relevant part of the symbol table is shown below, to make clear that although the segment is unitialised, the labels/variables have correct values. \begin{outputx} foo1 0080 bar2 0081 varn 008b \end{outputx}\\ \hrule \subsection{\texttt{ALIGN}} \label{pseudoop:align} \index{Directives!Control!\texttt{ALIGN}} \begin{usage} ALIGN n[,fill] \end{usage} Align the current program counter to an n-byte boundry. If the \mono{fill} option is present, then that value will be used to fill the space generated. The default fill value is \mono{0}. The \nameref{pseudoop:align} default value should not be confused with the \nameref{pseudoop:org} directive's default fill value. Any label on the \nameref{pseudoop:align} line will be associated its value after the directive is processed. \subsubsection{Example} \begin{code} ; using ALIGN to move to 256-byte page boundary ORG $1000 DS 10 ; origin now $100A ALIGN 256 ; origin now $1100 \end{code}\\ \hrule \section{Control} \subsection{\texttt{PROCESSOR}} \label{changelog:20200824processor} \label{pseudoop:processor} \index{Directives!Control!\texttt{PROCESSOR}} \index{Processor} \begin{usage} PROCESSOR type \end{usage} \dasm needs to know the target microprocessor for which it is assembling the code. This is indicated via the \nameref{pseudoop:processor} directive, which should be the first line (other than whitespace and comments) in your source code file. Only one \nameref{pseudoop:processor} directive may be declared in the entire assembly. The \nameref{pseudoop:processor} directive appears in the source code before the declaration of code origin, and thus any label present on the same line will remain unresolved at the end of assembly, causing an error. Thus, do not place a label on the \nameref{pseudoop:processor} line. \subsubsection{Supported Microprocessors} \index{Processor!Supported Microprocessors} \begin{table}[H] \begin{tabularx}{\textwidth}{llll} \toprule \textbf{\mono{type}}&\textbf{Identity}&\textbf{Endian}&\textbf{Byte Order}\\ \hline \\ \nameref{processor:6502} &MOS Technology 6502 &little-endian &\mono{LSB}, \mono{MSB}\\ \nameref{processor:68HC11} &Motorola 68HC11 &big-endian &\mono{MSB}, \mono{LSB}\\ \nameref{processor:68705} &Motorola 68705 &big-endian &\mono{MSB}, \mono{LSB}\\ \nameref{processor:6803} &Motorola 6803 &big-endian &\mono{MSB}, \mono{LSB}\\ \nameref{processor:6303} &Hitachi HD6303 &big-endian &\mono{MSB}, \mono{LSB}\\ \nameref{processor:f8} &Fairchild F8 &big-endian &\mono{MSB}, \mono{LSB}\\ \nameref{processor:MC68HC908} &Motorola MC68HC908&big-endian& \mono{MSB}, \mono{LSB}\\ \\ \bottomrule \end{tabularx} \end{table} \subsubsection{Example} \begin{code} PROCESSOR 6502 \end{code} \index{Processor!Atari 2600} For the \mono{6507} microprocessor (as used in the Atari 2600 machine), use ``\nameref{pseudoop:processor} \mono{6502}'' as these two microprocessors are identical except for their addressing range. Different processor models use different endianness (byte ordering of word values, being little-endian or big-endian). The processor's endiannessdoes not affect the header in the output files (\mono{-f1} and \mono{-f2}), which are always little-endian (\mono{LSB}, \mono{MSB}). The processor byte ordering affects all address, word, andlong values.\\ \hrule \subsection{\texttt{ECHO}} \label{pseudoop:echo} \index{Directives!Control!\texttt{ECHO}} \begin{usage} ECHO exp[,exp...] \end{usage} The expressions (which may also be strings), are echoed on the screen and into the list file.\\ \index{Number Format!Decimal Display of} To output values in decimal use the format \mono{[exp]d} \subsubsection{Example} \begin{code} answer = 42 ECHO "Hex=",answer,"Decimal=",[answer]d \end{code} \begin{outputx} Hex= $2a Decimal= 42 \end{outputx} \hrule \subsection{\texttt{SUBROUTINE}} \label{pseudoop:subroutine} \index{Directives!Control!\texttt{SUBROUTINE}} \begin{usage} SUBROUTINE [name] \end{usage} This isn't really a subroutine, but a boundary that resets the scope of \nameref{locallabels}. Those which are defined before the \nameref{pseudoop:subroutine} directive are not visible after it. \index{Labels!Scope} \index{Scope!Local Labels} Local labels must be unique within the scope of the subroutine in which they are defined, and cannot be accessed outside of that scope. Local label names do not need to be unique, provided that they are not duplicated within a single scope. In other words, names can be re-used. \index{Macros!Scope} \index{Scope!Macros} Macros implicitly define a new subroutine scope both at their beginning, and end. Local labels defined inside a macro are not avalable outside it, and local labels defined before a macro usage instance are also no longer visible after the instantiation. Automatic new local label scope boundries occur for each macro level. \subsubsection{Example} \begin{code} Fn10 SUBROUTINE .loop dex ; 1st definition of .loop bne .loop ; branches to 1st .loop .exit rts Fn20 SUBROUTINE ; new scope here because of the SUBROUTINE directive ; previous local labels are no longer reachable .loop dex ; 2nd definition of .loop bne .loop ; branches to 2nd .loop jmp .exit ; ERROR - out of scope \end{code} The above example defines two functions (\mono{Fn10}, \mono{Fn20}) which both use the local label \mono{.loop}. The correct label for each is used by the branch, by way of the \nameref{pseudoop:subroutine} directive setting local scope. If the second \nameref{pseudoop:subroutine} directive was removed, the assembler would generate an error because of the duplicate label. Note that the function name label can be on the same line as the directive, if desired. \index{Scope!Implicit} An implicit \nameref{pseudoop:subroutine} scope is in effect when \nameref{macros} are instantiated, so local labels cannot be accessed spanning a macro instantiation.\\ \subsubsection{Example} \begin{code} MAC DO ; body ENDM .lab jmp .lab ; OK DO ; instantiate macro jmp .lab ; ERROR \end{code} See \nameref{pseudoop:mac}. \hrule \subsection{\texttt{ERR}} \label{pseudoop:err} \index{Directives!Control!\texttt{ERR}} \begin{usage} ERR \end{usage} Abort assembly. Useful in conjunction with \nameref{conditionals} to end an essembly if required. \subsubsection{Example} \begin{code} MAC CALL ; function name IFNCONST {1} FNAME SETSTR {1} ECHO FNAME," does not exist!" ERR ELSE jsr {1} ENDIF ENDM test CALL test ; OK CALL test2 ; "test2 does not exist!" then halts \end{code} \begin{outputx} test2 does not exist! source.asm (37): error: ERR pseudo-op encountered \end{outputx} \hrule \subsection{\texttt{LIST}} \label{pseudoop:list} \index{Directives!Control!\texttt{LIST ON}} \index{Directives!Control!\texttt{LIST OFF}} \begin{usage} LIST ON|OFF \end{usage} Globally turns listing on or off, starting with the current line. When you use \nameref{pseudoop:list} the effect is local to the current macro or included file. For a line to be listed both the global and local list switches must be on.\\ \hrule \subsection{\texttt{.FORCE}} \label{pseudoop:force} \index{Directives!\texttt{[.FORCE]}} \index{Addressing!.0 Implied} \index{Addressing!.0x Implied (0,x)} \index{Addressing!.0y Implied, (0,y)} \index{Addressing!.a Absolute} \index{Addressing!.b Byte} \index{Addressing!.bx Byte Address Indexed, x} \begin{usage} mnemonic[.force] \end{usage} FORCE extensions (placed after a mnemonic) are used to force an addressing mode. In some cases, you can optimize the assembly to take fewer passes by telling it the addressing mode. Force extensions are also used with \mono{DS},\mono{DC}, and \mono{DV} to determine the element size. \textbf{Not all extensions are available for all processor types.} \begin{table}[H] \begin{tabularx}{\linewidth}{cl} \toprule \textbf{Extension} & \textbf{Function}\\ \hline \\ \mono{.0} &Implied\\ \mono{.0x} &Implied indexing \mono{(0,x)}\\ \mono{.0y} &Implied indexing \mono{(0,y)}\\ \mono{.a} &Absolute (equivalent to \mono{.e}, \mono{.w})\\ \mono{.b} &\mono{byte} (equivalent to \mono{.d}, \mono{.z})\\ \mono{.bx} &\mono{byte} address indexed \mono{x}\\ \mono{.by} &\mono{byte} address indexed \mono{y}\\ \mono{.d} &Direct (equivalent to \mono{.b}, \mono{.z})\\ \mono{.e} &Extended (equivalent to \mono{.a}, \mono{.w})\\ \mono{.i} &Implied\\ \mono{.ind} &Indirect \mono{word}\\ \mono{.l} &\mono{long word} (4 bytes) (\mono{DS}/\mono{DC}/\mono{DV})\\ \mono{.r} &Relative\\ \mono{.u} &Uninitialized (\nameref{pseudoop:seg})\\ \mono{.w} &\mono{word} address (equivalent to \mono{.a}, \mono{.e})\\ \mono{.wx} &\mono{word} address indexed \mono{x}\\ \mono{.wy} &\mono{word} address indexed \mono{y}\\ \mono{.z} &Zero page (equivalent to \mono{.b}, \mono{.d})\\ \\ \bottomrule \end{tabularx} \end{table} \label{changelog:20200829substitutions} First character equivalent substitutions: \begin{table}[H] \begin{tabularx}{\linewidth}{cccl} \toprule \textbf{Orig}&\textbf{Alt}&\textbf{Alt}&\textbf{Meaning}\\ \hline \\ \mono{b} &\mono{z} &\mono{d} & byte, zeropage, direct\\ \mono{w} &\mono{e} &\mono{a} & word, extended, absolute\\ \bottomrule \end{tabularx} \end{table} \begin{savequote} \sffamily ``Everyone is against micro managing but macro managing means you're working at the big picture but don't know the details.'' \qauthor{Henry Mintzberg} \end{savequote} \chapter{Macros} \label{macros} \index{Macros} Macros are user-defined \nameref{chapter:pseudoops}, and when used well they can provide extremely powerful code constructs and simplify programming. A macro is effectively a text-substitution template. Wherever the name of a macro is used, the body of the macro is inserted. During the insertion, parameters passed to the macro may be substituted inside the body as specified by the macro definition. \includegraphics[width=1cm]{important}Macros automatically generate an implicit \nameref{pseudoop:subroutine} when instantiated, which guarantees distinct local labels for that macro instance. This can sometimes be inconvenient, as it can ``hide'' local labels in code using the macro, but there is currently no way known to prevent this. \section{Usage} \subsection{\texttt{MAC}, \texttt{MACRO}} \label{pseudoop:mac} \label{pseudoop:macro} \index{Macros} \index{Macros!\texttt{MAC}} \index{Macros!\texttt{MACRO}} %\index{Directives!Macros!\texttt{MAC}} %\index{Directives!Macros!\texttt{MACRO}} \begin{usage} ; Declaration ; parameters available as {1}, {2}, etc. ; {0} = full instantiation line MAC name ; body line 1 ; ... ; body line n ENDM \end{usage} \begin{usage} ; Instantiation name param1, param2, ... \end{usage} \nameref{pseudoop:mac} are equivalent. Source code lines between \nameref{pseudoop:mac} and \nameref{pseudoop:endm} are the macro's body. You cannot recursively declare a macro. You can, however, recursively use a macro (reference a macro in a macro). No label is allowed on the macro declaration line. The macro name is not case-sensitive, either in declaration or use. Macros can be redefined, so beware of potential issues related to unexpected usage. You should always use \nameref{locallabels} (e.g., \mono{.loop}) inside macros which you use more than once. Macros are instantiated by using the macro's name (case-insensitive), followed by an optional list of arguments. The body of the macro definition can refer to arguments passed with the format ``\mono{\{\#\}}'', where \mono{\#} is replaced by the argument number. The first argument passed to a macro is therefore \mono{\{1\}}. \mono{\{0\}} represents an exact substitution of the entire instantiation line. \subsubsection{Examples} \begin{code}[caption=Vector Table Generation using a MACRO] ; Generate low/high tables pointing to functions ; Uses a macro to contain the list of functions, ; and the parameter to declare low byte or high byte MAC VECTORS ; usage: {1} is < or > .byte {1}Routine1 .byte {1}Routine2 .byte {1}Routine3 ENDM LoTable VECTORS < HiTable VECTORS > \end{code} In the above example, a list of pointers to functions is generated in two tables (one containing the low addresses of the functions, and the other the high addresses). These two tables are always in-synch (no extra or missing entries) through the single-point definitino in the macro itself. The two calls to the macro generate the low bytes and the high bytes into two separate tables. This will result in the following code being generated, and then inserted into the source code in place of the macro calls... \begin{code}[caption=Output] LoTable .byte Routine1 .byte >Routine2 .byte >Routine3 \end{code} \subsubsection{Example} \begin{code} ; Inserts a page break if the object would overlap a page MAC OPTIONAL_PAGEBREAK ; { labelString, size } IF (>( * + {2} -1 )) > ( >* ) .EARLY_LOCATION SET * ALIGN 256 ECHO "Page break for", {1} ECHO "wasted", [* - .EARLY_LOCATION]d, "bytes" ENDIF ENDM \end{code} Paired with \nameref{pseudoop:endm}.\\ \hrule \subsection{\texttt{ENDM}} \label{pseudoop:endm} %\index{Directives!Macros!\texttt{ENDM}} \index{Macros!\texttt{ENDM}} \begin{usage} ENDM \end{usage} End of macro definition. \textbf{No label is allowed to the left of the directive.} Paired with \nameref{pseudoop:mac}.\\ \hrule \subsection{\texttt{MEXIT}} \index{Macros} %\index{Directives!Macros!\texttt{MEXIT}} \index{Macros!\texttt{MEXIT}} \begin{usage} MEXIT \end{usage} Used in conjuction with conditionals. Exits the current macro level. See \nameref{conditionals}. dasm-2.20.14.1/docs/sources/mc68hc908.tex000066400000000000000000000003621375233463600174460ustar00rootroot00000000000000\chapter{MC68HC908 Processor} \label{processor:MC68HC908} \index{Processor!68908} \index{Processor!MC68HC908} \section{Endianness} The \mono{MC68HC908} is a big-endian machine. Byte ordering in words is high, then low. \emph{No content yet}dasm-2.20.14.1/docs/sources/preface.tex000066400000000000000000000040031375233463600175160ustar00rootroot00000000000000\index{Change Log} \section*{Change Log} \label{section:changelog} This section lists recent changes to the document, with most recent entries first. Each item line hyperlink to the relevant place in the document. \subsection*{Changes} \begin{itemize} \item[]\mono{2020.08.24} \item \hyperref[changelog:20200824const]{Removed 0x for hexadecimal. Apparently recently removed from the code?} \item \hyperref[changelog:20200824license]{Upgraded license to GPL v3 to be compatible with .STY files used for generation of this manual} \item \hyperref[changelog:20200824processor]{Fixed table of processor types to explicity list PROCESSOR values} \item \hyperref[changelog:20200824rangebug]{Documented dasm bug in constants signed range checking for 8-bit operands} \item \hyperref[changelog:20200824const]{Constants and Numbers duplicate sections merged.} \item \hyperref[changelog:20200824arithmetic]{Corrected error in table - || is logical-OR and \&\& is logical-AND when used in expressions. They will return 0 or 1 results.} \item \hyperref[changelog:20200824org]{Clarified the ORG/RORG usage in the \nameref{flag:outputformat} table, in regards to the requirement that data must be in order in initialised segments} \item \hyperref[changelog:20200824error]{Revamped the comment about error types} \item \hyperref[changelog:20200824passes]{Mentioned default number of passes} \item \hyperref[changelog:20200824developers]{Clarified the -d option} \item \hyperref[changelog:20200824sourcefile]{Clarified commmand-line format} \item \hyperref[changelog:specialcase]{Added note about special-casing of negative operands} \item \hyperref[changelog:alternateunary]{Added alternates to unary operator table} \item \hyperref[section:numberformat]{Added section describing \nameref{section:numberformat}} \item[]\mono{2020.08.23} \item \hyperref[changelog:20200823colon]{Added some usage notes about colon in label names and why it can be advantageous. I still hate it.} \item \hyperref[section:changelog]{Added this change log section.} \end{itemize} dasm-2.20.14.1/docs/sources/processor6502.tex000066400000000000000000001527401375233463600204610ustar00rootroot00000000000000\label{changelog20200901_nop3} \chapter{6502} Special-case information, and tips and tricks for the processors supported by \dasm are described here. \label{changelog:20200904illegal} \section{Illegal Opcodes} The effects of the ``unused'' opcodes on the 6502 are by now relatively well documented. These are variously described as illegal, undocumented, invalid, and unspecified. Modern programs use some of these, as they provide additional capabilities (particularly speed improvements) over the use of the standard opcodes. \dasm explicitly supports some of the commonly used `stable' illegal opcodes. \url{http://www.oxyron.de/html/opcodes02.html} was used as a reference for most of the data shown in the following tables. They have been cross-referenced with the \dasm source code to determine what instructions and opcodes are supported. \iffalse \subsection{\texttt{ANC}} \begin{usage} ANC \end{usage} \begin{table}[H] \begin{tabular}{lr} \begin{tabular}{llc} \mono{\$0B}&\texttt{ANC }\emph{\#imm}&\mono{A:=A \& \#\{imm\}}\\ \end{tabular}& \tabcolsep=0.1cm \begin{tabular}{|cccccccc|} \hline \scriptsize\mono{N}& \scriptsize\mono{V}& \scriptsize\mono{B}& \scriptsize\mono{D}& \scriptsize\mono{I}& \scriptsize\mono{Z}& \scriptsize\mono{C}& \scriptsize\mono{?}\\ \hline \mono{1}& \mono{*}& \mono{*}& \mono{*}& \mono{*}& \mono{*}& \mono{*}& \mono{*}\\ \hline \end{tabular} \end{tabular} \end{table} \begin{code} ANC \$0B A:=A\&#\{imm\} * * * ANC \$2B A:=A\&#\{imm\} * * * llegal opcodes: Opcode imp imm zp zpx zpy izx izy abs abx aby ind rel Function N V B D I Z C SLO \$07 \$17 \$03 \$13 \$0F \$1F \$1B \{adr\}:=\{adr\}*2 A:=A or \{adr\} * * * RLA \$27 \$37 \$23 \$33 \$2F \$3F \$3B \{adr\}:=\{adr\}rol A:=A and \{adr\} * * * SRE \$47 \$57 \$43 \$53 \$4F \$5F \$5B \{adr\}:=\{adr\}/2 A:=A exor \{adr\} * * * RRA \$67 \$77 \$63 \$73 \$6F \$7F \$7B \{adr\}:=\{adr\}ror A:=A adc \{adr\} * * * * SAX \$87 \$97 \$83 \$8F \{adr\}:=A\&X LAX \$A7 \$B7 \$A3 \$B3 \$AF \$BF A,X:=\{adr\} * * DCP \$C7 \$D7 \$C3 \$D3 \$CF \$DF \$DB \{adr\}:=\{adr\}-1 A-\{adr\} * * * ISC \$E7 \$F7 \$E3 \$F3 \$EF \$FF \$FB \{adr\}:=\{adr\}+1 A:=A-\{adr\} * * * * ALR \$4B A:=(A\&#\{imm\})/2 * * * ARR \$6B A:=(A\&#\{imm\})/2 * * * * XAA(2) \$8B A:=X\&#\{imm\} * * LAX(2) \$AB A,X:=#\{imm\} * * AXS \$CB X:=A\&X-#\{imm\} * * * SBC \$EB A:=A-\#\{imm\} * * * * AHX(1) \$93 \$9F \{adr\}:=A\&X\&H SHY(1) \$9C \{adr\}:=Y\&H SHX(1) \$9E \{adr\}:=X\&H TAS(1) \$9B S:=A\&X \{adr\}:=S\&H LAS \$BB A,X,S:=\{adr\}\&S * * (1) = unstable in certain matters (2) = highly unstable (results are not predictable on some machines) A = Accumulator X = X-Register Y = Y-Register S = Stack-Pointer P = Status-Register +(S) = Stack-Pointer relative with pre-increment (S)- = Stack-Pointer relative with post-decrement Combinations of two operations with the same addressing mode: SLO {adr} = ASL {adr} + ORA {adr} RLA {adr} = ROL {adr} + AND {adr} SRE {adr} = LSR {adr} + EOR {adr} RRA {adr} = ROR {adr} + ADC {adr} SAX {adr} = store A\&X into {adr} LAX {adr} = LDA {adr} + LDX {adr} DCP {adr} = DEC {adr} + CMP {adr} ISC {adr} = INC {adr} + SBC {adr} note to SAX: the A&X operation is a result of A and X put onto the bus at the same time. Combinations of an immediate and an implied command: ANC \#{imm} = AND \#{imm} + (ASL) ANC \#{imm} = AND \#{imm} + (ROL) ALR \#{imm} = AND \#{imm} + LSR ARR \#{imm} = AND \#{imm} + ROR XAA \#{imm} = TXA + AND \#{imm} LAX \#{imm} = LDA \#{imm} + TAX AXS \#{imm} = A\&X minus #{imm} into X SBC \#{imm} = SBC \#{imm} + NOP note to ANC: this command performs an AND operation only, but bit 7 is put into the carry, as if the ASL/ROL would have been executed. note to ARR: part of this command are some ADC mechanisms. following effects appear after AND but before ROR: the V-Flag is set according to (A and \#{imm})+\#{imm}, bit 0 does NOT go into carry, but bit 7 is exchanged with the carry. note to XAA: DO NOT USE!!! Highly unstable!!! note to LAX: DO NOT USE!!! On my C128, this opcode is stable, but on my C64-II it loses bits so that the operation looks like this: ORA \#? AND \#{imm} TAX. note to AXS: performs CMP and DEX at the same time, so that the MINUS sets the flag like CMP, not SBC. Combinations of STA/STX/STY: AHX {adr} = stores A\&X\&H into {adr} SHX {adr} = stores X\&H into {adr} SHY {adr} = stores Y\&H into {adr} note: sometimes the \&H drops off. Also page boundary crossing will not work as expected (the bank where the value is stored may be equal to the value stored). Combinations of STA/TXS and LDA/TSX: TAS {adr} = stores A\&X into S and A\&X\&H into {adr} LAS {adr} = stores {adr}\&S into A, X and S note to LAS: is called as "propably unreliable" in one source. Bit configuration does not allow any operation on these ones: NOP = has no effects NOP #{imm} = fetches #{imm} but has no effects NOP {adr} = fetches {adr} but has no effects KIL = halts the CPU. the data bus will be set to \#\$FF Aliases used in other illegal opcode sources: SLO = ASO SRE = LSE ISC = ISB ALR = ASR SHX = A11 (A11 was a result of only having tested this one on adress \$1000) SHY = A11 LAS = LAR KIL = JAM, HLT \end{code} \fi \subsection{Abbreviations and Colours used in Tables} \subsubsection{Addressing Modes} \begin{table}[H] \begin{tabularx}{\linewidth}{cll} \toprule Abbreviation&Mode&Example\\ \hline \\ \emph{abs}&Absolute&\mono{LDA \$F000}\\ \emph{abx}&Absolute indexed by X&\mono{LDA \$F000,x}\\ \emph{aby}&Absolute indexed by Y&\mono{LDA \$F000,y}\\ \emph{idx}&Indexed indirect X&\mono{LDA (\$23,x)}\\ \emph{idy}&Indirect Y&\mono{LDA (\$23),y}\\ \emph{imm}&Immediate&\mono{LDA \#1}\\ \emph{imp}&Implied. Operates on register or flag&\mono{LSR}\\ \emph{ind}&Indirect absolute&\mono{JMP (\$F000)}\\ \emph{rel}&Relative to PC&\mono{BCS addr}\\ \emph{zp}&Zero-page&\mono{LDA 1}\\ \emph{zpx}&Zero-page indexed by X&\mono{LDA \$23,x}\\ \emph{zpy}&Zero-page indexed by Y&\mono{LAX 0,y}\\ \\ \bottomrule \end{tabularx} \end{table} \iffalse #define ASTD AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|\ AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY \fi \subsection{Mnemonics, and Opcodes for Addressing Modes} \subsubsection{Opcode Colour Key} \begin{table}[H] \begin{tabular}{ll} \cellcolor{illegal}&Stable. Supported by \dasm.\\ \cellcolor{missing}&Stable. Not supported.\\ \cellcolor{unstablecertain}&Unstable in some situations. Not supported.\\ \cellcolor{unimplemented}&Highly unstable. Not supported.\\ \end{tabular} \end{table} \begin{table}[H] %\def\arraystretch{0.98} \begin{tabularx}{\linewidth}{c|cccccccccccc} %\toprule % \multicolumn{1}{c}{} & \mono{}& \emph{imp}& \emph{imm}& \emph{zp}& \emph{zpx}& \emph{abs}& \emph{abx}& \emph{aby}& \emph{idx}& \emph{idy}& \emph{zpy}& \emph{rel}& \emph{ind}\\ \hline \mono{ADC}& \mono{\color{ghost}\xmark}& % implied \mono{\$69}& \mono{\$65}& \mono{\$75}& \mono{\$6D}& \mono{\$7D}& \mono{\$79}& \mono{\$61}& \mono{\$71}& \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \cellcolor{unstablecertain}\mono{AHX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \cellcolor{unstablecertain}\mono{\$93}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ANC}& \mono{\color{ghost}\xmark}& % implied \cellcolor{illegal}\mono{\$0B}& % immediate \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{}& %ANC#2 \mono{}& % implied \cellcolor{missing}\mono{\$2B}& % immediate \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{} & %rel \mono{} %(abs) \\ \mono{AND}& \mono{\color{ghost}\xmark}& % implied \mono{\$29}& % immediate \mono{\$25}& %zp \mono{\$35}& %zp,x \mono{\$2D}& %abs \mono{\$3D}& %abs,x \mono{\$39}& %abs,y \mono{\$21}& %(zp,x) \mono{\$31}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ANE}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$8B}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ARR}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$6B}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ASL}& \mono{\$0A}& \mono{\color{ghost}\xmark}& % immediate \mono{\$06}& \mono{\$16}& \mono{\$0E}& \mono{\$1E}& \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ASR}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$4B}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \cellcolor{missing}\mono{AXS}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{missing}\mono{\$CB}& %imm \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BCC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$90}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BCS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$B0}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BEQ}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$F0}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BIT}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\$24}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$2C}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BMI}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$30}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BNE}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$D0}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BPL}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$10} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BRK}& \mono{\$00}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BVC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$50} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{BVS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\$70} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLC}& \mono{\$18}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLD}& \mono{\$D8}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLI}& \mono{\$58}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CLV}& \mono{\$B8}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CMP}& \mono{\color{ghost}\xmark}& %iMP \mono{\$C9}& %IMM \mono{\$C5}& %zp \mono{\$D5}& %zp,x \mono{\$CD}& %abs \mono{\$DD}& %abs,x \mono{\$D9}& %abs,y \mono{\$C1}& %(zp,x) \mono{\$D1}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CPX}& \mono{\color{ghost}\xmark}& %iMP \mono{\$E0}& %IMM \mono{\$E4}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$EC}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{CPY}& \mono{\color{ghost}\xmark}& %iMP \mono{\$C0}& %IMM \mono{\$C4}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$CC}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DCP}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %IMM \cellcolor{illegal}\mono{\$C7}& %zp \cellcolor{illegal}\mono{\$D7}& %zp,x \cellcolor{illegal}\mono{\$CF}& %abs \cellcolor{illegal}\mono{\$DF}& %abs,x \cellcolor{illegal}\mono{\$DB}& %abs,y \cellcolor{illegal}\mono{\$C3}& %(zp,x) \cellcolor{illegal}\mono{\$D3}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DEC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %IMM \mono{\$C6}& %zp \mono{\$D6}& %zp,x \mono{\$CE}& %abs \mono{\$DE}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DEX}& \mono{\$CA}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{DEY}& \mono{\$88}& %iMP \mono{\color{ghost}\xmark}& \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{EOR}& \mono{\color{ghost}\xmark}& %iMP \mono{\$49}& %# \mono{\$45}& %zp \mono{\$55}& %zp,x \mono{\$4D}& %abs \mono{\$5D}& %abs,x \mono{\$59}& %abs,y \mono{\$41}& %(zp,x) \mono{\$51}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{INC}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$E6}& %zp \mono{\$F6}& %zp,x \mono{\$EE}& %abs \mono{\$FE}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{INX}& \mono{\$E8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{INY}& \mono{\$C8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ISB}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$E7}& %zp \cellcolor{illegal}\mono{\$F7}& %zp,x \cellcolor{illegal}\mono{\$EF}& %abs \cellcolor{illegal}\mono{\$FF}& %abs,x \cellcolor{illegal}\mono{\$FB}& %abs,y \cellcolor{illegal}\mono{\$E3}& %(zp,x) \cellcolor{illegal}\mono{\$F3}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark} & %rel \mono{\color{ghost}\xmark} %(abs) \\ \end{tabularx} \end{table} \begin{table}[H] %\def\arraystretch{0.98} \begin{tabularx}{\linewidth}{c|cccccccccccc} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}& \emph{imp}& \emph{imm}& \emph{zp}& \emph{zpx}& \emph{abs}& \emph{abx}& \emph{aby}& \emph{idx}& \emph{idy}& \emph{zpy}& \emph{rel}& \emph{ind}\\ \hline \\ \mono{JMP}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$4C}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\$6C} %(abs) \\ \mono{JSR}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$20}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \cellcolor{missing}\mono{KIL}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LAS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$BB}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LAX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$A7}& %zp \mono{\color{ghost}\xmark}& %zp,x \cellcolor{illegal}\mono{\$AF}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$BF}& %abs,y \cellcolor{illegal}\mono{\$A3}& %(zp,x) \cellcolor{illegal}\mono{\$B3}& %(zp),y \cellcolor{illegal}\mono{\$B7}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LDA}& \mono{\color{ghost}\xmark}& %iMP \mono{\$A9}& %# \mono{\$A5}& %zp \mono{\$B5}& %zp,x \mono{\$AD}& %abs \mono{\$BD}& %abs,x \mono{\$B9}& %abs,y \mono{\$A1}& %(zp,x) \mono{\$B1}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LDX}& \mono{\color{ghost}\xmark}& %iMP \mono{\$A2}& %# \mono{\$A6}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$AE}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\$BE}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\$B6}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LDY}& \mono{\color{ghost}\xmark}& %iMP \mono{\$A0}& %# \mono{\$A4}& %zp \mono{\$B4}& %zp,x \mono{\$AC}& %abs \mono{\$BC}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LSR}& \mono{\$4A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$46}& %zp \mono{\$56}& %zp,x \mono{\$4E}& %abs \mono{\$5E}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{LXA}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$AB}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{NOP}& \mono{\$EA}& %iMP \cellcolor{illegal}\mono{\$80}& %# \cellcolor{illegal}\mono{\$04}& %zp \cellcolor{illegal}\mono{\$14}& %zp,x \cellcolor{illegal}\mono{\$0C}& %abs \cellcolor{illegal}\mono{\$1C}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{}& % NOP #2 \mono{\cellcolor{missing}\cellcolor{missing}\$1A}& %iMP \mono{}& %# \mono{\cellcolor{missing}\$44}& %zp \mono{\cellcolor{missing}\$34}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$3C}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #3 \mono{\cellcolor{missing}\$3A}& %iMP \mono{}& %# \mono{\cellcolor{missing}\$64}& %zp \mono{\cellcolor{missing}\$54}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$5C}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #4 \mono{\cellcolor{missing}\$5A}& %iMP \mono{}& %# \mono{}& %zp \mono{\cellcolor{missing}\$74}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$7C}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #5 \mono{\cellcolor{missing}\$7A}& %iMP \mono{}& %# \mono{}& %zp \mono{\cellcolor{missing}\$D4}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$DC}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #6 \mono{\cellcolor{missing}\$82}& %iMP \mono{}& %# \mono{}& %zp \mono{\cellcolor{missing}\$F4}& %zp,x \mono{}& %abs \mono{\cellcolor{missing}\$FC}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #7 \mono{\cellcolor{missing}\$89}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #8 \mono{\cellcolor{missing}\$C2}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #9 \mono{\cellcolor{missing}\$DA}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #10 \mono{\cellcolor{missing}\$E2}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{}& % NOP #11 \mono{\cellcolor{missing}\$FA}& %iMP \mono{}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \mono{ORA}& \mono{\color{ghost}\xmark}& %iMP \mono{\$09}& %# \mono{\$05}& %zp \mono{\$15}& %zp,x \mono{\$0D}& %abs \mono{\$1D}& %abs,x \mono{\$19}& %abs,y \mono{\$01}& %(zp,x) \mono{\$11}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PHA}& \mono{\$48}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PHP}& \mono{\$08}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PLA}& \mono{\$68}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{PLP}& \mono{\$28}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RLA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$27}& %zp \cellcolor{illegal}\mono{\$37}& %zp,x \cellcolor{illegal}\mono{\$2F}& %abs \cellcolor{illegal}\mono{\$3F}& %abs,x \cellcolor{illegal}\mono{\$3B}& %abs,y \cellcolor{illegal}\mono{\$23}& %(zp,x) \cellcolor{illegal}\mono{\$33}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ROL}& \mono{\$2A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$26}& %zp \mono{\$36}& %zp,x \mono{\$2E}& %abs \mono{\$3E}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{ROR}& \mono{\$6A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$66}& %zp \mono{\$76}& %zp,x \mono{\$6E}& %abs \mono{\$7E}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RRA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$67}& %zp \cellcolor{illegal}\mono{\$77}& %zp,x \cellcolor{illegal}\mono{\$6F}& %abs \cellcolor{illegal}\mono{\$7F}& %abs,x \cellcolor{illegal}\mono{\$7B}& %abs,y \cellcolor{illegal}\mono{\$63}& %(zp,x) \cellcolor{illegal}\mono{\$73}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RTI}& \mono{\$40}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{RTS}& \mono{\$60}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SAX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$87}& %zp \mono{\color{ghost}\xmark}& %zp,x \cellcolor{illegal}\mono{\$8F}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \cellcolor{illegal}\mono{\$83}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \cellcolor{illegal}\mono{\$97}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SBC}& \mono{\color{ghost}\xmark}& %iMP \mono{\$E9}& %# \mono{\$E5}& %zp \mono{\$F5}& %zp,x \mono{\$ED}& %abs \mono{\$FD}& %abs,x \mono{\$F9}& %abs,y \mono{\$E1}& %(zp,x) \mono{\$F1}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{}& %2 \mono{}& %iMP \mono{\cellcolor{missing}\$EB}& %# \mono{}& %zp \mono{}& %zp,x \mono{}& %abs \mono{}& %abs,x \mono{}& %abs,y \mono{}& %(zp,x) \mono{}& %(zp),y \mono{}& %zp,y \mono{}& %rel \mono{} %(abs) \\ \end{tabularx} \end{table} \begin{table}[H] %\def\arraystretch{0.98} \begin{tabularx}{\linewidth}{c|cccccccccccc} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}& \emph{imp}& \emph{imm}& \emph{zp}& \emph{zpx}& \emph{abs}& \emph{abx}& \emph{aby}& \emph{idx}& \emph{idy}& \emph{zpy}& \emph{rel}& \emph{ind}\\ \hline \\ \mono{SBX}& \mono{\color{ghost}\xmark}& %iMP \cellcolor{illegal}\mono{\$CB}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SEC}& \mono{\$38}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SED}& \mono{\$F8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SEI}& \mono{\$78}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$9F}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \cellcolor{illegal}\mono{\$93}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHS}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$9B}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \cellcolor{illegal}\mono{\$9E}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SHY}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \cellcolor{illegal}\mono{\$9C}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SLO}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$07}& %zp \cellcolor{illegal}\mono{\$17}& %zp,x \cellcolor{illegal}\mono{\$0F}& %abs \cellcolor{illegal}\mono{\$1F}& %abs,x \cellcolor{illegal}\mono{\$1B}& %abs,y \cellcolor{illegal}\mono{\$03}& %(zp,x) \cellcolor{illegal}\mono{\$13}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{SRE}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \cellcolor{illegal}\mono{\$47}& %zp \cellcolor{illegal}\mono{\$57}& %zp,x \cellcolor{illegal}\mono{\$4F}& %abs \cellcolor{illegal}\mono{\$5F}& %abs,x \cellcolor{illegal}\mono{\$5B}& %abs,y \cellcolor{illegal}\mono{\$43}& %(zp,x) \cellcolor{illegal}\mono{\$53}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{STA}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$85}& %zp \mono{\$95}& %zp,x \mono{\$8D}& %abs \mono{\$9D}& %abs,x \mono{\$99}& %abs,y \mono{\$81}& %(zp,x) \mono{\$91}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{STX}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$86}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\$8E}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\$96}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{STY}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\$84}& %zp \mono{\$94}& %zp,x \mono{\$8C}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TAX}& \mono{\$AA}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TAY}& \mono{\$A8}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TSX}& \mono{\$BA}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TXA}& \mono{\$8A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TXS}& \mono{\$9A}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \mono{TYA}& \mono{\$98}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \end{tabularx} \end{table} \begin{landscape} \subsection{Opcode Mnemonics} \index{Processor!6502!Opcode Mnemonics} \def\arraystretch{0.95} \begin{table}[H] %\tabcolsep=0.085cm \begin{tabular}{c|ccccccccccccccccc} %ccc!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}&&\mono{\${\color{ghost}x}0}&\mono{\${\color{ghost}x}1}&\mono{\${\color{ghost}x}2}&\mono{\${\color{ghost}x}3}&\mono{\${\color{ghost}x}4}&\mono{\${\color{ghost}x}5}&\mono{\${\color{ghost}x}6}&\mono{\${\color{ghost}x}7}&\mono{\${\color{ghost}x}8}&\mono{\${\color{ghost}x}9}&\mono{\${\color{ghost}x}A}&\mono{\${\color{ghost}x}B}&\mono{\${\color{ghost}x}C}&\mono{\${\color{ghost}x}D}&\mono{\${\color{ghost}x}E}&\mono{\${\color{ghost}x}F}\\ \hline \\ \mono{\$0{\color{ghost}x}}&& \mono{BRK}& \mono{ORA}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SLO}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO}& \mono{PHP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{ANC}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO} \\ %\arrayrulecolor{ghost2}\hline \mono{\$1{\color{ghost}x}}&& \mono{BPL}& \mono{ORA}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SLO}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO}& \mono{CLC}& \mono{ORA}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{SLO}& \cellcolor{illegal}\mono{NOP}& \mono{ORA}& \mono{ASL}& \cellcolor{illegal}\mono{SLO} \\ %\hline \mono{\$2{\color{ghost}x}}&& \mono{JSR}& \mono{AND}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RLA}& \mono{BIT}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA}& \mono{PLP}& \mono{AND}& \mono{ROL}& \cellcolor{missing}\mono{ANC}& \mono{BIT}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA} \\ %\hline \mono{\$3{\color{ghost}x}}&& \mono{BMI}& \mono{AND}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RLA}& \cellcolor{missing}\mono{NOP}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA}& \mono{SEC}& \mono{AND}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{RLA}& \cellcolor{missing}\mono{NOP}& \mono{AND}& \mono{ROL}& \cellcolor{illegal}\mono{RLA} \\ %\hline \mono{\$4{\color{ghost}x}}&& \mono{RTI}& \mono{EOR}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SRE}& \cellcolor{missing}\mono{NOP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE}& \mono{PHA}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{ALR}& \mono{JMP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE} \\ %\hline \mono{\$5{\color{ghost}x}}&& \mono{BVC}& \mono{EOR}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{SRE}& \cellcolor{missing}\mono{NOP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE}& \mono{CLI}& \mono{EOR}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{SRE}& \cellcolor{missing}\mono{NOP}& \mono{EOR}& \mono{LSR}& \cellcolor{illegal}\mono{SRE} \\ %\hline \mono{\$6{\color{ghost}x}}&& \mono{RTS}& \mono{ADC}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RRA}& \cellcolor{missing}\mono{NOP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA}& \mono{PLA}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{ARR}& \mono{JMP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA} \\ %\hline \mono{\$7{\color{ghost}x}}&& \mono{BVS}& \mono{ADC}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{RRA}& \cellcolor{missing}\mono{NOP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA}& \mono{SEI}& \mono{ADC}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{RRA}& \cellcolor{missing}\mono{NOP}& \mono{ADC}& \mono{ROR}& \cellcolor{illegal}\mono{RRA} \\ %\hline \mono{\$8{\color{ghost}x}}&& \cellcolor{illegal}\mono{NOP}& \mono{STA}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{SAX}& \mono{STY}& \mono{STA}& \mono{STX}& \cellcolor{illegal}\mono{SAX}& \mono{DEY}& \cellcolor{missing}\mono{NOP}& \mono{TXA}& \cellcolor{unimplemented}\mono{XAA}& \mono{STY}& \mono{STA}& \mono{STX}& \cellcolor{illegal}\mono{SAX} \\ %\hline \mono{\$9{\color{ghost}x}}&& \mono{BCC}& \mono{STA}& \cellcolor{missing}\mono{KIL}& \cellcolor{unstablecertain}\mono{AHX}& \mono{STY}& \mono{STA}& \mono{STX}& \cellcolor{illegal}\mono{SAX}& \mono{TYA}& \mono{STA}& \mono{TXS}& \cellcolor{unstablecertain}\mono{TAS}& \cellcolor{unstablecertain}\mono{SHY}& \mono{STA}& \cellcolor{unstablecertain}\mono{SHX}& \cellcolor{unstablecertain}\mono{AHX} \\ %\hline \mono{\$A{\color{ghost}x}}&& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX}& \mono{TAY}& \mono{LDA}& \mono{TAX}& \cellcolor{unimplemented}\mono{LAX}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX} \\ %\hline \mono{\$B{\color{ghost}x}}&& \mono{BCS}& \mono{LDA}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{LAX}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX}& \mono{CLV}& \mono{LDA}& \mono{TSX}& \cellcolor{illegal}\mono{LAS}& \mono{LDY}& \mono{LDA}& \mono{LDX}& \cellcolor{illegal}\mono{LAX} \\ %\hline \mono{\$C{\color{ghost}x}}&& \mono{CPY}& \mono{CMP}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{DCP}& \mono{CPY}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP}& \mono{INY}& \mono{CMP}& \mono{DEX}& \cellcolor{missing}\mono{AXS}& \mono{CPY}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP} \\ %\hline \mono{\$D{\color{ghost}x}}&& \mono{BNE}& \mono{CMP}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{DCP}& \cellcolor{missing}\mono{NOP}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP}& \mono{CLD}& \mono{CMP}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{DCP}& \cellcolor{missing}\mono{NOP}& \mono{CMP}& \mono{DEC}& \cellcolor{illegal}\mono{DCP} \\ %\hline \mono{\$E{\color{ghost}x}}&& \mono{CPX}& \mono{SBC}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{ISC}& \mono{CPX}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC}& \mono{INX}& \mono{SBC}& \mono{NOP}& \cellcolor{missing}\mono{SBC}& \mono{CPX}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC} \\ %\hline% \mono{\$F{\color{ghost}x}}&& \mono{BEQ}& \mono{SBC}& \cellcolor{missing}\mono{KIL}& \cellcolor{illegal}\mono{ISC}& \cellcolor{missing}\mono{NOP}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC}& \mono{SED}& \mono{SBC}& \cellcolor{missing}\mono{NOP}& \cellcolor{illegal}\mono{ISC}& \cellcolor{missing}\mono{NOP}& \mono{SBC}& \mono{INC}& \cellcolor{illegal}\mono{ISC} \\ \end{tabular} \end{table} \begin{table}[H] \begin{tabular}{ll} \begin{tabular}{ll} \end{tabular}& \begin{tabular}{ll} \cellcolor{illegal}&Stable. Supported by \dasm.\\ \cellcolor{missing}&Stable. Not supported.\\ \cellcolor{unstablecertain}&Unstable in some situations. Not supported.\\ \cellcolor{unimplemented}&Highly unstable. Not supported.\\ \end{tabular} \end{tabular} \end{table} \end{landscape} \begin{landscape} \subsection{Instruction Cycle Counts} \index{Processor!6502!Instruction Cycle Timing} \def\arraystretch{0.98} \begin{table}[H] %\tabcolsep=0.085cm \begin{tabular}{c|ccccccccccccccccc} %\begin{tabular}{c|c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}c!{\color{ghost2}\vrule}} %\toprule %\cline{2-13} % \multicolumn{1}{c}{} & \mono{}&&\mono{\${\color{ghost}x}0}&\mono{\${\color{ghost}x}1}&\mono{\${\color{ghost}x}2}&\mono{\${\color{ghost}x}3}&\mono{\${\color{ghost}x}4}&\mono{\${\color{ghost}x}5}&\mono{\${\color{ghost}x}6}&\mono{\${\color{ghost}x}7}&\mono{\${\color{ghost}x}8}&\mono{\${\color{ghost}x}9}&\mono{\${\color{ghost}x}A}&\mono{\${\color{ghost}x}B}&\mono{\${\color{ghost}x}C}&\mono{\${\color{ghost}x}D}&\mono{\${\color{ghost}x}E}&\mono{\${\color{ghost}x}F}\\ \hline \\ \mono{\$0{\color{ghost}x}}&& \mono{7}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\arrayrulecolor{ghost2}\hline \mono{\$1{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$2{\color{ghost}x}}&& \mono{6}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{4}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$3{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$4{\color{ghost}x}}&& \mono{6}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{3}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$5{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$6{\color{ghost}x}}&& \mono{6}& \mono{6}& $\infty$& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{4}& \mono{3}& \mono{3}& \mono{3}& \mono{5}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$7{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$8{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{6}& \mono{3}& \mono{3}& \mono{3}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{4}& \mono{4} \\ %\hline \mono{\$9{\color{ghost}x}}&& \mono{ 2+}& \mono6{}& $\infty$& \mono{6}& \mono{4}& \mono{4}& \mono{4}& \mono{4}& \mono{2}& \mono{5}& \mono{2}& \mono{5}& \mono{5}& \mono{5}& \mono{5}& \mono{5} \\ %\hline \mono{\$A{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{6}& \mono{3}& \mono{3}& \mono{3}& \mono{3}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{4}& \mono{4} \\ %\hline \mono{\$B{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{ 5+}& \mono{4}& \mono{4}& \mono{4}& \mono{4}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{ 4+}& \mono{ 4+}& \mono{ 4+}& \mono{ 4+}& \mono{ 4+} \\ %\hline \mono{\$C{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$D{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ %\hline \mono{\$E{\color{ghost}x}}&& \mono{2}& \mono{6}& \mono{2}& \mono{8}& \mono{3}& \mono{3}& \mono{5}& \mono{5}& \mono{2}& \mono{2}& \mono{2}& \mono{2}& \mono{4}& \mono{4}& \mono{6}& \mono{6} \\ %\hline \mono{\$F{\color{ghost}x}}&& \mono{ 2+}& \mono{ 5+}& $\infty$& \mono{8}& \mono{4}& \mono{4}& \mono{6}& \mono{6}& \mono{2}& \mono{ 4+}& \mono{2}& \mono{7}& \mono{ 4+}& \mono{ 4+}& \mono{7}& \mono{7} \\ \end{tabular} \end{table} \begin{table}[H] \begin{tabular}{ll} \begin{tabular}{ll} %\cellcolor{illegal}&Illegal, but supported by \dasm.\\ %\cellcolor{unimplemented}&Highly unstable. Not supported.\\ %\cellcolor{unstable}&Unstable and/or not supported.\\ %\cellcolor{missing}&Illegal but stable, and missing from \dasm.\\ %&Use \mono{.byte} to insert opcode, operand(s) into code\\ \end{tabular}& \begin{tabular}{l} (+) add 1 cycle if branch instruction performed\\ (+) add 1 cycle if page boundary is crossed\\ \\ $\infty$ = Instruction never completes\\ \end{tabular} \\ \end{tabular} \end{table} \end{landscape} \iffalse \mono{}& \mono{\color{ghost}\xmark}& %iMP \mono{\color{ghost}\xmark}& %# \mono{\color{ghost}\xmark}& %zp \mono{\color{ghost}\xmark}& %zp,x \mono{\color{ghost}\xmark}& %abs \mono{\color{ghost}\xmark}& %abs,x \mono{\color{ghost}\xmark}& %abs,y \mono{\color{ghost}\xmark}& %(zp,x) \mono{\color{ghost}\xmark}& %(zp),y \mono{\color{ghost}\xmark}& %zp,y \mono{\color{ghost}\xmark}& %rel \mono{\color{ghost}\xmark} %(abs) \\ \fi dasm-2.20.14.1/docs/sources/psboxit.sty000066400000000000000000000140131375233463600176220ustar00rootroot00000000000000% psboxes.sty % % This package enables to put a PostScript drawing behind a TeX box. % The drawing is parametrized by the position and the size of the % TeX box. To put a gray [rounded] box behind a word use % \PScommands % Once at the begining % % ... text text \psboxit{25 cartouche}{THE WORD} text text % \psboxit{box 0.5 setgray fill}{\spbox{ANOTHER WORD}} % text text ... % % * If your boxes are ill sized try to change 16384 to % something else (original code used 65536). % % 65536 is the internal unit of TeX (scaled point, TeXBook page 57) % Those macros were adapted from Tom Sheffler (CMU)'s psframe.sty style. In % particular, the spacebox macro was just copied from his style. % % Je'ro^me MAILLOT, INRIA % maillot@bora.inria.fr % August 1991 % % % A Few PostScript definitions to use with \psboxit % Call \PScommands once at the begining of your program, this will % define : box roundedbox rectcartouche and cartouche. They are 4 % PostScript programs. Change the values before setlinewidth end % setgray to customize your boxes % % Ex : \psboxit{25 cartouche}{blah blah} % \psboxit{rectcartouche}{blah blah} % \long\def\PScommands{\special{! TeXDict begin /box{% Processes the path of a rectangle. % Needs : x0 y0 x1 y1. newpath 2 copy moveto 3 copy pop exch lineto 4 copy pop pop lineto 4 copy exch pop exch pop lineto closepath } bind def % % /min{ 2 copy gt { exch } if pop } bind def% /max{ 2 copy lt { exch } if pop } bind def% /roundedbox{% Processes the path of a rounded rectangle. % Needs : x0 y0 x1 y1 radius. % The bounding box is augmented by +/- radius to allow easily to % frame several rounded boxes around the same Texture box. Ex: % \psboxit{4 copy 15 roundedbox 25 roundedbox} {\spbox{Some Text}} % draws two scaled boxes arond the same word. Delete the `radius % sub' and `radius add' commands to suppress that enlargement. % /radius exch store 3 2 roll % x0 x1 y1 y0 2 copy min radius sub /miny exch store max radius add /maxy exch store 2 copy min radius sub /minx exch store max radius add /maxx exch store newpath minx radius add miny moveto maxx miny maxx maxy radius arcto maxx maxy minx maxy radius arcto minx maxy minx miny radius arcto minx miny maxx miny radius arcto 16 {pop} repeat closepath }bind def % % /rectcartouche{% Draws a filled and framed box % Needs : x0 y0 x1 y1 box gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def % % /cartouche{% Draws a filled and framed rounded box % Needs : x0 y0 x1 y1 radius roundedbox gsave .95 setgray fill grestore 1 setlinewidth stroke }bind def % end }% Closes dictionnary }\PScommands% %% %% PSBOXIT %% %% \psboxit{PS program}{TeX stuff} %% %% The bounding box of the TeX stuff is pushed on the PostScript stack %% and then the program in the first argument is called %% %% EXAMPLE: set some text on a gray background, Use the SPBOX macro to %% give some space around the text. %% %% \psboxit{box 0.5 setgray fill}{\spbox{Some Text}} %% %% See \PScommands for the \box definition %% \chardef \atcode = \the \catcode `\@ \catcode `\@ = 11 \long\def\psboxit#1#2{% \begingroup\setbox0=\hbox{#2}% \dimen0=\ht0 \advance\dimen0 by \dp0% % Write out the PS code to set the current path using HEIGHT, % WIDTH , DEPTH of box0. \hbox{% \special{ps: gsave currentpoint translate 0 \number\dp0 \space 15800 div % hand tuned for dvips \number\wd0 \space 15800 div % hand tuned for dvips \number\ht0 \space -15800 div % hand tuned for dvips % \number\dp0 \space 16384 div % \number\wd0 \space 16384 div % \number\ht0 \space -16384 div % Bounding box % \number\dp0 \space 65536 div % \number\wd0 \space 65536 div % \number\ht0 \space -65536 div % Bounding box #1 grestore}% \copy0% }%HBOX \endgroup% }% % SPACEBOX % % This macro simply takes some TeX stuff, and puts FOUR sides on it % so that the box is the same size as the thing you'd get with % an \fbox{} command. (All I did was modify the code for \fbox{} % so that all rules were replaced with struts). % % USAGE: \spbox{text} is just like \fbox{text} but makes no rules % % REASON: so that if using \pspath{...}{\fbox{stuff}} % there is a way to get another box the same size: % \pspath{...}{\spbox{stuff}} % \long\def\spbox#1{\leavevmode\setbox1\hbox{#1}% \dimen0\fboxrule \advance\dimen0 \fboxsep% \advance\dimen0 \dp1% \hbox{\lower \dimen0\hbox% {\vbox{\hrule height \fboxrule width 0pt% \hbox{\vrule width \fboxrule height 0pt \hskip\fboxsep% \vbox{\vskip\fboxsep \box1\vskip\fboxsep}\hskip% \fboxsep\vrule width \fboxrule height 0pt}% \hrule height \fboxrule width 0pt}}}}% \def\Gbox#1{\psboxit{box 0.9 setgray fill}{#1}} %% \newsavebox{\gray@box}% \newdimen\gray@space % \long\def\Beginboxitpara#1{\edef\gray@tmp{#1}% \gray@space=\fboxsep \advance\gray@space by -\fboxrule \par\prevdepth=-1000pt\vskip 0.5\baselineskip\noindent \setbox\gray@box=% \hbox\bgroup \vrule width \fboxrule \vtop\bgroup \hrule \vbox\bgroup \kern\gray@space \hbox\bgroup \kern\gray@space \vtop\bgroup \hsize=\linewidth\advance\hsize-2\fboxsep\noindent \ignorespaces} \def\Endboxitpara{% \egroup \kern\gray@space \egroup \kern\gray@space \egroup \hrule \egroup\vrule width \fboxrule \egroup \psboxit{\gray@tmp}{\box\gray@box}% \vskip 0.5\baselineskip \par} \newenvironment{boxitpara}[1]{\Beginboxitpara{#1}}{\Endboxitpara} \newenvironment{boxitpara*}[1]{\Beginboxitpara{#1}\hbox to\hsize{}}% {\Endboxitpara} \catcode `\@ = \the \atcode \endinput dasm-2.20.14.1/docs/sources/titlepage.tex000066400000000000000000000021701375233463600200720ustar00rootroot00000000000000\begin{titlepage} \begin{center} % Upper part of the page \includegraphics[width=1\textwidth]{dasm-logo.png}\\[6cm] %\textsc{\huge\bf A Small Systems {Cross-Assembler}}\\[5cm] \textsc{\huge \bf Technical Reference Manual}\\[0.25cm] \huge{\mono{2.20.14}}\\[7cm] %\textsc{\large Supporting the following Microprocessors\mono{\linebreak\linebreak{6502\linebreak %6507\linebreak 68705\linebreak 6803\linebreak% % HD6303\linebreak68HC11}}}\\[3cm] \textsc{\large \today} %\textsc{\Large Thesis}\\ %[0.5cm] %\HRule \\[0.4cm] %{ \huge \bfseries Your Thesis Title\\Goes Here}\\[0.4cm]\mono %\HRule \\[0.5cm] %\textsc{\Large Submission for the Award\\Doctor of Computer Science}\\[1cm] % Author and supervisor %\begin{minipage}{0.4\textwidth} % \begin{flushleft} \large % \emph{Manual Author:} Andrew %\textsc{Davie} %\end{flushleft} %\end{minipage} %\begin{minipage}{0.4\textwidth} %\begin{flushright} \large %\emph{Supervisors:} \\ %Prof.~Paulo \textsc{de Souza}\\ %Prof.~Neil \textsc{Bose}\\ %Dr.~Robert \textsc{Ollington} %\end{flushright} %\end{minipage} \vfill % Bottom of the page %{\large \today} \end{center} \end{titlepage} dasm-2.20.14.1/machines/000077500000000000000000000000001375233463600145465ustar00rootroot00000000000000dasm-2.20.14.1/machines/68hc11/000077500000000000000000000000001375233463600154605ustar00rootroot00000000000000dasm-2.20.14.1/machines/68hc11/68hc11a1.asm000066400000000000000000000002161375233463600173150ustar00rootroot00000000000000 .PROCESSOR 68HC11 FLASH_START .EQU $B600 FLASH_SIZE .EQU 512 BOOTROM_START .EQU $BF40 DOWNLOAD_SIZE .EQU 256 .INCLUDE "register.asm"dasm-2.20.14.1/machines/68hc11/68hc11e1.asm000066400000000000000000000002201375233463600173140ustar00rootroot00000000000000 .PROCESSOR 68HC11 FLASH_START .EQU $B600 FLASH_SIZE .EQU 512 BOOTROM_START .EQU $BF00 DOWNLOAD_SIZE .EQU 512 #include "register.asm" dasm-2.20.14.1/machines/68hc11/68hc811e2.asm000066400000000000000000000002221375233463600174070ustar00rootroot00000000000000 .PROCESSOR 68HC11 FLASH_START .EQU $F800 FLASH_SIZE .EQU 2048 BOOTROM_START .EQU $BF40 DOWNLOAD_SIZE .EQU 256 #include "register.asm" dasm-2.20.14.1/machines/68hc11/register.asm000066400000000000000000000040131375233463600200040ustar00rootroot00000000000000 RAM_END .EQU (DOWNLOAD_SIZE-1) FLASH_END .EQU<-->(FLASH_START + FLASH_SIZE) ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Registernames ; ;__________________________________; ; ; with this architecture you can shift the IO register base-address by programming the config register ; within 64 cycles after reboot. ; if you don't, you loose some bytes of RAM since the IO registers and RAM share the zero page ; if you do, you consume some more bytes of FLASH_ROM since you will need extended addressing mode ; a good compromise is to shift base register address to 0x1000, load 0x1000 to X register and use ; X-indexed addressing mode. Using Y-indexed addressing for register-IO is no advantage at all, ; it has both more opcodes and longer execution time addressing mode for register IO ; .IFNCONST REGBASE REGBASE .EQU 0 .ENDIF PA0 .EQU $01 PA1 .EQU $02 PA2 .EQU $04 PA3 .EQU $08 PA4 .EQU $10 PA5 .EQU $20 PA6 .EQU $40 PA7 .EQU $80 PA3_4 .EQU $18 PA7_5 .EQU $a0 CSSTRH .EQU REGBASE+$5c HPRIO .EQU REGBASE+$3c INIT .EQU $103d PORTA .EQU REGBASE+$00 PORTB .EQU REGBASE+$04 PORTC .EQU REGBASE+$03 PORTD .EQU REGBASE+$08 PORTE .EQU REGBASE+$0a DDRC .EQU REGBASE+$07 DDRD .EQU REGBASE+$09 CFORC .EQU REGBASE+$0b OC1M .EQU REGBASE+$0c OC1D .EQU REGBASE+$0d TCNT .EQU REGBASE+$0e TIC1 .EQU REGBASE+$10 TIC2 .EQU REGBASE+$12 TIC3 .EQU REGBASE+$14 TOC1 .EQU REGBASE+$16 TOC2 .EQU REGBASE+$18 TOC3 .EQU REGBASE+$1a TOC4 .EQU REGBASE+$1c TOC5 .EQU REGBASE+$1e TCTL1 .EQU REGBASE+$20 TCTL2 .EQU REGBASE+$21 TFLG1 .EQU REGBASE+$23 TMSK1 .EQU REGBASE+$22 TMSK2 .EQU REGBASE+$24 TFLG2 .EQU REGBASE+$25 PACTL .EQU REGBASE+$26 PACNT .EQU REGBASE+$27 SPCR .EQU REGBASE+$28 BAUD .EQU REGBASE+$2b SCCR1 .EQU REGBASE+$2c SCCR2 .EQU REGBASE+$2d SCSR .EQU REGBASE+$2e SCDR .EQU REGBASE+$2f ADCTL .EQU REGBASE+$30 ADR1 .EQU ADCTL+1 ADR2 .EQU ADCTL+2 ADR3 .EQU ADCTL+3 ADR4 .EQU ADCTL+4 BPROT .EQU REGBASE+$35 OPTION .EQU REGBASE+$39 EEPCTL .EQU REGBASE+$3b CONFIG .EQU REGBASE+$3f dasm-2.20.14.1/machines/68hc908/000077500000000000000000000000001375233463600155575ustar00rootroot00000000000000dasm-2.20.14.1/machines/68hc908/.mc68hc908jb8.mk000066400000000000000000000007121375233463600201230ustar00rootroot00000000000000# # include for Makefile # CPU_VARIANT = hc908jb8 # true size NATIVE_RAM_START = 0x40 NATIVE_RAM_SIZE = 256 # with bootloader RAM_START = 0x48 RAM_SIZE = 248 STACK_LOC = 0x013F # NATIVE_RAM_SIZE + NATIVE_RAM_START -1 FLASH_START = 0xDC00 NATIVE_FLASH_SIZE = 8192 FLASH_SIZE = 7808 BOOT_LOADER_SIZE = 384 MONI_START = 0xFC00 # MONI_2_START = 0xFE10 MONI_SIZE = 512 # MONI_2_SIZE = 240 MHZ = 3 MEM_MODEL = --model-small --stack-auto --idata-loc 0x48 dasm-2.20.14.1/machines/68hc908/.mc68hc908jk1.mk000066400000000000000000000002741375233463600201300ustar00rootroot00000000000000# # include for Makefile # RAM_START = 0x80 RAM_SIZE = 128 FLASH_START = 0xF600 FLASH_SIZE = 1536 MONI_START = 0xFC00 MONI_SIZE = 1024 STACKSIZE = 40 MHZ = 2 MEM_MODEL = --model-smalldasm-2.20.14.1/machines/68hc908/.mc68hc908jk3.mk000066400000000000000000000005531375233463600201320ustar00rootroot00000000000000# # include for Makefile # CPU_VARIANT = hc908jk3 # without hc08sprg bootloader NATIVE_RAM_START = 0x80 NATIVE_RAM_SIZE = 128 # with bootloader RAM_START = 0x88 RAM_SIZE = 120 STACK_LOC = 0xFF # STACKSIZE = 40 FLASH_START = 0xEC00 FLASH_SIZE = 4096 MONI_START = 0xFC00 MONI_SIZE = 1024 # Monitor Mode # MHZ = 2 # user mode MHZ = 1 MEM_MODEL = --model-smalldasm-2.20.14.1/machines/68hc908/.mc68hc908mr32.mk000066400000000000000000000010231375233463600202170ustar00rootroot00000000000000# # include for Makefile # CPU_VARIANT = hc908mr32 # true size NATIVE_RAM_START = 0x60 NATIVE_RAM_SIZE = 768 # with bootloader RAM_START = 0x68 RAM_SIZE = 760 STACK_LOC = 0x035E # NATIVE_RAM_SIZE + NATIVE_RAM_START -1 FLASH_START = 0x8000 NATIVE_FLASH_SIZE = 32256 FLASH_SIZE = 31744 BOOT_LOADER_SIZE = 512 MONI_START = 0xFE10 MONI_SIZE = 240 MHZ = 1 # MHZ = 1.22875 # exact # MEM_MODEL = --stack-auto --stack-probe --int-long-rent --xram-loc 0x100 --xram-size 576 MEM_MODEL = --model-large --stack-auto --idata-loc 0x68 dasm-2.20.14.1/machines/68hc908/bits68hc908.asm000066400000000000000000000027331375233463600201610ustar00rootroot00000000000000 #ifndef BITS_68HC908JB8 BITS_68HC908JB8 .EQU 1 ; TODO: MOVE THIS OUT TO regXXXXX.asm, remove all definitions that aren't on the board PTA0 .EQU (1 << 0) PTA1 .EQU (1 << 1) PTA2 .EQU (1 << 2) PTA3 .EQU (1 << 3) PTA4 .EQU (1 << 4) PTA5 .EQU (1 << 5) PTA6 .EQU (1 << 6) PTA7 .EQU (1 << 7) PTB0 .EQU 1 PTB1 .EQU 2 PTB2 .EQU 4 PTB3 .EQU 8 PTB4 .EQU 16 PTB5 .EQU 32 PTB6 .EQU 64 PTB7 .EQU 128 PTC0 .EQU (1 << 0) PTC1 .EQU (1 << 1) PTC2 .EQU (1 << 2) PTC3 .EQU (1 << 3) PTC4 .EQU (1 << 4) PTC5 .EQU (1 << 5) PTC6 .EQU (1 << 6) PTC7 .EQU (1 << 7) PTD0 .EQU (1 << 0) PTD1 .EQU (1 << 1) PTD2 .EQU (1 << 2) PTD3 .EQU (1 << 3) PTD4 .EQU (1 << 4) PTD5 .EQU (1 << 5) PTD6 .EQU (1 << 6) PTD7 .EQU (1 << 7) ; CONFIG bits COPD .EQU (1 << 0) ; TSC bits TOF .EQU (1 << 7) TOIE .EQU (1 << 6) TSTOP .EQU (1 << 5) TRST .EQU (1 << 4) PRS2 .EQU (1 << 2) PRS1 .EQU (1 << 1) PRS0 .EQU (1 << 0) ; TSC0 bits CH0F .EQU (1 << 7) CH0IE .EQU (1 << 6) MS0B .EQU (1 << 5) MS0A .EQU (1 << 4) ELS0B .EQU (1 << 3) ELS0A .EQU (1 << 2) TOV0 .EQU (1 << 1) CH0MAX .EQU (1 << 0) ; TSC1 bits CH1F .EQU (1 << 7) CH1IE .EQU (1 << 6) ; MS1B .EQU (1 << 5) ;; does not exist MS1A .EQU (1 << 4) ELS1B .EQU (1 << 3) ELS1A .EQU (1 << 2) TOV1 .EQU (1 << 1) CH1MAX .EQU (1 << 0) ; INTSCR ACKI .EQU (1 << 2) IMASKI .EQU (1 << 1) MODEI .EQU (1 << 0) ; KBSCR ACKK .EQU (1 << 2) IMASKK .EQU (1 << 1) MODEK .EQU (1 << 0) ; ; Register Section Bits FLCR ; PGM .EQU $01 ERASE .EQU $02 MASS .EQU $04 HVEN .EQU $08 #endif dasm-2.20.14.1/machines/68hc908/macros.asm000066400000000000000000000022571375233463600175530ustar00rootroot00000000000000 ; ; MACRO declaration keywords _must_ be lowercase ; MACRO names _must_ be all lowercase ; MACROS may be nested .macro declare_vector .ORG {1} .word {2} .endm .macro declare_var ; {name},{size} {1} .EQU next_var next_var .set ({1}+{2}) .endm ;;;;; take care to code ;next_var .set RAM_START ;;;;; before using 'declare_var' for the first time .macro store_reg ; {reg_addr},{value} #if ({1} > 255) ldA {2} ;[2] stA {1} ;[3] #else mov {2},{1} #endif .endm .macro store_reg16 ; {reg_addr},{value} ldHX {2} ;[2] stHX {1} ;[3] .endm .macro set_bits ; {bitmask},{reg_addr} ldHX #{1} ldA ,X orA {2} stA ,X .endm .macro clear_bits ; {bitmask},{reg_addr} ldHX #{1} ldA ,x and #[[~{2}] & $FF] stA ,x .endm .macro shake_pin ; {pin}, {port} brset {1},{2},_off$ bset {1},{2} bra _after$ _off$: bclr {1},{2} _after$: .endm .macro busy_loop_delay ; {count} ldA {1} ; [2] _bLoop$: dbnzA _bLoop$ ; [3] 3*(arg-1) + 2 T .endm .macro and_bits ; {reg_addr},{bitmask} ldA.8 {1} and {2} stA.8 {1} .macro .macro or_bits ; {reg_addr},{bitmask} ldA.8 {1} orA {2} stA.8 {1} .endm dasm-2.20.14.1/machines/68hc908/mc68hc908jb8.asm000066400000000000000000000036321375233463600202220ustar00rootroot00000000000000 .PROCESSOR 68908 ; ; variant specific defines ; #ifndef RAM_START RAM_START .EQU $40 #endif #ifndef RAM_SIZE RAM_SIZE .EQU 256 #endif #ifndef FLASH_START FLASH_START .EQU $DC00 #endif #ifndef FLASH_SIZE FLASH_SIZE .EQU 8192 #endif #include reg68hc908jb8.asm PTE0 .EQU (1 << 0) PTE1 .EQU (1 << 1) PTE2 .EQU (1 << 2) PTE3 .EQU (1 << 3) PTE4 .EQU (1 << 4) PTE5 .EQU (1 << 5) PTE6 .EQU (1 << 6) PTE7 .EQU (1 << 7) ; ; Register Section Bits FLCR ; PGM .EQU $01 ERASE .EQU $02 MASS .EQU $04 HVEN .EQU $08 ; ; Firmware Monitor ROM specific section ; ReadSerial .EQU $FC00 FlashRead .EQU $FC03 FlashErase .EQU $FC06 FlashProg .EQU $FC77 ; $FC09 DelayUs .EQU $FC0C ; WriteSerial .EQU $FED6 MoniRomDelayLoop .EQU $FD21 ; cycles = (((A-3)*3 +10)*X) + 7 ; longest wait time 58.6ms fwCtrlByte .EQU RAM_START + $08 fwCpuSpeed .EQU RAM_START + $09 fwLastAddr .EQU RAM_START + $0A fwDataBlock .EQU RAM_START + $0C #include macros.asm .macro fw_delay ldX #{1} ;[2] ldA #{2} ;[2] jsr MoniRomDelayLoop ;[5] .endm .macro declare_delay Delay{1}: fw_delay {2},{3} rts ;[4] .endm ; macro-names MUST be all lowercase .macro fw_flash_erase_proc store_reg fwCtrlByte,#$40 store_reg fwCpuSpeed,#(4*F_CPU) ldHX #FLASH_START jsr FlashErase .endm .macro delay5us fw_delay 1,3 ; ((((3-3)*3 +10)*1)+7) := 17 cycles ~5.6 s @ 3MHz .endm .macro delay10us fw_delay 1,8 ; ((((8-3)*3 +10)*1)+7) := 32 cycles ~10s @ 3MHz .endm .macro delay100us fw_delay 1,98 ; ((((98-3)*3 +10)*1)+7) := 302 cycles 100s @ 3MHz .endm .macro delay2ms fw_delay 8,250 ; ((((250-3)*3 +10)*1)+7) := 6015 cycles 2ms @ 3MHz .endm .macro delay4ms fw_delay 16,250 ; ((((250-3)*3 +10)*16)+7) := 12023 cycles should make 4ms @ 3MHz .endm dasm-2.20.14.1/machines/68hc908/mc68hc908jk1.asm000066400000000000000000000020651375233463600202230ustar00rootroot00000000000000 .PROCESSOR 68908 ; ; variant specific defines ; .IFNCONST RAM_START RAM_START .EQU $80 .ENDIF .IFNCONST RAM_SIZE RAM_SIZE .EQU 128 .ENDIF .IFNCONST FLASH_START FLASH_START .EQU $F600 .ENDIF .IFNCONST FLASH_SIZE FLASH_SIZE .EQU 1536 .ENDIF #include "reg68hc908jk1.asm" ; ; Register Section Bits FLCR ; PGM .EQU $01 ERASE .EQU $02 MASS .EQU $04 HVEN .EQU $08 ; ; Firmware Monitor ROM specific section ; ReadMonitor .EQU $FC00 FlashRead .EQU $FC03 FlashErase .EQU $FC06 FlashProgram .EQU $FC09 DelayUs .EQU $FC0C MoniRomDelayLoop .EQU $FD21 ; cycles = (((A-3)*3 +10)*X) + 7 ; longest wait time 25.1 s fwCtrlByte .EQU RAM_START + $08 fwCpuSpeed .EQU RAM_START + $09 fwLastAddr .EQU RAM_START + $0A fwDataBlock .EQU RAM_START + $0C .INCLUDE macros.asm .MACRO declare_delay Delay{1}: ldx #{2} ;[2] lda #{3} ;[2] jsr MoniRomDelayLoop ;[5] rts ;[4] .ENDM .MACRO fwFlashEraseProc store_reg fwCtrlByte,#$40 store_reg fwCpuSpeed,#(4*F_CPU) ldhx #FLASH_START jsr FlashErase .ENDM dasm-2.20.14.1/machines/68hc908/mc68hc908jk3.asm000066400000000000000000000025771375233463600202350ustar00rootroot00000000000000 .PROCESSOR 68908 ; ; variant specific defines ; #ifndef RAM_START RAM_START .EQU $80 #endif #ifndef RAM_SIZE RAM_SIZE .EQU 128 #endif #ifndef FLASH_START FLASH_START .EQU $EC00 #endif #ifndef FLASH_SIZE FLASH_SIZE .EQU 4096 #endif #include "reg68hc908jk3.asm" ; ; Register Section Bits FLCR ; PGM .EQU $01 ERASE .EQU $02 MASS .EQU $04 HVEN .EQU $08 ; ; Firmware Monitor ROM specific section ; ReadSerial .EQU $FC00 FlashRead .EQU $FC03 FlashErase .EQU $FC06 FlashProg .EQU $FC77 DelayUs .EQU $FC0C WriteSerial .EQU $FED0 MoniRomDelayLoop .EQU $FD21 ; cycles = (((A-3)*3 +10)*X) + 7 ; longest wait time 25.1 s fwCtrlByte .EQU RAM_START + $08 fwCpuSpeed .EQU RAM_START + $09 fwLastAddr .EQU RAM_START + $0A fwDataBlock .EQU RAM_START + $0C #include "macros.asm" .macro fw_delay ;{X},{A} ldX #{1} ;[2] ldA #{2} ;[2] jsr MoniRomDelayLoop ;[5] .endm .macro declare_delay ; {name},{X},{A} ; count numbers for registers X,A Delay{1}: fw_delay {2},{3} rts ;[4] .endm ; macro-names MUST be all lowercase .macro fw_flash_erase_proc store_reg fwCtrlByte,#$40 store_reg fwCpuSpeed,#(4*F_CPU) ldHX #FLASH_START jsr FlashErase .endm .macro delay100us fw_delay 1,64 ; ((((64-3)*3 +10)*1)+7) := 100 s .endm dasm-2.20.14.1/machines/68hc908/mc68hc908mr32.asm000066400000000000000000000014701375233463600203200ustar00rootroot00000000000000 .PROCESSOR 68908 ; ; variant specific defines ; #ifndef RAM_START RAM_START .EQU $60 #endif #ifndef RAM_SIZE RAM_SIZE .EQU 768 #endif #ifndef FLASH_START FLASH_START .EQU $8000 #endif #ifndef FLASH_SIZE FLASH_SIZE .EQU 32256 #endif #include "reg68hc908mr32.asm" #include "macros.asm" .macro switch_to_pll_clock clr PCTL bset 5,PCTL ; switch PLL on bset 7,PBWC ; automatic bandwidth PLL_lock_wait: brclr 6,PBWC,PLL_lock_wait bset 4,PCTL ; select PLL clock as system .endm ; ROM specific routines WriteSerial .EQU 0xFEC3 .macro fw_delay ldX #{1} ;[2] ldA #{2} ;[2] jsr MoniRomDelayLoop ;[5] // TODO: find this in the monitor code .endm .macro declare_delay Delay{1}: fw_delay {2},{3} rts ;[4] .endm dasm-2.20.14.1/machines/68hc908/reg68hc908jb8.asm000066400000000000000000000030171375233463600203750ustar00rootroot00000000000000 #ifndef REGS_68HC908JB8 REGS_68HC908JB8 .EQU 1 PTA .EQU $00 PTB .EQU $01 PTC .EQU $02 PTD .EQU $03 DDRA .EQU $04 DDRB .EQU $05 DDRC .EQU $06 DDRD .EQU $07 PTE .EQU $0008 DDRE .EQU $0009 TSC .EQU $000a TCNT .EQU $000c TCNTH .EQU $000c TCNTL .EQU $000d TMODH .EQU $000e TMODL .EQU $000f TSC0 .EQU $0010 TCH0H .EQU $0011 TCH0L .EQU $0012 TSC1 .EQU $0013 TCH1H .EQU $0014 TCH1L .EQU $0015 KBSCR .EQU $0016 KBIER .EQU $0017 UIR2 .EQU $0018 UCR2 .EQU $0019 UCR3 .EQU $001a UCR4 .EQU $001b IOCR .EQU $001c POCR .EQU $001d ISCR .EQU $001e CONFIG .EQU $1F UE0D0 .EQU $0020 UE0D1 .EQU $0021 UE0D2 .EQU $0022 UE0D3 .EQU $0023 UE0D4 .EQU $0024 UE0D5 .EQU $0025 UE0D6 .EQU $0026 UE0D7 .EQU $0027 UE1D0 .EQU $0028 UE1D1 .EQU $0029 UE1D2 .EQU $002a UE1D3 .EQU $002b UE1D4 .EQU $002c UE1D5 .EQU $002d UE1D6 .EQU $002e UE1D7 .EQU $002f UE2D0 .EQU $0030 UE2D1 .EQU $0031 UE2D2 .EQU $0032 UE2D3 .EQU $0033 UE2D4 .EQU $0034 UE2D5 .EQU $0035 UE2D6 .EQU $0036 UE2D7 .EQU $0037 UADDR .EQU $0038 UIR0 .EQU $0039 UIR1 .EQU $003a UCR0 .EQU $003b UCR1 .EQU $003c USR0 .EQU $003d USR1 .EQU $003e BSR .EQU $FE00 RSR .EQU $FE01 BFCR .EQU $FE03 INT1 .EQU $FE04 FLCR .EQU $FE08 FLBPR .EQU $FE09 BRKH .EQU $FE0C BRKL .EQU $FE0D BRKSCR .EQU $FE0E COPCTL .EQU $FFFF _vect_KBIR .EQU $FFF0 _vect_TIMOVF .EQU $FFF2 _vect_TIM1 .EQU $FFF4 _vect_TIM0 .EQU $FFF6 _vect_IRQ .EQU $FFF8 _vect_USB .EQU $FFFA _vect_SWI .EQU $FFFC _vect_RESET .EQU $FFFE #endif #include "bits68hc908.asm" dasm-2.20.14.1/machines/68hc908/reg68hc908jk3.asm000066400000000000000000000020401375233463600203740ustar00rootroot00000000000000 #ifndef REGS_68HC908JK1 REGS_68HC908JK1 .EQU 1 PTA .EQU $00 PTB .EQU $01 PTC .EQU $02 PTD .EQU $03 ; D4:D5 TIM channels ; D6:D7 25mA open-drain with pullup DDRA .EQU $04 DDRB .EQU $05 DDRC .EQU $06 DDRD .EQU $07 PDCR .EQU $0A PTAPUE .EQU $0D KBSCR .EQU $1A KBIER .EQU $1B INTSCR .EQU $1D CONFIG2 .EQU $1E CONFIG .EQU $1F TSC .EQU $20 TCNT .EQU $21 TCNTH .EQU $21 TCNTL .EQU $22 TMOD .EQU $23 TMODH .EQU $23 TMODL .EQU $24 TSC0 .EQU $25 TCH0 .EQU $26 TCH0H .EQU $26 TCH0L .EQU $27 TSC1 .EQU $28 TCH1 .EQU $29 TCH1H .EQU $29 TCH1L .EQU $2A ADSCR .EQU $3C ADR .EQU $3D ADICLK .EQU $3E BSR .EQU $FE00 RSR .EQU $FE01 BFCR .EQU $FE03 INT1 .EQU $FE04 INT2 .EQU $FE05 INT3 .EQU $FE06 FLCR .EQU $FE08 FLBPR .EQU $FE09 BRKH .EQU $FE0C BRKL .EQU $FE0D BRKSCR .EQU $FE0E COPCTL .EQU $FFFF _vect_ADC .EQU $FFDE _vect_KBIR .EQU $FFE0 _vect_TIMOVF .EQU $FFF2 _vect_TIM1 .EQU $FFF4 _vect_TIM0 .EQU $FFF6 _vect_IRQ .EQU $FFFA _vect_SWI .EQU $FFFC _vect_RESET .EQU $FFFE #endif #include "bits68hc908.asm" dasm-2.20.14.1/machines/68hc908/reg68hc908mr32.asm000066400000000000000000000041771375233463600205050ustar00rootroot00000000000000 #ifndef REGS_68HC908MR32 REGS_68HC908MR32 .EQU 1 PTA .EQU $00 PTB .EQU $01 PTC .EQU $02 PTD .EQU $03 DDRA .EQU $04 DDRB .EQU $05 DDRC .EQU $06 DDRD .EQU $07 PTE .EQU $08 PTF .EQU $09 DDRE .EQU $0C DDRF .EQU $0D TASC .EQU $0E TACNTH .EQU $0F TACNTL .EQU $10 TAMODH .EQU $11 TAMODL .EQU $12 TASC0 .EQU $13 TACH0H .EQU $14 TACH0L .EQU $15 TASC1 .EQU $16 TACH1H .EQU $17 TACH1L .EQU $18 TASC2 .EQU $19 TACH2H .EQU $1A TACH2L .EQU $1B TASC3 .EQU $1C TACH3H .EQU $1D TACH3L .EQU $1E CONFIG .EQU $1F PCTL1 .EQU $20 PCTL2 .EQU $21 FCR .EQU $22 FSR .EQU $23 FTACK .EQU $24 PWMOUT .EQU $25 PCNTH .EQU $26 PCNTL .EQU $27 PMODH .EQU $28 PMODL .EQU $29 PVAL1H .EQU $2A PVAL1L .EQU $2B PVAL2H .EQU $2C PVAL2L .EQU $2D PVAL3H .EQU $2E PVAL3L .EQU $2F PVAL4H .EQU $30 PVAL4L .EQU $31 PVAL5H .EQU $32 PVAL5L .EQU $33 PVAL6H .EQU $34 PVAL6L .EQU $35 DEADTM .EQU $36 DISMAP .EQU $37 SCC1 .EQU $38 SCC2 .EQU $39 SCC3 .EQU $3A SCS1 .EQU $3B SCS2 .EQU $3C SCDR .EQU $3D SCBR .EQU $3E ISCR .EQU $3F ADSCR .EQU $40 ADRH .EQU $41 ADRL .EQU $42 ADCLK .EQU $43 SPCR .EQU $44 SPSCR .EQU $45 SPDR .EQU $46 TBSC .EQU $51 TBCNTH .EQU $52 TBCNTL .EQU $53 TBMODH .EQU $54 TBMODL .EQU $55 TBSC0 .EQU $56 TBCH0H .EQU $57 TBCH0L .EQU $58 TBSC1 .EQU $59 TBCH1H .EQU $5A TBCH1L .EQU $5B PCTL .EQU $5C PBWC .EQU $5D PPG .EQU $5E SBSR .EQU $FE00 SRSR .EQU $FE01 SBFCR .EQU $FE03 FLCR .EQU $FE08 ; this is not $FE07 as stated on page 26, datasheet Rev.6.1 BRKH .EQU $FE0C BRKL .EQU $FE0D BRKSCR .EQU $FE0E LVISCR .EQU $FE0F FLBPR .EQU $FF7E COPCTL .EQU $FFFF _vect_SCItransmit .EQU $FFD2 _vect_SCIreceive .EQU $FFD4 _vect_SCIerror .EQU $FFD6 _vect_SPItransmit .EQU $FFD8 _vect_SPIreceive .EQU $FFDA _vect_ADC .EQU $FFDC _vect_TIMOVF .EQU $FFDE _vect_TIM1 .EQU $FFE0 _vect_TIM0 .EQU $FFE2 _vect_TimAOvf .EQU $FFE4 _vect_TimACh3 .EQU $FFE6 _vect_TimACh2 .EQU $FFE8 _vect_TimACh1 .EQU $FFEA _vect_TimACh0 .EQU $FFEC _vect_PWMmc .EQU $FFEE _vect_Fault4 .EQU $FFF0 _vect_Fault3 .EQU $FFF2 _vect_Fault2 .EQU $FFF4 _vect_Fault1 .EQU $FFF6 _vect_PLL .EQU $FFF8 _vect_IRQ .EQU $FFFA _vect_SWI .EQU $FFFC _vect_RESET .EQU $FFFE #include "bits68hc908.asm" #endif dasm-2.20.14.1/machines/atari2600/000077500000000000000000000000001375233463600161565ustar00rootroot00000000000000dasm-2.20.14.1/machines/atari2600/macro.h000066400000000000000000000132311375233463600174300ustar00rootroot00000000000000; MACRO.H ; Version 1.09, 05/SEP/2020 VERSION_MACRO = 109 ; ; THIS FILE IS EXPLICITLY SUPPORTED AS A DASM-PREFERRED COMPANION FILE ; The latest version can be found at https://dasm-assembler.github.io/ ; ; This file defines DASM macros useful for development for the Atari 2600. ; It is distributed as a companion machine-specific support package ; for the DASM compiler. ; ; Many thanks to the people who have contributed. If you find an issue with the ; contents, or would like ot add something, please report as an issue at... ; https://github.com/dasm-assembler/dasm/issues ; Latest Revisions... ; 1.09 05/SEP/2020 - updated license/links ; 1.08 13/JUL/2020 - added use of LXA to CLEAN_START ; 1.07 19/JAN/2020 - correction to comment VERTICAL_SYNC ; 1.06 03/SEP/2004 - nice revision of VERTICAL_SYNC (Edwin Blink) ; 1.05 14/NOV/2003 - Added VERSION_MACRO equate (which will reflect 100x version #) ; This will allow conditional code to verify MACRO.H being ; used for code assembly. ; 1.04 13/NOV/2003 - SET_POINTER macro added (16-bit address load) ; ; 1.03 23/JUN/2003 - CLEAN_START macro added - clears TIA, RAM, registers ; ; 1.02 14/JUN/2003 - VERTICAL_SYNC macro added ; (standardised macro for vertical synch code) ; 1.01 22/MAR/2003 - SLEEP macro added. ; - NO_ILLEGAL_OPCODES switch implemented ; 1.0 22/MAR/2003 Initial release ; Note: These macros use illegal opcodes. To disable illegal opcode usage, ; define the symbol NO_ILLEGAL_OPCODES (-DNO_ILLEGAL_OPCODES=1 on command-line). ; If you do not allow illegal opcode usage, you must include this file ; *after* including VCS.H (as the non-illegal opcodes access hardware ; registers and require them to be defined first). ; Available macros... ; SLEEP n - sleep for n cycles ; VERTICAL_SYNC - correct 3 scanline vertical synch code ; CLEAN_START - set machine to known state on startup ; SET_POINTER - load a 16-bit absolute to a 16-bit variable ;------------------------------------------------------------------------------- ; SLEEP duration ; Original author: Thomas Jentzsch ; Inserts code which takes the specified number of cycles to execute. This is ; useful for code where precise timing is required. ; ILLEGAL-OPCODE VERSION DOES NOT AFFECT FLAGS OR REGISTERS. ; LEGAL OPCODE VERSION MAY AFFECT FLAGS ; Uses illegal opcode (DASM 2.20.01 onwards). MAC SLEEP ;usage: SLEEP n (n>1) .CYCLES SET {1} IF .CYCLES < 2 ECHO "MACRO ERROR: 'SLEEP': Duration must be > 1" ERR ENDIF IF .CYCLES & 1 IFNCONST NO_ILLEGAL_OPCODES nop 0 ELSE bit VSYNC ENDIF .CYCLES SET .CYCLES - 3 ENDIF REPEAT .CYCLES / 2 nop REPEND ENDM ;------------------------------------------------------------------------------- ; VERTICAL_SYNC ; revised version by Edwin Blink -- saves bytes! ; Inserts the code required for a proper 3 scanline vertical sync sequence ; Note: Alters the accumulator ; OUT: A = 0 MAC VERTICAL_SYNC lda #%1110 ; each '1' bits generate a VSYNC ON line (bits 1..3) .VSLP1 sta WSYNC ; 1st '0' bit resets Vsync, 2nd '0' bit exit loop sta VSYNC lsr bne .VSLP1 ; branch until VYSNC has been reset ENDM ;------------------------------------------------------------------------------- ; CLEAN_START ; Original author: Andrew Davie ; Standardised start-up code, clears stack, all TIA registers and RAM to 0 ; Sets stack pointer to $FF, and all registers to 0 ; Sets decimal mode off, sets interrupt flag (kind of un-necessary) ; Use as very first section of code on boot (ie: at reset) ; Code written to minimise total ROM usage - uses weird 6502 knowledge :) MAC CLEAN_START sei cld IFNCONST NO_ILLEGAL_OPCODES lxa #0 ELSE ldx #0 txa ENDIF tay .CLEAR_STACK dex txs pha bne .CLEAR_STACK ; SP=$FF, X = A = Y = 0 ENDM ;------------------------------------------------------- ; SET_POINTER ; Original author: Manuel Rotschkar ; ; Sets a 2 byte RAM pointer to an absolute address. ; ; Usage: SET_POINTER pointer, address ; Example: SET_POINTER SpritePTR, SpriteData ; ; Note: Alters the accumulator, NZ flags ; IN 1: 2 byte RAM location reserved for pointer ; IN 2: absolute address MAC SET_POINTER .POINTER SET {1} .ADDRESS SET {2} LDA #<.ADDRESS ; Get Lowbyte of Address STA .POINTER ; Store in pointer LDA #>.ADDRESS ; Get Hibyte of Address STA .POINTER+1 ; Store in pointer+1 ENDM ;------------------------------------------------------- ; BOUNDARY byte# ; Original author: Denis Debro (borrowed from Bob Smith / Thomas) ; ; Push data to a certain position inside a page and keep count of how ; many free bytes the programmer will have. ; ; eg: BOUNDARY 5 ; position at byte #5 in page .FREE_BYTES SET 0 MAC BOUNDARY REPEAT 256 IF <. % {1} = 0 MEXIT ELSE .FREE_BYTES SET .FREE_BYTES + 1 .byte $00 ENDIF REPEND ENDM ; EOF dasm-2.20.14.1/machines/atari2600/vcs.h000066400000000000000000000217141375233463600171270ustar00rootroot00000000000000; VCS.H ; Version 1.06, 06/SEP/2020 VERSION_VCS = 106 ; THIS IS *THE* "STANDARD" VCS.H ; THIS FILE IS EXPLICITLY SUPPORTED AS A DASM-PREFERRED COMPANION FILE ; The latest version can be found at https://dasm-assembler.github.io/ ; ; This file defines hardware registers and memory mapping for the ; Atari 2600. It is distributed as a companion machine-specific support package ; for the DASM compiler. Updates to this file, DASM, and associated tools are ; available at at https://dasm-assembler.github.io/ ; ; Many thanks to the people who have contributed. If you find an issue with the ; contents, or would like ot add something, please report as an issue at... ; https://github.com/dasm-assembler/dasm/issues ; ; Latest Revisions... ; 1.06 05/SEP/2020 Modified header/license and links to new versions ; 1.05 13/NOV/2003 - Correction to 1.04 - now functions as requested by MR. ; - Added VERSION_VCS equate (which will reflect 100x version #) ; This will allow conditional code to verify VCS.H being ; used for code assembly. ; 1.04 12/NOV/2003 Added TIA_BASE_WRITE_ADDRESS and TIA_BASE_READ_ADDRESS for ; convenient disassembly/reassembly compatibility for hardware ; mirrored reading/writing differences. This is more a ; readability issue, and binary compatibility with disassembled ; and reassembled sources. Per Manuel Rotschkar's suggestion. ; 1.03 12/MAY/2003 Added SEG segment at end of file to fix old-code compatibility ; which was broken by the use of segments in this file, as ; reported by Manuel Polik on [stella] 11/MAY/2003 ; 1.02 22/MAR/2003 Added TIMINT($285) ; 1.01 Constant offset added to allow use for 3F-style bankswitching ; - define TIA_BASE_ADDRESS as $40 for Tigervision carts, otherwise ; it is safe to leave it undefined, and the base address will ; be set to 0. Thanks to Eckhard Stolberg for the suggestion. ; Note, may use -DLABEL=EXPRESSION to define TIA_BASE_ADDRESS ; - register definitions are now generated through assignment ; in uninitialised segments. This allows a changeable base ; address architecture. ; 1.0 22/MAR/2003 Initial release ;------------------------------------------------------------------------------- ; TIA_BASE_ADDRESS ; The TIA_BASE_ADDRESS defines the base address of access to TIA registers. ; Normally 0, the base address should (externally, before including this file) ; be set to $40 when creating 3F-bankswitched (and other?) cartridges. ; The reason is that this bankswitching scheme treats any access to locations ; < $40 as a bankswitch. IFNCONST TIA_BASE_ADDRESS TIA_BASE_ADDRESS = 0 ENDIF ; Note: The address may be defined on the command-line using the -D switch, eg: ; dasm.exe code.asm -DTIA_BASE_ADDRESS=$40 -f3 -v5 -ocode.bin ; *OR* by declaring the label before including this file, eg: ; TIA_BASE_ADDRESS = $40 ; include "vcs.h" ; Alternate read/write address capability - allows for some disassembly compatibility ; usage ; to allow reassembly to binary perfect copies). This is essentially catering ; for the mirrored ROM hardware registers. ; Usage: As per above, define the TIA_BASE_READ_ADDRESS and/or TIA_BASE_WRITE_ADDRESS ; using the -D command-line switch, as required. If the addresses are not defined, ; they defaut to the TIA_BASE_ADDRESS. IFNCONST TIA_BASE_READ_ADDRESS TIA_BASE_READ_ADDRESS = TIA_BASE_ADDRESS ENDIF IFNCONST TIA_BASE_WRITE_ADDRESS TIA_BASE_WRITE_ADDRESS = TIA_BASE_ADDRESS ENDIF ;------------------------------------------------------------------------------- SEG.U TIA_REGISTERS_WRITE ORG TIA_BASE_WRITE_ADDRESS ; DO NOT CHANGE THE RELATIVE ORDERING OF REGISTERS! VSYNC ds 1 ; $00 0000 00x0 Vertical Sync Set-Clear VBLANK ds 1 ; $01 xx00 00x0 Vertical Blank Set-Clear WSYNC ds 1 ; $02 ---- ---- Wait for Horizontal Blank RSYNC ds 1 ; $03 ---- ---- Reset Horizontal Sync Counter NUSIZ0 ds 1 ; $04 00xx 0xxx Number-Size player/missle 0 NUSIZ1 ds 1 ; $05 00xx 0xxx Number-Size player/missle 1 COLUP0 ds 1 ; $06 xxxx xxx0 Color-Luminance Player 0 COLUP1 ds 1 ; $07 xxxx xxx0 Color-Luminance Player 1 COLUPF ds 1 ; $08 xxxx xxx0 Color-Luminance Playfield COLUBK ds 1 ; $09 xxxx xxx0 Color-Luminance Background CTRLPF ds 1 ; $0A 00xx 0xxx Control Playfield, Ball, Collisions REFP0 ds 1 ; $0B 0000 x000 Reflection Player 0 REFP1 ds 1 ; $0C 0000 x000 Reflection Player 1 PF0 ds 1 ; $0D xxxx 0000 Playfield Register Byte 0 PF1 ds 1 ; $0E xxxx xxxx Playfield Register Byte 1 PF2 ds 1 ; $0F xxxx xxxx Playfield Register Byte 2 RESP0 ds 1 ; $10 ---- ---- Reset Player 0 RESP1 ds 1 ; $11 ---- ---- Reset Player 1 RESM0 ds 1 ; $12 ---- ---- Reset Missle 0 RESM1 ds 1 ; $13 ---- ---- Reset Missle 1 RESBL ds 1 ; $14 ---- ---- Reset Ball AUDC0 ds 1 ; $15 0000 xxxx Audio Control 0 AUDC1 ds 1 ; $16 0000 xxxx Audio Control 1 AUDF0 ds 1 ; $17 000x xxxx Audio Frequency 0 AUDF1 ds 1 ; $18 000x xxxx Audio Frequency 1 AUDV0 ds 1 ; $19 0000 xxxx Audio Volume 0 AUDV1 ds 1 ; $1A 0000 xxxx Audio Volume 1 GRP0 ds 1 ; $1B xxxx xxxx Graphics Register Player 0 GRP1 ds 1 ; $1C xxxx xxxx Graphics Register Player 1 ENAM0 ds 1 ; $1D 0000 00x0 Graphics Enable Missle 0 ENAM1 ds 1 ; $1E 0000 00x0 Graphics Enable Missle 1 ENABL ds 1 ; $1F 0000 00x0 Graphics Enable Ball HMP0 ds 1 ; $20 xxxx 0000 Horizontal Motion Player 0 HMP1 ds 1 ; $21 xxxx 0000 Horizontal Motion Player 1 HMM0 ds 1 ; $22 xxxx 0000 Horizontal Motion Missle 0 HMM1 ds 1 ; $23 xxxx 0000 Horizontal Motion Missle 1 HMBL ds 1 ; $24 xxxx 0000 Horizontal Motion Ball VDELP0 ds 1 ; $25 0000 000x Vertical Delay Player 0 VDELP1 ds 1 ; $26 0000 000x Vertical Delay Player 1 VDELBL ds 1 ; $27 0000 000x Vertical Delay Ball RESMP0 ds 1 ; $28 0000 00x0 Reset Missle 0 to Player 0 RESMP1 ds 1 ; $29 0000 00x0 Reset Missle 1 to Player 1 HMOVE ds 1 ; $2A ---- ---- Apply Horizontal Motion HMCLR ds 1 ; $2B ---- ---- Clear Horizontal Move Registers CXCLR ds 1 ; $2C ---- ---- Clear Collision Latches ;------------------------------------------------------------------------------- SEG.U TIA_REGISTERS_READ ORG TIA_BASE_READ_ADDRESS ; bit 7 bit 6 CXM0P ds 1 ; $00 xx00 0000 Read Collision M0-P1 M0-P0 CXM1P ds 1 ; $01 xx00 0000 M1-P0 M1-P1 CXP0FB ds 1 ; $02 xx00 0000 P0-PF P0-BL CXP1FB ds 1 ; $03 xx00 0000 P1-PF P1-BL CXM0FB ds 1 ; $04 xx00 0000 M0-PF M0-BL CXM1FB ds 1 ; $05 xx00 0000 M1-PF M1-BL CXBLPF ds 1 ; $06 x000 0000 BL-PF ----- CXPPMM ds 1 ; $07 xx00 0000 P0-P1 M0-M1 INPT0 ds 1 ; $08 x000 0000 Read Pot Port 0 INPT1 ds 1 ; $09 x000 0000 Read Pot Port 1 INPT2 ds 1 ; $0A x000 0000 Read Pot Port 2 INPT3 ds 1 ; $0B x000 0000 Read Pot Port 3 INPT4 ds 1 ; $0C x000 0000 Read Input (Trigger) 0 INPT5 ds 1 ; $0D x000 0000 Read Input (Trigger) 1 ;------------------------------------------------------------------------------- SEG.U RIOT ORG $280 ; RIOT MEMORY MAP SWCHA ds 1 ; $280 Port A data register for joysticks: ; Bits 4-7 for player 1. Bits 0-3 for player 2. SWACNT ds 1 ; $281 Port A data direction register (DDR) SWCHB ds 1 ; $282 Port B data (console switches) SWBCNT ds 1 ; $283 Port B DDR INTIM ds 1 ; $284 Timer output TIMINT ds 1 ; $285 ; Unused/undefined registers ($285-$294) ds 1 ; $286 ds 1 ; $287 ds 1 ; $288 ds 1 ; $289 ds 1 ; $28A ds 1 ; $28B ds 1 ; $28C ds 1 ; $28D ds 1 ; $28E ds 1 ; $28F ds 1 ; $290 ds 1 ; $291 ds 1 ; $292 ds 1 ; $293 TIM1T ds 1 ; $294 set 1 clock interval TIM8T ds 1 ; $295 set 8 clock interval TIM64T ds 1 ; $296 set 64 clock interval T1024T ds 1 ; $297 set 1024 clock interval ;------------------------------------------------------------------------------- ; The following required for back-compatibility with code which does not use ; segments. SEG ; EOF dasm-2.20.14.1/machines/atari7800/000077500000000000000000000000001375233463600161655ustar00rootroot00000000000000dasm-2.20.14.1/machines/atari7800/7800.h000066400000000000000000000160161375233463600167400ustar00rootroot00000000000000; 7800.h ; Version 1.0, 2019/12/13 ; This file defines hardware registers and memory mapping for the ; Atari 7800. It is distributed as a companion machine-specific support package ; for the DASM compiler. Updates to this file, DASM, and associated tools are ; available at https://github.com/dasm-assembler/dasm ; ******************** 7800 Hardware Adresses *************************** ; ; MEMORY MAP USAGE OF THE 7800 ; ; 00 - 1F TIA REGISTERS ; 20 - 3F MARIA REGISTERS ; 40 - FF RAM block 0 (zero page) ; 100 - 11F TIA (mirror of 0000-001f) ; 120 - 13F MARIA (mirror of 0020-003f) ; 140 - 1FF RAM block 1 (stack) ; 200 - 21F TIA (mirror of 0000-001f) ; 220 - 23F MARIA (mirror of 0020-003f) ; 240 - 27F ??? ; 280 - 2FF RIOT I/O ports and timers ; 300 - 31F TIA (mirror of 0000-001f) ; 320 - 33F MARIA (mirror of 0020-003f) ; 340 - 3FF ??? ; 400 - 47F unused address space ; 480 - 4FF RIOT RAM ; 500 - 57F unused address space ; 580 - 5FF RIOT RAM (mirror of 0480-04ff) ; 600 - 17FF unused address space ; 1800 - 203F RAM ; 2040 - 20FF RAM block 0 (mirror of 0000-001f) ; 2100 - 213F RAM ; 2140 - 21FF RAM block 1 (mirror of 0140-01ff) ; 2200 - 27FF RAM ; 2800 - 2FFF mirror of 1800-27ff ; 3000 - 3FFF unused address space ; 4000 - FF7F potential cartridge address space ; FF80 - FFF9 RESERVED FOR ENCRYPTION ; FFFA - FFFF 6502 VECTORS ;****** 00-1F ********* TIA REGISTERS ****************** INPTCTRL = $01 ;Input control. In same address space as TIA. write-only VBLANK = $01 ;VBLANK. D7=1:dump paddle caps to ground. write-only INPT0 = $08 ;Paddle Control Input 0 read-only INPT1 = $09 ;Paddle Control Input 1 read-only INPT2 = $0A ;Paddle Control Input 2 read-only INPT3 = $0B ;Paddle Control Input 3 read-only ; ** some common alternate names for INPT0/1/2/3 INPT4B = $08 ;Joystick 0 Fire 1 read-only INPT4A = $09 ;Joystick 0 Fire 1 read-only INPT5B = $0A ;Joystick 1 Fire 0 read-only INPT5A = $0B ;Joystick 1 Fire 1 read-only INPT4R = $08 ;Joystick 0 Fire 1 read-only INPT4L = $09 ;Joystick 0 Fire 1 read-only INPT5R = $0A ;Joystick 1 Fire 0 read-only INPT5L = $0B ;Joystick 1 Fire 1 read-only INPT4 = $0C ;Player 0 Fire Button Input read-only INPT5 = $0D ;Player 1 Fire Button Input read-only AUDC0 = $15 ;Audio Control Channel 0 write-only AUDC1 = $16 ;Audio Control Channel 1 write-only AUDF0 = $17 ;Audio Frequency Channel 0 write-only AUDF1 = $18 ;Audio Frequency Channel 1 write-only AUDV0 = $19 ;Audio Volume Channel 0 write-only AUDV1 = $1A ;Audio Volume Channel 1 write-only ;****** 20-3F ********* MARIA REGISTERS *************** BACKGRND = $20 ;Background Color write-only P0C1 = $21 ;Palette 0 - Color 1 write-only P0C2 = $22 ;Palette 0 - Color 2 write-only P0C3 = $23 ;Palette 0 - Color 3 write-only WSYNC = $24 ;Wait For Sync write-only P1C1 = $25 ;Palette 1 - Color 1 write-only P1C2 = $26 ;Palette 1 - Color 2 write-only P1C3 = $27 ;Palette 1 - Color 3 write-only MSTAT = $28 ;Maria Status read-only P2C1 = $29 ;Palette 2 - Color 1 write-only P2C2 = $2A ;Palette 2 - Color 2 write-only P2C3 = $2B ;Palette 2 - Color 3 write-only DPPH = $2C ;Display List List Pointer High write-only P3C1 = $2D ;Palette 3 - Color 1 write-only P3C2 = $2E ;Palette 3 - Color 2 write-only P3C3 = $2F ;Palette 3 - Color 3 write-only DPPL = $30 ;Display List List Pointer Low write-only P4C1 = $31 ;Palette 4 - Color 1 write-only P4C2 = $32 ;Palette 4 - Color 2 write-only P4C3 = $33 ;Palette 4 - Color 3 write-only CHARBASE = $34 ;Character Base Address write-only CHBASE = $34 ;Character Base Address write-only P5C1 = $35 ;Palette 5 - Color 1 write-only P5C2 = $36 ;Palette 5 - Color 2 write-only P5C3 = $37 ;Palette 5 - Color 3 write-only OFFSET = $38 ;Unused - Store zero here write-only P6C1 = $39 ;Palette 6 - Color 1 write-only P6C2 = $3A ;Palette 6 - Color 2 write-only P6C3 = $3B ;Palette 6 - Color 3 write-only CTRL = $3C ;Maria Control Register write-only P7C1 = $3D ;Palette 7 - Color 1 write-only P7C2 = $3E ;Palette 7 - Color 2 write-only P7C3 = $3F ;Palette 7 - Color 3 write-only ;****** 280-2FF ******* PIA PORTS AND TIMERS ************ SWCHA = $280 ;P0+P1 Joystick Directional Input read-write CTLSWA = $281 ;I/O Control for SCHWA read-write SWACNT = $281 ;VCS name for above read-write SWCHB = $282 ;Console Switches read-write CTLSWB = $283 ;I/O Control for SCHWB read-write SWBCNT = $283 ;VCS name for above read-write INTIM = $284 ;Iterval Timer Read read-only TIM1T = $294 ;Set 1 CLK Interval (838 nsec/interval) write-only TIM8T = $295 ;Set 8 CLK Interval (6.7 usec/interval) write-only TIM64T = $296 ;Set 64 CLK Interval (63.6 usec/interval) write-only T1024T = $297 ;Set 1024 CLK Interval (858.2 usec/interval) write-only TIM64TI = $29E ;Interrupt timer 64T write-only ;XM XCTRL = $470 ; 7=YM2151 6=RAM@6k 5=RAM@4k 4=pokey@450 3=hsc 2=cart 1=RoF_bank1 0=RoF_bank2 ; Pokey register relative locations, since its base may be different ; depending on the hardware. PAUDF0 = $0 ; extra audio channels and frequencies PAUDC0 = $1 PAUDF1 = $2 PAUDC1 = $3 PAUDF2 = $4 PAUDC2 = $5 PAUDF3 = $6 PAUDC3 = $7 PAUDCTL = $8 ; Audio Control PRANDOM = $A ; 17 bit polycounter pseudo random PSKCTL = $F ; Serial Port control dasm-2.20.14.1/machines/atari7800/macro.h000066400000000000000000000040221375233463600174350ustar00rootroot00000000000000; MACRO.H ; Based on the 2600 macro.h file. ; Macros irrelevant to the 7800 have been removed, and the sleep macro ; has been adapted to give accurate results on the 7800. ; Version 1.0 2019/12/11 (based on the 2600 Version 1.05, 13/NOVEMBER/2003) ; Available macros... ; SLEEP n - sleep for n cycles ; SET_POINTER - load a 16-bit absolute to a 16-bit variable ;------------------------------------------------------------------------------- ; SLEEP duration ; Original author: Thomas Jentzsch ; Inserts code which takes the specified number of cycles to execute. This is ; useful for code where precise timing is required. ; ILLEGAL-OPCODE VERSION DOES NOT AFFECT FLAGS OR REGISTERS. ; LEGAL OPCODE VERSION MAY AFFECT FLAGS ; Uses illegal opcode (DASM 2.20.01 onwards). MAC SLEEP ;usage: SLEEP n (n>1) .CYCLES SET {1} IF .CYCLES < 2 ECHO "MACRO ERROR: 'SLEEP': Duration must be > 1" ERR ENDIF IF .CYCLES & 1 IFNCONST NO_ILLEGAL_OPCODES nop $80 ELSE bit $80 ENDIF .CYCLES SET .CYCLES - 3 ENDIF REPEAT .CYCLES / 2 nop REPEND ENDM ;------------------------------------------------------- ; SET_POINTER ; Original author: Manuel Rotschkar ; ; Sets a 2 byte RAM pointer to an absolute address. ; ; Usage: SET_POINTER pointer, address ; Example: SET_POINTER SpritePTR, SpriteData ; ; Note: Alters the accumulator, NZ flags ; IN 1: 2 byte RAM location reserved for pointer ; IN 2: absolute address MAC SET_POINTER .POINTER SET {1} .ADDRESS SET {2} LDA #<.ADDRESS ; Get Lowbyte of Address STA .POINTER ; Store in pointer LDA #>.ADDRESS ; Get Hibyte of Address STA .POINTER+1 ; Store in pointer+1 ENDM ; EOF dasm-2.20.14.1/machines/channel-f/000077500000000000000000000000001375233463600164015ustar00rootroot00000000000000dasm-2.20.14.1/machines/channel-f/README000066400000000000000000000123511375233463600172630ustar00rootroot00000000000000 This document describes some properties of DASM's Fairchild F8 backend It does *not* describe how to program the F8. Processor selection ------------------- With DASM, the target CPU is selected with the PROCESSOR directive inside the source file that should be assembled. The F8 CPU is selected like this: processor f8 processor F8 ; case insensitive Expressions with parentheses ---------------------------- Some of DASM's backends, for instance the one for the 6502, don't allow parentheses in expressions that are part of a mnemonic's operand, because parentheses are used in the 6502's assembly language to denote indirect addressing. Instead, you have to use brackets. This is not the case with the F8 backend. Both parentheses and brackets can be used everywhere, so the following lines are parsed and assembled correctly: as (2+2)*2 ; Assembles to $c8 as [2+2]*2 ; Assembles to $c8 Data definition directives -------------------------- Since DS is an F8 instruction (decrement scratchpad register), the DS directive isn't available anymore if DASM assembles F8 code. Instead, use the RES directive, which works just like the DS directive: ds.b 4,$33 ; Would assemble to $33 $33 $33 $33, ; but isn't available in F8 mode res.b 4,$33 ; Assembles to $33 $33 $33 $33 Of course RES.W and RES.L do exist aswell. For source code compatibility with f8tool (another F8 assembler), some additional data definition directives are available : DB, DW and DD. These work just like DC.B, DC.W and DC.L: dc.b $f8 ; Assembles to $f8 db $f8 ; Assembles to $f8 Special register names ---------------------- For some of the special registers, multiple names are accepted: Register Accepted names ------------------------------ DC0 DC, DC0 PC0 P0, PC0 PC1 P, PC1 J J, Any expression that evaluates to 9 (This may seem strange, but J is really just an alias for scratchpad register 9) The names DC, P0, P and J are standard syntax, the other forms have been introduced for compatibility with other assemblers. Thus, the following lines assemble all correctly: lr h,dc ; Assembles to $11 lr h,dc0 ; Assembles to $11 lr p0,q ; Assembles to $0d lr pc0,q ; Assembles to $0d lr p,q ; Assembles to $09 lr pc1,q ; Assembles to $09 lr w,j ; Assembles to $1d lr w,3*3 ; Assembles to $1d Scratchpad register access -------------------------- There are several ways to access scratchpad registers: Access mode Accepted syntax --------------------------------------------------------------- Direct access to registers 0..11 Any expression that evaluates to 0..11 Access via ISAR S, (IS), any expression that evaluates to 12 Access via ISAR, ISAR incremented I, (IS)+, any expression that evaluates to 13 Access via ISAR, ISAR decremented D, (IS)-, any expression that evaluates to 14 The (IS), (IS)+ and (IS)- forms are not standard syntax and have been mainly introduced for compatibility with f8tool. For some of the directly accessible scratchpad registers aliases exist: Register Alias name -------------------------- 9 J 10 HU 11 HL Originally, J was only used with the LR instruction when accessing the flags, but since J is just an alias for register 9, J can also be used in normal scratchpad register operations. The following lines assemble all correctly xs 2+2 ; Assembles to $e4 xs s ; Assembles to $ec xs (is) ; Assembles to $ec xs 12 ; Assembles to $ec xs i ; Assembles to $ed xs (is)+ ; Assembles to $ed xs 13 ; Assembles to $ed xs d ; Assembles to $ee xs (is)- ; Assembles to $ee xs 14 ; Assembles to $ee xs 9 ; Assembles to $e9 xs j ; Assembles to $e9 xs hu ; Assembles to $ea xs hl ; Assembles to $eb No instruction optimizations are done ------------------------------------- The assembler doesn't optimize instructions where a smaller instruction could be used. It won't optimize between OUT/OUTS, IN/INS and LI/LIS. For instance, the following line assembles to $20 $00, even though the LIS instruction could be used, which would need only one byte. li 0 ; Assembles to $20 $00 dasm-2.20.14.1/machines/channel-f/macro.h000066400000000000000000000052031375233463600176530ustar00rootroot00000000000000; MACRO.H for Channel F ; Version 1.01, 2/NOVEMBER/2004 VERSION_MACRO = 101 ; ; THIS FILE IS EXPLICITLY SUPPORTED AS A DASM-PREFERRED COMPANION FILE ; PLEASE DO *NOT* REDISTRIBUTE MODIFIED VERSIONS OF THIS FILE! ; ; This file defines DASM macros useful for development for the Channel F. ; It is distributed as a companion machine-specific support package ; for the DASM compiler. Updates to this file, DASM, and associated tools are ; available at at http://www.atari2600.org/dasm ; ; Many thanks to the people who have contributed. If you take issue with the ; contents, or would like to add something, please write to me ; (atari2600@taswegian.com) with your contribution. ; ; Latest Revisions... ; ; 1.01 2/NOV/2004 Contribution from Kevin Lipe ; 1.00 31/OCT/2004 - initial version ;=================================================================== ; M A C R O S ;=================================================================== ;------------------------- ; CARTRIDGE_START ; Original Author: Sean Riddle ; Inserts the $55 that signals a valid Channel F cartridge and ; then inserts the NOP that takes up the next byte, which places ; the Channel F at the cartridge entry point, $802. MAC CARTRIDGE_START CartridgeStart: db $55 ; valid cart indicator NOP ; unused byte ENDM ;------------------------- ; PROMPTS_NO_T ; Original Author: Sean Riddle ; This code functions the same as the "prompts" section of the BIOS, ; but this code doesn't have a "T?" prompt, so it's useful in games that ; don't have time limits or settings. MAC PROMPTS_NOT prompts SUBROUTINE LR K,P ; PI pushk ; .prompts2: LI $85 ; red 5 (S) LR $0,A ; PI prompt ; LR A,$4 ; CI $08 ; is it button 4, Start? BF $4,.notbut4 ; no, check others .notbut2: PI popk ; yes, return PK ; .notbut4: CI $02 ; is it button 2, Mode? BF $4,.notbut2 ; LI $8e ; red M LR $0,A ; PI prompt ; LISU 3 ; LISL 6 ; LR A,(IS) ; as 4 ;add the mode to the game # LR (IS),A ; BF $0,.prompts2 ; ENDM ; EOF dasm-2.20.14.1/machines/channel-f/ves.h000066400000000000000000000057011375233463600173520ustar00rootroot00000000000000; VES.H ; Fairchild Channel F Header ; Version 1.01, 2/NOVEMBER/2004 VERSION_CHANNELF = 101 VERSION_VES = 101 ; THIS IS A PRELIMINARY RELEASE OF *THE* "STANDARD" VES.H ; THIS FILE IS EXPLICITLY SUPPORTED AS A DASM-PREFERRED COMPANION FILE ; PLEASE DO *NOT* REDISTRIBUTE THIS FILE! ; ; This file defines hardware registers and memory mapping for the ; Fairchild Channel-F. It is distributed as a companion machine-specific support package ; for the DASM compiler. Updates to this file, DASM, and associated tools are ; available at at http://www.atari2600.org/dasm ; ; Many thanks to the original author(s) of this file, and to everyone who has ; contributed to understanding the Channel-F. If you take issue with the ; contents, or naming of registers, please write to me (atari2600@taswegian.com) ; with your views. Please contribute, if you think you can improve this ; file! ; ; Latest Revisions... ; 1.01 2/NOV/2004 Kevin Lipe's version (combined macro/header) ; renamed to VES.H ; alternates provided for deprecated equates ; ALL hardware/BIOS equates now in uppercase and prefixed ; 1.00 31/OCT/2004 - initial release ; Please contribute Channel-F header code to atari2600@taswegian.com INCLUDE_DEPRECATED ; remove to DISABLE deprecated equates ;------------------------------------------------------------------------------- ; BIOS Calls ;------------------------ BIOS_CLEAR_SCREEN = $00d0 ; uses r31 BIOS_DELAY = $008f BIOS_PUSH_K = $0107 ; used to allow more subroutine stack space BIOS_POP_K = $011e BIOS_DRAW_CHARACTER = $0679 ;------------------------------------------------------------------------------- ; Colors COLOR_RED = $40 COLOR_BLUE = $80 COLOR_GREEN = $00 COLOR_BACKGROUND = $C0 ; Alternate (European) spellings... COLOUR_RES = COLOR_RED COLOUR_BLUE = COLOR_BLUE COLOUR_GREEN = COLOR_GREEN COLOUR_BACKGROUND = COLOR_BACKGROUND ;------------------------------------------------------------------------------- ; DEPRECATED equates. ; These present to be compatible with existing equate usage. ; DO NOT USE THESE IN NEW CODE -- WE WANT TO GET RID OF THEM! IFCONST INCLUDE_DEPRECATED clrscrn = BIOS_CLEAR_SCREEN ; DEPRECATED! delay = BIOS_DELAY ; DEPRECATED! pushk = BIOS_PUSH_K ; DEPRECATED! popk = BIOS_POP_K ; DEPRECATED! drawchar = BIOS_DRAW_CHARACTER ; DEPRECATED! red = COLOR_RED ; DEPRECATED! blue = COLOR_BLUE ; DEPRECATED green = COLOR_GREEN ; DEPRECATED bkg = COLOR_BACKGROUND ; DEPRECATED ENDIF ;------------------------------------------------------------------------------- ; The following required for back-compatibility with code which does not use ; segments. SEG ; EOF dasm-2.20.14.1/research/000077500000000000000000000000001375233463600145535ustar00rootroot00000000000000dasm-2.20.14.1/research/Makefile000066400000000000000000000006161375233463600162160ustar00rootroot00000000000000CFLAGS=-O0 -std=c99 -Wall -Wextra # try -O3 for fun... ALL = hash_compare compare_mod_and minunit_example get_set_progname sizeof bitsets loweror fsize #args all: $(ALL) clean: rm -rf *.o $(ALL) MNEMONICS := $(wildcard ../src/mne*.c) ../src/globals.c all_mnemonics.txt: $(MNEMONICS) cat $(MNEMONICS) | grep 'NULL,[ ]*v_' | cut -f3 -d, | sed 's/^[ ]*//g;s/"//g' | sort -u >all_mnemonics.txt dasm-2.20.14.1/research/README000066400000000000000000000001671375233463600154370ustar00rootroot00000000000000 This is a directory to keep experiments in, stuff that was written to explore some aspect of DASM and improve on it. dasm-2.20.14.1/research/all_mnemonics.txt000066400000000000000000000024071375233463600201370ustar00rootroot00000000000000= aba abx aby adc adca adcb add adda addb addd ai aim align am amd anc and anda andb ane arr as asd asl asla aslb asld aslx asr asra asrb asrx bc bcc bclr bcs beq bf bge bgt bhcc bhcs bhi bhs bih bil bit bita bitb ble blo bls blt bm bmc bmi bms bnc bne bno bnz bp bpl br br7 bra brclr brk brn brset bset bsr bt bvc bvs byte bz cba ci clc cld cli clr clra clrb clrx clv cm cmp cmpa cmpb com coma comb comx cpd cpx cpy daa db dc dci dcp dd dec deca decb decx des dex dey di ds dv dw echo ei eif eim else end endif endm eor eora eorb eqm equ err fdiv hex idiv if ifconst ifnconst in inc inca incb incbin incdir include incx ins inx iny isb jmp jsr las lax lda ldaa ldab ldd lds ldx ldy li lis lisl list lisu lm lnk long lr lsl lsla lslb lsld lslx lsr lsra lsrb lsrd lsrx lxa mac mexit mul neg nega negb negx ni nm nop ns oi oim om ora oraa orab org out outs pha php pi pk pla plp pop processor psha pshb pshx pshy pula pulb pulx puly rend repeat repend res rla rol rola rolb rolx ror rora rorb rorg rorx rra rsp rti rts sax sba sbc sbca sbcb sbx sec sed seg sei set sev sha shs shx shy sl slo slp sr sre st sta staa stab std stop sts stx sty sub suba subb subd subroutine swi tab tap tax tay tba test tim tpa trace tst tsta tstb tstx tsx tsy txa txs tya tys wai word xdc xgdx xgdy xi xm xs dasm-2.20.14.1/research/bitsets.c000066400000000000000000000065441375233463600164050ustar00rootroot00000000000000/* Experiments with bit sets. */ #include #include /* Defining bit sets. Short of writing out own bit set abstraction, it seems obvious that we should use enum to generate the values. Also, splint can do a little checking if there's a new type involved. Some naming convention for bits and masks is necessary and below we append _B to bits and _M to masks. A mask can only be generated if a bit of that name has already been defined, another neat little check. */ #define BS_NEW_BIT(x) x ## _B typedef enum { BS_NEW_BIT(OK), BS_NEW_BIT(IFFY), BS_NEW_BIT(SOSO), BS_NEW_BIT(WRONG) } elements; #define BS_NEW_MASK(x) x ## _M = 1 << x ## _B typedef enum { BS_NEW_MASK(OK), BS_NEW_MASK(IFFY), BS_NEW_MASK(SOSO), BS_NEW_MASK(WRONG) } masks; /* Operations on bitsets. This is much more unstable territory. We obviously need support for testing whether bits and groups of bits are set or not. In what form to express that is unclear for now. The operations drafted below are not as simple to understand as I would like them yet. :-/ */ #define BS_INCLUDE(set, mask) (set |= mask) #define BS_EXCLUDE(set, mask) (set &= ~mask) #define BS_INCLUDES_ONE(set, mask) ((set & mask) != 0) #define BS_INCLUDES_ALL(set, mask) ((set & mask) == mask) #define BS_EXCLUDES_ALL(set, mask) ((set & mask) == 0) /* this is probably not correct */ #define BS_EXCLUDES_ONE(set, mask) ((set & mask) == ~mask) int main(void) { /* An empty bit set. */ masks set = 0; /* Basic sanity checks. */ assert(sizeof(elements) == sizeof(int)); assert(sizeof(masks) == sizeof(int)); assert(sizeof(set) == sizeof(int)); assert(OK_B == 0); assert(IFFY_B == 1); assert(SOSO_B == 2); assert(WRONG_B == 3); assert(OK_M == 1); assert(IFFY_M == 2); assert(SOSO_M == 4); assert(WRONG_M == 8); /* Bit set operations on empty set. */ assert(!BS_INCLUDES_ALL(set, OK_M)); assert(!BS_INCLUDES_ALL(set, IFFY_M)); assert(!BS_INCLUDES_ALL(set, SOSO_M)); assert(!BS_INCLUDES_ALL(set, WRONG_M)); assert(!BS_INCLUDES_ONE(set, OK_M)); assert(!BS_INCLUDES_ONE(set, IFFY_M)); assert(!BS_INCLUDES_ONE(set, SOSO_M)); assert(!BS_INCLUDES_ONE(set, WRONG_M)); /* Bit set operations on singleton set. */ BS_INCLUDE(set, OK_M); assert(BS_INCLUDES_ALL(set, OK_M)); assert(!BS_INCLUDES_ALL(set, IFFY_M)); assert(!BS_INCLUDES_ALL(set, SOSO_M)); assert(!BS_INCLUDES_ALL(set, WRONG_M)); assert(BS_INCLUDES_ONE(set, OK_M)); assert(!BS_INCLUDES_ONE(set, IFFY_M)); assert(!BS_INCLUDES_ONE(set, SOSO_M)); assert(!BS_INCLUDES_ONE(set, WRONG_M)); /* Bit set operations on bigger set. */ BS_INCLUDE(set, WRONG_M); assert(BS_INCLUDES_ALL(set, OK_M)); assert(!BS_INCLUDES_ALL(set, IFFY_M)); assert(!BS_INCLUDES_ALL(set, SOSO_M)); assert(BS_INCLUDES_ALL(set, WRONG_M)); assert(BS_INCLUDES_ONE(set, OK_M)); assert(!BS_INCLUDES_ONE(set, IFFY_M)); assert(!BS_INCLUDES_ONE(set, SOSO_M)); assert(BS_INCLUDES_ONE(set, WRONG_M)); assert(BS_INCLUDES_ALL(set, (OK_M|WRONG_M))); assert(!BS_INCLUDES_ALL(set, (SOSO_M|WRONG_M))); assert(!BS_INCLUDES_ALL(set, (OK_M|SOSO_M|WRONG_M))); assert(!BS_INCLUDES_ALL(set, (SOSO_M|IFFY_M))); assert(BS_INCLUDES_ONE(set, (OK_M|WRONG_M))); assert(BS_INCLUDES_ONE(set, (SOSO_M|WRONG_M))); assert(BS_INCLUDES_ONE(set, (OK_M|SOSO_M|WRONG_M))); assert(!BS_INCLUDES_ONE(set, (SOSO_M|IFFY_M))); } dasm-2.20.14.1/research/compare_hashes.py000066400000000000000000000072461375233463600201170ustar00rootroot00000000000000#!/usr/bin/env python # # Experiment to compare various basic hash functions. # # Peter H. Froehlich # I wrote this to play with hash functions since DASM's hash1 # looked suspicious (and it was also duplicated in the code?). # It turns out that it's not that bad for hashing our opcodes, # but Dan Bernstein's hash does twice as well for no real cost # increase, so I'll probably use Dan's instead of Matt's. # # Note that perfect hashing is tempting since we know the keys # in advance, they don't change dynamically (for opcodes!). So # I gave it some thought (i.e. wasted some brain cycles) before # realizing that DASM likes to "mix and match" tables, i.e. it # produces bigger compound tables from smaller ones based on # what processor is selected. So if we want to preserve that # aspect of DASM's design, we can't have perfect hashing. :-/ # # Just as well, I have a feeling that binary search on "static" # arrays would do even better, improved locality of reference # and all that. But I want to keep the hashes, they are a big # thing in DASM. :-) import sys WORDS = [] # We use "raw" hash functions without a compression step; if we # want to evaluate for a given table size, we compress results # later. def hash_dillon(s): hash = 0 for c in s: hash = (hash << 2) ^ ord(c) return hash def hash_djb1(s): hash = 5381 for c in s: hash = ((hash << 5) + hash) + ord(c) # hash * 33 + c return hash def hash_djb2(s): hash = 5381 for c in s: hash = ((hash << 5) + hash) ^ ord(c) return hash def hash_sdbm(s): hash = 0 for c in s: hash = ord(c) + (hash << 6) + (hash << 16) - hash return hash def hash_silly(s): hash = 0 for c in s: hash = hash + ord(c) return hash def hash_silly2(s): hash = 0 i = 1 for c in s: hash = hash + i*ord(c) i += 1 return hash def hash_silly3(s): hash = 0 i = 1 for c in s: # these work pretty well for some reason (for opcodes anyway) #hash = hash + i**1*ord(c)**3 hash = hash + i**2*ord(c)**3 i += 1 return hash def hash_knuth(s): hash = len(s) for c in s: hash = ((hash<<5)^(hash>>27))^ord(c) return hash # http://smallcode.weblogs.us/2008/01/22/hash-functions-an-empirical-comparison/ def hash_kankowski(s): hash = 0 for c in s: hash = 17 * hash + (ord(c) - ord(' ')); return hash ^ (hash >> 16); def eval_hash(hash_func): d = {} for w in WORDS: h = hash_func(w) d[h] = d.get(h, 0) + 1 return d # Note that DASM uses & for compression; % is the same for positive # numbers (*unsigned* anyway in DASM), but it could cost a few more # cycles. def compress_dict(d, size): c = {} for k in d: n = k % size c[n] = c.get(n, 0) + d[k] return c def print_eval(d,s): print "------%s-----" % (s) print "Unique hash values: %s" % (len(d)) print "Max collisions: %s" % (max(d.values())) print "Min collisions: %s" % (min(d.values())) print "Avg collisions: %s" % (sum(d.values())/float(len(d))) print "Med collisions: %s" % (sorted(d.values())[len(d)/2]) # read file into WORDS list, assumes one word per line f = open(sys.argv[1]) for l in f: l = l.strip() WORDS.append(l) f.close() FUNCS = [hash_dillon, hash_djb1, hash_djb2, hash_sdbm, hash_silly, hash_silly2, hash_silly3, hash_knuth, hash_kankowski] # TODO: generate some nice graphics with PyX? for f in FUNCS: print "========== %s ==========" % f.__name__ # just the hash code please d = eval_hash(f) print_eval(d,"raw") # Matt's 2.16 DASM uses 4096 for symbols, 1024 for mnemonics c = compress_dict(d, 4096) print_eval(c,"4096") # our DASM uses 1024 for both hash tables right now... c = compress_dict(d, 1024) print_eval(c,"1024") dasm-2.20.14.1/research/compare_mod_and.c000066400000000000000000000064661375233463600200420ustar00rootroot00000000000000/* Simple hack to compare performance of % and & on modern machines. Seems that & still wins on a wide variety of machines, so we'll stick with it for DASM's compression step in hashing. 1.5 GHz PowerPC G4: -O3, MAX 1<<31 Takes 5 seconds to do 2147483648*4 modulos. ? Takes 5 seconds to do 2147483648*4 ands. ? Takes 3 seconds to do 2147483648*4 ands and minuses. -O0, MAX 1<<27 Takes 11 seconds to do 134217728*4 modulos. Takes 3 seconds to do 134217728*4 ands. ? Takes 2 seconds to do 134217728*4 ands and minuses. ugradx i686: -O3, MAX 1<<31 Takes 2 seconds to do 2147483648*4 modulos. Takes 1 seconds to do 2147483648*4 ands. Takes 1 seconds to do 2147483648*4 ands and minuses. -O0, MAX 1<<27 Takes 8 seconds to do 134217728*4 modulos. Takes 1 seconds to do 134217728*4 ands. Takes 1 seconds to do 134217728*4 ands and minuses. */ #include #include #define MAX 1<<27 double time_mod(void) { unsigned a, b, c, i, d = 13; time_t before, after; before = time(NULL); for (i = 0; i < MAX; i++) { a = i % d; b = i % d; c = i % d; a = i % d; } after = time(NULL); return difftime(after, before); } double time_and(void) { unsigned a, b, c, i, d = 13; time_t before, after; before = time(NULL); for (i = 0; i < MAX; i++) { a = i & d; b = i & d; c = i & d; a = i & d; } after = time(NULL); return difftime(after, before); } double time_and_minus(void) { unsigned a, b, c, i, d = 13; time_t before, after; before = time(NULL); for (i = 0; i < MAX; i++) { a = i & (d-1); b = i & (d-1); c = i & (d-1); a = i & (d-1); } after = time(NULL); return difftime(after, before); } /* Added approximations of the actual hash functions that would be used. Seems that Dan's is a *tiny* bit slower (figures since there's an extra + in there) but in the actual program we have to weigh better distribution of hash values against that. Still to actually measure... */ double time_dillon(void) { unsigned a = 0, b, d = 13, *c = &d, i; time_t before, after; before = time(NULL); for (i = 0; i < MAX; i++) { a = (a << 2) + *c; /* ++ is missing :-/ */ a = (a << 2) + *c; a = (a << 2) + *c; a = (a << 2) + *c; } after = time(NULL); return difftime(after, before); } double time_bernstein(void) { unsigned a = 0, b, d = 13, *c = &d, i; time_t before, after; before = time(NULL); for (i = 0; i < MAX; i++) { a = ((a << 5) + a) + *c; /* ++ is missing :-/ */ a = ((a << 5) + a) + *c; /* ++ is missing :-/ */ a = ((a << 5) + a) + *c; /* ++ is missing :-/ */ a = ((a << 5) + a) + *c; /* ++ is missing :-/ */ } after = time(NULL); return difftime(after, before); } int main(void) { printf("Takes %g seconds to do %u*4 modulos.\n", time_mod(), MAX); printf("Takes %g seconds to do %u*4 ands.\n", time_and(), MAX); printf("Takes %g seconds to do %u*4 ands and minuses.\n", time_and_minus(), MAX); printf("Takes %g seconds to do %u*4 dillons.\n", time_dillon(), MAX); printf("Takes %g seconds to do %u*4 bernsteins.\n", time_bernstein(), MAX); } dasm-2.20.14.1/research/fsize.c000066400000000000000000000017011375233463600160360ustar00rootroot00000000000000/* The issue here was to avoid fseek() and friends to get away from potential issue with how long "long" really is. So we "abuse" freopen() in append mode to get to the end of the file once we establish it exists at all with fopen() in read mode. Pretty convoluted, but probably the best way. Comments welcome! :-) */ #include #include int file_size(const char *name, fpos_t *size) { int status = -1; FILE *f = fopen(name, "r+"); if (f != NULL) { FILE *g = freopen(NULL, "a+", f); if (g != NULL) { if (fgetpos(g, size) == 0) { status = 0; } fclose(g); } } return status; } int main(int argc, char *argv[]) { printf("Filename %s\n", argv[1]); fpos_t size; if (file_size(argv[1], &size) == 0) { printf("Length of file %s is %ld!\n", argv[1], (long)size); return EXIT_SUCCESS; } else { printf("File %s not found!\n", argv[1]); return EXIT_FAILURE; } } dasm-2.20.14.1/research/get_set_progname.c000066400000000000000000000007311375233463600202420ustar00rootroot00000000000000/* Test potentially unportable get/setprogname(3) functions. WORKS: OS X BREAKS: Linux, Solaris TODO: Windows, NetBSD, ... */ #include #include int main(int argc, char *argv[]) { printf("argv[0] == %s\n", argv[0]); printf("before setprogname(): getprogname() == %s\n", getprogname()); setprogname(argv[0]); printf("after setprogname(): getprogname() == %s\n", getprogname()); return EXIT_SUCCESS; } dasm-2.20.14.1/research/hash_compare.c000066400000000000000000000166351375233463600173630ustar00rootroot00000000000000 #include #include #include #include #include #include #define HASH_BITS 12 #define HASH_SIZE (1 << HASH_BITS) #define MHASHAND (HASH_SIZE -1) long get_time(void) { struct timeval tv; gettimeofday(&tv, (struct timezone *)NULL); return ((tv.tv_sec*1000) + (tv.tv_usec / 1000)); } /* * hash function used in original implementation * - is not much strong * - lenght of symbol is only implicitly reflected by shifting, but if you shift bits out and keep zeros hashes will likely match for different symbols * - if lenghts is above threshold hashes will be the same i.e. every symbol with the same postfix longer than 5 chars get the same hash */ unsigned int hash1(const char *str) { unsigned int result = 0; while (*str) { result = (result << 2) ^ *str++; } return result & MHASHAND; } /* * proposal #1, shift only 1 instead of two, length of common postfix increased to 10, i.e. chance that two symbols have the same postfix is less, but collisions are much more */ unsigned int hash1_mod1(const char *str) { unsigned int result = 0; while (*str) { result = (result << 1) ^ *str++; } return result & MHASHAND; } static const uint8_t bitrev_array[256] = { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff }; uint16_t bitreversed(uint16_t v) { uint16_t m = 1; uint16_t r = 0; while (m < 0x8000) { r <<= 1; if ((m & v) > 0) { r |= 1; } m <<= 1; } return r; } unsigned int fletcher_mod1(const char *str) { uint16_t a = 0; uint16_t b = 0; while (*str) { a += *str++; b += a; } // return (a+b) & MHASHAND; // uint16_t c = bitreversed((a & 0xFF00) ^ (b & 0xFF00)) ; return ((((a << 8) & 0xFF00) | (b & 0xFF)) ) & MHASHAND; // return ((a + b) ^ bitreversed(b)) & MHASHAND; // return ((bitreversed(b) >> (16 - HASH_BITS)) ^ a) & MHASHAND; } /* * proposal #2, add current step, this results in adding Gauss sum of string length () Carl Friedrich */ unsigned int hash1_mod2(const char *str) { unsigned int result = 0; int n = 0; while (*str) { result = (result << 2) ^ *str++; result += n; n++; } return result & MHASHAND; } /* * proposal #3, same as above but more shift, seems to has the least # of collisions but 27% slower */ unsigned int hash1_mod3(const char *str) { unsigned int result = 0; int n = 0; while (*str) { result = (result << 3) ^ *str++; result += n; n++; } return result & MHASHAND; } /* * proposal #4, use fletcher checksum, fewer collisions, fastest (8% faster than original) */ unsigned int fletcher(const char *str) { uint16_t a = 0; uint16_t b = 0; while (*str) { a += *str++; b += a; } return (((b << 8) & 0xFF00) | (a & 0xFF)) & MHASHAND; } typedef unsigned int (*t_hash_handler)(const char *str); typedef struct { t_hash_handler handler; char name[32]; long time; int8_t postfix; } t_hash_function; #define nHashTests 6 t_hash_function hash_function[nHashTests] = { {hash1 , "hash1_orig", 0,-1} ,{hash1_mod1, "hash1_mod1",0,-1} ,{hash1_mod2, "hash1_mod2",0,-1} ,{hash1_mod3, "hash1_mod3",0,-1} ,{fletcher, "fletcher",0,-1} ,{fletcher_mod1, "fletcher_m1",0,-1} }; int main(int argc, char *argv[]) { /* for (int i=0; i<32; i++) { printf("0x%04x 0x%04x\n", i, bitreversed(i) ); } exit(0); */ printf("HASH_SIZE: %d, MHASHAND: 0x%04x\n", HASH_SIZE, MHASHAND); for (int k=0; k 0) { fprintf(stderr,"\thash collision @ 0x%04x [%s][%s]\n", h, symbols[h], mnem); } strcpy(symbols[h], mnem); hashtable[h]++; mnem = lf +1; } else { mnem = NULL; } } int unused = 0; int singles = 0; int collisions = 0; int maxcol = 0; for (int n=0; n #include int main(void) { for (int i = 0; i < 256; i++) { int raw = i; int low = i | 0x20; printf(" %c \t %c \n", isprint(raw) ? raw : 'X', isprint(low) ? low : 'Y'); } } dasm-2.20.14.1/research/minunit.h000066400000000000000000000005351375233463600164120ustar00rootroot00000000000000/* see http://www.jera.com/techinfo/jtns/jtn002.html */ /* code modified to compile without warnings [phf] */ #define mu_assert(message, test) \ do { if (!(test)) return message; } while (0) #define mu_run_test(test) \ do { const char *message = test(); tests_run++; \ if (message) return message; } while (0) extern int tests_run; dasm-2.20.14.1/research/minunit_example.c000066400000000000000000000013761375233463600201240ustar00rootroot00000000000000/* see http://www.jera.com/techinfo/jtns/jtn002.html */ /* code modified to compile without warnings [phf] */ #include #include "minunit.h" int tests_run = 0; int foo = 7; int bar = 4; static const char * test_foo(void) { mu_assert("error, foo != 7", foo == 7); return 0; } static const char * test_bar(void) { mu_assert("error, bar != 5", bar == 5); return 0; } static const char * all_tests(void) { mu_run_test(test_foo); mu_run_test(test_bar); return 0; } int main(int argc, char **argv) { const char *result = all_tests(); if (result != 0) { printf("%s\n", result); } else { printf("ALL TESTS PASSED\n"); } printf("Tests run: %d\n", tests_run); return result != 0; } dasm-2.20.14.1/research/sizeof.c000066400000000000000000000033561375233463600162250ustar00rootroot00000000000000/* Simple sizeof experiment to judge appropriate types to replace the DASM chaos with. Looks like we can easily go for "int" all over the place these days. If we want to be compatible with 16 bit machines like the Amiga, we may want to go for "long". The best choice might be to typedef "int32_t" to a usable name and stick with that, then we'd only rule out some 8 bit machines. */ #include #include #include #include #define S(type) printf("sizeof(" #type ") == %d\n", sizeof(type)) int main(void) { S(char); S(int8_t); S(short); S(int16_t); S(int); S(bool); S(long); S(int32_t); S(long long); S(int64_t); S(float); S(double); return EXIT_SUCCESS; } /* Darwin Agnes.local 8.11.0 Darwin Kernel Version 8.11.0: Wed Oct 10 18:26:00 PDT 2007; root:xnu-792.24.17~1/RELEASE_PPC Power Macintosh powerpc PowerBook6,8 Darwin sizeof(char) == 1 sizeof(int8_t) == 1 sizeof(short) == 2 sizeof(int16_t) == 2 sizeof(int) == 4 sizeof(bool) == 4 sizeof(long) == 4 sizeof(int32_t) == 4 sizeof(long long) == 8 sizeof(int64_t) == 8 sizeof(float) == 4 sizeof(double) == 8 Linux ugradx.cs.jhu.edu 2.6.26.5-45.fc9.i686 #1 SMP Sat Sep 20 03:45:00 EDT 2008 i686 i686 i386 GNU/Linux sizeof(char) == 1 sizeof(int8_t) == 1 sizeof(short) == 2 sizeof(int16_t) == 2 sizeof(int) == 4 sizeof(bool) == 1 sizeof(long) == 4 sizeof(int32_t) == 4 sizeof(long long) == 8 sizeof(int64_t) == 8 sizeof(float) == 4 sizeof(double) == 8 SunOS peregrine 5.10 Generic_118822-11 sun4u sparc sizeof(char) == 1 sizeof(int8_t) == 1 sizeof(short) == 2 sizeof(int16_t) == 2 sizeof(int) == 4 sizeof(bool) == 1 sizeof(long) == 4 sizeof(int32_t) == 4 sizeof(long long) == 8 sizeof(int64_t) == 8 sizeof(float) == 4 sizeof(double) == 8 */ dasm-2.20.14.1/src/000077500000000000000000000000001375233463600135465ustar00rootroot00000000000000dasm-2.20.14.1/src/BUGS000066400000000000000000000022741375233463600142360ustar00rootroot00000000000000==== BUGS ==== A collection of bugs that would require major DASM surgery and are unlikely to get a fix soon. If possible we offer workarounds. --------------------- Broken HD6303 Opcodes --------------------- It has been reported several times (by Alan Nash in 2008, by Rob Hookham in 2014) that the AIM, OIM, EIM, and TIM opcodes are broken. These instructions are *three* bytes long according to the data sheets, yet in DASM they are treated as *two* byte instructions. It's my understanding that the instructions are supposed to work as follows (from Rob's email): tim #$10,$C2 tim #$80,$00,x So there's an immediate value *and* a zero-page address for these instructions! DASM, however, only accepts these: tim $10 tim $10,x I don't know what Matthew Dillon was thinking back in the day, but in retrospect it seems obvious that these opcodes simply don't fit into the "regular pattern" of 8-bit CPUs we deal with in DASM. Fixing this will require changes to DASM beyond just fixing the instruction table, I don't think the parser code is even remotely ready for this. :-/ The "workaround" for now is to use macros instead of the actual instructions, see ../test/broken6303hack.asm for details. dasm-2.20.14.1/src/HEADER000066400000000000000000000033251375233463600144240ustar00rootroot00000000000000==================== Standard file header ==================== /* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008-2015 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ We're sticking with Matt's 1988 claim, even though ftohex.c had a 1987 copyright originally, and Matt released version 2.0 in 1988, making a 1987 version 1.x likely. It's just not available anywhere, not even from Matt... :-/ We're also extending his copyright to 2002 compared to Andrew's release since we plan on integrating more of Matt's 2.16 stuff. Note that this header only lists the "main" maintainers and not all contributors. Those are listed in the AUTHORS file, and sometimes their contributions are in the NEWS file or other documentation. Note entirely sure that this is right, but the alternative is to have a *really* long list of copyright lines in every single file... :-/ dasm-2.20.14.1/src/Makefile000066400000000000000000000065731375233463600152210ustar00rootroot00000000000000# # the DASM macro assembler (aka small systems cross assembler) # # Copyright (c) 1988-2002 by Matthew Dillon. # Copyright (c) 1995 by Olaf "Rhialto" Seibert. # Copyright (c) 2003-2008 by Andrew Davie. # Copyright (c) 2008 by Peter H. Froehlich. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # Executables will be generated in the trunk/src/ directory (the # "current directory" as far as this Makefile is concerned). If # you want to move them somewhere, trunk/bin/ say, do so in the # trunk/ Makefile! #GOPTI= -O -m32 # -O for more warnings; use -O0 for debugging, use -O3 for speed GWARN= -ansi -std=c99 -pedantic -Wall \ -Wstrict-prototypes -Wdeclaration-after-statement \ -Wold-style-definition -Wmissing-declarations -Wmissing-prototypes \ -Wshadow -Wwrite-strings -Wcast-qual -Wnested-externs \ -Wcast-align -Wpointer-arith -Wbad-function-cast \ -Wformat-y2k -Wformat-nonliteral -Wformat-security \ -Wfloat-equal -Wundef -Winline \ # -Wfour-char-constants # Apple OS X only option, not needed anyway? # -Wunused # definition is weird in man gcc, effect is weird too # -Wextra -Wno-unused-parameter # no-unused tames extra a little # -Wunreachable-code # seems to create 4 spurious warnings? # -Wconversion # too many right now # -Wtraditional # too many, not sure if it's worth it anyway #GDEBG= -g # -fprofile-arcs -ftest-coverage -pg # -D_FORTIFY_SOURCE=2 #CFLAGS= $(GOPTI) $(GWARN) $(GDEBG) #LDFLAGS= -m32 -L/usr/lib32 ifeq ($(OS),Windows_NT) detected_OS := Windows else detected_OS := $(shell uname -s) ifeq ($(detected_OS),Darwin) CFLAGS = -mmacosx-version-min=10.5 endif endif #CC= gcc OBJS= main.o ops.o globals.o exp.o symbols.o \ mne6303.o mne6502.o mne68705.o mne6811.o mnef8.o mne68908.o SRCS= main.c ops.c globals.c exp.c symbols.c \ mne6303.c mne6502.c mne68705.c mne6811.c mnef8.c mne68908.c ALL= dasm ftohex all: $(info detected_OS is $(detected_OS)) \ $(ALL) dasm: $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o dasm $(LDFLAGS) ftohex: ftohex.o obj: $(OBJS) $(OBJS): asm.h clean: rm -rf *.o $(ALL) \ dasm-alpha-*.tar.gz \ *.gcda *.gcno *.gcov gmon.out # prepare an alpha release containing just the source code, # nothing else is in the archive since it is not intended # for the public, just designated volunteers alpha: echo "This is an incomplete alpha release of DASM source code." >README.ALPHA echo "The purpose is to identify build problems, nothing more." >>README.ALPHA echo "Please do *not* re-distribute this release in any form!" >>README.ALPHA echo "Please do *not* distribute binaries derived from it either!" >>README.ALPHA tar zcvf dasm-alpha-`date +%F`.tar.gz README.ALPHA Makefile *.h *.c rm -rf README.ALPHA dasm-2.20.14.1/src/PATCHES000066400000000000000000000134131375233463600145620ustar00rootroot00000000000000 ================================================ Collection of random patches from around the net ================================================ This is a random collection of patches for DASM I ran across over time; some of these may be included in future releases, others will probably never make it in. But it's good to have them in one place. I use a *very* long line one "-" between each one, hopefully that'll work out okay. :-) ------------------------------------------------------------------------------- FROM: http://biglist.com/lists/stella/archives/200205/msg00008.html ------------------------------------------------------------------------------- Subject: Re: [stella] help! distella -> dasm case sensitivity (fwd) From: Adam Wozniak Date: Wed, 1 May 2002 09:53:05 -0700 (PDT) On Wed, 1 May 2002, Chris Wilkson wrote: > Though I really would like to turn off case sensitivity in DASM. Any way to > do that? It would really help speed up testing for the new TIA.... It is fairly simple to hack the DASM source to behave the way you want it to. The patch below modifies two functions; the symbol table is now hashed in a case insensitive manner, and the symbol table lookup tries an caseless compare when an exact match fails. The patch below is against DASM 2.15 --Adam Wozniak ===BEGIN SCRIPT =============================== Script started on Wed May 1 08:52:28 2002 [adam dasm]$ cat test.asm processor 6502 seg.u code org 0 nop bne skip nop Skip nop nop seg.u data org 100 seg.u bss org 200 [adam dasm]$ dasm/bin/dasm test.asm DASM V2.15, (c)Copyright 1988-2002 Matthew Dillon, All Rights Reserved Error: source is not resolvable. re-run with verbose option 2 or higher to determine problem [adam dasm]$ dasm-caseless/bin/dasm test.asm DASM V2.15, (c)Copyright 1988-2002 Matthew Dillon, All Rights Reserved [adam dasm]$ exit Script done on Wed May 1 08:52:57 2002 ===END SCRIPT================================== ===BEGIN PATCH ================================ diff -urbBN dasm/src/asm.h dasm-caseless/src/asm.h --- dasm/src/asm.h Sat Jan 2 22:59:46 1999 +++ dasm-caseless/src/asm.h Wed May 1 08:38:36 2002 @@ -10,6 +10,7 @@ #include #include #include +#include #define Prototype extern diff -urbBN dasm/src/symbols.c dasm-caseless/src/symbols.c --- dasm/src/symbols.c Sat Jan 2 22:59:46 1999 +++ dasm-caseless/src/symbols.c Wed May 1 08:38:20 2002 @@ -74,6 +74,13 @@ if (sym->namelen == len && bcmp(sym->name, str, len) == 0) break; } + if (!sym) + { + for (sym = SHash[h1]; sym; sym = sym->next) { + if (sym->namelen == len && strncasecmp(sym->name, str, len) == 0) + break; + } + } return(sym); } @@ -118,7 +125,7 @@ register uword result = 0; while (len--) - result = (result << 2) ^ *str++; + result = (result << 2) ^ tolower(*str++); return(result & SHASHAND); } ===END PATCH ================================== -- This is n ?nrcu?cemert for thc transcendental r?n? The train now standirg leavc? for higher ?l?nes. Due tc a derai|rent, thcre vill be no other train. Sc wry rot h?? cn this cre? adam@xxxxxxxxxxxxxxxx http://cuddlepuddle.org/~adam/pgp.txt ------------------------------------------------------------------------------- FROM: forwarded by Andrew Davie ------------------------------------------------------------------------------- -----Original Message----- From: Ben Combee [mailto:ben.combee@gmail.com] On Behalf Of Ben Combee Sent: Thursday, February 28, 2008 8:56 AM To: atari2600@taswegian.com Subject: Bitmap format patch for DASM Hi, Andrew... I just started up a 2600 project of my own, and I've done a few local modifications to the DASM source -- most are to make it compile without warnings in CodeWarrior for Windows, but I also added a new integer representation inspired by some of the disassemblies I've seen. I call it bitmap format, and instead of a leading %, you use a leading | followed by dots and Xs. A trailing | is allowed, but not required. Here's an example. PfDataStart .byte |..XXX...| .byte |....X...| .byte |X..XX..X| .byte |.XX..XXX| .byte |.XX..XXX| .byte |X..XX..X| .byte |....X...| .byte |..XXX...| PfDataEnd I find it easier to visualize the bitmaps in the code using this format, as 0's and 1's aren't that distinctive. Here's the code change made to exp.c. I added this new function just before pushbin(): char *pushbitmap(char *str) { long val = 0; while (*str == '.' || *str == 'X') { val = (val << 1) | (*str == 'X'); ++str; } if (*str == '|') { ++str; } stackarg(val, 0, NULL); return str; } Then I modified the case statement around line 314: case '|': /* 13: | 11: || */ if (str[1] == '.' || str[1] == 'X') { str = pushbitmap(str+1); } else if (str[1] == '|') { doop((opfunc_t)op_oror, 11); str += 2; } else { doop((opfunc_t)op_or, 13); ++str; } break; I'd be glad to send the other changes, but they're mostly just adding "static" in front of local functions and cleaning up some loops that used a ";" to do nothing into using "{ }" instead (it tells the compiler that you intended on the empty action rather than just using a semicolon accidentally by habit. I'm looking forward to Boulder Dash and I'm also enjoying your old tutorial series on Atari Age. Thanks! ------------------------------------------------------------------------------- TODO: Find more patches... :-) ------------------------------------------------------------------------------- dasm-2.20.14.1/src/TODO000066400000000000000000000103251375233463600142370ustar00rootroot00000000000000 =========================== Things to fix at some point =========================== Note: All of these are "nice to have" things, not essential for functionality and (hopefully) not the cause of bugs. We are hiding the file all the way down here for a reason... - find all external accesses to F_listfile to really centralize error handling in errors module! - be careful though, there *is* a purpose for a listing file after all, unrelated to error messages! - negative.asm test case still not quite right - need to make range checking for literals fool proof - this is painful for lots of reasons - there are checks in ops.c AND mnef8.c (since that replaces a lot more than just opcodes?) - the structure of opcodes and addressing modes is confusing - there's no centralized and clear range checking - probably hard since it can differ by opcode of course, given a certain machine... - use GNU indent to make code more consistent - current .indent.pro not right, need to adjust - when to do this? before 2.20.12? - maybe astyle is a better, more conservative choice? - work on refactoring hash?() has found some problems - first hash_symbols() has a length argument because DASM doesn't seem to do enough parsing to properly split off only symbols to look up, how weird - second the hash functions are sometimes called with empty strings, probably from findmne, which seems like a bug or at least is ugly - MNEMONIC tables could be simplified - currently they are written directly, could use a macro (or several) to fill in mostly identical information - a deeper issues is that the same struct is use statically as is dynamically later; so I think we could get rid of the whole NULL for the *next if we had a version for the static stuff and a version (close to the current one) for the dynamic stuff; do we even need the static stuff in the first place? a function to add an opcode and the relevant information might work just as well... - both memusage and valgrind say that we are leaking - however, this probably only matters for Amiga OS 3 users - even there the C library hopefully takes care of it? - any OS out there where memory is not freed on exit? - I think the reason is permalloc() which doesn't have a corresponding free(), I already had some replacement code that can free() but it ended up to complicated to be a good replacement for now :-/ - Matt Dillon's fixes and extensions - dasm-2.15 permalloc patch for SPARC? seems simple - actually, the union hack in our DASM seems to make it superflous after all; did Olaf come up with that or Andrew? nice either way... :-) - new version of ftohex? should import easily... - actually, there's more to this as we should add options - to select CTRL-Z at the end (old EEPROM programmers) - CR/LF separators (Intel's standard is flexible) - see Matt's email 2008/04/06 - harder: compare DASM code bases for other fixes! :-/ - new copyright/license header - should Thomas be in there because of F8 support? - who else holds a copyright on some piece of DASM? - remember the >> issue for signed left operands - details in ftohex.c - strlcpy/strlcat should be used throughout instead of strcpy/strcat - huge job to adjust everything, not even started... :-/ - need to address unit testing (and system testing) - minunit looks too simplistic to be useful - however, it would be better than what we have - CUnit looks decent - however it doesn't fork - Check looks perfect - however it wants autotools for almost everything - at least add coverage analysis darn it - gcov is not hard to add to current scripts - remember that NULL in printf() segfaults on Solaris, seems that only the Apple version has the nice "(null)" feature... :-/ - fseeko/ftello instead of fseek/ftell could be useful to some extent - integrating Michael Marvin Morrison's 65c02 stuff is hard since there are not just new/changed opcodes but also new addressing modes; those, however, are hardcoded into the rest of DASM; I guess that's why Thomas had to rewrite so much of DASM for F8, and why he said his Z80 work died off... dasm-2.20.14.1/src/asm.h000066400000000000000000000370541375233463600145100ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * ASM65.H * * Structures and definitions */ #include #include #include #include #include /* for -T option [phf] */ typedef enum { SORTMODE_DEFAULT, SORTMODE_ALPHA = SORTMODE_DEFAULT, SORTMODE_ADDRESS, SORTMODE_MAX } sortmode_t; /* for -E option [phf] */ typedef enum { ERRORFORMAT_DEFAULT, ERRORFORMAT_WOE = ERRORFORMAT_DEFAULT, ERRORFORMAT_DILLON, ERRORFORMAT_GNU, ERRORFORMAT_MAX } errorformat_t; #define DAD #ifdef DAD enum FORMAT { FORMAT_DEFAULT = 1, FORMAT_RAS, FORMAT_RAW, FORMAT_MAX }; #define MAXLINE 1024 #define MAX_SYM_LEN 1024 enum ASM_ERROR_EQUATES { ERROR_NONE = 0, ERROR_COMMAND_LINE, /* Check format of command-line */ ERROR_FILE_ERROR, /* Unable to open file */ ERROR_NOT_RESOLVABLE, /* Source is not resolvable */ ERROR_TOO_MANY_PASSES, /* Too many passes - something wrong */ ERROR_NON_ABORT, /* one or more non-abort errors occured */ ERROR_SYNTAX_ERROR, /* 0 */ ERROR_EXPRESSION_TABLE_OVERFLOW, /* 1 */ ERROR_UNBALANCED_BRACES, /* 2 */ ERROR_DIVISION_BY_0, /* 3 */ ERROR_UNKNOWN_MNEMONIC, /* 4 */ ERROR_ILLEGAL_ADDRESSING_MODE, /* 5 */ ERROR_ILLEGAL_FORCED_ADDRESSING_MODE, /* 6 */ ERROR_NOT_ENOUGH_ARGUMENTS_PASSED_TO_MACRO, /* 7 */ ERROR_PREMATURE_EOF, /* 8 */ ERROR_ILLEGAL_CHARACTER, /* 9 */ ERROR_BRANCH_OUT_OF_RANGE, /* 10 */ ERROR_ERR_PSEUDO_OP_ENCOUNTERED, /* 11 */ ERROR_ORIGIN_REVERSE_INDEXED, /* 12 */ ERROR_EQU_VALUE_MISMATCH, /* 13 */ ERROR_ADDRESS_MUST_BE_LT_100, /* 14 */ ERROR_ADDRESS_MUST_BE_LT_10000, /* 15 */ ERROR_ILLEGAL_BIT_SPECIFICATION, /* 16 */ ERROR_NOT_ENOUGH_ARGS, /* 17 */ ERROR_LABEL_MISMATCH, /* 18 */ ERROR_MACRO_REPEATED, /* 19 */ ERROR_VALUE_UNDEFINED, /* 20 */ ERROR_PROCESSOR_NOT_SUPPORTED, /* 21 */ ERROR_REPEAT_NEGATIVE, /* 22 */ ERROR_BADERROR, /* 23 */ ERROR_ONLY_ONE_PROCESSOR_SUPPORTED, /* Only allow one type of processor */ ERROR_BAD_FORMAT, /* Bad format specifier */ /* F8 support... */ ERROR_VALUE_MUST_BE_1_OR_4, /* 26 */ ERROR_VALUE_MUST_BE_LT_10, /* 27 */ ERROR_VALUE_MUST_BE_LT_8, /* 28 */ ERROR_VALUE_MUST_BE_LT_F, /* 29 */ ERROR_VALUE_MUST_BE_LT_10000, /* 30 */ ERROR_ILLEGAL_OPERAND_COMBINATION, /* 31 */ ERROR_RECURSION_TOO_DEEP, /* 32 */ ERROR_AVOID_SEGFAULT, /* 33 */ ERROR_MISSING_ENDM, /* 34 */ ERROR_MISSING_COMMENT_END, /* 35 */ ERROR_SPURIOUS_COMMENT_CLOSE /* 36 */ }; typedef struct ERRORSTRUCT { int nErrorType; /* ASM_ERROR_EQUATES value */ bool bFatal; /* 0 = OK, non-zero = cannot continue compilation */ const char *sDescription; /* Error message */ } ERROR_DEFINITION; enum REASON_CODES { REASON_MNEMONIC_NOT_RESOLVED = 1 << 0, REASON_OBSCURE = 1 << 1, /* fix this! */ REASON_DC_NOT_RESOVED = 1 << 2, REASON_DV_NOT_RESOLVED_PROBABLY = 1 << 3, REASON_DV_NOT_RESOLVED_COULD = 1 << 4, REASON_DS_NOT_RESOLVED = 1 << 5, REASON_ALIGN_NOT_RESOLVED = 1 << 6, REASON_ALIGN_RELOCATABLE_ORIGIN_NOT_KNOWN = 1 << 7, REASON_ALIGN_NORMAL_ORIGIN_NOT_KNOWN = 1 << 8, REASON_EQU_NOT_RESOLVED = 1 << 9, REASON_EQU_VALUE_MISMATCH = 1 << 10, REASON_IF_NOT_RESOLVED = 1 << 11, REASON_REPEAT_NOT_RESOLVED = 1 << 12, REASON_FORWARD_REFERENCE = 1 << 13, REASON_PHASE_ERROR = 1 << 14, REASON_BRANCH_OUT_OF_RANGE = 1 << 15 }; #endif #define MNEMONIC struct _MNE #define MACRO struct _MACRO #define INCFILE struct _INCFILE #define REPLOOP struct _REPLOOP #define IFSTACK struct _IFSTACK #define SEGMENT struct _SEGMENT #define SYMBOL struct _SYMBOL #define STRLIST struct _STRLIST #define DEFORGFILL 255 #define N_HASH_BITS 12 // 10 was in original implementation #define SHASHSIZE (1 << N_HASH_BITS) #define MHASHSIZE (1 << N_HASH_BITS) #define SHASHAND (SHASHSIZE -1) #define MHASHAND (MHASHSIZE -1) #define ALLOCSIZE 16384 #define MAXMACLEVEL 32 #define TAB 9 enum ADDRESS_MODES { AM_IMP, /* implied */ AM_IMM8, /* immediate 8 bits */ AM_IMM16, /* immediate 16 bits */ AM_BYTEADR, /* address 8 bits */ AM_BYTEADRX, /* index x + 8 bit offset */ AM_BYTEADRY, /* index y + 8 bit offset */ AM_WORDADR, /* extended addr */ AM_WORDADRX, /* index x + 16 bit offset */ AM_WORDADRY, /* index y + 16 bit offset */ AM_REL, /* relative 8 bits */ AM_INDBYTEX, /* indirect x */ AM_INDBYTEY, /* indirect y */ AM_INDWORD, /* indirect immediate */ AM_0X, /* index x 0 bits */ AM_0Y, /* index y 0 bits */ AM_BITMOD, /* spec. bit modifcation */ AM_BITBRAMOD, /* spec. bit-test rel. branch */ AM_BYTEADR_SP, /* index SP +8 bits */ AM_WORDADR_SP, /* index SP +16 bits */ AM_SYMBOL, AM_EXPLIST, AM_LONG, AM_BSS, AM_OTHER_ENDIAN, /* force little endian to DC on big endian machines and the other way round */ NUMOC }; #define AF_IMP ( 1L << AM_IMP ) #define AF_IMM8 ( 1L << AM_IMM8 ) #define AF_IMM16 ( 1L << AM_IMM16 ) #define AF_BYTEADR ( 1L << AM_BYTEADR ) #define AF_BYTEADRX ( 1L << AM_BYTEADRX ) #define AF_BYTEADRY ( 1L << AM_BYTEADRY ) #define AF_WORDADR ( 1L << AM_WORDADR ) #define AF_WORDADRX ( 1L << AM_WORDADRX ) #define AF_WORDADRY ( 1L << AM_WORDADRY ) #define AF_REL ( 1L << AM_REL ) #define AF_INDBYTEX ( 1L << AM_INDBYTEX ) #define AF_INDBYTEY ( 1L << AM_INDBYTEY ) #define AF_INDWORD ( 1L << AM_INDWORD ) #define AF_0X ( 1L << AM_0X ) #define AF_0Y ( 1L << AM_0Y ) #define AF_BITMOD ( 1L << AM_BITMOD ) #define AF_BITBRAMOD ( 1L << AM_BITBRAMOD ) #define AF_BYTEADR_SP ( 1L << AM_BYTEADR_SP) #define AF_WORDADR_SP ( 1L << AM_WORDADR_SP) #define AM_BYTE AM_BYTEADR #define AM_WORD AM_WORDADR STRLIST { STRLIST *next; char buf[4]; }; #define STRLISTSIZE sizeof(STRLIST *) #define MF_BEGM 0x02 #define MF_IF 0x04 #define MF_MACRO 0x08 #define MF_MASK 0x10 /* has mask argument (byte) */ #define MF_REL 0x20 /* has rel. address (byte) */ #define MF_IMOD 0x40 /* instruction byte mod. */ #define MF_ENDM 0x80 /* is v_endm */ MNEMONIC { MNEMONIC *next; /* hash */ void (*vect)(char *, MNEMONIC *); /* dispatch */ const char *name; /* actual name */ unsigned char flags; /* special flags */ unsigned long okmask; unsigned int opcode[NUMOC]; /* hex codes, byte or word (>xFF) opcodes */ }; /* MNEMONIC with all fields 0, used as end-of-table marker. */ #define MNEMONIC_NULL {NULL, NULL, NULL, 0, 0, {0,}} MACRO { MACRO *next; void (*vect)(char *, MACRO *); char *name; unsigned char flags; STRLIST *strlist; int defpass; }; #define INF_MACRO 0x01 #define INF_NOLIST 0x02 INCFILE { INCFILE *next; /* previously pushed context */ char *name; /* file name */ FILE *fi; /* file handle */ unsigned long lineno; /* line number in file */ unsigned char flags; /* flags (macro) */ /* Only if Macro */ STRLIST *args; /* arguments to macro */ STRLIST *strlist; /* current string list */ unsigned long saveidx; /* save localindex */ unsigned long savedolidx; /* save localdollarindex */ }; #define RPF_UNKNOWN 0x01 /* value unknown */ REPLOOP { REPLOOP *next; /* previously pushed context */ unsigned long count; /* repeat count */ unsigned long seek; /* seek to top of repeat */ unsigned long lineno; /* line number of line before */ INCFILE *file; /* which include file are we in*/ unsigned char flags; }; #define IFF_UNKNOWN 0x01 /* value unknown */ #define IFF_BASE 0x04 IFSTACK { IFSTACK *next; /* previous IF */ INCFILE *file; /* which include file are we in*/ unsigned char flags; unsigned char xtrue; /* 1 if true, 0 if false */ unsigned char acctrue;/* accumulatively true (not incl this one) */ }; #define SF_UNKNOWN 0x01 /* ORG unknown */ #define SF_REF 0x04 /* ORG referenced */ #define SF_BSS 0x10 /* uninitialized area (U flag) */ #define SF_RORG 0x20 /* relocatable origin active */ SEGMENT { SEGMENT *next; /* next segment in segment list */ char *name; /* name of segment */ unsigned char flags; /* for ORG */ unsigned char rflags; /* for RORG */ unsigned long org; /* current org */ unsigned long rorg; /* current rorg */ unsigned long initorg; unsigned long initrorg; unsigned char initflags; unsigned char initrflags; }; #define SYM_UNKNOWN 0x01 /* value unknown */ #define SYM_REF 0x04 /* referenced */ #define SYM_STRING 0x08 /* result is a string */ #define SYM_SET 0x10 /* SET instruction used */ #define SYM_MACRO 0x20 /* symbol is a macro */ #define SYM_MASREF 0x40 /* master reference */ SYMBOL { SYMBOL *next; /* next symbol in hash list */ char *name; /* symbol name or string if expr. */ char *string; /* if symbol is actually a string */ unsigned char flags; /* flags */ unsigned char addrmode; /* addressing mode (expressions) */ long value; /* current value, never EVER change this to unsigned! */ unsigned int namelen; /* name length */ }; extern SYMBOL *SHash[]; extern MNEMONIC *MHash[]; extern INCFILE *pIncfile; extern REPLOOP *Reploop; extern SEGMENT *Seglist; extern IFSTACK *Ifstack; extern SEGMENT *Csegment; /* current segment */ extern char *Av[]; extern char Avbuf[]; /*extern unsigned int Adrbytes[];*/ extern unsigned int Cvt[]; extern MNEMONIC Ops[]; extern unsigned int Opsize[]; extern int Mnext; /* mnemonic extension */ extern unsigned int Mlevel; extern bool bTrace; extern bool Xdebug; extern bool bStrictMode; extern unsigned char MsbOrder; extern unsigned char Outputformat; extern unsigned long Redo_why; extern unsigned long maxFileSize; extern int Redo; extern int Redo_eval; extern unsigned long Redo_if; extern unsigned long Localindex, Lastlocalindex; extern unsigned long Localdollarindex, Lastlocaldollarindex; extern int F_format; extern sortmode_t F_sortmode; /* -T option [phf] */ extern errorformat_t F_errorformat; /* -E option [phf] */ extern unsigned char F_verbose; extern const char *F_outfile; extern char *F_listfile; extern char *F_symfile; extern FILE *FI_listfile; extern FILE *FI_temp; extern unsigned char Fisclear; extern unsigned long Plab, Pflags; extern char Inclevel; extern char ListMode; extern unsigned long Processor; /*extern unsigned int _fmode;*/ extern unsigned long CheckSum; extern int nMacroDeclarations; extern int nMacroClosings; /* main.c */ /*extern unsigned char Listing;*/ void findext(char *str); int asmerr(int err, bool bAbort, const char *sText); char *sftos(long val, int flags); void rmnode(void **base, int bytes); void addhashtable(MNEMONIC *mne); void pushinclude(char *str); char *permalloc(int bytes); char *zmalloc(int bytes); char *ckmalloc(int bytes); char *strlower(char *str); void addmsg(char *message); /* symbols.c */ void setspecial(int value, int flags); SYMBOL *allocsymbol(void); SYMBOL *findsymbol(const char *str, int len); SYMBOL *CreateSymbol( const char *str, int len ); void FreeSymbolList(SYMBOL *sym); void programlabel(void); /* ops.c */ extern unsigned char Gen[]; extern int Glen; void v_set(char *str, MNEMONIC *); void v_setstr(char *str, MNEMONIC *); void v_mexit(char *str, MNEMONIC *); void closegenerate(void); void generate(void); void v_list(char *, MNEMONIC *); void v_include(char *, MNEMONIC *); void v_seg(char *, MNEMONIC *); void v_dc(char *, MNEMONIC *); void v_ds(char *, MNEMONIC *); void v_org(char *, MNEMONIC *); void v_rorg(char *, MNEMONIC *); void v_rend(char *, MNEMONIC *); void v_align(char *, MNEMONIC *); void v_subroutine(char *, MNEMONIC *); void v_equ(char *, MNEMONIC *); void v_eqm(char *, MNEMONIC *); void v_set(char *, MNEMONIC *); void v_macro(char *, MNEMONIC *); void v_endm(char *, MNEMONIC *); void v_mexit(char *, MNEMONIC *); void v_ifconst(char *, MNEMONIC *); void v_ifnconst(char *, MNEMONIC *); void v_if(char *, MNEMONIC *); void v_else(char *, MNEMONIC *); void v_endif(char *, MNEMONIC *); void v_repeat(char *, MNEMONIC *); void v_repend(char *, MNEMONIC *); void v_err(char *, MNEMONIC *); void v_hex(char *, MNEMONIC *); void v_trace(char *, MNEMONIC *); void v_end(char *, MNEMONIC *); void v_echo(char *, MNEMONIC *); void v_processor(char *, MNEMONIC *); void v_incbin(char *, MNEMONIC *); void v_incdir(char *, MNEMONIC *); void v_execmac(char *str, MACRO *mac); void v_mnemonic(char *str, MNEMONIC *mne); FILE *pfopen(const char *, const char *); /* exp.c */ SYMBOL *eval(const char *str, int wantmode); /* end of asm.h */ dasm-2.20.14.1/src/errors.c000066400000000000000000000254511375233463600152350ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /** * @file */ #include "errors.h" #include "asm.h" #include "util.h" #include "version.h" #include #include #include /* TODO: I simply replaced "error" with the current level in all messages, not sure that works on Windows? GNU is fine, it doesn't require "error" in the message... */ /* TODO: the original asmerr() would set bStopAtEnd (what is now nof_fatals>0) if the error had the "fatal" flag set in the struct that described it; if would *abort* on a true argument; in my previous reading of the code, I had assumed that a true argument meant simply "fatal" and not abort. To be verified again and addressed, maybe there are a few fatals that should really be panics... */ static error_format_t F_error_format = ERRORFORMAT_DEFAULT; static error_level_t F_error_level = ERRORLEVEL_DEFAULT; static size_t nof_fatals = 0; static size_t nof_errors = 0; static size_t nof_warnings = 0; char source_location_buffer[SOURCE_LOCATION_LENGTH]; static const char *level_names[] = { [ERRORLEVEL_DEBUG] = "debug", [ERRORLEVEL_INFO] = "info", [ERRORLEVEL_NOTICE] = "notice", [ERRORLEVEL_WARNING] = "warning", [ERRORLEVEL_ERROR] = "error", [ERRORLEVEL_FATAL] = "fatal", [ERRORLEVEL_PANIC] = "***panic***", }; bool valid_error_format(int format) { return (ERRORFORMAT_MIN <= format && format <= ERRORFORMAT_MAX); } void set_error_format(error_format_t format) { assert(valid_error_format(format)); F_error_format = format; } bool valid_error_level(int level) { return (ERRORLEVEL_MIN <= level && level <= ERRORLEVEL_MAX); } void set_error_level(error_level_t level) { assert(valid_error_level(level)); F_error_level = level; } /** * @brief Display this error level? */ static bool visible_error_level(error_level_t level) { return (level >= F_error_level); } size_t number_of_fatals(void) { return nof_fatals; } size_t number_of_errors(void) { return nof_errors; } size_t number_of_warnings(void) { return nof_warnings; } /* Super low-level panic for disasters *inside* the errors module! */ static void internal_panic(const char *message) { fprintf( stderr, "\n%s: FATAL INTERNAL PANIC (errors.c): %s\n\n", getprogname(), message ); exit(EXIT_FAILURE); } /** * @brief Print final error message to all relevant streams. * @note We always print to stderr; we print to the listing * file if we have one. Messages to the listing file get a * leading "*" just like Matt's version did years ago; at * one point I thought that the "*" starts a comment, but I * can't confirm that in the code (only ";" seems to be a * comment), so the motivation must have been different. * We only get here after all the other filters checked that * we should really print, so we don't check anything else * about the error message. */ static void print_error_message(const char *message) { assert(message != NULL); assert(strlen(message) > 0); fprintf(stderr, "%s\n", message); if (FI_listfile != NULL) { fprintf(FI_listfile, "*%s\n", message); } else { /* sanity check: if there was no FILE* there should be no name */ assert(F_listfile == NULL); } } /** * @brief Sane wrapper for vsnprintf(). * @note See sane_snprintf() for details. */ static size_t sane_vsnprintf(/*@out@*/ char *restrict str, size_t size, const char *restrict fmt, va_list ap) { int res; assert(str != NULL); assert(size > 0); assert(fmt != NULL); res = vsnprintf(str, size, fmt, ap); if (res < 0) { internal_panic("sane_vsnprintf() failed!"); } /* res >= 0 here so cast to size_t is okay */ return (size_t) res; } static size_t sane_snprintf(/*@out@*/ char *restrict str, size_t size, const char *restrict fmt, ...) __attribute__((format(printf, 3, 4))); /** * @brief Sane wrapper for snprintf(). * @note The interface for snprintf() is a little retarded since * the return type is int instead of size_t. Due to it's stdio.h * heritage, returning something negative on error is expected. * But we're using it to format strings, so we don't care about * those errors in detail (if there ever are any, not even sure). * We handle potential errors here and return a size_t suitable * for overflow checking. */ static size_t sane_snprintf(/*@out@*/ char *restrict str, size_t size, const char *restrict fmt, ...) { size_t res; va_list ap; va_start(ap, fmt); res = sane_vsnprintf(str, size, fmt, ap); va_end(ap); return res; } /** * @brief Format the level part of the error message. * @note Follows strlcat() conventions. */ static size_t append_level(char *buffer, error_level_t level, size_t size) { char name[1024]; size_t res = 0; assert(valid_error_level(level)); res = sane_snprintf(name, sizeof(name), "%s: ", level_names[level]); if (res >= sizeof(name)) { internal_panic("Buffer overflow in append_level()!"); } return strlcat(buffer, name, size); } /** * @brief Format the location part of the error message. * @note Follows strlcat() conventions. */ static size_t append_location(char *buffer, /*@null@*/ const INCFILE *file, size_t size) { char location[1024]; size_t res = 0; /* clear buffer */ location[0] = '\0'; switch (F_error_format) { case ERRORFORMAT_WOE: /* Error format for MS VisualStudio and relatives: "file (line): error: string" */ if (file != NULL) { res = sane_snprintf( location, sizeof(location), "%s (%lu): ", file->name, file->lineno ); } break; case ERRORFORMAT_DILLON: /* Matthew Dillon's original format. Note that Matt's 2.16 uses this instead: "line %4ld %-10s %s\n" (terminal) */ if (file != NULL) { res = sane_snprintf( location, sizeof(location), "line %7lu %-10s ", file->lineno, file->name ); } break; case ERRORFORMAT_GNU: /* GNU format error messages, from their coding standards: "source-file-name:lineno: message" */ if (file != NULL) { res = sane_snprintf( location, sizeof(location), "%s:%lu: ", file->name, file->lineno ); } else { res = sane_snprintf( location, sizeof(location), "%s: ", getprogname() ); } break; default: internal_panic("Invalid error format in append_location()!"); break; } if (res >= sizeof(location)) { internal_panic("Buffer overflow in append_location()!"); } return strlcat(buffer, location, size); } /** * @brief Format the information part of the error message. * @note Follows strlcat() conventions. */ static size_t append_information(char *buffer, const char *fmt, va_list ap, size_t size) { char information[1024]; size_t res = 0; res = sane_vsnprintf(information, sizeof(information), fmt, ap); if (res >= sizeof(information)) { internal_panic("Buffer overflow in append_information()!"); } return strlcat(buffer, information, size); } static void vanotify(error_level_t level, const char *fmt, va_list ap) { /* buffer for formatting error message into */ char buffer[1024]; /* include file we're in right now (if any) */ INCFILE *file = pIncfile; /* holds the return value from strlcat */ size_t res; assert(valid_error_level(level)); if (!visible_error_level(level)) { /* condition not severe enough */ return; } /* find the file we're in (if any) */ /* TODO: how does this work exactly? */ while (file != NULL && (file->flags & INF_MACRO) != 0) { file = file->next; } /* clear buffer */ buffer[0] = '\0'; /* append the various pieces of the message */ res = append_location(buffer, file, sizeof(buffer)); if (res > sizeof(buffer)) { internal_panic("Buffer overflow in vanotify()!"); } res = append_level(buffer, level, sizeof(buffer)); if (res > sizeof(buffer)) { internal_panic("Buffer overflow in vanotify()!"); } res = append_information(buffer, fmt, ap, sizeof(buffer)); if (res > sizeof(buffer)) { internal_panic("Buffer overflow in vanotify()!"); } /* print the message */ print_error_message(buffer); /* maintain statistics about warnings and errors */ /* TODO: count everything < PANIC? */ if (level == ERRORLEVEL_WARNING) { nof_warnings += 1; } if (level == ERRORLEVEL_ERROR) { nof_errors += 1; } /* fatal and higher errors lead to (eventual) termination */ if (level >= ERRORLEVEL_FATAL) { nof_fatals += 1; /* stop after current pass */ } if (level == ERRORLEVEL_PANIC) { exit(EXIT_FAILURE); /* stop right now! */ } } /* avoid code replication through macros, sweet [phf] */ #define IMPLEMENT_FMT(level) \ va_list ap; \ va_start(ap, fmt); \ vanotify(level, fmt, ap); \ va_end(ap) #define DEFINE_FMT(name, level) \ void name(const char *fmt, ...) \ { \ IMPLEMENT_FMT(level); \ } void notify_fmt(error_level_t level, const char *fmt, ...) { IMPLEMENT_FMT(level); } DEFINE_FMT(debug_fmt, ERRORLEVEL_DEBUG) DEFINE_FMT(info_fmt, ERRORLEVEL_INFO) DEFINE_FMT(notice_fmt, ERRORLEVEL_NOTICE) DEFINE_FMT(warning_fmt, ERRORLEVEL_WARNING) DEFINE_FMT(error_fmt, ERRORLEVEL_ERROR) DEFINE_FMT(fatal_fmt, ERRORLEVEL_FATAL) DEFINE_FMT(panic_fmt, ERRORLEVEL_PANIC) /* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4 autoindent: */ dasm-2.20.14.1/src/errors.h000066400000000000000000000177101375233463600152410ustar00rootroot00000000000000#ifndef _DASM_ERRORS_H #define _DASM_ERRORS_H /* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /** * @file * * @brief Error handling for DASM. * * The idea for separate error levels came from syslog(3) * and vague memories of Ralf Michl's Java version of same. * The idea for printf-style interfaces came from Thomas Mathys * as well as from Brian W. Kernighan's and Rob Pike's great * little book The Practice of Programming. None of them are * to blame for this implementation of course... */ #include #include /* remove cool GNU stuff for other compilers */ /* TODO: find more permanent place for this, more .h might need it! */ #ifndef __GNUC__ #define __attribute__(x) /* GNU C __attribute__ removed */ #endif /** * @brief Format of error messages for -E option. */ typedef enum { /* actual error formats */ ERRORFORMAT_WOE, ERRORFORMAT_DILLON, ERRORFORMAT_GNU, /* meta data */ ERRORFORMAT_MIN = ERRORFORMAT_WOE, ERRORFORMAT_DEFAULT = ERRORFORMAT_WOE, ERRORFORMAT_MAX = ERRORFORMAT_GNU } error_format_t; /** * @brief Valid error format for -E option? */ bool valid_error_format(int format); /** * @brief Set error format, -E option. */ void set_error_format(error_format_t format); /** * @brief How many fatals so far, tells us whether to stop after the * current pass. */ size_t number_of_fatals(void); /** * @brief How many errors so far? */ size_t number_of_errors(void); /** * @brief How many warnings so far? */ size_t number_of_warnings(void); /** * @brief Severity of error messages. */ typedef enum { /* actual error levels */ /** displayed in debug mode, -d option */ ERRORLEVEL_DEBUG, /** displayed in high verbose mode, -v option */ ERRORLEVEL_INFO, /** displayed in low verbose mode, -v option */ ERRORLEVEL_NOTICE, /** displayed if warnings enabled, -w option */ ERRORLEVEL_WARNING, /** regular error, always displayed, assembly continues */ ERRORLEVEL_ERROR, /** fatal error, always displayed, assembly stops after current pass */ ERRORLEVEL_FATAL, /** panic insanity, always displayed, breaks out right away */ ERRORLEVEL_PANIC, /* meta data */ ERRORLEVEL_MIN = ERRORLEVEL_DEBUG, ERRORLEVEL_DEFAULT = ERRORLEVEL_WARNING, ERRORLEVEL_MAX = ERRORLEVEL_PANIC } error_level_t; /** * @brief Valid error level? */ bool valid_error_level(int level); /** * @brief Set error level, messages down to and including * this level are printed. * @todo Currently command line options don't affect this * thing yet. */ void set_error_level(error_level_t level); /** * @brief Length of buffer for source locations. */ #define SOURCE_LOCATION_LENGTH 256 /** * @brief Global buffer for source locations. */ extern char source_location_buffer[SOURCE_LOCATION_LENGTH]; /** * @brief Macro to capture current location in the C source * into a string buffer, sometimes useful for certain errors. * @example SOURCE_LOCATION printf("You're at %s\n", SOURCE_LOCATION); * @warning Since there is only one global buffer, our * SOURCE_LOCATION macro is not "reentrant"; never use * SOURCE_LOCATION more than once in a single evaluation * context! * @note We have to use snprintf() and a global buffer * because __func__ is not expanded into a string literal * by the preprocessor! :-/ * @todo the example tag above doesn't work as I thought it would... * also, should this use sane_snprintf()? */ #define SOURCE_LOCATION \ (snprintf(source_location_buffer, SOURCE_LOCATION_LENGTH, \ "%s/%s()/%d", __FILE__, __func__, __LINE__), \ source_location_buffer) /** * @brief Generic interface for printf(3)-style error handling * framework. * @see http://www.unixwiz.net/techtips/gnu-c-attributes.html */ void notify_fmt(error_level_t level, const char *fmt, ...) __attribute__((format(printf, 2, 3))); /** * @brief Helpers to make common levels easier to read. */ void debug_fmt(const char *fmt, ...) __attribute__((format(printf, 1, 2))); void info_fmt(const char *fmt, ...) __attribute__((format(printf, 1, 2))); void notice_fmt(const char *fmt, ...) __attribute__((format(printf, 1, 2))); void warning_fmt(const char *fmt, ...) __attribute__((format(printf, 1, 2))); void error_fmt(const char *fmt, ...) __attribute__((format(printf, 1, 2))); void fatal_fmt(const char *fmt, ...) __attribute__((format(printf, 1, 2))); /** * @brief An insane problem occurred, print message and terminate * DASM with EXIT_FAILURE immediately. * * @todo the old panic, need to refactor to new use where an error * code is required * * @warning You really don't want to call this. Not ever. We should * have REAL error handling instead. */ void panic_fmt(const char *fmt, ...) __attribute__((format(printf, 1, 2))) /* TODO: __attribute__((noreturn)) leads to bus error? :-/ */; /** * @brief Standard messages DASM spits out under certain conditions. * * Note that there's nothing special about these, you can add * messages here or write your own literal messages. However, * it is highly recommended that you use standard messages if * at all possible. * * The messages are named according to the severity they are * most often associated with, however there's nothing wrong * with passing PANIC_MEMORY to warning_fmt() when you want * to make the user aware of the condition but have a backup * plan of how to handle it. (The symbol table sorting done * in main.c provides an example of this.) * * @todo As of right now, the above is not entirely true. It * will be when I am done integrating the new log system with * the rest of DASM. :-) [phf] */ /* unclassified messages (so far) */ #define LOG_NOTHING "Nothing to tell you, which is a bug you should report!" #define LOG_GENERIC "%s (generic)." /* messages that support debugging, *very* low-level stuff. */ #define DEBUG_ENTER "<<< Entered function %s." #define DEBUG_LEAVE ">>> Left function %s." #define DEBUG_HASH_COLLISIONS "%d mnemonic collisions, %d symbol collisions." /* warnings related to assembly source code */ #define WARNING_RANGE "The %s value in '%s' should be between %d and %d!" /* errors related to assembly source code */ #define ERROR_SYNTAX_NONE "Syntax error!" #define ERROR_SYNTAX_ONE "Syntax error in '%s'!" #define ERROR_SYNTAX_TWO "Syntax error in '%s %s'!" #define ERROR_VALUE_RANGE "The %s value in '%s' should be between %d and %d!" #define ERROR_VALUE_ONEOF "The %s value in '%s' should one of %s!" #define ERROR_BRANCH_RANGE "Branch out of range (%ld bytes)!" #define ERROR_ADDRESS_RANGE_DETAIL "The %s address in '%s' should be between %d and %d!" #define ERROR_ADDRESS_RANGE "Address should be between %d and %d!" #define ERROR_INVALID_BIT "Invalid bit specification in '%s' must be <8!" #define ERROR_INVALID_ARGS "Not enough arguments!" /* messages that usually indicate terminal conditions :-) */ #define PANIC_MEMORY "Failed to allocate %zu bytes of memory in %s!" #define PANIC_SMALL_MEMORY "Failed to allocate %zu bytes of small memory in %s!" #endif /* _DASM_ERRORS_H */ /* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4 autoindent: */ dasm-2.20.14.1/src/exp.c000066400000000000000000000610101375233463600145040ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * EXP.C * * Handle expression evaluation and addressing mode decode. * * NOTE! If you use the string field in an expression you must clear * the SYM_MACRO and SYM_STRING bits in the flags before calling * FreeSymbolList()! */ #include "asm.h" #define UNION 0 #if UNION /* warning: ANSI disallows cast to union type */ typedef void (unop)(long v1, int f1); typedef void (binop)(long v1, long v2, int f1, int f2); union unibin { unop *unary; binop *binary; }; typedef union unibin opfunc_t; #define _unary .unary #define _binary .binary #else /* warning: Calling functions without prototype */ typedef void (*opfunc_t)(); #define _unary #define _binary #endif static void stackarg(long val, int flags, const char *ptr1); void doop(opfunc_t, int pri); void evaltop(void); void op_mult(long v1, long v2, int f1, int f2), op_div(long v1, long v2, int f1, int f2), op_mod(long v1, long v2, int f1, int f2), op_add(long v1, long v2, int f1, int f2), op_sub(long v1, long v2, int f1, int f2), op_shiftleft(long v1, long v2, int f1, int f2), op_shiftright(long v1, long v2, int f1, int f2), op_greater(long v1, long v2, int f1, int f2), op_greatereq(long v1, long v2, int f1, int f2), op_smaller(long v1, long v2, int f1, int f2), op_smallereq(long v1, long v2, int f1, int f2), op_eqeq(long v1, long v2, int f1, int f2), op_noteq(long v1, long v2, int f1, int f2), op_andand(long v1, long v2, int f1, int f2), op_oror(long v1, long v2, int f1, int f2), op_xor(long v1, long v2, int f1, int f2), op_and(long v1, long v2, int f1, int f2), op_or(long v1, long v2, int f1, int f2), op_question(long v1, long v2, int f1, int f2); void op_takelsb(long v1, int f1), op_takemsb(long v1, int f1), op_negate(long v1, int f1), op_invert(long v1, int f1), op_not(long v1, int f1); const char *pushsymbol(const char *str); const char *pushstr(const char *str); const char *pushbin(const char *str); const char *pushoct(const char *str); const char *pushdec(const char *str); const char *pushhex(const char *str); const char *pushchar(const char *str); int IsAlphaNum( int c ); /* * evaluate an expression. Figure out the addressing mode: * * implied * #val immediate * val zero page or absolute * val,x zero,x or absolute,x * val,y zero,y or absolute,y * val,sp stack pointer indexed + offset * (val) indirect * (val,x) zero indirect x * (val),y zero indirect y * * exp, exp,.. LIST of expressions * * an absolute may be returned as zero page * a relative may be returned as zero page or absolute * * unary: - ~ ! < > * binary: (^)(* / %)(+ -)(>> <<)(& |)(`)(&& ||)(== != < > <= >=) * * values: symbol, octal, decimal, $hex, %binary, 'c "str" * */ #define MAXOPS 32 #define MAXARGS 64 unsigned char Argflags[MAXARGS]; long Argstack[MAXARGS]; char *Argstring[MAXARGS]; int Oppri[MAXOPS]; opfunc_t Opdis[MAXOPS]; int Argi, Opi, Lastwasop; int Argibase, Opibase; char ucasm_indexed_notation = false; SYMBOL *eval(const char *str, int wantmode) { SYMBOL *base, *cur; int oldargibase = Argibase; int oldopibase = Opibase; int scr; const char *pLine = str; Argibase = Argi; Opibase = Opi; Lastwasop = 1; base = cur = allocsymbol(); while (*str) { if (Xdebug) printf("char '%c'\n", *str); switch(*str) { case ' ': case '\n': ++str; break; case '~': if (Lastwasop) doop((opfunc_t)op_invert, 128); else asmerr( ERROR_SYNTAX_ERROR, false, pLine ); ++str; break; case '*': if (Lastwasop) { pushsymbol("."); } else doop((opfunc_t)op_mult, 20); ++str; break; case '/': doop((opfunc_t)op_div, 20); ++str; break; case '%': if (Lastwasop) { str = pushbin(str+1); } else { doop((opfunc_t)op_mod, 20); ++str; } break; case '?': /* 10 */ doop((opfunc_t)op_question, 10); ++str; break; case '+': /* 19 */ doop((opfunc_t)op_add, 19); ++str; break; case '-': /* 19: - (or - unary) */ if (Lastwasop) { doop((opfunc_t)op_negate, 128); } else { doop((opfunc_t)op_sub, 19); } ++str; break; case '>': /* 18: >> << 17: > >= <= < */ if (Lastwasop) { doop((opfunc_t)op_takemsb, 128); ++str; break; } if (str[1] == '>') { doop((opfunc_t)op_shiftright, 18); ++str; } else if (str[1] == '=') { doop((opfunc_t)op_greatereq, 17); ++str; } else { doop((opfunc_t)op_greater, 17); } ++str; break; case '<': if (Lastwasop) { doop((opfunc_t)op_takelsb, 128); ++str; break; } if (str[1] == '<') { doop((opfunc_t)op_shiftleft, 18); ++str; } else if (str[1] == '=') { doop((opfunc_t)op_smallereq, 17); ++str; } else { doop((opfunc_t)op_smaller, 17); } ++str; break; case '=': /* 16: == (= same as ==) */ if (str[1] == '=') ++str; doop((opfunc_t)op_eqeq, 16); ++str; break; case '!': /* 16: != */ if (Lastwasop) { doop((opfunc_t)op_not, 128); } else { doop((opfunc_t)op_noteq, 16); ++str; } ++str; break; case '&': /* 15: & 12: && */ if (str[1] == '&') { doop((opfunc_t)op_andand, 12); ++str; } else { doop((opfunc_t)op_and, 15); } ++str; break; case '^': /* 14: ^ */ doop((opfunc_t)op_xor, 14); ++str; break; case '|': /* 13: | 11: || */ if (str[1] == '|') { doop((opfunc_t)op_oror, 11); ++str; } else { doop((opfunc_t)op_or, 13); } ++str; break; case '(': if (wantmode) { cur->addrmode = AM_INDWORD; ++str; break; } /* fall thru OK */ case '[': /* eventually an argument */ ucasm_indexed_notation = false; if ((((((str[1]|0x20) == 'x') || ((str[1]|0x20) == 'y')) && (str[2] == '+')) || // X- or Y-indexed address mode (((str[1]|0x20) == 's') && ((str[2]|0x20) == 'p') && (str[3] == '+'))) && // SP-indexed address mode ((Processor == 68705) || (Processor == 6811) || (Processor == 68908))) { ucasm_indexed_notation = true; // UCASM compatibility, allow notations [X+255], [Y+3], [SP+5] switch(str[1]|0x20) { case 'x': cur->addrmode = AM_BYTEADRX; //FIX: OPCODE.FORCE / Mnext adaption moved to ops.c break; case 'y': cur->addrmode = AM_BYTEADRY; break; case 's': cur->addrmode = AM_BYTEADR_SP; //FIX: OPCODE.FORCE / Mnext adaption moved to ops.c break; } str += 3; /* skip '[',{x,y,s},'+' */ if ((cur->addrmode == AM_BYTEADR_SP) || (cur->addrmode == AM_WORDADR_SP)) { ++str; /* skip also 'p' */ } } else { ucasm_indexed_notation = false; if (Opi == MAXOPS) puts("too many ops"); else Oppri[Opi++] = 0; ++str; } break; case ')': if (wantmode) { if (cur->addrmode == AM_INDWORD && str[1] == ',' && (str[2]|0x20) == 'y') { cur->addrmode = AM_INDBYTEY; str += 2; } //FIX: detect illegal opc (zp),x syntax... if (cur->addrmode == AM_INDWORD && str[1] == ',' && (str[2]|0x20) == 'x') { char sBuffer[128]; sprintf( sBuffer, "%s", str ); asmerr( ERROR_ILLEGAL_ADDRESSING_MODE,false, pLine ); ++Redo; Redo_why |= REASON_MNEMONIC_NOT_RESOLVED; //we treat the opcode as valid to allow passes to continue, which should //allow other errors (like phase errros) to resolve before our "++Redo" //ultimately forces a failure. } ++str; break; } /* fall thru OK */ case ']': while(Opi != Opibase && Oppri[Opi-1]) evaltop(); if (Opi != Opibase) --Opi; ++str; if (ucasm_indexed_notation) { ucasm_indexed_notation = false; } else { if (Argi == Argibase) { puts("']' error, no arg on stack"); break; } } if (*str == 'd') { /* STRING CONVERSION */ char buf[32]; ++str; if (Argflags[Argi-1] == 0) { sprintf(buf,"%ld",Argstack[Argi-1]); Argstring[Argi-1] = strcpy(ckmalloc(strlen(buf)+1),buf); } } Lastwasop = 0; break; case '#': cur->addrmode = AM_IMM8; ++str; /* * No other addressing mode is possible from now on * so we might as well allow () instead of []. */ wantmode = 0; break; case ',': while(Opi != Opibase) evaltop(); Lastwasop = 1; scr = str[1]|0x20; /* to lower case */ if (cur->addrmode == AM_INDWORD && scr == 'x' && !IsAlphaNum( str[2] )) { cur->addrmode = AM_INDBYTEX; ++str; } //FIX: detect illegal opc (zp,y) syntax... else if ((cur->addrmode == AM_INDWORD && scr == 'y' && str[2]==')')&&(wantmode)) { char sBuffer[128]; sprintf( sBuffer, "%s", str ); asmerr( ERROR_ILLEGAL_ADDRESSING_MODE,false, pLine ); ++Redo; Redo_why |= REASON_MNEMONIC_NOT_RESOLVED; //we treat the opcode as valid to allow passes to continue, which should //allow other errors (like phase errros) to resolve before our "++Redo" //ultimately forces a failure. cur->addrmode = AM_0Y; ++str; } else if (scr == 'x' && !IsAlphaNum(str[2])) { cur->addrmode = AM_0X; ++str; //FIX: OPCODE.FORCE / Mnext adaption moved to ops.c } else if (scr == 'y' && !IsAlphaNum(str[2])) { cur->addrmode = AM_0Y; ++str; //FIX: OPCODE.FORCE / Mnext adaption moved to ops.c } else if ((scr == 's') && ((str[2]|0x20) == 'p') && !IsAlphaNum(str[3])) // stack pointer indexed address mode { cur->addrmode = AM_BYTEADR_SP; ++str; ++str; //FIX: OPCODE.FORCE / Mnext adaption moved to ops.c } else { SYMBOL *pNewSymbol = allocsymbol(); cur->next = pNewSymbol; --Argi; if (Argi < Argibase) asmerr( ERROR_SYNTAX_ERROR, false, pLine ); if (Argi > Argibase) asmerr( ERROR_SYNTAX_ERROR, false, pLine ); cur->value = Argstack[Argi]; cur->flags = Argflags[Argi]; if ((cur->string = (void *)Argstring[Argi]) != NULL) { cur->flags |= SYM_STRING; if (Xdebug) printf("STRING: %s\n", cur->string); } cur = pNewSymbol; } ++str; break; case '$': str = pushhex(str+1); break; case '\'': str = pushchar(str+1); break; case '\"': str = pushstr(str+1); break; default: { const char *dol = str; while (*dol >= '0' && *dol <= '9') dol++; if (*dol == '$') { str = pushsymbol(str); break; } } if (*str == '0') { if (str[1] == 'x') { // allow also '0xAA' notation for '$AA' ++str; str = (char *)pushhex(str+1); } else { str = pushoct(str); } } else { if (*str > '0' && *str <= '9') str = pushdec(str); else str = pushsymbol(str); } break; } } while(Opi != Opibase) evaltop(); if (Argi != Argibase) { --Argi; cur->value = Argstack[Argi]; cur->flags = Argflags[Argi]; if ((cur->string = (void *)Argstring[Argi]) != NULL) { cur->flags |= SYM_STRING; if (Xdebug) printf("STRING: %s\n", cur->string); } if (base->addrmode == 0) base->addrmode = AM_BYTEADR; } if (Argi != Argibase || Opi != Opibase) asmerr( ERROR_SYNTAX_ERROR, false, pLine ); Argi = Argibase; Opi = Opibase; Argibase = oldargibase; Opibase = oldopibase; return base; } int IsAlphaNum( int c ) { return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')); } void evaltop(void) { if (Xdebug) printf("evaltop @(A,O) %d %d\n", Argi, Opi); if (Opi <= Opibase) { asmerr( ERROR_SYNTAX_ERROR, false, NULL ); Opi = Opibase; return; } --Opi; if (Opdis[Opi] == NULL) { asmerr( ERROR_AVOID_SEGFAULT, true, "operator function table" ); return; } if (Oppri[Opi] == 128) { if (Argi < Argibase + 1) { asmerr( ERROR_SYNTAX_ERROR, false, NULL ); Argi = Argibase; return; } --Argi; (*Opdis[Opi]_unary)(Argstack[Argi], Argflags[Argi]); } else { if (Argi < Argibase + 2) { asmerr( ERROR_SYNTAX_ERROR, false, NULL ); Argi = Argibase; return; } Argi -= 2; (*Opdis[Opi]_binary)(Argstack[Argi], Argstack[Argi+1], Argflags[Argi], Argflags[Argi+1]); } } static void stackarg(long val, int flags, const char *ptr1) { char *str = NULL; if (Xdebug) printf("stackarg %ld (@%d)\n", val, Argi); Lastwasop = 0; if (flags & SYM_STRING) { /* Why unsigned char? Looks like we're converting to long in a very strange way... [phf] */ const unsigned char *ptr = (const unsigned char *)ptr1; char *new; int len; val = len = 0; while (*ptr && *ptr != '\"') { val = (val << 8) | *ptr; ++ptr; ++len; } new = ckmalloc(len + 1); memcpy(new, ptr1, len); new[len] = 0; flags &= ~SYM_STRING; str = new; } Argstack[Argi] = val; Argstring[Argi] = str; Argflags[Argi] = flags; if (++Argi == MAXARGS) { puts("stackarg: maxargs stacked"); Argi = Argibase; } while (Opi != Opibase && Oppri[Opi-1] == 128) evaltop(); } void doop(opfunc_t func, int pri) { if (Xdebug) puts("doop"); Lastwasop = 1; if (Opi == Opibase || pri == 128) { if (Xdebug) printf("doop @ %d unary\n", Opi); if (Opi >= MAXOPS) { fprintf(stderr,"doop: error: operator index(%d) > MAXOPS(%d), probably too deep recursion", Opi, MAXOPS); asmerr(ERROR_RECURSION_TOO_DEEP, true, "doop()"); return; } Opdis[Opi] = func; Oppri[Opi] = pri; ++Opi; return; } while (Opi != Opibase && Oppri[Opi-1] && pri <= Oppri[Opi-1]) evaltop(); if (Xdebug) printf("doop @ %d\n", Opi); Opdis[Opi] = func; Oppri[Opi] = pri; ++Opi; if (Opi == MAXOPS) { puts("doop: too many operators"); Opi = Opibase; } return; } void op_takelsb(long v1, int f1) { stackarg(v1 & 0xFFL, f1, NULL); } void op_takemsb(long v1, int f1) { stackarg((v1 >> 8) & 0xFF, f1, NULL); } void op_negate(long v1, int f1) { stackarg(-v1, f1, NULL); } void op_invert(long v1, int f1) { stackarg(~v1, f1, NULL); } void op_not(long v1, int f1) { stackarg(!v1, f1, NULL); } void op_mult(long v1, long v2, int f1, int f2) { stackarg(v1 * v2, f1|f2, NULL); Lastwasop = 1; } void op_div(long v1, long v2, int f1, int f2) { Lastwasop = 1; if (f1|f2) { stackarg(0L, f1|f2, NULL); return; } if (v2 == 0) { asmerr( ERROR_DIVISION_BY_0, true, NULL ); stackarg(0L, 0, NULL); } else { stackarg(v1 / v2, 0, NULL); } } void op_mod(long v1, long v2, int f1, int f2) { if (f1|f2) { stackarg(0L, f1|f2, NULL); return; } if (v2 == 0) stackarg(v1, 0, NULL); else stackarg(v1 % v2, 0, NULL); Lastwasop = 1; } void op_question(long v1, long v2, int f1, int f2) { if (f1) stackarg(0L, f1, NULL); else stackarg((long)((v1) ? v2 : 0), ((v1) ? f2 : 0), NULL); } void op_add(long v1, long v2, int f1, int f2) { stackarg(v1 + v2, f1|f2, NULL); Lastwasop = 1; } void op_sub(long v1, long v2, int f1, int f2) { stackarg(v1 - v2, f1|f2, NULL); Lastwasop = 1; } void op_shiftright(long v1, long v2, int f1, int f2) { if (f1|f2) stackarg(0L, f1|f2, NULL); else stackarg((long)(v1 >> v2), 0, NULL); } void op_shiftleft(long v1, long v2, int f1, int f2) { if (f1|f2) stackarg(0L, f1|f2, NULL); else stackarg((long)(v1 << v2), 0, NULL); } void op_greater(long v1, long v2, int f1, int f2) { stackarg((long)(v1 > v2), f1|f2, NULL); } void op_greatereq(long v1, long v2, int f1, int f2) { stackarg((long)(v1 >= v2), f1|f2, NULL); } void op_smaller(long v1, long v2, int f1, int f2) { stackarg((long)(v1 < v2), f1|f2, NULL); } void op_smallereq(long v1, long v2, int f1, int f2) { stackarg((long)(v1 <= v2), f1|f2, NULL); } void op_eqeq(long v1, long v2, int f1, int f2) { stackarg((long)(v1 == v2), f1|f2, NULL); } void op_noteq(long v1, long v2, int f1, int f2) { stackarg((long)(v1 != v2), f1|f2, NULL); } void op_andand(long v1, long v2, int f1, int f2) { if ((!f1 && !v1) || (!f2 && !v2)) { stackarg(0L, 0, NULL); return; } stackarg(1L, f1|f2, NULL); } void op_oror(long v1, long v2, int f1, int f2) { if ((!f1 && v1) || (!f2 && v2)) { stackarg(1L, 0, NULL); return; } stackarg(0L, f1|f2, NULL); } void op_xor(long v1, long v2, int f1, int f2) { stackarg(v1^v2, f1|f2, NULL); } void op_and(long v1, long v2, int f1, int f2) { stackarg(v1&v2, f1|f2, NULL); } void op_or(long v1, long v2, int f1, int f2) { stackarg(v1|v2, f1|f2, NULL); } const char *pushchar(const char *str) { if (*str) { stackarg((long)*str, 0, NULL); ++str; } else { stackarg((long)' ', 0, NULL); } return str; } const char *pushhex(const char *str) { long val = 0; for (;; ++str) { if (*str >= '0' && *str <= '9') { val = (val << 4) + (*str - '0'); continue; } if ((*str >= 'a' && *str <= 'f') || (*str >= 'A' && *str <= 'F')) { val = (val << 4) + ((*str&0x1F) + 9); continue; } break; } stackarg(val, 0, NULL); return str; } const char *pushoct(const char *str) { long val = 0; while (*str >= '0' && *str <= '7') { val = (val << 3) + (*str - '0'); ++str; } stackarg(val, 0, NULL); return str; } const char *pushdec(const char *str) { long val = 0; while (*str >= '0' && *str <= '9') { val = (val * 10) + (*str - '0'); ++str; } stackarg(val, 0, NULL); return str; } const char *pushbin(const char *str) { long val = 0; while (*str == '0' || *str == '1') { val = (val << 1) | (*str - '0'); ++str; } stackarg(val, 0, NULL); return str; } const char *pushstr(const char *str) { stackarg(0, SYM_STRING, str); while (*str && *str != '\"') ++str; if (*str == '\"') ++str; return str; } static int symbolRecursionCount = 0; const char *pushsymbol(const char *str) { SYMBOL *sym; const char *ptr; unsigned char macro = 0; symbolRecursionCount++; if (symbolRecursionCount > 1000) { fprintf(stderr, "error: %s:%d: recursion > 1000, too deep, aborting\n",__FILE__,__LINE__); asmerr(ERROR_RECURSION_TOO_DEEP, true, "pushsymbol()"); } for (ptr = str; *ptr == '_' || *ptr == '.' || (*ptr >= 'a' && *ptr <= 'z') || (*ptr == '@') || // UCASM compatibility, allow at-sign to apear in label names (*ptr >= 'A' && *ptr <= 'Z') || (*ptr >= '0' && *ptr <= '9'); ++ptr ); if (ptr == str) { asmerr( ERROR_ILLEGAL_CHARACTER, false, str ); printf("char = '%c' %d (-1: %d)\n", *str, *str, *(str-1)); if (F_listfile) fprintf(FI_listfile, "char = '%c' code %d\n", *str, *str); return str+1; } if (*ptr == '$') ptr++; if ((sym = findsymbol(str, ptr - str)) != NULL) { if (sym->flags & SYM_UNKNOWN) ++Redo_eval; if (sym->flags & SYM_MACRO) { macro = 1; sym = eval(sym->string, 0); } if (sym->flags & SYM_STRING) stackarg(0, SYM_STRING, sym->string); else stackarg(sym->value, sym->flags & SYM_UNKNOWN, NULL); sym->flags |= SYM_REF|SYM_MASREF; if (macro) FreeSymbolList(sym); } else { stackarg(0L, SYM_UNKNOWN, NULL); sym = CreateSymbol( str, ptr - str ); sym->flags = SYM_REF|SYM_MASREF|SYM_UNKNOWN; ++Redo_eval; } symbolRecursionCount--; return ptr; } dasm-2.20.14.1/src/ftobin.c000066400000000000000000000110201375233463600151650ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /** * @file */ /* * FTOBIN.C * * FTOBIN format infile [outfile] * * format: format used when assembling (asm705/asm65) * 1,2,3 -generate sequenced (raw) binary file * * Used with formats 1 or 2 (format 3 is already raw binary). This * program converts formats 1 and 2 to format 3. This is required * because some assembly programs might want to reverse-index the * origin (go back), usually to lay down a checksum, and this can only be * done with format 2. * * Restrictions: Lowest address must be referenced first. */ #include #include #include #include typedef unsigned char ubyte; typedef unsigned short uword; #define PERLINE 16 static uword getwlh(FILE *in); static void exiterr(const char *str); static void convert(short format, FILE *in, FILE *out); int main(int ac, char **av) { short format; FILE *infile; FILE *outfile; if (ac < 3) { puts("FTOBIN format infile [outfile]"); puts("format 1,2, or 3. 3=raw"); puts("(C)Copyright 1988 by Matthew Dillon, All Rights Reserved"); exit(EXIT_FAILURE); } format = strtol(av[1], NULL, 0); if (format < 1 || format > 3) exiterr("specify infile format 1, 2, or 3"); if (format == 3) { puts("Note: Format 3 is already a raw binary file, output will"); puts("be equivalent to input"); } infile = fopen(av[2], "r"); if (infile == NULL) exiterr("unable to open input file"); outfile = (av[3]) ? fopen(av[3], "w") : stdout; if (outfile == NULL) exiterr("unable to open output file"); convert(format, infile, outfile); fclose(infile); fclose(outfile); return(0); } static void exiterr(const char *str) { fputs(str, stderr); fputs("\n", stderr); exit(EXIT_FAILURE); } /* * Formats: * * 1: origin (word:lsb,msb) + data * 2: origin (word:lsb,msb) + length (word:lsb,msb) + data (repeat) * 3: data * * Hex output: * * :lloooo00(ll bytes hex code)cc ll=# of bytes * oooo=origin * cc=invert of checksum all codes */ static void convert(short format, FILE *in, FILE *out) { uword org = 0; uword base = 0; long len; long maxseek = 0; ubyte buf[256]; if (format < 3) base = org = getwlh(in); if (format == 2) { len = getwlh(in); } else { long begin = ftell(in); fseek(in, 0L, 2); len = ftell(in) - begin; fseek(in, begin, 0); } for (;;) { if (len > 0) { while (len >= ((long) sizeof(buf))) { fread(buf, sizeof(buf), 1, in); fwrite(buf, sizeof(buf), 1, out); len -= sizeof(buf); org += sizeof(buf); } if (len) { fread(buf, (short)len, 1, in); fwrite(buf, (short)len, 1, out); org += len; } } if (format == 2) { if (maxseek < org - base) maxseek = org - base; org = getwlh(in); if (feof(in)) break; len = org - base; if (len < 0) { puts("ERROR! Reverse indexed to before beginning"); puts("*Initial* origin must be the lowest address"); return; } len -= maxseek; if (len > 0) memset(buf, 255, sizeof(buf)); while (len > 0) { if (len >= ((long) sizeof(buf))) { fwrite(buf, sizeof(buf), 1, out); maxseek += sizeof(buf); len -= sizeof(buf); } else { fwrite(buf, (short)len, 1, out); maxseek += len; len = 0; } } fseek(out, (long)(org - base), 0); len = getwlh(in); } else { break; } } } static uword getwlh(FILE *in) { uword result; result = getc(in); result += getc(in) << 8; return(result); } /* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4 autoindent: */ dasm-2.20.14.1/src/ftohex.c000066400000000000000000000074331375233463600152160ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * FTOHEX.C * * FTOHEX format infile [outfile] * * format: format used when assembling (asm705/asm65) * 1,2,3 -generate straight hex file * * Note that int and char are not used as Lattice C on IBM PCs uses * 16 bit ints and unsigned chars. */ #include #include #define PERLINE 16 void exiterr(const char *str); void convert(int format, FILE *in, FILE *out); unsigned int getwlh(FILE *in); void puth(unsigned char c, FILE *out); int main(int ac, char **av) { int format; FILE *infile; FILE *outfile; if (ac < 3) { puts("FTOHEX format infile [outfile]"); puts("format 1 = DEFAULT, 2 = RAS, or 3 = RAW"); puts("Copyright (c) 1988-2008 by various authors (see file AUTHORS)."); exit(1); } format = atoi(av[1]); if (format < 1 || format > 3) exiterr("specify infile format 1, 2, or 3"); infile = fopen(av[2], "r"); if (infile == NULL) exiterr("unable to open input file"); outfile = (av[3]) ? fopen(av[3], "w") : stdout; if (outfile == NULL) exiterr("unable to open output file"); convert(format, infile, outfile); fclose(infile); fclose(outfile); return 0; } void exiterr(const char *str) { fputs(str, stderr); fputs("\n", stderr); exit(1); } /* * Formats: * * 1: origin (word:lsb,msb) + data * 2: origin (word:lsb,msb) + length (word:lsb,msb) + data (repeat) * 3: data * * Hex output: * * :lloooo00(ll bytes hex code)cc ll=# of bytes * oooo=origin * cc=invert of checksum all codes */ void convert(int format, FILE *in, FILE *out) { unsigned int org = 0; unsigned int idx; long len; unsigned char buf[256]; if (format < 3) org = getwlh(in); if (format == 2) { len = getwlh(in); } else { long begin = ftell(in); fseek(in, 0, SEEK_END); len = ftell(in) - begin; fseek(in, begin, 0); } for (;;) { while (len > 0) { register unsigned char chk; register unsigned int i; idx = (len > PERLINE) ? PERLINE : len; fread(buf, idx, 1, in); putc(':', out); puth(idx, out); puth(org >> 8, out); puth(org & 0xFF, out); putc('0', out); putc('0', out); chk = idx + (org >> 8) + (org & 0xFF); for (i = 0; i < idx; ++i) { chk += buf[i]; puth(buf[i], out); } puth((unsigned char)-chk, out); putc('\r', out); putc('\n', out); len -= idx; org += idx; } if (format == 2) { org = getwlh(in); if (feof(in)) break; len = getwlh(in); } else { break; } } fprintf(out, ":00000001FF\r\n"); } unsigned int getwlh(FILE *in) { unsigned int result; result = getc(in); result += getc(in) << 8; return result; } void puth(unsigned char c, FILE *out) { static char dig[] = { "0123456789ABCDEF" }; putc(dig[c>>4], out); putc(dig[c&15], out); } dasm-2.20.14.1/src/globals.c000066400000000000000000000123301375233463600153340ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * GLOBALS.C */ #include "asm.h" SYMBOL *SHash[SHASHSIZE]; /* symbol hash table */ MNEMONIC *MHash[MHASHSIZE]; /* mnemonic hash table */ INCFILE *pIncfile; /* include file stack */ REPLOOP *Reploop; /* repeat loop stack */ SEGMENT *Seglist; /* segment list */ SEGMENT *Csegment; /* current segment */ IFSTACK *Ifstack; /* IF/ELSE/ENDIF stack */ char *Av[256]; /* up to 256 arguments */ char Avbuf[512]; unsigned char MsbOrder = 1; int Mnext; char Inclevel; unsigned int Mlevel; unsigned long Localindex; /* to generate local variables */ unsigned long Lastlocalindex; unsigned long Localdollarindex; unsigned long Lastlocaldollarindex; unsigned long Processor = 0; bool bTrace = false; bool Xdebug; bool bStrictMode = false; unsigned char Outputformat; unsigned long Redo_why = 0; int Redo_eval = 0; /* infinite loop detection only */ int Redo = 0; int nMacroDeclarations = 0; int nMacroClosings = 0; unsigned long maxFileSize = 640 * 1024; // avoid recursive growing via set,eqm // 640k are enough for everybody ... said Bill G. How many 64k pages have you ? unsigned long Redo_if = 0; char ListMode = 1; unsigned long CheckSum; /* output data checksum */ int F_format = FORMAT_DEFAULT; /* -T option [phf] */ sortmode_t F_sortmode = SORTMODE_DEFAULT; /* -E option [phf] */ errorformat_t F_errorformat = ERRORFORMAT_DEFAULT; unsigned char F_verbose; const char *F_outfile = "a.out"; char *F_listfile; char *F_symfile; FILE *FI_listfile; FILE *FI_temp; unsigned char Fisclear; unsigned long Plab, Pflags; /*unsigned int Adrbytes[] = { 1, 2, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 3, 1, 1, 2, 3 };*/ unsigned int Cvt[] = { 0, 2, 0, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0 }; unsigned int Opsize[] = { 0, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 0, 0, 1, 1, 1, 2 }; MNEMONIC Ops[] = { { NULL, v_list , "list", 0, 0, {0,} }, { NULL, v_include , "include", 0, 0, {0,} }, { NULL, v_seg , "seg", 0, 0, {0,} }, { NULL, v_hex , "hex", 0, 0, {0,} }, { NULL, v_err , "err", 0, 0, {0,} }, { NULL, v_dc , "dc", 0, 0, {0,} }, { NULL, v_dc , "byte", 0, 0, {0,} }, { NULL, v_dc , "word", 0, 0, {0,} }, { NULL, v_dc , "long", 0, 0, {0,} }, { NULL, v_ds , "ds", 0, 0, {0,} }, { NULL, v_dc , "dv", 0, 0, {0,} }, { NULL, v_end , "end", 0, 0, {0,} }, { NULL, v_trace , "trace", 0, 0, {0,} }, { NULL, v_org , "org", 0, 0, {0,} }, { NULL, v_rorg , "rorg", 0, 0, {0,} }, { NULL, v_rend , "rend", 0, 0, {0,} }, { NULL, v_align , "align", 0, 0, {0,} }, { NULL, v_subroutine, "subroutine", 0, 0, {0,} }, { NULL, v_equ , "equ", 0, 0, {0,} }, { NULL, v_equ , "=", 0, 0, {0,} }, { NULL, v_eqm , "eqm", 0, 0, {0,} }, { NULL, v_set , "set", 0, 0, {0,} }, { NULL, v_setstr , "setstr", 0, 0, {0,} }, { NULL, v_macro , "mac", MF_IF|MF_BEGM, 0, {0,} }, { NULL, v_macro , "macro", MF_IF|MF_BEGM, 0, {0,} }, { NULL, v_endm , "endm", MF_ENDM,0, {0,} }, { NULL, v_mexit , "mexit", 0, 0, {0,} }, { NULL, v_ifconst , "ifconst", MF_IF, 0, {0,} }, { NULL, v_ifnconst, "ifnconst", MF_IF, 0, {0,} }, { NULL, v_ifnconst, "ifndef", MF_IF, 0, {0,} }, { NULL, v_if , "if", MF_IF, 0, {0,} }, { NULL, v_else , "else", MF_IF, 0, {0,} }, { NULL, v_endif , "endif", MF_IF, 0, {0,} }, { NULL, v_endif , "eif", MF_IF, 0, {0,} }, { NULL, v_repeat , "repeat", MF_IF, 0, {0,} }, { NULL, v_repend , "repend", MF_IF, 0, {0,} }, { NULL, v_echo , "echo", 0, 0, {0,} }, { NULL, v_processor,"processor", 0, 0, {0,} }, { NULL, v_incbin , "incbin", 0, 0, {0,} }, { NULL, v_incdir , "incdir", 0, 0, {0,} }, MNEMONIC_NULL }; dasm-2.20.14.1/src/main.c000066400000000000000000001520171375233463600146440ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * MAIN.C * DASM sourcefile * NOTE: must handle mnemonic extensions and expression decode/compare. */ #include #include #include "version.h" #include "asm.h" static const char dasm_id[] = DASM_ID; #define ISEGNAME "INITIAL CODE SEGMENT" /* replace old atoi() calls; I wanted to protect this using #ifdef strtol but the C preprocessor doesn't recognize function names, at least not GCC's; we should be safe since MS compilers document strtol as well... [phf] */ #define atoi(x) ((int)strtol(x, (char **)NULL, 10)) static const char *cleanup(char *buf, bool bDisable); MNEMONIC *parse(char *buf); void panic(const char *str); MNEMONIC *findmne(char *str); void clearsegs(void); void clearrefs(void); static unsigned int hash1(const char *str); static void outlistfile(const char *); // buffers to supress errors and messages until last pass char *passbuffer [2] = { NULL, NULL}; #define ERRORBUF 0 #define MSGBUF 1 void passbuffer_clear(int); void passbuffer_update(int,char *); void passbuffer_output(int); void passbuffer_cleanup(void); int mlflag = 0; // multi-line comments static char erroradd1[500]; // temp error holders static char erroradd2[500]; static char erroradd3[500]; /* Table encapsulates errors, descriptions, and fatality flags. */ ERROR_DEFINITION sErrorDef[] = { /* Error #, STOPEND, Description */ { ERROR_NONE, true, "OK" }, { ERROR_COMMAND_LINE, true, "Check command-line format." }, { ERROR_FILE_ERROR, true, "Unable to open file." }, { ERROR_NOT_RESOLVABLE, true, "Source is not resolvable." }, { ERROR_TOO_MANY_PASSES, true, "Too many passes (%s)." }, { ERROR_NON_ABORT, true, "See previous output" }, { ERROR_SYNTAX_ERROR, true, "Syntax Error '%s'." }, { ERROR_EXPRESSION_TABLE_OVERFLOW, true, "Expression table overflow." }, { ERROR_UNBALANCED_BRACES, true, "Unbalanced Braces []." }, { ERROR_DIVISION_BY_0, true, "Division by zero." }, { ERROR_UNKNOWN_MNEMONIC, true, "Unknown Mnemonic '%s'." }, { ERROR_ILLEGAL_ADDRESSING_MODE, false, "Illegal Addressing mode '%s'." }, { ERROR_ILLEGAL_FORCED_ADDRESSING_MODE, true, "Illegal forced Addressing mode on '%s'." }, { ERROR_NOT_ENOUGH_ARGUMENTS_PASSED_TO_MACRO, true, "Not enough args passed to Macro." }, { ERROR_PREMATURE_EOF, false, "Premature EOF." }, { ERROR_ILLEGAL_CHARACTER, true, "Illegal character '%s'." }, { ERROR_BRANCH_OUT_OF_RANGE, false, "Branch out of range (%s bytes)." }, { ERROR_ERR_PSEUDO_OP_ENCOUNTERED, true, "ERR pseudo-op encountered." }, { ERROR_ORIGIN_REVERSE_INDEXED, false, "Origin Reverse-indexed." }, { ERROR_EQU_VALUE_MISMATCH, false, "EQU: Value mismatch." }, { ERROR_ADDRESS_MUST_BE_LT_100, true, "Value in '%s' must be <$100." }, { ERROR_ADDRESS_MUST_BE_LT_10000, true, "Value in '%s' must be <$10000." }, { ERROR_ILLEGAL_BIT_SPECIFICATION, true, "Illegal bit specification." }, { ERROR_NOT_ENOUGH_ARGS, true, "Not enough arguments." }, { ERROR_LABEL_MISMATCH, false, "Label mismatch...\n --> %s" }, { ERROR_MACRO_REPEATED, true, "Macro \"%s\" definition is repeated." }, { ERROR_VALUE_UNDEFINED, true, "Value Undefined." }, { ERROR_PROCESSOR_NOT_SUPPORTED, true, "Processor '%s' not supported." }, { ERROR_REPEAT_NEGATIVE, false, "REPEAT parameter < 0 (ignored)." }, { ERROR_BADERROR, true, "Bad error value (internal error)." }, { ERROR_ONLY_ONE_PROCESSOR_SUPPORTED, true, "Only one processor type may be selected." }, { ERROR_BAD_FORMAT, true, "Bad output format specified." }, { ERROR_VALUE_MUST_BE_1_OR_4, true, "Value in '%s' must be 1 or 4." }, { ERROR_VALUE_MUST_BE_LT_10, true, "Value in '%s' must be <$10." }, { ERROR_VALUE_MUST_BE_LT_8, true, "Value in '%s' must be <$8." }, { ERROR_VALUE_MUST_BE_LT_F, true, "Value in '%s' must be <$f." }, { ERROR_VALUE_MUST_BE_LT_10000, true, "Value in '%s' must be <$10000." }, { ERROR_ILLEGAL_OPERAND_COMBINATION, true, "Illegal combination of operands '%s'" }, { ERROR_RECURSION_TOO_DEEP, true, "Recursion too deep in %s" }, { ERROR_AVOID_SEGFAULT, true, "Internal error in %s" }, { ERROR_MISSING_ENDM, true, "Unbalanced macro %s" }, { ERROR_MISSING_COMMENT_END, true, "Multi-line comment not closed." }, { ERROR_SPURIOUS_COMMENT_CLOSE, true, "Multi-line comment closed without open." }, {-1, true, "Doh! Internal end-of-table marker, report the bug!"} }; #define MAX_ERROR (( sizeof( sErrorDef ) / sizeof( ERROR_DEFINITION ))) bool *bStopAtEnd; bool bRemoveOutBin = false; int nMaxPasses = 10; char *Extstr; /*unsigned char Listing = 1;*/ int pass; unsigned char F_ListAllPasses = 0; static int CountUnresolvedSymbols(void) { SYMBOL *sym; int nUnresolved = 0; int i; /* Pre-count unresolved symbols */ for (i = 0; i < SHASHSIZE; ++i) for (sym = SHash[i]; sym; sym = sym->next) if ( sym->flags & SYM_UNKNOWN ) nUnresolved++; return nUnresolved; } static int ShowUnresolvedSymbols(void) { SYMBOL *sym; int i; int nUnresolved = CountUnresolvedSymbols(); if ( nUnresolved ) { printf( "--- Unresolved Symbol List\n" ); /* Display unresolved symbols */ for (i = 0; i < SHASHSIZE; ++i) for (sym = SHash[i]; sym; sym = sym->next) if ( sym->flags & SYM_UNKNOWN ) printf( "%-24s %s\n", sym->name, sftos( sym->value, sym->flags ) ); printf( "--- %d Unresolved Symbol%c\n\n", nUnresolved, ( nUnresolved == 1 ) ? ' ' : 's' ); } return nUnresolved; } static int CompareAlpha( const void *arg1, const void *arg2 ) { /* Simple alphabetic ordering comparison function for quicksort */ const SYMBOL *sym1 = *(SYMBOL * const *) arg1; const SYMBOL *sym2 = *(SYMBOL * const *) arg2; /* The cast above is wild, thank goodness the Linux man page for qsort(3) has an example explaining it... :-) [phf] TODO: Note that we compare labels case-insensitive here which is not quite right; I believe we should be case-sensitive as in other contexts where symbols (labels) are compared. But the old CompareAlpha() was case-insensitive as well, so I didn't want to change that right now... [phf] */ return strcasecmp(sym1->name, sym2->name); } static int CompareAddress( const void *arg1, const void *arg2 ) { /* Simple numeric ordering comparison function for quicksort */ const SYMBOL *sym1 = *(SYMBOL * const *) arg1; const SYMBOL *sym2 = *(SYMBOL * const *) arg2; return sym1->value - sym2->value; } /* bTableSort true -> by address, false -> by name [phf] */ static void ShowSymbols( FILE *file, bool bTableSort ) { /* Display sorted (!) symbol table - if it runs out of memory, table will be displayed unsorted */ SYMBOL **symArray; SYMBOL *sym; int i; int nSymbols = 0; fprintf( file, "--- Symbol List"); /* Sort the symbol list either via name, or by value */ /* First count the number of symbols */ for (i = 0; i < SHASHSIZE; ++i) for (sym = SHash[i]; sym; sym = sym->next) nSymbols++; /* Malloc an array of pointers to data */ symArray = (SYMBOL **)ckmalloc( sizeof( SYMBOL * ) * nSymbols ); if ( !symArray ) { fprintf( file, " (unsorted - not enough memory to sort!)\n" ); /* Display complete symbol table */ for (i = 0; i < SHASHSIZE; ++i) for (sym = SHash[i]; sym; sym = sym->next) fprintf( file, "%-24s %s\n", sym->name, sftos( sym->value, sym->flags ) ); } else { /* Copy the element pointers into the symbol array */ int nPtr = 0; for (i = 0; i < SHASHSIZE; ++i) for (sym = SHash[i]; sym; sym = sym->next) symArray[ nPtr++ ] = sym; if ( bTableSort ) { fprintf( file, " (sorted by address)\n" ); qsort( symArray, nPtr, sizeof( SYMBOL * ), CompareAddress ); /* Sort via address */ } else { fprintf( file, " (sorted by symbol)\n" ); qsort( symArray, nPtr, sizeof( SYMBOL * ), CompareAlpha ); /* Sort via name */ } /* now display sorted list */ for ( i = 0; i < nPtr; i++ ) { fprintf( file, "%-24s %-12s", symArray[ i ]->name, sftos( symArray[ i ]->value, symArray[ i ]->flags ) ); if ( symArray[ i ]->flags & SYM_STRING ) fprintf( file, " \"%s\"", symArray[ i ]->string ); /* If a string, display actual string */ fprintf( file, "\n" ); } free( symArray ); } fputs( "--- End of Symbol List.\n", file ); } static void ShowSegments(void) { SEGMENT *seg; const char *bss; const char *sFormat = "%-24s %-3s %-8s %-8s %-8s %-8s\n\0"; printf("\n----------------------------------------------------------------------\n"); printf( sFormat, "SEGMENT NAME", "", "INIT PC", "INIT RPC", "FINAL PC", "FINAL RPC" ); for (seg = Seglist; seg; seg = seg->next) { bss = (seg->flags & SF_BSS) ? "[u]" : " "; printf( sFormat, seg->name, bss, sftos(seg->initorg, seg->initflags), sftos(seg->initrorg, seg->initrflags), sftos(seg->org, seg->flags), sftos(seg->rorg, seg->rflags) ); } puts("----------------------------------------------------------------------"); printf( "%d references to unknown symbols.\n", Redo_eval ); printf( "%d events requiring another assembler pass.\n", Redo ); if ( Redo_why ) { if ( Redo_why & REASON_MNEMONIC_NOT_RESOLVED ) printf( " - Expression in mnemonic not resolved.\n" ); if ( Redo_why & REASON_OBSCURE ) printf( " - Obscure reason - to be documented :)\n" ); if ( Redo_why & REASON_DC_NOT_RESOVED ) printf( " - Expression in a DC not resolved.\n" ); if ( Redo_why & REASON_DV_NOT_RESOLVED_PROBABLY ) printf( " - Expression in a DV not resolved (probably in DV's EQM symbol).\n" ); if ( Redo_why & REASON_DV_NOT_RESOLVED_COULD ) printf( " - Expression in a DV not resolved (could be in DV's EQM symbol).\n" ); if ( Redo_why & REASON_DS_NOT_RESOLVED ) printf( " - Expression in a DS not resolved.\n" ); if ( Redo_why & REASON_ALIGN_NOT_RESOLVED ) printf( " - Expression in an ALIGN not resolved.\n" ); if ( Redo_why & REASON_ALIGN_RELOCATABLE_ORIGIN_NOT_KNOWN ) printf( " - ALIGN: Relocatable origin not known (if in RORG at the time).\n" ); if ( Redo_why & REASON_ALIGN_NORMAL_ORIGIN_NOT_KNOWN ) printf( " - ALIGN: Normal origin not known (if in ORG at the time).\n" ); if ( Redo_why & REASON_EQU_NOT_RESOLVED ) printf( " - EQU: Expression not resolved.\n" ); if ( Redo_why & REASON_EQU_VALUE_MISMATCH ) printf( " - EQU: Value mismatch from previous pass (phase error).\n" ); if ( Redo_why & REASON_IF_NOT_RESOLVED ) printf( " - IF: Expression not resolved.\n" ); if ( Redo_why & REASON_REPEAT_NOT_RESOLVED ) printf( " - REPEAT: Expression not resolved.\n" ); if ( Redo_why & REASON_FORWARD_REFERENCE ) printf( " - Label defined after it has been referenced (forward reference).\n" ); if ( Redo_why & REASON_PHASE_ERROR ) printf( " - Label value is different from that of the previous pass (phase error).\n" ); if ( Redo_why & REASON_BRANCH_OUT_OF_RANGE ) printf( " - Branch was out of range.\n" ); } printf( "\n" ); } static void DumpSymbolTable( bool bTableSort ) { if (F_symfile) { FILE *fi = fopen(F_symfile, "w"); if (fi) { ShowSymbols( fi, bTableSort ); fclose(fi); } else { printf("Warning: Unable to open Symbol Dump file '%s'\n", F_symfile); } } } static int MainShadow(int ac, char **av, bool *pbTableSort ) { int nError = ERROR_NONE; bool bDoAllPasses = false; char buf[MAXLINE]; int i; int argVal; MNEMONIC *mne; int oldredo = -1; unsigned long oldwhy = 0; int oldeval = 0; addhashtable(Ops); pass = 1; if (ac < 2) { fail: puts(dasm_id); puts("Copyright (c) 1988-2020 by the DASM team."); puts("License GPLv2+: GNU GPL version 2 or later (see file LICENSE)."); puts("DASM is free software: you are free to change and redistribute it."); puts("There is ABSOLUTELY NO WARRANTY, to the extent permitted by law."); puts(""); puts("Usage: dasm sourcefile [options]"); puts(""); puts("-f# output format 1-3 (default 1)"); puts("-oname output file name (else a.out)"); puts("-lname list file name (else none generated)"); puts("-Lname list file, containing all passes"); puts("-sname symbol dump file name (else none generated)"); puts("-v# verboseness 0-4 (default 0)"); puts("-d debug mode (for developers)"); puts("-Dsymbol define symbol, set to 0"); puts("-Dsymbol=expression define symbol, set to expression"); puts("-Msymbol=expression define symbol using EQM (same as -D)"); puts("-Idir search directory for INCLUDE and INCBIN"); puts("-p# maximum number of passes"); puts("-P# maximum number of passes, with fewer checks"); puts("-T# symbol table sorting (default 0 = alphabetical, 1 = address/value)"); puts("-E# error format (default 0 = MS, 1 = Dillon, 2 = GNU)"); puts("-S strict syntax checking"); puts("-R remove binary output-file in case of errors"); puts("-m# safety barrier to abort on recursions, max. allowed file-size in kB"); puts(""); puts("Report bugs on https://github.com/dasm-assembler/dasm please!"); return ERROR_COMMAND_LINE; } for (i = 2; i < ac; ++i) { if ( ( av[i][0] == '-' ) || ( av[i][0] == '/' ) ) { char *str = av[i]+2; switch(av[i][1]) { /* TODO: need to improve option parsing and errors for it */ case 'E': F_errorformat = atoi(str); if (F_errorformat < ERRORFORMAT_DEFAULT || F_errorformat >= ERRORFORMAT_MAX ) { panic("Invalid error format for -E, must be 0, 1, 2"); } break; case 'T': F_sortmode = atoi(str); if (F_sortmode < SORTMODE_DEFAULT || F_sortmode >= SORTMODE_MAX ) { panic("Invalid sorting mode for -T option, must be 0 or 1"); } /* TODO: refactor into regular configuration [phf] */ *pbTableSort = (F_sortmode != SORTMODE_DEFAULT); break; case 'd': Xdebug = atoi(str) != 0; printf( "Debug trace %s\n", Xdebug ? "ON" : "OFF" ); break; case 'M': case 'D': while (*str && *str != '=') ++str; if (*str == '=') { *str = 0; ++str; } else { str = "0"; } Av[0] = av[i]+2; if (av[i][1] == 'M') v_eqm(str, NULL); else v_set(str, NULL); break; case 'f': /* F_format */ F_format = atoi(str); if (F_format < FORMAT_DEFAULT || F_format >= FORMAT_MAX ) panic("Illegal format specification"); break; case 'o': /* F_outfile */ F_outfile = str; nofile: if (*str == 0) panic("-o Switch requires file name."); break; case 'L': F_ListAllPasses = 1; /* fall through to 'l' */ case 'l': /* F_listfile */ F_listfile = str; goto nofile; case 'P': /* F_Passes */ bDoAllPasses = true; /* fall through to 'p' */ case 'p': /* F_passes */ nMaxPasses = atoi(str); break; case 's': /* F_symfile */ F_symfile = str; goto nofile; case 'v': /* F_verbose */ F_verbose = atoi(str); break; case 'I': v_incdir(str, NULL); break; case 'S': bStrictMode = true; break; case 'R': bRemoveOutBin = true; break; case 'm': /* F_passes */ argVal = atol(str); if (argVal <= 64) { panic("-m Switch invalid argument, should be > 64"); } else { maxFileSize = argVal; } break; default: goto fail; } continue; } goto fail; } bStopAtEnd = malloc((nMaxPasses+1) * sizeof(bool)); memset(bStopAtEnd, 0, nMaxPasses+1); // we dont count from zero ! (for fewer code changes) /* INITIAL SEGMENT */ { SEGMENT *seg = (SEGMENT *)permalloc(sizeof(SEGMENT)); seg->name = strcpy(permalloc(sizeof(ISEGNAME)), ISEGNAME); seg->flags= seg->rflags = seg->initflags = seg->initrflags = SF_UNKNOWN; Csegment = Seglist = seg; } /* TOP LEVEL IF */ { IFSTACK *ifs = (IFSTACK *)zmalloc(sizeof(IFSTACK)); ifs->file = NULL; ifs->flags = IFF_BASE; ifs->acctrue = 1; ifs->xtrue = 1; Ifstack = ifs; } // ready error and message buffer... passbuffer_clear(ERRORBUF); passbuffer_clear(MSGBUF); nextpass: if ( F_verbose ) { puts(""); printf("START OF PASS: %d\n", pass); } Localindex = Lastlocalindex = 0; Localdollarindex = Lastlocaldollarindex = 0; /*_fmode = 0x8000;*/ FI_temp = fopen(F_outfile, "wb"); /*_fmode = 0;*/ Fisclear = 1; CheckSum = 0; if (FI_temp == NULL) { printf("Warning: Unable to [re]open '%s'\n", F_outfile); return ERROR_FILE_ERROR; } if (F_listfile) { FI_listfile = fopen(F_listfile, F_ListAllPasses && (pass > 1)? "ab" : "wb"); if (FI_listfile == NULL) { printf("Warning: Unable to [re]open '%s'\n", F_listfile); return ERROR_FILE_ERROR; } } pushinclude(av[1]); while ( pIncfile ) { for (;;) { const char *comment; if ( pIncfile->flags & INF_MACRO) { if ( pIncfile->strlist == NULL) { Av[0] = ""; v_mexit(NULL, NULL); continue; } strcpy(buf, pIncfile->strlist->buf); pIncfile->strlist = pIncfile->strlist->next; } else { if (fgets(buf, MAXLINE, pIncfile->fi) == NULL) break; } if (Xdebug) printf("%08lx %s\n", (unsigned long) pIncfile, buf); comment = cleanup(buf, false); ++pIncfile->lineno; mne = parse(buf); if (Av[1][0]) { if (mne) { if ((mne->flags & MF_IF) || (Ifstack->xtrue && Ifstack->acctrue)) (*mne->vect)(Av[2], mne); } else { if (Ifstack->xtrue && Ifstack->acctrue) asmerr( ERROR_UNKNOWN_MNEMONIC, false, Av[1] ); } } else { if (Ifstack->xtrue && Ifstack->acctrue) programlabel(); } if (F_listfile && ListMode) outlistfile(comment); } while (Reploop && Reploop->file == pIncfile) rmnode((void **)&Reploop, sizeof(REPLOOP)); while (Ifstack->file == pIncfile) rmnode((void **)&Ifstack, sizeof(IFSTACK)); fclose( pIncfile->fi ); free( pIncfile->name ); --Inclevel; rmnode((void **)&pIncfile, sizeof(INCFILE)); if ( pIncfile ) { if (F_verbose > 3) printf("back to: %s\n", pIncfile->name); if (F_listfile) fprintf(FI_listfile, "------- FILE %s\n", pIncfile->name); } } if ( F_verbose >= 1 ) ShowSegments(); if ( F_verbose >= 3 ) { if ( !Redo || ( F_verbose == 4 ) ) ShowSymbols( stdout, *pbTableSort ); ShowUnresolvedSymbols(); } closegenerate(); fclose(FI_temp); if (FI_listfile) fclose(FI_listfile); if (mlflag) // check if a multi-line comment is missing a terminator return ERROR_MISSING_COMMENT_END; if (Redo) { if ( !bDoAllPasses ) if (Redo == oldredo && Redo_why == oldwhy && Redo_eval == oldeval) { ShowUnresolvedSymbols(); return ERROR_NOT_RESOLVABLE; } oldredo = Redo; oldwhy = Redo_why; oldeval = Redo_eval; Redo = 0; Redo_why = 0; Redo_eval = 0; Redo_if <<= 1; ++pass; if ( pass > nMaxPasses ) { char sBuffer[64]; sprintf( sBuffer, "%d", pass ); return asmerr( ERROR_TOO_MANY_PASSES, false, sBuffer ); } else { passbuffer_clear(ERRORBUF); passbuffer_clear(MSGBUF); clearrefs(); clearsegs(); goto nextpass; } } // Do not print any errors if assembly is successful!!!!! -FXQ // only print messages from last pass and if there's no errors if (!bStopAtEnd[pass]) { passbuffer_output(MSGBUF); } else { // Only print errors if assembly is unsuccessful!!!!! // by FXQ passbuffer_output(ERRORBUF); printf("Unrecoverable error(s) in pass, aborting assembly!\n"); nError = ERROR_NON_ABORT; } if (nMacroClosings != nMacroDeclarations) { /* determine the file pointer to use */ FILE *error_file = (F_listfile != NULL) ? FI_listfile : stdout; fprintf(error_file, "premature end of file, macros opened:%d closed:%d", nMacroDeclarations, nMacroClosings); fprintf(error_file, "Aborting assembly\n"); exit(ERROR_MISSING_ENDM); } printf( "Complete. (%d)\n", nError); return nError; } void addmsg(char *message) // add to message buffer (FXQ) { passbuffer_update(MSGBUF,message); } static int tabit(char *buf1, char *buf2) { char *bp, *ptr; int j, k; bp = buf2; ptr= buf1; for (j = 0; *ptr && *ptr != '\n'; ++ptr, ++bp, j = (j+1)&7) { *bp = *ptr; if (*ptr == '\t') { /* optimize out spaces before the tab */ while (j > 0 && bp[-1] == ' ') { bp--; j--; } j = 0; *bp = '\t'; /* recopy the tab */ } if (j == 7 && *bp == ' ' && bp[-1] == ' ') { k = j; while (k-- >= 0 && *bp == ' ') --bp; *++bp = '\t'; } } while (bp != buf2 && (bp[-1] == ' ' || bp[-1] == '\t')) --bp; *bp++ = '\n'; *bp = '\0'; return (int)(bp - buf2); } static void outlistfile(const char *comment) { char xtrue; char c; static char buf1[MAXLINE+32]; static char buf2[MAXLINE+32]; const char *ptr; const char *dot; int i, j; if ( pIncfile->flags & INF_NOLIST ) return; xtrue = (Ifstack->xtrue && Ifstack->acctrue) ? ' ' : '-'; c = (Pflags & SF_BSS) ? 'U' : ' '; ptr = Extstr; dot = ""; if (ptr) dot = "."; else ptr = ""; sprintf(buf1, "%7ld %c%s", pIncfile->lineno, c, sftos(Plab, Pflags & 7)); j = strlen(buf1); for (i = 0; i < Glen && i < 4; ++i, j += 3) sprintf(buf1+j, "%02x ", Gen[i]); if (i < Glen && i == 4) xtrue = '*'; for (; i < 4; ++i) { buf1[j] = buf1[j+1] = buf1[j+2] = ' '; j += 3; } sprintf(buf1+j-1, "%c%-10s %s%s%s\t%s\n", xtrue, Av[0], Av[1], dot, ptr, Av[2]); if (comment[0]) { /* tab and comment */ j = strlen(buf1) - 1; sprintf(buf1+j, "\t;%s", comment); } fwrite(buf2, tabit(buf1,buf2), 1, FI_listfile); Glen = 0; Extstr = NULL; } char *sftos(long val, int flags) { static char buf[ MAX_SYM_LEN + 14 ]; static char c; char *ptr = (c) ? buf : buf + sizeof(buf) / 2; memset( buf, 0, sizeof( buf ) ); c = 1 - c; sprintf(ptr, "%04lx ", val); if (flags & SYM_UNKNOWN) strcat( ptr, "???? "); else strcat( ptr, " " ); if (flags & SYM_STRING) strcat( ptr, "str "); else strcat( ptr, " " ); if (flags & SYM_MACRO) strcat( ptr, "eqm "); else strcat( ptr, " " ); if (flags & (SYM_MASREF|SYM_SET)) { strcat( ptr, "(" ); } else strcat( ptr, " " ); if (flags & (SYM_MASREF)) strcat( ptr, "R" ); else strcat( ptr, " " ); if (flags & (SYM_SET)) strcat( ptr, "S" ); else strcat( ptr, " " ); if (flags & (SYM_MASREF|SYM_SET)) { strcat( ptr, ")" ); } else strcat( ptr, " " ); return ptr; } void clearsegs(void) { SEGMENT *seg; for (seg = Seglist; seg; seg = seg->next) { seg->flags = (seg->flags & SF_BSS) | SF_UNKNOWN; seg->rflags= seg->initflags = seg->initrflags = SF_UNKNOWN; } } void clearrefs(void) { SYMBOL *sym; short i; for (i = 0; i < SHASHSIZE; ++i) for (sym = SHash[i]; sym; sym = sym->next) sym->flags &= ~SYM_REF; } static const char *cleanup(char *buf, bool bDisable) { char *str; STRLIST *strlist; int arg, add; const char *comment = ""; char *mlstart, *mlend, *semistart; mlstart=strstr(buf,"/*"); mlend=strstr(buf,"*/"); semistart=strstr(buf,";"); if (mlflag) // a previous multi-line comment is in progress... { if ( mlend ) { mlflag=0; // turn off multiline comments char tempbuf[MAXLINE]; char *tmpc; *mlend = 0; tmpc = mlend+1; while(*tmpc!=0) // we need to purge any newlines before we reorder the parts of the line { if((*tmpc == '\r')||(*tmpc == '\n')) *tmpc=0; tmpc++; } snprintf(tempbuf,MAXLINE,"%s;*/%s",mlend+2,buf); // put the comment at the end of the line strncpy(buf,tempbuf,MAXLINE); return(cleanup(buf,bDisable)); // repeat for any single-line comments that may follow } else { memmove(buf+1,buf,strlen(buf)+1); // make room for the last comment buf[0]=';'; } } else // we're not presently in the middle of a multi-line comment... { // check for spurious comment close if (mlend && ( (!semistart) || (mlend < semistart) ) && ( (!mlstart) || (mlend < mlstart) ) ) asmerr( ERROR_SPURIOUS_COMMENT_CLOSE, false, NULL ); if (mlstart && ((!semistart) || (mlstart < semistart))) { if (mlend && (mlstart < mlend) && ((!semistart)||(mlend < semistart))) // single line /* */ { char tempbuf[MAXLINE]; char *tmpc; *mlstart = 0; *(mlend+1)=0; tmpc = mlend+2; while(*tmpc!=0) // we need to purge any newlines before we reorder the parts of the line { if((*tmpc == '\r')||(*tmpc == '\n')) *tmpc=0; tmpc++; } snprintf(tempbuf,MAXLINE,"%s%s;/%s",buf,mlend+2,mlstart+1); // move the first comment to the end of the line strcpy(buf,tempbuf); return(cleanup(buf,bDisable)); // repeat for any single-line comments that may follow } mlflag=1; // turn on multiline comments memmove(mlstart+1,mlstart,strlen(mlstart)+1); // make room for a comment *mlstart=';'; } } for (str = buf; *str; ++str) { switch(*str) { case ';': comment = (char *)str + 1; /* FALL THROUGH */ case '\r': case '\n': goto br2; case TAB: *str = ' '; break; case '\'': ++str; if (*str == TAB) *str = ' '; if (*str == '\n' || *str == 0) { str[0] = ' '; str[1] = 0; } if (str[0] == ' ') str[0] = '\x80'; break; case '\"': ++str; while (*str && *str != '\"') { if (*str == ' ') *str = '\x80'; ++str; } if (*str != '\"') { asmerr( ERROR_SYNTAX_ERROR, false, buf ); --str; } break; case '{': if ( bDisable ) break; if (Xdebug) printf("macro tail: '%s'\n", str); arg = atoi(str+1); for (add = 0; *str && *str != '}'; ++str) --add; if (*str != '}') { puts("end brace required"); --str; break; } --add; ++str; if (Xdebug) printf("add/str: %d '%s'\n", add, str); for (strlist = pIncfile->args; arg && strlist;) { --arg; strlist = strlist->next; } if (strlist) { add += strlen(strlist->buf); if (Xdebug) printf("strlist: '%s' %zu\n", strlist->buf, strlen(strlist->buf)); if (str + add + strlen(str) + 1 > buf + MAXLINE) { if (Xdebug) printf("str %8ld buf %8ld (add/strlen(str)): %d %ld\n", (unsigned long)str, (unsigned long)buf, add, (long)strlen(str)); panic("failure1"); } memmove(str + add, str, strlen(str)+1); str += add; if (str - strlen(strlist->buf) < buf) panic("failure2"); memmove(str - strlen(strlist->buf), strlist->buf, strlen(strlist->buf)); str -= strlen(strlist->buf); if (str < buf || str >= buf + MAXLINE) panic("failure 3"); --str; /* for loop increments string */ } else { asmerr( ERROR_NOT_ENOUGH_ARGUMENTS_PASSED_TO_MACRO, false, NULL ); goto br2; } break; } } br2: while(str != buf && *(str-1) == ' ') --str; *str = 0; return comment; } void panic(const char *str) { puts(str); exit(1); } /* * .dir direct x * .ext extended x * .r relative x * .x index, no offset x * .x8 index, byte offset x * .x16 index, word offset x * .bit bit set/clr * .bbr bit and branch * .imp implied (inherent) x * .b x * .w x * .l x * .u x * .s swapped short, force other endian with DC */ void findext(char *str) { Mnext = -1; Extstr = NULL; if (str[0] == '.') { /* Allow .OP for OP */ return; } while (*str && *str != '.') ++str; if (*str) { *str = 0; ++str; Extstr = str; switch(str[0]|0x20) { case 's': Mnext = AM_OTHER_ENDIAN; return; case '0': case 'i': Mnext = AM_IMP; switch(str[1]|0x20) { case 'x': Mnext = AM_0X; break; case 'y': Mnext = AM_0Y; break; case 'n': Mnext = AM_INDWORD; break; } return; case 'd': case 'b': case 'z': switch(str[1]|0x20) { case 'x': Mnext = AM_BYTEADRX; break; case 'y': Mnext = AM_BYTEADRY; break; case 'i': Mnext = AM_BITMOD; break; case 'b': Mnext = AM_BITBRAMOD; break; default: Mnext = AM_BYTEADR; break; } return; case 'e': case 'w': case 'a': switch(str[1]|0x20) { case 'x': Mnext = AM_WORDADRX; break; case 'y': Mnext = AM_WORDADRY; break; default: Mnext = AM_WORDADR; break; } return; case 'l': Mnext = AM_LONG; return; case 'r': Mnext = AM_REL; return; case 'u': Mnext = AM_BSS; return; } } } /* * bytes arg will eventually be used to implement a linked list of free * nodes. * Assumes *base is really a pointer to a structure with .next as the first * member. */ void rmnode(void **base, int bytes) { void *node; if ((node = *base) != NULL) { *base = *(void **)node; free(node); } } /* * Parse into three arguments: Av[0], Av[1], Av[2] */ MNEMONIC *parse(char *buf) { int i, j; MNEMONIC *mne = NULL; int labelundefined = 0; i = 0; j = 1; /* If the first non-space is a ^, skip all further spaces too. This means what follows is a label. If the first non-space is a #, what follows is a directive/opcode. */ while (buf[i] == ' ') ++i; if (buf[i] == '^') { ++i; while (buf[i] == ' ') ++i; } else if (buf[i] == '#') { buf[i] = ' '; /* label separator */ } else i = 0; Av[0] = Avbuf + j; while (buf[i] && buf[i] != ' ' && buf[i] != '=') { if (buf[i] == ':') { i++; break; } if (buf[i] == ',') // we have label arguments { if(buf[i+1]=='"') // is it a string constant? { i=i+2; // advance to string contents while (buf[i] && buf[i] != '"' && buf[i] != ' ' && buf[i] != ',' && buf[i] != ':') { Avbuf[j++] = buf[i++]; } if (buf[i] && buf[i]=='"') { i++; continue; } else { labelundefined++; asmerr( ERROR_SYNTAX_ERROR, false, buf ); continue; } } else // or else it's a symbol to be evaluated, and added to the label { int t; char tempbuf[257]; char tempval[257]; SYMBOL *symarg; strncpy(tempbuf,buf+i+1,256); tempbuf[256]=0; for(t=0;tflags & SYM_UNKNOWN) // one of the arguments isn't defined yet labelundefined++; // ensure the label we're creating doesn't get used else { snprintf(tempval,256,"%d",(unsigned)symarg->value); strcpy(Avbuf+j,tempval); j=j+strlen(tempval); } } i++; while (buf[i] && buf[i] != ' ' && buf[i] != '=' && buf[i] != ','&& buf[i] != ':') i++; } continue; } if ((unsigned char)buf[i] == 0x80) buf[i] = ' '; Avbuf[j++] = buf[i++]; } Avbuf[j++] = 0; // if the label has arguments that aren't defined, we need to scuttle it // to avoid a partial label being used. if(labelundefined) { j=1; Avbuf[j++] = 0; } /* Parse the second word of the line */ while (buf[i] == ' ') ++i; Av[1] = Avbuf + j; if (buf[i] == '=') { /* '=' directly seperates Av[0] and Av[2] */ Avbuf[j++] = buf[i++]; } else while (buf[i] && buf[i] != ' ') { if ((unsigned char)buf[i] == 0x80) buf[i] = ' '; Avbuf[j++] = buf[i++]; } Avbuf[j++] = 0; /* and analyse it as an opcode */ findext(Av[1]); mne = findmne(Av[1]); /* Parse the rest of the line */ while (buf[i] == ' ') ++i; Av[2] = Avbuf + j; while (buf[i]) { if (buf[i] == ' ') { while(buf[i+1] == ' ') ++i; } if ((unsigned char)buf[i] == 0x80) buf[i] = ' '; Avbuf[j++] = buf[i++]; } Avbuf[j] = 0; if (mne != NULL) { if (mne->flags & MF_BEGM) { nMacroDeclarations++; } if (mne->flags & MF_ENDM) { nMacroClosings++; } } return mne; } MNEMONIC *findmne(char *str) { int h,k; int i; char c; MNEMONIC *mne; char buf[64]; if (str[0] == '.') { /* Allow .OP for OP */ str++; } for (i = 0; (c = str[i]); ++i) { if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; buf[i] = c; } buf[i] = 0; h = hash1(buf); mne = MHash[h]; k = 0; while (mne != NULL) { if (strcmp(buf, mne->name) == 0) break; k++; mne = mne->next; if (mne != NULL) { if ((mne == mne->next) && (k > 5)) { // any number bigger than 1 would do // should not happen at all, I'm not paranoid, I've had this problem really fprintf(stderr,"[%s] [%s] %08lx %08lx\n", buf, mne->name, (long)mne, (long)mne->next); fprintf(stderr,"BUG: %s:%d: chained list looped to itself and no match, would lock up endlessly\n", __FILE__, __LINE__); return NULL; // we need to return NULL here or the program will get stuck in an endless loop // the BUG vanished with increased hashtable } } } return mne; } void v_macro(char *str, MNEMONIC *dummy) { STRLIST *base; int defined = 0; STRLIST **slp, *sl; MACRO *mac; /* slp, mac: might be used uninitialised */ MNEMONIC *mne; unsigned int i; char buf[MAXLINE]; int skipit = !(Ifstack->xtrue && Ifstack->acctrue); strlower(str); mne = findmne(str); if (skipit) { defined = 1; } else { defined = (mne != NULL); if (F_listfile && ListMode) outlistfile(""); } if (!defined) { base = NULL; slp = &base; mac = (MACRO *)permalloc(sizeof(MACRO)); i = hash1(str); mac->next = (MACRO *)MHash[i]; mac->vect = v_execmac; mac->name = strcpy(permalloc(strlen(str)+1), str); mac->flags = MF_MACRO; mac->defpass = pass; if (mac == mac->next) { // should not happen fprintf(stderr,"BUG: %s:%d: permalloc() returned the same value twice, expect severe problems\n", __FILE__, __LINE__); } MHash[i] = (MNEMONIC *)mac; } else { mac = (MACRO *)mne; if( (bStrictMode) && (mac != NULL) && (mac->defpass == pass) ) asmerr( ERROR_MACRO_REPEATED, true, str ); } while (fgets(buf, MAXLINE, pIncfile->fi)) { const char *comment; if (Xdebug) printf("%08lx %s\n", (unsigned long) pIncfile, buf); ++pIncfile->lineno; comment = cleanup(buf, true); mne = parse(buf); if (Av[1][0]) { if (mne != NULL) { // for some reason I got a segfault while accessing mne->flags, should not happen but gdb said it was here if (mne->flags & MF_ENDM) { if (!defined) mac->strlist = base; return; } } } if (!skipit && F_listfile && ListMode) outlistfile(comment); if (!defined) { sl = (STRLIST *)permalloc(STRLISTSIZE+1+strlen(buf)); strcpy(sl->buf, buf); *slp = sl; slp = &sl->next; } } asmerr( ERROR_PREMATURE_EOF, true, NULL ); } void addhashtable(MNEMONIC *mne) { int i, j; unsigned int opcode[NUMOC]; for (; mne->vect; ++mne) { memcpy(opcode, mne->opcode, sizeof(mne->opcode)); for (i = j = 0; i < NUMOC; ++i) { mne->opcode[i] = 0; /* not really needed */ if (mne->okmask & (1L << i)) mne->opcode[i] = opcode[j++]; } i = hash1(mne->name); mne->next = MHash[i]; MHash[i] = mne; } } static unsigned int hash1(const char *str) { uint8_t a = 0; uint8_t b = 0; while (*str) { // this is Fletcher's checksum, better distribution, faster a += *str++; b += a; } return ((((a << 8) & 0xFF00) | (b & 0xFF)) ) & MHASHAND; } void pushinclude(char *str) { INCFILE *inf; FILE *fi; if ((fi = pfopen(str, "rb")) != NULL) { if (F_verbose > 1 && F_verbose != 5 ) printf("%.*s Including file \"%s\"\n", Inclevel*4, "", str); ++Inclevel; if (F_listfile) fprintf(FI_listfile, "------- FILE %s LEVEL %d PASS %d\n", str, Inclevel, pass); inf = (INCFILE *)zmalloc(sizeof(INCFILE)); inf->next = pIncfile; inf->name = strcpy(ckmalloc(strlen(str)+1), str); inf->fi = fi; inf->lineno = 0; pIncfile = inf; return; } printf("Warning: Unable to open '%s'\n", str); return; } int asmerr(int err, bool bAbort, const char *sText ) { const char *str; INCFILE *pincfile; /* file pointer we print error messages to */ FILE *error_file = NULL; if ( err >= MAX_ERROR || err < 0 ) { return asmerr( ERROR_BADERROR, true, "Bad error ERROR!" ); } else { if (sErrorDef[err].bFatal) bStopAtEnd[pass] = true; pincfile = pIncfile; while(1) { if (pincfile == NULL) { fprintf(stderr, "%s:%d: error: pincfile is NULL, err:%d, [%s]: %s\n", __FILE__, __LINE__ , err, sText, sErrorDef[err].sDescription); bAbort = true; break; } if (pincfile->flags & INF_MACRO) { pincfile = pincfile->next; continue; } else { break; } } str = sErrorDef[err].sDescription; /* New error format selection for 2.20.11 since some people *don't* use MS products. For historical reasons we currently send errors to stdout when they should really go to stderr, but we'll switch eventually I hope... [phf] */ /* determine the file pointer to use */ error_file = (F_listfile != NULL) ? FI_listfile : stdout; /* print first part of message, different formats offered */ if (pincfile != NULL) switch (F_errorformat) { case ERRORFORMAT_WOE: /* Error format for MS VisualStudio and relatives: "file (line): error: string" */ if(error_file!=stdout) fprintf(error_file, "%s (%lu): error: ", pincfile->name, pincfile->lineno); sprintf(erroradd1, "%s (%lu): error: ", pincfile->name, pincfile->lineno); // -FXQ break; case ERRORFORMAT_DILLON: /* Matthew Dillon's original format, except that we don't distinguish writing to the terminal from writing to the list file for now. Matt's 2.16 uses these: "*line %4ld %-10s %s\n" (list file) "line %4ld %-10s %s\n" (terminal) */ if(error_file!=stdout) fprintf(error_file, "line %7ld %-10s ", pincfile->lineno, pincfile->name); sprintf(erroradd1, "line %7ld %-10s ", pincfile->lineno, pincfile->name); // -FXQ break; case ERRORFORMAT_GNU: /* GNU format error messages, from their coding standards. */ if(error_file!=stdout) fprintf(error_file, "%s:%lu: error: ", pincfile->name, pincfile->lineno); sprintf(erroradd1, "%s:%lu: error: ", pincfile->name, pincfile->lineno); // -FXQ break; default: /* TODO: really panic here? [phf] */ panic("Invalid error format, internal error!"); break; } if(error_file!=stdout) { /* print second part of message, always the same for now */ fprintf(error_file, str, sText ? sText : ""); fprintf(error_file, "\n"); } sprintf(erroradd2, str, sText ? sText : ""); sprintf(erroradd3, "\n"); passbuffer_update(ERRORBUF,erroradd1); passbuffer_update(ERRORBUF,erroradd2); passbuffer_update(ERRORBUF,erroradd3); if ( bAbort ) { passbuffer_output(MSGBUF); // dump messages from this pass fprintf(error_file, "Aborting assembly\n"); passbuffer_output(ERRORBUF); // time to dump the errors from this pass! exit(err); } } return err; } char *zmalloc(int bytes) { char *ptr = ckmalloc(bytes); if ( ptr ) memset(ptr, 0, bytes); return ptr; } char *ckmalloc(int bytes) { char *ptr = malloc(bytes); if (ptr) { return ptr; } panic("unable to malloc"); return NULL; } char *permalloc(int bytes) { static char *buf; static int left; char *ptr; /* Assume sizeof(union align) is a power of 2 */ union align { long l; void *p; void (*fp)(void); }; bytes = (bytes + sizeof(union align)-1) & ~(sizeof(union align)-1); if (bytes > left) { if ((buf = malloc(ALLOCSIZE)) == NULL) panic("unable to malloc"); memset(buf, 0, ALLOCSIZE); left = ALLOCSIZE; if (bytes > left) panic("software error"); } ptr = buf; buf += bytes; left -= bytes; return ptr; } char *strlower(char *str) { char c; char *ptr; for (ptr = str; (c = *ptr); ++ptr) { if (c >= 'A' && c <= 'Z') *ptr = c | 0x20; } return str; } int main(int ac, char **av) { bool bTableSort = false; int nError = MainShadow( ac, av, &bTableSort ); if ( nError && (nError != ERROR_NON_ABORT) ) { // dump messages when aborting due to errors passbuffer_output(MSGBUF); // Only print errors if assembly is unsuccessful passbuffer_output(ERRORBUF); printf( "Fatal assembly error: %s\n", sErrorDef[nError].sDescription ); } DumpSymbolTable( bTableSort ); passbuffer_cleanup(); if (nError != 0) { if (bRemoveOutBin) { unlink(F_outfile); } } return nError; } void passbuffer_clear(int mbindex) { // ensure the buffer is initialized before we attempt to clear it, // just in case no messages have been stored prior to this clear. if(passbuffer[mbindex] == NULL) passbuffer_update(mbindex,""); // clear the requested guffer passbuffer[mbindex][0] = 0; } void passbuffer_update(int mbindex,char *message) { int newsizerequired; // allocate 16k buffers to start... static int passbuffersize[2] = {16384,16384}; // check if the buffer we're working with needs initialization if(passbuffer[mbindex] == NULL) { passbuffer[mbindex] = malloc(passbuffersize[mbindex]); if(passbuffer[mbindex] == NULL) panic("couldn't allocate memory for message buffer."); passbuffer[mbindex][0] = 0; // empty string } // check if we need to grow the buffer... newsizerequired=strlen(passbuffer[mbindex])+strlen(message); if( newsizerequired > passbuffersize[mbindex]) { // double the current buffer size, if sufficient, so we don't continually reallocate memory... newsizerequired = ( newsizerequired < (passbuffersize[mbindex]*2) ) ? passbuffersize[mbindex]*2 : newsizerequired; //fprintf(stderr,"DEBUG: growing buffer %d to %d bytes\n", mbindex, newsizerequired); passbuffer[mbindex] = realloc(passbuffer[mbindex], newsizerequired); if(passbuffer[mbindex] == NULL) panic("couldn't grow memory for message buffer."); passbuffersize[mbindex]=newsizerequired; } // update the buffer with the message... strcat(passbuffer[mbindex],message); } void passbuffer_output(int mbindex) { // ensure the buffer is initialized before we attempt to clear it, // just in case no messages have been stored yet. if(passbuffer[mbindex] == NULL) passbuffer_update(mbindex,""); printf("%s\n",passbuffer[mbindex]); // ...do we really still need to put this through stdout, instead stderr? } void passbuffer_cleanup() { int t; for(t=0;t<2;t++) if(passbuffer[t]!=NULL) free(passbuffer[t]); } dasm-2.20.14.1/src/mne6303.c000066400000000000000000000245101375233463600150070ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * MNE6303.C */ #include "asm.h" /* * IMP IMM8 IMM16 BYTE BYTEX BYTEY WORD WORDX WORDY REL (,x) (),y (WORD) * 0 1 2 3 4 5 6 7 8 9 10 11 12 * * 0,x 0,y BIT BITBRA * 13 14 15 16 */ MNEMONIC Mne6803[] = { { NULL, v_mnemonic, "aba", 0, AF_IMP, { 0x1B }}, { NULL, v_mnemonic, "abx", 0, AF_IMP, { 0x3A }}, { NULL, v_mnemonic, "adca", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x89, 0x99, 0xA9, 0xB9 }}, { NULL, v_mnemonic, "adcb", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xC9, 0xD9, 0xE9, 0xF9 }}, { NULL, v_mnemonic, "adda", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x8B, 0x9B, 0xAB, 0xBB }}, { NULL, v_mnemonic, "addb", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xCB, 0xDB, 0xEB, 0xFB }}, { NULL, v_mnemonic, "addd", 0, AF_IMM16|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xC3, 0xD3, 0xE3, 0xF3 }}, { NULL, v_mnemonic, "anda", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x84, 0x94, 0xA4, 0xB4 }}, { NULL, v_mnemonic, "andb", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xC4, 0xD4, 0xE4, 0xF4 }}, { NULL, v_mnemonic, "bita", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x85, 0x95, 0xA5, 0xB5 }}, { NULL, v_mnemonic, "bitb", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xC5, 0xD5, 0xE5, 0xF5 }}, { NULL, v_mnemonic, "bra", 0, AF_REL, { 0x20 }}, { NULL, v_mnemonic, "brn", 0, AF_REL, { 0x21 }}, { NULL, v_mnemonic, "bcc", 0, AF_REL, { 0x24 }}, { NULL, v_mnemonic, "bhs", 0, AF_REL, { 0x24 }}, { NULL, v_mnemonic, "bcs", 0, AF_REL, { 0x25 }}, { NULL, v_mnemonic, "blo", 0, AF_REL, { 0x25 }}, { NULL, v_mnemonic, "beq", 0, AF_REL, { 0x27 }}, { NULL, v_mnemonic, "bge", 0, AF_REL, { 0x2C }}, { NULL, v_mnemonic, "bgt", 0, AF_REL, { 0x2E }}, { NULL, v_mnemonic, "bhi", 0, AF_REL, { 0x22 }}, { NULL, v_mnemonic, "ble", 0, AF_REL, { 0x2F }}, { NULL, v_mnemonic, "bls", 0, AF_REL, { 0x23 }}, { NULL, v_mnemonic, "blt", 0, AF_REL, { 0x2D }}, { NULL, v_mnemonic, "bmi", 0, AF_REL, { 0x2B }}, { NULL, v_mnemonic, "bne", 0, AF_REL, { 0x26 }}, { NULL, v_mnemonic, "bvc", 0, AF_REL, { 0x28 }}, { NULL, v_mnemonic, "bvs", 0, AF_REL, { 0x29 }}, { NULL, v_mnemonic, "bpl", 0, AF_REL, { 0x2A }}, { NULL, v_mnemonic, "bsr", 0, AF_REL, { 0x8D }}, { NULL, v_mnemonic, "clc", 0, AF_IMP, { 0x0C }}, { NULL, v_mnemonic, "cli", 0, AF_IMP, { 0x0E }}, { NULL, v_mnemonic, "clv", 0, AF_IMP, { 0x0A }}, { NULL, v_mnemonic, "sec", 0, AF_IMP, { 0x0D }}, { NULL, v_mnemonic, "sei", 0, AF_IMP, { 0x0F }}, { NULL, v_mnemonic, "sev", 0, AF_IMP, { 0x0B }}, { NULL, v_mnemonic, "tap", 0, AF_IMP, { 0x06 }}, { NULL, v_mnemonic, "tpa", 0, AF_IMP, { 0x07 }}, { NULL, v_mnemonic, "clr", 0, AF_BYTEADRX|AF_WORDADR, { 0x6F, 0x7F }}, { NULL, v_mnemonic, "clra", 0, AF_IMP, { 0x4F }}, { NULL, v_mnemonic, "clrb", 0, AF_IMP, { 0x5F }}, { NULL, v_mnemonic, "cmpa", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x81, 0x91, 0xA1, 0xB1 }}, { NULL, v_mnemonic, "cmpb", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xC1, 0xD1, 0xE1, 0xF1 }}, { NULL, v_mnemonic, "cba", 0, AF_IMP, { 0x11 }}, { NULL, v_mnemonic, "com", 0, AF_BYTEADRX|AF_WORDADR, { 0x63, 0x73 }}, { NULL, v_mnemonic, "coma", 0, AF_IMP, { 0x43 }}, { NULL, v_mnemonic, "comb", 0, AF_IMP, { 0x53 }}, { NULL, v_mnemonic, "neg", 0, AF_BYTEADRX|AF_WORDADR, { 0x60, 0x70 }}, { NULL, v_mnemonic, "nega", 0, AF_IMP, { 0x40 }}, { NULL, v_mnemonic, "negb", 0, AF_IMP, { 0x50 }}, { NULL, v_mnemonic, "daa", 0, AF_IMP, { 0x19 }}, { NULL, v_mnemonic, "dec", 0, AF_BYTEADRX|AF_WORDADR, { 0x6A, 0x7A }}, { NULL, v_mnemonic, "deca", 0, AF_IMP, { 0x4A }}, { NULL, v_mnemonic, "decb", 0, AF_IMP, { 0x5A }}, { NULL, v_mnemonic, "eora", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x88, 0x98, 0xA8, 0xB8 }}, { NULL, v_mnemonic, "eorb", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xC8, 0xD8, 0xE8, 0xF8 }}, { NULL, v_mnemonic, "inc", 0, AF_BYTEADRX|AF_WORDADR, { 0x6C, 0x7C }}, { NULL, v_mnemonic, "inca", 0, AF_IMP, { 0x4C }}, { NULL, v_mnemonic, "incb", 0, AF_IMP, { 0x5C }}, { NULL, v_mnemonic, "jmp", 0, AF_BYTEADRX|AF_WORDADR, { 0x6E, 0x7E }}, { NULL, v_mnemonic, "jsr", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x9D, 0xAD, 0xBD }}, { NULL, v_mnemonic, "ldaa", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x86, 0x96, 0xA6, 0xB6 }}, { NULL, v_mnemonic, "ldab", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xC6, 0xD6, 0xE6, 0xF6 }}, { NULL, v_mnemonic, "ldd", 0, AF_IMM16|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xCC, 0xDC, 0xEC, 0xFC }}, { NULL, v_mnemonic, "mul", 0, AF_IMP, { 0x3D }}, { NULL, v_mnemonic, "nop", 0, AF_IMP, { 0x01 }}, { NULL, v_mnemonic, "oraa",0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x8A, 0x9A, 0xAA, 0xBA }}, { NULL, v_mnemonic, "orab", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xCA, 0xDA, 0xEA, 0xFA }}, { NULL, v_mnemonic, "psha", 0, AF_IMP, { 0x36 }}, { NULL, v_mnemonic, "pshb", 0, AF_IMP, { 0x37 }}, { NULL, v_mnemonic, "pshx", 0, AF_IMP, { 0x3C }}, { NULL, v_mnemonic, "pulx", 0, AF_IMP, { 0x38 }}, { NULL, v_mnemonic, "pula", 0, AF_IMP, { 0x32 }}, { NULL, v_mnemonic, "pulb", 0, AF_IMP, { 0x33 }}, { NULL, v_mnemonic, "rol", 0, AF_BYTEADRX|AF_WORDADR, { 0x69, 0x79 }}, { NULL, v_mnemonic, "rola", 0, AF_IMP, { 0x49 }}, { NULL, v_mnemonic, "rolb", 0, AF_IMP, { 0x59 }}, { NULL, v_mnemonic, "ror", 0, AF_BYTEADRX|AF_WORDADR, { 0x66, 0x76 }}, { NULL, v_mnemonic, "rora", 0, AF_IMP, { 0x46 }}, { NULL, v_mnemonic, "rorb", 0, AF_IMP, { 0x56 }}, { NULL, v_mnemonic, "rti", 0, AF_IMP, { 0x3B }}, { NULL, v_mnemonic, "rts", 0, AF_IMP, { 0x39 }}, { NULL, v_mnemonic, "swi", 0, AF_IMP, { 0x3F }}, { NULL, v_mnemonic, "wai", 0, AF_IMP, { 0x3E }}, { NULL, v_mnemonic, "asl", 0, AF_BYTEADRX|AF_WORDADR, { 0x68, 0x78 }}, { NULL, v_mnemonic, "lsl", 0, AF_BYTEADRX|AF_WORDADR, { 0x68, 0x78 }}, { NULL, v_mnemonic, "asla", 0, AF_IMP, { 0x48 }}, { NULL, v_mnemonic, "aslb", 0, AF_IMP, { 0x58 }}, { NULL, v_mnemonic, "asld", 0, AF_IMP, { 0x05 }}, { NULL, v_mnemonic, "lsla", 0, AF_IMP, { 0x48 }}, /* same thing */ { NULL, v_mnemonic, "lslb", 0, AF_IMP, { 0x58 }}, { NULL, v_mnemonic, "lsld", 0, AF_IMP, { 0x05 }}, { NULL, v_mnemonic, "asr", 0, AF_BYTEADRX|AF_WORDADR, { 0x67, 0x77 }}, { NULL, v_mnemonic, "asra", 0, AF_IMP, { 0x47 }}, { NULL, v_mnemonic, "asrb", 0, AF_IMP, { 0x57 }}, { NULL, v_mnemonic, "cpx", 0, AF_IMM16|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x8C, 0x9C, 0xAC, 0xBC }}, { NULL, v_mnemonic, "dex", 0, AF_IMP, { 0x09 }}, { NULL, v_mnemonic, "des", 0, AF_IMP, { 0x34 }}, { NULL, v_mnemonic, "inx", 0, AF_IMP, { 0x08 }}, { NULL, v_mnemonic, "ins", 0, AF_IMP, { 0x31 }}, { NULL, v_mnemonic, "ldx", 0, AF_IMM16|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xCE, 0xDE, 0xEE, 0xFE }}, { NULL, v_mnemonic, "lds", 0, AF_IMM16|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x8E, 0x9E, 0xAE, 0xBE }}, { NULL, v_mnemonic, "lsr", 0, AF_BYTEADRX|AF_WORDADR, { 0x64, 0x74 }}, { NULL, v_mnemonic, "lsra", 0, AF_IMP, { 0x44 }}, { NULL, v_mnemonic, "lsrb", 0, AF_IMP, { 0x54 }}, { NULL, v_mnemonic, "lsrd", 0, AF_IMP, { 0x04 }}, { NULL, v_mnemonic, "staa", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x97, 0xA7, 0xB7 }}, { NULL, v_mnemonic, "stab", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xD7, 0xE7, 0xF7 }}, { NULL, v_mnemonic, "std", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xDD, 0xED, 0xFD }}, { NULL, v_mnemonic, "sts", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x9F, 0xAF, 0xBF }}, { NULL, v_mnemonic, "stx", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xDF, 0xEF, 0xFF }}, { NULL, v_mnemonic, "suba", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x80, 0x90, 0xA0, 0xB0 }}, { NULL, v_mnemonic, "subb", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xC0, 0xD0, 0xE0, 0xF0 }}, { NULL, v_mnemonic, "subd", 0, AF_IMM16|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x83, 0x93, 0xA3, 0xB3 }}, { NULL, v_mnemonic, "sba", 0, AF_IMP, { 0x10 }}, { NULL, v_mnemonic, "sbca", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x82, 0x92, 0xA2, 0xB2 }}, { NULL, v_mnemonic, "sbcb", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0xC2, 0xD2, 0xE2, 0xF2 }}, { NULL, v_mnemonic, "tab", 0, AF_IMP, { 0x16 }}, { NULL, v_mnemonic, "tba", 0, AF_IMP, { 0x17 }}, { NULL, v_mnemonic, "tst", 0, AF_BYTEADRX|AF_WORDADR, { 0x6D, 0x7D }}, { NULL, v_mnemonic, "tsta", 0, AF_IMP, { 0x4D }}, { NULL, v_mnemonic, "tstb", 0, AF_IMP, { 0x5D }}, { NULL, v_mnemonic, "tsx", 0, AF_IMP, { 0x30 }}, { NULL, v_mnemonic, "txs", 0, AF_IMP, { 0x35 }}, MNEMONIC_NULL }; MNEMONIC MneHD6303[] = { { NULL, v_mnemonic, "slp", 0, AF_IMP, { 0x1A }}, { NULL, v_mnemonic, "xgdx", 0, AF_IMP, { 0x18 }}, /* [phf] these are broken and fixing them would require major surgery, see BUGS file */ { NULL, v_mnemonic, "aim", 0, AF_BYTEADR|AF_BYTEADRX, { 0x71, 0x61 }}, { NULL, v_mnemonic, "oim", 0, AF_BYTEADR|AF_BYTEADRX, { 0x72, 0x62 }}, { NULL, v_mnemonic, "eim", 0, AF_BYTEADR|AF_BYTEADRX, { 0x75, 0x65 }}, { NULL, v_mnemonic, "tim", 0, AF_BYTEADR|AF_BYTEADRX, { 0x7B, 0x6B }}, MNEMONIC_NULL }; dasm-2.20.14.1/src/mne6502.c000066400000000000000000000161441375233463600150140ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * MNE6502.C */ #include "asm.h" #define ASTD AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|\ AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY MNEMONIC Mne6502[] = { { NULL, v_mnemonic, "adc", 0, AF_IMM8|ASTD, { 0x69, 0x65, 0x75, 0x6D, 0x7D, 0x79, 0x61, 0x71 } }, { NULL, v_mnemonic, "anc", 0, AF_IMM8, { 0x0b } }, { NULL, v_mnemonic, "and", 0, AF_IMM8|ASTD, { 0x29, 0x25, 0x35, 0x2D, 0x3D, 0x39, 0x21, 0x31 } }, { NULL, v_mnemonic, "ane", 0, AF_IMM8, { 0x8b } }, { NULL, v_mnemonic, "arr", 0, AF_IMM8, { 0x6b } }, { NULL, v_mnemonic, "asl", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX, { 0x0A, 0x06, 0x16, 0x0E, 0x1E } }, { NULL, v_mnemonic, "asr", 0, AF_IMM8, { 0x4b } }, { NULL, v_mnemonic, "bcc", 0, AF_REL, { 0x90 } }, { NULL, v_mnemonic, "bcs", 0, AF_REL, { 0xB0 } }, { NULL, v_mnemonic, "beq", 0, AF_REL, { 0xF0 } }, { NULL, v_mnemonic, "bit", 0, AF_BYTEADR|AF_WORDADR, { 0x24, 0x2C } }, { NULL, v_mnemonic, "bmi", 0, AF_REL, { 0x30 } }, { NULL, v_mnemonic, "bne", 0, AF_REL, { 0xD0 } }, { NULL, v_mnemonic, "bpl", 0, AF_REL, { 0x10 } }, { NULL, v_mnemonic, "brk", 0, AF_IMP, { 0x00 } }, { NULL, v_mnemonic, "bvc", 0, AF_REL, { 0x50 } }, { NULL, v_mnemonic, "bvs", 0, AF_REL, { 0x70 } }, { NULL, v_mnemonic, "clc", 0, AF_IMP, { 0x18 } }, { NULL, v_mnemonic, "cld", 0, AF_IMP, { 0xD8 } }, { NULL, v_mnemonic, "cli", 0, AF_IMP, { 0x58 } }, { NULL, v_mnemonic, "clv", 0, AF_IMP, { 0xB8 } }, { NULL, v_mnemonic, "cmp", 0, AF_IMM8|ASTD, { 0xC9, 0xC5, 0xD5, 0xCD, 0xDD, 0xD9, 0xC1, 0xD1 } }, { NULL, v_mnemonic, "cpx", 0, AF_IMM8|AF_BYTEADR|AF_WORDADR, { 0xE0, 0xE4, 0xEC } }, { NULL, v_mnemonic, "cpy", 0, AF_IMM8|AF_BYTEADR|AF_WORDADR, { 0xC0, 0xC4, 0xCC } }, { NULL, v_mnemonic, "dcp", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY, { 0xc7, 0xd7, 0xcf, 0xdf, 0xdb, 0xc3, 0xd3 } }, { NULL, v_mnemonic, "dec", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX, { 0xC6, 0xD6, 0xCE, 0xDE } }, { NULL, v_mnemonic, "dex", 0, AF_IMP, { 0xCA } }, { NULL, v_mnemonic, "dey", 0, AF_IMP, { 0x88 } }, { NULL, v_mnemonic, "eor", 0, AF_IMM8|ASTD, { 0x49, 0x45, 0x55, 0x4D, 0x5D, 0x59, 0x41,0x51 } }, { NULL, v_mnemonic, "inc", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX, { 0xE6, 0xF6, 0xEE, 0xFE } }, { NULL, v_mnemonic, "inx", 0, AF_IMP, { 0xE8 } }, { NULL, v_mnemonic, "iny", 0, AF_IMP, { 0xC8 } }, { NULL, v_mnemonic, "isb", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY, { 0xe7, 0xf7, 0xef, 0xff, 0xfb, 0xe3, 0xf3 } }, { NULL, v_mnemonic, "jmp", 0, AF_WORDADR|AF_INDWORD, { 0x4C, 0x6C } }, { NULL, v_mnemonic, "jsr", 0, AF_WORDADR, { 0x20 } }, { NULL, v_mnemonic, "las", 0, AF_WORDADRY, { 0xbb } }, { NULL, v_mnemonic, "lax", 0, AF_BYTEADR|AF_BYTEADRY|AF_WORDADR|AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY, { 0xa7, 0xb7, 0xaf, 0xbf, 0xa3, 0xb3 } }, { NULL, v_mnemonic, "lda", 0, AF_IMM8|ASTD, { 0xA9, 0xA5, 0xB5, 0xAD, 0xBD, 0xB9, 0xA1, 0xB1 } }, { NULL, v_mnemonic, "ldx", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRY|AF_WORDADR|AF_WORDADRY, { 0xA2, 0xA6, 0xB6, 0xAE, 0xBE } }, { NULL, v_mnemonic, "ldy", 0, AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX, { 0xA0, 0xA4, 0xB4, 0xAC, 0xBC } }, { NULL, v_mnemonic, "lsr", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX, { 0x4A, 0x46, 0x56, 0x4E, 0x5E } }, { NULL, v_mnemonic, "lxa", 0, AF_IMM8, { 0xab } }, { NULL, v_mnemonic, "nop", 0, AF_IMP|AF_IMM8|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX, { 0xEA, 0x80, 0x04, 0x14, 0x0c, 0x1c } }, { NULL, v_mnemonic, "ora", 0, AF_IMM8|ASTD, { 0x09, 0x05, 0x15, 0x0D, 0x1D, 0x19, 0x01, 0x11 } }, { NULL, v_mnemonic, "pha", 0, AF_IMP, { 0x48 } }, { NULL, v_mnemonic, "php", 0, AF_IMP, { 0x08 } }, { NULL, v_mnemonic, "pla", 0, AF_IMP, { 0x68 } }, { NULL, v_mnemonic, "plp", 0, AF_IMP, { 0x28 } }, { NULL, v_mnemonic, "rla", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY, { 0x27, 0x37, 0x2f, 0x3f, 0x3b, 0x23, 0x33 } }, { NULL, v_mnemonic, "rol", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX, { 0x2A, 0x26, 0x36, 0x2E, 0x3E } }, { NULL, v_mnemonic, "ror", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX, { 0x6A, 0x66, 0x76, 0x6E, 0x7E } }, { NULL, v_mnemonic, "rra", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY, { 0x67, 0x77, 0x6f, 0x7f, 0x7b, 0x63, 0x73 } }, { NULL, v_mnemonic, "rti", 0, AF_IMP, { 0x40 } }, { NULL, v_mnemonic, "rts", 0, AF_IMP, { 0x60 } }, { NULL, v_mnemonic, "sax", 0, AF_BYTEADR|AF_BYTEADRY|AF_WORDADR|AF_INDBYTEX, { 0x87, 0x97, 0x8f, 0x83 } }, { NULL, v_mnemonic, "sbc", 0, AF_IMM8|ASTD, { 0xE9, 0xE5, 0xF5, 0xED, 0xFD, 0xF9, 0xE1, 0xF1 } }, { NULL, v_mnemonic, "sbx", 0, AF_IMM8, { 0xcb } }, { NULL, v_mnemonic, "sec", 0, AF_IMP, { 0x38 } }, { NULL, v_mnemonic, "sed", 0, AF_IMP, { 0xF8 } }, { NULL, v_mnemonic, "sei", 0, AF_IMP, { 0x78 } }, { NULL, v_mnemonic, "sha", 0, AF_WORDADRY|AF_INDBYTEY, { 0x9f, 0x93 } }, { NULL, v_mnemonic, "shs", 0, AF_WORDADRY, { 0x9b } }, { NULL, v_mnemonic, "shx", 0, AF_WORDADRY, { 0x9e } }, { NULL, v_mnemonic, "shy", 0, AF_WORDADRX, { 0x9c } }, { NULL, v_mnemonic, "slo", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY, { 0x07, 0x17, 0x0f, 0x1f, 0x1b, 0x03, 0x13 } }, { NULL, v_mnemonic, "sre", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|AF_WORDADRY|AF_INDBYTEX|AF_INDBYTEY, { 0x47, 0x57, 0x4f, 0x5f, 0x5b, 0x43, 0x53 } }, { NULL, v_mnemonic, "sta", 0, ASTD, { 0x85, 0x95, 0x8D, 0x9D, 0x99, 0x81, 0x91 } }, { NULL, v_mnemonic, "stx", 0, AF_BYTEADR|AF_BYTEADRY|AF_WORDADR, { 0x86, 0x96, 0x8E } }, { NULL, v_mnemonic, "sty", 0, AF_BYTEADR|AF_BYTEADRX|AF_WORDADR, { 0x84, 0x94, 0x8C } }, { NULL, v_mnemonic, "tax", 0, AF_IMP, { 0xAA } }, { NULL, v_mnemonic, "tay", 0, AF_IMP, { 0xA8 } }, { NULL, v_mnemonic, "tsx", 0, AF_IMP, { 0xBA } }, { NULL, v_mnemonic, "txa", 0, AF_IMP, { 0x8A } }, { NULL, v_mnemonic, "txs", 0, AF_IMP, { 0x9A } }, { NULL, v_mnemonic, "tya", 0, AF_IMP, { 0x98 } }, MNEMONIC_NULL }; dasm-2.20.14.1/src/mne6811.c000066400000000000000000000255101375233463600150140ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * MNE6811.C * * 68HC11 processor * * addressing modes: * AF_IMM8 * AF_IMM16 * AF_BYTEADR * AF_WORDADR * AF_BYTEADRX * AF_BYTEADRY * AF_IMP * AF_REL * * flags: * MF_MASK contains additional byte argument * MF_REL contains additional relative argument */ #include "asm.h" #define AF_STD (AF_BYTEADR|AF_BYTEADRX|AF_BYTEADRY|AF_WORDADR) #define AF_STDI (AF_IMM8|AF_STD) #define AF_STDD (AF_IMM16|AF_STD) #define AF_ASL (AF_BYTEADRX|AF_BYTEADRY|AF_WORDADR) #define AF_BCLR (AF_BYTEADR|AF_BYTEADRX|AF_BYTEADRY) MNEMONIC Mne68HC11[] = { { NULL, v_mnemonic, "aba", 0, AF_IMP, { 0x1B } }, { NULL, v_mnemonic, "abx", 0, AF_IMP, { 0x3A } }, { NULL, v_mnemonic, "aby", 0, AF_IMP, { 0x183A } }, { NULL, v_mnemonic, "adca", 0, AF_STDI,{ 0x89, 0x99, 0xA9, 0x18A9, 0xB9 } }, { NULL, v_mnemonic, "adcb", 0, AF_STDI,{ 0xC9, 0xD9, 0xE9, 0x18E9, 0xF9 } }, { NULL, v_mnemonic, "adda", 0, AF_STDI,{ 0x8B, 0x9B, 0xAB, 0x18AB, 0xBB } }, { NULL, v_mnemonic, "addb", 0, AF_STDI,{ 0xCB, 0xDB, 0xEB, 0x18EB, 0xFB } }, { NULL, v_mnemonic, "addd", 0, AF_STDD,{ 0xC3, 0xD3, 0xE3, 0x18E3, 0xF3 } }, { NULL, v_mnemonic, "anda", 0, AF_STDI,{ 0x84, 0x94, 0xA4, 0x18A4, 0xB4 } }, { NULL, v_mnemonic, "andb", 0, AF_STDI,{ 0xC4, 0xD4, 0xE4, 0x18E4, 0xF4 } }, { NULL, v_mnemonic, "asla", 0, AF_IMP, { 0x48 } }, { NULL, v_mnemonic, "aslb", 0, AF_IMP, { 0x58 } }, { NULL, v_mnemonic, "asl", 0, AF_ASL, { 0x68, 0x1868, 0x78 } }, { NULL, v_mnemonic, "asld", 0, AF_IMP, { 0x05 } }, { NULL, v_mnemonic, "asra", 0, AF_IMP, { 0x47 } }, { NULL, v_mnemonic, "asrb", 0, AF_IMP, { 0x57 } }, { NULL, v_mnemonic, "asr", 0, AF_ASL, { 0x67, 0x1867, 0x77 } }, /* no asrd */ { NULL, v_mnemonic, "bcc", 0, AF_REL, { 0x24 } }, { NULL, v_mnemonic, "bclr", MF_MASK, AF_BCLR, { 0x15, 0x1D, 0x181D } }, { NULL, v_mnemonic, "bcs", 0, AF_REL, { 0x25 } }, { NULL, v_mnemonic, "beq", 0, AF_REL, { 0x27 } }, { NULL, v_mnemonic, "bge", 0, AF_REL, { 0x2C } }, { NULL, v_mnemonic, "bgt", 0, AF_REL, { 0x2E } }, { NULL, v_mnemonic, "bhi", 0, AF_REL, { 0x22 } }, { NULL, v_mnemonic, "bhs", 0, AF_REL, { 0x24 } }, { NULL, v_mnemonic, "bita", 0, AF_STDI,{ 0x85, 0x95, 0xA5, 0x18A5, 0xB5 } }, { NULL, v_mnemonic, "bitb", 0, AF_STDI,{ 0xC5, 0xD5, 0xE5, 0x18E5, 0xF5 } }, { NULL, v_mnemonic, "ble", 0, AF_REL, { 0x2F } }, { NULL, v_mnemonic, "blo", 0, AF_REL, { 0x25 } }, { NULL, v_mnemonic, "bls", 0, AF_REL, { 0x23 } }, { NULL, v_mnemonic, "blt", 0, AF_REL, { 0x2D } }, { NULL, v_mnemonic, "bmi", 0, AF_REL, { 0x2B } }, { NULL, v_mnemonic, "bne", 0, AF_REL, { 0x26 } }, { NULL, v_mnemonic, "bpl", 0, AF_REL, { 0x2A } }, { NULL, v_mnemonic, "bra", 0, AF_REL, { 0x20 } }, { NULL, v_mnemonic, "brclr", MF_MASK|MF_REL, AF_BCLR,{ 0x13, 0x1F, 0x181F } }, { NULL, v_mnemonic, "brn", 0, AF_REL, { 0x21 } }, { NULL, v_mnemonic, "brset", MF_MASK|MF_REL, AF_BCLR,{ 0x12, 0x1E, 0x181E } }, { NULL, v_mnemonic, "bset", MF_MASK, AF_BCLR, { 0x14, 0x1C, 0x181C } }, { NULL, v_mnemonic, "bsr", 0, AF_REL, { 0x8D } }, { NULL, v_mnemonic, "bvc", 0, AF_REL, { 0x28 } }, { NULL, v_mnemonic, "bvs", 0, AF_REL, { 0x29 } }, { NULL, v_mnemonic, "cba", 0, AF_IMP, { 0x11 } }, { NULL, v_mnemonic, "clc", 0, AF_IMP, { 0x0C } }, { NULL, v_mnemonic, "cli", 0, AF_IMP, { 0x0E } }, { NULL, v_mnemonic, "clra", 0, AF_IMP, { 0x4F } }, { NULL, v_mnemonic, "clrb", 0, AF_IMP, { 0x5F } }, { NULL, v_mnemonic, "clr", 0, AF_ASL, { 0x6F, 0x186F, 0x7F } }, { NULL, v_mnemonic, "clv", 0, AF_IMP, { 0x0A } }, { NULL, v_mnemonic, "cmpa", 0, AF_STDI,{ 0x81, 0x91, 0xA1, 0x18A1, 0xB1 } }, { NULL, v_mnemonic, "cmpb", 0, AF_STDI,{ 0xC1, 0xD1, 0xE1, 0x18E1, 0xF1 } }, { NULL, v_mnemonic, "coma", 0, AF_IMP, { 0x43 } }, { NULL, v_mnemonic, "comb", 0, AF_IMP, { 0x53 } }, { NULL, v_mnemonic, "com", 0, AF_ASL, { 0x63, 0x1863, 0x73 } }, { NULL, v_mnemonic, "cpd", 0, AF_STDD,{ 0x1A83, 0x1A93, 0x1AA3, 0xCDA3, 0x1AB3 } }, { NULL, v_mnemonic, "cpx", 0, AF_STDD,{ 0x8C, 0x9C, 0xAC, 0xCDAC, 0xBC } }, { NULL, v_mnemonic, "cpy", 0, AF_STDD,{ 0x188C, 0x189C, 0x1AAC, 0x18AC, 0x18BC } }, { NULL, v_mnemonic, "daa", 0, AF_IMP, { 0x19 } }, { NULL, v_mnemonic, "deca", 0, AF_IMP, { 0x4A } }, { NULL, v_mnemonic, "decb", 0, AF_IMP, { 0x5A } }, { NULL, v_mnemonic, "dec", 0, AF_ASL, { 0x6A, 0x186A, 0x7A } }, { NULL, v_mnemonic, "des", 0, AF_IMP, { 0x34 } }, { NULL, v_mnemonic, "dex", 0, AF_IMP, { 0x09 } }, { NULL, v_mnemonic, "dey", 0, AF_IMP, { 0x1809 } }, { NULL, v_mnemonic, "eora", 0, AF_STDI,{ 0x88, 0x98, 0xA8, 0x18A8, 0xB8 } }, { NULL, v_mnemonic, "eorb", 0, AF_STDI,{ 0xC8, 0xD8, 0xE8, 0x18E8, 0xF8 } }, { NULL, v_mnemonic, "fdiv", 0, AF_IMP, { 0x03 } }, { NULL, v_mnemonic, "idiv", 0, AF_IMP, { 0x02 } }, { NULL, v_mnemonic, "inca", 0, AF_IMP, { 0x4C } }, { NULL, v_mnemonic, "incb", 0, AF_IMP, { 0x5C } }, { NULL, v_mnemonic, "inc", 0, AF_ASL, { 0x6C, 0x186C, 0x7C } }, { NULL, v_mnemonic, "ins", 0, AF_IMP, { 0x31 } }, { NULL, v_mnemonic, "inx", 0, AF_IMP, { 0x08 } }, { NULL, v_mnemonic, "iny", 0, AF_IMP, { 0x1808 } }, { NULL, v_mnemonic, "jmp", 0, AF_ASL, { 0x6E, 0x186E, 0x7E } }, { NULL, v_mnemonic, "jsr", 0, AF_STD, { 0x9D, 0xAD, 0x18AD, 0xBD } }, { NULL, v_mnemonic, "ldaa", 0, AF_STDI,{ 0x86, 0x96, 0xA6, 0x18A6, 0xB6 } }, { NULL, v_mnemonic, "ldab", 0, AF_STDI,{ 0xC6, 0xD6, 0xE6, 0x18E6, 0xF6 } }, { NULL, v_mnemonic, "ldd", 0, AF_STDD,{ 0xCC, 0xDC, 0xEC, 0x18EC, 0xFC } }, { NULL, v_mnemonic, "lds", 0, AF_STDD,{ 0x8E, 0x9E, 0xAE, 0x18AE, 0xBE } }, { NULL, v_mnemonic, "ldx", 0, AF_STDD,{ 0xCE, 0xDE, 0xEE, 0xCDEE, 0xFE } }, { NULL, v_mnemonic, "ldy", 0, AF_STDD,{ 0x18CE, 0x18DE, 0x1AEE, 0x18EE, 0x18FE } }, { NULL, v_mnemonic, "lsla", 0, AF_IMP, { 0x48 } }, { NULL, v_mnemonic, "lslb", 0, AF_IMP, { 0x58 } }, { NULL, v_mnemonic, "lsl", 0, AF_ASL, { 0x68, 0x1868, 0x78 } }, { NULL, v_mnemonic, "lsld", 0, AF_IMP, { 0x05 } }, { NULL, v_mnemonic, "lsra", 0, AF_IMP, { 0x44 } }, { NULL, v_mnemonic, "lsrb", 0, AF_IMP, { 0x54 } }, { NULL, v_mnemonic, "lsr", 0, AF_ASL, { 0x64, 0x1864, 0x74 } }, { NULL, v_mnemonic, "lsrd", 0, AF_IMP, { 0x04 } }, { NULL, v_mnemonic, "mul", 0, AF_IMP, { 0x3D } }, { NULL, v_mnemonic, "nega", 0, AF_IMP, { 0x40 } }, { NULL, v_mnemonic, "negb", 0, AF_IMP, { 0x50 } }, { NULL, v_mnemonic, "neg", 0, AF_ASL, { 0x60, 0x1860, 0x70 } }, { NULL, v_mnemonic, "nop", 0, AF_IMP, { 0x01 } }, { NULL, v_mnemonic, "oraa", 0, AF_STDI,{ 0x8A, 0x9A, 0xAA, 0x18AA, 0xBA } }, { NULL, v_mnemonic, "orab", 0, AF_STDI,{ 0xCA, 0xDA, 0xEA, 0x18EA, 0xFA } }, { NULL, v_mnemonic, "psha", 0, AF_IMP, { 0x36 } }, { NULL, v_mnemonic, "pshb", 0, AF_IMP, { 0x37 } }, { NULL, v_mnemonic, "pshx", 0, AF_IMP, { 0x3C } }, { NULL, v_mnemonic, "pshy", 0, AF_IMP, { 0x183C } }, { NULL, v_mnemonic, "pula", 0, AF_IMP, { 0x32 } }, { NULL, v_mnemonic, "pulb", 0, AF_IMP, { 0x33 } }, { NULL, v_mnemonic, "pulx", 0, AF_IMP, { 0x38 } }, { NULL, v_mnemonic, "puly", 0, AF_IMP, { 0x1838 } }, { NULL, v_mnemonic, "rola", 0, AF_IMP, { 0x49 } }, { NULL, v_mnemonic, "rolb", 0, AF_IMP, { 0x59 } }, { NULL, v_mnemonic, "rol", 0, AF_ASL, { 0x69, 0x1869, 0x79 } }, { NULL, v_mnemonic, "rora", 0, AF_IMP, { 0x46 } }, { NULL, v_mnemonic, "rorb", 0, AF_IMP, { 0x56 } }, { NULL, v_mnemonic, "ror", 0, AF_ASL, { 0x66, 0x1866, 0x76 } }, { NULL, v_mnemonic, "rti", 0, AF_IMP, { 0x3B } }, { NULL, v_mnemonic, "rts", 0, AF_IMP, { 0x39 } }, { NULL, v_mnemonic, "sba", 0, AF_IMP, { 0x10 } }, { NULL, v_mnemonic, "sbca", 0, AF_STDI,{ 0x82, 0x92, 0xA2, 0x18A2, 0xB2 } }, { NULL, v_mnemonic, "sbcb", 0, AF_STDI,{ 0xC2, 0xD2, 0xE2, 0x18E2, 0xF2 } }, { NULL, v_mnemonic, "sec", 0, AF_IMP, { 0x0D } }, { NULL, v_mnemonic, "sei", 0, AF_IMP, { 0x0F } }, { NULL, v_mnemonic, "sev", 0, AF_IMP, { 0x0B } }, { NULL, v_mnemonic, "staa", 0, AF_STD, { 0x97, 0xA7, 0x18A7, 0xB7 } }, { NULL, v_mnemonic, "stab", 0, AF_STD, { 0xD7, 0xE7, 0x18E7, 0xF7 } }, { NULL, v_mnemonic, "std", 0, AF_STD, { 0xDD, 0xED, 0x18ED, 0xFD } }, { NULL, v_mnemonic, "stop", 0, AF_IMP, { 0xCF } }, { NULL, v_mnemonic, "sts", 0, AF_STD, { 0x9F, 0xAF, 0x18AF, 0xBF } }, { NULL, v_mnemonic, "stx", 0, AF_STD, { 0xDF, 0xEF, 0xCDEF, 0xFF } }, { NULL, v_mnemonic, "sty", 0, AF_STD, { 0x18DF, 0x1AEF, 0x18EF, 0x18FF } }, { NULL, v_mnemonic, "suba", 0, AF_STDI,{ 0x80, 0x90, 0xA0, 0x18A0, 0xB0 } }, { NULL, v_mnemonic, "subb", 0, AF_STDI,{ 0xC0, 0xD0, 0xE0, 0x18E0, 0xF0 } }, { NULL, v_mnemonic, "subd", 0, AF_STDD,{ 0x83, 0x93, 0xA3, 0x18A3, 0xB3 } }, { NULL, v_mnemonic, "swi", 0, AF_IMP, { 0x3F } }, { NULL, v_mnemonic, "tab", 0, AF_IMP, { 0x16 } }, { NULL, v_mnemonic, "tap", 0, AF_IMP, { 0x06 } }, { NULL, v_mnemonic, "tba", 0, AF_IMP, { 0x17 } }, { NULL, v_mnemonic, "test", 0, AF_IMP, { 0x00 } }, { NULL, v_mnemonic, "tpa", 0, AF_IMP, { 0x07 } }, { NULL, v_mnemonic, "tsta", 0, AF_IMP, { 0x4D } }, { NULL, v_mnemonic, "tstb", 0, AF_IMP, { 0x5D } }, { NULL, v_mnemonic, "tst", 0, AF_ASL, { 0x6D, 0x186D, 0x7D } }, { NULL, v_mnemonic, "tsx", 0, AF_IMP, { 0x30 } }, { NULL, v_mnemonic, "tsy", 0, AF_IMP, { 0x1830 } }, { NULL, v_mnemonic, "txs", 0, AF_IMP, { 0x35 } }, { NULL, v_mnemonic, "tys", 0, AF_IMP, { 0x1835 } }, { NULL, v_mnemonic, "wai", 0, AF_IMP, { 0x3E } }, { NULL, v_mnemonic, "xgdx", 0, AF_IMP, { 0x8F } }, { NULL, v_mnemonic, "xgdy", 0, AF_IMP, { 0x188F } }, MNEMONIC_NULL }; dasm-2.20.14.1/src/mne68705.c000066400000000000000000000156201375233463600151070ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * MNE68705.C */ #include "asm.h" #define AFSTD AF_BYTEADR|AF_BYTEADRX|AF_WORDADR|AF_WORDADRX|AF_0X MNEMONIC Mne68705[] = { { NULL, v_mnemonic, "adc", 0, AF_IMM8|AFSTD, { 0xA9, 0xB9, 0xE9, 0xC9, 0xD9, 0xF9 } }, { NULL, v_mnemonic, "add", 0, AF_IMM8|AFSTD, { 0xAB, 0xBB, 0xEB, 0xCB, 0xDB, 0xFB } }, { NULL, v_mnemonic, "and", 0, AF_IMM8|AFSTD, { 0xA4, 0xB4, 0xE4, 0xC4, 0xD4, 0xF4 } }, { NULL, v_mnemonic, "asl", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x48, 0x38, 0x68, 0x78 } }, { NULL, v_mnemonic, "asla", 0,AF_IMP, { 0x48 } }, { NULL, v_mnemonic, "aslx", 0,AF_IMP, { 0x58 } }, { NULL, v_mnemonic, "asr", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x47, 0x37, 0x67, 0x77 } }, { NULL, v_mnemonic, "asra", 0,AF_IMP, { 0x47 } }, { NULL, v_mnemonic, "asrx", 0,AF_IMP, { 0x57 } }, { NULL, v_mnemonic, "bcc", 0, AF_REL, { 0x24 } }, { NULL, v_mnemonic, "bclr", MF_IMOD,AF_BITMOD, { 0x11 } }, { NULL, v_mnemonic, "bcs", 0, AF_REL, { 0x25 } }, { NULL, v_mnemonic, "beq", 0, AF_REL, { 0x27 } }, { NULL, v_mnemonic, "bhcc", 0,AF_REL, { 0x28 } }, { NULL, v_mnemonic, "bhcs", 0,AF_REL, { 0x29 } }, { NULL, v_mnemonic, "bhi", 0, AF_REL, { 0x22 } }, { NULL, v_mnemonic, "bhs", 0, AF_REL, { 0x24 } }, { NULL, v_mnemonic, "bih", 0, AF_REL, { 0x2F } }, { NULL, v_mnemonic, "bil", 0, AF_REL, { 0x2E } }, { NULL, v_mnemonic, "bit", 0, AF_IMM8|AFSTD, { 0xA5, 0xB5, 0xE5, 0xC5, 0xD5, 0xF5 } }, { NULL, v_mnemonic, "blo", 0, AF_REL, { 0x25 } }, { NULL, v_mnemonic, "bls", 0, AF_REL, { 0x23 } }, { NULL, v_mnemonic, "bmc", 0, AF_REL, { 0x2C } }, { NULL, v_mnemonic, "bmi", 0, AF_REL, { 0x2B } }, { NULL, v_mnemonic, "bms", 0, AF_REL, { 0x2D } }, { NULL, v_mnemonic, "bne", 0, AF_REL, { 0x26 } }, { NULL, v_mnemonic, "bpl", 0, AF_REL, { 0x2A } }, { NULL, v_mnemonic, "bra", 0, AF_REL, { 0x20 } }, { NULL, v_mnemonic, "brn", 0, AF_REL, { 0x21 } }, { NULL, v_mnemonic, "brclr", MF_IMOD|MF_REL, AF_BITBRAMOD, { 0x01 } }, { NULL, v_mnemonic, "brset", MF_IMOD|MF_REL, AF_BITBRAMOD, { 0x00 } }, { NULL, v_mnemonic, "bset", MF_IMOD,AF_BITMOD, { 0x10 } }, { NULL, v_mnemonic, "bsr", 0, AF_REL, { 0xAD } }, { NULL, v_mnemonic, "clc", 0, AF_IMP, { 0x98 } }, { NULL, v_mnemonic, "cli", 0, AF_IMP, { 0x9A } }, { NULL, v_mnemonic, "clr", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x4F, 0x3F, 0x6F, 0x7F } }, { NULL, v_mnemonic, "clra", 0,AF_IMP, { 0x4F } }, { NULL, v_mnemonic, "clrx", 0,AF_IMP, { 0x5F } }, { NULL, v_mnemonic, "cmp", 0, AF_IMM8|AFSTD, { 0xA1, 0xB1, 0xE1, 0xC1, 0xD1, 0xF1 } }, { NULL, v_mnemonic, "com", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x43, 0x33, 0x63, 0x73 } }, { NULL, v_mnemonic, "coma", 0,AF_IMP, { 0x43 } }, { NULL, v_mnemonic, "comx", 0,AF_IMP, { 0x53 } }, { NULL, v_mnemonic, "cpx", 0, AF_IMM8|AFSTD, { 0xA3, 0xB3, 0xE3, 0xC3, 0xD3, 0xF3 } }, { NULL, v_mnemonic, "dec", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x4A, 0x3A, 0x6A, 0x7A } }, { NULL, v_mnemonic, "deca", 0,AF_IMP, { 0x4A } }, { NULL, v_mnemonic, "decx", 0,AF_IMP, { 0x5A } }, { NULL, v_mnemonic, "dex", 0, AF_IMP, { 0x5A } }, { NULL, v_mnemonic, "eor", 0, AF_IMM8|AFSTD, { 0xA8, 0xB8, 0xE8, 0xC8, 0xD8, 0xF8 } }, { NULL, v_mnemonic, "inc", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x4C, 0x3C, 0x6C, 0x7C } }, { NULL, v_mnemonic, "inca", 0,AF_IMP, { 0x4C } }, { NULL, v_mnemonic, "incx", 0,AF_IMP, { 0x5C } }, { NULL, v_mnemonic, "inx", 0, AF_IMP, { 0x5C } }, { NULL, v_mnemonic, "jmp", 0, AFSTD, { 0xBC, 0xEC, 0xCC, 0xDC, 0xFC } }, { NULL, v_mnemonic, "jsr", 0, AFSTD, { 0xBD, 0xED, 0xCD, 0xDD, 0xFD } }, { NULL, v_mnemonic, "lda", 0, AF_IMM8|AFSTD, { 0xA6, 0xB6, 0xE6, 0xC6, 0xD6, 0xF6 } }, { NULL, v_mnemonic, "ldx", 0, AF_IMM8|AFSTD, { 0xAE, 0xBE, 0xEE, 0xCE, 0xDE, 0xFE } }, { NULL, v_mnemonic, "lsl", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x48, 0x38, 0x68, 0x78 } }, { NULL, v_mnemonic, "lsla", 0,AF_IMP, { 0x48 } }, { NULL, v_mnemonic, "lslx", 0,AF_IMP, { 0x58 } }, { NULL, v_mnemonic, "lsr", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x44, 0x34, 0x64, 0x74 } }, { NULL, v_mnemonic, "lsra", 0,AF_IMP, { 0x44 } }, { NULL, v_mnemonic, "lsrx", 0,AF_IMP, { 0x54 } }, { NULL, v_mnemonic, "neg", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x40, 0x30, 0x60, 0x70 } }, { NULL, v_mnemonic, "nega", 0,AF_IMP, { 0x40 } }, { NULL, v_mnemonic, "negx", 0,AF_IMP, { 0x50 } }, { NULL, v_mnemonic, "nop", 0, AF_IMP, { 0x9D } }, { NULL, v_mnemonic, "ora", 0, AF_IMM8|AFSTD, { 0xAA, 0xBA, 0xEA, 0xCA, 0xDA, 0xFA } }, { NULL, v_mnemonic, "rol", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x49, 0x39, 0x69, 0x79 } }, { NULL, v_mnemonic, "rola", 0,AF_IMP, { 0x49 } }, { NULL, v_mnemonic, "rolx", 0,AF_IMP, { 0x59 } }, { NULL, v_mnemonic, "ror", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x46, 0x36, 0x66, 0x76 } }, { NULL, v_mnemonic, "rora", 0,AF_IMP, { 0x46 } }, { NULL, v_mnemonic, "rorx", 0,AF_IMP, { 0x56 } }, { NULL, v_mnemonic, "rsp", 0, AF_IMP, { 0x9C } }, { NULL, v_mnemonic, "rti", 0, AF_IMP, { 0x80 } }, { NULL, v_mnemonic, "rts", 0, AF_IMP, { 0x81 } }, { NULL, v_mnemonic, "sbc", 0, AF_IMM8|AFSTD, { 0xA2, 0xB2, 0xE2, 0xC2, 0xD2, 0xF2 } }, { NULL, v_mnemonic, "sec", 0, AF_IMP, { 0x99 } }, { NULL, v_mnemonic, "sei", 0, AF_IMP, { 0x9B } }, { NULL, v_mnemonic, "sta", 0, AFSTD, { 0xB7, 0xE7, 0xC7, 0xD7, 0xF7 } }, { NULL, v_mnemonic, "stx", 0, AFSTD, { 0xBF, 0xEF, 0xCF, 0xDF, 0xFF } }, { NULL, v_mnemonic, "sub", 0, AF_IMM8|AFSTD, { 0xA0, 0xB0, 0xE0, 0xC0, 0xD0, 0xF0 } }, { NULL, v_mnemonic, "swi", 0, AF_IMP, { 0x83 } }, { NULL, v_mnemonic, "tax", 0, AF_IMP, { 0x97 } }, { NULL, v_mnemonic, "tst", 0, AF_IMP|AF_BYTEADR|AF_BYTEADRX|AF_0X, { 0x4D, 0x3D, 0x6D, 0x7D } }, { NULL, v_mnemonic, "tsta", 0,AF_IMP, { 0x4D } }, { NULL, v_mnemonic, "tstx", 0,AF_IMP, { 0x5D } }, { NULL, v_mnemonic, "txa", 0, AF_IMP, { 0x9F } }, MNEMONIC_NULL }; dasm-2.20.14.1/src/mne68908.c000066400000000000000000000222151375233463600151120ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * MNE68908.C * based on MNE68705.C Thomas Pantzer, 2003-06-18 */ #include "asm.h" #define AFSTD (AF_BYTEADR | AF_BYTEADRX | AF_WORDADR | AF_WORDADRX | AF_0X) #define AF_BCLR (AF_BYTEADR|AF_BYTEADRX|AF_BYTEADRY) #define AF_HMASK (AF_IMM8 | AF_BYTEADR | AF_BYTEADRX | AF_WORDADR | AF_WORDADRX | AF_0X | AF_BYTEADR_SP | AF_WORDADR_SP) #define AF_IMASK (AF_BYTEADR| AF_BYTEADRX| AF_0X| AF_BYTEADR_SP) MNEMONIC Mne68908[] = { { NULL, v_mnemonic, "adc", 0, AF_HMASK, { 0xA9, 0xB9, 0xE9, 0xC9, 0xD9, 0xF9, 0x9EE9, 0x9ED9 } }, { NULL, v_mnemonic, "add", 0, AF_HMASK, { 0xAB, 0xBB, 0xEB, 0xCB, 0xDB, 0xFB, 0x9EEB, 0x9EDB } }, { NULL, v_mnemonic, "ais", 0, AF_IMM8, { 0xa7 } }, { NULL, v_mnemonic, "aix", 0, AF_IMM8, { 0xaf } }, { NULL, v_mnemonic, "and", 0, AF_HMASK, { 0xA4, 0xB4, 0xE4, 0xC4, 0xD4, 0xF4, 0x9EE4, 0x9ED4 } }, { NULL, v_mnemonic, "asl", 0, AF_IMASK, { 0x38, 0x68, 0x78, 0x9E68 } }, { NULL, v_mnemonic, "asla", 0,AF_IMP, { 0x48 } }, { NULL, v_mnemonic, "aslx", 0,AF_IMP, { 0x58 } }, { NULL, v_mnemonic, "asr", 0, AF_IMASK, { 0x37, 0x67, 0x77, 0x9E67 } }, { NULL, v_mnemonic, "asra", 0,AF_IMP, { 0x47 } }, { NULL, v_mnemonic, "asrx", 0,AF_IMP, { 0x57 } }, { NULL, v_mnemonic, "bcc", 0, AF_REL, { 0x24 } }, { NULL, v_mnemonic, "bclr", MF_IMOD,AF_BITMOD, { 0x11 } }, { NULL, v_mnemonic, "bcs", 0, AF_REL, { 0x25 } }, { NULL, v_mnemonic, "beq", 0, AF_REL, { 0x27 } }, { NULL, v_mnemonic, "bge", 0, AF_REL, { 0x90 } }, { NULL, v_mnemonic, "bgt", 0, AF_REL, { 0x92 } }, { NULL, v_mnemonic, "bhcc", 0,AF_REL, { 0x28 } }, { NULL, v_mnemonic, "bhcs", 0,AF_REL, { 0x29 } }, { NULL, v_mnemonic, "bhi", 0, AF_REL, { 0x22 } }, { NULL, v_mnemonic, "bhs", 0, AF_REL, { 0x24 } }, { NULL, v_mnemonic, "bih", 0, AF_REL, { 0x2F } }, { NULL, v_mnemonic, "bil", 0, AF_REL, { 0x2E } }, { NULL, v_mnemonic, "bit", 0, AF_HMASK, { 0xA5, 0xB5, 0xE5, 0xC5, 0xD5, 0xF5, 0x9EE5, 0x9ED5 } }, { NULL, v_mnemonic, "ble", 0, AF_REL, { 0x93 } }, { NULL, v_mnemonic, "blo", 0, AF_REL, { 0x25 } }, { NULL, v_mnemonic, "bls", 0, AF_REL, { 0x23 } }, { NULL, v_mnemonic, "blt", 0, AF_REL, { 0x91 } }, { NULL, v_mnemonic, "bmc", 0, AF_REL, { 0x2C } }, { NULL, v_mnemonic, "bmi", 0, AF_REL, { 0x2B } }, { NULL, v_mnemonic, "bms", 0, AF_REL, { 0x2D } }, { NULL, v_mnemonic, "bne", 0, AF_REL, { 0x26 } }, { NULL, v_mnemonic, "bpl", 0, AF_REL, { 0x2A } }, { NULL, v_mnemonic, "bra", 0, AF_REL, { 0x20 } }, { NULL, v_mnemonic, "brclr", MF_IMOD|MF_REL, AF_BITBRAMOD, { 0x01 } }, { NULL, v_mnemonic, "brn", 0, AF_REL, { 0x21 } }, { NULL, v_mnemonic, "brset", MF_IMOD|MF_REL, AF_BITBRAMOD, { 0x00 } }, { NULL, v_mnemonic, "bset", MF_IMOD,AF_BITMOD, { 0x10 } }, { NULL, v_mnemonic, "bsr", 0, AF_REL, { 0xAD } }, { NULL, v_mnemonic, "cbeqa", MF_MASK, AF_REL, { 0x41 } }, { NULL, v_mnemonic, "cbeq", MF_REL, (AF_BYTEADR | AF_INDBYTEX | AF_0X | AF_BYTEADR_SP), { 0x31, 0x61, 0x71, 0x9E61 } }, { NULL, v_mnemonic, "cbeqx", MF_MASK, AF_REL, { 0x51 } }, { NULL, v_mnemonic, "clc", 0, AF_IMP, { 0x98 } }, { NULL, v_mnemonic, "cli", 0, AF_IMP, { 0x9A } }, { NULL, v_mnemonic, "clr", 0, AF_IMASK, { 0x3F, 0x6F, 0x7F, 0x9E6F } }, { NULL, v_mnemonic, "clra", 0,AF_IMP, { 0x4F } }, { NULL, v_mnemonic, "clrh", 0,AF_IMP, { 0x8C } }, { NULL, v_mnemonic, "clrx", 0,AF_IMP, { 0x5F } }, { NULL, v_mnemonic, "cmp", 0, AF_HMASK, { 0xA1, 0xB1, 0xE1, 0xC1, 0xD1, 0xF1, 0x9EE1, 0x9ED1 } }, { NULL, v_mnemonic, "com", 0, AF_IMASK, { 0x33, 0x63, 0x73, 0x9e63 } }, { NULL, v_mnemonic, "coma", 0,AF_IMP, { 0x43 } }, { NULL, v_mnemonic, "comx", 0,AF_IMP, { 0x53 } }, { NULL, v_mnemonic, "cphx", 0, AF_IMM16|AF_BYTEADR, { 0x65 , 0x75} }, { NULL, v_mnemonic, "cpx", 0, AF_HMASK, { 0xA3, 0xB3, 0xE3, 0xC3, 0xD3, 0xF3, 0x9EE3, 0x9ED3 } }, { NULL, v_mnemonic, "daa", 0, AF_IMP, { 0x72 } }, { NULL, v_mnemonic, "dbnz", MF_REL, (AF_BYTEADR | AF_BYTEADRX | AF_0X | AF_BYTEADR_SP), { 0x3B, 0x6B, 0x7B, 0x9E6B } }, { NULL, v_mnemonic, "dbnza", 0, AF_REL, { 0x4b } }, { NULL, v_mnemonic, "dbnzx", 0, AF_REL, { 0x5b } }, { NULL, v_mnemonic, "dec", 0, AF_IMASK, { 0x3A, 0x6A, 0x7A, 0x9E6A } }, { NULL, v_mnemonic, "deca", 0,AF_IMP, { 0x4A } }, { NULL, v_mnemonic, "decx", 0,AF_IMP, { 0x5A } }, { NULL, v_mnemonic, "div", 0, AF_IMP, { 0x52 } }, { NULL, v_mnemonic, "eor", 0, AF_HMASK, { 0xA8, 0xB8, 0xE8, 0xC8, 0xD8, 0xF8, 0x9EE8, 0x9ED8 } }, { NULL, v_mnemonic, "inc", 0, AF_IMASK, { 0x3C, 0x6C, 0x7C, 0x9E6C } }, { NULL, v_mnemonic, "inca", 0,AF_IMP, { 0x4C } }, { NULL, v_mnemonic, "incx", 0,AF_IMP, { 0x5C } }, { NULL, v_mnemonic, "jmp", 0, AFSTD, { 0xBC, 0xEC, 0xCC, 0xDC, 0xFC } }, { NULL, v_mnemonic, "jsr", 0, AFSTD, { 0xBD, 0xED, 0xCD, 0xDD, 0xFD } }, { NULL, v_mnemonic, "lda", 0, AF_HMASK, { 0xA6, 0xB6, 0xE6, 0xC6, 0xD6, 0xF6, 0x9EE6, 0x9ED6 } }, { NULL, v_mnemonic, "ldhx", 0, AF_IMM16|AF_BYTEADR, { 0x45, 0x55 } }, { NULL, v_mnemonic, "ldx", 0, AF_HMASK, { 0xAE, 0xBE, 0xEE, 0xCE, 0xDE, 0xFE, 0x9EEE, 0x9EDE } }, { NULL, v_mnemonic, "lsl", 0, AF_IMASK, { 0x38, 0x68, 0x78, 0x9E68 } }, { NULL, v_mnemonic, "lsla", 0,AF_IMP, { 0x48 } }, { NULL, v_mnemonic, "lslx", 0,AF_IMP, { 0x58 } }, { NULL, v_mnemonic, "lsr", 0, AF_IMASK, { 0x34, 0x64, 0x74, 0x9E64 } }, { NULL, v_mnemonic, "lsra", 0,AF_IMP, { 0x44 } }, { NULL, v_mnemonic, "lsrx", 0,AF_IMP, { 0x54 } }, { NULL, v_mnemonic, "mov", MF_MASK, AF_IMM8|AF_BYTEADR, {0x6e, 0x4e} }, { NULL, v_mnemonic, "movp", 0, AF_BYTEADRX, {0x5e} }, { NULL, v_mnemonic, "xmov", 0, AF_BYTEADR, {0x7e} }, { NULL, v_mnemonic, "mul", 0, AF_IMP, { 0x42 } }, { NULL, v_mnemonic, "neg", 0, AF_IMASK, { 0x30, 0x60, 0x70, 0x9E60 } }, { NULL, v_mnemonic, "nega", 0,AF_IMP, { 0x40 } }, { NULL, v_mnemonic, "negx", 0,AF_IMP, { 0x50 } }, { NULL, v_mnemonic, "nsa", 0, AF_IMP, { 0x62 } }, { NULL, v_mnemonic, "nop", 0, AF_IMP, { 0x9D } }, { NULL, v_mnemonic, "ora", 0, AF_HMASK, { 0xAA, 0xBA, 0xEA, 0xCA, 0xDA, 0xFA, 0x9EEA, 0x9EDA } }, { NULL, v_mnemonic, "psha", 0, AF_IMP, { 0x87 } }, { NULL, v_mnemonic, "pshh", 0, AF_IMP, { 0x8b } }, { NULL, v_mnemonic, "pshx", 0, AF_IMP, { 0x89 } }, { NULL, v_mnemonic, "pula", 0, AF_IMP, { 0x86 } }, { NULL, v_mnemonic, "pulh", 0, AF_IMP, { 0x8a } }, { NULL, v_mnemonic, "pulx", 0, AF_IMP, { 0x88 } }, { NULL, v_mnemonic, "rol", 0, AF_IMASK, { 0x39, 0x69, 0x79, 0x9E69 } }, { NULL, v_mnemonic, "rola", 0,AF_IMP, { 0x49 } }, { NULL, v_mnemonic, "rolx", 0,AF_IMP, { 0x59 } }, { NULL, v_mnemonic, "ror", 0, AF_IMASK, { 0x36, 0x66, 0x76, 0x9E66 } }, { NULL, v_mnemonic, "rora", 0,AF_IMP, { 0x46 } }, { NULL, v_mnemonic, "rorx", 0,AF_IMP, { 0x56 } }, { NULL, v_mnemonic, "rsp", 0, AF_IMP, { 0x9C } }, { NULL, v_mnemonic, "rti", 0, AF_IMP, { 0x80 } }, { NULL, v_mnemonic, "rts", 0, AF_IMP, { 0x81 } }, { NULL, v_mnemonic, "sbc", 0, AF_HMASK , { 0xA2, 0xB2, 0xE2, 0xC2, 0xD2, 0xF2, 0x9EE2, 0x9ED2 } }, { NULL, v_mnemonic, "sec", 0, AF_IMP, { 0x99 } }, { NULL, v_mnemonic, "sei", 0, AF_IMP, { 0x9B } }, { NULL, v_mnemonic, "sta", 0, AFSTD|AF_BYTEADR_SP|AF_WORDADR_SP, { 0xB7, 0xE7, 0xC7, 0xD7, 0xF7, 0x9EE7, 0x9ED7 } }, { NULL, v_mnemonic, "sthx", 0, AF_BYTEADR, { 0x35 } }, { NULL, v_mnemonic, "stop", 0, AF_IMP, { 0x8E } }, { NULL, v_mnemonic, "stx", 0, AFSTD|AF_BYTEADR_SP|AF_WORDADR_SP, { 0xBF, 0xEF, 0xCF, 0xDF, 0xFF, 0x9EEF, 0x9EDF } }, { NULL, v_mnemonic, "sub", 0, AF_HMASK, { 0xA0, 0xB0, 0xE0, 0xC0, 0xD0, 0xF0, 0x9EE0, 0x9ED0 } }, { NULL, v_mnemonic, "swi", 0, AF_IMP, { 0x83 } }, { NULL, v_mnemonic, "tap", 0, AF_IMP, { 0x84 } }, { NULL, v_mnemonic, "tax", 0, AF_IMP, { 0x97 } }, { NULL, v_mnemonic, "thxs", 0, AF_IMP, { 0x94 } }, { NULL, v_mnemonic, "tpa", 0, AF_IMP, { 0x85 } }, { NULL, v_mnemonic, "tshx", 0, AF_IMP, { 0x95 } }, { NULL, v_mnemonic, "tst", 0, AF_IMASK, {0x3D, 0x6D, 0x7D, 0x9e6D } }, { NULL, v_mnemonic, "tsta", 0,AF_IMP, { 0x4D } }, { NULL, v_mnemonic, "tstx", 0,AF_IMP, { 0x5D } }, { NULL, v_mnemonic, "txa", 0, AF_IMP, { 0x9F } }, { NULL, v_mnemonic, "wait", 0, AF_IMP, { 0x8F } }, MNEMONIC_NULL }; dasm-2.20.14.1/src/mnef8.c000066400000000000000000000461141375233463600147350ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * MNEF8.C * * Fairchild F8 support code for DASM * Copyright (c) 2004 by Thomas Mathys. */ #include #include #include "asm.h" /* * special registers. must use numbers from 16 and up, * since numbers below 16 are used for scratchpad registers. * * there is no REG_J, since J is really just scratchpad register 9. */ enum REGISTERS { REG_A = 16, REG_DC0, REG_H, REG_IS, REG_K, REG_KU, REG_KL, REG_PC0, REG_PC1, REG_Q, REG_QU, REG_QL, REG_W, REG_NONE, }; /* * used to print error messages. * mnename and opstring are copied into a single error message, * which is passed to asmerr. * * err : error code (ERROR_xxx constant, passed to asmerr) * mnename : name of the mnemonic * opstring : operand string * abort : false = don't abort assembly * true = abort assembly */ static void f8err(int err, const char *mnename, const char *opstring, bool bAbort) { char *buf; buf = ckmalloc(strlen(mnename) + strlen(opstring) + 64); strcpy(buf, mnename); strcat(buf, " "); strcat(buf, opstring); asmerr(err, bAbort, buf); free(buf); } /* * emits a one byte opcode. */ static void emit_opcode1(unsigned char opcode) { Glen = 1; Gen[0] = opcode; generate(); } /* * emits a two byte opcode * * byte0 : first byte (lower address) * byte1 : second byte (higher address) */ static void emit_opcode2(unsigned char byte0, unsigned char byte1) { Glen = 2; Gen[0] = byte0; Gen[1] = byte1; generate(); } /* * emits a three byte opcode * * byte0 : first byte (lowest address) * byte1 : second byte (middle address) * byte2 : third byte (highest address) */ static void emit_opcode3(unsigned char byte0, unsigned char byte1, unsigned char byte2) { Glen = 3; Gen[0] = byte0; Gen[1] = byte1; Gen[2] = byte2; generate(); } /* * check wether the current program counter is known. * * result : zero = current program counter is unknown * nonzero = current program counter is known */ static int isPCKnown(void) { unsigned char pcf; pcf= (Csegment->flags & SF_RORG) ? Csegment->rflags : Csegment->flags; return ((pcf & (SF_UNKNOWN|2)) == 0) ? 1 : 0; } /* * returns the current program counter */ static long getPC(void) { return (Csegment->flags & SF_RORG) ? Csegment->rorg : Csegment->org; } /* * attempts to parse a 32 bit unsigned value from a string. * * str : string to parse the value from * value : parsed value is stored here * * result : zero = ok or syntax error * nonzero = unresolved expression */ static int parse_value(char *str, unsigned long *value) { SYMBOL *sym; int result = 0; *value = 0; sym = eval(str, 0); if (NULL != sym->next || AM_BYTEADR != sym->addrmode) { asmerr(ERROR_SYNTAX_ERROR, true, str); } else if (sym->flags & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_MNEMONIC_NOT_RESOLVED; result = 1; } else { *value = sym->value; } FreeSymbolList(sym); return result; } /* * attempts to parse a scratchpad register name. * register numbers are parsed as expressions. * if an expression is invalid, asmerr is called * and the assembly aborted. * * accepts the following input: * * - numbers 0..14 (as expressions, numbers 12-14 map to S, I and D) * - J (alias for register 9) * - HU (alias for register 10) * - HL (alias for register 11) * - S and (IS) * - I and (IS)+ * - D and (IS)- * * str : string to parse the scratchpad register from * reg : parsed scratchpad register is stored here. * this is the value which will become the lower * nibble of the opcodes. * * result : zero = ok or syntax error * nonzero = unresolved expression */ static int parse_scratchpad_register(char *str, unsigned char *reg) { unsigned long regnum; /* parse special cases where ISAR is used as index */ if (!strcasecmp("s", str) || !strcasecmp("(is)", str)) { *reg = 0x0c; return 0; } if (!strcasecmp("i", str) || !strcasecmp("(is)+", str)) { *reg = 0x0d; return 0; } if (!strcasecmp("d", str) || !strcasecmp("(is)-", str)) { *reg = 0x0e; return 0; } /* parse aliases for scratchpad registers */ if (!strcasecmp("j", str)) { *reg = 0x09; return 0; } if (!strcasecmp("hu", str)) { *reg = 0x0a; return 0; } if (!strcasecmp("hl", str)) { *reg = 0x0b; return 0; } /* parse register number */ if (parse_value(str, ®num)) { return 1; /* unresolved expr */ } else { if (regnum > 14) { asmerr(ERROR_VALUE_MUST_BE_LT_F, true, str); } *reg = regnum; return 0; } } /* * attempts to parse a special register name from str * * result : one of the REG_xxx constants (possibly also REG_NONE) */ static int parse_special_register(char *str) { if (!strcasecmp("a", str)) { return REG_A; } if (!strcasecmp("dc0", str) || !strcasecmp("dc", str) ) { return REG_DC0; } if (!strcasecmp("h", str)) { return REG_H; } if (!strcasecmp("is", str)) { return REG_IS; } if (!strcasecmp("k", str)) { return REG_K; } if (!strcasecmp("ku", str)) { return REG_KU; } if (!strcasecmp("kl", str)) { return REG_KL; } if (!strcasecmp("pc0", str) || !strcasecmp("p0", str)) { return REG_PC0; } if (!strcasecmp("pc1", str) || !strcasecmp("p", str)) { return REG_PC1; } if (!strcasecmp("q", str)) { return REG_Q; } if (!strcasecmp("qu", str)) { return REG_QU; } if (!strcasecmp("ql", str)) { return REG_QL; } if (!strcasecmp("w", str)) { return REG_W; } else { return REG_NONE; } } static void v_ins_outs(char *str, MNEMONIC *mne) { unsigned long operand; programlabel(); parse_value(str, &operand); if (operand > 15) { f8err(ERROR_VALUE_MUST_BE_LT_10, mne->name, str, false); } emit_opcode1(mne->opcode[0] | (operand & 15)); } static void v_sl_sr(char *str, MNEMONIC *mne) { unsigned long operand; programlabel(); if (parse_value(str, &operand)) { /* unresolved expression, reserve space */ emit_opcode1(0); } else { switch (operand) { case 1: emit_opcode1(mne->opcode[0]); break; case 4: emit_opcode1(mne->opcode[0] + 2); break; default: f8err(ERROR_VALUE_MUST_BE_1_OR_4, mne->name, str, false); emit_opcode1(0); break; } } } static void v_lis(char *str, MNEMONIC *mne) { unsigned long operand; programlabel(); parse_value(str, &operand); if (operand > 15) { f8err(ERROR_VALUE_MUST_BE_LT_10, mne->name, str, false); } emit_opcode1(0x70 | (operand & 15)); } static void v_lisu_lisl(char *str, MNEMONIC *mne) { unsigned long operand; programlabel(); parse_value(str, &operand); if (operand > 7) { f8err(ERROR_VALUE_MUST_BE_LT_8, mne->name, str, false); } emit_opcode1(mne->opcode[0] | (operand & 7)); } /* * handles opcodes with a scratchpad register operand: * as, asd, ds, ns, xs */ static void v_sreg_op(char *str, MNEMONIC *mne) { unsigned char reg; programlabel(); parse_scratchpad_register(str, ®); emit_opcode1(mne->opcode[0] | reg); } static void v_lr(char *str, MNEMONIC *mne) { int i; int ncommas; int cindex; char *op1; char *op2; unsigned char reg_dst; unsigned char reg_src; int opcode; programlabel(); /* a valid operand string must contain exactly one comma. find it. */ ncommas = 0; cindex = 0; for (i=0; str[i]; i++) { if (',' == str[i]) { ncommas++; cindex = i; } } if (1 != ncommas) { f8err(ERROR_SYNTAX_ERROR, mne->name, str, false); return; } /* extract operand strings */ str[cindex] = 0; op1 = str; op2 = &str[cindex+1]; if ( (0 != cindex) && (isspace(str[cindex-1])) ) { str[cindex-1] = 0; } if (isspace(*op2)) { op2++; } /* parse operand strings for register names */ reg_dst = parse_special_register(op1); if (REG_NONE == reg_dst) { if (parse_scratchpad_register(op1, ®_dst)) { /* unresolved expression, reserve space */ emit_opcode1(0); return; } } reg_src = parse_special_register(op2); if (REG_NONE == reg_src) { if (parse_scratchpad_register(op2, ®_src)) { /* unresolved expression, reserve space */ emit_opcode1(0); return; } } /* restore operand string */ str[cindex] = ','; if ( (0 != cindex) && (0 == str[cindex-1])) { str[cindex-1] = ' '; } /* generate opcode */ opcode = -1; switch (reg_dst) { case REG_A: /* lr a,xxx */ switch (reg_src) { case REG_IS: opcode = 0x0a; break; case REG_KL: opcode = 0x01; break; case REG_KU: opcode = 0x00; break; case REG_QL: opcode = 0x03; break; case REG_QU: opcode = 0x02; break; default: if (reg_src < 15) { opcode = 0x40 | reg_src; } break; } break; case REG_DC0: switch (reg_src) { case REG_H: opcode = 0x10; break; case REG_Q: opcode = 0x0f; break; } break; case REG_H: if (REG_DC0 == reg_src) opcode = 0x11; break; case REG_IS: if (REG_A == reg_src) opcode = 0x0b; break; case REG_K: if (REG_PC1 == reg_src) opcode = 0x08; break; case REG_KL: if (REG_A == reg_src) opcode = 0x05; break; case REG_KU: if (REG_A == reg_src) opcode = 0x04; break; case REG_PC0: if (REG_Q == reg_src) opcode = 0x0d; break; case REG_PC1: if (REG_K == reg_src) opcode = 0x09; break; case REG_Q: if (REG_DC0 == reg_src) opcode = 0x0e; break; case REG_QL: if (REG_A == reg_src) opcode = 0x07; break; case REG_QU: if (REG_A == reg_src) opcode = 0x06; break; case REG_W: if (0x09 == reg_src) opcode = 0x1d; break; default: /* lr sreg,xxx*/ if ( (15 > reg_dst) && (REG_A == reg_src) ) { /* lr sreg,a */ opcode = 0x50 | reg_dst; } else if ( (9 == reg_dst) && (REG_W == reg_src) ) { /* special case : lr j,w */ opcode = 0x1e; } break; } if (opcode < 0) { f8err(ERROR_ILLEGAL_OPERAND_COMBINATION, mne->name, str, true); } else { emit_opcode1(opcode); } } extern int pass; /* * generates branch opcodes * * opcode : opcode of the branch (for instance 0x8f for BR7) * str : operand string */ static void generate_branch(unsigned char opcode, char *str) { unsigned long target_adr; long disp; programlabel(); /* get target address */ if (parse_value(str, &target_adr)) { /* unresolved target address, reserve space */ emit_opcode2(0, 0); return; } /* calculate displacement */ if (isPCKnown()) { disp = target_adr - getPC() - 1; if (disp > 127 || disp < -128) { char buf[64]; sprintf(buf, "%d", (int)disp); asmerr(ERROR_BRANCH_OUT_OF_RANGE, false, buf); } } else { /* unknown pc, will be (hopefully) resolved in future passes */ disp = 0; } emit_opcode2(opcode, disp & 255); } /* * handles the following branch mnemonics: * bc, bm, bnc, bno, bnz, bp, br, br7, bz */ static void v_branch(char *str, MNEMONIC *mne) { generate_branch(mne->opcode[0], str); } static void v_bf_bt(char *str, MNEMONIC *mne) { int ncommas; int cindex; int i; char *op1; char *op2; unsigned long value; /* a valid operand string must contain exactly one comma. find it. */ ncommas = 0; cindex = 0; for (i=0; str[i]; i++) { if (',' == str[i]) { ncommas++; cindex = i; } } if (1 != ncommas) { f8err(ERROR_SYNTAX_ERROR, mne->name, str, false); return; } /* extract operands */ str[cindex] = 0; op1 = str; op2 = &str[cindex+1]; /* parse first operand*/ if (parse_value(op1, &value)) { /* unresolved expression, reserve space */ emit_opcode2(0, 0); return; } /* check first operand */ str[cindex] = ','; /* restore operand string */ if ('f' == mne->name[1]) { /* bf */ if (value > 15) { f8err(ERROR_VALUE_MUST_BE_LT_10, mne->name, str, false); value &= 15; } } else { /* bt */ if (value > 7) { f8err(ERROR_VALUE_MUST_BE_LT_8, mne->name, str, false); value &= 7; } } generate_branch(mne->opcode[0] | value, op2); } /* * handles instructions that take a word operand: * dci, jmp, pi */ static void v_wordop(char *str, MNEMONIC *mne) { unsigned long value; programlabel(); parse_value(str, &value); if (value > 0xffff) { f8err(ERROR_VALUE_MUST_BE_LT_10000, mne->name, str, false); } emit_opcode3(mne->opcode[0], (value >> 8) & 0xff, value & 0xff); } /* * handles instructions that take a byte operand: * ai, ci, in, li, ni, oi, out, xi */ static void v_byteop(char *str, MNEMONIC *mne) { unsigned long value; programlabel(); parse_value(str, &value); if (value > 0xff) { f8err(ERROR_ADDRESS_MUST_BE_LT_100, mne->name, str, false); } emit_opcode2(mne->opcode[0], value & 0xff); } MNEMONIC MneF8[] = { /* ds is an f8 opcode, so we replace the ds directive by res */ {NULL, v_ds, "res", 0, 0, {0,}}, /* add db/dw/dd directives for f8tool compatibility */ {NULL, v_dc, "db", 0, 0, {0,}}, {NULL, v_dc, "dw", 0, 0, {0,}}, {NULL, v_dc, "dd", 0, 0, {0,}}, /* * f8 opcodes * * some instructions have AF_IMP in der addressflag, although * they are handled by own handlers and have explicit operands. * this is to keep dasm from clearing the opcode array when * adding the hashtable. * * the only instructions that are handled by v_mnemonic are * those with implicit operands. * * other f8 instructions have register operands, which v_mnemonic * can't handle. * * or they have byte and word operands (values or addresses). * these could theoretically be handled by v_mnemonic, but * we do it ourselves anyway, since this allows us to have * expressions with parentheses as operands. */ {NULL, v_mnemonic, "adc", 0, AF_IMP, {0x8e}}, {NULL, v_byteop, "ai" , 0, AF_IMP, {0x24}}, {NULL, v_mnemonic, "am" , 0, AF_IMP, {0x88}}, {NULL, v_mnemonic, "amd", 0, AF_IMP, {0x89}}, {NULL, v_sreg_op, "as" , 0, AF_IMP, {0xc0}}, /* base opcode */ {NULL, v_sreg_op, "asd", 0, AF_IMP, {0xd0}}, /* base opcode */ {NULL, v_branch, "bc" , 0, AF_IMP, {0x82}}, {NULL, v_bf_bt, "bf" , 0, AF_IMP, {0x90}}, /* base opcode */ {NULL, v_branch, "bm" , 0, AF_IMP, {0x91}}, {NULL, v_branch, "bnc", 0, AF_IMP, {0x92}}, {NULL, v_branch, "bno", 0, AF_IMP, {0x98}}, {NULL, v_branch, "bnz", 0, AF_IMP, {0x94}}, {NULL, v_branch, "bp" , 0, AF_IMP, {0x81}}, {NULL, v_branch, "br" , 0, AF_IMP, {0x90}}, {NULL, v_branch, "br7", 0, AF_IMP, {0x8f}}, {NULL, v_bf_bt, "bt" , 0, AF_IMP, {0x80}}, /* base opcode */ {NULL, v_branch, "bz" , 0, AF_IMP, {0x84}}, {NULL, v_byteop, "ci" , 0, AF_IMP, {0x25}}, {NULL, v_mnemonic, "clr", 0, AF_IMP, {0x70}}, {NULL, v_mnemonic, "cm" , 0, AF_IMP, {0x8d}}, {NULL, v_mnemonic, "com", 0, AF_IMP, {0x18}}, {NULL, v_wordop, "dci", 0, AF_IMP, {0x2a}}, {NULL, v_mnemonic, "di" , 0, AF_IMP, {0x1a}}, {NULL, v_sreg_op, "ds" , 0, AF_IMP, {0x30}}, /* base opcode */ {NULL, v_mnemonic, "ei" , 0, AF_IMP, {0x1b}}, {NULL, v_byteop, "in" , 0, AF_IMP, {0x26}}, {NULL, v_mnemonic, "inc", 0, AF_IMP, {0x1f}}, {NULL, v_ins_outs, "ins", 0, AF_IMP, {0xa0}}, /* base opcode */ {NULL, v_wordop, "jmp", 0, AF_IMP, {0x29}}, {NULL, v_byteop, "li" , 0, AF_IMP, {0x20}}, {NULL, v_lis, "lis", 0, 0, {0,}}, {NULL, v_lisu_lisl,"lisl",0, AF_IMP, {0x68}}, /* base opcode */ {NULL, v_lisu_lisl,"lisu",0, AF_IMP, {0x60}}, /* base opcode */ {NULL, v_mnemonic, "lm" , 0, AF_IMP, {0x16}}, {NULL, v_mnemonic, "lnk", 0, AF_IMP, {0x19}}, {NULL, v_lr, "lr" , 0, 0, {0,}}, {NULL, v_byteop, "ni" , 0, AF_IMP, {0x21}}, {NULL, v_mnemonic, "nm" , 0, AF_IMP, {0x8a}}, {NULL, v_mnemonic, "nop", 0, AF_IMP, {0x2b}}, {NULL, v_sreg_op, "ns" , 0, AF_IMP, {0xf0}}, /* base opcode */ {NULL, v_byteop, "oi" , 0, AF_IMP, {0x22}}, {NULL, v_mnemonic, "om" , 0, AF_IMP, {0x8b}}, {NULL, v_byteop, "out", 0, AF_IMP, {0x27}}, {NULL, v_ins_outs, "outs",0, AF_IMP, {0xb0}}, /* base opcode */ {NULL, v_wordop, "pi" , 0, AF_IMP, {0x28}}, {NULL, v_mnemonic, "pk" , 0, AF_IMP, {0x0c}}, {NULL, v_mnemonic, "pop", 0, AF_IMP, {0x1c}}, {NULL, v_sl_sr, "sl" , 0, AF_IMP, {0x13}}, /* base opcode for "sl 1" */ {NULL, v_sl_sr, "sr" , 0, AF_IMP, {0x12}}, /* base opcode for "sr 1" */ {NULL, v_mnemonic, "st" , 0, AF_IMP, {0x17}}, {NULL, v_mnemonic, "xdc", 0, AF_IMP, {0x2c}}, {NULL, v_byteop, "xi" , 0, AF_IMP, {0x23}}, {NULL, v_mnemonic, "xm" , 0, AF_IMP, {0x8c}}, {NULL, v_sreg_op, "xs" , 0, AF_IMP, {0xe0}}, /* base opcode */ MNEMONIC_NULL }; dasm-2.20.14.1/src/ops.c000066400000000000000000001275471375233463600145330ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * OPS.C * * Handle mnemonics and pseudo ops */ #include "asm.h" unsigned char Gen[MAXLINE]; unsigned char OrgFill = DEFORGFILL; int Glen; extern MNEMONIC Mne6502[]; extern MNEMONIC Mne6803[]; extern MNEMONIC MneHD6303[]; extern MNEMONIC Mne68705[]; extern MNEMONIC Mne68HC11[]; extern MNEMONIC MneF8[]; extern MNEMONIC Mne68908[]; void generate(void); void genfill(long fill, long bytes, int size); void pushif(bool xbool); int gethexdig(int c); /* * An opcode modifies the SEGMENT flags in the following ways: */ void v_processor(char *str, MNEMONIC *dummy) { static bool bCalled = false; unsigned long PreviousProcessor = Processor; Processor = 0; if (strcmp(str,"6502") == 0) { if ( !bCalled ) addhashtable(Mne6502); MsbOrder = 0; /* lsb,msb */ Processor = 6502; } if (strcmp(str,"6803") == 0) { if ( !bCalled ) addhashtable(Mne6803); MsbOrder = 1; /* msb,lsb */ Processor = 6803; } if (strcmp(str,"HD6303") == 0 || strcmp(str, "hd6303") == 0) { if ( !bCalled ) { addhashtable(Mne6803); addhashtable(MneHD6303); } MsbOrder = 1; /* msb,lsb */ Processor = 6303; } if (strcmp(str,"68705") == 0) { if ( !bCalled ) addhashtable(Mne68705); MsbOrder = 1; /* msb,lsb */ Processor = 68705; } if (strcmp(str,"68HC11") == 0 || strcmp(str, "68hc11") == 0) { if ( !bCalled ) addhashtable(Mne68HC11); MsbOrder = 1; /* msb,lsb */ Processor = 6811; } if (strcmp(str,"F8") == 0 || strcmp(str, "f8") == 0) { if ( !bCalled ) addhashtable(MneF8); MsbOrder = 1; Processor = 0xf8; } if ((strcmp(str,"68908") == 0) || (strcmp(str,"68hc908") == 0)) { if ( !bCalled ) { addhashtable(Mne68908); } MsbOrder = 1; /* msb,lsb */ Processor = 68908; } bCalled = true; if ( !Processor ) { asmerr( ERROR_PROCESSOR_NOT_SUPPORTED, true, str ); } if ( PreviousProcessor && Processor != PreviousProcessor ) { asmerr( ERROR_ONLY_ONE_PROCESSOR_SUPPORTED, true, str ); } } #define badcode(mne,adrmode) (!(mne->okmask & (1L << adrmode))) extern int pass; extern int nMaxPasses; void v_mnemonic(char *str, MNEMONIC *mne) { int addrmode; SYMBOL *sym; unsigned int opcode; short opidx; SYMBOL *symbase; int opsize; bool byteRequested; char sBuffer[128]; Csegment->flags |= SF_REF; programlabel(); symbase = eval(str, 1); if ( bTrace ) printf("PC: %04lx MNEMONIC: %s addrmode: %d ", Csegment->org, mne->name, symbase->addrmode); for (sym = symbase; sym; sym = sym->next) { if (sym->flags & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_MNEMONIC_NOT_RESOLVED; } } sym = symbase; if (mne->flags & MF_IMOD) { if (sym->next) { sym->addrmode = AM_BITMOD; if ((mne->flags & MF_REL) && sym->next) sym->addrmode = AM_BITBRAMOD; } } addrmode = sym->addrmode; if ((sym->flags & SYM_UNKNOWN) || sym->value >= 0x100) opsize = 2; else opsize = (sym->value) ? 1 : 0; while (badcode(mne,addrmode) && Cvt[addrmode]) addrmode = Cvt[addrmode]; if ( bTrace ) printf("mnemask: %08lx adrmode: %d Cvt[am]: %d Mnext:%d value: %ld\n", mne->okmask, addrmode, Cvt[addrmode], Mnext, sym->value); if (badcode(mne,addrmode)) { sprintf( sBuffer, "%s %s", mne->name, str ); asmerr( ERROR_ILLEGAL_ADDRESSING_MODE, false, sBuffer ); FreeSymbolList(symbase); //FIX ++Redo; Redo_why |= REASON_MNEMONIC_NOT_RESOLVED; return; } if (Mnext >= 0 && Mnext < NUMOC) /* Force */ { addrmode = Mnext; //FIX: OPCODE.FORCE needs to be adjusted for x,y,sp indexing... switch(sym->addrmode) { case AM_INDBYTEX: case AM_INDBYTEY: // there is only INDWORD to force indirect addressing mode but not with X or Y // this must be an error asmerr( ERROR_ILLEGAL_FORCED_ADDRESSING_MODE, false, mne->name ); FreeSymbolList(symbase); //FIX: Cause assembly to fail when an invalid mode is used for an opcode... ++Redo; Redo_why |= REASON_MNEMONIC_NOT_RESOLVED; return; case AM_BYTEADR_SP: addrmode = AM_BYTEADR_SP; if ((Mnext == AM_WORDADR) || (Mnext == AM_WORDADR_SP)) addrmode = AM_WORDADR_SP; break; case AM_0Y: addrmode = AM_0Y; if ((Mnext == AM_WORDADR) || (Mnext == AM_WORDADRY)) addrmode = AM_WORDADRY; if ((Mnext == AM_BYTEADR) || (Mnext == AM_BYTEADRY)) addrmode = AM_BYTEADRY; break; case AM_0X: addrmode = AM_0X; if ((Mnext == AM_WORDADR) || (Mnext == AM_WORDADRX)) addrmode = AM_WORDADRX; if ((Mnext == AM_BYTEADR) || (Mnext == AM_BYTEADRX)) addrmode = AM_BYTEADRX; break; } if (badcode(mne,addrmode)) { asmerr( ERROR_ILLEGAL_FORCED_ADDRESSING_MODE, false, mne->name ); FreeSymbolList(symbase); //FIX: Cause assembly to fail when an invalid mode is used for an opcode... ++Redo; Redo_why |= REASON_MNEMONIC_NOT_RESOLVED; return; } } if ( bTrace ) printf("final addrmode = %d, opsize:%d Opsize[%d]:%d\n", addrmode, opsize, addrmode, Opsize[addrmode]); byteRequested = false; switch(Mnext) { case AM_IMM8: case AM_BYTEADR: case AM_BYTEADRX: case AM_BYTEADRY: case AM_BYTEADR_SP: byteRequested = true; if (opsize > 1) { sprintf( sBuffer, "%s %s, user requested byte mode", mne->name, str ); asmerr( ERROR_ADDRESS_MUST_BE_LT_100, false, sBuffer ); } break; } switch(addrmode) { case AM_IMM16: case AM_WORDADR: case AM_WORDADRX: case AM_WORDADRY: case AM_INDWORD: case AM_WORDADR_SP: if ((sym->value > 0xFFFF) || (sym->value < -0xFFFF)) { // isn't this our space ? sprintf( sBuffer, "%s %s", mne->name, str ); asmerr( ERROR_ADDRESS_MUST_BE_LT_10000, false, sBuffer ); } break; case AM_IMM8: case AM_BYTEADR: case AM_BYTEADRX: case AM_BYTEADRY: case AM_BYTEADR_SP: if (sym->value < -0xFF) { // isn't this our space ? sprintf( sBuffer, "negative %s %s", mne->name, str ); asmerr( ERROR_ADDRESS_MUST_BE_LT_100, false, sBuffer ); } break; } while (opsize > Opsize[addrmode]) { if (Cvt[addrmode] == 0 || badcode(mne,Cvt[addrmode])) { if (sym->flags & SYM_UNKNOWN) break; //FIX: for negative operands... if ( (addrmode == AM_IMM8) && (sym->value <0) ) { opsize=1; sym->value=(char)(sym->value & 255); break; } if ((sym->value > 255) && !byteRequested) { // automatically increasing address-mode only if user has not explicitly stated if (addrmode == AM_BYTEADRX) { if (! badcode(mne, AM_WORDADRX)) { addrmode = AM_WORDADRX; break; } } if (addrmode == AM_BYTEADRY) { if (! badcode(mne, AM_WORDADRY)) { addrmode = AM_WORDADRY; break; } } if (addrmode == AM_BYTEADR_SP) { if (! badcode(mne, AM_WORDADR_SP)) { addrmode = AM_WORDADR_SP; break; } } } sprintf( sBuffer, "%s %s", mne->name, str ); asmerr( ERROR_ADDRESS_MUST_BE_LT_100, false, sBuffer ); break; } addrmode = Cvt[addrmode]; } opcode = mne->opcode[addrmode]; opidx = 1 + (opcode > 0xFF); if (opidx == 2) { Gen[0] = opcode >> 8; Gen[1] = opcode; } else { Gen[0] = opcode; } switch(addrmode) { case AM_BITMOD: sym = symbase->next; if (!(sym->flags & SYM_UNKNOWN) && sym->value >= 0x100) { sprintf( sBuffer, "unknown %s %ld", mne->name, sym->value); asmerr( ERROR_ADDRESS_MUST_BE_LT_100, false, sBuffer ); } Gen[opidx++] = sym->value; if (!(symbase->flags & SYM_UNKNOWN)) { if (symbase->value > 7) asmerr( ERROR_ILLEGAL_BIT_SPECIFICATION, false, str ); else Gen[0] += symbase->value << 1; } break; case AM_BITBRAMOD: if (!(symbase->flags & SYM_UNKNOWN)) { if (symbase->value > 7) asmerr( ERROR_ILLEGAL_BIT_SPECIFICATION, false, str ); else Gen[0] += symbase->value << 1; } sym = symbase->next; if (!(sym->flags & SYM_UNKNOWN) && sym->value >= 0x100) { sprintf( sBuffer, "%s %ld", mne->name, sym->value); asmerr( ERROR_ADDRESS_MUST_BE_LT_100, false, sBuffer ); } Gen[opidx++] = sym->value; sym = sym->next; break; case AM_REL: break; default: if (Opsize[addrmode] > 0) Gen[opidx++] = sym->value; if (Opsize[addrmode] == 2) { if (MsbOrder) { Gen[opidx-1] = sym->value >> 8; Gen[opidx++] = sym->value; } else { Gen[opidx++] = sym->value >> 8; } } sym = sym->next; break; } if (mne->flags & MF_MASK) { if (sym) { if (!(sym->flags & SYM_UNKNOWN) && sym->value >= 0x100) { sprintf( sBuffer, "unknown && > 256 %s %ld", mne->name, sym->value); asmerr( ERROR_ADDRESS_MUST_BE_LT_100, false, sBuffer ); } Gen[opidx] = sym->value; sym = sym->next; } else { asmerr( ERROR_NOT_ENOUGH_ARGS, true, NULL ); } ++opidx; } if ((mne->flags & MF_REL) || addrmode == AM_REL) { ++opidx; /* to end of instruction */ if (!sym) asmerr( ERROR_NOT_ENOUGH_ARGS, true, NULL ); else if (!(sym->flags & SYM_UNKNOWN)) { long pc; unsigned char pcf; long dest; pc = (Csegment->flags & SF_RORG) ? Csegment->rorg : Csegment->org; pcf= (Csegment->flags & SF_RORG) ? Csegment->rflags : Csegment->flags; if ((pcf & (SF_UNKNOWN|2)) == 0) { dest = sym->value - pc - opidx; if (dest >= 128 || dest < -128) { //FIX: sometimes zero page addressing will first be assumed to be absolute until // another pass. ERROR_BRANCH_OUT_OF_RANGE was made non-fatal, but we keep // pushing for Redo so assembly won't actually be succesfull until the branch // actually works. sprintf( sBuffer, "%ld", dest ); asmerr( ERROR_BRANCH_OUT_OF_RANGE, false, sBuffer ); ++Redo; Redo_why |= REASON_BRANCH_OUT_OF_RANGE; sym->flags=sym->flags | SYM_UNKNOWN; dest = 0; } } else { /* Don't bother - we'll take another pass */ dest = 0; } Gen[opidx-1] = dest & 0xFF; /* byte before end of inst. */ } } Glen = opidx; generate(); FreeSymbolList(symbase); } void v_trace(char *str, MNEMONIC *dummy) { bTrace = (str[1] == 'n'); } void v_list(char *str, MNEMONIC *dummy) { programlabel(); Glen = 0; /* Only so outlist() works */ if (strncmp(str, "localoff", 7) == 0 || strncmp(str, "LOCALOFF", 7) == 0) pIncfile->flags |= INF_NOLIST; else if (strncmp(str, "localon", 7) == 0 || strncmp(str, "LOCALON", 7) == 0) pIncfile->flags &= ~INF_NOLIST; else if (strncmp(str, "off", 2) == 0 || strncmp(str, "OFF", 2) == 0) ListMode = 0; else ListMode = 1; } static char * getfilename(char *str) { if (*str == '\"') { char *buf; str++; buf = ckmalloc(strlen(str)+1); strcpy(buf, str); for (str = buf; *str && *str != '\"'; ++str); *str = 0; return buf; } return str; } void v_include(char *str, MNEMONIC *dummy) { SYMBOL *sym; programlabel(); // only eval the string if it's compliant with symbol naming if ((*str<'0')||(*str>'9')) //check could be more comprehensive sym = eval(str, 0); else sym = NULL; if ( (sym) && (sym->flags & SYM_STRING ) ) { pushinclude(sym->string); } else { char *buf; buf = getfilename(str); pushinclude(buf); if (buf != str) free(buf); } if (sym) FreeSymbolList(sym); } void v_incbin(char *str, MNEMONIC *dummy) { char *buf; FILE *binfile; programlabel(); buf = getfilename(str); binfile = pfopen(buf, "rb"); if (binfile) { if (Redo) { /* optimize: don't actually read the file if not needed */ fseek(binfile, 0, SEEK_END); Glen = ftell(binfile); generate(); /* does not access Gen[] if Redo is set */ } else { for (;;) { Glen = fread(Gen, 1, sizeof(Gen), binfile); if (Glen <= 0) break; generate(); } } fclose(binfile); } else { printf("unable to open %s\n", buf); } if (buf != str) free(buf); Glen = 0; /* don't list hexdump */ } void v_seg(char *str, MNEMONIC *dummy) { SEGMENT *seg; for (seg = Seglist; seg; seg = seg->next) { if (strcmp(str, seg->name) == 0) { Csegment = seg; programlabel(); return; } } Csegment = seg = (SEGMENT *)zmalloc(sizeof(SEGMENT)); seg->next = Seglist; seg->name = strcpy(ckmalloc(strlen(str)+1), str); seg->flags= seg->rflags = seg->initflags = seg->initrflags = SF_UNKNOWN; Seglist = seg; if (Mnext == AM_BSS) seg->flags |= SF_BSS; programlabel(); } void v_hex(char *str, MNEMONIC *dummy) { int i; int result; programlabel(); Glen = 0; for (i = 0; str[i]; ++i) { if (str[i] == ' ') continue; result = (gethexdig(str[i]) << 4) + gethexdig(str[i+1]); if (str[++i] == 0) break; Gen[Glen++] = result; } generate(); } int gethexdig(int c) { char sBuffer[64]; if (c >= '0' && c <= '9') return c - '0'; if (c >= 'a' && c <= 'f') return c - 'a' + 10; if (c >= 'A' && c <= 'F') return c - 'A' + 10; sprintf( sBuffer, "Bad Hex Digit %c", c ); asmerr( ERROR_SYNTAX_ERROR, false, sBuffer ); puts("(Must be a valid hex digit)"); if (F_listfile) fputs("(Must be a valid hex digit)\n", FI_listfile); return 0; } void v_err(char *str, MNEMONIC *dummy) { programlabel(); asmerr( ERROR_ERR_PSEUDO_OP_ENCOUNTERED, true, NULL ); exit(1); } void v_dc(char *str, MNEMONIC *mne) { SYMBOL *sym; SYMBOL *tmp; long value; char *macstr = 0; /* "might be used uninitialised" */ char vmode = 0; char sBuffer[128]; /* verbose error messages*/ Glen = 0; programlabel(); /* for byte, .byte, word, .word, long, .long */ if (mne->name[0] != 'd') { static char sTmp[4]; strcpy(sTmp, "x.x"); sTmp[2] = mne->name[0]; findext(sTmp); } /* F8... */ /* db, dw, dd */ if ( (mne->name[0] == 'd') && (mne->name[1] != 'c') && (mne->name[1] != 'v')) { static char sTmp[4]; strcpy(sTmp, "x.x"); if ('d' == mne->name[1]) { sTmp[2] = 'l'; } else { sTmp[2] = mne->name[1]; } findext(sTmp); } /* ...F8 */ if (mne->name[1] == 'v') { int i; vmode = 1; for (i = 0; str[i] && str[i] != ' '; ++i); tmp = findsymbol(str, i); str += i; if (tmp == NULL) { puts("EQM label not found"); return; } if (tmp->flags & SYM_MACRO) { macstr = (void *)tmp->string; } else { puts("must specify EQM label for DV"); return; } } sym = eval(str, 0); for (; sym; sym = sym->next) { value = sym->value; if (sym->flags & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_DC_NOT_RESOVED; } if (sym->flags & SYM_STRING) { unsigned char *ptr = (void *)sym->string; while ((value = *ptr) != 0) { if (vmode) { setspecial(value, 0); tmp = eval(macstr, 0); value = tmp->value; if (tmp->flags & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_DV_NOT_RESOLVED_PROBABLY; } FreeSymbolList(tmp); } switch(Mnext) { default: case AM_BYTE: Gen[Glen++] = value & 0xFF; break; case AM_WORD: if (MsbOrder) { Gen[Glen++] = (value >> 8) & 0xFF; Gen[Glen++] = value & 0xFF; } else { Gen[Glen++] = value & 0xFF; Gen[Glen++] = (value >> 8) & 0xFF; } break; case AM_OTHER_ENDIAN: if (MsbOrder == 0) { Gen[Glen++] = (value >> 8) & 0xFF; Gen[Glen++] = value & 0xFF; } else { Gen[Glen++] = value & 0xFF; Gen[Glen++] = (value >> 8) & 0xFF; } break; case AM_LONG: if (MsbOrder) { Gen[Glen++] = (value >> 24)& 0xFF; Gen[Glen++] = (value >> 16)& 0xFF; Gen[Glen++] = (value >> 8) & 0xFF; Gen[Glen++] = value & 0xFF; } else { Gen[Glen++] = value & 0xFF; Gen[Glen++] = (value >> 8) & 0xFF; Gen[Glen++] = (value >> 16)& 0xFF; Gen[Glen++] = (value >> 24)& 0xFF; } break; } ++ptr; } } else { if (vmode) { setspecial(value, sym->flags); tmp = eval(macstr, 0); value = tmp->value; if (tmp->flags & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_DV_NOT_RESOLVED_COULD; } FreeSymbolList(tmp); } switch(Mnext) { default: case AM_BYTE: //any value outside two's complement +ve and +ve byte representation is invalid... if ((value < -0xFF)||(value > 0xFF)) { sprintf( sBuffer, "byte %s %ld", mne->name, value); asmerr( ERROR_ADDRESS_MUST_BE_LT_100, false, sBuffer ); } Gen[Glen++] = value & 0xFF; break; case AM_WORD: //any value outside two's complement +ve and +ve word representation is invalid... if ( (bStrictMode) && ((value < -0xFFFF)||(value > 0xFFFF)) ) { sprintf( sBuffer, "word %s %ld", mne->name, value); asmerr( ERROR_ADDRESS_MUST_BE_LT_10000, false, sBuffer ); } if (MsbOrder) { Gen[Glen++] = (value >> 8) & 0xFF; Gen[Glen++] = value & 0xFF; } else { Gen[Glen++] = value & 0xFF; Gen[Glen++] = (value >> 8) & 0xFF; } break; case AM_OTHER_ENDIAN: if ( (bStrictMode) && ((value < -0xFFFF)||(value > 0xFFFF)) ) { sprintf( sBuffer, "swapped %s %ld", mne->name, value); asmerr( ERROR_ADDRESS_MUST_BE_LT_10000, false, sBuffer ); } if (MsbOrder == 0) { Gen[Glen++] = (value >> 8) & 0xFF; Gen[Glen++] = value & 0xFF; } else { Gen[Glen++] = value & 0xFF; Gen[Glen++] = (value >> 8) & 0xFF; } break; case AM_LONG: if (MsbOrder) { Gen[Glen++] = (value >> 24)& 0xFF; Gen[Glen++] = (value >> 16)& 0xFF; Gen[Glen++] = (value >> 8) & 0xFF; Gen[Glen++] = value & 0xFF; } else { Gen[Glen++] = value & 0xFF; Gen[Glen++] = (value >> 8) & 0xFF; Gen[Glen++] = (value >> 16)& 0xFF; Gen[Glen++] = (value >> 24)& 0xFF; } break; } } } generate(); FreeSymbolList(sym); } void v_ds(char *str, MNEMONIC *dummy) { SYMBOL *sym; int mult = 1; long filler = 0; if (Mnext == AM_WORD) mult = 2; if (Mnext == AM_LONG) mult = 4; programlabel(); if ((sym = eval(str, 0)) != NULL) { if (sym->next) filler = sym->next->value; if (sym->flags & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_DS_NOT_RESOLVED; } else { if (sym->next && sym->next->flags & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_DS_NOT_RESOLVED; } genfill(filler, sym->value, mult); } FreeSymbolList(sym); } } void v_org(char *str, MNEMONIC *dummy) { SYMBOL *sym; sym = eval(str, 0); Csegment->org = sym->value; if (sym->flags & SYM_UNKNOWN) Csegment->flags |= SYM_UNKNOWN; else Csegment->flags &= ~SYM_UNKNOWN; if (Csegment->initflags & SYM_UNKNOWN) { Csegment->initorg = sym->value; Csegment->initflags = sym->flags; } if (sym->next) { OrgFill = sym->next->value; if (sym->next->flags & SYM_UNKNOWN) asmerr( ERROR_VALUE_UNDEFINED, true, NULL ); } programlabel(); FreeSymbolList(sym); } void v_rorg(char *str, MNEMONIC *dummy) { SYMBOL *sym = eval(str, 0); Csegment->flags |= SF_RORG; if (sym->addrmode != AM_IMP) { Csegment->rorg = sym->value; if (sym->flags & SYM_UNKNOWN) Csegment->rflags |= SYM_UNKNOWN; else Csegment->rflags &= ~SYM_UNKNOWN; if (Csegment->initrflags & SYM_UNKNOWN) { Csegment->initrorg = sym->value; Csegment->initrflags = sym->flags; } } programlabel(); FreeSymbolList(sym); } void v_rend(char *str, MNEMONIC *dummy) { programlabel(); Csegment->flags &= ~SF_RORG; } void v_align(char *str, MNEMONIC *dummy) { SYMBOL *sym = eval(str, 0); unsigned char fill = 0; unsigned char rorg = Csegment->flags & SF_RORG; if (rorg) Csegment->rflags |= SF_REF; else Csegment->flags |= SF_REF; if (sym->next) { if (sym->next->flags & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_ALIGN_NOT_RESOLVED; } else { fill = sym->next->value; } } if (rorg) { if ((Csegment->rflags | sym->flags) & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_ALIGN_RELOCATABLE_ORIGIN_NOT_KNOWN; } else { long n = sym->value - (Csegment->rorg % sym->value); if (n != sym->value) genfill(fill, n, 1); } } else { if ((Csegment->flags | sym->flags) & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_ALIGN_NORMAL_ORIGIN_NOT_KNOWN; } else { long n = sym->value - (Csegment->org % sym->value); if (n != sym->value) genfill(fill, n, 1); } } FreeSymbolList(sym); programlabel(); } void v_subroutine(char *str, MNEMONIC *dummy) { ++Lastlocalindex; Localindex = Lastlocalindex; programlabel(); } void v_equ(char *str, MNEMONIC *dummy) { SYMBOL *sym = eval(str, 0); SYMBOL *lab; /* * If we encounter a line of the form * . = expr ; or . EQU expr * treat it as one of * org expr * rorg expr * depending on whether we have a relocatable origin now or not. */ if (strlen(Av[0]) == 1 && (Av[0][0] == '.' || (Av[0][0] == '*' && (Av[0][0] = '.') && 1) /*AD: huh?*/ )) { /* Av[0][0] = '\0'; */ if (Csegment->flags & SF_RORG) { v_rorg(str, dummy); } else { v_org(str, dummy); } return; } lab = findsymbol(Av[0], strlen(Av[0])); if (!lab) lab = CreateSymbol( Av[0], strlen(Av[0]) ); if (!(lab->flags & SYM_UNKNOWN)) { if (sym->flags & SYM_UNKNOWN) { ++Redo; Redo_why |= REASON_EQU_NOT_RESOLVED; } else { if (lab->value != sym->value) { asmerr( ERROR_EQU_VALUE_MISMATCH, false, NULL ); printf("INFO: Label '%s' changed from $%04lx to $%04lx\n", Av[0], lab->value, sym->value); ++Redo; Redo_why |= REASON_EQU_VALUE_MISMATCH; } } } lab->value = sym->value; lab->flags = sym->flags & (SYM_UNKNOWN|SYM_STRING); lab->string = sym->string; sym->flags &= ~(SYM_STRING|SYM_MACRO); /* List the value */ { unsigned long v = lab->value; Glen = 0; if (v > 0x0000FFFF) { Gen[Glen++] = v >> 24; Gen[Glen++] = v >> 16; } Gen[Glen++] = v >> 8; Gen[Glen++] = v; } FreeSymbolList(sym); } void v_eqm(char *str, MNEMONIC *dummy) { SYMBOL *lab; int len = strlen(Av[0]); if ((lab = findsymbol(Av[0], len)) != NULL) { if (lab->flags & SYM_STRING) free(lab->string); } else { lab = CreateSymbol( Av[0], len ); } lab->value = 0; lab->flags = SYM_STRING | SYM_SET | SYM_MACRO; lab->string = strcpy(ckmalloc(strlen(str)+1), str); } void v_echo(char *str, MNEMONIC *dummy) { SYMBOL *sym = eval(str, 0); SYMBOL *s; char buf[256]; for (s = sym; s; s = s->next) { if (!(s->flags & SYM_UNKNOWN)) { if (s->flags & (SYM_MACRO|SYM_STRING)) sprintf(buf,"%s", s->string); else sprintf(buf,"$%lx", s->value); if (FI_listfile) fprintf(FI_listfile, " %s", buf); //printf(" %s", buf); addmsg(" "); // -FXQ supress output until final pass addmsg(buf); } } //puts(""); addmsg("\n"); if (FI_listfile) putc('\n', FI_listfile); } void v_set(char *str, MNEMONIC *dummy) { SYMBOL *sym, *lab; char dynamicname[257]; int i = 0,j; int setundefined = 0; while (str[i] && str[i] != '"' && str[i] != ' ' && str[i] != ',' ) i++; if(str[i] && str[i] == ',') // is this SET is using the "," eval-concat operator? { strncpy(dynamicname, str,256); if(i<256) dynamicname[i]=0; dynamicname[256]=0; j=strlen(dynamicname); // eval-concat argument processing loop... while (str[i] && str[i] != '"' && str[i] != ' ') { if( str[i] == 0 || str[i] == ' ' ) // leave if we've processed all arguments { break; } if(str[i+1]=='"') // is this a string constant? { i=i+2; // advance to string contents while (str[i] && str[i] != '"' && str[i] != ' ' && str[i] != ',') { dynamicname[j++]=str[i++]; } if (str[i] && str[i]=='"') { dynamicname[j]=0; i++; continue; } else { asmerr( ERROR_SYNTAX_ERROR, false, str); continue; } } // argument was string constant else // this argument is a symbol to be evaluated { int t; char tempbuf[257]; char tempval[257]; SYMBOL *symarg; strncpy(tempbuf,str+i+1,256); tempbuf[256]=0; for(t=0;tflags & SYM_UNKNOWN) // one of the arguments isn't defined yet setundefined++; // ensure the set doesn't actually happen else { snprintf(tempval,256,"%d",(unsigned)symarg->value); strcpy(dynamicname+j,tempval); j=j+strlen(tempval); } } i++; while (str[i] && str[i] != ' ' && str[i] != ',') i++; } // argument was symbol continue; // process any remaining arguments } dynamicname[i++] = 0; if (setundefined) // not all of the arguments are defined yet, so skip this SET { return; } sym = eval(dynamicname,0); } else // traditional SET behavior sym = eval(str, 0); lab = findsymbol(Av[0], strlen(Av[0])); if (!lab) lab = CreateSymbol( Av[0], strlen(Av[0]) ); lab->value = sym->value; lab->flags = sym->flags & (SYM_UNKNOWN|SYM_STRING); lab->string = sym->string; sym->flags &= ~(SYM_STRING|SYM_MACRO); FreeSymbolList(sym); } void v_setstr(char *symstr, MNEMONIC *dummy) { char str[1024]; snprintf(str,1024,"\"%s\"",symstr); v_set(str,dummy); } void v_execmac(char *str, MACRO *mac) { INCFILE *inc; STRLIST *base; STRLIST **psl, *sl; char *s1; programlabel(); if (Mlevel == MAXMACLEVEL) { char errMsg[256]; sprintf(errMsg, " macro [%s] recursion > %d", mac->name, MAXMACLEVEL); asmerr( ERROR_RECURSION_TOO_DEEP, true, errMsg ); return; } ++Mlevel; base = (STRLIST *)ckmalloc(STRLISTSIZE+strlen(str)+1); base->next = NULL; strcpy(base->buf, str); psl = &base->next; while (*str && *str != '\n') { s1 = str; while (*str && *str != '\n' && *str != ',') ++str; sl = (STRLIST *)ckmalloc(STRLISTSIZE+1+(str-s1)); sl->next = NULL; *psl = sl; psl = &sl->next; memcpy(sl->buf, s1, (str-s1)); sl->buf[str-s1] = 0; if (*str == ',') ++str; while (*str == ' ') ++str; } inc = (INCFILE *)zmalloc(sizeof(INCFILE)); inc->next = pIncfile; inc->name = mac->name; inc->fi = pIncfile->fi; /* garbage */ inc->lineno = 0; inc->flags = INF_MACRO; inc->saveidx = Localindex; inc->savedolidx = Localdollarindex; inc->strlist = mac->strlist; inc->args = base; pIncfile = inc; ++Lastlocalindex; Localindex = Lastlocalindex; ++Lastlocaldollarindex; Localdollarindex = Lastlocaldollarindex; } void v_end(char *str, MNEMONIC *dummy) { /* Only ENDs current file and any macro calls within it */ while ( pIncfile->flags & INF_MACRO) v_endm(NULL, NULL); fseek( pIncfile->fi, 0, SEEK_END); } void v_endm(char *str, MNEMONIC *dummy) { INCFILE *inc = pIncfile; STRLIST *args, *an; /* programlabel(); contrary to documentation */ if (inc->flags & INF_MACRO) { --Mlevel; for (args = inc->args; args; args = an) { an = args->next; free(args); } Localindex = inc->saveidx; Localdollarindex = inc->savedolidx; pIncfile = inc->next; free(inc); return; } puts("not within a macro"); } void v_mexit(char *str, MNEMONIC *dummy) { v_endm(NULL, NULL); } void v_ifconst(char *str, MNEMONIC *dummy) { SYMBOL *sym; programlabel(); sym = eval(str, 0); pushif(sym->flags == 0); FreeSymbolList(sym); } void v_ifnconst(char *str, MNEMONIC *dummy) { SYMBOL *sym; programlabel(); sym = eval(str, 0); pushif(sym->flags != 0); FreeSymbolList(sym); } void v_if(char *str, MNEMONIC *dummy) { SYMBOL *sym; if (!Ifstack->xtrue || !Ifstack->acctrue) { pushif(0); return; } programlabel(); sym = eval(str, 0); if (sym->flags) { ++Redo; Redo_why |= REASON_IF_NOT_RESOLVED; pushif(0); Ifstack->acctrue = 0; Redo_if |= 1; } else { pushif(!!sym->value); } FreeSymbolList(sym); } void v_else(char *str, MNEMONIC *dummy) { if (Ifstack->acctrue && !(Ifstack->flags & IFF_BASE)) { programlabel(); Ifstack->xtrue = !Ifstack->xtrue; } } void v_endif(char *str, MNEMONIC *dummy) { IFSTACK *ifs = Ifstack; if (!(ifs->flags & IFF_BASE)) { if (ifs->acctrue) programlabel(); if (ifs->file != pIncfile) { puts("too many endif's"); } else { Ifstack = ifs->next; free(ifs); } } } void v_repeat(char *str, MNEMONIC *dummy) { REPLOOP *rp; SYMBOL *sym; if (!Ifstack->xtrue || !Ifstack->acctrue) { pushif(0); return; } programlabel(); sym = eval(str, 0); if (sym->value == 0) { pushif(0); FreeSymbolList(sym); return; } #ifdef DAD /* Don't allow negative values for REPEAT loops */ if ( sym->value < 0 ) { pushif( 0 ); FreeSymbolList( sym ); asmerr( ERROR_REPEAT_NEGATIVE, false, NULL ); return; } #endif rp = (REPLOOP *)zmalloc(sizeof(REPLOOP)); rp->next = Reploop; rp->file = pIncfile; if (pIncfile->flags & INF_MACRO) rp->seek = (long)pIncfile->strlist; else rp->seek = ftell(pIncfile->fi); rp->lineno = pIncfile->lineno; rp->count = sym->value; if ((rp->flags = sym->flags) != 0) { ++Redo; Redo_why |= REASON_REPEAT_NOT_RESOLVED; } Reploop = rp; FreeSymbolList(sym); pushif(1); } void v_repend(char *str, MNEMONIC *dummy) { if (!Ifstack->xtrue || !Ifstack->acctrue) { v_endif(NULL,NULL); return; } if (Reploop && Reploop->file == pIncfile) { if (Reploop->flags == 0 && --Reploop->count) { if (pIncfile->flags & INF_MACRO) pIncfile->strlist = (STRLIST *)Reploop->seek; else fseek(pIncfile->fi,Reploop->seek,0); pIncfile->lineno = Reploop->lineno; } else { rmnode((void **)&Reploop, sizeof(REPLOOP)); v_endif(NULL,NULL); } return; } puts("no repeat"); } STRLIST *incdirlist; void v_incdir(char *str, MNEMONIC *dummy) { STRLIST **tail; char *buf; int found = 0; buf = getfilename(str); for (tail = &incdirlist; *tail; tail = &(*tail)->next) { if (strcmp((*tail)->buf, buf) == 0) found = 1; } if (!found) { STRLIST *newdir; newdir = (STRLIST *)permalloc(STRLISTSIZE + 1 + strlen(buf)); strcpy(newdir->buf, buf); *tail = newdir; } if (buf != str) free(buf); } static void addpart(char *dest, const char *dir, const char *file) { #if 0 /* not needed here */ if (strchr(file, ':')) { strcpy(dest, file); } else #endif { int pos; strcpy(dest, dir); pos = strlen(dest); if (pos > 0 && dest[pos-1] != ':' && dest[pos-1] != '/') { dest[pos] = '/'; pos++; } strcpy(dest + pos, file); } } FILE * pfopen(const char *name, const char *mode) { FILE *f; STRLIST *incdir; char *buf; f = fopen(name, mode); if (f) return f; /* Don't use the incdirlist for absolute pathnames */ if (strchr(name, ':')) return NULL; buf = zmalloc(512); for (incdir = incdirlist; incdir; incdir = incdir->next) { addpart(buf, incdir->buf, name); f = fopen(buf, mode); if (f) break; } free(buf); return f; } static long Seglen; static long Seekback; void generate(void) { long seekpos; static unsigned long org; int i; if (!Redo) { if (!(Csegment->flags & SF_BSS)) { for (i = Glen - 1; i >= 0; --i) CheckSum += Gen[i]; if (Fisclear) { Fisclear = 0; if (Csegment->flags & SF_UNKNOWN) { ++Redo; Redo_why |= REASON_OBSCURE; return; } org = Csegment->org; if ( F_format < FORMAT_RAW ) { putc((org & 0xFF), FI_temp); putc(((org >> 8) & 0xFF), FI_temp); if ( F_format == FORMAT_RAS ) { Seekback = ftell(FI_temp); Seglen = 0; putc(0, FI_temp); putc(0, FI_temp); } } } switch(F_format) { default: asmerr( ERROR_BAD_FORMAT, true, "Unhandled internal format specifier" ); break; case FORMAT_RAW: case FORMAT_DEFAULT: if (Csegment->org < org) { printf("segment: %s %s vs current org: %04lx\n", Csegment->name, sftos(Csegment->org, Csegment->flags), org); asmerr( ERROR_ORIGIN_REVERSE_INDEXED, true, NULL ); exit(1); } while (Csegment->org != org) { putc(OrgFill, FI_temp); ++org; } fwrite(Gen, Glen, 1, FI_temp); break; case FORMAT_RAS: if (org != Csegment->org) { org = Csegment->org; seekpos = ftell(FI_temp); fseek(FI_temp, Seekback, 0); putc((Seglen & 0xFF), FI_temp); putc(((Seglen >> 8) & 0xFF), FI_temp); fseek(FI_temp, seekpos, 0); putc((org & 0xFF), FI_temp); putc(((org >> 8) & 0xFF), FI_temp); Seekback = ftell(FI_temp); Seglen = 0; putc(0, FI_temp); putc(0, FI_temp); } fwrite(Gen, Glen, 1, FI_temp); Seglen += Glen; break; } org += Glen; } } Csegment->org += Glen; if (Csegment->flags & SF_RORG) Csegment->rorg += Glen; if (Csegment->org > maxFileSize) { char errMsg[128]; sprintf(errMsg, "code segment growing larger (%ld) than max. allowed file size (%ld)\n" ,Csegment->org, maxFileSize); asmerr( ERROR_RECURSION_TOO_DEEP, true, errMsg ); return; } } void closegenerate(void) { if (!Redo) { if ( F_format == FORMAT_RAS ) { fseek(FI_temp, Seekback, 0); putc((Seglen & 0xFF), FI_temp); putc(((Seglen >> 8) & 0xFF), FI_temp); fseek(FI_temp, 0L, 2); } } } void genfill(long fill, long entries, int size) { long bytes = entries; /* multiplied later */ int i; unsigned char c3,c2,c1,c0; if (bytes == 0) { // nothing to do return; } if (bytes < 0) { asmerr( ERROR_ORIGIN_REVERSE_INDEXED, true, NULL ); return; } c3 = fill >> 24; c2 = fill >> 16; c1 = fill >> 8; c0 = fill; switch(size) { case 1: memset(Gen, c0, sizeof(Gen)); break; case 2: bytes <<= 1; for (i = 0; i < sizeof(Gen); i += 2) { if (MsbOrder) { Gen[i+0] = c1; Gen[i+1] = c0; } else { Gen[i+0] = c0; Gen[i+1] = c1; } } break; case 4: bytes <<= 2; for (i = 0; i < sizeof(Gen); i += 4) { if (MsbOrder) { Gen[i+0] = c3; Gen[i+1] = c2; Gen[i+2] = c1; Gen[i+3] = c0; } else { Gen[i+0] = c0; Gen[i+1] = c1; Gen[i+2] = c2; Gen[i+3] = c3; } } break; } for (Glen = sizeof(Gen); bytes > sizeof(Gen); bytes -= sizeof(Gen)) generate(); Glen = bytes; generate(); } void pushif(bool xbool) { IFSTACK *ifs = (IFSTACK *)zmalloc(sizeof(IFSTACK)); ifs->next = Ifstack; ifs->file = pIncfile; ifs->flags = 0; ifs->xtrue = xbool; ifs->acctrue = Ifstack->acctrue && Ifstack->xtrue; Ifstack = ifs; } dasm-2.20.14.1/src/symbols.c000066400000000000000000000152461375233463600154120ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * SYMBOLS.C */ #include "asm.h" static unsigned int hash1(const char *str, int len); SYMBOL *allocsymbol(void); static SYMBOL org; static SYMBOL special; static SYMBOL specchk; void setspecial(int value, int flags) { special.value = value; special.flags = flags; } SYMBOL *findsymbol(const char *str, int len) { unsigned int h1; SYMBOL *sym; char buf[MAX_SYM_LEN + 14]; /* historical */ if ( len > MAX_SYM_LEN ) len = MAX_SYM_LEN; if (str[0] == '.') { if (len == 1) { if (Csegment->flags & SF_RORG) { org.flags = Csegment->rflags & SYM_UNKNOWN; org.value = Csegment->rorg; } else { org.flags = Csegment->flags & SYM_UNKNOWN; org.value = Csegment->org; } return &org; } if (len == 2 && str[1] == '.') return &special; if (len == 3 && str[1] == '.' && str[2] == '.') { specchk.flags = 0; specchk.value = CheckSum; return &specchk; } sprintf(buf, "%ld%.*s", Localindex, len, str); len = strlen(buf); str = buf; } else if (str[len - 1] == '$') { sprintf(buf, "%ld$%.*s", Localdollarindex, len, str); len = strlen(buf); str = buf; } h1 = hash1(str, len); for (sym = SHash[h1]; sym; sym = sym->next) { if ((sym->namelen == len) && !memcmp(sym->name, str, len)) break; } return sym; } SYMBOL *CreateSymbol( const char *str, int len ) { SYMBOL *sym; unsigned int h1; char buf[ MAX_SYM_LEN + 14 ]; /* historical */ if (len > MAX_SYM_LEN ) len = MAX_SYM_LEN; if (str[0] == '.') { sprintf(buf, "%ld%.*s", Localindex, len, str); len = strlen(buf); str = buf; } else if (str[len - 1] == '$') { sprintf(buf, "%ld$%.*s", Localdollarindex, len, str); len = strlen(buf); str = buf; } sym = allocsymbol(); sym->name = permalloc(len+1); memcpy(sym->name, str, len); /* permalloc zeros the array for us */ sym->namelen = len; h1 = hash1(str, len); sym->next = SHash[h1]; sym->flags= SYM_UNKNOWN; SHash[h1] = sym; return sym; } static unsigned int hash1(const char *str, int len) { uint8_t a = 0; uint8_t b = 0; while (len--) { // this is Fletcher's checksum, better distribution, faster a += *str++; b += a; } return ((((a << 8) & 0xFF00) | (b & 0xFF)) ) & SHASHAND; } /* * Label Support Routines */ void programlabel(void) { int len; SYMBOL *sym; SEGMENT *cseg = Csegment; char *str; unsigned char rorg = cseg->flags & SF_RORG; unsigned char cflags = (rorg) ? cseg->rflags : cseg->flags; unsigned long pc = (rorg) ? cseg->rorg : cseg->org; Plab = cseg->org; Pflags = cseg->flags; str = Av[0]; if (*str == 0) return; len = strlen(str); if (str[len-1] == ':') --len; if (str[0] != '.' && str[len-1] != '$') { Lastlocaldollarindex++; Localdollarindex = Lastlocaldollarindex; } /* * Redo: unknown and referenced * referenced and origin not known * known and phase error (origin known) */ if ((sym = findsymbol(str, len)) != NULL) { if ((sym->flags & (SYM_UNKNOWN|SYM_REF)) == (SYM_UNKNOWN|SYM_REF)) { ++Redo; Redo_why |= REASON_FORWARD_REFERENCE; if (Xdebug) printf("redo 13: '%s' %04x %04x\n", sym->name, sym->flags, cflags); } else if ((cflags & SYM_UNKNOWN) && (sym->flags & SYM_REF)) { ++Redo; Redo_why |= REASON_FORWARD_REFERENCE; } else if (!(cflags & SYM_UNKNOWN) && !(sym->flags & SYM_UNKNOWN)) { if (pc != sym->value) { /* * If we had an unevaluated IF expression in the * previous pass, don't complain about phase errors * too loudly. */ //FIX: calling asmerr with ERROR_LABEL_MISMATCH is fatal. The clause // below was causing aborts if verbosity was up, even when the // phase errors were the result of unevaluated IF expressions in // the previous pass. //if (F_verbose >= 1 || !(Redo_if & (REASON_OBSCURE))) if (!(Redo_if & (REASON_OBSCURE))) { char sBuffer[ MAX_SYM_LEN * 4 ]; sprintf( sBuffer, "%s %s", sym->name, sftos( sym->value, 0 ) ); asmerr( ERROR_LABEL_MISMATCH, false, sBuffer ); } ++Redo; Redo_why |= REASON_PHASE_ERROR; } } } else { sym = CreateSymbol( str, len ); } sym->value = pc; sym->flags = (sym->flags & ~SYM_UNKNOWN) | (cflags & SYM_UNKNOWN); } SYMBOL *SymAlloc; SYMBOL *allocsymbol(void) { SYMBOL *sym; if (SymAlloc) { sym = SymAlloc; SymAlloc = SymAlloc->next; memset(sym, 0, sizeof(SYMBOL)); } else { sym = (SYMBOL *)permalloc(sizeof(SYMBOL)); } return sym; } /* defined but not used [phf] */ /* static void freesymbol(SYMBOL *sym) { sym->next = SymAlloc; SymAlloc = sym; } */ void FreeSymbolList(SYMBOL *sym) { SYMBOL *next; while (sym) { next = sym->next; sym->next = SymAlloc; if (sym->flags & SYM_STRING) free(sym->string); SymAlloc = sym; sym = next; } } dasm-2.20.14.1/src/symbols.h000066400000000000000000000070721375233463600154150ustar00rootroot00000000000000#ifndef _DASM_SYMBOLS_H #define _DASM_SYMBOLS_H /* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /** * @file * * @brief Dealing with symbols. */ #include "asm.h" #include void programlabel(void); void ShowSymbols(FILE *file); size_t ShowUnresolvedSymbols(void); void DumpSymbolTable(void); /** * @brief Remove the SYM_REF flag from all symbols in the * hash table. */ void clear_all_symbol_refs(void); /** * @brief Set the special symbol for ".." used as part of * a DV pseudo-op. * @note Only the value and flags fields of the symbol are * set. */ void set_special_dv_symbol(int value, dasm_flag_t flags); /** * @brief Create symbol with given name and add it to the hash table. * @warning Truncates names to MAX_SYM_LEN! * @note Generates custom names for local symbols (those starting * with '.' or ending with '$'). Uses alloc_symbol() internally. * Uses small_alloc() internally for the name of the symbol. The * created symbol is SYM_UNKNOWN. * @pre str != NULL && len > 0 */ SYMBOL *create_symbol(const char *str, size_t len); /** * @brief Find symbol with given name in hash table. * @warning Truncates names to MAX_SYM_LEN! * @note Handles special names such as '.' for current PC, * ".." for the special argument to EQM as part of DV (see * set_special_dv_symbol()), and "..." for the current checksum; also * handles local names (those starting with '.' or ending * with '$'). * @pre str != NULL && len > 0 */ SYMBOL *find_symbol(const char *str, size_t len); /** * @brief Allocate a fresh symbol. * @note Uses small_alloc() internally and manages a custom * free list of symbols to reuse memory. */ SYMBOL *alloc_symbol(void); /** * @brief Free zero or more symbols. * @note Manages a custom free list of symbols to reuse memory. */ void free_symbol_list(SYMBOL *sym); /** * @brief A symbol file of the given name will be produced. * @warning Can only be called once! * @pre name != NULL */ void set_symbol_file_name(const char *name); /** * @brief Sort mode for symbol table for -T option. */ typedef enum { /* actual sort modes */ SORTMODE_ALPHA, SORTMODE_ADDRESS, /* meta data */ SORTMODE_MIN = SORTMODE_ALPHA, SORTMODE_DEFAULT = SORTMODE_ALPHA, SORTMODE_MAX = SORTMODE_ADDRESS } sortmode_t; /** * @brief Valid sort mode for -T option? */ bool valid_sort_mode(int mode); /** * @brief Set sort mode, -T option. */ void set_sort_mode(sortmode_t mode); /** * @brief Print statistics about symbol hash table. * @warning For debugging only. */ void debug_symbol_hash_collisions(void); #endif /* _DASM_SYMBOLS_H */ /* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4 autoindent: */ dasm-2.20.14.1/src/test_errors.c000066400000000000000000000042761375233463600162760ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /** * @file * @brief Unit tests for errors module. * @todo how do we keep panic* from aborting while unit test * runs? or maybe it doesn't matter if we switch to Check? */ #include "errors.h" #include "asm.h" #include "util.h" #include #include #include /* fakes for unit test */ FILE *FI_listfile = NULL; char *F_listfile = NULL; INCFILE *pIncfile = NULL; int main(int argc, char *argv[]) { assert(argc == 1); setprogname(argv[0]); /* fake a current file */ pIncfile = malloc(sizeof(INCFILE)); pIncfile->next = NULL; pIncfile->name = checked_strdup("someFileName"); pIncfile->lineno = 47; /* enable all messages */ set_error_level(ERRORLEVEL_DEBUG); /* test SUPER new API :-) */ debug_fmt(WARNING_RANGE, "CRAZY", "DEBUG", 2, 14); info_fmt(WARNING_RANGE, "CRAZY", "DEBUG", 2, 14); notice_fmt(WARNING_RANGE, "CRAZY", "DEBUG", 2, 14); warning_fmt(WARNING_RANGE, "CRAZY", "DEBUG", 2, 14); error_fmt(WARNING_RANGE, "CRAZY", "DEBUG", 2, 14); fatal_fmt(WARNING_RANGE, "CRAZY", "FATAL", 2, 14); panic_fmt(WARNING_RANGE, "CRAZY", "DEBUG", 2, 14); return EXIT_SUCCESS; } /* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4 autoindent: */ dasm-2.20.14.1/src/test_util.c000066400000000000000000000112171375233463600157300ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /** * @file * @brief Unit tests for util module. * @todo how do we keep panic* from aborting while unit test * runs? or maybe it doesn't matter if we switch to Check? */ #include "util.h" #include "asm.h" #include "errors.h" #include #include #include #if 0 #if defined(TEST) /* hack for unit tests where we don't want to exit! */ void new_panic(error_t _error, const char *s) { (void) printf("Simulated Panic: %s\n", s); } void debug(error_t _error, const char *s) { (void) printf("Simulated Debug: %s\n", s); } #endif /* defined(TEST) */ #endif /* fakes for unit test */ FILE *FI_listfile = NULL; char *F_listfile = NULL; INCFILE *pIncfile = NULL; int main(int argc, char *argv[]) { char *one; char *two; union align { long l; void *p; void (*fp)(void); }; const size_t BIG = ((size_t) 1) << 31; char buffer[256]; char fuffer[256]; char poop[5] = {'a', 'b', 'c', 'd', 'X'}; size_t res; char* excellent = NULL; assert(argc == 1); setprogname(argv[0]); /* test some string functions */ excellent = checked_strdup("Peter's own thing!"); assert(excellent != NULL); assert(strcmp(excellent, "Peter's own thing!") == 0); res = strlcpy(poop, "Hello 47!", sizeof(poop)-1); assert(res == 9); assert(poop[0] == 'H'); assert(poop[1] == 'e'); assert(poop[2] == 'l'); assert(poop[3] == '\0'); assert(poop[4] == 'X'); res = strlcpy(buffer, "Hello 47!", sizeof(buffer)); assert(res == 9); assert(strcmp(buffer, "Hello 47!") == 0); assert(!match_either_case(buffer, "hello 47!")); res = strlower(fuffer, buffer, sizeof(fuffer)); assert(res == 9); assert(strcmp(fuffer, "hello 47!") == 0); assert(match_either_case(fuffer, "hello 47!")); res = strupper(buffer, fuffer, sizeof(buffer)); assert(res == 9); assert(strcmp(buffer, "HELLO 47!") == 0); assert(match_either_case(buffer, "hello 47!")); res = strlcpy(buffer, "\r\t\n ", sizeof(buffer)); assert(res == 7); res = strip_whitespace(poop, buffer, sizeof(poop)-1); assert(res == 0); assert(poop[0] == '\0'); assert(poop[1] == 'e'); assert(poop[2] == 'l'); assert(poop[3] == '\0'); assert(poop[4] == 'X'); res = strlcpy(buffer, "\rThere are\tso\nmany good things! ", sizeof(buffer)); assert(res == 35); res = strip_whitespace(poop, buffer, sizeof(poop)-1); assert(res == 25); assert(poop[0] == 'T'); assert(poop[1] == 'h'); assert(poop[2] == 'e'); assert(poop[3] == '\0'); assert(poop[4] == 'X'); res = strip_whitespace(fuffer, buffer, sizeof(fuffer)); assert(res == 25); assert(strcmp(fuffer, "Therearesomanygoodthings!") == 0); /* fake a current file */ pIncfile = malloc(sizeof(INCFILE)); pIncfile->next = NULL; pIncfile->name = checked_strdup("someFileName"); pIncfile->lineno = 47; /* enable all messages */ set_error_level(ERRORLEVEL_DEBUG); /* the tests */ puts(getprogname()); setprogname(argv[0]); puts(getprogname()); printf("sizeof(align)==%zu\n", sizeof(union align)); one = checked_malloc(BIG); puts("First malloc()ed!"); two = checked_malloc(BIG); puts("Second malloc()ed! Should have caused a panic?"); if (two) free(two); puts("Second free()d!"); if (one) free(one); puts("First free()d!"); one = small_alloc(4096); printf("First small_alloc()ed returned %p!\n", one); two = small_alloc(4096); assert(one < two); printf("Second small_alloc()ed returned %p!\n", two); one = small_alloc(10240); small_free_all(); return EXIT_SUCCESS; } /* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4 autoindent: */ dasm-2.20.14.1/src/util.c000066400000000000000000000260661375233463600147010ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /** * @file */ /* The functions strlcat() and strlcpy() are not distributed under the GNU General Public License but a custom license reproduced below. Although not strictly necessary, inclusion of these functions in a GPLed project has been explicitly allowed by their author, Todd C. Miller. The functions were downloaded from these URLs on 2008/04/07 and had the indicated versioning information attached: ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcat.c $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.c $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ The code was modified to include assertions and to make splint happier but is otherwise unchanged. The documentation comments were moved into the util.h header file for consistency. The function hash_string() is based on code fragments posted by Daniel Bernstein to comp.lang.c on 1990/12/04. As far as we know, the code is in the public domain. */ #include "util.h" #include "asm.h" #include "errors.h" #include "version.h" #include #include #include #include #include #include /*@out@*/ void *checked_malloc(size_t bytes) { void *p = NULL; assert(bytes > 0); /* rule out 0! */ p = malloc(bytes); if (p == NULL) { panic_fmt(PANIC_MEMORY, bytes, SOURCE_LOCATION); exit(EXIT_FAILURE); /* makes splint happier */ } return p; } void *zero_malloc(size_t bytes) { void *p = NULL; assert(bytes > 0); /* rule out 0! */ p = checked_malloc(bytes); p = memset(p, 0, bytes); return p; } struct new_perm_block { /*@temp@*/ struct new_perm_block *next; char data[]; }; /*@null@*/ /*@temp@*/ static struct new_perm_block *new_permalloc_stack = NULL; #define ALLOCSIZE 16384 #define ROUNDUP(x) ((x + alignment-1) & ~(alignment-1)) void *small_alloc(size_t bytes) { /* Assume sizeof(union align) is a power of 2 */ union align { long l; void *p; void (*fp)(void); }; static void *buf; static size_t left = 0; void *ptr; struct new_perm_block *block; size_t alignment = sizeof(union align); assert(bytes > 0); /* rule out 0! */ /* could sanity check upper bound here, but we're doing it below anyway */ debug_fmt(DEBUG_ENTER, SOURCE_LOCATION); /* round up bytes for proper alignment */ bytes = ROUNDUP(bytes); /* do we not have enough left in the current block? */ if (bytes > left) { debug_fmt("%s: new block needed", SOURCE_LOCATION); /* allocate a new block */ block = zero_malloc(ALLOCSIZE); debug_fmt("%s: block @ %p", SOURCE_LOCATION, (void*) block); /* calculate bytes we have left */ left = ALLOCSIZE - ROUNDUP(sizeof(block->next)); /* check again if we have enough space */ if (bytes > left) { panic_fmt(PANIC_SMALL_MEMORY, bytes, SOURCE_LOCATION); exit(EXIT_FAILURE); /* makes splint happier */ } /* insert at top of stack */ block->next = new_permalloc_stack; new_permalloc_stack = block; /* setup buf to point to actual memory area */ buf = ((char*)block) + ROUNDUP(sizeof(block->next)); /* char cast important! */ debug_fmt("%s: initial buf @ %p", SOURCE_LOCATION, (void*) buf); } ptr = buf; buf = ((char*)buf) + bytes; /* char cast important! */ debug_fmt("%s: adjusted buf @ %p", SOURCE_LOCATION, (void*) buf); assert(ptr < buf); /* TODO: good idea? [phf] */ left -= bytes; debug_fmt(DEBUG_LEAVE, SOURCE_LOCATION); return ptr; } void small_free_all(void) { /* the block we are about to free() */ struct new_perm_block *current = NULL; debug_fmt(DEBUG_ENTER, SOURCE_LOCATION); /* as long as we have block left */ while (new_permalloc_stack != NULL) { /* remember the top block */ current = new_permalloc_stack; /* pop the top block, stack possibly empty after this */ new_permalloc_stack = current->next; /* free() the block we popped */ debug_fmt("%s: freed block @ %p", SOURCE_LOCATION, (void*) current); free(current); } debug_fmt(DEBUG_LEAVE, SOURCE_LOCATION); } unsigned int hash_string(const char *string, size_t length) { /* Why is this a better hash function than Matt's original? For MNEMONICs we go from 14 to 5 collisons, woohoo. :-) For SYMBOLs we go from 29 to 11 collisons, woohoo. :-) */ unsigned int hash = 5381; assert(string != NULL); assert(length > 0); assert(length <= strlen(string)); while (length-- != 0) { hash = ((hash << 5) + hash) + (unsigned int) *string++; } return hash; } char *checked_strdup(const char *s) { assert(s != NULL); /* v_seg() doesn't enforce this so we can't either for now [phf] */ /*assert(strlen(s) > 0);*/ return strcpy(checked_malloc(strlen(s)+1), s); } size_t strlower(/*@out@*/ char *dst, const char *src, size_t size) { /* strlcpy checks the assertions anyway */ size_t result = strlcpy(dst, src, size); for (/* blank */; *dst != '\0'; dst++) { *dst = (char) tolower((int)*dst); } return result; } size_t strupper(/*@out@*/ char *dst, const char *src, size_t size) { /* strlcpy checks the assertions anyway */ size_t result = strlcpy(dst, src, size); for (/* blank */; *dst != '\0'; dst++) { *dst = (char) toupper((int)*dst); } return result; } size_t strip_whitespace(/*@out@*/ char *dst, const char *src, size_t size) { /* TODO: there must be a simpler way to write this... */ size_t n = size; size_t needed = 0; const char *t; assert(dst != NULL); assert(src != NULL); assert(size > 0); /* pre-count how many non-space characters we have */ for (t = src; *t != '\0'; t++) { if (isspace((int)*t) == 0) { needed++; } } /* copy while still room and src not over */ while (n > 1 && *src != '\0') { if (isspace((int)*src) != 0) { src++; } else { *dst++ = *src++; n--; } } *dst = '\0'; n--; return needed; } bool match_either_case(const char *string, const char *either) { char buffer[MAX_SYM_LEN]; size_t res; assert(string != NULL); assert(either != NULL); res = strlower(buffer, either, sizeof(buffer)); assert(res < sizeof(buffer)); if (strcmp(string, buffer) == 0) { return true; } res = strupper(buffer, either, sizeof(buffer)); assert(res < sizeof(buffer)); if (strcmp(string, buffer) == 0) { return true; } return false; } #if !defined(__APPLE__) && !defined(__BSD__) /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ size_t strlcat(/*@in@*/ /*@out@*/ char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; size_t n = siz; size_t dlen; /* added [phf] */ assert(dst != NULL); assert(src != NULL); assert(siz > 0); /* Find the end of dst and adjust bytes left but don't go past end */ while (n-- != 0 && *d != '\0') d++; assert(d - dst >= 0); /* added [phf] */ dlen = d - dst; n = siz - dlen; if (n == 0) return(dlen + strlen(s)); while (*s != '\0') { if (n != 1) { *d++ = *s; n--; } s++; } *d = '\0'; return(dlen + (s - src)); /* count does not include NUL */ } /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ size_t strlcpy(/*@out@*/ char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; size_t n = siz; /* added [phf] */ assert(dst != NULL); assert(src != NULL); assert(siz > 0); /* Copy as many bytes as will fit */ if (n != 0) { while (--n != 0) { if ((*d++ = *s++) == '\0') break; } } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++ != '\0') /* splinted [phf] */ ; } assert(s - src - 1 >= 0); /* added [phf] */ return(s - src - 1); /* count does not include NUL */ } /*@null@*/ static const char *__dasm_progname = NULL; /*@temp@*/ const char *getprogname(void) { return (__dasm_progname != NULL) ? __dasm_progname : "(unknown progname)"; } void setprogname(const char *name) { char *slash = NULL; assert(name != NULL); slash = strrchr(name, DASM_PATH_SEPARATOR); if (slash != NULL) { name = slash+1; } __dasm_progname = name; } #endif /* !defined(__APPLE__) && !defined(__BSD__) */ /* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4 autoindent: */ dasm-2.20.14.1/src/util.h000066400000000000000000000126741375233463600147060ustar00rootroot00000000000000#ifndef _DASM_UTIL_H #define _DASM_UTIL_H /* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /** * @file * * @brief Utility functions for string manipulation and memory allocation. */ #include #include /** * @brief * Wrapper for malloc(3) that terminates DASM with panic() if no * memory is available. * * @pre * bytes > 0 */ /*@out@*/ void *checked_malloc(size_t bytes); /** * @brief * Wrapper for checked_malloc() that zero's the allocated memory * using memset(3). * * @pre * bytes > 0 * * @warning * memset(3) may not initialize pointers or floats/doubles * correctly to NULL or 0.0 on some (very strange) machines. */ void *zero_malloc(size_t bytes); /** * @brief * Efficiently allocate small amounts of memory. * * @pre * bytes > 0 * * @warning * You can only request *small* amounts of memory from this * function, less than 1024 bytes at a time is a good rule of * thumb. * You *cannot* free(3) the pointer returned by small_alloc(), * truly bad things will happen if you try. * You can *only* free *all* the memory ever allocated through * small_alloc() using small_free_all() below. */ void *small_alloc(size_t bytes); /** * @brief * Free *all* memory allocated by small_alloc() so far. * * @warning * This function should only be called if your process is * about to exit(3) or if you *really* know what you're doing; * otherwise you'll end up with lots of dangling pointers. */ void small_free_all(void); /** * @brief * An excellent hash function for strings. * * @pre * string != NULL && length > 0 && length <= strlen(string) */ unsigned int hash_string(const char *string, size_t length); /** * @brief * Return a fresh copy of the given string. Memory is * allocated with checked_malloc() so it won't return * NULL on failure like the regular strdup() does. * * @pre * s != NULL && strlen(s) > 0 */ char *checked_strdup(const char *s); /** * @brief * Convert string to lower case. * * @pre * dst != NULL && src != NULL && size > 0 */ size_t strlower(/*@out@*/ char *dst, const char *src, size_t size); /** * @brief * Convert string to upper case. * * @pre * dst != NULL && src != NULL && size > 0 */ size_t strupper(/*@out@*/ char *dst, const char *src, size_t size); /** * @brief * Remove all whitespace from a string. * * @pre * dst != NULL && src != NULL && size > 0 */ size_t strip_whitespace(/*@out@*/ char *dst, const char *src, size_t size); /** * @brief * True if strcmp(string, strlower(either)) == 0 or * strcmp(string, strupper(either)) == 0, so mixed * capitalization is not allowed. * * @pre * string != NULL && either != NULL */ bool match_either_case(const char *string, const char *either); #if !defined(__APPLE__) && !defined(__BSD__) /** * @brief * Append src to string dst of size siz. * * Unlike in strncat(3), siz is the full size of dst, not space left. * At most siz-1 characters will be copied. * Always NUL terminates (unless siz <= strlen(dst)). * Returns strlen(src) + MIN(siz, strlen(initial dst)). * If retval >= siz, truncation occurred. * * @pre * dst != NULL && src != NULL && siz > 0 * * @note * On BSD (including OS X) this function is defined in the C library! */ size_t strlcat(/*@in@*/ /*@out@*/ char *dst, const char *src, size_t siz); /** * @brief * Copy src to string dst of size siz. * * At most siz-1 characters will be copied. * Always NUL terminates (unless siz == 0). * Returns strlen(src); if retval >= siz, truncation occurred. * * @pre * dst != NULL && src != NULL && siz > 0 * * @note * On BSD (including OS X) this function is defined in the C library! */ size_t strlcpy(/*@out@*/ char *dst, const char *src, size_t siz); /** * @brief * Name of current program. * @warning * If name not set, a string to that effect is returned. * @note * On BSD (including OS X) this function is defined in the C library! */ /*@temp@*/ const char *getprogname(void); /** * @brief * Sets name of current program sets to last component of given path. * @pre * name != NULL * @warning * Just pass argv[0] if you want, however the parsing is simplistic so * you should be careful if your environment is the least bit exotic. * @note * On BSD (including OS X) this function is defined in the C library! */ void setprogname(const char *name); #endif /* !defined(__APPLE__) && !defined(__BSD__) */ #endif /* _DASM_UTIL_H */ /* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4 autoindent: */ dasm-2.20.14.1/src/version.h000066400000000000000000000047021375233463600154070ustar00rootroot00000000000000/* the DASM macro assembler (aka small systems cross assembler) Copyright (c) 1988-2002 by Matthew Dillon. Copyright (c) 1995 by Olaf "Rhialto" Seibert. Copyright (c) 2003-2008 by Andrew Davie. Copyright (c) 2008 by Peter H. Froehlich. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _DASM_VERSION_H #define _DASM_VERSION_H /** * @file */ /** * @brief Macro to provide current DASM release as a string. */ #define DASM_RELEASE "2.20.14.1" /** * @brief Macro to provide current DASM headline, including * release, as a string; printed first in usage messages. */ #define DASM_ID "DASM " DASM_RELEASE /** * @brief Macro to print standard DASM copyright, in case we * go back to printing this part on every run again... * * @todo There are several pieces of code out there that have * 1987 as the first copyright year by Matthew Dillon; almost * all his later stuff starts at 1988, but ftohex.c is still * at 1987 even in his 2.16 release. We should settle this... */ #define DASM_PRINT_COPYRIGHT \ (void) puts("Copyright (c) 1988-2020 by the DASM team."); /** * @brief Macro to print standard DASM legalese, including * copyright, also for usage messages. */ #define DASM_PRINT_LEGAL \ DASM_PRINT_COPYRIGHT \ (void) puts("License GPLv2+: GNU GPL version 2 or later (see file LICENSE)."); \ (void) puts("DASM is free software: you are free to change and redistribute it."); \ (void) puts("There is ABSOLUTELY NO WARRANTY, to the extent permitted by law."); \ /** * @brief Macro to print bug report message, once again for * usage messages. */ #define DASM_PRINT_BUGS \ (void) puts("Report bugs on https://github.com/dasm-assembler/dasm please!"); #endif /* _DASM_VERSION_H */ /* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4 autoindent: */ dasm-2.20.14.1/test/000077500000000000000000000000001375233463600137365ustar00rootroot00000000000000dasm-2.20.14.1/test/11include.inc000066400000000000000000000003101375233463600162100ustar00rootroot00000000000000; 11include.inc - part of the symbolic include testing. ; To test non-symbol compliant include filenames, the name needs to begin with digits. ; Please don't rename it. ; ; --Mike Saarna .byte $11 dasm-2.20.14.1/test/6502_16b.asm000066400000000000000000000003111375233463600154770ustar00rootroot00000000000000 .PROCESSOR 6502 .TRACE on RAM_START .equ $80 my_addr .equ (RAM_START + 192) .ORG 0 and my_addr and.w my_addr and.b my_addr ; forced byte addressing and too large value should trigger dasm-2.20.14.1/test/6502_16b.fail000066400000000000000000000000011375233463600156260ustar00rootroot000000000000005dasm-2.20.14.1/test/6502_16h.asm000066400000000000000000000002331375233463600155100ustar00rootroot00000000000000 .PROCESSOR 6502 .TRACE on .ORG 0 and.b >400 ; forced byte addressing and taking higher part should be OK and.w >400 ldy.b >400,X ldy.w >400,X dasm-2.20.14.1/test/6502_16h.bin.ref000066400000000000000000000000141375233463600162500ustar00rootroot00000000000000%-dasm-2.20.14.1/test/6502_16h.hex.ref000066400000000000000000000000561375233463600162720ustar00rootroot00000000000000:0A0000002D01002501B401BC010030 :00000001FF dasm-2.20.14.1/test/6502_16l.asm000066400000000000000000000002321375233463600155130ustar00rootroot00000000000000 .PROCESSOR 6502 .TRACE on .ORG 0 and.b <400 ; forced byte addressing and taking lower part should be OK and.w <400 ldy.b <400,X ldy.w <400,X dasm-2.20.14.1/test/6502_16l.bin.ref000066400000000000000000000000141375233463600162540ustar00rootroot00000000000000%-dasm-2.20.14.1/test/6502_16l.hex.ref000066400000000000000000000000561375233463600162760ustar00rootroot00000000000000:0A0000002D90002590B490BC9000F4 :00000001FF dasm-2.20.14.1/test/6502_16w.asm000066400000000000000000000003001375233463600155220ustar00rootroot00000000000000 .PROCESSOR 6502 .TRACE on RAM_START .equ $80000 my_addr .equ (RAM_START + 192) .ORG 0 and my_addr and.w my_addr and.b my_addr ; any op should trigger since we have 64k space dasm-2.20.14.1/test/6502_16w.fail000066400000000000000000000000011375233463600156530ustar00rootroot000000000000005dasm-2.20.14.1/test/6502_DCswap.asm000066400000000000000000000002321375233463600162720ustar00rootroot00000000000000 .PROCESSOR 6502 .ORG 0 DC.w $EE00 ; native is little endian DC.s $FF00 ; the opposite DC.w "Multibyte String" DC.s "Big Endian" dasm-2.20.14.1/test/6502_DCswap.bin.ref000066400000000000000000000000721375233463600170370ustar00rootroot00000000000000Multibyte StringBig Endiandasm-2.20.14.1/test/6502_DCswap.hex.ref000066400000000000000000000002611375233463600170530ustar00rootroot00000000000000:1000000000EEFF004D0075006C0074006900620096 :1000100079007400650020005300740072006900CC :100020006E00670000420069006700200045006E16 :08003000006400690061006E2C :00000001FF dasm-2.20.14.1/test/6502_X16b.asm000066400000000000000000000002621375233463600156340ustar00rootroot00000000000000 .PROCESSOR 6502 .TRACE on RAM_START .equ $80 addr_offs .equ (RAM_START + 192) .ORG 0 rol.b addr_offs,X ; forced byte addressing and too large value should trigger dasm-2.20.14.1/test/6502_X16b.fail000066400000000000000000000000011375233463600157560ustar00rootroot000000000000005dasm-2.20.14.1/test/6811_X16.asm000066400000000000000000000001321375233463600154710ustar00rootroot00000000000000 .PROCESSOR 68hc11 .ORG 0 addA 500,X ; word offset is not allowed with this mnemonic dasm-2.20.14.1/test/6811_X16.fail000066400000000000000000000000011375233463600156170ustar00rootroot000000000000005dasm-2.20.14.1/test/6811_Y16.asm000066400000000000000000000001321375233463600154720ustar00rootroot00000000000000 .PROCESSOR 68hc11 .ORG 0 anda 500,Y ; word offset is not allowed with this mnemonic dasm-2.20.14.1/test/6811_Y16.fail000066400000000000000000000000011375233463600156200ustar00rootroot000000000000005dasm-2.20.14.1/test/68908_DCswap.asm000066400000000000000000000002331375233463600163750ustar00rootroot00000000000000 .PROCESSOR 68908 .ORG 0 DC.w $EE00 ; native is big endian DC.s $FF00 ; the opposite DC.w "Multibyte String" DC.s "Little Endian" dasm-2.20.14.1/test/68908_DCswap.bin.ref000066400000000000000000000001001375233463600171310ustar00rootroot00000000000000Multibyte StringLittle Endiandasm-2.20.14.1/test/68908_DCswap.hex.ref000066400000000000000000000002751375233463600171620ustar00rootroot00000000000000:10000000EE0000FF004D0075006C00740069006296 :1000100000790074006500200053007400720069CC :10002000006E00674C006900740074006C0065008D :0E003000200045006E006400690061006E0053 :00000001FF dasm-2.20.14.1/test/68908_SP16b.asm000066400000000000000000000001671375233463600160550ustar00rootroot00000000000000 .processor 68hc908 .org 0 ldx.b 500,SP ; should trigger since the user requested byte mode but size is word dasm-2.20.14.1/test/68908_SP16b.fail000066400000000000000000000000011375233463600161730ustar00rootroot000000000000005dasm-2.20.14.1/test/68908_cbeq_SP16.asm000066400000000000000000000001571375233463600167040ustar00rootroot00000000000000 .PROCESSOR 68hc908 .ORG 0 backLoop: cbeq (500,SP),backLoop ; word offset is not allowed with this mnemonic dasm-2.20.14.1/test/68908_cbeq_SP16.fail000066400000000000000000000000011375233463600170230ustar00rootroot000000000000005dasm-2.20.14.1/test/68908_dbnz_SP16.asm000066400000000000000000000001551375233463600167250ustar00rootroot00000000000000 .PROCESSOR 68hc908 .ORG 0 backLoop: dbnz 400,SP,backLoop ; word offset is not allowed with this mnemonic dasm-2.20.14.1/test/68908_dbnz_SP16.fail000066400000000000000000000000011375233463600170460ustar00rootroot000000000000005dasm-2.20.14.1/test/Makefile000066400000000000000000000006751375233463600154060ustar00rootroot00000000000000# demo.asm doesn't compile! # no useful reference output for suitef8.asm right now DASM=../bin/dasm FTOHEX=../bin/ftohex test: ./run_tests.sh -S 7 | tee test-report.txt %.bin: %.asm $(DASM) $< -o$@ -f1 -DINEEPROM %.hex: %.bin $(FTOHEX) 1 $< $@ clean: $(MAKE) -C atari2600 clean $(MAKE) -C atari7800 clean $(MAKE) -C cmdline_defs clean $(MAKE) -C selftest clean $(MAKE) -C channel-f clean rm -rf *.bin *.hex *.list.txt *.diff *.out dasm-2.20.14.1/test/addressexpression.asm000066400000000000000000000014501375233463600202050ustar00rootroot00000000000000; addressexpression - adapted from the "jentzsch3" address expression bug test. ; Original test courtesy Thomas Jentzsch. Output result code generation ; added by Mike Saarna. processor 6502 ORG $100 TEST_1 = (.) TEST_2 = (*) TEST_3 = (1 - .) TEST_4 = (1 - *) TEST_5 = (1 - . - 1) TEST_6 = (1 - * - 1) TEST_7 = (1 - 1 - .) TEST_8 = (1 - 1 - *) TEST_9 = (1 + *) TEST_10 = (1 + * + 1) TEST_11 = (1 + 1 + *) if TEST_1 = 256 .byte $01 endif if TEST_2 = 256 .byte $02 endif if TEST_3 = -255 .byte $03 endif if TEST_4 = -255 .byte $04 endif if TEST_5 = -256 .byte $05 endif if TEST_6 = -256 .byte $06 endif if TEST_7 = -256 .byte $07 endif if TEST_8 = -256 .byte $08 endif if TEST_9 = 257 .byte $09 endif if TEST_10 = 258 .byte $0A endif if TEST_11 = 258 .byte $0B endif dasm-2.20.14.1/test/addressexpression.bin.ref000066400000000000000000000000151375233463600207440ustar00rootroot00000000000000 dasm-2.20.14.1/test/addressexpression.hex.ref000066400000000000000000000000601375233463600207600ustar00rootroot00000000000000:0B0100000102030405060708090A0BB2 :00000001FF dasm-2.20.14.1/test/align_mod_mac.asm000066400000000000000000000043631375233463600172170ustar00rootroot00000000000000 .PROCESSOR 6502 .TRACE 1 .ifnconst FLASH_START FLASH_START .EQU $F800 .endif .ifnconst segmentModding segmentModding .EQU 1 .endif ; ; the macro alignspace let you fill up memory until the next {block_size} boundary ; one must give a unique {name} ; .mac alignspace ; {name},{block_size} _alMod{1} .EQU ({2}-(. % {2})) _alSpace{1} .DS _alMod{1},$ac .endm ; ; the macro modspacer fills up memory with {char} until the next {block_size} ; one must give a unique {name} ; .mac modspacer ; {name},{block_size},{char} _mark{1}: _delta{1} .EQU (_mark{1} - FLASH_START) .IF (_delta{1} > 0) _modulo{1} .EQU ({2}-(_delta{1} % {2})) .IF ({3} > 0) _modpos{1} .EQU (32-(. % 32)) .IF (_modpos{1} < 16) .DS 32,{3} .ENDIF .ENDIF _spacer{1} .DS _modulo{1},{3} .ENDIF .ENDM ; ; the macro codesegmarker fills up memory ; the string {name} is padded with ' ' to length 16 and put at the beginning, the remaining is filled with 0xFF ; one must give a unique {ID} ; ; this is useful if you want to speed-up flash programming with a larger code base and the need to incorporate small changes ; because of the aligned segments a small code change may not introduce a complete shift of the following code and thus ; avoid to re-program the following pages ; ; if the symbol 'segmentModding' == 0 the segment starts at address (FLASH_START + block_size) ; if 'segmentModding' == 1 the segment starts at next 32 byte boundary address ; .mac codesegmarker ; {name},{uniqueID},{block_size} .IF (segmentModding > 0) modspacer {2}a,32,$ff .ELSE .ORG ({3} + FLASH_START) .ENDIF .DC {1} modspacer {2}b,16,32 .ENDM .ORG FLASH_START alignspace Registers,$40 codesegmarker "serialFunc",5,$2a0 ; .INCLUDE<------>../common/serialFunc.asm nop codesegmarker "serialISR",6,$2e0 ; .INCLUDE<------>../common/serialISR.asm nop nop codesegmarker "timerISR",7,$400 nop ; .INCLUDE<------>../common/timerISR.asm <- dasm-2.20.14.1/test/align_mod_mac.bin.ref000066400000000000000000000003631375233463600177560ustar00rootroot00000000000000serialFunc serialISR timerISR dasm-2.20.14.1/test/align_mod_mac.hex.ref000066400000000000000000000012771375233463600177770ustar00rootroot00000000000000:10F80000ACACACACACACACACACACACACACACACAC38 :10F81000ACACACACACACACACACACACACACACACAC28 :10F82000ACACACACACACACACACACACACACACACAC18 :10F83000ACACACACACACACACACACACACACACACAC08 :10F84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :10F85000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :10F8600073657269616C46756E63202020202020CC :10F87000EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :10F88000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :10F89000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :10F8A00073657269616C495352202020202020200A :10F8B000EAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :10F8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :10F8D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :10F8E00074696D6572495352202020202020202009 :01F8F000EA2D :00000001FF dasm-2.20.14.1/test/atari2600/000077500000000000000000000000001375233463600153465ustar00rootroot00000000000000dasm-2.20.14.1/test/atari2600/Makefile000066400000000000000000000003621375233463600170070ustar00rootroot00000000000000 test: boing26.asm @../run_tests.sh -R ../../bin -F 3 -I ../../machines/atari2600/ boing26.bin: boing26.asm ../../bin/dasm boing26.asm -f3 -I../../machines/atari2600/ -oboing26.bin clean: rm -rf boing26.bin *.diff *.hex *.list.txt *.out dasm-2.20.14.1/test/atari2600/README000066400000000000000000000005211375233463600162240ustar00rootroot00000000000000 Some DASM test cases for Atari 2600 software For all of these examples, I received express written permission from all authors to include the code in the DASM distribution. boing26.asm Rob Kudla's Amiga Boing! demo from http://www.qotile.net/minidig/ boing26.bin.ref Cartridge ROM by Rob Kudla from http://www.qotile.net/minidig/ dasm-2.20.14.1/test/atari2600/boing26.args000066400000000000000000000000431375233463600174670ustar00rootroot00000000000000ARGS="-f3 -I../machines/atari2600/"dasm-2.20.14.1/test/atari2600/boing26.asm000066400000000000000000001044751375233463600173310ustar00rootroot00000000000000 processor 6502 ; TIA (Stella) write-only registers ; Vsync equ $00 Vblank equ $01 Wsync equ $02 Rsync equ $03 Nusiz0 equ $04 Nusiz1 equ $05 ColuP0 equ $06 ColuP1 equ $07 Colupf equ $08 ColuBK equ $09 Ctrlpf equ $0A Refp0 equ $0B Refp1 equ $0C Pf0 equ $0D Pf1 equ $0E Pf2 equ $0F RESP0 equ $10 RESP1 equ $11 Resm0 equ $12 Resm1 equ $13 Resbl equ $14 Audc0 equ $15 Audc1 equ $16 Audf0 equ $17 Audf1 equ $18 Audv0 equ $19 Audv1 equ $1A GRP0 equ $1B GRP1 equ $1C Enam0 equ $1D Enam1 equ $1E Enabl equ $1F HMP0 equ $20 HMP1 equ $21 Hmm0 equ $22 Hmm1 equ $23 Hmbl equ $24 VdelP0 equ $25 VdelP1 equ $26 Vdelbl equ $27 Resmp0 equ $28 Resmp1 equ $29 HMOVE equ $2A Hmclr equ $2B Cxclr equ $2C ; ; TIA (Stella) read-only registers ; Cxm0p equ $00 Cxm1p equ $01 Cxp0fb equ $02 Cxp1fb equ $03 Cxm0fb equ $04 Cxm1fb equ $05 Cxblpf equ $06 Cxppmm equ $07 Inpt0 equ $08 Inpt1 equ $09 Inpt2 equ $0A Inpt3 equ $0B Inpt4 equ $0C Inpt5 equ $0D ; ; RAM definitions ; Note: The system RAM maps in at 0080-00FF and also at 0180-01FF. It is ; used for variables and the system stack. The programmer must make sure ; the stack never grows so deep as to overwrite the variables. ; RamStart equ $0080 RamEnd equ $00FF StackBottom equ $00FF StackTop equ $0080 ; ; 6532 (RIOT) registers ; SWCHA equ $0280 Swacnt equ $0281 SWCHB equ $0282 Swbcnt equ $0283 Intim equ $0284 Tim1t equ $0294 Tim8t equ $0295 Tim64t equ $0296 T1024t equ $0297 ; ; ROM definitions ; RomStart equ $F000 RomEnd equ $FFFF IntVectors equ $FFFA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; s1 EQU $80 s2 EQU $82 s3 EQU $84 s4 EQU $86 s5 EQU $88 s6 EQU $8A DelayPTR EQU $8C LoopCount EQU $8E TopDelay EQU $8F BottomDelay EQU $90 MoveCount EQU $91 Temp EQU $92 RotateDir EQU $93 SkipFrame EQU $94 VerticalDir EQU $95 HorizontalDir EQU $96 VerticalPos EQU $97 HorizontalPos EQU $98 SoundQ EQU $99 SkipMove EQU $9a EggMode EQU $9b FrameCycle EQU $9c EggMusic EQU $9d ORG $F000 Cart_Init: SEI ; Disable interrupts.: CLD ; Clear "decimal" mode. LDX #$FF TXS ; Clear the stack Common_Init: LDX #$28 ; Clear the TIA registers ($04-$2C) LDA #$00 TIAClear: STA $04,X DEX BPL TIAClear ; loop exits with X=$FF LDX #$FF RAMClear: STA $00,X ; Clear the RAM ($FF-$80) DEX BMI RAMClear ; loop exits with X=$7F LDX #$FF TXS ; Reset the stack IOClear: STA Swbcnt ; console I/O always set to INPUT STA Swacnt ; set controller I/O to INPUT DemoInit: LDA #$01 STA VdelP0 STA VdelP1 LDA #$03 STA Nusiz0 STA Nusiz1 LDA #$36 ; a nice shade of red STA ColuP0 STA ColuP1 LDA #$ff ; page to get gfx from initially STA s1+1 STA s2+1 STA s3+1 STA s4+1 STA s5+1 STA s6+1 LDA #0 ; offset in the gfx data STA s1 LDA #50 ; offset in the gfx data STA s2 LDA #100 ; offset in the gfx data STA s3 LDA #150 ; offset in the gfx data STA s4 LDA #200 ; offset in the gfx data STA s5 LDA #0 ; vestigial! STA s6 LDA #$01 ; +1 or -1, rotating the ball STA RotateDir LDA #$01 ; Vertical direction, +1 or -1 STA VerticalDir LDA #$01 ; Same for horizontal STA HorizontalDir STA SoundQ ; Start out by making a noise LDA #1 STA SkipFrame STA SkipMove LDA #0 STA TopDelay STA MoveCount LDA #120 STA BottomDelay LDA #$f2 STA DelayPTR+1 LDA #$1d+36 ;????? STA DelayPTR STA Wsync NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP STA RESP0 STA RESP1 LDA #$50 ;????? STA HMP1 LDA #$40 ;????? STA HMP0 STA Wsync STA HMOVE STA Wsync LDA #$0f STA ColuBK NewScreen: LDA #$02 STA Wsync ; Wait for horizontal sync STA Vblank ; Turn on Vblank STA Vsync ; Turn on Vsync STA Wsync ; Leave Vsync on for 3 lines STA Wsync STA Wsync LDA #$00 STA Vsync ; Turn Vsync off LDA #43 ; Vblank for 37 lines ; changed from 43 to 53 for 45 lines PAL STA Tim64t ; 43*64intvls=2752=8256colclks=36.2lines JSR DoSound ; was too big to leave inline :P INC FrameCycle ; we'll use this for color cycling and ; possibly for sound DEC SkipFrame BNE Movement ; skip the animation most of the time LDA #3 ; number of frames to skip STA SkipFrame ; if it's zero, reset it SkipSkip: LDA EggMode ; check for easter egg :) CMP #0 ; no? how sad. BNE Movement LDA RotateDir ; which direction to rotate it in? CLC ADC s1+1 ; add that to the gfx page ORA #$F8 ; there are only 8 so mask the rest STA s1+1 STA s2+1 STA s3+1 STA s4+1 STA s5+1 Movement: LDA #$1 BIT SWCHB ; is someone pushing reset? BNE NoReset ; no? how sad. STA EggMode ; set egg mode JMP MoveDelay NoReset: LDA #0 STA EggMode ; no select = no easter egg. ; yes, I could have made it harder to find. ; gimme a break, I'm feeling good ;) MoveDelay: JSR CheckEgg ; override animation if necessary LDA SkipMove INC SkipMove AND #1 ; basically i lamed out and said BNE MoveHorizontal ; "skip every other frame" JMP VblankLoop MoveHorizontal: LDA HorizontalPos ; i couldn't figure out how to use HMOVE CLC ; without blowing up yet, so let's glom ADC HorizontalDir ; onto the joystick routines STA HorizontalPos LDA HorizontalDir CMP #0 BMI GoLeft GoRight: JSR Right LDA HorizontalPos CMP #112 ; i also haven't figured out how to make the BNE MoveVertical ; sprite go all the way to the right edge! LDA HorizontalDir ; since we're not using the 6th copy LDA #$FF STA HorizontalDir LDA #1 ; if we're reversing direction, we've hit a wall STA SoundQ ; so make a sound LDA RotateDir EOR #$FE STA RotateDir ; and change 1 into -1 (255) JMP MoveVertical GoLeft: JSR Left LDA HorizontalPos CMP #1 BNE MoveVertical LDA #$01 STA HorizontalDir STA SoundQ LDA RotateDir EOR #$FE STA RotateDir MoveVertical: LDA VerticalPos CLC ADC VerticalDir STA VerticalPos LDA VerticalDir CMP #0 BMI GoUp GoDown: JSR Down LDA VerticalPos CMP #120 ; kind of a rough approximation, yeah BNE EndMove LDA #$FF STA VerticalDir LDA #1 STA SoundQ LDA RotateDir EOR #$FE STA RotateDir JMP EndMove GoUp: JSR UP LDA VerticalPos CMP #1 BNE EndMove LDA #$01 STA VerticalDir STA SoundQ LDA RotateDir EOR #$FE STA RotateDir EndMove: JMP VblankLoop UP: LDA TopDelay BEQ U1 DEC TopDelay INC BottomDelay U1: RTS ; was JMP VblankLoop Down: LDA BottomDelay BEQ D1 INC TopDelay DEC BottomDelay D1: RTS; was JMP VblankLoop Right: LDX MoveCount INX STX MoveCount CPX #3 BNE R2 LDX DelayPTR DEX STX DelayPTR CPX #$1c ;????? BNE R1 LDA #$1d ;????? STA DelayPTR LDA #2 STA MoveCount RTS; was JMP VblankLoop R1: LDA #0 STA MoveCount R2: LDA #$f0 STA HMP0 STA HMP1 STA Wsync STA HMOVE RTS; was JMP VblankLoop Left: LDX MoveCount DEX STX MoveCount CPX #$ff BNE L2 LDX DelayPTR INX STX DelayPTR CPX #$1d+37 ; indexing into a code segment with a literal - naughty BNE L1 LDA #$1d+36 ; indexing into a code segment with a literal - naughty STA DelayPTR LDA #0 STA MoveCount RTS; was JMP VblankLoop L1: LDA #2 STA MoveCount L2: LDA #$10 STA HMP0 STA HMP1 STA Wsync STA HMOVE RTS; was JMP VblankLoop ORG $F200 VblankLoop: LDA Intim BNE VblankLoop ; wait for vblank timer STA Wsync ; finish waiting for the current line STA Vblank ; Turn off Vblank ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ScreenStart: LDY TopDelay INY ;????? X1: STA Wsync DEY BNE X1 LDY #4 ;????? X2: DEY BPL X2 LDA #49 ; 50 pixels high STA LoopCount JMP (DelayPTR) JNDelay: .byte $c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9 .byte $c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9 .byte $c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9 .byte $c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c9,$c5 NOP X3: NOP NOP NOP LDY LoopCount LDA (s1),Y STA GRP0 LDA (s2),Y STA GRP1 LDA (s3),Y STA GRP0 ; LDA (s6),Y lda $00 LDA #$00 STA Temp LDA (s5),Y TAX LDA (s4),Y LDY Temp STA GRP1 STX GRP0 STY GRP1 STA GRP0 DEC LoopCount BPL X3 LDA #0 STA GRP0 STA GRP1 STA GRP0 STA GRP1 NOP NOP NOP NOP NOP NOP NOP LDY BottomDelay INY ;????? X4: STA Wsync DEY BNE X4 LDA #$02 STA Vblank STA Wsync ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OverscanStart: LDA #34 ;skip 30 lines (overscan) STA Tim64t OverscanLoop: LDA Intim BNE OverscanLoop ; wait for Overscan timer OverscanDone: STA Wsync ; finish waiting for the current line JMP NewScreen ; sound routine ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoSound: LDA EggMode ; if egg mode is set, we do it differently CMP #0 BEQ StartSound LDA EggMusic AND #$7F ; we're doing 16 bars of 8th notes TAY LDA FrameCycle AND #1 BEQ UseSet2 UseSet1: LDA EggMusic1,Y ; channel 1 notes CMP #0 BEQ SetVol1 STA Audf0 LDA #5 ; I guess we'll try this for now STA Audc0 LDA #3 SetVol1: STA Audv0 LDA EggMusic2,Y ; channel 2 notes CMP #0 BEQ SetVol2 STA Audf1 LDA #8 ; I guess we'll try this for now STA Audc1 LDA #5 ; left hand s/b quieter SetVol2: STA Audv1 JMP ChangeNote UseSet2: LDA EggMusic3,Y ; channel 1 notes CMP #0 BEQ SetVol1a STA Audf0 LDA #5 ; I guess we'll try this for now STA Audc0 LDA #15 SetVol1a: STA Audv0 LDA EggMusic4,Y ; channel 2 notes CMP #0 BEQ SetVol2a STA Audf1 LDA #1 ; I guess we'll try this for now STA Audc1 LDA #12 ; left hand s/b quieter SetVol2a: STA Audv1 ChangeNote: LDA FrameCycle ; so we can skip every 3, 7 or 15 frames AND #$07 ; let's try 15 BNE EndSound INY STY EggMusic BNE EndSound StartSound: LDA FrameCycle ; so we can skip every 3, 7 or 15 frames AND #$03 ; let's try 15 BNE EndSound LDA SoundQ ; is there sound to be played? CMP #0 BEQ EndSound ; no? how sad. TAY CPY #1 ; if it's note #1 we can't do the cheezy echo. BEQ DoVoice1 DEY DoVoice2: LDA SoundFData,Y ; basically you just set SoundQ to an STA Audf1 ; offset and put frequency, control and LDA SoundCData,Y ; volume data in the data segment below STA Audc1 ; with zero termination. I was gonna do LDA SoundVData,Y ; a channel multiplexing music thing ; but I'm too lame. LSR ; Divide volume in half for the cheezy echo STA Audv1 INY DoVoice1: LDA SoundFData,Y ; see above STA Audf0 LDA SoundCData,Y STA Audc0 LDA SoundVData,Y STA Audv0 CMP #0 BNE NextNote ; if it's not zero there's more STA Audf0 STA Audc0 STA Audv1 STA SoundQ ; otherwise we turn off the sound and empty the Q JMP EndSound NextNote: INC SoundQ EndSound: RTS CheckEgg: LDA EggMode CMP #0 BEQ NoEgg ; no egg? how sad! LDA FrameCycle ; hey, it works in adventure STA ColuP0 STA ColuP1 LDA #$F6 STA s1+1 STA s2+1 STA s3+1 STA s4+1 STA s5+1 LDA #1 STA SoundQ RTS NoEgg: LDA #$36 ; otherwise set the color back to the STA ColuP0 ; lovely shade of red. this egg works much STA ColuP1 ; more smoothly than I expected. LDA #0 STA EggMusic RTS ; egg sound data ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG $F400 EggMusic3: .byte 23,0,23,0,23,23,0,0 .byte 23,0,23,0,23,23,0,0 .byte 23,0,19,0,29,0,26,0 .byte 23,23,23,23,0,0,0,0 .byte 22,0,22,0,22,0,22,0 .byte 22,0,23,0,23,0,23,0 .byte 23,0,26,0,26,0,23,0 .byte 26,26,26,26,19,19,19,19 .byte 23,0,23,0,23,23,0,0 .byte 23,0,23,0,23,23,0,0 .byte 23,0,19,0,29,0,26,0 .byte 23,23,23,23,0,0,0,0 .byte 22,0,22,0,22,0,22,0 .byte 22,0,23,0,23,0,23,0 .byte 19,0,19,0,22,0,28,0 .byte 29,29,29,29,14,14,14,14 EggMusic4: .byte 15,15,$00,$00,21,21,$00,$00 .byte 15,15,$00,$00,21,21,$00,$00 .byte 15,15,$00,$00,21,21,$00,$00 .byte 15,15,$00,$00,21,21,$00,$00 .byte 11,11,$00,$00,15,15,$00,$00 .byte 15,15,$00,$00,21,21,$00,$00 .byte 21,21,$00,$00,13,13,$00,$00 .byte 21,21,$00,$00,18,18,16,16 .byte 15,15,$00,$00,21,21,$00,$00 .byte 15,15,$00,$00,21,21,$00,$00 .byte 15,15,$00,$00,21,21,$00,$00 .byte 15,15,$00,$00,21,21,$00,$00 .byte 11,11,$00,$00,15,15,$00,$00 .byte 15,15,$00,$00,21,21,$00,$00 .byte 21,21,$00,$00,13,13,$00,$00 .byte 15,15,21,21,18,18,16,16 ORG $F500 EggMusic1: .byte 19,0,19,0,19,19,0,0 .byte 19,0,19,0,19,19,0,0 .byte 19,0,14,0,23,0,22,0 .byte 19,19,19,19,0,0,0,0 .byte 17,0,17,0,17,0,17,0 .byte 17,0,19,0,19,0,19,0 .byte 19,0,20,0,20,0,17,0 .byte 19,19,19,19,15,15,15,15 .byte 19,0,19,0,19,19,0,0 .byte 19,0,19,0,19,19,0,0 .byte 19,0,14,0,23,0,22,0 .byte 19,19,19,19,0,0,0,0 .byte 17,0,17,0,17,0,17,0 .byte 17,0,19,0,19,0,19,0 .byte 15,0,15,0,17,0,22,0 .byte 23,23,23,23,23,23,23,23 EggMusic2: .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 .byte 28,0,1,$00,28,0,1,$00 ; graphics data (boing ball) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG $F600 ; first column .byte $33,$37,$3e,$3c,$36,$33,$31,$00 .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $03,$03,$03,$03,$03,$03,$03,$00 .byte $3f,$00,$1f,$06,$06,$06,$06,$0e .byte $06,$00,$03,$03,$01,$00,$01,$03 .byte $03,$00,$31,$31,$31,$3f,$31,$31 .byte $31,$00 ; second column .byte $9f,$31,$31,$31,$31,$31,$b1,$00 .byte $33,$37,$3e,$33,$31,$31,$3f,$00 .byte $03,$03,$03,$f3,$03,$03,$fb,$00 .byte $ff,$00,$9e,$03,$01,$1f,$31,$31 .byte $1f,$00,$1b,$bb,$f3,$e3,$f3,$bb .byte $1b,$00,$b1,$b1,$bf,$b1,$b1,$9b .byte $8e,$00 ; third column .byte $3e,$b3,$b1,$b1,$b1,$b3,$be,$00 .byte $9f,$31,$31,$b1,$b1,$b1,$1f,$00 .byte $39,$73,$e3,$3b,$1b,$1b,$f1,$00 .byte $ff,$00,$1e,$03,$81,$9f,$b1,$b1 .byte $1f,$00,$1b,$1b,$5b,$fb,$fb,$b9 .byte $18,$00,$b0,$b0,$bf,$b1,$b1,$31 .byte $3f,$00 ; fourth column .byte $3f,$30,$b0,$b0,$b0,$30,$30,$00 .byte $3f,$b1,$b1,$bf,$b1,$b1,$3f,$00 .byte $f3,$1b,$1b,$1b,$1b,$1b,$f3,$00 .byte $ff,$00,$1e,$03,$81,$9f,$b1,$b1 .byte $1f,$00,$19,$1b,$f8,$19,$1b,$b3 .byte $e1,$00,$30,$30,$3f,$b1,$b1,$b1 .byte $3f,$00 ; fifth column .byte $63,$63,$7f,$63,$63,$36,$1c,$00 .byte $00,$80,$80,$00,$80,$80,$00,$00 .byte $18,$18,$58,$f8,$f8,$b8,$18,$00 .byte $ff,$00,$20,$00,$90,$98,$9c,$8e .byte $0e,$00,$f0,$18,$18,$f0,$00,$30 .byte $e0,$00,$0c,$0c,$0c,$9e,$b3,$b3 .byte $33,$00 ; sound data (bounce noise) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG $F700 SoundFData: .byte $1f,$19,$1a,$1b,$1c,$1d,$1e,$1f ORG $F750 SoundCData: .byte $07,$06,$06,$06,$06,$06,$06,$06 ORG $F7A0 SoundVData: .byte $0f,$0b,$0a,$08,$06,$04,$02,$00 ORG $F800 ; first column .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $01,$01,$03,$06,$06,$0d,$03,$23 .byte $23,$23,$23,$27,$47,$46,$48,$f8 .byte $38,$38,$38,$3c,$3c,$3c,$3c,$3d .byte $19,$01,$21,$20,$10,$10,$18,$08 .byte $0c,$0d,$01,$00,$00,$00,$00,$00 .byte $00,$00 ; second column .byte $00,$00,$03,$03,$0e,$0e,$8e,$8e .byte $9f,$1f,$18,$00,$60,$e0,$e0,$e0 .byte $e0,$e0,$e3,$ef,$9f,$1f,$1f,$1f .byte $1f,$0f,$0f,$0f,$0e,$10,$38,$f8 .byte $f8,$fc,$fc,$fc,$fe,$fe,$79,$60 .byte $40,$e0,$e0,$f0,$78,$3c,$1d,$08 .byte $00,$00 ; third column .byte $00,$40,$78,$3e,$1f,$0f,$06,$08 .byte $3c,$fc,$fc,$fe,$fe,$7f,$7e,$78 .byte $60,$40,$c0,$c0,$c0,$e0,$e0,$e0 .byte $e1,$e7,$ff,$0f,$0f,$0f,$0f,$07 .byte $07,$07,$02,$04,$3c,$fc,$fe,$fe .byte $fe,$7e,$7f,$38,$00,$70,$f8,$78 .byte $1c,$0e ; fourth column .byte $00,$00,$00,$00,$98,$fc,$1e,$1f .byte $0f,$07,$03,$00,$0e,$7e,$fe,$7f .byte $7f,$7f,$3f,$3f,$3f,$3c,$00,$60 .byte $e0,$e0,$e0,$e0,$f0,$f0,$f0,$f1 .byte $ff,$cf,$0f,$0f,$07,$07,$07,$06 .byte $08,$38,$f0,$f1,$72,$70,$60,$60 .byte $40,$00 ; fifth column .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $80,$d0,$b8,$18,$18,$0c,$0c,$06 .byte $06,$06,$84,$9c,$7c,$7c,$7c,$3c .byte $3c,$3c,$3e,$3e,$3c,$22,$42,$c2 .byte $c2,$c4,$c4,$c4,$c0,$88,$f0,$60 .byte $c0,$c0,$80,$80,$00,$00,$00,$00 .byte $00,$00 ORG $F900 ; first column .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $01,$01,$02,$06,$04,$0b,$17,$27 .byte $27,$27,$07,$0f,$4f,$4e,$40,$b0 .byte $70,$70,$30,$30,$30,$30,$38,$39 .byte $3f,$27,$07,$23,$01,$11,$11,$00 .byte $08,$09,$03,$01,$00,$00,$00,$00 .byte $00,$00 ; second column .byte $00,$00,$01,$01,$18,$1c,$dc,$9c .byte $3c,$3c,$3b,$61,$01,$81,$81,$81 .byte $81,$81,$83,$8f,$ff,$7f,$7f,$7f .byte $3f,$3f,$3f,$3f,$3e,$20,$00,$e0 .byte $e0,$e0,$f0,$f0,$f8,$f8,$ff,$e3 .byte $81,$81,$c0,$e0,$f0,$78,$3f,$10 .byte $00,$00 ; third column .byte $00,$01,$c0,$fc,$7e,$3f,$1e,$00 .byte $30,$f0,$f8,$f8,$f8,$fc,$fd,$fb .byte $e3,$81,$01,$01,$00,$00,$00,$00 .byte $81,$87,$9f,$7f,$7f,$3f,$3f,$3f .byte $1f,$1f,$1e,$08,$30,$f0,$f0,$f8 .byte $f8,$f8,$fc,$fb,$61,$41,$f0,$f8 .byte $1c,$00 ; fourth column .byte $00,$80,$60,$18,$00,$7c,$7c,$3e .byte $3f,$1f,$1f,$0c,$08,$78,$fc,$fc .byte $fc,$fe,$fe,$fe,$ff,$fc,$60,$00 .byte $80,$80,$80,$c0,$c0,$c0,$c0,$c1 .byte $ef,$df,$1f,$1f,$1f,$1f,$1f,$1e .byte $10,$21,$e1,$e1,$e3,$e4,$e0,$c0 .byte $80,$00 ; fifth column .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $00,$90,$b8,$38,$38,$1c,$1c,$0e .byte $0e,$0e,$00,$19,$f8,$f8,$f8,$f8 .byte $f8,$f8,$f8,$fc,$ff,$66,$06,$86 .byte $86,$84,$8c,$0c,$0c,$00,$60,$c0 .byte $c0,$80,$80,$00,$00,$00,$00,$00 .byte $00,$00 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG $FA00 ; first column .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $01,$02,$06,$04,$08,$0b,$17,$2f .byte $2f,$0f,$0f,$0e,$5e,$5f,$10,$a0 .byte $60,$60,$60,$60,$60,$60,$60,$31 .byte $37,$2f,$0f,$07,$07,$03,$13,$01 .byte $01,$09,$03,$01,$00,$00,$00,$00 .byte $00,$00 ; second column .byte $00,$00,$00,$03,$18,$38,$38,$38 .byte $38,$78,$7f,$e7,$87,$07,$07,$07 .byte $07,$03,$00,$0c,$7c,$fc,$fc,$fe .byte $fe,$fe,$fe,$fe,$ff,$60,$40,$80 .byte $80,$c0,$c0,$c0,$e0,$e0,$e7,$ef .byte $87,$03,$83,$81,$c1,$60,$33,$0b .byte $00,$00 ; third column .byte $00,$06,$c1,$f0,$f8,$7c,$7f,$30 .byte $20,$c0,$e0,$e0,$e0,$f0,$f1,$f7 .byte $e7,$87,$07,$07,$03,$03,$03,$03 .byte $00,$06,$1e,$fe,$fe,$ff,$ff,$ff .byte $7f,$7f,$7e,$78,$00,$c0,$e0,$e0 .byte $f0,$f0,$f0,$ff,$e7,$83,$c1,$e1 .byte $f1,$10 ; fourth column .byte $00,$00,$80,$60,$10,$70,$f8,$fc .byte $fc,$7e,$3f,$3c,$10,$60,$e0,$f0 .byte $f0,$f0,$f8,$f8,$fc,$ff,$e3,$83 .byte $03,$01,$01,$01,$01,$01,$01,$00 .byte $0e,$be,$7e,$7e,$7e,$7e,$7e,$3f .byte $31,$03,$c3,$c3,$c2,$e4,$e0,$e0 .byte $c0,$00 ; fifth column .byte $00,$00,$00,$00,$00,$00,$80,$40 .byte $30,$00,$70,$f0,$78,$78,$38,$3c .byte $3c,$1e,$18,$11,$f1,$f1,$f1,$f1 .byte $f1,$f0,$f0,$f8,$fa,$e6,$8e,$0e .byte $0c,$0c,$0c,$0c,$18,$10,$40,$c0 .byte $80,$80,$00,$00,$00,$00,$00,$00 .byte $00,$00 ORG $FB00 ; first column .byte $00,$00,$00,$00,$00,$00,$00,$01 .byte $01,$02,$06,$04,$09,$12,$1e,$0e .byte $1e,$1c,$1c,$1c,$1c,$3d,$33,$03 .byte $c3,$c3,$c3,$41,$41,$61,$61,$60 .byte $66,$7f,$0f,$0f,$0f,$07,$07,$03 .byte $03,$00,$07,$03,$01,$00,$00,$00 .byte $00,$00 ; second column .byte $00,$00,$01,$03,$01,$11,$70,$70 .byte $70,$70,$e7,$ff,$9f,$1f,$1f,$1f .byte $1f,$1f,$1c,$10,$70,$f0,$f0,$f0 .byte $f8,$f8,$f8,$f8,$f9,$e7,$c3,$03 .byte $03,$01,$01,$01,$80,$80,$87,$df .byte $bf,$1f,$0f,$87,$c3,$61,$33,$13 .byte $00,$00 ; third column .byte $00,$02,$e3,$e1,$f0,$f0,$f9,$f3 .byte $c3,$01,$81,$80,$80,$80,$c1,$c7 .byte $df,$9f,$1f,$1f,$1f,$0f,$0f,$0f .byte $0e,$00,$18,$f8,$f8,$f8,$fc,$fc .byte $fc,$fc,$ff,$f9,$c1,$01,$00,$80 .byte $80,$c0,$e0,$e7,$ef,$87,$07,$c3 .byte $f3,$32 ; fourth column .byte $00,$00,$c0,$f0,$62,$41,$e0,$f0 .byte $f8,$fc,$fe,$fd,$70,$00,$80,$c0 .byte $c0,$c0,$e0,$e0,$e0,$f3,$ef,$8f .byte $0f,$0f,$0f,$07,$07,$07,$07,$02 .byte $0c,$3c,$fc,$fc,$fc,$fc,$fc,$fd .byte $f3,$47,$87,$87,$86,$8e,$c8,$d0 .byte $80,$00 ; fifth column .byte $00,$00,$00,$00,$00,$00,$80,$c0 .byte $70,$20,$60,$e0,$f0,$f0,$f8,$78 .byte $78,$7c,$3a,$23,$c3,$c3,$c3,$c1 .byte $e1,$e1,$e1,$e1,$e2,$fe,$9c,$1c .byte $1c,$1c,$3c,$38,$38,$30,$48,$90 .byte $90,$a0,$40,$00,$00,$00,$00,$00 .byte $00,$00 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG $FC00 ; first column .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $02,$00,$01,$01,$0b,$12,$0c,$18 .byte $18,$18,$38,$38,$38,$31,$3f,$4f .byte $87,$c7,$c7,$47,$47,$47,$47,$46 .byte $44,$5c,$1e,$1e,$0e,$0f,$0f,$07 .byte $07,$02,$06,$03,$01,$00,$00,$00 .byte $00,$00 ; second column .byte $00,$00,$01,$03,$07,$23,$61,$61 .byte $e1,$e1,$c6,$de,$be,$3f,$3f,$3f .byte $3f,$3f,$3c,$30,$40,$c0,$c0,$c0 .byte $c0,$c0,$e0,$e0,$e1,$ff,$df,$0f .byte $0f,$07,$07,$07,$03,$03,$04,$9e .byte $fe,$3f,$1f,$1f,$8f,$47,$24,$0f .byte $01,$00 ; third column .byte $00,$08,$07,$83,$c0,$e0,$f1,$ff .byte $c7,$07,$07,$03,$03,$01,$00,$06 .byte $1f,$7f,$7f,$7f,$7f,$7f,$7f,$3f .byte $3e,$38,$20,$e0,$e0,$e0,$e0,$f0 .byte $f0,$f0,$f1,$ff,$c7,$07,$03,$03 .byte $03,$01,$01,$86,$9f,$9f,$0f,$87 .byte $e3,$3c ; fourth column .byte $00,$00,$80,$f0,$e6,$43,$c1,$c0 .byte $e0,$e0,$f0,$fb,$f3,$83,$03,$01 .byte $01,$01,$00,$80,$80,$83,$df,$bf .byte $3f,$3f,$3f,$3f,$1f,$1f,$1f,$1e .byte $10,$20,$e0,$f0,$f0,$f0,$f0,$f1 .byte $ff,$cf,$0e,$0e,$0e,$0e,$88,$80 .byte $40,$00 ; fifth column .byte $00,$00,$00,$00,$00,$00,$80,$c0 .byte $f0,$60,$40,$c0,$e0,$e0,$f0,$f0 .byte $f8,$f8,$fe,$e6,$07,$03,$83,$83 .byte $83,$83,$83,$83,$82,$dc,$bc,$38 .byte $78,$78,$78,$78,$70,$78,$08,$90 .byte $30,$20,$40,$00,$00,$00,$00,$00 .byte $00,$00 ORG $FD00 ; first column .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $00,$00,$01,$01,$03,$14,$08,$18 .byte $18,$10,$30,$30,$30,$31,$6f,$5f .byte $8f,$8f,$8f,$0f,$0f,$0f,$0f,$4e .byte $48,$58,$38,$38,$1c,$1c,$0e,$0e .byte $0e,$06,$04,$02,$01,$00,$00,$00 .byte $00,$00 ; second column .byte $00,$00,$00,$03,$07,$23,$23,$43 .byte $c3,$c3,$84,$9c,$fc,$7c,$7c,$7c .byte $7c,$fc,$ff,$f1,$81,$01,$81,$81 .byte $80,$80,$80,$80,$81,$9f,$bf,$3f .byte $3f,$3f,$1f,$1f,$1f,$0f,$08,$18 .byte $7c,$fc,$7e,$3e,$1f,$1f,$04,$0e .byte $01,$00 ; third column .byte $00,$0c,$0f,$07,$83,$81,$c1,$ef .byte $df,$1f,$0f,$0f,$0f,$07,$06,$00 .byte $1c,$7c,$fc,$fc,$fe,$fe,$fe,$ff .byte $fe,$f8,$e0,$00,$00,$80,$80,$80 .byte $c0,$c0,$e1,$e7,$df,$1f,$0f,$0f .byte $0f,$07,$07,$00,$1c,$fe,$3e,$0f .byte $85,$7c ; fourth column .byte $00,$00,$00,$c0,$fe,$8f,$07,$83 .byte $81,$c0,$e0,$e3,$ff,$8f,$0f,$07 .byte $07,$03,$03,$03,$01,$02,$1e,$7e .byte $fe,$fe,$fe,$7f,$7f,$7f,$7f,$7e .byte $70,$00,$c0,$c0,$c0,$c0,$c0,$c1 .byte $ee,$de,$1e,$1c,$1c,$1e,$1c,$10 .byte $20,$00 ; fifth column .byte $00,$00,$00,$00,$00,$00,$80,$c0 .byte $e0,$e0,$08,$80,$80,$c4,$c0,$e2 .byte $e0,$f0,$f6,$ee,$0e,$06,$06,$06 .byte $06,$07,$07,$07,$05,$19,$78,$f8 .byte $f0,$f2,$f0,$f0,$f0,$f8,$90,$30 .byte $20,$40,$40,$80,$00,$00,$00,$00 .byte $00,$00 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG $FE00 ; first column .byte $00,$00,$00,$00,$00,$00,$00,$01 .byte $01,$03,$03,$07,$07,$04,$08,$10 .byte $10,$30,$30,$31,$21,$20,$6f,$5f .byte $9f,$9f,$9f,$1f,$1f,$1f,$1f,$4e .byte $48,$50,$30,$38,$18,$1c,$0c,$0e .byte $0e,$07,$04,$00,$00,$00,$00,$00 .byte $00,$00 ; second column .byte $00,$00,$01,$03,$07,$07,$47,$cf .byte $cf,$8f,$88,$18,$78,$f8,$f8,$f8 .byte $f8,$fc,$ff,$f3,$83,$03,$03,$01 .byte $01,$01,$01,$01,$00,$9f,$bf,$7f .byte $7f,$3f,$3f,$3f,$1f,$1f,$18,$10 .byte $78,$fc,$fc,$7e,$3e,$1f,$0c,$00 .byte $00,$00 ; third column .byte $00,$3c,$9e,$8f,$07,$83,$80,$8f .byte $ff,$3f,$1f,$1f,$1f,$0f,$0e,$08 .byte $18,$78,$f8,$f8,$fc,$fc,$fc,$fc .byte $ff,$f9,$e1,$01,$01,$00,$00,$00 .byte $80,$80,$81,$87,$ff,$3f,$1f,$1f .byte $0f,$0f,$0f,$00,$18,$7c,$3e,$1e .byte $0f,$06 ; fourth column .byte $00,$00,$00,$80,$fe,$8f,$07,$03 .byte $03,$81,$c0,$c3,$ef,$9f,$1f,$0f .byte $0f,$0f,$07,$07,$03,$00,$1c,$7c .byte $fc,$fe,$fe,$fe,$fe,$fe,$fe,$ff .byte $f1,$41,$81,$81,$81,$81,$81,$c0 .byte $ce,$fc,$3c,$3c,$3c,$38,$38,$30 .byte $20,$00 ; fifth column .byte $00,$00,$00,$00,$00,$00,$00,$80 .byte $c0,$f0,$88,$08,$80,$84,$c4,$c2 .byte $c2,$e0,$e6,$ee,$0e,$0e,$0e,$0e .byte $0e,$0f,$0f,$07,$05,$19,$70,$f0 .byte $f0,$f0,$f0,$f0,$e4,$e8,$b0,$30 .byte $60,$40,$c0,$80,$00,$00,$00,$00 .byte $00,$00 ORG $FF00 ; first column .byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $00,$01,$01,$03,$07,$04,$01,$31 .byte $31,$31,$21,$21,$61,$60,$4e,$fe .byte $3e,$1e,$1e,$1e,$1f,$1f,$1f,$1e .byte $18,$10,$30,$30,$18,$18,$1c,$0c .byte $0e,$0f,$00,$00,$00,$00,$00,$00 .byte $00,$00 ; second column .byte $00,$00,$03,$03,$07,$07,$87,$cf .byte $8f,$8f,$88,$10,$70,$f0,$f0,$f8 .byte $f8,$f8,$fb,$f7,$87,$07,$07,$07 .byte $03,$03,$03,$03,$02,$1e,$3e,$fe .byte $fe,$7f,$7f,$7f,$3f,$3f,$38,$00 .byte $60,$f0,$f8,$7c,$3c,$1e,$0c,$0c .byte $00,$00 ; third column .byte $00,$20,$fe,$8f,$07,$07,$02,$8e .byte $be,$7f,$3f,$3f,$3f,$1f,$1e,$18 .byte $00,$70,$f0,$f0,$f0,$f8,$f8,$f8 .byte $fd,$fb,$e3,$03,$03,$03,$01,$01 .byte $01,$01,$00,$07,$bf,$7f,$7f,$3f .byte $3f,$1f,$1f,$08,$10,$78,$7c,$1e .byte $0f,$00 ; fourth column .byte $00,$00,$00,$00,$dc,$be,$0f,$07 .byte $03,$01,$81,$83,$cf,$bf,$3f,$1f .byte $1f,$1f,$0f,$0f,$0f,$04,$18,$78 .byte $f8,$fc,$fc,$fc,$fc,$fc,$fc,$fd .byte $f3,$c3,$03,$03,$03,$03,$83,$82 .byte $8c,$bc,$7c,$38,$39,$38,$38,$60 .byte $40,$00 ; fifth column .byte $00,$00,$00,$00,$00,$00,$00,$80 .byte $c0,$f0,$98,$08,$08,$84,$84,$86 .byte $c2,$c2,$c4,$fe,$1e,$1e,$1e,$1e .byte $0e,$0e,$0e,$0e,$0d,$11,$70,$f2 .byte $e2,$e2,$e0,$e0,$e0,$c8,$b0,$30 .byte $60,$40,$c0,$80,$00,$00,$00,$00 .byte $00,$00 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Set up the 6502 interrupt vector table ; ORG IntVectors NMI .word Cart_Init Reset .word Cart_Init IRQ .word Cart_Init ; END dasm-2.20.14.1/test/atari2600/boing26.bin.ref000066400000000000000000000100001375233463600200500ustar00rootroot00000000000000xآ(0%&62dȅx򅍩AP!@ * + Ɣe ,L C)Le0 p(IL5  Ie0 }x&ILq t ILƏ`Ɛ`膑ʆ ` !*`ʆ膌B A` !*`ȅ1lꤎƎ֩ꤐȅ"L]))%L )HȄC)=7PJȹP LB``6`    37><631?111?1111111137>311?11>119s;[1??000??00??cccc6X 0 3  ####'GFH888<<<<=!  `8y`@x<@x><~x`@<~8px~???<`8rp``@и |||<<<>><"B` '''ON@pp000089?'# ܜ<<;a????> ぁx?~?0???0aA`||>? x`!88f ` //^_```````17/ 8888x |`@`3 |0 ~x`p~?<`~~~~~?1@0pxx8<< @ =3AAaa`fppppp߿a3ߟ2bAp 8 <C߿???? @`@ܼ8xxxxpx0 @0001o_NHX88##CÄ||||???|~> |>|~~p x0 @@001! o_NHP08 GϏx???x~> <?x?|>|A<<<880 p0`@111!!a`N>00 Ϗp>??8`|< ???p??x|ܾϿ?x|8988`@ pȰ0`@dasm-2.20.14.1/test/atari7800/000077500000000000000000000000001375233463600153555ustar00rootroot00000000000000dasm-2.20.14.1/test/atari7800/Makefile000066400000000000000000000004201375233463600170110ustar00rootroot00000000000000 test: spritesample.asm @../run_tests.sh -R ../../bin -F 3 -I ../../machines/atari7800/ spritesample.bin: spritesample.asm ../../bin/dasm spritesample.asm -f3 -I../../machines/atari7800/ -ospritesample.bin clean: rm -rf spritesample.bin *.diff *.hex *.list.txt *.out dasm-2.20.14.1/test/atari7800/README000066400000000000000000000003431375233463600162350ustar00rootroot00000000000000 Some DASM test cases for Atari 7800 software For all of these examples, I received express written permission from all authors to include the code in the DASM distribution. spritesample.asm Dan Boris' simple sprite sample dasm-2.20.14.1/test/atari7800/spritesample.args000066400000000000000000000000431375233463600207400ustar00rootroot00000000000000ARGS="-f3 -I../machines/atari7800/"dasm-2.20.14.1/test/atari7800/spritesample.asm000066400000000000000000000234131375233463600205720ustar00rootroot00000000000000; Atari 7800 sprite sample ; ; Written by Daniel Boris (dboris@home.com) ; original at http://atarihq.com/danb/files/7800sprt.s ; ; Adapted to use 7800.h, optional a78 header added, and new ; comments added by Mike Saarna. ; ; NOTE: assembling this source will create a simple BIN file. To ; add an a78 header that most emulators will expect, assemble ; with -DA78HEADER, or uncomment the line below... ; ;A780HEADER = 1 ; ; ...and be sure to use the A78 extension for your bin. ; ; The binary won't be cryptographically signed, meaning it won't pass ; the 7800 bios boot checks. This probably won't stop the bin from ; running on most emulators. This may stop it from running on some ; flash carts. It will certainly stop it running from EPROM based carts ; To cryptographically sign binaries, you can use the tools found in ; the 7800AsmDevKit - http://7800.8bitdev.org/index.php/7800AsmDevKit processor 6502 include "7800.h" SEG.U data ;******* Variables ******************************** org $40 xpos ds.b 1 ;X Position of sprite ypos ds.b 1 ;Y Position of sprite temp ds.b 1 dlpnt ds.w 1 dlend ds.b 12 ;Index of end of each DL ;********************************************************** SEG ROM ifconst A78HEADER HEADER ORG ROMTOP-128 DC.B 1 ; 0 Header version - 1 byte DC.B "ATARI7800" ; 1..16 "ATARI7800 " - 16 bytes DS 7,32 DC.B "Dan Boris, sprite sample"; 17..48 Cart title - 32 bytes DS HEADER+49-.,0 DC.B $00,$00,256->ROMTOP,$00; 49..52 data length - 4 bytes DC.B $00,$00 ; 53..54 cart type - 2 bytes ; bit 0 - pokey at $4000 ; bit 1 - supergame bank switched ; bit 2 - supergame ram at $4000 ; bit 3 - rom at $4000 ; bit 4 - bank 6 at $4000 ; bit 5 - supergame banked ram ; bit 6 - pokey at $450 ; bit 7 - mirror ram at $4000 ; bit 8-15 - Special ; 0 = Normal cart DC.B 1 ; 55 controller 1 type - 1 byte DC.B 1 ; 56 controller 2 type - 1 byte ; 0 = None ; 1 = Joystick ; 2 = Light Gun DC.B 0 ; 57 0 = NTSC 1 = PAL DC.B 0 ; 58 Save data peripheral - 1 byte (version 2) ; 0 = None / unknown (default) ; 1 = High Score Cart (HSC) ; 2 = SaveKey ORG HEADER+63 DC.B 0 ; 63 Expansion module ; 0 = No expansion module (default on all currently released games) ; 1 = Expansion module required ORG HEADER+100 ; 100..127 "ACTUAL CART DATA STARTS HERE" - 28 bytes DC.B "ACTUAL CART DATA STARTS HERE" endif ROMTOP ORG $8000 ;Start of code START sei ;Disable interrupts cld ;Clear decimal mode ;******** Atari recommended startup procedure lda #$07 sta INPTCTRL ;Lock into 7800 mode lda #$7F sta CTRL ;Disable DMA lda #$00 sta OFFSET sta INPTCTRL ldx #$FF ;Reset stack pointer txs ;************** Clear zero page and hardware ****** ldx #$40 lda #$00 crloop1 sta $00,x ;Clear zero page sta $100,x ;Clear page 1 inx bne crloop1 ;************* Clear RAM ************************** ldy #$00 ;Clear Ram lda #$18 ;Start at $1800 sta $81 lda #$00 sta $80 crloop3 lda #$00 sta ($80),y ;Store data iny ;Next byte bne crloop3 ;Branch if not done page inc $81 ;Next page lda $81 cmp #$20 ;End at $1FFF bne crloop3 ;Branch if not ldy #$00 ;Clear Ram lda #$22 ;Start at $2200 sta $81 lda #$00 sta $80 crloop4 lda #$00 sta ($80),y ;Store data iny ;Next byte bne crloop4 ;Branch if not done page inc $81 ;Next page lda $81 cmp #$27 ;End at $27FF bne crloop4 ;Branch if not ldx #$00 lda #$00 crloop5 ;Clear 2100-213F sta $2100,x inx cpx #$40 bne crloop5 ;************* Build DLL ******************* ; 20 blank lines ldx #$00 lda #$4F ;16 lines sta $1800,x inx lda #$21 ;$2100 = blank DL sta $1800,x inx lda #$00 sta $1800,x inx lda #$44 ;4 lines sta $1800,x inx lda #$21 sta $1800,x inx lda #$00 sta $1800,x inx ; 192 mode lines divided into 12 regions ldy #$00 DLLloop2 lda #$4F ;16 lines sta $1800,x inx lda DLPOINTH,y sta $1800,x inx lda DLPOINTL,y sta $1800,x inx iny cpy #$0D ;12 DLL entries bne DLLloop2 ; 26 blank lines lda #$4F ;16 lines sta $1800,x inx lda #$21 ;$2100 = blank DL sta $1800,x inx lda #$00 sta $1800,x inx lda #$4A ;10 lines sta $1800,x inx lda #$21 sta $1800,x inx lda #$00 sta $1800,x ;***************** Setup Maria Registers **************** lda #$18 ;DLL at $1800 sta DPPH lda #$00 sta DPPL lda #$18 ;Setup Palette 0 sta P0C1 lda #$38 sta P0C2 lda #$58 sta P0C3 lda #$43 ;Enable DMA sta CTRL lda #$00 ;Setup ports to read mode sta CTLSWA sta CTLSWB lda #$40 ;Set initial X position of sprite sta xpos mainloop lda MSTAT ;Wait for VBLANK and #$80 beq mainloop lda SWCHA ;Read stick and #$80 ;Pushed Right? bne skip1 ldx xpos ;Move sprite to right inx stx xpos skip1 lda SWCHA ;Read stick and #$40 ;Pushed Left? bne skip2 ldx xpos ;Move sprite to left dex stx xpos skip2 lda SWCHA ;Read stick and #$20 ;Pushed Down? bne skip3 ldx ypos ;Move sprite down cpx #176 beq skip3 ;Don't move if we are at the bottom inx stx ypos skip3 lda SWCHA ;Read stick and #$10 ;Pushed Up? bne skip4 ldx ypos ;Move sprite up beq skip4 ;Don't move if we are at the top dex stx ypos skip4 ;********************** reset DL ends ****************** ldx #$0C lda #$00 dlclearloop dex sta dlend,x bne dlclearloop ;******************** build DL entries ********************* lda ypos ;Get Y position and #$F0 lsr ;Divide by 16 lsr lsr lsr tax lda DLPOINTL,x ;Get pointer to DL that this sprite starts in sta dlpnt lda DLPOINTH,x sta dlpnt+1 ;Create DL entry for upper part of sprite ldy dlend,x ;Get the index to the end of this DL lda #$00 sta (dlpnt),y ;Low byte of data address iny lda #$40 ;Mode 320x1 sta (dlpnt),y iny lda ypos and #$0F ora #$a0 sta (dlpnt),y iny lda #$1F ;Palette 0, 1 byte wide sta (dlpnt),y iny lda xpos ;Horizontal position sta (dlpnt),y sty dlend,x lda ypos and #$0F ;See if sprite is entirely within this region beq doneDL ;branch if it is ;Create DL entry for lower part of sprite inx ;Next region lda DLPOINTL,x ;Get pointer to next DL sta dlpnt lda DLPOINTH,x sta dlpnt+1 ldy dlend,x ;Get the index to the end of this DL lda #$00 sta (dlpnt),y iny lda #$40 ;Mode 320x1 sta (dlpnt),y iny lda ypos and #$0F eor #$0F sta temp lda #$a0 clc sbc temp sta (dlpnt),y iny lda #$1F ;Palette 0, 1 byte wide sta (dlpnt),y iny lda xpos ;Horizontal position sta (dlpnt),y sty dlend,x doneDL ;************** add DL end entry on each DL ***************************** ldx #$0C dlendloop dex lda DLPOINTL,x sta dlpnt lda DLPOINTH,x sta dlpnt+1 ldy dlend,x iny lda #$00 sta (dlpnt),y txa bne dlendloop vbloop lda MSTAT ;Wait for VBLANK to end and #$80 bne vbloop jmp mainloop ;Loop redraw NMI RTI IRQ RTI ;Pointers to the DLs DLPOINTH .byte $22,$22,$22,$22,$23,$23,$23,$23,$24,$24,$24,$24 DLPOINTL .byte $00,$40,$80,$C0,$00,$40,$80,$C0,$00,$40,$80,$C0 ;************** Graphic Data ***************************** org $a000 .byte %00111100 org $a100 .byte %00111100 org $a200 .byte %01000010 org $a300 .byte %01000010 org $a400 .byte %10011001 org $a500 .byte %10011001 org $a600 .byte %10100101 org $a700 .byte %10100101 org $a800 .byte %10000001 org $a900 .byte %10000001 org $aA00 .byte %10100101 org $aB00 .byte %10100101 org $aC00 .byte %01000010 org $aD00 .byte %01000010 org $aE00 .byte %00111100 org $aF00 .byte %00111100 ;************** Cart reset vector ************************** org $fff8 .byte $FF ;Region verification .byte $87 ;ROM start $4000 .word #NMI .word #START .word #IRQ dasm-2.20.14.1/test/atari7800/spritesample.bin.ref000066400000000000000000001000001375233463600213210ustar00rootroot00000000000000xة<8@恥 "恥'!@O!D!O蹷Á O!J!,0!8"X#C<@@())@@)@@ʆ@) AA)AʆA ʕEA)JJJJÁCDECȩ@CȥA) CȩCȥ@CEA)2ÁCDECȩ@CȥA)IBBCȩCȥ@CE ʽÁCDEȩC()L@@""""####$$$$@@@< test case for bug ; in error handling. processor 6502 ORG $f800 ldz #$00 ; illegal mnemonic dasm-2.20.14.1/test/badopcode1.fail000066400000000000000000000000011375233463600165630ustar00rootroot000000000000005dasm-2.20.14.1/test/badopcode2.asm000066400000000000000000000001221375233463600164350ustar00rootroot00000000000000; Test case for bug in error handling. processor 6502 ORG $f800 jsr ($1000) dasm-2.20.14.1/test/badopcode2.fail000066400000000000000000000000011375233463600165640ustar00rootroot000000000000003dasm-2.20.14.1/test/broken6303hack.asm000066400000000000000000000022111375233463600170570ustar00rootroot00000000000000; See ../src/BUGS for the details. Here's how to use macros ; to work around the issue. .processor HD6303 .mac hack dc.b {1} ; opcode dc.b {2} ; immediate value dc.b {3} ; zero-page address .endm .mac aimd hack $71,{1},{2} .endm .mac aimx hack $61,{1},{2} .endm .mac oimd hack $72,{1},{2} .endm .mac oimx hack $62,{1},{2} .endm .mac eimd hack $75,{1},{2} .endm .mac eimx hack $65,{1},{2} .endm .mac timd hack $7b,{1},{2} .endm .mac timx hack $6b,{1},{2} .endm .org $0 ; the broken DASM versions aim $10 ; assembles to 71 10 aim $10,x ; assembles to 61 10 oim $10 ; assembles to 72 10 oim $10,x ; assembles to 62 10 eim $10 ; assembles to 75 10 eim $10,x ; assembles to 65 10 tim $10 ; assembles to 7B 10 tim $10,x ; assembles to 6B 10 ; the fixed macro versions aimd $10,$20 ; should be "aim #$10,$20" aimx $10,$20 ; should be "aim #$10,$20,x" oimd $10,$20 ; should be "oim #$10,$20" oimx $10,$20 ; should be "oim #$10,$20,x" eimd $10,$20 ; should be "eim #$10,$20" eimx $10,$20 ; should be "eim #$10,$20,x" timd $10,$20 ; should be "tim #$10,$20" timx $10,$20 ; should be "tim #$10,$20,x" .end dasm-2.20.14.1/test/broken6303hack.bin.ref000066400000000000000000000000521375233463600176230ustar00rootroot00000000000000qarbue{kq a r b u e { k dasm-2.20.14.1/test/broken6303hack.hex.ref000066400000000000000000000002041375233463600176360ustar00rootroot00000000000000:100000007110611072106210751065107B106B100A :100010007110206110207210206210207510206570 :0800200010207B10206B102062 :00000001FF dasm-2.20.14.1/test/channel-f/000077500000000000000000000000001375233463600155715ustar00rootroot00000000000000dasm-2.20.14.1/test/channel-f/Makefile000066400000000000000000000005411375233463600172310ustar00rootroot00000000000000 test: lights.asm tetris.asm @../run_tests.sh -R ../../bin -F 3 -I ../../machines/channel-f/ lights.bin: lights.asm ../../bin/dasm lights.asm -f3 -I../../machines/channel-f/ -olights.bin tetris.bin: tetris.asm ../../bin/dasm tetris.asm -f3 -I../../machines/channel-f/ -otetris.bin clean: rm -rf lights.bin tetris.bin *.diff *.hex *.list.txt *.out dasm-2.20.14.1/test/channel-f/README000066400000000000000000000013631375233463600164540ustar00rootroot00000000000000 Some DASM test cases for Channel-F software For all of these examples, I received express written permission from all authors to include the code in the DASM distribution. lights.asm Sean Riddle's Lights Out game from http://members.cox.net/seanriddle/ Ported to DASM (well, actually DASM2 :-) by Thomas Mathys lights.bin.ref Cartridge ROM by Sean Riddle from http://members.cox.net/seanriddle/ Generated with f8tool, another assembler for the F8 tetris.asm Peter Trauner's Tetris game from http://members.cox.net/seanandalicia/ Ported to DASM (well, two lines were added :-) by Peter Froehlich tetris.bin.ref Cartridge ROM by Peter Trauner from http://members.cox.net/seanandalicia/ Generated with f8tool, another assembler for the F8 dasm-2.20.14.1/test/channel-f/lights.args000066400000000000000000000000461375233463600177410ustar00rootroot00000000000000ARGS="-f3 -I../../machines/channel-f/"dasm-2.20.14.1/test/channel-f/lights.asm000066400000000000000000000702211375233463600175670ustar00rootroot00000000000000; Sean Riddle's lights.asm, the first reallife program ever assembled ; by dasm2. The usual modifications to f8tool source were needed: ; - Needed to add the processor directive at the top of the source. ; - Needed to indent the org directives because dasm2 would parse ; them as labels. ; - The first org directive sets the org fill value to 0, since this ; is what f8tool uses and the reference binary was assembled with ; f8tool. ; ;lights out ;by Sean Riddle ;6/2004 ;members.cox.net/seanriddle ; ; Copyright (C) 2004 Sean Riddle (members.cox.net/seanriddle) ; ; lights is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. ; ; lights is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with lights; if not, write to the Free Software ; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ;for the Channel F multigame ;it will play in MESS ;it requires MG RAM at $2800 (could be rewritten to use regs only) ;instructions: ;make all lights green ;l/r/u/d moves cursor ;push down toggles lights ;pull up replays current pattern ;when complete, the count of moves is shown ;then up replays pattern, down goes to next random ;after all 64 patterns are played randomly, the complements (red<->green) are played ;game 1 is normal - all included patterns are solvable ;game 2 is on a torus (wrap-around) !!! not all included patterns are solvable on a torus ;game 3 is lit-only (only lit buttons can be pressed) ;mode 1 toggles self and u/d/l/r neighbors - + pattern ;mode 2 only toggles u/d/l/r neighbors !!! not all included patterns are solvable in this mode ;mode 3 toggles self and nw/ne/sw/se neighbors - X pattern ;mode 4 toggles nw/ne/sw/ne - X not self ;todo: ;build game 2 or mode 2 patterns from random legal moves ;add random legal moves to patterns to create more ;rotate, invert patterns randomly for more variation ;three-state red, green, gray ;L modes ;more symbols-greek, smilies, arcade, ;currently 12 bytes short of 2K, but there's lots more room ;egg - certain game/mode combo, solve certain pattern in minimum moves processor f8 ;BIOS calls clrscrn: equ $00d0 ;uses r31 delay: equ $008f pushk: equ $0107 ;used to allow more subroutine stack space popk: equ $011e drawchar: equ $0679 array: equ $2800 ;use Schach RAM to hold current state of 25 lights history: equ $2900 ;patterns we have already used, so we don't repeat temp4: equ $2a00 ;temp storage of 4 bytes org $800,0 CartridgeStart: db $55 ; valid cart indicator NOP ; unused byte CartridgeEntry: LIS $0 ; init the h/w OUTS 1 OUTS 4 OUTS 5 OUTS 0 lisu 4 ;r32=complement flag lisl 0 lr (IS),a LI $d6 ; LR $3,A ; clear screen to gray PI clrscrn ; li $11 lisu 3 ;init R30 game 1, mode 1 lisl 6 lr (IS),a li $4a ;display G? prompt lr 0,a pi prompt lr a,4 sl 4 lisu 3 ;r30 low nibble = game lisl 6 lr (IS),a ;game 1 - normal, game 2 - wraparound; game 3 - lit only pi prompts ;display S?/M? ; mode 1 normal, mode 2 no center toggle clrhist: ;clear history of patterns presented dci history li $41 ; # of patterns +1 lr 0,a clrhist2: lis 0 st ds 0 bf 4,clrhist2 nextpat: lisu 2 ;random # lisl 5 lr a,(IS) lisu 3 lisl 5 as (IS) ;add to current pattern... ni $3f ;...mod 64... lr (IS),a ;...to get next pattern dci history ;check to see if we've already done this one adc lr q,dc lm ni $ff bt 4,unusedpat ;not yet used, display it ;pattern already used, check for unused from top ;if not found, clear array and start over dci history checknext: lm ni $ff bf 4,checknext ;will always complete because we zeroed 1 extra byte in clrhist lr q,dc lr a,ql ai $ff ;lm moved us 1 past lr ql,a ci $40 ;all done? bf 4,foundone li $ff lisu 4 ; set flag to start complements (random/rotations later) lisl 0 lr (IS),a bf 0,clrhist ;no empty slots, start over foundone: lr (IS),a ;update the current pattern unusedpat: lr dc,q ;mark it used li $ff st replay: lisu 3 ;current pattern # in r29 lisl 5 lr a,(IS) dci pats adc ; add cur pat to data pointer 5 times to get to the pat data adc adc adc adc getpat: lisu 2 ;read bit pattern into regs 16-20 lisl 0 lis 5 lr 1,a getpatloop: lm lr (is)+,a ds 1 bf 4,getpatloop dci array ;put byte pattern into RAM lis 5 lr 2,a lisu 4 ;first time through 0, next time FF lisl 0 lr a,(IS) lr 3,a ;temp lisu 2 lisl 0 storepatloop2: lis 5 lr 1,a lr a,(is)+ storepatloop: lr 0,a ni $ff lr a,3 bf 1,onebit bf 0,storepat onebit: com storepat: st lr a,0 sl 1 lr 0,a ds 1 bf 4,storepatloop ds 2 bf 4,storepatloop2 lis 0 ;init variables to 0 lisu 3 lisl 0 lr (IS)+,a ;r24=row (3:0) lr (IS)+,a ;r25=col (3:1) lr (IS)+,a ;r26=cursor (3:2) lr (IS)+,a ;r27=array index (3:3) lr (IS)+,a ;r28=parameter to toggle sub (3:4) lisu 2 lisl 6 lr (IS)+,a ;r22=press counter lo (2:6) lr (IS)+,a ;r23=press counter hi (2:7) dci grid ;draw the grid pi drawlines ;draw lights li 24 ;array index lisu 3 lisl 3 lr (IS),a sqloop: pi drawlight lisu 3 lisl 3 lr a,(IS) ai $ff lr (IS),a bt 2,sqloop ;branch if >= 0 dci currows lm lr 5,a ;upper row dci curcols lm lr 4,a ;left col dci cursor ;start with the cursor in light 0 pi square mainloop: pi readhc lr 0,a ;save controller input lisu 2 ;inc random seed lisl 5 lr a,(IS) inc lr (IS),a ; redraw current square without cursor lisu 3 lisl 2 lr a,(IS)+ lr (IS),a pi drawlight lr a,0 ni $0c bt 4,notupdn ci $08 bf 4,down lisu 3 ;up lisl 0 ;r24 is row ds (IS) ;prev row bf 2,minrow ;>=0? updcurx: jmp updcur minrow: lis 4 lr (IS),a bf 0,updcurx down: lisu 3 lisl 0 lr a,(IS) inc ;next row lr (IS),a ci 5 ;too far? bt 4,maxrow bf 0,updcurx maxrow: lis 0 lr (IS),a bf 0,updcurx notupdn: lr a,0 ni $03 bt 4,notlfrt ci $02 bf 4,right lisu 3 ;left lisl 1 ;r25 is col ds (IS) ;prev col bf 2,prevcol ;>=0? bf 0,updcurx prevcol: lis 4 lr (IS),a bf 0,updcurx right: lisu 3 lisl 1 lr a,(IS) inc ;next col lr (IS),a ci 5 ;too far? bf 4,updcurx lis 0 lr (IS),a bf 0,updcurx notlfrt: lr a,0 ni $c0 bt 4,mainloop ci $80 bt 4,pushdown jmp replay ;pull up replays current pattern pushdown: lisu 3 lisl 6 lr a,(IS) ni $f0 ci $40 ;if game=3, can only press lit buttons bf 4,allowpress lisu 3 lisl 2 ; get cursor loc lr a,(IS) dci array adc lm ni $ff bf 4,allowpress ;make a bad sound li $3f lr 1,a sndloop: li $80 outs 5 lis 1 lr 5,a pi delay lis 0 outs 5 ds 1 bf 4,sndloop jmp updcur allowpress: lisu 2 ;inc press counter lisl 6 lis 1 ai $66 asd (IS) ;thanks Fredric! lr (IS)+,a bf 2,nocarry lis 1 ai $66 asd (IS) lr (IS),a nocarry: lisu 3 lisl 6 ;if mode=2 or 4, no center toggle lr a,(IS) ni $f ;mode in low nibble ci $2 bt 4,nocenter ci $8 bt 4,nocenter lisu 3 lisl 2 ; get cursor loc lr a,(IS) lisl 4 lr (IS),a pi toggle ;toggle center light nocenter: dci plustable lisu 3 lisl 6 ;if mode=3 or 4, X toggle lr a,(IS) ni $f ;mode in low nibble ci $4 bt 4,xtoggle ;mode 3, X toggle ci $8 bt 4,xtoggle ;mode 4, X toggle bf 0,dotoggle xtoggle: dci xtable dotoggle: lisl 2 lr a,(IS) ;get cursor loc as (IS) as (IS) as (IS) ;*4 for table offset adc lm ;get 4 neighbors lr 0,a lm lr 1,a lm lr 2,a lm dci temp4 ;store them temporarily st ;t4 lr a,2 st ;t3 lr a,1 st ;t2 lr a,0 st ;t1 dci temp4 ;toggle each neighbor li 3 adc pi togglem ;t1 dci temp4 lm lm pi togglem ;t2 dci temp4 lm pi togglem ;t3 dci temp4 pi togglem ;t4 updcur: lisu 3 ;calc index from row and col lisl 0 lr a,(IS) as (IS) as (IS) as (IS) as (IS) ;row * 5 lisu 3 lisl 1 as (IS)+ ;add in col lr (IS),a dci currows ;get row and column to draw cursor lisu 3 lisl 0 lr a,(IS)+ adc lm lr 5,a dci curcols lr a,(IS) adc lm lr 4,a dci cursor ;draw the cursor pi square LI $3F ;debounce by pausing a while LR 5,A pi delay ;check for all green (win) dci array li 24 ;array index lisu 3 lisl 3 lr (IS),a chkloop: lm ni $ff bt 4,lighton jmp mainloop ;not a win lighton: lisu 3 lisl 3 lr a,(IS) ai $ff lr (IS),a bt 2,chkloop ;made it here, all off ;make a winning sound li $3f lr 1,a snd2loop: li $40 outs 5 lr a,1 snd2loopa: inc bf 4,snd2loopa lis 0 outs 5 ds 1 bf 4,snd2loop li 32 ;draw 2 concentric squares lr 4,a li 18 lr 5,a dci winsq1 pi square li 34 lr 4,a li 20 lr 5,a dci winsq2 pi square ;print # of moves from r23/22 (2:7/6) li $1e ;row lr 2,a lisu 2 ;1000s digit lisl 7 lr a,(IS) sr 4 bt 4,lt1000 oi $40 lr 0,a li $2a lr 1,a pi drawchar bf 0,d100 lt1000: li $2c lr 1,a d100: lr a,1 inc lr 1,a lisu 2 ;100s digit lisl 7 lr a,(IS) ni $f bf 4,gt100 lr a,(IS) ;print 0 if x0yz where x > 0 ni $ff bt 4,lt100 lis 0 gt100: oi $40 lr 0,a pi drawchar bf 0,d10 lt100: li $30 lr 1,a d10: lr a,1 inc lr 1,a lisu 2 ;10s digit lisl 6 lr a,(IS) sr 4 bf 4,gt10 lisl 7 ;print 0 if xy0z where x or y > 0 lr a,(IS) ni $ff bt 4,lt10 lis 0 gt10: oi $40 lr 0,a pi drawchar bf 0,d1 lt10: li $34 lr 1,a d1: lr a,1 inc lr 1,a lisu 2 ;1s digit lisl 6 lr a,(IS) ni $f oi $40 lr 0,a pi drawchar waitupdn: pi readhc ;wait for hc up/down ni $c0 bt 4,waitupdn ni $80 bt 4,redo jmp nextpat ;down - get next random pattern redo: lisu 3 lisl 6 lr a,(IS) ci $41 bf 4,replay2 lisl 5 lr a,(IS) ci 51 bf 4,replay2 lisu 2 lisl 7 lr a,(IS)- ci 0 bf 4,replay2 lr a,(IS) ci $18 bf 4,replay2 LI $d6 LR $3,A PI clrscrn dci blitparm pi blit li $3f lr 1,a snd3loop: li $40 outs 5 li $1 lr 5,a pi delay lis 0 outs 5 ds 1 bf 4,snd3loop pi readhc LI $d6 LR $3,A PI clrscrn jmp nextpat replay2: jmp replay ;up - replay current pattern readhc: ;wait until one of the hand controllers is moved lis 0 outs 0 lis 0 outs 4 ins 4 com ;un-invert port data ni $cf ;mask off twists, since we don't use them bf 4,gothc outs 1 ins 1 com ni $cf bt 4,readhc gothc: pop togglem: ;change a square (index in memory) from red to green or vice versa lr k,p pi pushk lm lr 0,a ni $80 ;if high bit set, then this was a wrap bt 4,notwrapped lisu 3 lisl 6 ;if game=$2x, allow wrap-around lr a,(IS) ni $f0 ;mode in low nibble ci $20 bf 4,toggleexit2 ;no wrap allowed notwrapped: lr a,0 ni $7f ;strip off "wrapped" bit lisu 3 lisl 4 lr (IS),a bf 0,toggle2 toggle: ;change a square (index in r28) from red to green or vice versa lr k,p pi pushk lisu 3 lisl 4 lr a,(IS) toggle2: dci array adc lm ni $ff lr a,(IS) dci array adc bt 4,notset lis 0 bf 0,toggleexit notset: li $ff toggleexit: st lisu 3 lisl 4 lr a,(IS)- lr (IS),a pi drawlight toggleexit2: pi popk pk square: ;draw a square ; dci to color,width,height ;r5=upper row ;r4=left col ; uses r2,r3,r6 lr k,p pi pushk lm outs 1 ;set the color lr a,5 com outs 5 ;set the row lm ; lr 5,a ;save the width lm lr 3,a ;store the height squarev: lr a,4 lr 2,a ;save col lr a,5 ;get width squareh: lr 6,a ;save temp lr a,2 com outs 4 ;set the col lr a,2 inc ;next col lr 2,a pi plot lr a,6 ai $ff bf 4,squareh ;all done w/row ins 5 ;next row ai $ff ;complement, so subtract 1 outs 5 lr a,3 ai $ff lr 3,a bf 4,squarev ;done full height? pi popk pk drawlines: ; dci to table of color,len,row,start col (horiz if len<$80) ; color,len,col,start row (vert if len>$80) ; repeat until $FF ;uses r5 lr k,p line2: lm ci $ff bt 4,lineexit ;ff means done outs 1 ;set the color lm ;get len ni $ff ;lm doesn't set status flags bf 1,vline ;vertical lines are negative (and sign bit backwards) lr 5,a ;horiz-save len lm com outs 5 ;set the row lm ;get starting column hline2: com outs 4 ;set the column pi plot ds 5 bt 4,line2 ins 4 ; com inc bf 0,hline2 lineexit: pk vline: ni $3f ;mask off sign bit, limit len to 63 (height of screen) lr 5,a ;save it lm com outs 4 ;set the column lm ;get starting row vline2: com outs 5 ;set the row pi plot ds 5 bt 4,line2 ins 5 com inc bf 0,vline2 plot: ;this is what you have to do to transfer data to the screen memory ;after setting row, column and color li $60 outs 0 li $50 outs 0 lis 6 ; little delay pdelay: ai $ff bf 4,pdelay pop drawlight: ;draws a red or green square based off value passed in r27 lr k,p pi pushk lisu 3 lisl 3 lr a,(IS) dci sqrows adc lm lr 5,a lr a,(IS) dci sqcols adc lm lr 4,a lr a,(IS) ; read color from array dci array adc lm ni $ff bt 4,dogreen dci redsq bf 0,dosq dogreen: dci greensq dosq: pi square pi popk pk ;blit code from cart 26 blit: LR K,P pi pushk LISU 0 blitloop: LISL 4 getparms: LM LR (IS)-,A BR7 getparms LM LR H,DC DCI blitparm ADC LIS 1 LR $7,A INS 5 COM NI $c0 AS $1 COM blit2z: OUTS 5 DS $3 BF 2,blitexit LR A,$2 LR $5,A LR A,$0 COM blit2a: OUTS 4 DS $7 BF 4,blit2c LIS 8 LR $7,A LM LR $6,A LIS 1 NS $4 BT 4,blit2b LIS 0 COM blit2b: ADC blit2c: LR A,$6 AS $6 LR $6,A LR A,$4 BT 2,blit2d LIS 0 blit2d: COM OUTS 1 LIS 6 SL 4 OUTS 0 SL 1 OUTS 0 BF 0,blit2e blit2e: AI $60 BF 4,blit2e DS $5 BT 4,blit2f INS 4 AI $ff BF 0,blit2a blit2f: INS 5 AI $ff BF 0,blit2z blitexit: LR DC,H LIS 2 NS $4 BT 4,blitloop pi popk PK ;from the BIOS, but I removed T? (time) prompt prompts: LR K,P ; PI pushk ; prompts2: LI $85 ; red 5 (S) LR $0,A ; PI prompt ; LR A,$4 ; CI $08 ; is it button 4, Start? BF $4,notbut4 ; no, check others notbut2: PI popk ; yes, return PK ; notbut4: CI $02 ; is it button 2, Mode? BF $4,notbut2 ; LI $8e ; red M LR $0,A ; PI prompt ; LISU 3 ; LISL 6 ; LR A,(IS) ; as 4 ;add the mode to the game # LR (IS),A ; BF $0,prompts2 ; ;from the BIOS, but I added random # seed to readbuts prompt: LR K,P ; $0099 - prints char r0 at row r1, col r2, waits for button PI pushk ; LI $33 ; r1=$33 LR $1,A ; LI $13 ; r2=$13 LR $2,A ; PI drawchar ; LI $8b ; r0=8b red ? LR $0,A ; PI drawchar ; PI readbuts ; LI $33 ; r1=$33 LR $1,A ; LI $13 ; r2=$13 LR $2,A ; LIS $d ; r0=$d LR $0,A ; PI drawchar ; PI drawchar ; PI popk ; PK ; readbuts: lisu 2 ;inc random seed lisl 5 lr a,(IS) inc lr (IS),a INS 0 ; $00c1 - read buttons COM ; NI $0f ; BT 4,readbuts ; LR $4,A ; LI $ff ; LR $5,A ; dbounce: DS $5 ; BF $4,dbounce ; jmp delay ; ;colors: $40-red, $80=blue, $0=green, $c0=bkg ;data to draw lines for grid grid: ;horiz-color,len,row,start col db $80,66,7,18 db $80,66,17,18 db $80,66,27,18 db $80,66,37,18 db $80,66,47,18 db $80,66,57,18 ;vert-color,$80+len,col,start row db $80,179,18,7 ;179=128+51 db $80,179,31,7 db $80,179,44,7 db $80,179,57,7 db $80,179,70,7 db $80,179,83,7 db $ff ;data to draw squares redsq: ;color,width,height db $40,12,9 greensq: ;color,width,height db $0,12,9 cursor: ;color,width,height db $c0,4,3 winsq1: db $40,38,29 ;red winsq2: db $c0,34,25 ;bkg ;locations to draw each light, based on index (0-24) sqrows: db 8, 8, 8, 8, 8,18,18,18,18,18,28,28,28,28,28,38,38,38,38,38,48,48,48,48,48 sqcols: db 19,32,45,58,71,19,32,45,58,71,19,32,45,58,71,19,32,45,58,71,19,32,45,58,71 ;locations to draw cursor, based on row/column currows: db 11,21,31,41,51 curcols: db 23,36,49,62,75 plustable: ;squares to toggle based on cursor N E W S +128 means wrapped db 148, 1,132, 5 db 149, 2, 0, 6 db 150, 3, 1, 7 db 151, 4, 2, 8 db 152,128, 3, 9 db 0, 6,137, 10 db 1, 7, 5, 11 db 2, 8, 6, 12 db 3, 9, 7, 13 db 4,133, 8, 14 db 5, 11,142, 15 db 6, 12, 10, 16 db 7, 13, 11, 17 db 8, 14, 12, 18 db 9,138, 13, 19 db 10, 16,147, 20 db 11, 17, 15, 21 db 12, 18, 16, 22 db 13, 19, 17, 23 db 14,143, 18, 24 db 15, 21,152,128 db 16, 22, 20,129 db 17, 23, 21,130 db 18, 24, 22,131 db 19,148, 23,132 xtable: ;squares to toggle based on cursor NW NE SW SE +128 means wrapped db 152,149,137, 6 db 148,150, 5, 7 db 149,151, 6, 8 db 150,152, 7, 9 db 151,148, 8,133 db 132, 1,142, 11 db 0, 2, 10, 12 db 1, 3, 11, 13 db 2, 4, 12, 14 db 3,128, 13,138 db 137, 6,147, 16 db 5, 7, 15, 17 db 6, 8, 16, 18 db 7, 9, 17, 19 db 8,133, 18,143 db 142, 11,152, 21 db 10, 12, 20, 22 db 11, 13, 21, 23 db 12, 14, 22, 24 db 13,138, 23,148 db 147, 16,132,129 db 15, 17,128,130 db 16, 18,129,131 db 17, 19,130,132 db 18,143,132,128 ;the patterns - 1 bit is red, 0 is green ;other code has to be adjusted to use more or less than 64 patterns ;not all of these are solvable on a torus or if only the neighbors toggle pats: ; db $00,$00,$00,$80,$c0 ; easy one for test db $20,$50,$88,$F8,$88 db $F0,$88,$88,$88,$F0 db $F8,$80,$F8,$80,$F8 db $F8,$80,$F0,$80,$80 db $88,$88,$F8,$88,$88 db $F8,$20,$20,$20,$F8 db $90,$A0,$C0,$A0,$90 db $80,$80,$80,$80,$F8 db $88,$D8,$A8,$88,$88 db $88,$C8,$A8,$98,$88 db $70,$88,$88,$88,$70 db $70,$88,$A8,$90,$68 db $70,$80,$70,$08,$70 db $F8,$20,$20,$20,$20 db $88,$88,$A8,$D8,$88 db $88,$50,$20,$50,$88 db $88,$50,$20,$20,$20 db $F8,$10,$20,$40,$F8 db $50,$50,$00,$70,$20 db $20,$70,$F8,$70,$20 db $D8,$20,$20,$20,$D8 db $00,$00,$20,$00,$00 db $00,$20,$50,$20,$00 db $20,$00,$88,$00,$20 db $50,$A8,$50,$A8,$50 db $A8,$70,$F8,$70,$A8 db $00,$D8,$50,$D8,$00 db $20,$88,$20,$88,$20 db $F8,$A8,$88,$A8,$F8 db $20,$60,$20,$20,$70 db $70,$08,$70,$80,$F8 db $70,$08,$70,$08,$70 db $F8,$00,$70,$00,$F8 db $70,$88,$70,$88,$70 db $F8,$88,$50,$70,$00 db $F8,$70,$20,$00,$00 db $20,$20,$F8,$20,$20 db $A8,$88,$F8,$88,$A8 db $C0,$A0,$A8,$28,$18 db $18,$08,$20,$80,$C0 db $D8,$88,$50,$88,$D8 db $18,$C0,$18,$C0,$18 db $A8,$A8,$A8,$A8,$A8 db $00,$F8,$00,$F8,$00 db $10,$78,$50,$F0,$40 db $C0,$E0,$70,$38,$18 db $60,$90,$70,$48,$30 db $A8,$A8,$50,$A8,$A8 db $98,$F0,$50,$78,$C8 db $70,$A8,$F8,$F8,$A8 db $A0,$E0,$B8,$10,$38 db $00,$00,$F8,$50,$50 ; pi pattern db $00,$40,$00,$10,$00 db $00,$50,$00,$50,$00 db $10,$48,$20,$90,$40 db $78,$E8,$F8,$B8,$F0 db $E0,$90,$E0,$90,$E0 db $30,$48,$C0,$48,$30 db $38,$48,$20,$90,$E0 db $00,$38,$00,$E0,$00 db $20,$20,$D8,$20,$20 db $20,$70,$A8,$20,$20 db $C8,$D0,$20,$58,$98 db $00,$70,$50,$70,$00 ;8 bytes available here org $f00 blitparm: db $82,19,96,$16,$8,$08,00,00 blitdata: db $00,$45,$F0,$41,$E1,$01,$F7,$80,$44,$20,$40,$00 db $00,$45,$00,$41,$13,$81,$04,$40,$A4,$20,$A0,$00 db $00,$7D,$E0,$41,$E4,$41,$E7,$81,$14,$21,$10,$00 db $00,$45,$04,$41,$07,$C1,$04,$41,$F4,$21,$F0,$00 db $00,$45,$f3,$81,$04,$41,$F4,$41,$17,$BD,$10,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $F8,$8E,$F1,$C8,$BA,$1E,$04,$50,$72,$22,$3C,$F8 db $81,$44,$8A,$28,$92,$11,$03,$90,$82,$45,$22,$80 db $F2,$24,$F2,$0F,$92,$11,$74,$50,$73,$88,$BC,$F0 db $83,$E4,$8A,$28,$92,$11,$07,$D0,$0A,$4F,$A2,$80 db $82,$2E,$89,$C8,$BB,$DE,$04,$5E,$72,$28,$A2,$F8 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$79,$17,$81,$17,$DF,$20,$00,$00,$00 db $00,$00,$00,$44,$E4,$41,$11,$10,$20,$00,$00,$00 db $00,$00,$00,$45,$17,$81,$11,$1E,$20,$00,$00,$00 db $00,$00,$00,$45,$F4,$41,$11,$10,$00,$00,$00,$00 db $00,$00,$00,$79,$14,$40,$E1,$1F,$20,$00,$00,$00 ;4 bytes available here org $ff0 db $53,$65,$61,$6e,$20,$52,$69,$64,$64,$6c,$65,$20,$32,$30,$30,$34 dasm-2.20.14.1/test/channel-f/lights.bin.ref000066400000000000000000000040001375233463600203220ustar00rootroot00000000000000U+pdh\ S( cn\ JP( 8Dcn\( *) APp0bmLcm!?\*)!*)!$%@ dh\\ cmL* bhuQ]1*(uRdhLSbhuQMP!C@P12pch]]]]]bn]]* u( O ck\( ckL$\* U* T* ( "( PbmL\cjM\( @! % ch<) t\chL\%p\@!% ci<t\ciL\%p\@!%)^cnL!%@ cjL*(! ?Q qU(p1) bnq$f]q$f\cnL!% % cjLl\( * cnL!%%* UjL̎PQR**BA@** ( **( **( **( chLci\* chMU* LT* ( " ?U(*( ck\!)ckL$\ ?Q @Ap1 T U* ( " "T U* ( " RboL "@P *Q(y ,QAQboL!L! p"@P(y 0QAQbnLoL! p"@P(y 4QAQbnL!"@P(y( !!).cnL%AK                            P بȨppphppp ؈P PP  @PPp pp P PPPppP ` ppppppppppPpp ( ؈PxP@p8`pH0PPxp8PP@PPH @x0HH08H 8 p XpPp`EAD @EA@ }AA!EAA!EAAȺPr":B E@$ %  !"#@@@@@@@ @ ࠠ @@ @@@@@@` @@ࠠ````ࠠ@@@@@@@@@ࠠ@@@``@ @@@@`@ࠠ@@@@ @``*_@* Z!UB!sXE!DC ` PvV6EU$8$:LP(x $ A$Q9 P%$%QR%ST(x $ A$Q) P%$%QR%ST(x $ B$R) ::4:@ HALLO.:(: FRANK"::FREDRIC:8@ SEAN :#o GAME h OVER @#; GAME 4 OVER  fWON@ 4LOST hLOST@ 2WON7m TET@IS @:hCOPYRIGHT@+d2004%_@BY:Z PETER:V TRAUNERdasm-2.20.14.1/test/cmdline_defs/000077500000000000000000000000001375233463600163525ustar00rootroot00000000000000dasm-2.20.14.1/test/cmdline_defs/Makefile000066400000000000000000000005071375233463600200140ustar00rootroot00000000000000# # Makefile for testing hexadecimal notation on command line args # DASM=../../bin/dasm FTOHEX=../../bin/ftohex test: @../run_tests.sh -R ../../bin -D RAM_START=0x60 %.bin: %.asm $(DASM) $< -o$@ -f1 -T1 -s$*.sym -DRAM_START=0x60 %.hex: %.bin $(FTOHEX) 1 $< $@ clean: rm -rf *.bin *.hex *.list.txt *.diff *.sym *.out dasm-2.20.14.1/test/cmdline_defs/declare_var_mac.args000066400000000000000000000000551375233463600223170ustar00rootroot00000000000000ARGS="-f1 -T1 -s${NAME}.sym -DRAM_START=0x60"dasm-2.20.14.1/test/cmdline_defs/declare_var_mac.asm000077700000000000000000000000001375233463600261422../declare_var_mac.asmustar00rootroot00000000000000dasm-2.20.14.1/test/cmdline_defs/declare_var_mac.bin.ref000066400000000000000000000000151375233463600227020ustar00rootroot00000000000000f5`cdasm-2.20.14.1/test/cmdline_defs/declare_var_mac.hex.ref000066400000000000000000000000601375233463600227160ustar00rootroot00000000000000:0B800000CE0066359660A700B7006355 :00000001FF dasm-2.20.14.1/test/cmdline_defs/ramstart.args000066400000000000000000000000551375233463600210650ustar00rootroot00000000000000ARGS="-f1 -T1 -s${NAME}.sym -DRAM_START=0x60"dasm-2.20.14.1/test/cmdline_defs/ramstart.asm000066400000000000000000000001631375233463600207110ustar00rootroot00000000000000 .PROCESSOR 68HC11 .ifnconst RAM_START RAM_START .EQU 0x80 .endif ORG 0 DC.w RAM_START dasm-2.20.14.1/test/cmdline_defs/ramstart.bin.ref000066400000000000000000000000041375233463600214460ustar00rootroot00000000000000`dasm-2.20.14.1/test/cmdline_defs/ramstart.hex.ref000066400000000000000000000000361375233463600214670ustar00rootroot00000000000000:0200000000609E :00000001FF dasm-2.20.14.1/test/concat_str.asm000066400000000000000000000003361375233463600166010ustar00rootroot00000000000000 PROCESSOR 6502 ORG 0 .macro concat_str ; {name},{size} {1} .set str_var str_var .set ({1}{2}) .endm str_var .set "" concat_str _1 "A" concat_str _2 "b" concar_str _3 "C" DC.b str_var echo str_var dasm-2.20.14.1/test/concat_str.fail000066400000000000000000000000021375233463600167220ustar00rootroot0000000000000039dasm-2.20.14.1/test/declare_var_mac.asm000066400000000000000000000020151375233463600175250ustar00rootroot00000000000000; ; the purpose of this macro is to declare a global variable without need to know its exact location ; the location is automatically derived from its predecessor 'next_var' which gets redefined at every ; occurence. This way one can copy-paste, comment-out or conditional-define variable declarations ; without worrying. Memory usage will be always as compact as possible ; .PROCESSOR 6803 #ifnconst RAM_START RAM_START .EQU 0x80 #endif .mac declare_var ; {name},{size} {1} .EQU next_var next_var .set ({1}+{2}) .endm next_var .set RAM_START declare_var first, 1 ; declare variable name "first" 8bit declare_var second, 2 ; declare variable name "second" 16bit #if (RAM_START == 0x60) declare_var extra, 3 ; in case of special define, include variable extra 24bit #endif declare_var third, 4 ; declare variable name "third" 32bit .ORG 0x8000 example_code: ldx #third txs ldaa first staa ,X #if (RAM_START == 0x60) staa.w extra #endif dasm-2.20.14.1/test/declare_var_mac.bin.ref000066400000000000000000000000121375233463600202630ustar00rootroot000000000000005dasm-2.20.14.1/test/declare_var_mac.hex.ref000066400000000000000000000000521375233463600203030ustar00rootroot00000000000000:08800000CE0083359680A70035 :00000001FF dasm-2.20.14.1/test/define_echo.asm000066400000000000000000000010261375233463600166670ustar00rootroot00000000000000 ; Test case for -D and -M options and echo pseudo-op. SOURCE_SYMBOL equ 255 IMPROPER_SYMBOL equ 127 processor 6502 echo "Defined in source file:" echo SOURCE_SYMBOL echo "Defined improperly in source file:" echo IMPROPER_SYMBOL echo "Defined externally with -D and default:" echo EXTERNAL_D_DEFAULT echo "Defined externally with -D and 127:" echo EXTERNAL_D_VALUE echo "Defined externally with -M and default:" echo EXTERNAL_M_DEFAULT echo "Defined externally with -M and 127:" echo EXTERNAL_M_VALUE end dasm-2.20.14.1/test/delete_empty_binary.args000066400000000000000000000000161375233463600206350ustar00rootroot00000000000000ARGS="-f1 -R" dasm-2.20.14.1/test/delete_empty_binary.asm000077700000000000000000000000001375233463600230732jentzsch2.asmustar00rootroot00000000000000dasm-2.20.14.1/test/delete_empty_binary.fail000066400000000000000000000000011375233463600206060ustar00rootroot000000000000005dasm-2.20.14.1/test/demo.asm000066400000000000000000000012201375233463600153570ustar00rootroot00000000000000;;; ; ; Some useful macros and techniques ; processor 6502 ;;; mac hexdig if [{1}] <= 9 dc.b '0 + [{1}] else dc.b 'a + [{1}] - 10 endif endm ;;; mac hexnum if [{1}] >= $10 hexnum [{1}] >> 4 endif hexdig [{1}] & $0F endm ;;; org 0 hexnum $123ab ;;;; ; ; Using an uninitialised segment to create C-like 'struct's. ; (idea taken from IBM-370 assembler style "dummy segments") seg.u node org 0 s_next ds.b 2 ; a node has a pointer to the next one s_data ds.b 2 ; and 2 bytes of data s_more ds.b 3 ; and 3 bytes of something more seg code ptr equ 42 ; dummy value ldy #s_data lda (ptr),y ; get first byte of data dasm-2.20.14.1/test/doublemacro.asm000066400000000000000000000003501375233463600167320ustar00rootroot00000000000000; Test case for double macros processor 6502 MAC testmac ; the first declaration wins lda #1 ENDM MAC testmac ; the second is silently ignored without the -S flag, but an error with -S ldx #1 ENDM ORG $f800 testmac dasm-2.20.14.1/test/doublemacro.bin.ref000066400000000000000000000000041375233463600174710ustar00rootroot00000000000000dasm-2.20.14.1/test/doublemacro.fail000066400000000000000000000000021375233463600170570ustar00rootroot0000000000000025dasm-2.20.14.1/test/doublemacro.hex.ref000066400000000000000000000000361375233463600175120ustar00rootroot00000000000000:02F80000A9015C :00000001FF dasm-2.20.14.1/test/empty.asm000066400000000000000000000000001375233463600155640ustar00rootroot00000000000000dasm-2.20.14.1/test/example.asm000066400000000000000000000157571375233463600161120ustar00rootroot00000000000000 ; EXAMPLE.ASM (6502 Microprocessor) ; processor 6502 ; no spaces should be required before or after '=' char LABEL1 = 1 LABEL2= 2 LABEL3 =3 LABEL4=4 mac ldax lda [{1}] ldx [{1}]+1 endm mac ldaxi lda #<[{1}] ldx #>[{1}] endm mac stax sta [{1}] stx [{1}]+1 endm mac pushxy txa pha tya pha endm mac popxy pla tay pla tax endm mac inc16 inc {1} bne .1 inc {1}+1 .1 endm STOP1 equ %00000000 ;CxCTL 1 Stop bit STOP2 equ %10000000 ;CxCTL 2 Stop bits (WL5:1.5, WL8&par:1) WL5 equ %01100000 ;CxCTL Wordlength WL6 equ %01000000 WL7 equ %00100000 WL8 equ %00000000 RCS equ %00010000 ;CxCTL 1=Select baud, 0=ext. receiver clk B76800 equ %0000 ;CxCTL Baud rates (1.2288 Mhz clock) B75 equ %0001 B100 equ %0010 B150 equ %0011 B200 equ %0100 B300 equ %0101 B400 equ %0110 B600 equ %0111 B800 equ %1000 B1200 equ %1001 B1600 equ %1010 B2400 equ %1011 B3200 equ %1100 B4800 equ %1101 B6400 equ %1110 B12800 equ %1111 PARODD equ %00100000 ;CxCMD Select Parity PAREVEN equ %01100000 PARMARK equ %10100000 PARSPACE equ %11100000 PAROFF equ %00000000 RECECHO equ %00010000 ;CxCMD Receiver Echo mode TMASK equ %00001100 TDISABLE equ %00000000 ;CxCMD Transmitter modes TDISABLER equ %00001000 ;RTS stays asserted TENABLE equ %00000100 TBREAK equ %00001100 ;send break UA_IRQDSBL equ %00000010 DTRRDY equ %00000001 ;~DTR output is inverted (low) SR_PE equ %00000001 ;CxSTAT Status SR_FE equ %00000010 ;NOTE: writing dummy data causes RESET SR_OVRUN equ %00000100 SR_RDRFULL equ %00001000 SR_TDREMPTY equ %00010000 SR_DCD equ %00100000 SR_DSR equ %01000000 SR_INTPEND equ %10000000 T1_OEPB7 equ %10000000 ;x_ACR T1_FREERUN equ %01000000 ;T1 free running mode T1_ONESHOT equ %00000000 T2_ICPB6 equ %00100000 ;T2 counts pulses on PB6 T2_ONESHOT equ %00000000 ;T2 counts phase2 transitions SRC_OFF equ %00000000 ;shift register control SRC_INT2 equ %00000100 SRC_INPH2 equ %00001000 SRC_INEXT equ %00001100 SRC_OUTFR equ %00010000 ;free running output using T2 SRC_OUTT2 equ %00010100 SRC_OUTPH2 equ %00011000 SRC_OUTEXT equ %00011100 PBLE equ %00000010 ;on CB1 transition (in/out). PALE equ %00000001 ;on CA1 transition (in). data retained ;x_PCR CB2_I_NEG equ %00000000 ;interrupt on neg trans, r/w ORB clears CB2_I_NEGI equ %00100000 ; same, but r/w ORB does not clear int CB2_I_POS equ %01000000 ;interrupt on pos trans, r/w ORB clears CB2_I_POSI equ %01100000 ; same, but r/w ORB does not clear int CB2_O_HSHAK equ %10000000 ;CB2=0 on r/w ORB, CB2=1 on CB1 transition CB2_O_PULSE equ %10100000 ;CB2=0 for one clock after r/w ORB CB2_O_MANLO equ %11000000 ;CB2=0 CB2_O_MANHI equ %11100000 ;CB2=1 CA2_I_NEG equ %00000000 ;interrupt on neg trans, r/w ORA clears CA2_I_NEGI equ %00100000 ; same, but r/w ORA does not clear int CA2_I_POS equ %01000000 ;interrupt on pos trans, r/w ORA clears CA2_I_POSI equ %01100000 ; same, but r/w ORA does not clear int CA2_O_HSHAK equ %10000000 ;CA2=0 on r/w ORA, CA2=1 on CA1 transition CA2_O_PULSE equ %10100000 ;CA2=0 for one clock after r/w ORA CA2_O_MANLO equ %11000000 ;CA2=0 CA2_O_MANHI equ %11100000 ;CA2=1 CB1_THI equ %00010000 CB1_TLO equ %00000000 CA1_THI equ %00000001 CA1_TLO equ %00000000 VIRPEND equ %10000000 ;x_IFR IRENABLE equ %10000000 ;x_IER 1's enable ints 0=no change IRDISABLE equ %00000000 ;x_IER 1's disable ints 0=no change IRT1 equ %01000000 IRT2 equ %00100000 IRCB1 equ %00010000 IRCB2 equ %00001000 IRSR equ %00000100 IRCA1 equ %00000010 IRCA2 equ %00000001 seg.u bss org $0000 ;RAM (see below) org $2000 ;unused org $4000 ;unused org $6000 ;6551 CHANNEL #1 C1DATA ds 1 C1STAT ds 1 C1CMD ds 1 C1CTL ds 1 org $8000 ;6551 CHANNEL #2 C2DATA ds 1 C2STAT ds 1 C2CMD ds 1 C2CTL ds 1 org $A000 ;6522 (HOST COMM) H_ORB ds 1 H_ORAHS ds 1 ;with CA2 handshake H_DDRB ds 1 H_DDRA ds 1 H_T1CL ds 1 ;read clears interrupt flag H_T1CH ds 1 ;write clears interrupt flag H_T1CLL ds 1 H_T1CHL ds 1 ;write clears interrupt flag H_T2CL ds 1 ;read clears interrupt flag H_T2CH ds 1 ;write clears interrupt flag H_SR ds 1 H_ACR ds 1 H_PCR ds 1 H_IFR ds 1 H_IER ds 1 H_ORA ds 1 ;no CA2 handshake org $C000 ;6522 (IO COMM) I_ORB ds 1 I_ORAHS ds 1 ; (same comments apply) I_DDRB ds 1 I_DDRA ds 1 I_T1CL ds 1 I_T1CH ds 1 I_T1CLL ds 1 I_T1CHL ds 1 I_T2CL ds 1 I_T2CH ds 1 I_SR ds 1 I_ACR ds 1 I_PCR ds 1 I_IFR ds 1 I_IER ds 1 I_ORA ds 1 ; -------------------------- ZERO PAGE ------------------- seg.u data org $00 ; -------------------------- NORMAL RAM ------------------- org $0100 RAMEND equ $2000 ; -------------------------- CODE ------------------- seg code org $F000 PROMBEG equ . RESET subroutine sei ;disable interrupts ldx #$FF ;reset stack txs lda #$FF sta H_DDRA sta C1STAT ;reset 6551#1 (garbage data) sta C2STAT ;reset 6551#2 lda #$7F ;disable all 6522 interrupts sta H_IER sta I_IER lda #%00010000 ;76.8 baud, 8 bits, 1 stop sta C1CTL lda #%00000101 ;no parity, enable transmitter & int sta C1CMD lda #$AA ;begin transmision sta C1DATA lda #%00011111 ;9600 baud, 8 bits, 1 stop sta C2CTL lda #%00000101 sta C2CMD lda #$41 sta C2DATA cli ;enable interrupts .1 jsr LOAD jsr SAVE jmp .1 LOAD subroutine ldx #0 .1 txa sta $0500,x inx bne .1 rts SAVE subroutine ldx #0 .2 lda $0500,x sta H_ORA inx bne .2 rts NMI rti subroutine IRQ bit C1STAT bpl .1 pha lda #$AA sta C1DATA lda C1DATA pla rti .1 bit C2STAT bpl .2 pha lda #$41 sta C2DATA lda C2DATA pla .2 rti ; VECTOR ------------------------------------------------ seg vector org $FFFA dc.w NMI dc.w RESET dc.w IRQ PROMEND equ . dasm-2.20.14.1/test/example.bin.ref000066400000000000000000000100021375233463600166270ustar00rootroot00000000000000x````AX ? IL6``@,` H``h@, HAh@UVdasm-2.20.14.1/test/example.hex.ref000066400000000000000000000264151375233463600166620ustar00rootroot00000000000000:10F0000078A2FF9AA9FF8D03A08D01608D0180A9D0 :10F010007F8D0EA08D0EC0A9108D0360A9058D02F5 :10F0200060A9AA8D0060A91F8D0380A9058D0280AB :10F03000A9418D008058203FF02049F04C36F0A2C5 :10F04000008A9D0005E8D0F960A200BD00058D0F83 :10F05000A0E8D0F760402C0160100B48A9AA8D00F1 :10F0600060AD006068402C0180100A48A9418D0005 :10F0700080AD00806840FFFFFFFFFFFFFFFFFFFF45 :10F08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 :10F09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 :10F0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 :10F0B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 :10F0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 :10F0D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 :10F0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 :10F0F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 :10F10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F :10F11000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :10F12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF :10F13000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF :10F14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF :10F15000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF :10F16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF :10F17000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :10F18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F :10F19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F :10F1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F :10F1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F :10F1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F :10F1D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F :10F1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F :10F1F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F :10F20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E :10F21000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :10F22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE :10F23000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE :10F24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE :10F25000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE :10F26000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE :10F27000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E :10F28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E :10F29000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E :10F2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E :10F2B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :10F2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E :10F2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E :10F2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E :10F2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E :10F30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D :10F31000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD :10F32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED :10F33000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD :10F34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD :10F35000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD :10F36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD :10F37000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D :10F38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D :10F39000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D :10F3A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D :10F3B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D :10F3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D :10F3D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D :10F3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D :10F3F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D :10F40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C :10F41000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC :10F42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC :10F43000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :10F44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :10F45000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :10F46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :10F47000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :10F48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :10F49000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :10F4A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :10F4B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :10F4C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :10F4D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :10F4E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C :10F4F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C :10F50000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B :10F51000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB :10F52000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB :10F53000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB :10F54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB :10F55000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB :10F56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB :10F57000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B :10F58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B :10F59000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B :10F5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B :10F5B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B :10F5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B :10F5D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B :10F5E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B :10F5F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B :10F60000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A :10F61000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA :10F62000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA :10F63000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA :10F64000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA :10F65000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA :10F66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA :10F67000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A :10F68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A :10F69000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A :10F6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A :10F6B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A :10F6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A :10F6D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A :10F6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A :10F6F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A :10F70000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 :10F71000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 :10F72000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 :10F73000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 :10F74000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 :10F75000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 :10F76000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 :10F77000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 :10F78000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 :10F79000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 :10F7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 :10F7B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 :10F7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 :10F7D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 :10F7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 :10F7F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 :10F80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 :10F81000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 :10F82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 :10F83000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 :10F84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 :10F85000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 :10F86000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 :10F87000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 :10F88000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 :10F89000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 :10F8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 :10F8B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 :10F8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 :10F8D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 :10F8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 :10F8F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 :10F90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 :10F91000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 :10F92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 :10F93000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 :10F94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 :10F95000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 :10F96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 :10F97000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 :10F98000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 :10F99000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 :10F9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 :10F9B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 :10F9C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 :10F9D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 :10F9E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 :10F9F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 :10FA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 :10FA1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 :10FA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 :10FA3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 :10FA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 :10FA5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 :10FA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 :10FA7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 :10FA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 :10FA9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 :10FAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 :10FAB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 :10FAC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 :10FAD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 :10FAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 :10FAF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 :10FB0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 :10FB1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 :10FB2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 :10FB3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 :10FB4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 :10FB5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 :10FB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 :10FB7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 :10FB8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 :10FB9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 :10FBA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 :10FBB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 :10FBC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 :10FBD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 :10FBE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 :10FBF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 :10FC0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 :10FC1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 :10FC2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 :10FC3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :10FC4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 :10FC5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 :10FC6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 :10FC7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 :10FC8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 :10FC9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 :10FCA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 :10FCB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 :10FCC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 :10FCD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 :10FCE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 :10FCF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 :10FD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 :10FD1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 :10FD2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 :10FD3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 :10FD4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 :10FD5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 :10FD6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 :10FD7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 :10FD8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 :10FD9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 :10FDA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 :10FDB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 :10FDC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 :10FDD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 :10FDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 :10FDF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 :10FE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :10FE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 :10FE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 :10FE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 :10FE4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 :10FE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 :10FE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 :10FE7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 :10FE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 :10FE9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 :10FEA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 :10FEB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 :10FEC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 :10FED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 :10FEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 :10FEF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 :10FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 :10FF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 :10FF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 :10FF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 :10FF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 :10FF5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 :10FF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 :10FF7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 :10FF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 :10FF9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 :10FFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 :10FFB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 :10FFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 :10FFD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 :10FFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 :10FFF000FFFFFFFFFFFFFFFFFFFF55F000F056F090 :00000001FF dasm-2.20.14.1/test/file-with-dash.asm000066400000000000000000000006631375233463600172520ustar00rootroot00000000000000 MoniRomDelayLoop: deca ; J $fd21 4a _Lfd22: psha ; . $fd22 87 deca ; J $fd23 4a deca ; J $fd24 4a _Lfd25: dbnza _Lfd25 ; K. $fd25 4b fe pula ; . $fd27 86 dbnzx _Lfd22 ; .. $fd28 5b f8 rts ; . $fd2a 81 dasm-2.20.14.1/test/fill.asm000066400000000000000000000011771375233463600153740ustar00rootroot00000000000000; ; Test various directives that "fill" memory. ; ; This came about because Dennis Debro posted about .align not ; doing the right thing to the Stella list. Thomas Mathys was ; able to trace this to v_align, which uses the first value ; instead of the second as the actual fill byte. Fixed as of ; release 2.20.12 I hope. :-) ; ; Peter H. Froehlich ; phf at acm dot org .processor 6502 .org 0 ; .ds fills with $a5 as required, works .ds 33, $a5 ; always filled $a5 ; .align fills with *align* value prior to 2.20.12 .align 64, $f5 ; filled $40 <2.20.11, fills $f5 now .align 256, $5f ; filled $0 <2.20.11, fills $5f now .end dasm-2.20.14.1/test/fill.bin.ref000066400000000000000000000004021375233463600161250ustar00rootroot00000000000000________________________________________________________________________________________________________________________________________________________________________________________________dasm-2.20.14.1/test/fill.hex.ref000066400000000000000000000013351375233463600161470ustar00rootroot00000000000000:10000000A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A0 :10001000A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A590 :10002000A5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5D0 :10003000F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F570 :100040005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FC0 :100050005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FB0 :100060005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FA0 :100070005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F90 :100080005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F80 :100090005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F70 :1000A0005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F60 :1000B0005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F50 :1000C0005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F40 :1000D0005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F30 :1000E0005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F20 :1000F0005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F10 :00000001FF dasm-2.20.14.1/test/forced_addrmode.asm000066400000000000000000000003701375233463600175410ustar00rootroot00000000000000 .PROCESSOR 6803 FAR_ADDR .EQU $F01A DIRECT_ADDR .EQU $40 .ORG 0 jsr.b DIRECT_ADDR jsr.w FAR_ADDR jsr DIRECT_ADDR jsr FAR_ADDR jsr.w DIRECT_ADDR jsr.b >FAR_ADDR jsr.b FAR_ADDR jsr.w test case for bug ; in error handling. processor 6502 include vcs.h ORG $f800 Start ldz #$00 ; illegal mnemonic org $fffc .word Start .word Start dasm-2.20.14.1/test/jentzsch2.asm000066400000000000000000000003031375233463600163460ustar00rootroot00000000000000; Thomas Jentzsch test case for bug ; in error handling. processor 6502 include vcs.h ORG $f800 Start bpl .error ; undefined label org $fffc .word Start .word Start dasm-2.20.14.1/test/jentzsch2.fail000066400000000000000000000000011375233463600164740ustar00rootroot000000000000003dasm-2.20.14.1/test/jmpiw.asm000066400000000000000000000007051375233463600155700ustar00rootroot00000000000000 .TRACE on .processor 6502 .ORG 0 RESP0 = $10 ; (curious) why is (only) listing output big endian ordered when processor is little ? DC.w RESP0 RESP1 = $100 ; ... but that's a different construction site DC.w RESP1 jmp RESP0 jmp RESP1 jmp (RESP1) jmp.in (RESP0) ; forced(indirect_word) and coded(indirect_word) jmp.in RESP0 ; forced(indirect_word) and coded(byteaddr) ; should this be an error with strict mode ? dasm-2.20.14.1/test/jmpiw.bin.ref000066400000000000000000000000251375233463600163260ustar00rootroot00000000000000LLllldasm-2.20.14.1/test/jmpiw.hex.ref000066400000000000000000000001121375233463600163370ustar00rootroot00000000000000:10000000100000014C10004C00016C00016C10004D :030010006C100071 :00000001FF dasm-2.20.14.1/test/labelchanges.asm000066400000000000000000000020371375233463600170520ustar00rootroot00000000000000; labelchanges.asm - test various cases of labels changing location in ; successive passes. Test code provided by Thomas Jentzsch. processor 6502 ;=============================================================================== ; automatically decide whether to use a branch or a jump MAC BNEJ IF ({1} - .) >= -126 && ({1} - .) <= 129 bne {1} ELSE beq skip$ jmp {1} skip$ ENDIF ENDM ;=============================================================================== ORG $1000 BackOk ds 126, $ea BNEJ BackOk BackJmp ; this has to use "jmp" ; and is detected as such ds 126+1, $ea BNEJ BackJmp ; this can use "bne" BNEJ ForwardOk ds 127, $ea ForwardOk ; this has to use "jmp" ; and is detected as such BNEJ ForwardJmp ds 127+3, $ea ForwardJmp ; this has to use "jmp" ; and is detected as such BNEJ ForwardJmp2 ds 127+2, $ea ForwardJmp2 dasm-2.20.14.1/test/labelchanges.bin.ref000066400000000000000000000012241375233463600176120ustar00rootroot00000000000000ЀLL Ldasm-2.20.14.1/test/labelchanges.hex.ref000066400000000000000000000035231375233463600176320ustar00rootroot00000000000000:10100000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA40 :10101000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA30 :10102000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA20 :10103000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA10 :10104000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA00 :10105000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAF0 :10106000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE0 :10107000EAEAEAEAEAEAEAEAEAEAEAEAEAEAD08054 :10108000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAC0 :10109000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAB0 :1010A000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAA0 :1010B000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA90 :1010C000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA80 :1010D000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA70 :1010E000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA60 :1010F000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAF04A :10110000034C8010D07FEAEAEAEAEAEAEAEAEAEA8D :10111000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA2F :10112000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA1F :10113000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA0F :10114000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAFF :10115000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEF :10116000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADF :10117000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEACF :10118000EAEAEAEAEAF0034C0C12EAEAEAEAEAEAF4 :10119000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAAF :1011A000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA9F :1011B000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA8F :1011C000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA7F :1011D000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA6F :1011E000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA5F :1011F000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA4F :10120000EAEAEAEAEAEAEAEAEAEAEAEAF0034C9215 :1012100012EAEAEAEAEAEAEAEAEAEAEAEAEAEAEA06 :10122000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA1E :10123000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA0E :10124000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAFE :10125000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEE :10126000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADE :10127000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEACE :10128000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEABE :02129000EAEA88 :00000001FF dasm-2.20.14.1/test/locals.asm000066400000000000000000000004051375233463600157140ustar00rootroot00000000000000;;;; ; ; Test local symbols ; processor 6502 mac test1 bne .end test$ = 1 test2 .end nop endm mac test2 bne .end test$ = 1 test3 .end nop endm mac test3 bne .end test$ = 1 nop .end nop endm org 0 test1 test2 test3 .end loop set 0 dasm-2.20.14.1/test/locals.bin.ref000066400000000000000000000000271375233463600164570ustar00rootroot00000000000000dasm-2.20.14.1/test/locals.hex.ref000066400000000000000000000001211375233463600164660ustar00rootroot00000000000000:10000000D007D004D001EAEAEAEAD004D001EAEA53 :05001000EAD001EAEA5C :00000001FF dasm-2.20.14.1/test/lockup_macro.asm000066400000000000000000000006421375233463600171200ustar00rootroot00000000000000 .PROCESSOR 68908 .macro fw_delay ldx #{1} ;[2] lda #{2} ;[2] jsr MoniRomDelayLoop ;[5] .endm .macro declare_delay Delay{1}: fw_delay {2},{3} rts ;[4] .endm .ORG 0 .word $B,$AD,$C0,$DE declare_delay 100us,1,40 ; 128 cycles, declare_delay 4ms,7,234 ; 4928 cycles, #include "file-with-dash.asm" ;MoniRomDelayLoop: ; rts dasm-2.20.14.1/test/lockup_macro.bin.ref000066400000000000000000000000421375233463600176550ustar00rootroot00000000000000 ޮ(JJJK[dasm-2.20.14.1/test/lockup_macro.hex.ref000066400000000000000000000001441375233463600176740ustar00rootroot00000000000000:10000000000B00AD00C000DEAE01A628BD1681AE1B :1000100007A6EABD16814A874A4A4BFE865BF881ED :00000001FF dasm-2.20.14.1/test/longstring.asm000066400000000000000000000007551375233463600166350ustar00rootroot00000000000000; Test long strings ; ; This came about due to strings longer than 256 bytes causing ; segfaults, due to overflow of a buffer in the opcode handling. ; ; --Mike Saarna .processor 6502 .org 0 .byte "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" .end dasm-2.20.14.1/test/longstring.bin.ref000066400000000000000000000004321375233463600173700ustar00rootroot000000000000001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890dasm-2.20.14.1/test/longstring.hex.ref000066400000000000000000000014471375233463600174130ustar00rootroot00000000000000:1000000031323334353637383930313233343536AE :100010003738393031323334353637383930313298 :100020003334353637383930313233343536373882 :100030003930313233343536373839303132333480 :100040003536373839303132333435363738393060 :10005000313233343536373839303132333435365E :100060003738393031323334353637383930313248 :100070003334353637383930313233343536373832 :100080003930313233343536373839303132333430 :100090003536373839303132333435363738393010 :1000A000313233343536373839303132333435360E :1000B00037383930313233343536373839303132F8 :1000C00033343536373839303132333435363738E2 :1000D00039303132333435363738393031323334E0 :1000E00035363738393031323334353637383930C0 :1000F00031323334353637383930313233343536BE :1001000037383930313233343536373839303132A7 :0801100033343536373839303D :00000001FF dasm-2.20.14.1/test/m_switch_0.asm000066400000000000000000000000531375233463600164720ustar00rootroot00000000000000 .processor 6502 .ds 0x7FFFFFFE .enddasm-2.20.14.1/test/m_switch_0.fail000066400000000000000000000000021375233463600166170ustar00rootroot0000000000000038dasm-2.20.14.1/test/m_switch_1.asm000066400000000000000000000001501375233463600164710ustar00rootroot00000000000000 .processor 6502 .org 0 DC.w 37 DC.w 47 DC.w 59 .ds ((64+4) * 1024) DC.w 37,47,59 .enddasm-2.20.14.1/test/m_switch_1.bin.ref000066400000000000000000002100161375233463600172400ustar00rootroot00000000000000%/;%/;dasm-2.20.14.1/test/m_switch_1.hex.ref000066400000000000000000005764621375233463600173000ustar00rootroot00000000000000:1000000025002F003B000000000000000000000061 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 :100080000000000000000000000000000000000070 :100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF :1001100000000000000000000000000000000000DF :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 :100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 :100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 :100EC0000000000000000000000000000000000022 :100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 :100F400000000000000000000000000000000000A1 :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 :1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 :101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 :1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 :1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF :1011100000000000000000000000000000000000CF :1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F :10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D000000000000000000000000000000000000F :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D :10135000000000000000000000000000000000008D :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D :1013A000000000000000000000000000000000003D :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD :1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C :1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB :10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B :10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA :1016300000000000000000000000000000000000AA :10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A :10167000000000000000000000000000000000006A :10168000000000000000000000000000000000005A :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA :1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 :101740000000000000000000000000000000000099 :101750000000000000000000000000000000000089 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 :101780000000000000000000000000000000000059 :101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000000000000058 :101890000000000000000000000000000000000048 :1018A0000000000000000000000000000000000038 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 :1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 :1019000000000000000000000000000000000000D7 :1019100000000000000000000000000000000000C7 :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 :101990000000000000000000000000000000000047 :1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 :1019E00000000000000000000000000000000000F7 :1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 :101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 :101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 :101BF00000000000000000000000000000000000E5 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 :101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 :101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 :101D200000000000000000000000000000000000B3 :101D300000000000000000000000000000000000A3 :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 :101D70000000000000000000000000000000000063 :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 :101DF00000000000000000000000000000000000E3 :101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 :101E200000000000000000000000000000000000B2 :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 :101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 :101F50000000000000000000000000000000000081 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 :101F80000000000000000000000000000000000051 :101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 :1020000000000000000000000000000000000000D0 :1020100000000000000000000000000000000000C0 :1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 :102040000000000000000000000000000000000090 :102050000000000000000000000000000000000080 :102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 :102080000000000000000000000000000000000050 :102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 :1020D0000000000000000000000000000000000000 :1020E00000000000000000000000000000000000F0 :1020F00000000000000000000000000000000000E0 :1021000000000000000000000000000000000000CF :1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F :10215000000000000000000000000000000000007F :10216000000000000000000000000000000000006F :10217000000000000000000000000000000000005F :10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F :1021A000000000000000000000000000000000002F :1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F :1021D00000000000000000000000000000000000FF :1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE :1022100000000000000000000000000000000000BE :1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E :10225000000000000000000000000000000000007E :10226000000000000000000000000000000000006E :10227000000000000000000000000000000000005E :10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E :1022D00000000000000000000000000000000000FE :1022E00000000000000000000000000000000000EE :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD :1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD :10233000000000000000000000000000000000009D :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D :10237000000000000000000000000000000000005D :10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D :1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED :1023F00000000000000000000000000000000000DD :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC :10243000000000000000000000000000000000009C :10244000000000000000000000000000000000008C :10245000000000000000000000000000000000007C :10246000000000000000000000000000000000006C :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB :10253000000000000000000000000000000000009B :10254000000000000000000000000000000000008B :10255000000000000000000000000000000000007B :10256000000000000000000000000000000000006B :10257000000000000000000000000000000000005B :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B :1025B000000000000000000000000000000000001B :1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB :1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA :10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A :10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A :1026B000000000000000000000000000000000001A :1026C000000000000000000000000000000000000A :1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA :1026F00000000000000000000000000000000000DA :1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 :102730000000000000000000000000000000000099 :102740000000000000000000000000000000000089 :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 :102780000000000000000000000000000000000049 :102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 :1027B0000000000000000000000000000000000019 :1027C0000000000000000000000000000000000009 :1027D00000000000000000000000000000000000F9 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 :1028000000000000000000000000000000000000C8 :1028100000000000000000000000000000000000B8 :1028200000000000000000000000000000000000A8 :102830000000000000000000000000000000000098 :102840000000000000000000000000000000000088 :102850000000000000000000000000000000000078 :102860000000000000000000000000000000000068 :102870000000000000000000000000000000000058 :102880000000000000000000000000000000000048 :102890000000000000000000000000000000000038 :1028A0000000000000000000000000000000000028 :1028B0000000000000000000000000000000000018 :1028C0000000000000000000000000000000000008 :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 :1028F00000000000000000000000000000000000D8 :1029000000000000000000000000000000000000C7 :1029100000000000000000000000000000000000B7 :1029200000000000000000000000000000000000A7 :102930000000000000000000000000000000000097 :102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 :102970000000000000000000000000000000000057 :102980000000000000000000000000000000000047 :102990000000000000000000000000000000000037 :1029A0000000000000000000000000000000000027 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 :1029D00000000000000000000000000000000000F7 :1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 :102A000000000000000000000000000000000000C6 :102A100000000000000000000000000000000000B6 :102A200000000000000000000000000000000000A6 :102A30000000000000000000000000000000000096 :102A40000000000000000000000000000000000086 :102A50000000000000000000000000000000000076 :102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 :102AA0000000000000000000000000000000000026 :102AB0000000000000000000000000000000000016 :102AC0000000000000000000000000000000000006 :102AD00000000000000000000000000000000000F6 :102AE00000000000000000000000000000000000E6 :102AF00000000000000000000000000000000000D6 :102B000000000000000000000000000000000000C5 :102B100000000000000000000000000000000000B5 :102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 :102B40000000000000000000000000000000000085 :102B50000000000000000000000000000000000075 :102B60000000000000000000000000000000000065 :102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 :102B90000000000000000000000000000000000035 :102BA0000000000000000000000000000000000025 :102BB0000000000000000000000000000000000015 :102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 :102BF00000000000000000000000000000000000D5 :102C000000000000000000000000000000000000C4 :102C100000000000000000000000000000000000B4 :102C200000000000000000000000000000000000A4 :102C30000000000000000000000000000000000094 :102C40000000000000000000000000000000000084 :102C50000000000000000000000000000000000074 :102C60000000000000000000000000000000000064 :102C70000000000000000000000000000000000054 :102C80000000000000000000000000000000000044 :102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 :102CB0000000000000000000000000000000000014 :102CC0000000000000000000000000000000000004 :102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 :102CF00000000000000000000000000000000000D4 :102D000000000000000000000000000000000000C3 :102D100000000000000000000000000000000000B3 :102D200000000000000000000000000000000000A3 :102D30000000000000000000000000000000000093 :102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 :102D70000000000000000000000000000000000053 :102D80000000000000000000000000000000000043 :102D90000000000000000000000000000000000033 :102DA0000000000000000000000000000000000023 :102DB0000000000000000000000000000000000013 :102DC0000000000000000000000000000000000003 :102DD00000000000000000000000000000000000F3 :102DE00000000000000000000000000000000000E3 :102DF00000000000000000000000000000000000D3 :102E000000000000000000000000000000000000C2 :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 :102E30000000000000000000000000000000000092 :102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 :102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 :102EB0000000000000000000000000000000000012 :102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 :102EF00000000000000000000000000000000000D2 :102F000000000000000000000000000000000000C1 :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000000000000091 :102F40000000000000000000000000000000000081 :102F50000000000000000000000000000000000071 :102F60000000000000000000000000000000000061 :102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 :102FB0000000000000000000000000000000000011 :102FC0000000000000000000000000000000000001 :102FD00000000000000000000000000000000000F1 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 :1030100000000000000000000000000000000000B0 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 :103040000000000000000000000000000000000080 :103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F :10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE :10322000000000000000000000000000000000009E :10323000000000000000000000000000000000008E :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E :10328000000000000000000000000000000000003E :10329000000000000000000000000000000000002E :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC :10342000000000000000000000000000000000009C :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C :10346000000000000000000000000000000000005C :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC :1034E00000000000000000000000000000000000DC :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB :10352000000000000000000000000000000000009B :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B :10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B :10359000000000000000000000000000000000002B :1035A000000000000000000000000000000000001B :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB :1035D00000000000000000000000000000000000EB :1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB :1036000000000000000000000000000000000000BA :1036100000000000000000000000000000000000AA :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A :10365000000000000000000000000000000000006A :10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A :1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 :103730000000000000000000000000000000000089 :103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 :1037D00000000000000000000000000000000000E9 :1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 :103820000000000000000000000000000000000098 :103830000000000000000000000000000000000088 :103840000000000000000000000000000000000078 :103850000000000000000000000000000000000068 :103860000000000000000000000000000000000058 :103870000000000000000000000000000000000048 :103880000000000000000000000000000000000038 :103890000000000000000000000000000000000028 :1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 :1038C00000000000000000000000000000000000F8 :1038D00000000000000000000000000000000000E8 :1038E00000000000000000000000000000000000D8 :1038F00000000000000000000000000000000000C8 :1039000000000000000000000000000000000000B7 :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 :103940000000000000000000000000000000000077 :103950000000000000000000000000000000000067 :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 :1039D00000000000000000000000000000000000E7 :1039E00000000000000000000000000000000000D7 :1039F00000000000000000000000000000000000C7 :103A000000000000000000000000000000000000B6 :103A100000000000000000000000000000000000A6 :103A20000000000000000000000000000000000096 :103A30000000000000000000000000000000000086 :103A40000000000000000000000000000000000076 :103A50000000000000000000000000000000000066 :103A60000000000000000000000000000000000056 :103A70000000000000000000000000000000000046 :103A80000000000000000000000000000000000036 :103A90000000000000000000000000000000000026 :103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 :103AC00000000000000000000000000000000000F6 :103AD00000000000000000000000000000000000E6 :103AE00000000000000000000000000000000000D6 :103AF00000000000000000000000000000000000C6 :103B000000000000000000000000000000000000B5 :103B100000000000000000000000000000000000A5 :103B20000000000000000000000000000000000095 :103B30000000000000000000000000000000000085 :103B40000000000000000000000000000000000075 :103B50000000000000000000000000000000000065 :103B60000000000000000000000000000000000055 :103B70000000000000000000000000000000000045 :103B80000000000000000000000000000000000035 :103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 :103BB0000000000000000000000000000000000005 :103BC00000000000000000000000000000000000F5 :103BD00000000000000000000000000000000000E5 :103BE00000000000000000000000000000000000D5 :103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 :103C100000000000000000000000000000000000A4 :103C20000000000000000000000000000000000094 :103C30000000000000000000000000000000000084 :103C40000000000000000000000000000000000074 :103C50000000000000000000000000000000000064 :103C60000000000000000000000000000000000054 :103C70000000000000000000000000000000000044 :103C80000000000000000000000000000000000034 :103C90000000000000000000000000000000000024 :103CA0000000000000000000000000000000000014 :103CB0000000000000000000000000000000000004 :103CC00000000000000000000000000000000000F4 :103CD00000000000000000000000000000000000E4 :103CE00000000000000000000000000000000000D4 :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 :103D100000000000000000000000000000000000A3 :103D20000000000000000000000000000000000093 :103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 :103D50000000000000000000000000000000000063 :103D60000000000000000000000000000000000053 :103D70000000000000000000000000000000000043 :103D80000000000000000000000000000000000033 :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000000000000013 :103DB0000000000000000000000000000000000003 :103DC00000000000000000000000000000000000F3 :103DD00000000000000000000000000000000000E3 :103DE00000000000000000000000000000000000D3 :103DF00000000000000000000000000000000000C3 :103E000000000000000000000000000000000000B2 :103E100000000000000000000000000000000000A2 :103E20000000000000000000000000000000000092 :103E30000000000000000000000000000000000082 :103E40000000000000000000000000000000000072 :103E50000000000000000000000000000000000062 :103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 :103E80000000000000000000000000000000000032 :103E90000000000000000000000000000000000022 :103EA0000000000000000000000000000000000012 :103EB0000000000000000000000000000000000002 :103EC00000000000000000000000000000000000F2 :103ED00000000000000000000000000000000000E2 :103EE00000000000000000000000000000000000D2 :103EF00000000000000000000000000000000000C2 :103F000000000000000000000000000000000000B1 :103F100000000000000000000000000000000000A1 :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 :103F50000000000000000000000000000000000061 :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 :104050000000000000000000000000000000000060 :104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 :104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 :1040C00000000000000000000000000000000000F0 :1040D00000000000000000000000000000000000E0 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F :10414000000000000000000000000000000000006F :10415000000000000000000000000000000000005F :10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F :10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF :1041C00000000000000000000000000000000000EF :1041D00000000000000000000000000000000000DF :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000000000AE :10421000000000000000000000000000000000009E :10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E :10425000000000000000000000000000000000005E :10426000000000000000000000000000000000004E :10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E :1042B00000000000000000000000000000000000FE :1042C00000000000000000000000000000000000EE :1042D00000000000000000000000000000000000DE :1042E00000000000000000000000000000000000CE :1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D :10433000000000000000000000000000000000007D :10434000000000000000000000000000000000006D :10435000000000000000000000000000000000005D :10436000000000000000000000000000000000004D :10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D :10439000000000000000000000000000000000001D :1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD :1043C00000000000000000000000000000000000ED :1043D00000000000000000000000000000000000DD :1043E00000000000000000000000000000000000CD :1043F00000000000000000000000000000000000BD :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C :10443000000000000000000000000000000000007C :10444000000000000000000000000000000000006C :10445000000000000000000000000000000000005C :10446000000000000000000000000000000000004C :10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C :10449000000000000000000000000000000000001C :1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC :1044F00000000000000000000000000000000000BC :1045000000000000000000000000000000000000AB :10451000000000000000000000000000000000009B :10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B :10454000000000000000000000000000000000006B :10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B :10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB :1045C00000000000000000000000000000000000EB :1045D00000000000000000000000000000000000DB :1045E00000000000000000000000000000000000CB :1045F00000000000000000000000000000000000BB :1046000000000000000000000000000000000000AA :10461000000000000000000000000000000000009A :10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A :10465000000000000000000000000000000000005A :10466000000000000000000000000000000000004A :10467000000000000000000000000000000000003A :10468000000000000000000000000000000000002A :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA :1046E00000000000000000000000000000000000CA :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 :104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 :104760000000000000000000000000000000000049 :104770000000000000000000000000000000000039 :104780000000000000000000000000000000000029 :104790000000000000000000000000000000000019 :1047A0000000000000000000000000000000000009 :1047B00000000000000000000000000000000000F9 :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 :1047F00000000000000000000000000000000000B9 :1048000000000000000000000000000000000000A8 :104810000000000000000000000000000000000098 :104820000000000000000000000000000000000088 :104830000000000000000000000000000000000078 :104840000000000000000000000000000000000068 :104850000000000000000000000000000000000058 :104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 :104880000000000000000000000000000000000028 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 :1048D00000000000000000000000000000000000D8 :1048E00000000000000000000000000000000000C8 :1048F00000000000000000000000000000000000B8 :1049000000000000000000000000000000000000A7 :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 :104940000000000000000000000000000000000067 :104950000000000000000000000000000000000057 :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 :104990000000000000000000000000000000000017 :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 :1049E00000000000000000000000000000000000C7 :1049F00000000000000000000000000000000000B7 :104A000000000000000000000000000000000000A6 :104A10000000000000000000000000000000000096 :104A20000000000000000000000000000000000086 :104A30000000000000000000000000000000000076 :104A40000000000000000000000000000000000066 :104A50000000000000000000000000000000000056 :104A60000000000000000000000000000000000046 :104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 :104A90000000000000000000000000000000000016 :104AA0000000000000000000000000000000000006 :104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 :104AD00000000000000000000000000000000000D6 :104AE00000000000000000000000000000000000C6 :104AF00000000000000000000000000000000000B6 :104B000000000000000000000000000000000000A5 :104B10000000000000000000000000000000000095 :104B20000000000000000000000000000000000085 :104B30000000000000000000000000000000000075 :104B40000000000000000000000000000000000065 :104B50000000000000000000000000000000000055 :104B60000000000000000000000000000000000045 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 :104B90000000000000000000000000000000000015 :104BA0000000000000000000000000000000000005 :104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 :104BD00000000000000000000000000000000000D5 :104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 :104C10000000000000000000000000000000000094 :104C20000000000000000000000000000000000084 :104C30000000000000000000000000000000000074 :104C40000000000000000000000000000000000064 :104C50000000000000000000000000000000000054 :104C60000000000000000000000000000000000044 :104C70000000000000000000000000000000000034 :104C80000000000000000000000000000000000024 :104C90000000000000000000000000000000000014 :104CA0000000000000000000000000000000000004 :104CB00000000000000000000000000000000000F4 :104CC00000000000000000000000000000000000E4 :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 :104D10000000000000000000000000000000000093 :104D20000000000000000000000000000000000083 :104D30000000000000000000000000000000000073 :104D40000000000000000000000000000000000063 :104D50000000000000000000000000000000000053 :104D60000000000000000000000000000000000043 :104D70000000000000000000000000000000000033 :104D80000000000000000000000000000000000023 :104D90000000000000000000000000000000000013 :104DA0000000000000000000000000000000000003 :104DB00000000000000000000000000000000000F3 :104DC00000000000000000000000000000000000E3 :104DD00000000000000000000000000000000000D3 :104DE00000000000000000000000000000000000C3 :104DF00000000000000000000000000000000000B3 :104E000000000000000000000000000000000000A2 :104E10000000000000000000000000000000000092 :104E20000000000000000000000000000000000082 :104E30000000000000000000000000000000000072 :104E40000000000000000000000000000000000062 :104E50000000000000000000000000000000000052 :104E60000000000000000000000000000000000042 :104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 :104E90000000000000000000000000000000000012 :104EA0000000000000000000000000000000000002 :104EB00000000000000000000000000000000000F2 :104EC00000000000000000000000000000000000E2 :104ED00000000000000000000000000000000000D2 :104EE00000000000000000000000000000000000C2 :104EF00000000000000000000000000000000000B2 :104F000000000000000000000000000000000000A1 :104F10000000000000000000000000000000000091 :104F20000000000000000000000000000000000081 :104F30000000000000000000000000000000000071 :104F40000000000000000000000000000000000061 :104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 :104F70000000000000000000000000000000000031 :104F80000000000000000000000000000000000021 :104F90000000000000000000000000000000000011 :104FA0000000000000000000000000000000000001 :104FB00000000000000000000000000000000000F1 :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 :104FF00000000000000000000000000000000000B1 :1050000000000000000000000000000000000000A0 :105010000000000000000000000000000000000090 :105020000000000000000000000000000000000080 :105030000000000000000000000000000000000070 :105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 :105060000000000000000000000000000000000040 :105070000000000000000000000000000000000030 :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 :1050B00000000000000000000000000000000000F0 :1050C00000000000000000000000000000000000E0 :1050D00000000000000000000000000000000000D0 :1050E00000000000000000000000000000000000C0 :1050F00000000000000000000000000000000000B0 :10510000000000000000000000000000000000009F :10511000000000000000000000000000000000008F :10512000000000000000000000000000000000007F :10513000000000000000000000000000000000006F :10514000000000000000000000000000000000005F :10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F :10517000000000000000000000000000000000002F :10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF :1051B00000000000000000000000000000000000EF :1051C00000000000000000000000000000000000DF :1051D00000000000000000000000000000000000CF :1051E00000000000000000000000000000000000BF :1051F00000000000000000000000000000000000AF :10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E :10523000000000000000000000000000000000006E :10524000000000000000000000000000000000005E :10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E :10527000000000000000000000000000000000002E :10528000000000000000000000000000000000001E :10529000000000000000000000000000000000000E :1052A00000000000000000000000000000000000FE :1052B00000000000000000000000000000000000EE :1052C00000000000000000000000000000000000DE :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D :10533000000000000000000000000000000000006D :10534000000000000000000000000000000000005D :10535000000000000000000000000000000000004D :10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D :10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD :1053B00000000000000000000000000000000000ED :1053C00000000000000000000000000000000000DD :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD :1053F00000000000000000000000000000000000AD :10540000000000000000000000000000000000009C :10541000000000000000000000000000000000008C :10542000000000000000000000000000000000007C :10543000000000000000000000000000000000006C :10544000000000000000000000000000000000005C :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C :10547000000000000000000000000000000000002C :10548000000000000000000000000000000000001C :10549000000000000000000000000000000000000C :1054A00000000000000000000000000000000000FC :1054B00000000000000000000000000000000000EC :1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC :10550000000000000000000000000000000000009B :10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B :10553000000000000000000000000000000000006B :10554000000000000000000000000000000000005B :10555000000000000000000000000000000000004B :10556000000000000000000000000000000000003B :10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B :1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB :1055C00000000000000000000000000000000000DB :1055D00000000000000000000000000000000000CB :1055E00000000000000000000000000000000000BB :1055F00000000000000000000000000000000000AB :10560000000000000000000000000000000000009A :10561000000000000000000000000000000000008A :10562000000000000000000000000000000000007A :10563000000000000000000000000000000000006A :10564000000000000000000000000000000000005A :10565000000000000000000000000000000000004A :10566000000000000000000000000000000000003A :10567000000000000000000000000000000000002A :10568000000000000000000000000000000000001A :10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA :1056B00000000000000000000000000000000000EA :1056C00000000000000000000000000000000000DA :1056D00000000000000000000000000000000000CA :1056E00000000000000000000000000000000000BA :1056F00000000000000000000000000000000000AA :105700000000000000000000000000000000000099 :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 :105740000000000000000000000000000000000059 :105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 :105780000000000000000000000000000000000019 :105790000000000000000000000000000000000009 :1057A00000000000000000000000000000000000F9 :1057B00000000000000000000000000000000000E9 :1057C00000000000000000000000000000000000D9 :1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 :105800000000000000000000000000000000000098 :105810000000000000000000000000000000000088 :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 :105850000000000000000000000000000000000048 :105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 :105880000000000000000000000000000000000018 :105890000000000000000000000000000000000008 :1058A00000000000000000000000000000000000F8 :1058B00000000000000000000000000000000000E8 :1058C00000000000000000000000000000000000D8 :1058D00000000000000000000000000000000000C8 :1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 :105900000000000000000000000000000000000097 :105910000000000000000000000000000000000087 :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 :105950000000000000000000000000000000000047 :105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 :105980000000000000000000000000000000000017 :105990000000000000000000000000000000000007 :1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 :1059D00000000000000000000000000000000000C7 :1059E00000000000000000000000000000000000B7 :1059F00000000000000000000000000000000000A7 :105A00000000000000000000000000000000000096 :105A10000000000000000000000000000000000086 :105A20000000000000000000000000000000000076 :105A30000000000000000000000000000000000066 :105A40000000000000000000000000000000000056 :105A50000000000000000000000000000000000046 :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 :105A80000000000000000000000000000000000016 :105A90000000000000000000000000000000000006 :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 :105AD00000000000000000000000000000000000C6 :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 :105B10000000000000000000000000000000000085 :105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 :105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 :105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 :105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 :105C20000000000000000000000000000000000074 :105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 :105C90000000000000000000000000000000000004 :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 :105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000000000C4 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 :105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 :105DA00000000000000000000000000000000000F3 :105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 :105DD00000000000000000000000000000000000C3 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 :105E00000000000000000000000000000000000092 :105E10000000000000000000000000000000000082 :105E20000000000000000000000000000000000072 :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 :105E50000000000000000000000000000000000042 :105E60000000000000000000000000000000000032 :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 :105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 :105F30000000000000000000000000000000000061 :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 :105F60000000000000000000000000000000000031 :105F70000000000000000000000000000000000021 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 :105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 :105FE00000000000000000000000000000000000B1 :105FF00000000000000000000000000000000000A1 :106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 :106040000000000000000000000000000000000050 :106050000000000000000000000000000000000040 :106060000000000000000000000000000000000030 :106070000000000000000000000000000000000020 :106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 :1060C00000000000000000000000000000000000D0 :1060D00000000000000000000000000000000000C0 :1060E00000000000000000000000000000000000B0 :1060F00000000000000000000000000000000000A0 :10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F :10614000000000000000000000000000000000004F :10615000000000000000000000000000000000003F :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F :10618000000000000000000000000000000000000F :1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF :1061F000000000000000000000000000000000009F :10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E :10627000000000000000000000000000000000001E :10628000000000000000000000000000000000000E :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE :1062D00000000000000000000000000000000000BE :1062E00000000000000000000000000000000000AE :1062F000000000000000000000000000000000009E :10630000000000000000000000000000000000008D :10631000000000000000000000000000000000007D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D :10636000000000000000000000000000000000002D :10637000000000000000000000000000000000001D :10638000000000000000000000000000000000000D :1063900000000000000000000000000000000000FD :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD :1063D00000000000000000000000000000000000BD :1063E00000000000000000000000000000000000AD :1063F000000000000000000000000000000000009D :10640000000000000000000000000000000000008C :10641000000000000000000000000000000000007C :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C :10645000000000000000000000000000000000003C :10646000000000000000000000000000000000002C :10647000000000000000000000000000000000001C :10648000000000000000000000000000000000000C :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC :1064F000000000000000000000000000000000009C :10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB :1065E00000000000000000000000000000000000AB :1065F000000000000000000000000000000000009B :10660000000000000000000000000000000000008A :10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A :10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A :10665000000000000000000000000000000000003A :10666000000000000000000000000000000000002A :10667000000000000000000000000000000000001A :10668000000000000000000000000000000000000A :1066900000000000000000000000000000000000FA :1066A00000000000000000000000000000000000EA :1066B00000000000000000000000000000000000DA :1066C00000000000000000000000000000000000CA :1066D00000000000000000000000000000000000BA :1066E00000000000000000000000000000000000AA :1066F000000000000000000000000000000000009A :106700000000000000000000000000000000000089 :106710000000000000000000000000000000000079 :106720000000000000000000000000000000000069 :106730000000000000000000000000000000000059 :106740000000000000000000000000000000000049 :106750000000000000000000000000000000000039 :106760000000000000000000000000000000000029 :106770000000000000000000000000000000000019 :106780000000000000000000000000000000000009 :1067900000000000000000000000000000000000F9 :1067A00000000000000000000000000000000000E9 :1067B00000000000000000000000000000000000D9 :1067C00000000000000000000000000000000000C9 :1067D00000000000000000000000000000000000B9 :1067E00000000000000000000000000000000000A9 :1067F0000000000000000000000000000000000099 :106800000000000000000000000000000000000088 :106810000000000000000000000000000000000078 :106820000000000000000000000000000000000068 :106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 :106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 :106870000000000000000000000000000000000018 :106880000000000000000000000000000000000008 :1068900000000000000000000000000000000000F8 :1068A00000000000000000000000000000000000E8 :1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 :1068E00000000000000000000000000000000000A8 :1068F0000000000000000000000000000000000098 :106900000000000000000000000000000000000087 :106910000000000000000000000000000000000077 :106920000000000000000000000000000000000067 :106930000000000000000000000000000000000057 :106940000000000000000000000000000000000047 :106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 :106970000000000000000000000000000000000017 :106980000000000000000000000000000000000007 :1069900000000000000000000000000000000000F7 :1069A00000000000000000000000000000000000E7 :1069B00000000000000000000000000000000000D7 :1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 :1069E00000000000000000000000000000000000A7 :1069F0000000000000000000000000000000000097 :106A00000000000000000000000000000000000086 :106A10000000000000000000000000000000000076 :106A20000000000000000000000000000000000066 :106A30000000000000000000000000000000000056 :106A40000000000000000000000000000000000046 :106A50000000000000000000000000000000000036 :106A60000000000000000000000000000000000026 :106A70000000000000000000000000000000000016 :106A80000000000000000000000000000000000006 :106A900000000000000000000000000000000000F6 :106AA00000000000000000000000000000000000E6 :106AB00000000000000000000000000000000000D6 :106AC00000000000000000000000000000000000C6 :106AD00000000000000000000000000000000000B6 :106AE00000000000000000000000000000000000A6 :106AF0000000000000000000000000000000000096 :106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 :106B20000000000000000000000000000000000065 :106B30000000000000000000000000000000000055 :106B40000000000000000000000000000000000045 :106B50000000000000000000000000000000000035 :106B60000000000000000000000000000000000025 :106B70000000000000000000000000000000000015 :106B80000000000000000000000000000000000005 :106B900000000000000000000000000000000000F5 :106BA00000000000000000000000000000000000E5 :106BB00000000000000000000000000000000000D5 :106BC00000000000000000000000000000000000C5 :106BD00000000000000000000000000000000000B5 :106BE00000000000000000000000000000000000A5 :106BF0000000000000000000000000000000000095 :106C00000000000000000000000000000000000084 :106C10000000000000000000000000000000000074 :106C20000000000000000000000000000000000064 :106C30000000000000000000000000000000000054 :106C40000000000000000000000000000000000044 :106C50000000000000000000000000000000000034 :106C60000000000000000000000000000000000024 :106C70000000000000000000000000000000000014 :106C80000000000000000000000000000000000004 :106C900000000000000000000000000000000000F4 :106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 :106CE00000000000000000000000000000000000A4 :106CF0000000000000000000000000000000000094 :106D00000000000000000000000000000000000083 :106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 :106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 :106D60000000000000000000000000000000000023 :106D70000000000000000000000000000000000013 :106D80000000000000000000000000000000000003 :106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 :106DF0000000000000000000000000000000000093 :106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 :106E20000000000000000000000000000000000062 :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 :106E70000000000000000000000000000000000012 :106E80000000000000000000000000000000000002 :106E900000000000000000000000000000000000F2 :106EA00000000000000000000000000000000000E2 :106EB00000000000000000000000000000000000D2 :106EC00000000000000000000000000000000000C2 :106ED00000000000000000000000000000000000B2 :106EE00000000000000000000000000000000000A2 :106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 :106F10000000000000000000000000000000000071 :106F20000000000000000000000000000000000061 :106F30000000000000000000000000000000000051 :106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 :106F70000000000000000000000000000000000011 :106F80000000000000000000000000000000000001 :106F900000000000000000000000000000000000F1 :106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 :106FC00000000000000000000000000000000000C1 :106FD00000000000000000000000000000000000B1 :106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 :107000000000000000000000000000000000000080 :107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 :107050000000000000000000000000000000000030 :107060000000000000000000000000000000000020 :107070000000000000000000000000000000000010 :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 :1070B00000000000000000000000000000000000D0 :1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 :10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F :10712000000000000000000000000000000000005F :10713000000000000000000000000000000000004F :10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF :1071900000000000000000000000000000000000EF :1071A00000000000000000000000000000000000DF :1071B00000000000000000000000000000000000CF :1071C00000000000000000000000000000000000BF :1071D00000000000000000000000000000000000AF :1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E :10722000000000000000000000000000000000005E :10723000000000000000000000000000000000004E :10724000000000000000000000000000000000003E :10725000000000000000000000000000000000002E :10726000000000000000000000000000000000001E :10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE :1072A00000000000000000000000000000000000DE :1072B00000000000000000000000000000000000CE :1072C00000000000000000000000000000000000BE :1072D00000000000000000000000000000000000AE :1072E000000000000000000000000000000000009E :1072F000000000000000000000000000000000008E :10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D :10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D :10735000000000000000000000000000000000002D :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED :1073A00000000000000000000000000000000000DD :1073B00000000000000000000000000000000000CD :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD :1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C :10743000000000000000000000000000000000004C :10744000000000000000000000000000000000003C :10745000000000000000000000000000000000002C :10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC :1074B00000000000000000000000000000000000CC :1074C00000000000000000000000000000000000BC :1074D00000000000000000000000000000000000AC :1074E000000000000000000000000000000000009C :1074F000000000000000000000000000000000008C :10750000000000000000000000000000000000007B :10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B :10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B :10755000000000000000000000000000000000002B :10756000000000000000000000000000000000001B :10757000000000000000000000000000000000000B :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB :1075D00000000000000000000000000000000000AB :1075E000000000000000000000000000000000009B :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A :10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A :107700000000000000000000000000000000000079 :107710000000000000000000000000000000000069 :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 :1077800000000000000000000000000000000000F9 :1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 :1077F0000000000000000000000000000000000089 :107800000000000000000000000000000000000078 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 :107840000000000000000000000000000000000038 :107850000000000000000000000000000000000028 :107860000000000000000000000000000000000018 :107870000000000000000000000000000000000008 :1078800000000000000000000000000000000000F8 :1078900000000000000000000000000000000000E8 :1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 :1078C00000000000000000000000000000000000B8 :1078D00000000000000000000000000000000000A8 :1078E0000000000000000000000000000000000098 :1078F0000000000000000000000000000000000088 :107900000000000000000000000000000000000077 :107910000000000000000000000000000000000067 :107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 :107940000000000000000000000000000000000037 :107950000000000000000000000000000000000027 :107960000000000000000000000000000000000017 :107970000000000000000000000000000000000007 :1079800000000000000000000000000000000000F7 :1079900000000000000000000000000000000000E7 :1079A00000000000000000000000000000000000D7 :1079B00000000000000000000000000000000000C7 :1079C00000000000000000000000000000000000B7 :1079D00000000000000000000000000000000000A7 :1079E0000000000000000000000000000000000097 :1079F0000000000000000000000000000000000087 :107A00000000000000000000000000000000000076 :107A10000000000000000000000000000000000066 :107A20000000000000000000000000000000000056 :107A30000000000000000000000000000000000046 :107A40000000000000000000000000000000000036 :107A50000000000000000000000000000000000026 :107A60000000000000000000000000000000000016 :107A70000000000000000000000000000000000006 :107A800000000000000000000000000000000000F6 :107A900000000000000000000000000000000000E6 :107AA00000000000000000000000000000000000D6 :107AB00000000000000000000000000000000000C6 :107AC00000000000000000000000000000000000B6 :107AD00000000000000000000000000000000000A6 :107AE0000000000000000000000000000000000096 :107AF0000000000000000000000000000000000086 :107B00000000000000000000000000000000000075 :107B10000000000000000000000000000000000065 :107B20000000000000000000000000000000000055 :107B30000000000000000000000000000000000045 :107B40000000000000000000000000000000000035 :107B50000000000000000000000000000000000025 :107B60000000000000000000000000000000000015 :107B70000000000000000000000000000000000005 :107B800000000000000000000000000000000000F5 :107B900000000000000000000000000000000000E5 :107BA00000000000000000000000000000000000D5 :107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 :107BD00000000000000000000000000000000000A5 :107BE0000000000000000000000000000000000095 :107BF0000000000000000000000000000000000085 :107C00000000000000000000000000000000000074 :107C10000000000000000000000000000000000064 :107C20000000000000000000000000000000000054 :107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 :107C50000000000000000000000000000000000024 :107C60000000000000000000000000000000000014 :107C70000000000000000000000000000000000004 :107C800000000000000000000000000000000000F4 :107C900000000000000000000000000000000000E4 :107CA00000000000000000000000000000000000D4 :107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 :107CD00000000000000000000000000000000000A4 :107CE0000000000000000000000000000000000094 :107CF0000000000000000000000000000000000084 :107D00000000000000000000000000000000000073 :107D10000000000000000000000000000000000063 :107D20000000000000000000000000000000000053 :107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 :107D50000000000000000000000000000000000023 :107D60000000000000000000000000000000000013 :107D70000000000000000000000000000000000003 :107D800000000000000000000000000000000000F3 :107D900000000000000000000000000000000000E3 :107DA00000000000000000000000000000000000D3 :107DB00000000000000000000000000000000000C3 :107DC00000000000000000000000000000000000B3 :107DD00000000000000000000000000000000000A3 :107DE0000000000000000000000000000000000093 :107DF0000000000000000000000000000000000083 :107E00000000000000000000000000000000000072 :107E10000000000000000000000000000000000062 :107E20000000000000000000000000000000000052 :107E30000000000000000000000000000000000042 :107E40000000000000000000000000000000000032 :107E50000000000000000000000000000000000022 :107E60000000000000000000000000000000000012 :107E70000000000000000000000000000000000002 :107E800000000000000000000000000000000000F2 :107E900000000000000000000000000000000000E2 :107EA00000000000000000000000000000000000D2 :107EB00000000000000000000000000000000000C2 :107EC00000000000000000000000000000000000B2 :107ED00000000000000000000000000000000000A2 :107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 :107F00000000000000000000000000000000000071 :107F10000000000000000000000000000000000061 :107F20000000000000000000000000000000000051 :107F30000000000000000000000000000000000041 :107F40000000000000000000000000000000000031 :107F50000000000000000000000000000000000021 :107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 :107F800000000000000000000000000000000000F1 :107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 :107FD00000000000000000000000000000000000A1 :107FE0000000000000000000000000000000000091 :107FF0000000000000000000000000000000000081 :108000000000000000000000000000000000000070 :108010000000000000000000000000000000000060 :108020000000000000000000000000000000000050 :108030000000000000000000000000000000000040 :108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 :108060000000000000000000000000000000000010 :108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 :1080900000000000000000000000000000000000E0 :1080A00000000000000000000000000000000000D0 :1080B00000000000000000000000000000000000C0 :1080C00000000000000000000000000000000000B0 :1080D00000000000000000000000000000000000A0 :1080E0000000000000000000000000000000000090 :1080F0000000000000000000000000000000000080 :10810000000000000000000000000000000000006F :10811000000000000000000000000000000000005F :10812000000000000000000000000000000000004F :10813000000000000000000000000000000000003F :10814000000000000000000000000000000000002F :10815000000000000000000000000000000000001F :10816000000000000000000000000000000000000F :1081700000000000000000000000000000000000FF :1081800000000000000000000000000000000000EF :1081900000000000000000000000000000000000DF :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF :1081C00000000000000000000000000000000000AF :1081D000000000000000000000000000000000009F :1081E000000000000000000000000000000000008F :1081F000000000000000000000000000000000007F :10820000000000000000000000000000000000006E :10821000000000000000000000000000000000005E :10822000000000000000000000000000000000004E :10823000000000000000000000000000000000003E :10824000000000000000000000000000000000002E :10825000000000000000000000000000000000001E :10826000000000000000000000000000000000000E :1082700000000000000000000000000000000000FE :1082800000000000000000000000000000000000EE :1082900000000000000000000000000000000000DE :1082A00000000000000000000000000000000000CE :1082B00000000000000000000000000000000000BE :1082C00000000000000000000000000000000000AE :1082D000000000000000000000000000000000009E :1082E000000000000000000000000000000000008E :1082F000000000000000000000000000000000007E :10830000000000000000000000000000000000006D :10831000000000000000000000000000000000005D :10832000000000000000000000000000000000004D :10833000000000000000000000000000000000003D :10834000000000000000000000000000000000002D :10835000000000000000000000000000000000001D :10836000000000000000000000000000000000000D :1083700000000000000000000000000000000000FD :1083800000000000000000000000000000000000ED :1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD :1083C00000000000000000000000000000000000AD :1083D000000000000000000000000000000000009D :1083E000000000000000000000000000000000008D :1083F000000000000000000000000000000000007D :10840000000000000000000000000000000000006C :10841000000000000000000000000000000000005C :10842000000000000000000000000000000000004C :10843000000000000000000000000000000000003C :10844000000000000000000000000000000000002C :10845000000000000000000000000000000000001C :10846000000000000000000000000000000000000C :1084700000000000000000000000000000000000FC :1084800000000000000000000000000000000000EC :1084900000000000000000000000000000000000DC :1084A00000000000000000000000000000000000CC :1084B00000000000000000000000000000000000BC :1084C00000000000000000000000000000000000AC :1084D000000000000000000000000000000000009C :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B :10851000000000000000000000000000000000005B :10852000000000000000000000000000000000004B :10853000000000000000000000000000000000003B :10854000000000000000000000000000000000002B :10855000000000000000000000000000000000001B :10856000000000000000000000000000000000000B :1085700000000000000000000000000000000000FB :1085800000000000000000000000000000000000EB :1085900000000000000000000000000000000000DB :1085A00000000000000000000000000000000000CB :1085B00000000000000000000000000000000000BB :1085C00000000000000000000000000000000000AB :1085D000000000000000000000000000000000009B :1085E000000000000000000000000000000000008B :1085F000000000000000000000000000000000007B :10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A :10863000000000000000000000000000000000003A :10864000000000000000000000000000000000002A :10865000000000000000000000000000000000001A :10866000000000000000000000000000000000000A :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA :1086B00000000000000000000000000000000000BA :1086C00000000000000000000000000000000000AA :1086D000000000000000000000000000000000009A :1086E000000000000000000000000000000000008A :1086F000000000000000000000000000000000007A :108700000000000000000000000000000000000069 :108710000000000000000000000000000000000059 :108720000000000000000000000000000000000049 :108730000000000000000000000000000000000039 :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 :108760000000000000000000000000000000000009 :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 :1087900000000000000000000000000000000000D9 :1087A00000000000000000000000000000000000C9 :1087B00000000000000000000000000000000000B9 :1087C00000000000000000000000000000000000A9 :1087D0000000000000000000000000000000000099 :1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 :108830000000000000000000000000000000000038 :108840000000000000000000000000000000000028 :108850000000000000000000000000000000000018 :108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 :1088800000000000000000000000000000000000E8 :1088900000000000000000000000000000000000D8 :1088A00000000000000000000000000000000000C8 :1088B00000000000000000000000000000000000B8 :1088C00000000000000000000000000000000000A8 :1088D0000000000000000000000000000000000098 :1088E0000000000000000000000000000000000088 :1088F0000000000000000000000000000000000078 :108900000000000000000000000000000000000067 :108910000000000000000000000000000000000057 :108920000000000000000000000000000000000047 :108930000000000000000000000000000000000037 :108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 :1089700000000000000000000000000000000000F7 :1089800000000000000000000000000000000000E7 :1089900000000000000000000000000000000000D7 :1089A00000000000000000000000000000000000C7 :1089B00000000000000000000000000000000000B7 :1089C00000000000000000000000000000000000A7 :1089D0000000000000000000000000000000000097 :1089E0000000000000000000000000000000000087 :1089F0000000000000000000000000000000000077 :108A00000000000000000000000000000000000066 :108A10000000000000000000000000000000000056 :108A20000000000000000000000000000000000046 :108A30000000000000000000000000000000000036 :108A40000000000000000000000000000000000026 :108A50000000000000000000000000000000000016 :108A60000000000000000000000000000000000006 :108A700000000000000000000000000000000000F6 :108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 :108AA00000000000000000000000000000000000C6 :108AB00000000000000000000000000000000000B6 :108AC00000000000000000000000000000000000A6 :108AD0000000000000000000000000000000000096 :108AE0000000000000000000000000000000000086 :108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 :108B10000000000000000000000000000000000055 :108B20000000000000000000000000000000000045 :108B30000000000000000000000000000000000035 :108B40000000000000000000000000000000000025 :108B50000000000000000000000000000000000015 :108B60000000000000000000000000000000000005 :108B700000000000000000000000000000000000F5 :108B800000000000000000000000000000000000E5 :108B900000000000000000000000000000000000D5 :108BA00000000000000000000000000000000000C5 :108BB00000000000000000000000000000000000B5 :108BC00000000000000000000000000000000000A5 :108BD0000000000000000000000000000000000095 :108BE0000000000000000000000000000000000085 :108BF0000000000000000000000000000000000075 :108C00000000000000000000000000000000000064 :108C10000000000000000000000000000000000054 :108C20000000000000000000000000000000000044 :108C30000000000000000000000000000000000034 :108C40000000000000000000000000000000000024 :108C50000000000000000000000000000000000014 :108C60000000000000000000000000000000000004 :108C700000000000000000000000000000000000F4 :108C800000000000000000000000000000000000E4 :108C900000000000000000000000000000000000D4 :108CA00000000000000000000000000000000000C4 :108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 :108CD0000000000000000000000000000000000094 :108CE0000000000000000000000000000000000084 :108CF0000000000000000000000000000000000074 :108D00000000000000000000000000000000000063 :108D10000000000000000000000000000000000053 :108D20000000000000000000000000000000000043 :108D30000000000000000000000000000000000033 :108D40000000000000000000000000000000000023 :108D50000000000000000000000000000000000013 :108D60000000000000000000000000000000000003 :108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 :108D900000000000000000000000000000000000D3 :108DA00000000000000000000000000000000000C3 :108DB00000000000000000000000000000000000B3 :108DC00000000000000000000000000000000000A3 :108DD0000000000000000000000000000000000093 :108DE0000000000000000000000000000000000083 :108DF0000000000000000000000000000000000073 :108E00000000000000000000000000000000000062 :108E10000000000000000000000000000000000052 :108E20000000000000000000000000000000000042 :108E30000000000000000000000000000000000032 :108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 :108E700000000000000000000000000000000000F2 :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 :108EA00000000000000000000000000000000000C2 :108EB00000000000000000000000000000000000B2 :108EC00000000000000000000000000000000000A2 :108ED0000000000000000000000000000000000092 :108EE0000000000000000000000000000000000082 :108EF0000000000000000000000000000000000072 :108F00000000000000000000000000000000000061 :108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 :108F30000000000000000000000000000000000031 :108F40000000000000000000000000000000000021 :108F50000000000000000000000000000000000011 :108F60000000000000000000000000000000000001 :108F700000000000000000000000000000000000F1 :108F800000000000000000000000000000000000E1 :108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 :108FB00000000000000000000000000000000000B1 :108FC00000000000000000000000000000000000A1 :108FD0000000000000000000000000000000000091 :108FE0000000000000000000000000000000000081 :108FF0000000000000000000000000000000000071 :109000000000000000000000000000000000000060 :109010000000000000000000000000000000000050 :109020000000000000000000000000000000000040 :109030000000000000000000000000000000000030 :109040000000000000000000000000000000000020 :109050000000000000000000000000000000000010 :109060000000000000000000000000000000000000 :1090700000000000000000000000000000000000F0 :1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 :1090A00000000000000000000000000000000000C0 :1090B00000000000000000000000000000000000B0 :1090C00000000000000000000000000000000000A0 :1090D0000000000000000000000000000000000090 :1090E0000000000000000000000000000000000080 :1090F0000000000000000000000000000000000070 :10910000000000000000000000000000000000005F :10911000000000000000000000000000000000004F :10912000000000000000000000000000000000003F :10913000000000000000000000000000000000002F :10914000000000000000000000000000000000001F :10915000000000000000000000000000000000000F :1091600000000000000000000000000000000000FF :1091700000000000000000000000000000000000EF :1091800000000000000000000000000000000000DF :1091900000000000000000000000000000000000CF :1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF :1091C000000000000000000000000000000000009F :1091D000000000000000000000000000000000008F :1091E000000000000000000000000000000000007F :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E :10921000000000000000000000000000000000004E :10922000000000000000000000000000000000003E :10923000000000000000000000000000000000002E :10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E :1092600000000000000000000000000000000000FE :1092700000000000000000000000000000000000EE :1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E :1092D000000000000000000000000000000000008E :1092E000000000000000000000000000000000007E :1092F000000000000000000000000000000000006E :10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D :10933000000000000000000000000000000000002D :10934000000000000000000000000000000000001D :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED :1093800000000000000000000000000000000000DD :1093900000000000000000000000000000000000CD :1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD :1093C000000000000000000000000000000000009D :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D :1093F000000000000000000000000000000000006D :10940000000000000000000000000000000000005C :10941000000000000000000000000000000000004C :10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C :10945000000000000000000000000000000000000C :1094600000000000000000000000000000000000FC :1094700000000000000000000000000000000000EC :1094800000000000000000000000000000000000DC :1094900000000000000000000000000000000000CC :1094A00000000000000000000000000000000000BC :1094B00000000000000000000000000000000000AC :1094C000000000000000000000000000000000009C :1094D000000000000000000000000000000000008C :1094E000000000000000000000000000000000007C :1094F000000000000000000000000000000000006C :10950000000000000000000000000000000000005B :10951000000000000000000000000000000000004B :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB :1095800000000000000000000000000000000000DB :1095900000000000000000000000000000000000CB :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B :1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B :10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A :1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA :1096800000000000000000000000000000000000DA :1096900000000000000000000000000000000000CA :1096A00000000000000000000000000000000000BA :1096B00000000000000000000000000000000000AA :1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A :1096F000000000000000000000000000000000006A :109700000000000000000000000000000000000059 :109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 :109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 :109810000000000000000000000000000000000048 :109820000000000000000000000000000000000038 :109830000000000000000000000000000000000028 :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 :1098800000000000000000000000000000000000D8 :1098900000000000000000000000000000000000C8 :1098A00000000000000000000000000000000000B8 :1098B00000000000000000000000000000000000A8 :1098C0000000000000000000000000000000000098 :1098D0000000000000000000000000000000000088 :1098E0000000000000000000000000000000000078 :1098F0000000000000000000000000000000000068 :109900000000000000000000000000000000000057 :109910000000000000000000000000000000000047 :109920000000000000000000000000000000000037 :109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 :1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 :109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 :109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 :109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 :109A900000000000000000000000000000000000C6 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 :109B900000000000000000000000000000000000C5 :109BA00000000000000000000000000000000000B5 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 :109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 :109C10000000000000000000000000000000000044 :109C20000000000000000000000000000000000034 :109C30000000000000000000000000000000000024 :109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 :109C900000000000000000000000000000000000C4 :109CA00000000000000000000000000000000000B4 :109CB00000000000000000000000000000000000A4 :109CC0000000000000000000000000000000000094 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 :109D00000000000000000000000000000000000053 :109D10000000000000000000000000000000000043 :109D20000000000000000000000000000000000033 :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 :109D600000000000000000000000000000000000F3 :109D700000000000000000000000000000000000E3 :109D800000000000000000000000000000000000D3 :109D900000000000000000000000000000000000C3 :109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 :109DD0000000000000000000000000000000000083 :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 :109E20000000000000000000000000000000000032 :109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 :109E600000000000000000000000000000000000F2 :109E700000000000000000000000000000000000E2 :109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 :109EA00000000000000000000000000000000000B2 :109EB00000000000000000000000000000000000A2 :109EC0000000000000000000000000000000000092 :109ED0000000000000000000000000000000000082 :109EE0000000000000000000000000000000000072 :109EF0000000000000000000000000000000000062 :109F00000000000000000000000000000000000051 :109F10000000000000000000000000000000000041 :109F20000000000000000000000000000000000031 :109F30000000000000000000000000000000000021 :109F40000000000000000000000000000000000011 :109F50000000000000000000000000000000000001 :109F600000000000000000000000000000000000F1 :109F700000000000000000000000000000000000E1 :109F800000000000000000000000000000000000D1 :109F900000000000000000000000000000000000C1 :109FA00000000000000000000000000000000000B1 :109FB00000000000000000000000000000000000A1 :109FC0000000000000000000000000000000000091 :109FD0000000000000000000000000000000000081 :109FE0000000000000000000000000000000000071 :109FF0000000000000000000000000000000000061 :10A000000000000000000000000000000000000050 :10A010000000000000000000000000000000000040 :10A020000000000000000000000000000000000030 :10A030000000000000000000000000000000000020 :10A040000000000000000000000000000000000010 :10A050000000000000000000000000000000000000 :10A0600000000000000000000000000000000000F0 :10A0700000000000000000000000000000000000E0 :10A0800000000000000000000000000000000000D0 :10A0900000000000000000000000000000000000C0 :10A0A00000000000000000000000000000000000B0 :10A0B00000000000000000000000000000000000A0 :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 :10A0E0000000000000000000000000000000000070 :10A0F0000000000000000000000000000000000060 :10A10000000000000000000000000000000000004F :10A11000000000000000000000000000000000003F :10A12000000000000000000000000000000000002F :10A13000000000000000000000000000000000001F :10A14000000000000000000000000000000000000F :10A1500000000000000000000000000000000000FF :10A1600000000000000000000000000000000000EF :10A1700000000000000000000000000000000000DF :10A1800000000000000000000000000000000000CF :10A1900000000000000000000000000000000000BF :10A1A00000000000000000000000000000000000AF :10A1B000000000000000000000000000000000009F :10A1C000000000000000000000000000000000008F :10A1D000000000000000000000000000000000007F :10A1E000000000000000000000000000000000006F :10A1F000000000000000000000000000000000005F :10A20000000000000000000000000000000000004E :10A21000000000000000000000000000000000003E :10A22000000000000000000000000000000000002E :10A23000000000000000000000000000000000001E :10A24000000000000000000000000000000000000E :10A2500000000000000000000000000000000000FE :10A2600000000000000000000000000000000000EE :10A2700000000000000000000000000000000000DE :10A2800000000000000000000000000000000000CE :10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE :10A2B000000000000000000000000000000000009E :10A2C000000000000000000000000000000000008E :10A2D000000000000000000000000000000000007E :10A2E000000000000000000000000000000000006E :10A2F000000000000000000000000000000000005E :10A30000000000000000000000000000000000004D :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D :10A33000000000000000000000000000000000001D :10A34000000000000000000000000000000000000D :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED :10A3700000000000000000000000000000000000DD :10A3800000000000000000000000000000000000CD :10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD :10A3B000000000000000000000000000000000009D :10A3C000000000000000000000000000000000008D :10A3D000000000000000000000000000000000007D :10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D :10A40000000000000000000000000000000000004C :10A41000000000000000000000000000000000003C :10A42000000000000000000000000000000000002C :10A43000000000000000000000000000000000001C :10A44000000000000000000000000000000000000C :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC :10A4800000000000000000000000000000000000CC :10A4900000000000000000000000000000000000BC :10A4A00000000000000000000000000000000000AC :10A4B000000000000000000000000000000000009C :10A4C000000000000000000000000000000000008C :10A4D000000000000000000000000000000000007C :10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C :10A50000000000000000000000000000000000004B :10A51000000000000000000000000000000000003B :10A52000000000000000000000000000000000002B :10A53000000000000000000000000000000000001B :10A54000000000000000000000000000000000000B :10A5500000000000000000000000000000000000FB :10A5600000000000000000000000000000000000EB :10A5700000000000000000000000000000000000DB :10A5800000000000000000000000000000000000CB :10A5900000000000000000000000000000000000BB :10A5A00000000000000000000000000000000000AB :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B :10A5D000000000000000000000000000000000007B :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A :10A61000000000000000000000000000000000003A :10A62000000000000000000000000000000000002A :10A63000000000000000000000000000000000001A :10A64000000000000000000000000000000000000A :10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA :10A6800000000000000000000000000000000000CA :10A6900000000000000000000000000000000000BA :10A6A00000000000000000000000000000000000AA :10A6B000000000000000000000000000000000009A :10A6C000000000000000000000000000000000008A :10A6D000000000000000000000000000000000007A :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A :10A700000000000000000000000000000000000049 :10A710000000000000000000000000000000000039 :10A720000000000000000000000000000000000029 :10A730000000000000000000000000000000000019 :10A740000000000000000000000000000000000009 :10A7500000000000000000000000000000000000F9 :10A7600000000000000000000000000000000000E9 :10A7700000000000000000000000000000000000D9 :10A7800000000000000000000000000000000000C9 :10A7900000000000000000000000000000000000B9 :10A7A00000000000000000000000000000000000A9 :10A7B0000000000000000000000000000000000099 :10A7C0000000000000000000000000000000000089 :10A7D0000000000000000000000000000000000079 :10A7E0000000000000000000000000000000000069 :10A7F0000000000000000000000000000000000059 :10A800000000000000000000000000000000000048 :10A810000000000000000000000000000000000038 :10A820000000000000000000000000000000000028 :10A830000000000000000000000000000000000018 :10A840000000000000000000000000000000000008 :10A8500000000000000000000000000000000000F8 :10A8600000000000000000000000000000000000E8 :10A8700000000000000000000000000000000000D8 :10A8800000000000000000000000000000000000C8 :10A8900000000000000000000000000000000000B8 :10A8A00000000000000000000000000000000000A8 :10A8B0000000000000000000000000000000000098 :10A8C0000000000000000000000000000000000088 :10A8D0000000000000000000000000000000000078 :10A8E0000000000000000000000000000000000068 :10A8F0000000000000000000000000000000000058 :10A900000000000000000000000000000000000047 :10A910000000000000000000000000000000000037 :10A920000000000000000000000000000000000027 :10A930000000000000000000000000000000000017 :10A940000000000000000000000000000000000007 :10A9500000000000000000000000000000000000F7 :10A9600000000000000000000000000000000000E7 :10A9700000000000000000000000000000000000D7 :10A9800000000000000000000000000000000000C7 :10A9900000000000000000000000000000000000B7 :10A9A00000000000000000000000000000000000A7 :10A9B0000000000000000000000000000000000097 :10A9C0000000000000000000000000000000000087 :10A9D0000000000000000000000000000000000077 :10A9E0000000000000000000000000000000000067 :10A9F0000000000000000000000000000000000057 :10AA00000000000000000000000000000000000046 :10AA10000000000000000000000000000000000036 :10AA20000000000000000000000000000000000026 :10AA30000000000000000000000000000000000016 :10AA40000000000000000000000000000000000006 :10AA500000000000000000000000000000000000F6 :10AA600000000000000000000000000000000000E6 :10AA700000000000000000000000000000000000D6 :10AA800000000000000000000000000000000000C6 :10AA900000000000000000000000000000000000B6 :10AAA00000000000000000000000000000000000A6 :10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 :10AAD0000000000000000000000000000000000076 :10AAE0000000000000000000000000000000000066 :10AAF0000000000000000000000000000000000056 :10AB00000000000000000000000000000000000045 :10AB10000000000000000000000000000000000035 :10AB20000000000000000000000000000000000025 :10AB30000000000000000000000000000000000015 :10AB40000000000000000000000000000000000005 :10AB500000000000000000000000000000000000F5 :10AB600000000000000000000000000000000000E5 :10AB700000000000000000000000000000000000D5 :10AB800000000000000000000000000000000000C5 :10AB900000000000000000000000000000000000B5 :10ABA00000000000000000000000000000000000A5 :10ABB0000000000000000000000000000000000095 :10ABC0000000000000000000000000000000000085 :10ABD0000000000000000000000000000000000075 :10ABE0000000000000000000000000000000000065 :10ABF0000000000000000000000000000000000055 :10AC00000000000000000000000000000000000044 :10AC10000000000000000000000000000000000034 :10AC20000000000000000000000000000000000024 :10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 :10AC500000000000000000000000000000000000F4 :10AC600000000000000000000000000000000000E4 :10AC700000000000000000000000000000000000D4 :10AC800000000000000000000000000000000000C4 :10AC900000000000000000000000000000000000B4 :10ACA00000000000000000000000000000000000A4 :10ACB0000000000000000000000000000000000094 :10ACC0000000000000000000000000000000000084 :10ACD0000000000000000000000000000000000074 :10ACE0000000000000000000000000000000000064 :10ACF0000000000000000000000000000000000054 :10AD00000000000000000000000000000000000043 :10AD10000000000000000000000000000000000033 :10AD20000000000000000000000000000000000023 :10AD30000000000000000000000000000000000013 :10AD40000000000000000000000000000000000003 :10AD500000000000000000000000000000000000F3 :10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 :10AD800000000000000000000000000000000000C3 :10AD900000000000000000000000000000000000B3 :10ADA00000000000000000000000000000000000A3 :10ADB0000000000000000000000000000000000093 :10ADC0000000000000000000000000000000000083 :10ADD0000000000000000000000000000000000073 :10ADE0000000000000000000000000000000000063 :10ADF0000000000000000000000000000000000053 :10AE00000000000000000000000000000000000042 :10AE10000000000000000000000000000000000032 :10AE20000000000000000000000000000000000022 :10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 :10AE700000000000000000000000000000000000D2 :10AE800000000000000000000000000000000000C2 :10AE900000000000000000000000000000000000B2 :10AEA00000000000000000000000000000000000A2 :10AEB0000000000000000000000000000000000092 :10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 :10AF00000000000000000000000000000000000041 :10AF10000000000000000000000000000000000031 :10AF20000000000000000000000000000000000021 :10AF30000000000000000000000000000000000011 :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 :10AF600000000000000000000000000000000000E1 :10AF700000000000000000000000000000000000D1 :10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 :10AFA00000000000000000000000000000000000A1 :10AFB0000000000000000000000000000000000091 :10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 :10AFE0000000000000000000000000000000000061 :10AFF0000000000000000000000000000000000051 :10B000000000000000000000000000000000000040 :10B010000000000000000000000000000000000030 :10B020000000000000000000000000000000000020 :10B030000000000000000000000000000000000010 :10B040000000000000000000000000000000000000 :10B0500000000000000000000000000000000000F0 :10B0600000000000000000000000000000000000E0 :10B0700000000000000000000000000000000000D0 :10B0800000000000000000000000000000000000C0 :10B0900000000000000000000000000000000000B0 :10B0A00000000000000000000000000000000000A0 :10B0B0000000000000000000000000000000000090 :10B0C0000000000000000000000000000000000080 :10B0D0000000000000000000000000000000000070 :10B0E0000000000000000000000000000000000060 :10B0F0000000000000000000000000000000000050 :10B10000000000000000000000000000000000003F :10B11000000000000000000000000000000000002F :10B12000000000000000000000000000000000001F :10B13000000000000000000000000000000000000F :10B1400000000000000000000000000000000000FF :10B1500000000000000000000000000000000000EF :10B1600000000000000000000000000000000000DF :10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF :10B1900000000000000000000000000000000000AF :10B1A000000000000000000000000000000000009F :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F :10B1E000000000000000000000000000000000005F :10B1F000000000000000000000000000000000004F :10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E :10B22000000000000000000000000000000000001E :10B23000000000000000000000000000000000000E :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE :10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E :10B2B000000000000000000000000000000000008E :10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E :10B2F000000000000000000000000000000000004E :10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D :10B32000000000000000000000000000000000001D :10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD :10B3500000000000000000000000000000000000ED :10B3600000000000000000000000000000000000DD :10B3700000000000000000000000000000000000CD :10B3800000000000000000000000000000000000BD :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D :10B3B000000000000000000000000000000000008D :10B3C000000000000000000000000000000000007D :10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D :10B3F000000000000000000000000000000000004D :10B40000000000000000000000000000000000003C :10B41000000000000000000000000000000000002C :10B42000000000000000000000000000000000001C :10B43000000000000000000000000000000000000C :10B4400000000000000000000000000000000000FC :10B4500000000000000000000000000000000000EC :10B4600000000000000000000000000000000000DC :10B4700000000000000000000000000000000000CC :10B4800000000000000000000000000000000000BC :10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C :10B4C000000000000000000000000000000000007C :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C :10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B :10B53000000000000000000000000000000000000B :10B5400000000000000000000000000000000000FB :10B5500000000000000000000000000000000000EB :10B5600000000000000000000000000000000000DB :10B5700000000000000000000000000000000000CB :10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB :10B5A000000000000000000000000000000000009B :10B5B000000000000000000000000000000000008B :10B5C000000000000000000000000000000000007B :10B5D000000000000000000000000000000000006B :10B5E000000000000000000000000000000000005B :10B5F000000000000000000000000000000000004B :10B60000000000000000000000000000000000003A :10B61000000000000000000000000000000000002A :10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A :10B6400000000000000000000000000000000000FA :10B6500000000000000000000000000000000000EA :10B6600000000000000000000000000000000000DA :10B6700000000000000000000000000000000000CA :10B6800000000000000000000000000000000000BA :10B6900000000000000000000000000000000000AA :10B6A000000000000000000000000000000000009A :10B6B000000000000000000000000000000000008A :10B6C000000000000000000000000000000000007A :10B6D000000000000000000000000000000000006A :10B6E000000000000000000000000000000000005A :10B6F000000000000000000000000000000000004A :10B700000000000000000000000000000000000039 :10B710000000000000000000000000000000000029 :10B720000000000000000000000000000000000019 :10B730000000000000000000000000000000000009 :10B7400000000000000000000000000000000000F9 :10B7500000000000000000000000000000000000E9 :10B7600000000000000000000000000000000000D9 :10B7700000000000000000000000000000000000C9 :10B7800000000000000000000000000000000000B9 :10B7900000000000000000000000000000000000A9 :10B7A0000000000000000000000000000000000099 :10B7B0000000000000000000000000000000000089 :10B7C0000000000000000000000000000000000079 :10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 :10B7F0000000000000000000000000000000000049 :10B800000000000000000000000000000000000038 :10B810000000000000000000000000000000000028 :10B820000000000000000000000000000000000018 :10B830000000000000000000000000000000000008 :10B8400000000000000000000000000000000000F8 :10B8500000000000000000000000000000000000E8 :10B8600000000000000000000000000000000000D8 :10B8700000000000000000000000000000000000C8 :10B8800000000000000000000000000000000000B8 :10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 :10B8B0000000000000000000000000000000000088 :10B8C0000000000000000000000000000000000078 :10B8D0000000000000000000000000000000000068 :10B8E0000000000000000000000000000000000058 :10B8F0000000000000000000000000000000000048 :10B900000000000000000000000000000000000037 :10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 :10B9400000000000000000000000000000000000F7 :10B9500000000000000000000000000000000000E7 :10B9600000000000000000000000000000000000D7 :10B9700000000000000000000000000000000000C7 :10B9800000000000000000000000000000000000B7 :10B9900000000000000000000000000000000000A7 :10B9A0000000000000000000000000000000000097 :10B9B0000000000000000000000000000000000087 :10B9C0000000000000000000000000000000000077 :10B9D0000000000000000000000000000000000067 :10B9E0000000000000000000000000000000000057 :10B9F0000000000000000000000000000000000047 :10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 :10BA30000000000000000000000000000000000006 :10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 :10BA600000000000000000000000000000000000D6 :10BA700000000000000000000000000000000000C6 :10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 :10BAA0000000000000000000000000000000000096 :10BAB0000000000000000000000000000000000086 :10BAC0000000000000000000000000000000000076 :10BAD0000000000000000000000000000000000066 :10BAE0000000000000000000000000000000000056 :10BAF0000000000000000000000000000000000046 :10BB00000000000000000000000000000000000035 :10BB10000000000000000000000000000000000025 :10BB20000000000000000000000000000000000015 :10BB30000000000000000000000000000000000005 :10BB400000000000000000000000000000000000F5 :10BB500000000000000000000000000000000000E5 :10BB600000000000000000000000000000000000D5 :10BB700000000000000000000000000000000000C5 :10BB800000000000000000000000000000000000B5 :10BB900000000000000000000000000000000000A5 :10BBA0000000000000000000000000000000000095 :10BBB0000000000000000000000000000000000085 :10BBC0000000000000000000000000000000000075 :10BBD0000000000000000000000000000000000065 :10BBE0000000000000000000000000000000000055 :10BBF0000000000000000000000000000000000045 :10BC00000000000000000000000000000000000034 :10BC10000000000000000000000000000000000024 :10BC20000000000000000000000000000000000014 :10BC30000000000000000000000000000000000004 :10BC400000000000000000000000000000000000F4 :10BC500000000000000000000000000000000000E4 :10BC600000000000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 :10BC800000000000000000000000000000000000B4 :10BC900000000000000000000000000000000000A4 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 :10BCD0000000000000000000000000000000000064 :10BCE0000000000000000000000000000000000054 :10BCF0000000000000000000000000000000000044 :10BD00000000000000000000000000000000000033 :10BD10000000000000000000000000000000000023 :10BD20000000000000000000000000000000000013 :10BD30000000000000000000000000000000000003 :10BD400000000000000000000000000000000000F3 :10BD500000000000000000000000000000000000E3 :10BD600000000000000000000000000000000000D3 :10BD700000000000000000000000000000000000C3 :10BD800000000000000000000000000000000000B3 :10BD900000000000000000000000000000000000A3 :10BDA0000000000000000000000000000000000093 :10BDB0000000000000000000000000000000000083 :10BDC0000000000000000000000000000000000073 :10BDD0000000000000000000000000000000000063 :10BDE0000000000000000000000000000000000053 :10BDF0000000000000000000000000000000000043 :10BE00000000000000000000000000000000000032 :10BE10000000000000000000000000000000000022 :10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 :10BE400000000000000000000000000000000000F2 :10BE500000000000000000000000000000000000E2 :10BE600000000000000000000000000000000000D2 :10BE700000000000000000000000000000000000C2 :10BE800000000000000000000000000000000000B2 :10BE900000000000000000000000000000000000A2 :10BEA0000000000000000000000000000000000092 :10BEB0000000000000000000000000000000000082 :10BEC0000000000000000000000000000000000072 :10BED0000000000000000000000000000000000062 :10BEE0000000000000000000000000000000000052 :10BEF0000000000000000000000000000000000042 :10BF00000000000000000000000000000000000031 :10BF10000000000000000000000000000000000021 :10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 :10BF400000000000000000000000000000000000F1 :10BF500000000000000000000000000000000000E1 :10BF600000000000000000000000000000000000D1 :10BF700000000000000000000000000000000000C1 :10BF800000000000000000000000000000000000B1 :10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 :10BFB0000000000000000000000000000000000081 :10BFC0000000000000000000000000000000000071 :10BFD0000000000000000000000000000000000061 :10BFE0000000000000000000000000000000000051 :10BFF0000000000000000000000000000000000041 :10C000000000000000000000000000000000000030 :10C010000000000000000000000000000000000020 :10C020000000000000000000000000000000000010 :10C030000000000000000000000000000000000000 :10C0400000000000000000000000000000000000F0 :10C0500000000000000000000000000000000000E0 :10C0600000000000000000000000000000000000D0 :10C0700000000000000000000000000000000000C0 :10C0800000000000000000000000000000000000B0 :10C0900000000000000000000000000000000000A0 :10C0A0000000000000000000000000000000000090 :10C0B0000000000000000000000000000000000080 :10C0C0000000000000000000000000000000000070 :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 :10C0F0000000000000000000000000000000000040 :10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F :10C1300000000000000000000000000000000000FF :10C1400000000000000000000000000000000000EF :10C1500000000000000000000000000000000000DF :10C1600000000000000000000000000000000000CF :10C1700000000000000000000000000000000000BF :10C1800000000000000000000000000000000000AF :10C19000000000000000000000000000000000009F :10C1A000000000000000000000000000000000008F :10C1B000000000000000000000000000000000007F :10C1C000000000000000000000000000000000006F :10C1D000000000000000000000000000000000005F :10C1E000000000000000000000000000000000004F :10C1F000000000000000000000000000000000003F :10C20000000000000000000000000000000000002E :10C21000000000000000000000000000000000001E :10C22000000000000000000000000000000000000E :10C2300000000000000000000000000000000000FE :10C2400000000000000000000000000000000000EE :10C2500000000000000000000000000000000000DE :10C2600000000000000000000000000000000000CE :10C2700000000000000000000000000000000000BE :10C2800000000000000000000000000000000000AE :10C29000000000000000000000000000000000009E :10C2A000000000000000000000000000000000008E :10C2B000000000000000000000000000000000007E :10C2C000000000000000000000000000000000006E :10C2D000000000000000000000000000000000005E :10C2E000000000000000000000000000000000004E :10C2F000000000000000000000000000000000003E :10C30000000000000000000000000000000000002D :10C31000000000000000000000000000000000001D :10C32000000000000000000000000000000000000D :10C3300000000000000000000000000000000000FD :10C3400000000000000000000000000000000000ED :10C3500000000000000000000000000000000000DD :10C3600000000000000000000000000000000000CD :10C3700000000000000000000000000000000000BD :10C3800000000000000000000000000000000000AD :10C39000000000000000000000000000000000009D :10C3A000000000000000000000000000000000008D :10C3B000000000000000000000000000000000007D :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D :10C3F000000000000000000000000000000000003D :10C40000000000000000000000000000000000002C :10C41000000000000000000000000000000000001C :10C42000000000000000000000000000000000000C :10C4300000000000000000000000000000000000FC :10C4400000000000000000000000000000000000EC :10C4500000000000000000000000000000000000DC :10C4600000000000000000000000000000000000CC :10C4700000000000000000000000000000000000BC :10C4800000000000000000000000000000000000AC :10C49000000000000000000000000000000000009C :10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C :10C4C000000000000000000000000000000000006C :10C4D000000000000000000000000000000000005C :10C4E000000000000000000000000000000000004C :10C4F000000000000000000000000000000000003C :10C50000000000000000000000000000000000002B :10C51000000000000000000000000000000000001B :10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB :10C5400000000000000000000000000000000000EB :10C5500000000000000000000000000000000000DB :10C5600000000000000000000000000000000000CB :10C5700000000000000000000000000000000000BB :10C5800000000000000000000000000000000000AB :10C59000000000000000000000000000000000009B :10C5A000000000000000000000000000000000008B :10C5B000000000000000000000000000000000007B :10C5C000000000000000000000000000000000006B :10C5D000000000000000000000000000000000005B :10C5E000000000000000000000000000000000004B :10C5F000000000000000000000000000000000003B :10C60000000000000000000000000000000000002A :10C61000000000000000000000000000000000001A :10C62000000000000000000000000000000000000A :10C6300000000000000000000000000000000000FA :10C6400000000000000000000000000000000000EA :10C6500000000000000000000000000000000000DA :10C6600000000000000000000000000000000000CA :10C6700000000000000000000000000000000000BA :10C6800000000000000000000000000000000000AA :10C69000000000000000000000000000000000009A :10C6A000000000000000000000000000000000008A :10C6B000000000000000000000000000000000007A :10C6C000000000000000000000000000000000006A :10C6D000000000000000000000000000000000005A :10C6E000000000000000000000000000000000004A :10C6F000000000000000000000000000000000003A :10C700000000000000000000000000000000000029 :10C710000000000000000000000000000000000019 :10C720000000000000000000000000000000000009 :10C7300000000000000000000000000000000000F9 :10C7400000000000000000000000000000000000E9 :10C7500000000000000000000000000000000000D9 :10C7600000000000000000000000000000000000C9 :10C7700000000000000000000000000000000000B9 :10C7800000000000000000000000000000000000A9 :10C790000000000000000000000000000000000099 :10C7A0000000000000000000000000000000000089 :10C7B0000000000000000000000000000000000079 :10C7C0000000000000000000000000000000000069 :10C7D0000000000000000000000000000000000059 :10C7E0000000000000000000000000000000000049 :10C7F0000000000000000000000000000000000039 :10C800000000000000000000000000000000000028 :10C810000000000000000000000000000000000018 :10C820000000000000000000000000000000000008 :10C8300000000000000000000000000000000000F8 :10C8400000000000000000000000000000000000E8 :10C8500000000000000000000000000000000000D8 :10C8600000000000000000000000000000000000C8 :10C8700000000000000000000000000000000000B8 :10C8800000000000000000000000000000000000A8 :10C890000000000000000000000000000000000098 :10C8A0000000000000000000000000000000000088 :10C8B0000000000000000000000000000000000078 :10C8C0000000000000000000000000000000000068 :10C8D0000000000000000000000000000000000058 :10C8E0000000000000000000000000000000000048 :10C8F0000000000000000000000000000000000038 :10C900000000000000000000000000000000000027 :10C910000000000000000000000000000000000017 :10C920000000000000000000000000000000000007 :10C9300000000000000000000000000000000000F7 :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 :10C9600000000000000000000000000000000000C7 :10C9700000000000000000000000000000000000B7 :10C9800000000000000000000000000000000000A7 :10C990000000000000000000000000000000000097 :10C9A0000000000000000000000000000000000087 :10C9B0000000000000000000000000000000000077 :10C9C0000000000000000000000000000000000067 :10C9D0000000000000000000000000000000000057 :10C9E0000000000000000000000000000000000047 :10C9F0000000000000000000000000000000000037 :10CA00000000000000000000000000000000000026 :10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000000000000006 :10CA300000000000000000000000000000000000F6 :10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 :10CA600000000000000000000000000000000000C6 :10CA700000000000000000000000000000000000B6 :10CA800000000000000000000000000000000000A6 :10CA90000000000000000000000000000000000096 :10CAA0000000000000000000000000000000000086 :10CAB0000000000000000000000000000000000076 :10CAC0000000000000000000000000000000000066 :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 :10CB00000000000000000000000000000000000025 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 :10CB300000000000000000000000000000000000F5 :10CB400000000000000000000000000000000000E5 :10CB500000000000000000000000000000000000D5 :10CB600000000000000000000000000000000000C5 :10CB700000000000000000000000000000000000B5 :10CB800000000000000000000000000000000000A5 :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 :10CBC0000000000000000000000000000000000065 :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 :10CC00000000000000000000000000000000000024 :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 :10CC300000000000000000000000000000000000F4 :10CC400000000000000000000000000000000000E4 :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000000000B4 :10CC800000000000000000000000000000000000A4 :10CC90000000000000000000000000000000000094 :10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 :10CCC0000000000000000000000000000000000064 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 :10CD00000000000000000000000000000000000023 :10CD10000000000000000000000000000000000013 :10CD20000000000000000000000000000000000003 :10CD300000000000000000000000000000000000F3 :10CD400000000000000000000000000000000000E3 :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 :10CD800000000000000000000000000000000000A3 :10CD90000000000000000000000000000000000093 :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 :10CDC0000000000000000000000000000000000063 :10CDD0000000000000000000000000000000000053 :10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 :10CE00000000000000000000000000000000000022 :10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 :10CE400000000000000000000000000000000000E2 :10CE500000000000000000000000000000000000D2 :10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 :10CE90000000000000000000000000000000000092 :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 :10CED0000000000000000000000000000000000052 :10CEE0000000000000000000000000000000000042 :10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 :10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 :10CF600000000000000000000000000000000000C1 :10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 :10CF90000000000000000000000000000000000091 :10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 :10CFC0000000000000000000000000000000000061 :10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 :10D010000000000000000000000000000000000010 :10D020000000000000000000000000000000000000 :10D0300000000000000000000000000000000000F0 :10D0400000000000000000000000000000000000E0 :10D0500000000000000000000000000000000000D0 :10D0600000000000000000000000000000000000C0 :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 :10D0B0000000000000000000000000000000000070 :10D0C0000000000000000000000000000000000060 :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F :10D1200000000000000000000000000000000000FF :10D1300000000000000000000000000000000000EF :10D1400000000000000000000000000000000000DF :10D1500000000000000000000000000000000000CF :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F :10D19000000000000000000000000000000000008F :10D1A000000000000000000000000000000000007F :10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F :10D1D000000000000000000000000000000000004F :10D1E000000000000000000000000000000000003F :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E :10D2200000000000000000000000000000000000FE :10D2300000000000000000000000000000000000EE :10D2400000000000000000000000000000000000DE :10D2500000000000000000000000000000000000CE :10D2600000000000000000000000000000000000BE :10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E :10D29000000000000000000000000000000000008E :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E :10D2C000000000000000000000000000000000005E :10D2D000000000000000000000000000000000004E :10D2E000000000000000000000000000000000003E :10D2F000000000000000000000000000000000002E :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D :10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD :10D3500000000000000000000000000000000000CD :10D3600000000000000000000000000000000000BD :10D3700000000000000000000000000000000000AD :10D38000000000000000000000000000000000009D :10D39000000000000000000000000000000000008D :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D :10D3D000000000000000000000000000000000004D :10D3E000000000000000000000000000000000003D :10D3F000000000000000000000000000000000002D :10D40000000000000000000000000000000000001C :10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC :10D4300000000000000000000000000000000000EC :10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC :10D4700000000000000000000000000000000000AC :10D48000000000000000000000000000000000009C :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C :10D4D000000000000000000000000000000000004C :10D4E000000000000000000000000000000000003C :10D4F000000000000000000000000000000000002C :10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB :10D5500000000000000000000000000000000000CB :10D5600000000000000000000000000000000000BB :10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B :10D59000000000000000000000000000000000008B :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B :10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B :10D60000000000000000000000000000000000001A :10D61000000000000000000000000000000000000A :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA :10D6700000000000000000000000000000000000AA :10D68000000000000000000000000000000000009A :10D69000000000000000000000000000000000008A :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A :10D6D000000000000000000000000000000000004A :10D6E000000000000000000000000000000000003A :10D6F000000000000000000000000000000000002A :10D700000000000000000000000000000000000019 :10D710000000000000000000000000000000000009 :10D7200000000000000000000000000000000000F9 :10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 :10D7F0000000000000000000000000000000000029 :10D800000000000000000000000000000000000018 :10D810000000000000000000000000000000000008 :10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 :10D8600000000000000000000000000000000000B8 :10D8700000000000000000000000000000000000A8 :10D880000000000000000000000000000000000098 :10D890000000000000000000000000000000000088 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 :10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 :10D8E0000000000000000000000000000000000038 :10D8F0000000000000000000000000000000000028 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 :10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 :10D9400000000000000000000000000000000000D7 :10D9500000000000000000000000000000000000C7 :10D9600000000000000000000000000000000000B7 :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 :10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 :10D9E0000000000000000000000000000000000037 :10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 :10DA200000000000000000000000000000000000F6 :10DA300000000000000000000000000000000000E6 :10DA400000000000000000000000000000000000D6 :10DA500000000000000000000000000000000000C6 :10DA600000000000000000000000000000000000B6 :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 :10DAA0000000000000000000000000000000000076 :10DAB0000000000000000000000000000000000066 :10DAC0000000000000000000000000000000000056 :10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 :10DAF0000000000000000000000000000000000026 :10DB00000000000000000000000000000000000015 :10DB10000000000000000000000000000000000005 :10DB200000000000000000000000000000000000F5 :10DB300000000000000000000000000000000000E5 :10DB400000000000000000000000000000000000D5 :10DB500000000000000000000000000000000000C5 :10DB600000000000000000000000000000000000B5 :10DB700000000000000000000000000000000000A5 :10DB80000000000000000000000000000000000095 :10DB90000000000000000000000000000000000085 :10DBA0000000000000000000000000000000000075 :10DBB0000000000000000000000000000000000065 :10DBC0000000000000000000000000000000000055 :10DBD0000000000000000000000000000000000045 :10DBE0000000000000000000000000000000000035 :10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 :10DC200000000000000000000000000000000000F4 :10DC300000000000000000000000000000000000E4 :10DC400000000000000000000000000000000000D4 :10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 :10DC700000000000000000000000000000000000A4 :10DC80000000000000000000000000000000000094 :10DC90000000000000000000000000000000000084 :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 :10DCC0000000000000000000000000000000000054 :10DCD0000000000000000000000000000000000044 :10DCE0000000000000000000000000000000000034 :10DCF0000000000000000000000000000000000024 :10DD00000000000000000000000000000000000013 :10DD10000000000000000000000000000000000003 :10DD200000000000000000000000000000000000F3 :10DD300000000000000000000000000000000000E3 :10DD400000000000000000000000000000000000D3 :10DD500000000000000000000000000000000000C3 :10DD600000000000000000000000000000000000B3 :10DD700000000000000000000000000000000000A3 :10DD80000000000000000000000000000000000093 :10DD90000000000000000000000000000000000083 :10DDA0000000000000000000000000000000000073 :10DDB0000000000000000000000000000000000063 :10DDC0000000000000000000000000000000000053 :10DDD0000000000000000000000000000000000043 :10DDE0000000000000000000000000000000000033 :10DDF0000000000000000000000000000000000023 :10DE00000000000000000000000000000000000012 :10DE10000000000000000000000000000000000002 :10DE200000000000000000000000000000000000F2 :10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 :10DE500000000000000000000000000000000000C2 :10DE600000000000000000000000000000000000B2 :10DE700000000000000000000000000000000000A2 :10DE80000000000000000000000000000000000092 :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 :10DEC0000000000000000000000000000000000052 :10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 :10DF00000000000000000000000000000000000011 :10DF10000000000000000000000000000000000001 :10DF200000000000000000000000000000000000F1 :10DF300000000000000000000000000000000000E1 :10DF400000000000000000000000000000000000D1 :10DF500000000000000000000000000000000000C1 :10DF600000000000000000000000000000000000B1 :10DF700000000000000000000000000000000000A1 :10DF80000000000000000000000000000000000091 :10DF90000000000000000000000000000000000081 :10DFA0000000000000000000000000000000000071 :10DFB0000000000000000000000000000000000061 :10DFC0000000000000000000000000000000000051 :10DFD0000000000000000000000000000000000041 :10DFE0000000000000000000000000000000000031 :10DFF0000000000000000000000000000000000021 :10E000000000000000000000000000000000000010 :10E010000000000000000000000000000000000000 :10E0200000000000000000000000000000000000F0 :10E0300000000000000000000000000000000000E0 :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 :10E0600000000000000000000000000000000000B0 :10E0700000000000000000000000000000000000A0 :10E080000000000000000000000000000000000090 :10E090000000000000000000000000000000000080 :10E0A0000000000000000000000000000000000070 :10E0B0000000000000000000000000000000000060 :10E0C0000000000000000000000000000000000050 :10E0D0000000000000000000000000000000000040 :10E0E0000000000000000000000000000000000030 :10E0F0000000000000000000000000000000000020 :10E10000000000000000000000000000000000000F :10E1100000000000000000000000000000000000FF :10E1200000000000000000000000000000000000EF :10E1300000000000000000000000000000000000DF :10E1400000000000000000000000000000000000CF :10E1500000000000000000000000000000000000BF :10E1600000000000000000000000000000000000AF :10E17000000000000000000000000000000000009F :10E18000000000000000000000000000000000008F :10E19000000000000000000000000000000000007F :10E1A000000000000000000000000000000000006F :10E1B000000000000000000000000000000000005F :10E1C000000000000000000000000000000000004F :10E1D000000000000000000000000000000000003F :10E1E000000000000000000000000000000000002F :10E1F000000000000000000000000000000000001F :10E20000000000000000000000000000000000000E :10E2100000000000000000000000000000000000FE :10E2200000000000000000000000000000000000EE :10E2300000000000000000000000000000000000DE :10E2400000000000000000000000000000000000CE :10E2500000000000000000000000000000000000BE :10E2600000000000000000000000000000000000AE :10E27000000000000000000000000000000000009E :10E28000000000000000000000000000000000008E :10E29000000000000000000000000000000000007E :10E2A000000000000000000000000000000000006E :10E2B000000000000000000000000000000000005E :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E :10E2E000000000000000000000000000000000002E :10E2F000000000000000000000000000000000001E :10E30000000000000000000000000000000000000D :10E3100000000000000000000000000000000000FD :10E3200000000000000000000000000000000000ED :10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD :10E3600000000000000000000000000000000000AD :10E37000000000000000000000000000000000009D :10E38000000000000000000000000000000000008D :10E39000000000000000000000000000000000007D :10E3A000000000000000000000000000000000006D :10E3B000000000000000000000000000000000005D :10E3C000000000000000000000000000000000004D :10E3D000000000000000000000000000000000003D :10E3E000000000000000000000000000000000002D :10E3F000000000000000000000000000000000001D :10E40000000000000000000000000000000000000C :10E4100000000000000000000000000000000000FC :10E4200000000000000000000000000000000000EC :10E4300000000000000000000000000000000000DC :10E4400000000000000000000000000000000000CC :10E4500000000000000000000000000000000000BC :10E4600000000000000000000000000000000000AC :10E47000000000000000000000000000000000009C :10E48000000000000000000000000000000000008C :10E49000000000000000000000000000000000007C :10E4A000000000000000000000000000000000006C :10E4B000000000000000000000000000000000005C :10E4C000000000000000000000000000000000004C :10E4D000000000000000000000000000000000003C :10E4E000000000000000000000000000000000002C :10E4F000000000000000000000000000000000001C :10E50000000000000000000000000000000000000B :10E5100000000000000000000000000000000000FB :10E5200000000000000000000000000000000000EB :10E5300000000000000000000000000000000000DB :10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB :10E5600000000000000000000000000000000000AB :10E57000000000000000000000000000000000009B :10E58000000000000000000000000000000000008B :10E59000000000000000000000000000000000007B :10E5A000000000000000000000000000000000006B :10E5B000000000000000000000000000000000005B :10E5C000000000000000000000000000000000004B :10E5D000000000000000000000000000000000003B :10E5E000000000000000000000000000000000002B :10E5F000000000000000000000000000000000001B :10E60000000000000000000000000000000000000A :10E6100000000000000000000000000000000000FA :10E6200000000000000000000000000000000000EA :10E6300000000000000000000000000000000000DA :10E6400000000000000000000000000000000000CA :10E6500000000000000000000000000000000000BA :10E6600000000000000000000000000000000000AA :10E67000000000000000000000000000000000009A :10E68000000000000000000000000000000000008A :10E69000000000000000000000000000000000007A :10E6A000000000000000000000000000000000006A :10E6B000000000000000000000000000000000005A :10E6C000000000000000000000000000000000004A :10E6D000000000000000000000000000000000003A :10E6E000000000000000000000000000000000002A :10E6F000000000000000000000000000000000001A :10E700000000000000000000000000000000000009 :10E7100000000000000000000000000000000000F9 :10E7200000000000000000000000000000000000E9 :10E7300000000000000000000000000000000000D9 :10E7400000000000000000000000000000000000C9 :10E7500000000000000000000000000000000000B9 :10E7600000000000000000000000000000000000A9 :10E770000000000000000000000000000000000099 :10E780000000000000000000000000000000000089 :10E790000000000000000000000000000000000079 :10E7A0000000000000000000000000000000000069 :10E7B0000000000000000000000000000000000059 :10E7C0000000000000000000000000000000000049 :10E7D0000000000000000000000000000000000039 :10E7E0000000000000000000000000000000000029 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 :10E8100000000000000000000000000000000000F8 :10E8200000000000000000000000000000000000E8 :10E8300000000000000000000000000000000000D8 :10E8400000000000000000000000000000000000C8 :10E8500000000000000000000000000000000000B8 :10E8600000000000000000000000000000000000A8 :10E870000000000000000000000000000000000098 :10E880000000000000000000000000000000000088 :10E890000000000000000000000000000000000078 :10E8A0000000000000000000000000000000000068 :10E8B0000000000000000000000000000000000058 :10E8C0000000000000000000000000000000000048 :10E8D0000000000000000000000000000000000038 :10E8E0000000000000000000000000000000000028 :10E8F0000000000000000000000000000000000018 :10E900000000000000000000000000000000000007 :10E9100000000000000000000000000000000000F7 :10E9200000000000000000000000000000000000E7 :10E9300000000000000000000000000000000000D7 :10E9400000000000000000000000000000000000C7 :10E9500000000000000000000000000000000000B7 :10E9600000000000000000000000000000000000A7 :10E970000000000000000000000000000000000097 :10E980000000000000000000000000000000000087 :10E990000000000000000000000000000000000077 :10E9A0000000000000000000000000000000000067 :10E9B0000000000000000000000000000000000057 :10E9C0000000000000000000000000000000000047 :10E9D0000000000000000000000000000000000037 :10E9E0000000000000000000000000000000000027 :10E9F0000000000000000000000000000000000017 :10EA00000000000000000000000000000000000006 :10EA100000000000000000000000000000000000F6 :10EA200000000000000000000000000000000000E6 :10EA300000000000000000000000000000000000D6 :10EA400000000000000000000000000000000000C6 :10EA500000000000000000000000000000000000B6 :10EA600000000000000000000000000000000000A6 :10EA70000000000000000000000000000000000096 :10EA80000000000000000000000000000000000086 :10EA90000000000000000000000000000000000076 :10EAA0000000000000000000000000000000000066 :10EAB0000000000000000000000000000000000056 :10EAC0000000000000000000000000000000000046 :10EAD0000000000000000000000000000000000036 :10EAE0000000000000000000000000000000000026 :10EAF0000000000000000000000000000000000016 :10EB00000000000000000000000000000000000005 :10EB100000000000000000000000000000000000F5 :10EB200000000000000000000000000000000000E5 :10EB300000000000000000000000000000000000D5 :10EB400000000000000000000000000000000000C5 :10EB500000000000000000000000000000000000B5 :10EB600000000000000000000000000000000000A5 :10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 :10EBB0000000000000000000000000000000000055 :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 :10EBE0000000000000000000000000000000000025 :10EBF0000000000000000000000000000000000015 :10EC00000000000000000000000000000000000004 :10EC100000000000000000000000000000000000F4 :10EC200000000000000000000000000000000000E4 :10EC300000000000000000000000000000000000D4 :10EC400000000000000000000000000000000000C4 :10EC500000000000000000000000000000000000B4 :10EC600000000000000000000000000000000000A4 :10EC70000000000000000000000000000000000094 :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 :10ECB0000000000000000000000000000000000054 :10ECC0000000000000000000000000000000000044 :10ECD0000000000000000000000000000000000034 :10ECE0000000000000000000000000000000000024 :10ECF0000000000000000000000000000000000014 :10ED00000000000000000000000000000000000003 :10ED100000000000000000000000000000000000F3 :10ED200000000000000000000000000000000000E3 :10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 :10ED600000000000000000000000000000000000A3 :10ED70000000000000000000000000000000000093 :10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 :10EDA0000000000000000000000000000000000063 :10EDB0000000000000000000000000000000000053 :10EDC0000000000000000000000000000000000043 :10EDD0000000000000000000000000000000000033 :10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 :10EE00000000000000000000000000000000000002 :10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 :10EE300000000000000000000000000000000000D2 :10EE400000000000000000000000000000000000C2 :10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 :10EE70000000000000000000000000000000000092 :10EE80000000000000000000000000000000000082 :10EE90000000000000000000000000000000000072 :10EEA0000000000000000000000000000000000062 :10EEB0000000000000000000000000000000000052 :10EEC0000000000000000000000000000000000042 :10EED0000000000000000000000000000000000032 :10EEE0000000000000000000000000000000000022 :10EEF0000000000000000000000000000000000012 :10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 :10EF300000000000000000000000000000000000D1 :10EF400000000000000000000000000000000000C1 :10EF500000000000000000000000000000000000B1 :10EF600000000000000000000000000000000000A1 :10EF70000000000000000000000000000000000091 :10EF80000000000000000000000000000000000081 :10EF90000000000000000000000000000000000071 :10EFA0000000000000000000000000000000000061 :10EFB0000000000000000000000000000000000051 :10EFC0000000000000000000000000000000000041 :10EFD0000000000000000000000000000000000031 :10EFE0000000000000000000000000000000000021 :10EFF0000000000000000000000000000000000011 :10F000000000000000000000000000000000000000 :10F0100000000000000000000000000000000000F0 :10F0200000000000000000000000000000000000E0 :10F0300000000000000000000000000000000000D0 :10F0400000000000000000000000000000000000C0 :10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 :10F090000000000000000000000000000000000070 :10F0A0000000000000000000000000000000000060 :10F0B0000000000000000000000000000000000050 :10F0C0000000000000000000000000000000000040 :10F0D0000000000000000000000000000000000030 :10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 :10F1000000000000000000000000000000000000FF :10F1100000000000000000000000000000000000EF :10F1200000000000000000000000000000000000DF :10F1300000000000000000000000000000000000CF :10F1400000000000000000000000000000000000BF :10F1500000000000000000000000000000000000AF :10F16000000000000000000000000000000000009F :10F17000000000000000000000000000000000008F :10F18000000000000000000000000000000000007F :10F19000000000000000000000000000000000006F :10F1A000000000000000000000000000000000005F :10F1B000000000000000000000000000000000004F :10F1C000000000000000000000000000000000003F :10F1D000000000000000000000000000000000002F :10F1E000000000000000000000000000000000001F :10F1F000000000000000000000000000000000000F :10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE :10F2200000000000000000000000000000000000DE :10F2300000000000000000000000000000000000CE :10F2400000000000000000000000000000000000BE :10F2500000000000000000000000000000000000AE :10F26000000000000000000000000000000000009E :10F27000000000000000000000000000000000008E :10F28000000000000000000000000000000000007E :10F29000000000000000000000000000000000006E :10F2A000000000000000000000000000000000005E :10F2B000000000000000000000000000000000004E :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E :10F2F000000000000000000000000000000000000E :10F3000000000000000000000000000000000000FD :10F3100000000000000000000000000000000000ED :10F3200000000000000000000000000000000000DD :10F3300000000000000000000000000000000000CD :10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D :10F38000000000000000000000000000000000007D :10F39000000000000000000000000000000000006D :10F3A000000000000000000000000000000000005D :10F3B000000000000000000000000000000000004D :10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D :10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC :10F4200000000000000000000000000000000000DC :10F4300000000000000000000000000000000000CC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C :10F47000000000000000000000000000000000008C :10F48000000000000000000000000000000000007C :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C :10F4B000000000000000000000000000000000004C :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C :10F4F000000000000000000000000000000000000C :10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB :10F5400000000000000000000000000000000000BB :10F5500000000000000000000000000000000000AB :10F56000000000000000000000000000000000009B :10F57000000000000000000000000000000000008B :10F58000000000000000000000000000000000007B :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B :10F6000000000000000000000000000000000000FA :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A :10F68000000000000000000000000000000000007A :10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A :10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A :10F7000000000000000000000000000000000000F9 :10F7100000000000000000000000000000000000E9 :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 :10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 :10F780000000000000000000000000000000000079 :10F790000000000000000000000000000000000069 :10F7A0000000000000000000000000000000000059 :10F7B0000000000000000000000000000000000049 :10F7C0000000000000000000000000000000000039 :10F7D0000000000000000000000000000000000029 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 :10F8000000000000000000000000000000000000F8 :10F8100000000000000000000000000000000000E8 :10F8200000000000000000000000000000000000D8 :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 :10F880000000000000000000000000000000000078 :10F890000000000000000000000000000000000068 :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 :10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 :10F9000000000000000000000000000000000000F7 :10F9100000000000000000000000000000000000E7 :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 :10F990000000000000000000000000000000000067 :10F9A0000000000000000000000000000000000057 :10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 :10FA100000000000000000000000000000000000E6 :10FA200000000000000000000000000000000000D6 :10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 :10FA70000000000000000000000000000000000086 :10FA80000000000000000000000000000000000076 :10FA90000000000000000000000000000000000066 :10FAA0000000000000000000000000000000000056 :10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 :10FAD0000000000000000000000000000000000026 :10FAE0000000000000000000000000000000000016 :10FAF0000000000000000000000000000000000006 :10FB000000000000000000000000000000000000F5 :10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 :10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 :10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 :10FBE0000000000000000000000000000000000015 :10FBF0000000000000000000000000000000000005 :10FC000000000000000000000000000000000000F4 :10FC100000000000000000000000000000000000E4 :10FC200000000000000000000000000000000000D4 :10FC300000000000000000000000000000000000C4 :10FC400000000000000000000000000000000000B4 :10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC70000000000000000000000000000000000084 :10FC80000000000000000000000000000000000074 :10FC90000000000000000000000000000000000064 :10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000000000044 :10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 :10FCF0000000000000000000000000000000000004 :10FD000000000000000000000000000000000000F3 :10FD100000000000000000000000000000000000E3 :10FD200000000000000000000000000000000000D3 :10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 :10FD60000000000000000000000000000000000093 :10FD70000000000000000000000000000000000083 :10FD80000000000000000000000000000000000073 :10FD90000000000000000000000000000000000063 :10FDA0000000000000000000000000000000000053 :10FDB0000000000000000000000000000000000043 :10FDC0000000000000000000000000000000000033 :10FDD0000000000000000000000000000000000023 :10FDE0000000000000000000000000000000000013 :10FDF0000000000000000000000000000000000003 :10FE000000000000000000000000000000000000F2 :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 :10FE500000000000000000000000000000000000A2 :10FE60000000000000000000000000000000000092 :10FE70000000000000000000000000000000000082 :10FE80000000000000000000000000000000000072 :10FE90000000000000000000000000000000000062 :10FEA0000000000000000000000000000000000052 :10FEB0000000000000000000000000000000000042 :10FEC0000000000000000000000000000000000032 :10FED0000000000000000000000000000000000022 :10FEE0000000000000000000000000000000000012 :10FEF0000000000000000000000000000000000002 :10FF000000000000000000000000000000000000F1 :10FF100000000000000000000000000000000000E1 :10FF200000000000000000000000000000000000D1 :10FF300000000000000000000000000000000000C1 :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 :10FF70000000000000000000000000000000000081 :10FF80000000000000000000000000000000000071 :10FF90000000000000000000000000000000000061 :10FFA0000000000000000000000000000000000051 :10FFB0000000000000000000000000000000000041 :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 :10FFE0000000000000000000000000000000000011 :10FFF0000000000000000000000000000000000001 :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 :100080000000000000000000000000000000000070 :100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF :1001100000000000000000000000000000000000DF :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 :100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 :100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 :100EC0000000000000000000000000000000000022 :100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 :100F400000000000000000000000000000000000A1 :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :0C10000000000000000025002F003B0055 :00000001FF dasm-2.20.14.1/test/m_switch_2.args000066400000000000000000000000131375233463600166440ustar00rootroot00000000000000ARGS="-m63"dasm-2.20.14.1/test/m_switch_2.asm000077700000000000000000000000001375233463600212302m_switch_1.asmustar00rootroot00000000000000dasm-2.20.14.1/test/m_switch_2.fail000066400000000000000000000000011375233463600166200ustar00rootroot000000000000001dasm-2.20.14.1/test/m_switch_3.args000066400000000000000000000000131375233463600166450ustar00rootroot00000000000000ARGS="-m65"dasm-2.20.14.1/test/m_switch_3.asm000077700000000000000000000000001375233463600212312m_switch_1.asmustar00rootroot00000000000000dasm-2.20.14.1/test/m_switch_3.fail000066400000000000000000000000021375233463600166220ustar00rootroot0000000000000038dasm-2.20.14.1/test/macro_included.asm000066400000000000000000000003641375233463600174130ustar00rootroot00000000000000 .PROCESSOR 6502 #include "macro_ipart0.asm" /* head declaration */ /* continuing the macro definition in another file does not work */ #include "macro_ipart1.asm" /* macro is ended here */ .ORG 0 headPart dasm-2.20.14.1/test/macro_included.fail000066400000000000000000000000021375233463600175330ustar00rootroot0000000000000014dasm-2.20.14.1/test/macro_ipart0.asm000066400000000000000000000000431375233463600170150ustar00rootroot00000000000000 .MACRO headPart lda #1 dasm-2.20.14.1/test/macro_ipart1.asm000066400000000000000000000000421375233463600170150ustar00rootroot00000000000000 ldx #2 .ENDM ; tailPartdasm-2.20.14.1/test/macro_same_as_include.asm000066400000000000000000000003051375233463600207320ustar00rootroot00000000000000 .PROCESSOR 68908 .INCLUDE same_as_macro /* include file names and macro names can be shared without interfering */ .MAC same_as_macro lda #1 .ENDM .ORG same_as_macro ttt_macro dasm-2.20.14.1/test/macro_same_as_include.bin.ref000066400000000000000000000000061375233463600214730ustar00rootroot00000000000000dasm-2.20.14.1/test/macro_same_as_include.hex.ref000066400000000000000000000000401375233463600215050ustar00rootroot00000000000000:04000000A601AE02A5 :00000001FF dasm-2.20.14.1/test/missing_endm.asm000066400000000000000000000003061375233463600171130ustar00rootroot00000000000000 .PROCESSOR 68908 .ORG 0 .mac predef lda #5 .macro Main: predef rola write_usb rora rts .macro write_usb sta 6 .endm ; ; premature end of file or '"endm" missing' ; dasm-2.20.14.1/test/missing_endm.fail000066400000000000000000000000021375233463600172370ustar00rootroot0000000000000040dasm-2.20.14.1/test/multiline_comment.asm000066400000000000000000000003631375233463600201660ustar00rootroot00000000000000 processor 6502 ORG $1000 /* comment 1 */ lda #0 /* IF 0 */ lda #1/*test*/ /* */ lda #2 /* hello */label lda #3 /*foo*/ lda #4/*bar*/ /* more comments */mylabel lda #5 /* too many comments*/ /*but we can deal with it*/ dasm-2.20.14.1/test/multiline_comment.bin.ref000066400000000000000000000000161375233463600207240ustar00rootroot00000000000000dasm-2.20.14.1/test/multiline_comment.hex.ref000066400000000000000000000000361375233463600207420ustar00rootroot00000000000000:02100000A90144 :00000001FF dasm-2.20.14.1/test/negative.asm000066400000000000000000000011271375233463600162430ustar00rootroot00000000000000; Test negative literals. ; ; This came about because of the "-1 bug" in 2.20.10 and ; will hopefully ensure that no such bug ever returns to ; haunt us again... ; ; Peter H. Froehlich ; phf at acm dot org .processor 6502 .org 0 lda #0 ; lda #+0 ;syntax error? needs a FIX as well :-) lda #-0 lda #1 lda #-1 lda #127 lda #128 lda #129 lda #-127 lda #-128 lda #-129 lda #254 lda #255 lda #256 ; should fail? does fail! lda #-254 lda #-255 lda #-256 ; should fail? does NOT yet fail? lda #1024 ; should fail? does fail! lda #-1024 ; should fail? does NOT yet fail? .end dasm-2.20.14.1/test/negative1024.asm000066400000000000000000000004261375233463600165530ustar00rootroot00000000000000; Test negative literals. ; ; This came about because of the "-1 bug" in 2.20.10 and ; will hopefully ensure that no such bug ever returns to ; haunt us again... ; ; Peter H. Froehlich ; phf at acm dot org .processor 6502 .org 0 lda #1024 ; should fail? does fail! .end dasm-2.20.14.1/test/negative1024.fail000066400000000000000000000000011375233463600166730ustar00rootroot000000000000005dasm-2.20.14.1/test/negative1024_2.asm000066400000000000000000000004411375233463600167710ustar00rootroot00000000000000; Test negative literals. ; ; This came about because of the "-1 bug" in 2.20.10 and ; will hopefully ensure that no such bug ever returns to ; haunt us again... ; ; Peter H. Froehlich ; phf at acm dot org .processor 6502 .org 0 lda.b #-1024 ; should fail? does NOT yet fail? .end dasm-2.20.14.1/test/negative1024_2.fail000066400000000000000000000000011375233463600171140ustar00rootroot000000000000005dasm-2.20.14.1/test/negative256.asm000066400000000000000000000004251375233463600165000ustar00rootroot00000000000000; Test negative literals. ; ; This came about because of the "-1 bug" in 2.20.10 and ; will hopefully ensure that no such bug ever returns to ; haunt us again... ; ; Peter H. Froehlich ; phf at acm dot org .processor 6502 .org 0 lda #256 ; should fail? does fail! .end dasm-2.20.14.1/test/negative256.fail000066400000000000000000000000011375233463600166210ustar00rootroot000000000000005dasm-2.20.14.1/test/negative256_2.asm000066400000000000000000000004531375233463600167220ustar00rootroot00000000000000; Test negative literals. ; ; This came about because of the "-1 bug" in 2.20.10 and ; will hopefully ensure that no such bug ever returns to ; haunt us again... ; ; Peter H. Froehlich ; phf at acm dot org .processor 6502 .org 0 .TRACE on lda.b #-256 ; should fail? does NOT yet fail? .end dasm-2.20.14.1/test/negative256_2.fail000066400000000000000000000000011375233463600170420ustar00rootroot000000000000005dasm-2.20.14.1/test/recursive_eqm.asm000066400000000000000000000003571375233463600173160ustar00rootroot00000000000000; segfault str eqm "BB" .MAC strcat ; {symbol},{string_trailer} strcat_tmp eqm {1} + {2} {1} eqm strcat_tmp .ENDM strcat str,"\nAAA" strcat str,"\nCC" .PROCESSOR 6502 .ORG 0 DS str lda #1 ; EOF dasm-2.20.14.1/test/recursive_eqm.fail000066400000000000000000000000021375233463600174340ustar00rootroot0000000000000038dasm-2.20.14.1/test/recursive_equ.asm000066400000000000000000000001441375233463600173200ustar00rootroot00000000000000 .PROCESSOR 6502 ME .EQU (OTHER +1) OTHER .EQU (ME -1) .ORG 0 DC.b ME DC.b OTHER dasm-2.20.14.1/test/recursive_equ.fail000066400000000000000000000000011375233463600174430ustar00rootroot000000000000003dasm-2.20.14.1/test/recursive_macro0.asm000066400000000000000000000002131375233463600177040ustar00rootroot00000000000000 .PROCESSOR 6502 .MAC rec_test .IF ({1} > 0) rec_test [{1}-1] .ELSE lda #{1} .ENDIF .ENDM .ORG 0 rec_test 5 dasm-2.20.14.1/test/recursive_macro0.bin.ref000066400000000000000000000000041375233463600204450ustar00rootroot00000000000000dasm-2.20.14.1/test/recursive_macro0.hex.ref000066400000000000000000000000361375233463600204660ustar00rootroot00000000000000:02000000A90055 :00000001FF dasm-2.20.14.1/test/recursive_macro1.asm000066400000000000000000000001271375233463600177110ustar00rootroot00000000000000 .PROCESSOR 6502 .MAC rec_noend rec_noend .ENDM .ORG 0 rec_noend dasm-2.20.14.1/test/recursive_macro1.fail000066400000000000000000000000021375233463600200340ustar00rootroot0000000000000038dasm-2.20.14.1/test/recursive_macro2.asm000066400000000000000000000001721375233463600177120ustar00rootroot00000000000000 .PROCESSOR 6502 .ORG 0 .MAC m1_noend m2_noend .ENDM .MAC m2_noend m1_noend .ENDM m1_noend .END dasm-2.20.14.1/test/recursive_macro2.fail000066400000000000000000000000021375233463600200350ustar00rootroot0000000000000038dasm-2.20.14.1/test/recursive_set.asm000066400000000000000000000001611375233463600173200ustar00rootroot00000000000000; segfault str set "BB" str set str + "AAAA" .PROCESSOR 6502 .ORG 0 DS str lda #1 ; EOF dasm-2.20.14.1/test/recursive_set.fail000066400000000000000000000000021375233463600174450ustar00rootroot0000000000000038dasm-2.20.14.1/test/reverse_segfault.asm000066400000000000000000000001101375233463600177750ustar00rootroot00000000000000; segfault str set "" str eqm "\nAAAAA" + str echo str ; EOF dasm-2.20.14.1/test/reverse_segfault.fail000066400000000000000000000000021375233463600201300ustar00rootroot0000000000000038dasm-2.20.14.1/test/run_tests.sh000077500000000000000000000064551375233463600163350ustar00rootroot00000000000000#!/usr/bin/env bash # Simple test script adapted from Matt Dillon's 2.16 release. # It's harder to do this in a Makefile, so let's use a script. should_fail="0" REL_DIR="../bin" DEFINES="" format="1" while [ "$1" != "" ] do case "$1" in -R) REL_DIR="$2" shift ;; -S) should_fail="$2" shift ;; -D) DEFINES="${DEFINES} -D$2" shift ;; -F) format="$2" shift ;; -I) DEFINES="${DEFINES} -I$2" ;; esac shift done echo "=== build test cases (strict=off)" fail="0" ok="0" nTests="0" leadingSpace() { echo "$@" | awk '{ printf(" * % 32s", $0)}' } refFiles=`find . -type f -name '*.bin.ref' | sort` for item in $refFiles do ARGS="-f${format}" NAME=$(echo $item | sed 's/\.bin\.ref$//g;s/^\.\///g') leadingSpace "$NAME" if test -r ${NAME}.args then . ${NAME}.args fi if ${REL_DIR}/dasm ${NAME}.asm ${ARGS} -o$NAME.bin -L$NAME.list.txt -DINEEPROM ${DEFINES} >$NAME.out 2>&1 then if test -s $NAME.bin then ${REL_DIR}/ftohex 1 $NAME.bin $NAME.hex if cmp -s $NAME.bin $NAME.bin.ref then echo " binary is same, pass" ok="$[$ok+1]" else # second compare test is not needed, just help to find the diff if ! test -r $NAME.hex.ref then echo " file [$NAME.hex.ref] missing FAILED!" else diff -bBduw $NAME.hex $NAME.hex.ref >$NAME.hex.diff echo " binaries differ FAILED!" fi fail="$[$fail+1]" fi else echo " file doesn't exist or has zero size FAILED!" fail="$[$fail+1]" fi else echo " assembly FAILED! [$?]" fail="$[$fail+1]" fi nTests="$[$nTests+1]" done LIST=`find . -type f -name '*.fail' | sort` if [ "$LIST" != "" ] then echo "" echo "=== error test cases (strict=on)" # test for assembly sniplets that should fail for item in $LIST do ARGS="-f${format}" NAME=$(echo $item | sed 's/\.fail$//g;s/^\.\///g') leadingSpace "$NAME" if test -r ${NAME}.args then . ${NAME}.args fi if ! test -r ${NAME}.asm then echo "source file [${NAME}.asm] is missing" fail="$[$fail+1]" else if ${REL_DIR}/dasm ${NAME}.asm -S ${ARGS} -o$NAME.bin -L$NAME.list.txt -DINEEPROM ${DEFINES} >${NAME}.out 2>&1 then echo " no error FAILED!" fail="$[$fail+1]" else case "$ARGS" in *-R) if test -r $NAME.bin then echo " file exists, FAILED!" fail="$[$fail+1]" else echo " file was deleted, pass" ok="$[$ok+1]" fi ;; *) got_error_level="$?" expected_error_level=`cat $item | head -1` if [ "${expected_error_level}" = "" ] then echo " testcase definition incomplete, missing error_level (${got_error_level}), FAILED!" fail="$[$fail+1]" else if [ "${got_error_level}" != "${expected_error_level}" ] then echo " got error_level (${got_error_level}) but expected (${expected_error_level}), double FAULT!" fail="$[$fail+1]" else echo " error_code [${got_error_level}] pass" ok="$[$ok+1]" fi fi ;; esac fi fi nTests="$[$nTests+1]" done fi echo -n "executed ${nTests} tests, $ok OK, $fail failed, result: " if [ "$[$ok+${should_fail}]" = "$nTests" ] then echo "overall PASS" exit 0 else suspect="$[$fail-${should_fail}]" echo "need to investigate in $suspect test-cases" exit $suspect fi dasm-2.20.14.1/test/run_valgrind.sh000077500000000000000000000006331375233463600167710ustar00rootroot00000000000000#!/usr/bin/env bash # Simple test script adapted from Matt Dillon's 2.16 release. # It's harder to do this in a Makefile, so let's use a script. for i in *.asm do NAME=`basename $i .asm` echo "----- $NAME -----" valgrind -v --tool=memcheck --leak-check=full --error-exitcode=10 --show-reachable=yes --log-file=$NAME.valgrind ../bin/dasm $i -f1 -o$NAME.bin -DINEEPROM echo "valgrind returned $?" done dasm-2.20.14.1/test/same_as_macro000066400000000000000000000000501375233463600164450ustar00rootroot00000000000000 .MACRO ttt_macro ldx #2 .ENDM dasm-2.20.14.1/test/same_names.asm000066400000000000000000000012121375233463600165440ustar00rootroot00000000000000 .TRACE on .PROCESSOR 68908 .MAC ldx ; we cant overwrite any of the processor ops lda {1} .ENDM .MAC LDHX ; also not with different case ldx <{1} lda >{1} psha pulh .ENDM .MAC M1_postfix7 ldhx #1 .ENDM .MAC M2_postfix7 ldx #1 clrh .ENDM M1_postfix7 .EQU 0xA1 ; symbols can share the same name with macros or processor ops M2_postfix7 .EQU 0xB2 LDA .EQU 0xDA .MAC M3_postfix7 pshh pulx .ENDM .ORG 0 ; call to macro1 M1_postfix7 ; call to macro2 M2_postfix7 DC.b M1_postfix7 DC.b M2_postfix7 DC.b LDA lda #0x0a LDA #0x0b ; call to macro3 M3_postfix7 ldx #1 ldhx #2 LDHX #3 .END dasm-2.20.14.1/test/same_names.bin.ref000066400000000000000000000000311375233463600173050ustar00rootroot00000000000000Eڦ EEdasm-2.20.14.1/test/same_names.hex.ref000066400000000000000000000001251375233463600173250ustar00rootroot00000000000000:10000000450001AE018CA1B2DAA60AA60B8B88AE20 :070010000145000245000359 :00000001FF dasm-2.20.14.1/test/sample.asm000066400000000000000000000616561375233463600157370ustar00rootroot00000000000000 ; FATROM.ASM ; ;----------------------------------------------------- ; MEMORY MAP - ;----------------------------------------------------- ; ; We throw away some internal ram (96 bytes) in order ; to use direct addressing for the majority of memory ; accesses by mapping the registers at 0. ; ; MC68HC11F1 port and bit assignments ; ; We setup a very fast OC1 interrupt.. around 208uS, to ; handle main system timing. This also allows us to have ; a WAI instruction in our serial poll loop to lower power ; consumption. RAM equ $0000 ; 1K byte of RAM LORAMBEG equ $0060 ; 96 unusable due to ctl regs ifconst INEEPROM HIRAMBEG equ $0300 ; hardwired for RTU software else HIRAMBEG equ $0320 eif REGS equ $0000 ; 96 control regs (after INIT) EEPROM equ $FE00 ; 512 bytes EEPROM PORTA equ REGS+$00 ; i/o port A PORTA_24V equ $80 ; 24V power switch DDRA equ REGS+$01 ; PORTG equ REGS+$02 CSPROG equ $80 CSGEN equ $40 CS101 equ $20 CS102 equ $10 PORTG_RESERVED7 equ $80 PORTG_MUXSEL3 equ $40 PORTG_MUXSEL2 equ $20 PORTG_MUXSEL1 equ $10 PORTG_MUXSEL0 equ $08 PORTG_ADSTROBHI equ $04 DDRG equ REGS+$03 PORTB equ REGS+$04 ; i/o port B PORTF equ REGS+$05 ; PORTF l.e.d's and digout 1 & 2 PORTF_DIGOUT2 equ $80 PORTF_DIGOUT1 equ $40 PORTF_GRN equ $20 PORTF_RED equ $10 PORTC equ REGS+$06 DDRC equ REGS+$07 PORTD equ REGS+$08 DDRD equ REGS+$09 PORTE equ REGS+$0A CFORC equ REGS+$0B CFORC_FOC1 equ $80 ; FORCE OUTPUT COMPARE 1-4 CFORC_FOC2 equ $40 ; ....OR'D WITH TOC'S CFORC_FOC3 equ $20 ; CFORC_FOC4 equ $10 ; CFORC_FOC5 equ $08 ; OC1M equ REGS+$0C ; OUTPUT COMPARE MASK OC1_M7 equ $80 ; ALLOWS COUNTER COMPARE OUTPUTS ESTABLISHED BY OC1_M6 equ $40 ; OC1D6-D3 ON PA OC1_M5 equ $20 ; EXCEPT FOR OC1M7 WHICH ALLOWS EITHER OC1_M4 equ $10 ; INTERNAL DATA (0) OR OC1D7 DURING WRITES TO OC1_M3 equ $08 ; PA7 OC1D equ REGS+$0D OC1_d7 equ $80 ; STATES WHICH WILL BE PRESENT ON PA6-PA3 OC1_d6 equ $40 ; WHEN PERMITTED BY OC1_M6-M3 OC1_d5 equ $20 ; OC1_d4 equ $10 ; OC1_d3 equ $08 ; TCNT equ REGS+$0E TIC1 equ REGS+$10 TIC2 equ REGS+$12 TIC3 equ REGS+$14 TOC1 equ REGS+$16 TOC2 equ REGS+$18 TOC3 equ REGS+$1A TOC4 equ REGS+$1C TOC5 equ REGS+$1E TCTL1 equ REGS+$20 ;ACTION TAKEN CODES M L TCTL1_OM2 equ $80 ; 0 0 -DISABLE TCTL1_OL2 equ $40 ; 0 1 -TOGGLE TCTL1_OM3 equ $20 ; 1 0 -CLEAR TCTL1_OL3 equ $10 ; 1 1 -SET TCTL1_OM4 equ $08 ; TCTL1_OL4 equ $04 ; OR, WHAT 1 OF 4 THINGS HAPPEN TO OUT.CMP TCTL1_OM5 equ $02 ; FLAGS IN TFLG1 2-5 (OCF'S 2-5) TCTL1_OL5 equ $01 ; TCTL2 equ REGS+$21 ; B A TCTL2_EDG1B equ $20 ; 0 0 CAPTURE DISABLED TCTL2_EDG1A equ $10 ; 0 1 '' ON RISING TCTL2_EDG2B equ $08 ; 1 0 '' ON FALLING TCTL2_EDG2A equ $04 ; 1 1 '' ON ANY TCTL2_EDG3B equ $02 TCTL2_EDG3A equ $01 TMSK1 equ REGS+$22 TMSK1_OC1I equ $80 ; TMSK1_OC2I equ $40 ; ENABLE OUTPUT COMPARE INTERRUPT WHEN SET TMSK1_OC3I equ $20 ; TMSK1_OC4I equ $10 ; TMSK1_OC5I equ $08 ; TMSK1_IC1I equ $04 ; ENABLE INTERUPTS ON CAPTURE FLAG WHEN SET TMSK1_IC2I equ $02 ; TMSK1_IC3I equ $01 ; TFLG1 equ REGS+$23 TFLG1_OC1F equ $80 ; CORRESPONDING FLAGS TO THE ABOVE TFLG1_OC2F equ $40 ; TFLG1_OC3F equ $20 ; TFLG1_OC4F equ $10 ; TFLG1_OC5F equ $08 ; TFLG1_IC1F equ $04 ; TFLG1_IC2F equ $02 ; TFLG1_IC3F equ $01 ; ;NOTE: PR1 & PR0 MUST BE WRITTEN IMMEDIATELY AFTER RESET!! TMSK2 equ REGS+$24 TMSK2_TOI equ $80 ; Timer overflow interrupt enable TMSK2_RTII equ $40 ; Real time interrupt TMSK2_PAOVI equ $20 ; Pulse accumulator overflow TMSK2_PAII equ $10 ; Pulse accumulator count TMSK2_PR1 equ $02 ; Timer prescale select TMSK2_PR0 equ $01 ; 0,0=/1 0,1=/4 1,0=/8 1,1=/16 TFLG2 equ REGS+$25 TFLG2_TOF equ $80 ; FLAGS FOR THE ABOVE 1ST 4 INTERRUPTS TFLG2_RTIF equ $40 ; TFLG2_PAOVF equ $20 ; TFLG2_PAIF equ $10 ; PACTL equ REGS+$26 PACTL_DDRA7 equ $80 ; 0=INPUT ONLY, 1=OUTPUT PACTL_PAEN equ $40 ; ENABLE PA PACTL_PAMOD equ $20 ; 0=COUNT EXTERNAL EVENTS,1=GATED TIME ACCUM. PACTL_PEDGE equ $10 ; 0=INC ON FALLING OR INHIBITS CNT;1=OPPOSITE PACTL_RTR1 equ $02 ; Divider for real time interrupt PACTL_RTR0 equ $01 ; Divide by 2^13, 2^14, 2^15, or 2^16 PACNT equ REGS+$27 SPCR equ REGS+$28 SPCR_SPIE equ $80 ; serial PERIPH INTERRUPT ENABLE SPCR_SPE equ $40 ; serial periph system enable SPCR_DWOM equ $20 ; PORT D WIRED-OR 0=TOTEM,1=OPEN DRAIN SPCR_MSTR equ $10 ; 0=SLAVE, 1=MASTER SPCR_CPOL equ $08 ; 0=ACT. HIGH CLKS;SCK IDLES LOW--1 IS OPPOSITE SPCR_CPHA equ $04 ; CLOCK PHASE SPCR_SPR1 equ $02 ; E CLOCK / 2 4 16 32 SPCR_SPR0 equ $01 ; 00 01 10 11 SPSR equ REGS+$29 SPSR_SPIF equ $80 ; TXFR COMPLETE SPSR_WCOL equ $40 ; WRITE COLLISION SPSR_MODF equ $10 ; MODE-FAULT ERROR FLAG SPDR equ REGS+$2A BAUD equ REGS+$2B BAUD_TCLR equ $80 ; 0 BAUD_SCP1 equ $20 ; divide e by 1 3 4 13 BAUD_SCP0 equ $10 ; 00 01 10 11 BAUD_RCKB equ $08 ; 0 BAUD_SCR2 equ $04 ; divide prescaler out by 1, 2 4,.....128 BAUD_SCR1 equ $02 ; BAUD_SCR0 equ $01 ; scr0,1,2 = 000 001 010.....111 BAUD_4800 equ BAUD_SCP1|BAUD_SCR1 BAUD_9600 equ BAUD_SCR0|BAUD_SCR1 BAUD_19200 equ BAUD_SCR1 SCCR1 equ REGS+$2C SCCR1_R8 equ $80 ; get the ninth bit here, if 'M' bit is set SCCR1_T8 equ $40 ; set this bit for the 9th tx bit if 'M' is set SCCR1_M equ $10 ; 'M' SCCR1_WAKE equ $08 ; 0=idle line, 1=address mark SCCR2 equ REGS+$2D SCCR2_TIE equ $80 ; Transmit interrupt enable SCCR2_TCIE equ $40 ; Transmit Complete interr en SCCR2_RIE equ $20 ; Receiver Interrupt enable SCCR2_ILIE equ $10 ; Idle Line '' '' SCCR2_TE equ $08 ; tx enable SCCR2_RE equ $04 ; rx """ SCCR2_RWU equ $02 ; wake up when set SCCR2_SBK equ $01 ; send break SCSR equ REGS+$2E SCSR_TDRE equ $80 ; Transmit Data Register Empty SCSR_TC equ $40 ; Transmit Complete SCSR_RDRF equ $20 ; Receiver Data Ready SCSR_IDLE equ $10 ; Idle Line Detect SCSR_OR equ $08 ; overrun error SCSR_NF equ $04 ; noise flag SCSR_FE equ $02 ; framing error SCDR equ REGS+$2F ; sc data reg ADCTL equ REGS+$30 ADCTL_CCF equ $80 ; Conversion complete, cleared on ADCTL write ADCTL_SCAN equ $20 ; Continuous scan mode, else single scan ADCTL_MULT equ $10 ; Scan all four channels or just one channel ADCTL_CD equ $08 ; ADCTL_CC equ $04 ; ADCTL_CB equ $02 ; ADCTL_CA equ $01 ; ADR1 equ REGS+$31 ; ADC register 1 ADR2 equ REGS+$32 ADR3 equ REGS+$33 ADR4 equ REGS+$34 BPROT equ REGS+$35 BPROT_PTCON equ $10 BPROT_BPRT3 equ $08 BPROT_BPRT2 equ $04 BPROT_BPRT1 equ $02 BPROT_BPRT0 equ $01 OPT2 equ REGS+$38 ; config options 2 register OPT2_GWOM equ $80 OPT2_CWOM equ $40 OPT2_CLK4X equ $20 OPTION equ REGS+$39 OPTION_ADPU equ $80 ; A/D power OPTION_CSEL equ $40 OPTION_IRQE equ $20 ; IRQ edge sensitive enable, else level sens. OPTION_DLY equ $10 ; delay 4000 E clks after stop, else 4 OPTION_CME equ $08 OPTION_CR1 equ $02 ; cop timer rates of E/2^15/(1,4,16,64) OPTION_CR0 equ $01 ; for 00,01,10,11 COPRST equ REGS+$3A ; EEPROM programming register. ; ; BYTE ROW (only valid when erase bit is set) ; 0 0 bulk erase ; 0 1 row erase ; 1 0 byte erase ; 1 1 byte erase ; ; erase sequence is: ; +BYTE+ERASE+EELAT, write eeprom, +PGM, delay 10 ms, ; -PGM-ERASE-EELAT ; program sequence is: ; +EELAT, write eeprom, +PGM, delay 10 ms, -PGM-EELAT ; ; you do not need to program to zero before erasing to 1's. PPROG equ REGS+$3B PPROG_ODD equ $80 ; Factory reserved PPROG_EVEN equ $40 ; Factory reserved PPROG_BYTE equ $10 ; Byte erase mode PPROG_ROW equ $08 ; Row erase mode PPROG_ERASE equ $04 ; Erase enable PPROG_EELAT equ $02 ; arm eeprom write (then write to eeprom) PPROG_EEPGM equ $01 ; apply programming voltage HPRIO equ REGS+$3C HPRIO_RBOOT equ $80 ; Set in special test mode HPRIO_SMOD equ $40 ; ~MODB pin latched at reset HPRIO_MDA equ $20 ; MODB pin latched at reset, can be clrd in ; special tes/tbootstrap mode ? HPRIO_IRV equ $10 ; internal read visibility HPRIO_PSEL3 equ $08 ; Select highest priority interrupt, only HPRIO_PSEL2 equ $04 ; writable when interrupts are masked. HPRIO_PSEL1 equ $02 ; HPRIO_PSEL0 equ $01 ; INIT equ REGS+$3D INIT_RAM3 equ $80 ; Internal ram base address in 4K chunks, INIT_RAM2 equ $40 ; default $0000 (0000) INIT_RAM1 equ $20 ; INIT_RAM0 equ $10 ; INIT_REG3 equ $08 ; Control register base address in 4K chunks, INIT_REG2 equ $04 ; default $1000 (0001) INIT_REG1 equ $02 ; INIT_REG0 equ $01 ; TEST1 equ REGS+$3E TEST1_TILOP equ $80 ; FACTORY TEST STUFF ONLY WHEN SMOD=1 TEST1_OCCR equ $20 TEST1_CBYP equ $10 TEST1_DISR equ $08 TEST1_FCM equ $04 TEST1_FCOP equ $02 TEST1_TCON equ $01 CONFIG equ REGS+$3F CONFIG_NOSEC equ $08 ; no eeprom security CONFIG_NOCOP equ $04 ; no hardware watchdog CONFIG_ROMON equ $02 ; enable rom CONFIG_EEON equ $01 ; enable eeprom ; In bootstrap mode vectors go through ram ; BsSCIJmp equ $C4 BsSPIJmp equ $C7 BsPAIJmp equ $CA BsPAOVJmp equ $CD BsTOVJmp equ $D0 BsOC5Jmp equ $D3 BsOC4Jmp equ $D6 BsOC3Jmp equ $D9 BsOC2Jmp equ $DC BsOC1Jmp equ $DF BsIC3Jmp equ $E2 BsIC2Jmp equ $E5 BsIC1Jmp equ $E8 BOOTSTRAPORG equ $EB ; bootstrap origin BsRTIJmp equ $EB BsIRQJmp equ $EE BsXIRQJmp equ $F1 BsSWIJmp equ $F4 BsILLJmp equ $F7 BsCOPJmp equ $FA BsCMJmp equ $FD processor 68hc11 ;----------------------------------------------------- ; RAM VARS - ;----------------------------------------------------- ; ; most/all ram variables can be accessed with direct ; addressing for the EEPROM version. seg.u bss org LORAMBEG RTUConfig ds.b 1 ; RTU Flags reg, cleared on reset BoardAddr ds.b 1 ; 1 byte board address Counter1 ds.w 1 ; 2 bytes counter input Counter2 ds.w 1 ; 2 bytes counter input RTIRedCnt ds.b 1 ; real time interrupt red l.e.d. countdown RTIGrnCnt ds.b 1 ; real time interrupt grn l.e.d. countdown RTIWDog ds.w 1 ; 2 byte wdog ctr, reset by packet reception RTIAvrCnt ds.b 1 ; 1 16 sample countdown ; note: packet size for ram-dl version must be smaller so ; program fits in ram ifconst INEEPROM PacketBuf ds.b 256+8 ; maximum packet size plus slop else PacketBuf ds.b 32+8 ; maximum packet size plus slop in bootstrap eif ; note: MaxScanTable location hardwired by ioscan for normal ; operation ; org HIRAMBEG MaxScanTable ds.b 96 ; 16 channels x 3 (holdingregx1, accumulatorx2) Stack ds.b 64 ; Reserve 64 bytes for the stack StackEnd ds.b 0 ;----------------------------------------------------- ; CODE SEGMENT - ;----------------------------------------------------- ; ; For EEPROM version code starts at $FE00. For RAM bootstrap ; version code starts at zero from which we immediately jump ; forward past all registers and ram variables ; seg code ifconst INEEPROM org $FE00 else org $0000 jmp Reset org BOOTSTRAPORG eif ;----------------------------------------------------- ; ROM VARS - ;----------------------------------------------------- ; ; Calibration constants are at the beginning of the rom, ; consisting of two 16 bit base constants for analog channel ; 1 and two 8 bit constants for each of analog channels ; 2 through 7, two 8 bit constants for the two temp. ; sensors, two 8 bit constants for the board temp. sensor. ; ; The RTU will interpret these constants dc.w $FFFF,$FFFF ; Mux channel 0, 4 and 20mA AI01 dc.b $FF,$FF ; Mux channel 1 (delta) AI02 dc.b $FF,$FF ; Mux channel 2 (delta) AI03 dc.b $FF,$FF ; Mux channel 3 (delta) AI04 dc.b $FF,$FF ; Mux channel 4 (delta) (unused) dc.b $FF,$FF ; Mux channel 5 (delta) AI05 dc.b $FF,$FF ; Mux channel 6 (delta) AI06 dc.b $FF,$FF ; Mux channel 7 (delta) AI07 dc.b $FF,$FF ; External temp. sensor 1 dc.b $FF,$FF ; External temp. sensor 2 dc.b $FF,$FF ; On-Board temp. sensor ;----------------------------------------------------- ; RESET - ;----------------------------------------------------- ; ; Platform reset. Interrupts are disabled and the stack ; pointer is/becomes invalid. Reset subroutine ResetCmd BadInt ; disable interrupts, setup protected control registers ; INIT - relocate ram and hardware regs to 0 ; OPT2 - disable clk4x output (save power) ; OPTION - enable ADC ; ; note: due to ram/regs overlap, first 96 bytes of ram ; is unaccessable. For bootstrapped programs, the ; jmp to Reset becomes unaccessable after it is executed. sei clra ; .A = 0 staa INIT-REGS+$1000 ; map ram & regs to base address 0 staa OPT2 ; disable clk4x & C,G wire-or modes staa BPROT ; allow eeprom to be written ldab #OPTION_ADPU ; enable ADC stab OPTION ; SETUP PORTS AND DDRS ; ; DDR DATA ; PORTA 10000000 0xxxxxxx (+24V power switch) ; PORTB 11111111 (LED's) ; PORTC 00000000 xxxxxxxx ; PORTD xx110000 xx00xxxx (~ss, sck) ; PORTE xxxxxxxx (addr h, l, brdid, temp) ; PORTF 00111111 (digout, LED's) ; PORTG 11111100 000000xx (filter, mux sel, startconv, ; digin) ; note: PD5 must be an output so as not to interfere with ; SPI ~SS hardware. ; ; NOTE: PORTA_24V is off (0) by default. This is to prevent ; the RTU's isolated power supply from getting jerked around ; when several boards are in the system. Analog and digital ; inputs will not be valid until the RTU turns on this line. ; ; NOTE: PORTD ~SS output must be set to 1 before configuring ; the SPI as a master (???) ; ; .A is still 0 lds #DDRD ldab #%00111000 ; DDRD = 00111000 pshb pshb ; PORTD= 00111000 psha ; DDRC = 00000000 des ; RESERVED06 ldab #$3F ; PORTF= 00111111 pshb ldab #$FF ; PORTB= 11111111 pshb ldab #%11111100 ; DDRG = 11111100 pshb psha ; PORTG= 0 ldab #PORTA_24V ; DDRA = PORTA_24V pshb psha ; PORTA= 0 ; Setup remaining hardware, .A still 0 ; ; ADC setup for continuous scan channels 4-7 ; SCI 9600bps 8N1, IDLE wake detection ; SPI Setup clock phase, etc.. ldab #ADCTL_MULT|ADCTL_SCAN|ADCTL_CC stab ADCTL staa SCCR1 ldab #SCCR2_TE|SCCR2_RE stab SCCR2 ldab #BAUD_9600 stab BAUD ; SPI, .A still 0 ; ; CPOL=0, CPHA=0, clkrate= E/2 (614KHz) ldab #SPCR_MSTR ; make master, disable stab SPCR bset SPCR,SPCR_SPE ; enable ; ICR - Input capture registers ; ; Setup input capture registers for counter inputs and setup ; OC1 to handle system timing. ; bset TCTL2,TCTL2_EDG1A|TCTL2_EDG2A|TCTL2_EDG3A bset TMSK1,TMSK1_IC1I|TMSK1_IC2I|TMSK1_OC1I ; bootstrap interrupt vectors (.A still 0) ; ; When bootstrapping to ram, the 68HC11F1 implements pseudo ; vectors and we have to create a jump table for the vectors ; we use. ifnconst INEEPROM ldab #$7E ; JMP extended instruction stab BsOC1Jmp stab BsIC1Jmp stab BsIC2Jmp ldx #OC1Int ; address of OC1 interrupt stx BsOC1Jmp+1 ldx #IC1Int stx BsIC1Jmp+1 ldx #IC2Int stx BsIC2Jmp+1 eif ; Setup stack and various ram variables, .A still 0 ; ; We do not have to clear RTIWDog since it is reset by packet ; reception and the relays are off anyway before then. We ; do not have to clear the red/grn count either because the ; l.e.d's are already off. ; lds #StackEnd-1 ; reset stack pointer staa RTUConfig staa RTIAvrCnt cli ; enable ints (note: stop disble is 1) ;----------------------------------------------------- ; MAIN PACKET WAIT LOOP - ;----------------------------------------------------- ; ; Wait for an incomming packet ; ; The RED led is lit when an error is detected ; ; The GRN led is lit whenever we receive a valid packet ; whos address is for us. PKT_LEN equ 0 PKT_ADR equ 1 PKT_CMD equ 2 PKT_DATA equ 3 subroutine WaitPacketRed ldaa #56 ; 3 seconds staa RTIRedCnt bclr PORTF,PORTF_RED ; Wait for a packet. We keep a running checksum while ; bringing in the packet and setup the loop such that ; .X will point to the CHK byte when done rather then ; one past the CHK byte. ; ; AA ; LEN \ ; ADR | ; CMD | LEN bytes ; DATA[LEN-4] | ; CHK / ; 55 ; ; CHK does not include AA or 55. CHK is formulated such ; that it all adds to zero. WaitPacket bsr GetB ; get protocol/synch cmpb #$AA ; ignore if not $AA packet bne WaitPacketRed clra ; checksum accumulation ldx #PacketBuf-1 .1 bsr GetB ; get byte (first byte is length) inx stab 0,x ; store aba ; accumulate checksum dec PacketBuf bne .1 tsta bne WaitPacketRed bsr GetB ; obtain endsynch and check cmpb #$55 bne WaitPacketRed ; check address ldaa PacketBuf+PKT_ADR bmi .10 cmpa BoardAddr bne WaitPacket .10 ; Now have a valid packet, setup for return and ; execute command ; ldab PacketBuf+PKT_CMD ldaa #22 ; aprox set wdog 5 min (sto msb) staa RTIWDog ldx #CommandTable ; lookup the command andb #$0E ; force command to be valid abx ldx 0,x ; get pointer to command ; setup part of response ldaa #$20 staa PacketBuf+PKT_ADR ldaa RTUConfig staa PacketBuf+PKT_CMD jsr 0,x ; Execute the command bsr TransmitPacket bra WaitPacket ; Upon completion transmit back .B bytes of data.. that is, ; a packet: ; AA LEN ADR+$20 FLG DATA[.B] CHK $55 (LEN=.B+4) TransmitPacket ldaa #9 ; set green led 0.5 sec staa RTIGrnCnt bclr PORTF,PORTF_GRN addb #4 stab PacketBuf+PKT_LEN ldx #PacketBuf clra ; checksum bclr SCCR2,SCCR2_RE ; disable receiver ldab #$AA ; sync .110 bsr SendB ; send loop, everything except checksum ldab 0,x inx sba dec PacketBuf+PKT_LEN bne .110 aba tab ; send checksum bsr SendB ldab #$55 bsr SendB .120 brclr SCSR,SCSR_TC,.120 bset SCCR2,SCCR2_RE ; reenable receiver rts ; GETB - receive a character from the serial port ; subroutine GetBLoop wai GetB brclr SCSR,SCSR_RDRF,GetBLoop ldab SCDR rts ; SENDB - transmit a character to the serial port ; subroutine SendBLoop wai SendB brclr SCSR,SCSR_TDRE,SendBLoop stab SCDR rts ;----------------------------------------------------- ; COMMANDS ;----------------------------------------------------- ; ; A command must return the response length in .B, 0 ; if no data (returns a packet with no data) ; ; 00 IDENTIFY ; 02 READ BYTES ; 04 WRITE BYTES ; 06 PROGRAM EEPROM BYTE ; 08 RESET ; 0A CONFIGURE ; 0C BAD CMD ; 0E BAD CMD CommandTable dc.w IdentifyCmd dc.w ReadBytesCmd dc.w WriteBytesCmd ifconst INEEPROM dc.w BadCmd else dc.w ProgramByteCmd eif dc.w ResetCmd dc.w ConfigureCmd dc.w BadCmd dc.w BadCmd ; BADCMD ; ; Bad command, simply ignore... return an empty packet BadCmd subroutine clrb rts ; CONFIGURECMD ; ; Configure an I/O board, copy data to RTUConfig and PORTA ConfigureCmd subroutine ldd PacketBuf+PKT_DATA staa RTUConfig stab PORTA clrb rts ; IDENTIFY - identify board ; ; returns board type, board address, board temp, board id ; ; IdentifyUncCmd only identifies unconfigured boards subroutine IdentifyCmd ldaa #1 staa PacketBuf+PKT_DATA ldaa BoardAddr staa PacketBuf+PKT_DATA+1 ldd ADR1 std PacketBuf+PKT_DATA+2 ldab #4 rts ; READ BYTES - read data bytes ; ; ReadBytesCmd subroutine ldx PacketBuf+PKT_DATA ; source address ldy #PacketBuf+PKT_DATA+3 ; destination address memCpy clrb memCpyLoop ldaa 0,x staa 0,y inx iny incb cmpb PacketBuf+PKT_DATA+2 bne memCpyLoop addb #3 rts ; WRITE BYTES - write data bytes, written data returned ; WriteBytesCmd subroutine ldx #PacketBuf+PKT_DATA+3 ; source address ldy PacketBuf+PKT_DATA ; destination address bra memCpy ifnconst INEEPROM ; PROGRAM BYTE - write one byte of data to eeprom ; ; Command: addr cmd ADRH ADRL LEN DATA[] ; Response: 40+X err ProgramByteCmd subroutine ldx PacketBuf+PKT_DATA ; destination address ldab PacketBuf+PKT_DATA+2 ; # of bytes to write ldy #PacketBuf+PKT_DATA+3 ; source address pbloop pshb ldab 0,y bsr eepromWrite pulb inx iny decb bne pbloop ; clrb rts ; eepromWrite - write data in .B to eeprom address .X ; ; .B, .X left alone ; eepromWrite subroutine ldaa #PPROG_BYTE|PPROG_ERASE|PPROG_EELAT bsr .10 ldaa #PPROG_EELAT .10 staa PPROG stab 0,x bset PPROG,PPROG_EEPGM pshb ldd TCNT addd #12228 .11 cpd TCNT ; D-TCNT bpl .11 pulb clra staa PPROG rts eif ;----------------------------------------------------- ; COUNTER INTERRUPTS ;----------------------------------------------------- ; ; IC1 - digital input counter 2 ; IC2 - digital input counter 1 IC1Int ldx Counter2 inx stx Counter2 bclr TFLG1,<~TFLG1_IC1F rti IC2Int ldx Counter1 inx stx Counter1 bclr TFLG1,<~TFLG1_IC2F rti ;----------------------------------------------------- ; GET BOARD ADDRESS - ;----------------------------------------------------- ; ; GetBoardAddr - calculate board network address 00-0F ; and return in .B ; ; ADR4 (msb) and ADR3 (lsb) contain the address. ; Each A/D is valued as shown below. We conver the ; A/D value to a two bit address simply by multiplying ; it by x3 and extracting the top two bits. The ; result is also flexible enough to allow variations in ; ADC values. ; ; **xxxxxx ; ; 00 x 3 = 00 00000000 ; 1E x 3 = 5A 01011010 ; 37 x 3 = A5 10100101 ; 4B x 3 = E1 11100001 GetBoardAddr subroutine clrb ; address accumulator ldaa ADR4 bsr oneOfFour ldaa ADR3 oneOfFour pshb tab asla aba pulb asla rolb asla rolb rts ;----------------------------------------------------- ; OC1 INTERRUPT ;----------------------------------------------------- ; ; The OC1 interrupt is set to occur at 3840Hz (~260uS). Each ; interrupt switches channel so each individual channel is ; effectively sampled at 240Hz. 256 samples are accumulated ; yielding a 20 bit sum which is normalized to 16 bits and ; transfered to another ram address for reading by the RTU. ; ; Working the math, you will also notice that 256 samples at ; 240 Hz winds up being an integral number of 60Hz cycles, ; therefore any 60Hz hum (and most harmonics of 60Hz) are ; automatically removed. ; ; The OC1 interrupt also serves the following functions: ; * Break WAI instruction in main loop for serial poll ; * Handle LEDs and watchdog countdown ; * Ensure processor runs long enough for ADC to convert OC1Int subroutine ; 1.2288MHzx320 (3840Hz) Max176 scan ; ldab PORTG lsrb lsrb ldx #MaxScanTable ; +0 primary, +32 acclsb, +64 accmsb abx bsr ScanMax16 ; fmt ssdddddd.ddddddxx andb #$FC aslb rola aslb rola bcc .4 ; if negative, msb is all 1's dec 64,x .4 addd 32,x ; fmt dddddddd.dddd0000 bcc .5 ; carry inc 64,x .5 tst RTIAvrCnt bne .10 ; fmt 0ddddddd.dddddddd.dddd0000 aslb ; cvt to dddddddd.dddddddd tab rolb ldaa 64,x rola std 0,x clra ; setup to clear msb, lsb clrb staa 64,x .10 std 32,x ldab PORTG addb #$08 bpl .20 ldaa RTIAvrCnt adda #$02 ; $10=16 samp/avr, $02=128 samp avr staa RTIAvrCnt clrb .20 stab PORTG ; Setup for next interrupt ; ; bclr TFLG1,<~TFLG1_OC1F ldd TOC1 addd #320 std TOC1 bcc .200 ; x65536 (18.75 Hz) code ; dec RTIRedCnt bne .100 bset PORTF,PORTF_RED .100 dec RTIGrnCnt bne .101 bset PORTF,PORTF_GRN .101 ldx RTIWDog dex stx RTIWDog beq .102r .102 bsr GetBoardAddr ; obtain board address cmpb BoardAddr beq .103 stab BoardAddr .102r clr RTUConfig bclr PORTF,PORTF_DIGOUT1|PORTF_DIGOUT2 .103 ; ; .200 rti ; SCANMAX16 - scan Max176 ; ; This routine may not be interrupted due to sample-and-hold ; droop in the Max176. We use the SPI to generate 16 clocks ; to the Max176 after the rising edge of strobe. The falling ; edge of strobe must occur before the 12th bit and can occur ; as soon as the second bit. ScanMax16 subroutine bset PORTG,PORTG_ADSTROBHI bsr Get8B ; 13 from store bsr Get8A ; 16 to load, 13 from store Get8A bclr PORTG,PORTG_ADSTROBHI ; 6 tba ; 2 Get8B tst SPSR ; 3 ldab SPDR ; 3 stab SPDR ; 3 asla ; 2 asla ; 2 asra ; 2 asra ; 2 rts ; 5 ;----------------------------------------------------- ; INTERRUPT VECTORS - ;----------------------------------------------------- ; ; Interrupt Vectors ; ; note: if we need the space we can use some of this space ; for code (for those interrupt vectors we do not use) ifconst INEEPROM org $FFD6+9*2 ;;dc.w BadInt ; SCI serial ;;dc.w BadInt ; SPIE ;;dc.w BadInt ; PAII Pulse Accumulator ;;dc.w BadInt ; PAOVI Pulse Accumulator Overflow ;;dc.w BadInt ; TOI Timer overflow ;;dc.w BadInt ; OC5 ;;dc.w BadInt ; OC4 ;;dc.w BadInt ; OC3 ;;dc.w BadInt ; OC2 dc.w OC1Int ; OC1 dc.w BadInt ; IC3 dc.w IC2Int ; IC2 dc.w IC1Int ; IC1 dc.w BadInt ; RTI Realtime interrupt dc.w BadInt ; IRQ dc.w BadInt ; XIRQ dc.w BadInt ; SWI dc.w Reset ; Illegal OpCode Trap dc.w Reset ; COP failure (reset) dc.w Reset ; Clock Monitor Failure dc.w Reset ; RESET eif dasm-2.20.14.1/test/sample.bin.ref000066400000000000000000000010021375233463600164550ustar00rootroot00000000000000O=85ƀ9 87764?7776ƀ7640, -+((@!"`j8fp&Ojfzk&M&XU&ۖl+a&mh: l`m g kkO-ƪ"zk&U.@-9>. /9>./9'_9n`_9nao1p9nq_\p&9qn dd#;bb#;_437H3HYHY9TT:dXIXI$j@ $l@}j& XY@IO_@ *jj_#@$%zf&zg& h h'a'a`;})**HHGG9R8/dasm-2.20.14.1/test/sample.hex.ref000066400000000000000000000026551375233463600165100ustar00rootroot00000000000000:10FE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 :10FE1000FFFFFFFFFFFFFFFF0F4FB7103D97389722 :10FE200035C680D7398E0009C63837373634C63FD5 :10FE300037C6FF37C6FC3736C6803736C634D730AC :10FE4000972CC60CD72DC603D72BC610D72814283D :10FE5000401421151422868E039F9760976A0E86A0 :10FE60003897661505108D70C1AA26F34FCE006A2B :10FE70008D6608E7001B7A006B26F54D26E18D584C :10FE8000C15526DB966C2B04916126DAD66D861659 :10FE90009768CEFEE7C40E3AEE008620976C966017 :10FEA000976DAD008D0220BE86099767150520CBA2 :10FEB00004D76BCE006B4F152D04C6AA8D22E60029 :10FEC00008107A006B26F51B168D15C6558D11137B :10FED0002E40FC142D04393E132E20FBD62F393E24 :10FEE000132E80FBD72F39FF01FF10FF27FEF7FEEF :10FEF00018FEF9FEF7FEF75F39DC6E9760D7005FFA :10FF0000398601976E9661976FDC31DD70C60439D2 :10FF1000DE6E18CE00715FA60018A7000818085CF6 :10FF2000D17026F3CB0339CE007118DE6E20E7DEE8 :10FF30006408DF641523FB3BDE6208DF621523FDE6 :10FF40003B5F96348D0296333716481B3348594829 :10FF50005939D6025454CE03003A8D64C4FC584932 :10FF6000584924026A40E32024026C407D006A263E :10FF70000C581659A64049ED004F5FA740ED20D61A :10FF800002CB082A07966A8B02976A5FD70215236D :10FF90007FDC16C30140DD1624257A006626031493 :10FFA00005107A00672603140520DE6809DF68273C :10FFB000088D8ED1612708D7617F00601505C03B91 :10FFC0001402048D068D00150204177D0029D62A1F :10FFD000D72A4848474739FFFFFFFFFFFFFFFFFFD2 :10FFE000FFFFFFFFFFFFFFFFFF52FE18FF38FF2F4D :10FFF000FE18FE18FE18FE18FE18FE18FE18FE1851 :00000001FF dasm-2.20.14.1/test/segfault.asm000066400000000000000000000001031375233463600162440ustar00rootroot00000000000000; segfault str set "" str eqm str + "\nAAAAA" echo str ; EOF dasm-2.20.14.1/test/segfault.fail000066400000000000000000000000021375233463600163750ustar00rootroot0000000000000038dasm-2.20.14.1/test/selftest/000077500000000000000000000000001375233463600155675ustar00rootroot00000000000000dasm-2.20.14.1/test/selftest/0_no_assembly.asm000066400000000000000000000001761375233463600210270ustar00rootroot00000000000000 .processor fantasy .org 0 ; ; fake processor in order to abort assembly, testing the test-enginge for aborted assembly ; dasm-2.20.14.1/test/selftest/0_no_assembly.bin.ref000066400000000000000000000000001375233463600215540ustar00rootroot00000000000000dasm-2.20.14.1/test/selftest/1_no_binary.asm000066400000000000000000000001561375233463600204730ustar00rootroot00000000000000 .processor 6502 .org 0 ; ; should create a zero sized file, testing the test-enginge for zero-binaries ; dasm-2.20.14.1/test/selftest/1_no_binary.bin.ref000066400000000000000000000000001375233463600212220ustar00rootroot00000000000000dasm-2.20.14.1/test/selftest/2_hexref_missing.asm000066400000000000000000000001661375233463600215270ustar00rootroot00000000000000 .processor 6502 .org 0 DC.w 1234 ; ; should create a file, testing the test-enginge for missing hex reference ; dasm-2.20.14.1/test/selftest/2_hexref_missing.bin.ref000066400000000000000000000000001375233463600222550ustar00rootroot00000000000000dasm-2.20.14.1/test/selftest/3_binary_different.asm000066400000000000000000000001501375233463600220210ustar00rootroot00000000000000 .ORG DC.w 1234 ; ; everything OK here, testing the test-enginge for different binary reference ;dasm-2.20.14.1/test/selftest/3_binary_different.bin.ref000066400000000000000000000000341375233463600225650ustar00rootroot00000000000000; ; this must be different ;dasm-2.20.14.1/test/selftest/3_binary_different.hex.ref000066400000000000000000000000361375233463600226030ustar00rootroot00000000000000:0200000004D228 :00000001FF dasm-2.20.14.1/test/selftest/4_finally_OK.asm000066400000000000000000000001501375233463600205370ustar00rootroot00000000000000 .ORG DC.w 1234 ; ; everything OK here, testing the test-enginge for different binary reference ;dasm-2.20.14.1/test/selftest/4_finally_OK.bin.ref000066400000000000000000000000041375233463600213000ustar00rootroot00000000000000dasm-2.20.14.1/test/selftest/4_finally_OK.hex.ref000066400000000000000000000000361375233463600213210ustar00rootroot00000000000000:0200000004D228 :00000001FF dasm-2.20.14.1/test/selftest/5_must_fail.asm000066400000000000000000000001351375233463600204770ustar00rootroot00000000000000 .ORG DC.w 1234 ; ; everything OK here, testing the test-enginge for false positives ;dasm-2.20.14.1/test/selftest/5_must_fail.fail000066400000000000000000000000011375233463600206220ustar00rootroot000000000000005dasm-2.20.14.1/test/selftest/6_false_positive_fail.args000066400000000000000000000000221375233463600226730ustar00rootroot00000000000000ARGS=" && exit -1"dasm-2.20.14.1/test/selftest/6_false_positive_fail.asm000066400000000000000000000002431375233463600225240ustar00rootroot00000000000000 .processor fantasy .org 0 ; ; fake processor in order to abort assembly, testing the test-enginge for wrong error level by faking command-line arguments ; ; dasm-2.20.14.1/test/selftest/6_false_positive_fail.fail000066400000000000000000000000031375233463600226510ustar00rootroot0000000000000015 dasm-2.20.14.1/test/selftest/7_false_positive_fail.asm000066400000000000000000000002431375233463600225250ustar00rootroot00000000000000 .processor fantasy .org 0 ; ; fake processor in order to abort assembly, testing the test-enginge for wrong error level by faking command-line arguments ; ; dasm-2.20.14.1/test/selftest/7_false_positive_fail.fail000066400000000000000000000000001375233463600226470ustar00rootroot00000000000000dasm-2.20.14.1/test/selftest/8_false_positive_OK.asm000066400000000000000000000002431375233463600221240ustar00rootroot00000000000000 .processor fantasy .org 0 ; ; fake processor in order to abort assembly, testing the test-enginge for wrong error level by faking command-line arguments ; ; dasm-2.20.14.1/test/selftest/8_false_positive_OK.fail000066400000000000000000000000031375233463600222510ustar00rootroot0000000000000027 dasm-2.20.14.1/test/selftest/Makefile000066400000000000000000000004101375233463600172220ustar00rootroot00000000000000# # here are the tests for testing the test-script # DASM=../../bin/dasm FTOHEX=../../bin/ftohex test: @../run_tests.sh -R ../../bin -S 7 %.bin: %.asm $(DASM) $< -o$@ -f1 %.hex: %.bin $(FTOHEX) 1 $< $@ clean: rm -rf *.bin *.hex *.list.txt *.diff *.out dasm-2.20.14.1/test/stabx.asm000066400000000000000000000001131375233463600155540ustar00rootroot00000000000000 .TRACE on .processor 6502 RESP1 = $100 .ORG 0 sta.bx RESP1,x dasm-2.20.14.1/test/stabx.fail000066400000000000000000000000011375233463600157030ustar00rootroot000000000000005dasm-2.20.14.1/test/staby.asm000066400000000000000000000001151375233463600155570ustar00rootroot00000000000000 .TRACE on .processor 68hc11 RESP1 = $100 .ORG 0 stab.y RESP1,y dasm-2.20.14.1/test/staby.fail000066400000000000000000000000011375233463600157040ustar00rootroot000000000000005dasm-2.20.14.1/test/staby2.asm000066400000000000000000000001161375233463600156420ustar00rootroot00000000000000 .TRACE on .processor 68hc11 RESP1 = $10 .ORG 0 stab.wy RESP1,y dasm-2.20.14.1/test/staby2.fail000066400000000000000000000000011375233463600157660ustar00rootroot000000000000003dasm-2.20.14.1/test/staby3.asm000066400000000000000000000002371375233463600156470ustar00rootroot00000000000000 .TRACE on .processor 6502 RESP0 = $10 .ORG 0 sta.by (RESP0),y ; wrong statement forced(byteaddr_Y) but coded(indirect_byte_Y) dasm-2.20.14.1/test/staby3.fail000066400000000000000000000000011375233463600157670ustar00rootroot000000000000003dasm-2.20.14.1/test/staby4.asm000066400000000000000000000002331375233463600156440ustar00rootroot00000000000000 .TRACE on .processor 6502 RESP1 = $100 .ORG 0 sta.by RESP1,y ; wrong statement forced(byteaddr_Y) but implied(wordaddr_Y) dasm-2.20.14.1/test/staby4.fail000066400000000000000000000000011375233463600157700ustar00rootroot000000000000003dasm-2.20.14.1/test/stawx.asm000066400000000000000000000002261375233463600156060ustar00rootroot00000000000000 .TRACE on .processor 6502 RESP0 = $10 RESP1 = $100 .ORG 0 sta.wx RESP0,x sta.w RESP0,x sta RESP1,x lda (1),Y lda (RESP0),Y dasm-2.20.14.1/test/stawx.bin.ref000066400000000000000000000000171375233463600163470ustar00rootroot00000000000000dasm-2.20.14.1/test/stawx.hex.ref000066400000000000000000000000621375233463600163630ustar00rootroot00000000000000:0D0000009D10009D10009D0001B101B11088 :00000001FF dasm-2.20.14.1/test/stawy.asm000066400000000000000000000002251375233463600156060ustar00rootroot00000000000000 .TRACE on .processor 6502 RESP0 = $10 .ORG 0 sta.w (RESP0),y ; wrong statement forced(wordaddr) but coded(indirect_byte_Y) dasm-2.20.14.1/test/stawy.fail000066400000000000000000000000011375233463600157310ustar00rootroot000000000000003dasm-2.20.14.1/test/stawy2.asm000066400000000000000000000002261375233463600156710ustar00rootroot00000000000000 .TRACE on .processor 6502 RESP1 = $100 .ORG 0 sta (RESP1),y ; wrong statement implied(indirect_word_Y) but not available dasm-2.20.14.1/test/stawy2.fail000066400000000000000000000000011375233463600160130ustar00rootroot000000000000005dasm-2.20.14.1/test/stawy3.asm000066400000000000000000000002531375233463600156720ustar00rootroot00000000000000 .TRACE on .processor 6502 RESP0 = $10 RESP1 = $100 .ORG 0 sta.wy (RESP0),y ; wrong statement forced(wordaddr_Y) but coded(indirect_byte_Y) dasm-2.20.14.1/test/stawy3.fail000066400000000000000000000000011375233463600160140ustar00rootroot000000000000003dasm-2.20.14.1/test/string_conversion.asm000066400000000000000000000033251375233463600202160ustar00rootroot00000000000000; Bug in string conversion. ; Reported 2007/08/25 by Eduardo Casino Almao ; I've found a bug in the string conversion feature ([exp]d) I'm using ; version 2.20.10b ; ; Basically, if exp is a not-yet-resolved label, the assembler aborts with ; "program.a: (XX): error Label mismatch... processor 6502 org $0801 word endprg ; pointer to next line word 1968 ; line number byte $9e ; SYS token byte [start]d ; ASCII of SYS address byte " TESTPROG BY TESTSOFT" ; Show copyright endprg byte 0,0,0 ; End of BASIC program start rts ; The assembler outputs: ; ; DASM V2.20.10, Macro Assembler (C)1988-2004 ; testcase.a (13): error: Label mismatch... ; --> endprg 081c ; testcase.a (16): error: Label mismatch... ; --> start 081f ; Unrecoverable error(s) in pass, aborting assembly! ; Complete. ; ; The offending code is in symbols.c, lines 203 to 210. I think that there ; should be an extra condition, so if in the previous pass it has been a ; string conversion, just go for another pass. ; ; -----CUT----- ; /* ; * If we had an unevaluated IF expression in the ; * previous pass, don't complain about phase errors ; * too loudly. ; */ ; 203 if (F_verbose >= 1 || !(Redo_if & (REASON_OBSCURE))) ; { ; char sBuffer[ MAX_SYM_LEN * 2 ]; ; sprintf( sBuffer, "%s %s", sym->name, sftos( sym->value, 0 ) ); ; /*, sftos(sym->value, ; sym->flags) ); , sftos(pc, cflags & 7));*/ ; asmerr( ERROR_LABEL_MISMATCH, false, sBuffer ); ; 210 } ; ++Redo; ; Redo_why |= REASON_PHASE_ERROR; ; -----CUT----- dasm-2.20.14.1/test/string_conversion.bin.ref000066400000000000000000000000441375233463600207540ustar00rootroot000000000000002082 TESTPROG BY TESTSOFT`dasm-2.20.14.1/test/string_conversion.hex.ref000066400000000000000000000001701375233463600207700ustar00rootroot00000000000000:100801001F08B0079E32303832205445535450529D :100811004F472042592054455354534F46540000EA :02082100006075 :00000001FF dasm-2.20.14.1/test/string_table.asm000066400000000000000000000006011375233463600171120ustar00rootroot00000000000000 .ORG $e295 _Str0Desc: DC.b _Str1Desc - _Str0Desc,$03 DC.b $09,$04 _Str1Desc: DC.b _Str2Desc - _Str1Desc,$03 ; $28,$03 DC.w "MCT Electronikladen" _Str2Desc: DC.b _StrTable - _Str2Desc,$03 ; $2e,$03 DC.w "USB08 Evaluation Board" _StrTable: _Str0Vec DC.w _Str0Desc ; .. $e2ef e2 95 _Str1Vec DC.w _Str1Desc ; .. $e2f1 e2 99 _Str2Vec DC.w _Str2Desc ; .. $e2f3 e2 c1 dasm-2.20.14.1/test/string_table.bin.ref000066400000000000000000000001421375233463600176550ustar00rootroot00000000000000 (MCT Electronikladen.USB08 Evaluation Boarddasm-2.20.14.1/test/string_table.hex.ref000066400000000000000000000004331375233463600176740ustar00rootroot00000000000000:10E29500040309042803004D0043005400200045F1 :10E2A500006C0065006300740072006F006E006909 :10E2B500006B006C006100640065006E2E03005564 :10E2C5000053004200300038002000450076006110 :10E2D500006C0075006100740069006F006E00201D :10E2E5000042006F006100720064E295E299E2C1AC :00000001FF dasm-2.20.14.1/test/stringify.asm000066400000000000000000000003431375233463600164560ustar00rootroot00000000000000 .PROCESSOR 6502 .ORG 1024 .word 1968 .word endprg .byte $FF ; make odd alignment .byte [MainStart]d ; ASCII representation of MainStart .byte " TEST ",0 endprg: .byte 0,0,0 .ORG 1234 MainStart: rts dasm-2.20.14.1/test/stringify.bin.ref000066400000000000000000000003251375233463600172210ustar00rootroot000000000000001234 TEST `dasm-2.20.14.1/test/stringify.hex.ref000066400000000000000000000011321375233463600172320ustar00rootroot00000000000000:10040000B0071004FF3132333420544553542000D8 :10041000000000FFFFFFFFFFFFFFFFFFFFFFFFFFE9 :10042000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC :10043000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC :10044000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC :10045000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC :10046000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C :10047000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C :10048000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C :10049000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C :1004A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C :1004B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C :1004C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C :0304D000FFFF60CB :00000001FF dasm-2.20.14.1/test/suite6303.asm000066400000000000000000000103721375233463600161100ustar00rootroot00000000000000 processor hd6303 org 0 adda #10 ; 8B 0A adda 10 ; 9B 0A adda 10,x ; AB 0A adda 1000 ; BB 03 E8 addb #10 ; CB 0A addb 10 ; DB 0A addb 10,x ; EB 0A addb 1000 ; FB 03 E8 addd #1000 ; C3 03 E8 addd 10 ; D3 0A addd 10,x ; E3 0A addd 1000 ; F3 03 E8 aba ; 1B adca #10 ; 89 0A adca 10 ; 99 0A adca 10,x ; A9 0A adca 1000 ; B9 03 E8 adcb #10 ; C9 adcb 10 ; D9 adcb 10,x ; E9 adcb 1000 ; F9 03 E8 anda #10 ; 84 0A anda 10 ; 94 0A anda 10,x ; A4 0A anda 1000 ; B4 03 E8 andb #10 ; C4 0A andb 10 ; D4 0A andb 10,x ; E4 0A andb 1000 ; F4 03 E8 bita #10 ; 85 0A bita 10 ; 95 0A bita 10,x ; A5 0A bita 1000 ; B5 03 E8 bitb #10 ; C5 0A bitb 10 ; D5 0A bitb 10,x ; E5 0A bitb 1000 ; F5 03 E8 clr 10,x ; 6F 0A clr 1000 ; 7F 03 E8 clra ; 4F clrb ; 5F cmpa #10 ; 81 0A cmpa 10 ; 91 0A cmpa 10,x ; A1 0A cmpa 1000 ; B1 03 E8 cmpb #10 ; C1 0A cmpb 10 ; D1 0A cmpb 10,x ; E1 0A cmpb 1000 ; F1 03 E8 cba ; 11 com 10,x ; 63 0A com 1000 ; 73 03 E8 coma ; 43 comb ; 53 neg 10,x ; 60 0A neg 1000 ; 70 03 E8 nega ; 40 negb ; 50 daa ; 19 dec 10,x ; 6A 0A dec 1000 ; 7A 03 E8 deca ; 4A decb ; 5A eora #10 ; 88 0A eora 10 ; 98 0A eora 10,x ; A8 0A eora 1000 ; B8 03 E8 eorb #10 ; C8 0A eorb 10 ; D8 0A eorb 10,x ; E8 0A eorb 1000 ; F8 03 E8 inc 10,x ; 6C 0A inc 1000 ; 7C 03 E8 inca ; 4C incb ; 5C ldaa #10 ; 86 0A ldaa 10 ; 96 0A ldaa 10,x ; A6 0A ldaa 1000 ; B6 03 E8 ldab #10 ; C6 0A ldab 10 ; D6 0A ldab 10,x ; E6 0A ldab 1000 ; F6 03 E8 ldd #1000 ; CC 03 E8 ldd 10 ; DC 0A ldd 10,x ; EC 0A ldd 1000 ; FC 03 E8 mul ; 3D oraa #10 ; 8A 0A oraa 10 ; 9A 0A oraa 10,x ; AA 0A oraa 1000 ; BA 03 E8 orab #10 ; CA 0A orab 10 ; DA 0A orab 10,x ; EA 0A orab 1000 ; FA 03 E8 psha ; 36 pshb ; 37 pula ; 32 pulb ; 33 rol 10,x ; 69 0A rol 1000 ; 79 03 E8 rola ; 49 rolb ; 59 ror 10,x ; 66 0A ror 1000 ; 76 03 E8 rora ; 46 rorb ; 56 asl 10,x ; 68 0A asl 1000 ; 78 03 E8 asla ; 48 aslb ; 58 asld ; 05 asr 10,x ; 67 0A asr 1000 ; 77 03 E8 asra ; 47 asrb ; 57 lsr 10,x ; 64 0A lsr 1000 ; 74 03 E8 lsra ; 44 lsrb ; 54 lsrd ; 04 staa 10 ; 97 0A staa 10,x ; A7 0A staa 1000 ; B7 03 E8 stab 10 ; D7 0A stab 10,x ; E7 0A stab 1000 ; F7 03 E8 std 10 ; DD 0A std 10,x ; ED 0A std 1000 ; FD 03 E8 suba #10 ; 80 0A suba 10 ; 90 0A suba 10,x ; A0 0A suba 1000 ; B0 03 E8 subb #10 ; C0 0A subb 10 ; D0 0A subb 10,x ; E0 0A subb 1000 ; F0 03 E8 subd #1000 ; 83 03 E8 subd 10 ; 93 0A subd 10,x ; A3 0A subd 1000 ; B3 03 E8 sba ; 10 sbca #10 ; 82 0A sbca 10 ; 92 0A sbca 10,x ; A2 0A sbca 1000 ; B2 03 E8 sbcb #10 ; C2 0A sbcb 10 ; D2 0A sbcb 10,x ; E2 0A sbcb 1000 ; F2 03 E8 tab ; 16 tba ; 17 tst 10,x ; 6D 0A tst 1000 ; 7D 03 E8 tsta ; 4D tstb ; 5D aim 10 ; 71 0A aim 10,x ; 61 0A oim 10 ; 72 0A oim 10,x ; 62 0A eim 10 ; 75 0A eim 10,x ; 65 0A tim 10 ; 7B 0A tim 10,x ; 6B 0A cpx #1000 ; 8C 03 E8 cpx 10 ; 9C 0A cpx 10,x ; AC 0A cpx 1000 ; BC 03 E8 dex ; 09 des ; 34 inx ; 08 ins ; 31 ldx #1000 ; CE 03 E8 ldx 10 ; DE 0A ldx 10,x ; EE 0A ldx 1000 ; FE 03 E8 lds #1000 ; 8E 03 E8 lds 10 ; 9E 0A lds 10,x ; AE 0A lds 1000 ; BE 03 E8 stx 10 ; DF 0A stx 10,x ; EF 0A stx 1000 ; FF 03 E8 sts 10 ; 9F 0A sts 10,x ; AF 0A sts 1000 ; BF 03 E8 txs ; 35 tsx ; 30 abx ; 3A pshx ; 3C pulx ; 38 xgdx ; 18 bra . ; 20 FE brn . ; 21 FE bcc . ; 24 FE bcs . ; 25 FE beq . ; 27 FE bge . ; 2C FE bgt . ; 2E FE bhi . ; 22 FE ble . ; 2F FE bls . ; 23 FE blt . ; 2D FE bmi . ; 2B FE bne . ; 26 FE bvc . ; 28 FE bvs . ; 29 FE bpl . ; 2A FE bsr . ; 8D FE jmp 10,x ; 6E 0A jmp 1000 ; 7E 03 E8 jsr 10 ; 9D 0A jsr 10,x ; AD 0A jsr 1000 ; BD 03 E8 nop ; 01 rti ; 3B rts ; 39 swi ; 3F wai ; 3E slp ; 1A clc ; 0C cli ; 0E clv ; 0A sec ; 0D sei ; 0F sev ; 0B tap ; 06 tpa ; 07 dasm-2.20.14.1/test/suite6303.bin.ref000066400000000000000000000007051375233463600166520ustar00rootroot00000000000000         o O_  c sCS` p@Pj zJZ  l |L\   =  6723i yIYf vFVh xHXg wGWd tDT        m }M]q a r b u e { k   41    50:<8 !$%',."/#-+&()*n ~ ;9?>   dasm-2.20.14.1/test/suite6303.hex.ref000066400000000000000000000024141375233463600166650ustar00rootroot00000000000000:100000008B0A9B0AAB0ABB03E8CB0ADB0AEB0AFBB1 :1000100003E8C303E8D30AE30AF303E81B890A9958 :100020000AA90AB903E8C90AD90AE90AF903E8845E :100030000A940AA40AB403E8C40AD40AE40AF4033A :10004000E8850A950AA50AB503E8C50AD50AE50AAE :10005000F503E86F0A7F03E84F5F810A910AA10A5E :10006000B103E8C10AD10AE10AF103E811630A7396 :1000700003E84353600A7003E84050196A0A7A03A0 :10008000E84A5A880A980AA80AB803E8C80AD80AA7 :10009000E80AF803E86C0A7C03E84C5C860A960AD6 :1000A000A60AB603E8C60AD60AE60AF603E8CC03AF :1000B000E8DC0AEC0AFC03E83D8A0A9A0AAA0ABAB2 :1000C00003E8CA0ADA0AEA0AFA03E8363732336979 :1000D0000A7903E84959660A7603E84656680A78B9 :1000E00003E8485805670A7703E84757640A74032A :1000F000E8445404970AA70AB703E8D70AE70AF7BF :1001000003E8DD0AED0AFD03E8800A900AA00AB0C0 :1001100003E8C00AD00AE00AF003E88303E8930A80 :10012000A30AB303E810820A920AA20AB203E8C241 :100130000AD20AE20AF203E816176D0A7D03E84DB7 :100140005D710A610A720A620A750A650A7B0A6BA6 :100150000A8C03E89C0AAC0ABC03E809340831CED7 :1001600003E8DE0AEE0AFE03E88E03E89E0AAE0A02 :10017000BE03E8DF0AEF0AFF03E89F0AAF0ABF03E6 :10018000E835303A3C381820FE21FE24FE25FE27B3 :10019000FE2CFE2EFE22FE2FFE23FE2DFE2BFE2623 :1001A000FE28FE29FE2AFE8DFE6E0A7E03E89D0AC9 :1001B000AD0ABD03E8013B393F3E1A0C0E0A0D0F94 :0301C0000B060724 :00000001FF dasm-2.20.14.1/test/suite6502.asm000066400000000000000000000031551375233463600161120ustar00rootroot00000000000000 ; TEST ADDRESSING MODES processor 6502 org 0 adc #1 adc 1 adc 1,x adc 1,y ;absolute adc 1000 adc 1000,x adc 1000,y adc (1,x) adc (1),y and #1 and 1 and 1,x and 1,y ;absolute and 1000 and 1000,x and 1000,y and (1,x) and (1),y asl asl 1 asl 1,x asl 1000 asl 1000,x bcc . bcs . beq . bit 1 bit 1000 bmi . bne . bpl . brk bvc . bvs . clc cld cli clv cmp #1 cmp 1 cmp 1,x cmp 1,y ;absolute cmp 1000 cmp 1000,x cmp 1000,y cmp (1,x) cmp (1),y cpx #1 cpx 1 cpx 1000 cpy #1 cpy 1 cpy 1000 dec 1 dec 1,x dec 1000 dec 1000,x dex dey eor #1 eor 1 eor 1,x eor 1,y ;absolute eor 1000 eor 1000,x eor 1000,y eor (1,x) eor (1),y inc 1 inc 1,x inc 1000 inc 1000,x inx iny jmp 1 ;absolute jmp 1000 jmp (1) ;absolute jmp (1000) jsr 1 ;absolute jsr 1000 lda #1 lda 1 lda 1,x lda 1,y ;absolute lda 1000 lda 1000,x lda 1000,y lda (1,x) lda (1),y ldx #1 ldx 1 ldx 1,y ldx 1000 ldx 1000,y ldy #1 ldy 1 ldy 1,x ldy 1000 ldy 1000,x lsr lsr 1 lsr 1,x lsr 1000 lsr 1000,x nop ora #1 ora 1 ora 1,x ora 1,y ;absolute ora 1000 ora 1000,x ora 1000,y ora (1,x) ora (1),y pha php pla plp rol rol 1 rol 1,x rol 1000 rol 1000,x ror ror 1 ror 1,x ror 1000 ror 1000,x rti rts sbc #1 sbc 1 sbc 1,x sbc 1,y ;absolute sbc 1000 sbc 1000,x sbc 1000,y sbc (1,x) sbc (1),y sec sed sei sta 1 sta 1,x sta 1,y ;absolute sta 1000 sta 1000,x sta 1000,y sta (1,x) sta (1),y stx 1 stx 1,y stx 1000 sty 1 sty 1,x sty 1000 tax tay tsx txa txs tya dasm-2.20.14.1/test/suite6502.bin.ref000066400000000000000000000005441375233463600166540ustar00rootroot00000000000000ieuym}yaq)%59-=9!1 $,0PpXʈIEUYM]YAQLLll  JFVN^  Hh(*&6.>jfvn~@`8xdasm-2.20.14.1/test/suite6502.hex.ref000066400000000000000000000017741375233463600166760ustar00rootroot00000000000000:100000006901650175017901006DE8037DE80379F7 :10001000E803610171012901250135013901002D34 :10002000E8033DE80339E803210131010A0601161E :10003000010EE8031EE80390FEB0FEF0FE24012C42 :10004000E80330FED0FE10FE0050FE70FE18D858B7 :10005000B8C901C501D501D90100CDE803DDE80328 :10006000D9E803C101D101E001E401ECE803C001DA :10007000C401CCE803C601D601CEE803DEE803CA1A :10008000884901450155015901004DE8035DE80328 :1000900059E80341015101E601F601EEE803FEE8EB :1000A00003E8C84C01004CE8036C01006CE8032035 :1000B000010020E803A901A501B501B90100ADE8DF :1000C00003BDE803B9E803A101B101A201A601B68D :1000D00001AEE803BEE803A001A401B401ACE8034B :1000E000BCE8034A460156014EE8035EE803EA090C :1000F00001050115011901000DE8031DE80319E8C8 :100100000301011101480868282A260136012EE85A :10011000033EE8036A660176016EE8037EE8034069 :1001200060E901E501F501F90100EDE803FDE803EF :10013000F9E803E101F10138F878850195019901A9 :10014000008DE8039DE80399E80381019101860190 :1001500096018EE803840194018CE803AAA8BA8A68 :020160009A986B :00000001FF dasm-2.20.14.1/test/suite68705.asm000066400000000000000000000031341375233463600162040ustar00rootroot00000000000000 processor 68705 org 0 adc #10 adc 10 adc 1000 adc ,x adc 1,x adc 1000,x add #10 add 10 add 1000 add ,x add 1,x add 1000,x and #10 and 10 and 1000 and ,x and 1,x and 1000,x asla aslx asl 10 asl ,x asl 10,x asra asrx asr 10 asr ,x asr 10,x bcc . bclr 1,23 bcs . beq . bhcc . bhcs . bhi . bhs . bih . bil . bit #10 bit 10 bit 1000 bit ,x bit 1,x bit 1000,x blo . bls . bmc . bmi . bms . bne . bpl . bra . brn . brclr 1,10,. brset 1,10,. bset 1,10 bsr . clc cli clra clrx clr 10 clr ,x clr 10,x cmp #10 cmp 10 cmp 1000 cmp ,x cmp 1,x cmp 1000,x coma comx com 10 com ,x com 10,x cpx #10 cpx 10 cpx 1000 cpx ,x cpx 10,x cpx 1000,x deca decx dec 10 dec ,x dec 10,x eor #10 eor 10 eor 1000 eor ,x eor 10,x eor 1000,x inca incx inc 10 inc ,x inc 10,x jmp 10 jmp 1000 jmp ,x jmp 10,x jmp 1000,x jsr 10 jsr 1000 jsr ,x jsr 10,x jsr 1000,x lda #10 lda 10 lda 1000 lda ,x lda 10,x lda 1000,x ldx #10 ldx 10 ldx 1000 ldx ,x ldx 10,x ldx 1000,x lsla lslx lsl 10 lsl ,x lsl 10,x lsra lsrx lsr 10 lsr ,x lsr 10,x nega negx neg 10 neg ,x neg 10,x nop ora #10 ora 10 ora 1000 ora ,x ora 10,x ora 1000,x rola rolx rol 10 rol ,x rol 10,x rora rorx ror 10 ror ,x ror 10,x rsp rti rts sbc #10 sbc 10 sbc 1000 sbc ,x sbc 10,x sbc 1000,x sec sei sta 10 sta 1000 sta ,x sta 10,x sta 1000,x stx 10 stx 1000 stx ,x stx 10,x stx 1000,x sub #10 sub 10 sub 1000 sub ,x sub 10,x sub 1000,x swi tax tsta tstx tst 10 tst ,x tst 10,x txa dasm-2.20.14.1/test/suite68705.bin.ref000066400000000000000000000005311375233463600167450ustar00rootroot00000000000000   HX8 xh GW7 wg $%'()"$/. %#,+-&* !   O_? o CS3 sc  JZ: zj  L\< |l        HX8 xh DT4 td @P0 p`  IY9 yi FV6 vf  虛      胗M]= }m dasm-2.20.14.1/test/suite68705.hex.ref000066400000000000000000000017311375233463600167640ustar00rootroot00000000000000:10000000A90AB90AC903E8F9E901D903E8AB0ABBAF :100010000ACB03E8FBEB01DB03E8A40AB40AC40340 :10002000E8F4E401D403E84858380A78680A4757E6 :10003000370A77670A24FE131725FE27FE28FE29B4 :10004000FE22FE24FE2FFE2EFEA50AB50AC503E8F9 :10005000F5E501D503E825FE23FE2CFE2BFE2DFE43 :1000600026FE2AFE20FE21FE030AFD020AFD120AD8 :10007000ADFE989A4F5F3F0A7F6F0AA10AB10AC18D :1000800003E8F1E101D103E84353330A73630AA3A0 :100090000AB30AC303E8F3E30AD303E84A5A3A0A65 :1000A0007A6A0AA80AB80AC803E8F8E80AD803E88E :1000B0004C5C3C0A7C6C0ABC0ACC03E8FCEC0ADC15 :1000C00003E8BD0ACD03E8FDED0ADD03E8A60AB6A4 :1000D0000AC603E8F6E60AD603E8AE0ABE0ACE036D :1000E000E8FEEE0ADE03E84858380A78680A445405 :1000F000340A74640A4050300A70600A9DAA0ABA31 :100100000ACA03E8FAEA0ADA03E84959390A7969B6 :100110000A4656360A76660A9C8081A20AB20AC24C :1001200003E8F2E20AD203E8999BB70AC703E8F7AB :10013000E70AD703E8BF0ACF03E8FFEF0ADF03E8C7 :10014000A00AB00AC003E8F0E00AD003E883974DA4 :070150005D3D0A7D6D0A9F71 :00000001FF dasm-2.20.14.1/test/suite68hc11.asm000066400000000000000000000062601375233463600164300ustar00rootroot00000000000000 ; TEST ADDRESSING MODES processor 68HC11 org 0 aba abx aby adca #1 adca 1 adca 1000 adca 1,x adca 1,y adcb #1 adcb 1 adcb 1000 adcb 1,x adcb 1,y adda #1 adda 1 adda 1000 adda 1,x adda 1,y addb #1 addb 1 addb 1000 addb [X+1] addb [Y+1] addd #1000 addd 1 addd 1000 addd 1,x addd 1,y anda #1 anda 1 anda 1000 anda 1,x anda 1,y andb #1 andb 1 andb 1000 andb 1,x andb 1,y asla aslb asl 1 ;extended asl 1000 asl 1,x asl 1,y asld asra asrb asr 1 ;extended asr 1000 asr 1,x asr 1,y bcc . bclr 1, $11 bclr 1,x ,$22 bclr 1,y ,$33 bcs . beq . bge . bgt . bhi . bhs . bita #1 bita 1 bita 1000 bita 1,x bita 1,y bitb #1 bitb 1 bitb 1000 bitb 1,x bitb 1,y ble . blo . bls . blt . bmi . bne . bpl . bra . brclr 1, $11, . ; br??? direct-location, mask, branch-to brclr 1,x , $22, . brclr 1,y , $33, . brn . brset 1, $11, . brset 1,x , $22, . brset 1,y , $33, . bset 1, $11 bset 1,x, $22 bset 1,y, $33 bsr . bvc . bvs . cba clc cli clra clrb clr 1 ; extended clr 1000 clr 1,x clr 1,y clv cmpa #1 cmpa 1 cmpa 1000 cmpa 1,x cmpa 1,y cmpb #1 cmpb 1 cmpb 1000 cmpb 1,x cmpb 1,y coma comb com 1 ; extended com 1000 com 1,x com 1,y cpd #1 ; 16 bits cpd #1000 cpd 1 cpd 1000 cpd 1,x cpd 1,y cpx #1 ; 16 bits cpx #1000 cpx 1 cpx 1000 cpx 1,x cpx 1,y cpy #1 ; 16 bits cpy #1000 cpy 1 cpy 1000 cpy 1,x cpy 1,y daa deca decb dec 1 ; extended dec 1000 dec 1,x dec 1,y des dex dey eora #1 eora 1 eora 1000 eora 1,x eora 1,y eorb #1 eorb 1 eorb 1000 eorb 1,x eorb 1,y fdiv idiv inca incb inc 1 ;extended inc 1000 inc 1,x inc 1,y ins inx iny jmp 1 ;extended jmp 1000 jmp 1,x jmp 1,y jsr 1 jsr 1000 jsr 1,x jsr 1,y ldaa #1 ldaa 1 ldaa 1000 ldaa 1,x ldaa 1,y ldab #1 ldab 1 ldab 1000 ldab 1,x ldab 1,y ldd #1 ;16 bits ldd #1000 ldd 1 ldd 1000 ldd 1,x ldd 1,y lds #1 ;16 bits lds #1000 lds 1 lds 1000 lds 1,x lds 1,y ldx #1 ;16 bits ldx #1000 ldx 1 ldx 1000 ldx 1,x ldx 1,y ldy #1 ;16 bits ldy #1000 ldy 1 ldy 1000 ldy 1,x ldy 1,y lsla lslb lsl 1 ;extended lsl 1000 lsl 1,x lsl 1,y lsld lsra lsrb lsr 1 ;extended lsr 1000 lsr 1,x lsr 1,y lsrd mul nega negb neg 1 ;extended neg 1000 neg 1,x neg 1,y nop oraa #1 oraa 1 oraa 1000 oraa 1,x oraa 1,y orab #1 orab 1 orab 1000 orab 1,x orab 1,y psha pshb pshx pshy pula pulb pulx puly rola rolb rol 1 ;extended rol 1000 rol 1,x rol 1,y rora rorb ror 1 ;extended ror 1000 ror 1,x ror 1,y rti rts sba sbca #1 sbca 1 sbca 1000 sbca 1,x sbca 1,y sbcb #1 sbcb 1 sbcb 1000 sbcb 1,x sbcb 1,y sec sei sev staa 1 staa 1000 staa 1,x staa 1,y stab 1 stab 1000 stab 1,x stab 1,y std 1 std 1000 std 1,x std 1,y stop sts 1 sts 1000 sts 1,x sts 1,y stx 1 stx 1000 stx 1,x stx 1,y sty 1 sty 1000 sty 1,x sty 1,y suba #1 suba 1 suba 1000 suba 1,x suba 1,y subb #1 subb 1 subb 1000 subb 1,x subb 1,y subd #1 ;extended subd #1000 subd 1 subd 1000 subd 1,x subd 1,y swi tab tap tba test tpa tsta tstb tst 1 ;extended tst 1000 tst 1,x tst 1,y tsx tsy txs tys wai xgdx xgdy dasm-2.20.14.1/test/suite68hc11.bin.ref000066400000000000000000000014131375233463600171660ustar00rootroot00000000000000::HXxxhhGWwwgg$"3%',."$/%#-+&* "3!"3"3() O_oo CSssccͣͬJZzzjj4  L\||ll1~~nnHXxxhhDTttdd=@Ppp``67<<2388IYyyiiFVvvff;9  ϟ?M]}}mm0055>dasm-2.20.14.1/test/suite68hc11.hex.ref000066400000000000000000000042341375233463600172060ustar00rootroot00000000000000:100000001B3A183A89019901B903E8A90118A90115 :10001000C901D901F903E8E90118E9018B019B0144 :10002000BB03E8AB0118AB01CB01DB01FB03E8EB41 :100030000118EB01C303E8D301F303E8E30118E37C :100040000184019401B403E8A40118A401C401D4FB :1000500001F403E8E40118E401485878000178034A :10006000E868011868010547577700017703E867DA :100070000118670124FE1501111D0122181D01330D :1000800025FE27FE2CFE2EFE22FE24FE8501950174 :10009000B503E8A50118A501C501D501F503E8E5FB :1000A0000118E5012FFE25FE23FE2DFE2BFE26FE68 :1000B0002AFE20FE130111FC1F0122FC181F013330 :1000C000FB21FE120111FC1E0122FC181E0133FB54 :1000D0001401111C0122181C01338DFE28FE29FE7B :1000E000110C0E4F5F7F00017F03E86F01186F0155 :1000F0000A81019101B103E8A10118A101C101D157 :1001000001F103E8E10118E10143537300017303B6 :10011000E863011863011A8300011A8303E81A9344 :10012000011AB303E81AA301CDA3018C00018C03CB :10013000E89C01BC03E8AC01CDAC01188C000118AF :100140008C03E8189C0118BC03E81AAC0118AC0138 :10015000194A5A7A00017A03E86A01186A013409D7 :10016000180988019801B803E8A80118A801C80176 :10017000D801F803E8E80118E80103024C5C7C00B0 :10018000017C03E86C01186C01310818087E00013D :100190007E03E86E01186E019D01BD03E8AD0118F4 :1001A000AD0186019601B603E8A60118A601C601B5 :1001B000D601F603E8E60118E601CC0001CC03E81D :1001C000DC01FC03E8EC0118EC018E00018E03E871 :1001D0009E01BE03E8AE0118AE01CE0001CE03E8D9 :1001E000DE01FE03E8EE01CDEE0118CE000118CECF :1001F00003E818DE0118FE03E81AEE0118EE0148C4 :10020000587800017803E8680118680105445474BF :1002100000017403E86401186401043D405070005B :10022000017003E86001186001018A019A01BA03B4 :10023000E8AA0118AA01CA01DA01FA03E8EA0118DA :10024000EA0136373C183C323338183849597900BE :10025000017903E8690118690146567600017603C1 :10026000E866011866013B391082019201B203E889 :10027000A20118A201C201D201F203E8E20118E2D0 :10028000010D0F0B9701B703E8A70118A701D701CC :10029000F703E8E70118E701DD01FD03E8ED0118C8 :1002A000ED01CF9F01BF03E8AF0118AF01DF01FFF0 :1002B00003E8EF01CDEF0118DF0118FF03E81AEFA3 :1002C0000118EF0180019001B003E8A00118A0011E :1002D000C001D001F003E8E00118E00183000183D0 :1002E00003E89301B303E8A30118A3013F1606171F :1002F00000074D5D7D00017D03E86D01186D013043 :0903000018303518353E8F188FB6 :00000001FF dasm-2.20.14.1/test/suite68hc908.asm000066400000000000000000000107261375233463600165310ustar00rootroot00000000000000; ; regression test for all opcodes for 68hc908 controller ; ; two opcodes with indirect X adressing and zero offset are not cleanly supported ; dbnz (X), jumpLabel ; cbeq (X), jumpLabel ; ; one must add forced-address-mode extension ".ix" to the mnemonic and add a dummy variable ; in order to get the correct opcodes ; dbnz.ix 0, jumpLabel ; cbeq.ix 0, jumpLabel ; .PROCESSOR 68hc908 PTB .EQU 1 PTC .EQU 2 DDRB .EQU 5 FIVE .EQU 5 FIVE_HUNDRED .EQU 500 RAM_START .EQU 0x40 .ORG 0xFB00 .byte 0xba,0xdc,0x0d,0xe0 adc #6 adc RAM_START adc [X+7] adc constant0 adc [X+0x300] adc ,X adc [SP+5] adc [SP+500] add #6 add RAM_START add 7,X add constant0 add 0x300,X add ,X add FIVE,SP add [SP+FIVE_HUNDRED] aiS #5 aiX #6 and #6 and RAM_START and 7,X and constant0 and [X+0x300] and ,X and 5,SP and FIVE_HUNDRED,SP asl RAM_START asl 3,X asl ,X asl 5,SP aslA aslX asr RAM_START asr 3,X asr ,X asr 5,SP asrA asrX bcc frontLoop bcs frontLoop beq frontLoop bhcc frontLoop bhcs frontLoop bhi frontLoop bhs frontLoop bih frontLoop bil frontLoop bit #6 bit RAM_START bit 7,X bit constant0 bit 0x300,X bit ,X bit 5,SP bit 500,SP blo frontLoop bls frontLoop bmc frontLoop bmi frontLoop bms frontLoop bne frontLoop bpl frontLoop bra frontLoop brn frontLoop subRoutine: rts brset 0,PTB,frontLoop brclr 0,PTC,subRoutine brset 1,PTB,frontLoop brclr 1,PTC,subRoutine brset 2,PTB,frontLoop brclr 2,PTC,subRoutine brset 3,PTB,frontLoop brclr 3,PTC,subRoutine brset 4,PTB,frontLoop brclr 4,PTC,subRoutine brset 5,PTB,frontLoop brclr 5,PTC,subRoutine brset 6,PTB,frontLoop brclr 6,PTC,subRoutine brset 7,PTB,frontLoop brclr 7,PTC,subRoutine frontLoop: bset 0,PTB bclr 0,PTC bset 1,PTB bclr 1,PTC bset 2,PTB bclr 2,PTC bset 3,PTB bclr 3,PTC bset 4,PTB bclr 4,PTC bset 5,PTB bclr 5,PTC bset 6,PTB bclr 6,PTC bset 7,PTB bclr 7,PTC bsr subRoutine cbeqA $20,frontLoop cbeq 9,frontLoop cbeq (0xA,X), frontLoop cbeq [SP+0x0B],frontLoop cbeq.ix 0, frontLoop ; must add forced-address-mode extension to get opcode 0x71 cbeqX 0x40,frontLoop clc cli ;frontLoop: clr RAM_START clr 3,X clr ,X clr 5,SP clrA clrH clrX cmp #6 cmp RAM_START cmp 7,X cmp constant0 cmp 0x300,X cmp ,X cmp 5,SP cmp 500,SP com RAM_START com 3,X com ,X com 5,SP comA comX cpHX RAM_START cpHX #constant0 cpX #6 cpX RAM_START cpX 7,X cpX constant0 cpX 0x300,X cpX ,X cpX 5,SP cpX FIVE_HUNDRED,SP daa ; decimal adjust after BCD calculation backLoop: dbnzA backLoop dbnz 4,backLoop dbnz [X+5],backLoop dbnz [SP+6],backLoop dbnz.ix 0,backLoop ; must add forced-address-mode extension and dummy 0 to get opcode 0x7B dbnzX backLoop dec RAM_START dec 3,X dec ,X dec 5,SP decA decX div mul nsa ble backLoop bgt backLoop blt backLoop bge backLoop wait stop eor #6 eor RAM_START eor 7,X eor constant0 eor 0x300,X eor ,X eor 5,SP eor 500,SP inc RAM_START inc 3,X inc ,X inc 5,SP incA incX jmp RAM_START jmp vector0 jmp 3,X jmp $300,X jmp ,X jsr RAM_START jsr vector0 jsr 3,X jsr 0x300,X jsr ,X ldA #6 ldA RAM_START ldA 7,X ldA constant0 ldA 0x300,X ldA ,X ldA 5,SP ldA 500,SP ldHX #500 ldHX RAM_START ldX #55 ldX RAM_START ldX 7,X ldX constant0 ldX 0x300,X ldX ,X ldX 5,SP ldX 500,SP lsl RAM_START lsl 3,X lsl ,X lsl 5,SP lslA lslX lsr RAM_START lsr 3,X lsr ,X lsr 5,SP lsrA lsrX mov #5, RAM_START movp RAM_START,X mov 10, RAM_START xmov RAM_START neg RAM_START neg 3,X neg ,X neg 5,SP negA negX nop orA #6 orA RAM_START orA 7,X orA constant0 orA 0x300,X orA ,X orA 5,SP orA 500,SP pshA pshH pshX pulA pulH pulX rol RAM_START rol 3,X rol ,X rol 5,SP rolA rolX ror RAM_START ror 3,X ror ,X ror 5,SP rorA rorX rsp dummyISR: rti sbc #6 sbc RAM_START sbc 7,X sbc constant0 sbc 0x300,X sbc ,X sbc 5,SP sbc 500,SP sec sei stA RAM_START stA 7,X stA constant0 stA 0x300,X stA ,X stA 5,SP stA 500,SP stHX RAM_START stX RAM_START stX 7,X stX constant0 stX 0x300,X stX ,X stX 5,SP stX 500,SP sub #6 sub RAM_START sub 7,X sub constant0 sub 0x300,X sub ,X sub 5,SP sub 500,SP swi tAP tAX tHXS tPA tSHX tst RAM_START tst 3,X tst ,X tst 4,SP tstA tstX tXA ; .ORG 0xFE00 constant0: .word 0 vector0: .word dummyISR dasm-2.20.14.1/test/suite68hc908.bin.ref000066400000000000000000000012021375233463600172610ustar00rootroot00000000000000 @|@|@|8@hxhHX7@gwgGW$g%e'c(a)_"]$[/Y.W@|%A#?,=+;-9&7*5 3!1-'!     A 1 a ՞a qQ@̘?@ooO_@|3@cscCSu@e|@|rK;kk{[:@jzjJZRBbߑݐۏ@|<@l|lL\@~@~@|EU@7@|8@hxhHX4@dtdDTn@^@N @~@0@`p`@P@|􇋉9@iyiIY6@fvfFV@|@|5@@|@|􃄗=@m}mM]dasm-2.20.14.1/test/suite68hc908.hex.ref000066400000000000000000000034251375233463600173060ustar00rootroot00000000000000:10FB0000BADC0DE0A906B940E907C9FD7CD90300BC :10FB1000F99EE9059ED901F4AB06BB40EB07CBFD8E :10FB20007CDB0300FB9EEB059EDB01F4A705AF0623 :10FB3000A406B440E407C4FD7CD40300F49EE405AD :10FB40009ED401F438406803789E680548583740D1 :10FB50006703779E670547572467256527632861F4 :10FB6000295F225D245B2F592E57A506B540E50776 :10FB7000C5FD7CD50300F59EE5059ED501F4254124 :10FB8000233F2C3D2B3B2D3926372A35203321317D :10FB90008100012D0102F90201270302F304012172 :10FBA0000502ED06011B0702E70801150902E10A3B :10FBB000010F0B02DB0C01090D02D50E01030F0230 :10FBC000CF100111021201130214011502160117C0 :10FBD00002180119021A011B021C011D021E011F3D :10FBE00002ADAD4120DB3109D8610AD59E610BD150 :10FBF00071CF5140CC989A3F406F037F9E6F054F65 :10FC00008C5FA106B140E107C1FD7CD10300F19EEC :10FC1000E1059ED101F433406303739E63054353B2 :10FC2000754065FD7CA306B340E307C3FD7CD303A9 :10FC300000F39EE3059ED301F4724BFE3B04FB6B85 :10FC400005F89E6B06F47BF25BF03A406A037A9EFD :10FC50006A054A5A52426293E192DF91DD90DB8F4E :10FC60008EA806B840E807C8FD7CD80300F89EE8D7 :10FC7000059ED801F43C406C037C9E6C054C5CBC3A :10FC800040CCFD7EEC03DC0300FCBD40CDFD7EEDF1 :10FC900003DD0300FDA606B640E607C6FD7CD603DD :10FCA00000F69EE6059ED601F44501F45540AE37B8 :10FCB000BE40EE07CEFD7CDE0300FE9EEE059EDE1E :10FCC00001F438406803789E68054858344064035E :10FCD000749E640544546E05405E404E0A407E406A :10FCE00030406003709E600540509DAA06BA40EA0D :10FCF00007CAFD7CDA0300FA9EEA059EDA01F48762 :10FD00008B89868A8839406903799E690549593605 :10FD1000406603769E660546569C80A206B240E287 :10FD200007C2FD7CD20300F29EE2059ED201F49947 :10FD30009BB740E707C7FD7CD70300F79EE7059E0A :10FD4000D701F43540BF40EF07CFFD7CDF0300FF54 :10FD50009EEF059EDF01F4A006B040E007C0FD7CE9 :10FD6000D00300F09EE0059ED001F4838497948533 :10FD7000953D406D037D9E6D044D5D9F0000FD1A15 :00000001FF dasm-2.20.14.1/test/suitef8.asm000066400000000000000000000225031375233463600160310ustar00rootroot00000000000000; Fairchild F8 test suite for DASM ; 2004 by Thomas Mathys processor f8 TWO = 2 org 0 start adc ; 8e ai $f8 ; 24 f8 am ; 88 amd ; 89 as start ; c0 as start+1 ; c1 as TWO ; c2 as 3 ; c3 as 4 ; c4 as 5 ; c5 as 2*[1+2] ; c6 as 7 ; c7 as (2+2)*2 ; c8 as 9 ; c9 as j ; c9 as $a ; ca as hu ; ca as 11 ; cb as hl ; cb as s ; cc as (is) ; cc as i ; cd as (is)+ ; cd as d ; ce as (is)- ; ce asd start ; d0 asd start+1 ; d1 asd TWO ; d2 asd 3 ; d3 asd 4 ; d4 asd 5 ; d5 asd 2*[1+2] ; d6 asd 7 ; d7 asd (2+2)*2 ; d8 asd 9 ; d9 asd j ; d9 asd $a ; da asd hu ; da asd 11 ; db asd hl ; db asd s ; dc asd (is) ; dc asd i ; dd asd (is)+ ; dd asd d ; de asd (is)- ; de bc . ; 82 ff bf 12,. ; 9c ff bm . ; 91 ff bnc . ; 92 ff bno . ; 98 ff bnz . ; 94 ff bp . ; 81 ff br . ; 90 ff br7 . ; 8f ff bt 5,. ; 85 ff bz . ; 84 ff ci 4096/64-1 ; 25 3f clr ; 70 cm ; 8d com ; 18 dci TWO ; 2a 00 02 dci $1234 ; 2a 12 34 di ; 1a ds start ; 30 ds start+1 ; 31 ds TWO ; 32 ds 3 ; 33 ds 4 ; 34 ds 5 ; 35 ds 2*[1+2] ; 36 ds 7 ; 37 ds (2+2)*2 ; 38 ds 9 ; 39 ds j ; 39 ds $a ; 3a ds hu ; 3a ds 11 ; 3b ds hl ; 3b ds s ; 3c ds (is) ; 3c ds i ; 3d ds (is)+ ; 3d ds d ; 3e ds (is)- ; 3e ei ; 1b in TWO ; 26 02 in 16*16-1 ; 26 ff inc ; 1f ins 5*3-15 ; a0 ins 15+start ; af jmp $1234 ; 29 12 34 li TWO ; 20 02 lis %111 ; 77 lisl (TWO+TWO)*TWO-1 ; 6f lisu 4 ; 64 lm ; 16 lnk ; 19 lr start,a ; 50 lr start+1,a ; 51 lr TWO,a ; 52 lr 3,a ; 53 lr 4,a ; 54 lr 5,a ; 55 lr 2*[1+2],a ; 56 lr 7,a ; 57 lr (2+2)*2,a ; 58 lr 9,a ; 59 lr j,a ; 59 lr $a,a ; 5a lr hu,a ; 5a lr 11,a ; 5b lr hl,a ; 5b lr s,a ; 5c lr (is),a ; 5c lr i,a ; 5d lr (is)+,a ; 5d lr d,a ; 5e lr (is)-,a ; 5e lr a,start ; 40 lr a,start+1 ; 41 lr a,TWO ; 42 lr a,3 ; 43 lr a,4 ; 44 lr a,5 ; 45 lr a,2*[1+2] ; 46 lr a,7 ; 47 lr a,(2+2)*2 ; 48 lr a,9 ; 49 lr a,j ; 49 lr a,$a ; 4a lr a,hu ; 4a lr a,11 ; 4b lr a,hl ; 4b lr a,s ; 4c lr a,(is) ; 4c lr a,i ; 4d lr a,(is)+ ; 4d lr a,d ; 4e lr a,(is)- ; 4e lr a,ku ; 00 lr a,kl ; 01 lr a,qu ; 02 lr a,ql ; 03 lr ku,a ; 04 lr kl,a ; 05 lr qu,a ; 06 lr ql,a ; 07 lr h,dc0 ; 11 lr h,dc ; 11 lr q,dc0 ; 0e lr q,dc ; 0e lr dc0,h ; 10 lr dc,h ; 10 lr dc0,q ; 0f lr dc,q ; 0f lr k,pc1 ; 08 lr k,p ; 08 lr pc1,k ; 09 lr p,k ; 09 lr pc0,q ; 0d lr p0,q ; 0d lr a,is ; 0a lr is,a ; 0b lr w,j ; 1d lr w,(TWO+1)*3 ; 1d lr 9,w ; 1e lr j,w ; 1e ni %10000001 ; 21 81 nm ; 8a nop ; 2b ns start ; f0 ns start+1 ; f1 ns TWO ; f2 ns 3 ; f3 ns 4 ; f4 ns 5 ; f5 ns 2*[1+2] ; f6 ns 7 ; f7 ns (2+2)*2 ; f8 ns 9 ; f9 ns j ; f9 ns $a ; fa ns hu ; fa ns 11 ; fb ns hl ; fb ns s ; fc ns (is) ; fc ns i ; fd ns (is)+ ; fd ns d ; fe ns (is)- ; fe oi (TWO+start)*64 ; 22 80 om ; 8b out TWO ; 27 02 out 16*16-1 ; 27 ff outs 5*3-15 ; b0 outs 15+start ; bf pi start ; 28 00 00 pi $1234 ; 28 12 34 pk ; 0c pop ; 1c sl start+1 ; 13 sl TWO+TWO ; 15 sr 1 ; 12 sr 3+1 ; 14 st ; 17 xdc ; 2c xi 64 ; 23 40 xm ; 8c xs start ; e0 xs start+1 ; e1 xs TWO ; e2 xs 3 ; e3 xs 4 ; e4 xs 5 ; e5 xs 2*[1+2] ; e6 xs 7 ; e7 xs (2+2)*2 ; e8 xs 9 ; e9 xs j ; e9 xs $a ; ea xs hu ; ea xs 11 ; ab xs hl ; eb xs s ; ec xs (is) ; ec xs i ; ed xs (is)+ ; ed xs d ; ee xs (is)- ; ee xs 12 ; ec xs 13 ; ed xs 14 ; ee dc.b 0 ; 00 dc.w $1234 ; 12 34 dc.l $deadbeef ; de ad be ef db 0 ; 00 dw $1234 ; 12 34 dd $deadbeef ; de ad be ef byte 0 ; 00 word $1234 ; 12 34 long $deadbeef ; de ad be ef .byte 0 ; 00 .word $1234 ; 12 34 .long $deadbeef ; de ad be ef res.b 4, $33 ; 33 33 33 33 res.w 2, $1234 ; 12 34 12 34 res.l 2, $deadbeef ; de ad be ef de ad be ef dasm-2.20.14.1/test/suitef8.bin.ref000066400000000000000000000004671375233463600166010ustar00rootroot00000000000000$ނ%?p**401234567899::;;<<==>>&&)4 wodPQRSTUVWXYYZZ[[\\]]^^@ABCDEFGHIIJJKKLLMMNN !+"''((4 ,#@4ޭ4ޭ4ޭ4ޭ333344ޭޭdasm-2.20.14.1/test/suitef8.hex.ref000066400000000000000000000015731375233463600166140ustar00rootroot00000000000000:100000008E24F88889C0C1C2C3C4C5C6C7C8C9C9BF :10001000CACACBCBCCCCCDCDCECED0D1D2D3D4D5F9 :10002000D6D7D8D9D9DADADBDBDCDCDDDDDEDE827F :10003000FF9CFF91FF92FF98FF94FF81FF90FF8F3D :10004000FF85FF84FF253F708D182A00022A123495 :100050001A30313233343536373839393A3A3B3B56 :100060003C3C3D3D3E3E1B260226FF1FA0AF291211 :10007000342002776F641619505152535455565715 :100080005859595A5A5B5B5C5C5D5D5E5E4041420B :1000900043444546474849494A4A4B4B4C4C4D4DD1 :1000A0004E4E000102030405060711110E0E10103A :1000B0000F0F080809090D0D0A0B1D1D1E1E2181B9 :1000C0008A2BF0F1F2F3F4F5F6F7F8F9F9FAFAFB06 :1000D000FBFCFCFDFDFEFE22808B270227FFB0BF4C :1000E0002800002812340C1C13151214172C23405E :1000F0008CE0E1E2E3E4E5E6E7E8E9E9EAEAEBEBF4 :10010000ECECEDEDEEEEECEDEE001234DEADBEEF1C :10011000001234DEADBEEF001234DEADBEEF0012D1 :1001200034DEADBEEF3333333312341234DEADBEC2 :05013000EFDEADBEEFA3 :00000001FF dasm-2.20.14.1/test/supercat.asm000066400000000000000000000014021375233463600162630ustar00rootroot00000000000000; Pretty horrible bug... :-/ Switching to signed instead ; of unsigned arithmetic made this easier to handle but ; bad use of .ds can still lead to huge files since DASM ; doesn't enforce an upper bound yet. And what should it ; be? Hmm... ; ; From "supercat" on the atariage.com forums, forwarded by ; Andrew Davie 2008/04/12. ; ; Peter H. Froehlich ; phf at acm dot org .processor 6502 .org $7FF8 .byte 1,2,3,4,5 ; original line by "supercat", would produce huge files ; since the "-1" result would be interpreted as a huge ; positive number .ds $7FFC-* ; Peter's line made the problem tractable and revealed ; the actual bug, checking this with xxd clearly shows ; the -1 bit pattern 0xffffffff which unsigned is huge. .long $7FFC-* .byte 1,2,3,4,5 .end dasm-2.20.14.1/test/supercat.fail000066400000000000000000000000021375233463600164110ustar00rootroot0000000000000018dasm-2.20.14.1/test/test-report.txt000066400000000000000000000126471375233463600170010ustar00rootroot00000000000000=== build test cases (strict=off) * 6502_16h binary is same, pass * 6502_16l binary is same, pass * 6502_DCswap binary is same, pass * 68908_DCswap binary is same, pass * addressexpression binary is same, pass * align_mod_mac binary is same, pass * atari2600/boing26 binary is same, pass * atari7800/spritesample binary is same, pass * broken6303hack binary is same, pass * channel-f/lights binary is same, pass * channel-f/tetris binary is same, pass * cmdline_defs/declare_var_mac binary is same, pass * cmdline_defs/ramstart binary is same, pass * declare_var_mac binary is same, pass * doublemacro binary is same, pass * example binary is same, pass * fill binary is same, pass * forced_addrmode binary is same, pass * include binary is same, pass * jmpiw binary is same, pass * labelchanges binary is same, pass * locals binary is same, pass * lockup_macro binary is same, pass * longstring binary is same, pass * macro_same_as_include binary is same, pass * m_switch_1 binary is same, pass * multiline_comment binary is same, pass * recursive_macro0 binary is same, pass * same_names binary is same, pass * sample binary is same, pass * selftest/0_no_assembly assembly FAILED! [27] * selftest/1_no_binary file doesn't exist or has zero size FAILED! * selftest/2_hexref_missing file [selftest/2_hexref_missing.hex.ref] missing FAILED! * selftest/3_binary_different binaries differ FAILED! * selftest/4_finally_OK binary is same, pass * stawx binary is same, pass * string_conversion binary is same, pass * stringify binary is same, pass * string_table binary is same, pass * suite6303 binary is same, pass * suite6502 binary is same, pass * suite68705 binary is same, pass * suite68hc11 binary is same, pass * suite68hc908 binary is same, pass * suitef8 binary is same, pass * toobigword binary is same, pass * ucasm_compat binary is same, pass === error test cases (strict=on) * 6502_16b error_code [5] pass * 6502_16w error_code [5] pass * 6502_X16b error_code [5] pass * 6811_X16 error_code [5] pass * 6811_Y16 error_code [5] pass * 68908_cbeq_SP16 error_code [5] pass * 68908_dbnz_SP16 error_code [5] pass * 68908_SP16b error_code [5] pass * badopcode1 error_code [5] pass * badopcode2 error_code [3] pass * concat_str error_code [39] pass * delete_empty_binary file was deleted, pass * doublemacro error_code [25] pass * improper_equ error_code [5] pass * jentzsch2 error_code [3] pass * macro_included error_code [14] pass * missing_endm error_code [40] pass * m_switch_0 error_code [38] pass * m_switch_2 error_code [1] pass * m_switch_3 error_code [38] pass * negative1024_2 error_code [5] pass * negative1024 error_code [5] pass * negative256_2 error_code [5] pass * negative256 error_code [5] pass * recursive_eqm error_code [38] pass * recursive_equ error_code [3] pass * recursive_macro1 error_code [38] pass * recursive_macro2 error_code [38] pass * recursive_set error_code [38] pass * reverse_segfault error_code [38] pass * segfault error_code [38] pass * selftest/5_must_fail no error FAILED! * selftest/6_false_positive_fail got error_level (1) but expected (15), double FAULT! * selftest/7_false_positive_fail testcase definition incomplete, missing error_level (27), FAILED! * selftest/8_false_positive_OK error_code [27] pass * stabx error_code [5] pass * staby2 error_code [3] pass * staby3 error_code [3] pass * staby4 error_code [3] pass * staby error_code [5] pass * stawy2 error_code [5] pass * stawy3 error_code [3] pass * stawy error_code [3] pass * supercat error_code [18] pass * toobigbyte error_code [5] pass * toobigword error_code [5] pass executed 93 tests, 86 OK, 7 failed, result: overall PASS dasm-2.20.14.1/test/toobigbyte.asm000066400000000000000000000001401375233463600166020ustar00rootroot00000000000000; Test case for strict mode check for byte data size processor 6502 ORG $f800 .byte $100 dasm-2.20.14.1/test/toobigbyte.fail000066400000000000000000000000011375233463600167310ustar00rootroot000000000000005dasm-2.20.14.1/test/toobigword.asm000066400000000000000000000001421375233463600166140ustar00rootroot00000000000000; Test case for strict mode check for word data size processor 6502 ORG $f800 .word $10000 dasm-2.20.14.1/test/toobigword.bin.ref000066400000000000000000000000041375233463600173540ustar00rootroot00000000000000dasm-2.20.14.1/test/toobigword.fail000066400000000000000000000000011375233463600167410ustar00rootroot000000000000005dasm-2.20.14.1/test/toobigword.hex.ref000066400000000000000000000000361375233463600173750ustar00rootroot00000000000000:02F80000000006 :00000001FF dasm-2.20.14.1/test/ucasm_compat.asm000066400000000000000000000007011375233463600171110ustar00rootroot00000000000000 .PROCESSOR 68hc908 FIVE_HUNDRED .EQU 500 _v@0041 .EQU $0041 ; disassembler generated variable name .ORG $FC00 F_@fc00: ; disassembler detected function label lda _v@fc1a sta _v@0041 bne _L@fc11 and 300,X and [X+300] adc 300,SP _L@fc11: ; disassembler detected branch or jump label adc [SP+FIVE_HUNDRED] adc [SP+500] rts _v@fc1a: ; disassembler generated variable name DC.b $0Cdasm-2.20.14.1/test/ucasm_compat.bin.ref000066400000000000000000000000351375233463600176540ustar00rootroot00000000000000A& ,,, dasm-2.20.14.1/test/ucasm_compat.hex.ref000066400000000000000000000001351375233463600176710ustar00rootroot00000000000000:10FC0000C6FC1AB741260AD4012CD4012C9ED90176 :0BFC10002C9ED901F49ED901F4810C58 :00000001FF